diff --git a/bdv.naf.xml b/bdv.naf.xml deleted file mode 100644 index b189ec2f..00000000 --- a/bdv.naf.xml +++ /dev/null @@ -1,6 +0,0 @@ - - -MBBC - - - diff --git a/build.xml b/build.xml index 8b6b9686..a45365b8 100644 --- a/build.xml +++ b/build.xml @@ -73,19 +73,13 @@ nbproject/build-impl.xml file. --> - - - - - - - + + @@ -103,110 +97,109 @@ - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - - - - - - - - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - + - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - + diff --git a/deps_old/jdom.jar b/deps/jdom.jar similarity index 100% rename from deps_old/jdom.jar rename to deps/jdom.jar diff --git a/deps_old/jsp-api-2.1.jar b/deps/jsp-api-2.1.jar similarity index 100% rename from deps_old/jsp-api-2.1.jar rename to deps/jsp-api-2.1.jar diff --git a/deps_old/jdom/lib/xml-apis.jar b/deps/xml-apis.jar similarity index 100% rename from deps_old/jdom/lib/xml-apis.jar rename to deps/xml-apis.jar diff --git a/deps/jsp-api-2.0.jar b/deps_old/jsp-api-2.0.jar similarity index 100% rename from deps/jsp-api-2.0.jar rename to deps_old/jsp-api-2.0.jar diff --git a/deps_old/fest-swing-1.2/LICENSE.txt b/deps_tests/fest-swing-1.2/LICENSE.txt similarity index 100% rename from deps_old/fest-swing-1.2/LICENSE.txt rename to deps_tests/fest-swing-1.2/LICENSE.txt diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/LICENSE.txt b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/LICENSE.txt similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/LICENSE.txt rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/LICENSE.txt diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2-sources.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2-sources.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/fest-swing-junit-1.2.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3-sources.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3-sources.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/commons-codec-1.3.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1-sources.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1-sources.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/lib/junit-4.3.1.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/pom.xml b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/pom.xml similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/pom.xml rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-1.2/pom.xml diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/LICENSE.txt b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/LICENSE.txt similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/LICENSE.txt rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/LICENSE.txt diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2-sources.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2-sources.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/fest-swing-junit-4.3.1-1.2.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/pom.xml b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/pom.xml similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/pom.xml rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.3.1-1.2/pom.xml diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/LICENSE.txt b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/LICENSE.txt similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/LICENSE.txt rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/LICENSE.txt diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2-sources.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2-sources.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/fest-swing-junit-4.5-1.2.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5-sources.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5-sources.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5.jar b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5.jar rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/lib/junit-4.5.jar diff --git a/deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/pom.xml b/deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/pom.xml similarity index 100% rename from deps_old/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/pom.xml rename to deps_tests/fest-swing-1.2/extensions/junit/fest-swing-junit-4.5-1.2/pom.xml diff --git a/deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/LICENSE.txt b/deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/LICENSE.txt similarity index 100% rename from deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/LICENSE.txt rename to deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/LICENSE.txt diff --git a/deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2-sources.jar b/deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2-sources.jar rename to deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2.jar b/deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2.jar rename to deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/fest-swing-testng-1.2.jar diff --git a/deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-jdk15.jar b/deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-jdk15.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-jdk15.jar rename to deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-jdk15.jar diff --git a/deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-sources.jar b/deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-sources.jar rename to deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/lib/testng-5.7-sources.jar diff --git a/deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/pom.xml b/deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/pom.xml similarity index 100% rename from deps_old/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/pom.xml rename to deps_tests/fest-swing-1.2/extensions/testng/fest-swing-testng-1.2/pom.xml diff --git a/deps_old/fest-swing-1.2/fest-swing-1.2-sources.jar b/deps_tests/fest-swing-1.2/fest-swing-1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/fest-swing-1.2-sources.jar rename to deps_tests/fest-swing-1.2/fest-swing-1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/fest-swing-1.2.jar b/deps_tests/fest-swing-1.2/fest-swing-1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/fest-swing-1.2.jar rename to deps_tests/fest-swing-1.2/fest-swing-1.2.jar diff --git a/deps_old/fest-swing-1.2/lib/fest-assert-1.2-sources.jar b/deps_tests/fest-swing-1.2/lib/fest-assert-1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/fest-assert-1.2-sources.jar rename to deps_tests/fest-swing-1.2/lib/fest-assert-1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/lib/fest-assert-1.2.jar b/deps_tests/fest-swing-1.2/lib/fest-assert-1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/fest-assert-1.2.jar rename to deps_tests/fest-swing-1.2/lib/fest-assert-1.2.jar diff --git a/deps_old/fest-swing-1.2/lib/fest-reflect-1.2-sources.jar b/deps_tests/fest-swing-1.2/lib/fest-reflect-1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/fest-reflect-1.2-sources.jar rename to deps_tests/fest-swing-1.2/lib/fest-reflect-1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/lib/fest-reflect-1.2.jar b/deps_tests/fest-swing-1.2/lib/fest-reflect-1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/fest-reflect-1.2.jar rename to deps_tests/fest-swing-1.2/lib/fest-reflect-1.2.jar diff --git a/deps_old/fest-swing-1.2/lib/fest-util-1.1.2-sources.jar b/deps_tests/fest-swing-1.2/lib/fest-util-1.1.2-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/fest-util-1.1.2-sources.jar rename to deps_tests/fest-swing-1.2/lib/fest-util-1.1.2-sources.jar diff --git a/deps_old/fest-swing-1.2/lib/fest-util-1.1.2.jar b/deps_tests/fest-swing-1.2/lib/fest-util-1.1.2.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/fest-util-1.1.2.jar rename to deps_tests/fest-swing-1.2/lib/fest-util-1.1.2.jar diff --git a/deps_old/fest-swing-1.2/lib/jcip-annotations-1.0-sources.jar b/deps_tests/fest-swing-1.2/lib/jcip-annotations-1.0-sources.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/jcip-annotations-1.0-sources.jar rename to deps_tests/fest-swing-1.2/lib/jcip-annotations-1.0-sources.jar diff --git a/deps_old/fest-swing-1.2/lib/jcip-annotations-1.0.jar b/deps_tests/fest-swing-1.2/lib/jcip-annotations-1.0.jar similarity index 100% rename from deps_old/fest-swing-1.2/lib/jcip-annotations-1.0.jar rename to deps_tests/fest-swing-1.2/lib/jcip-annotations-1.0.jar diff --git a/deps_old/fest-swing-1.2/pom.xml b/deps_tests/fest-swing-1.2/pom.xml similarity index 100% rename from deps_old/fest-swing-1.2/pom.xml rename to deps_tests/fest-swing-1.2/pom.xml diff --git a/doc/plantuml.jar b/doc/plantuml.jar index c4c423e2..cd1c2560 100644 Binary files a/doc/plantuml.jar and b/doc/plantuml.jar differ diff --git a/excel/tournament.xls b/excel/tournament.xls index d207b9f8..4ddb1409 100644 Binary files a/excel/tournament.xls and b/excel/tournament.xls differ diff --git a/excel/tournament_tmp.xls b/excel/tournament_tmp.xls new file mode 100644 index 00000000..de3f800a Binary files /dev/null and b/excel/tournament_tmp.xls differ diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties index deeb896e..5ae7ef3e 100644 --- a/nbproject/private/private.properties +++ b/nbproject/private/private.properties @@ -1,6 +1,11 @@ compile.on.save=false do.depend=false do.jar=true +file.reference.ant.jar=C:\\Perso\\tourma\\deps\\ant.jar +file.reference.jaxen.jar=C:\\Perso\\tourma\\libs\\jaxen-1.1.6.jar +file.reference.xalan.jar=C:\\Perso\\tourma\\deps\\xalan.jar +file.reference.xerces.jar=C:\\Perso\\tourma\\deps_old\\jdom\\lib\\xerces.jar +file.reference.xml-apis.jar=C:\\Perso\\tourma\\libs\\xml-apis.jar javac.debug=true javadoc.preview=true user.properties.file=C:\\Users\\WFMJ7631\\AppData\\Roaming\\NetBeans\\8.2\\build.properties diff --git a/nbproject/project.properties b/nbproject/project.properties index 0efa5ed3..9c25d653 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -31,13 +31,17 @@ excludes= file.reference.ant.jar=deps\\jdom\\lib\\ant.jar file.reference.bcpkix-jdk15on-160.jar=libs\\bcpkix-jdk15on-160.jar file.reference.bcprov-jdk15on-160.jar=libs\\bcprov-jdk15on-160.jar -file.reference.colorchooser.jar=libs\\colorchooser.jar file.reference.commons-imaging-1.0-R1534292.jar=libs\\commons-imaging-1.0-R1534292.jar file.reference.commons-lang3-3.4.jar=libs\\commons-lang3-3.4.jar file.reference.commons-logging-1.2.jar=libs\\commons-logging-1.2.jar file.reference.commons-math3-3.6.1.jar=libs\\commons-math3-3.6.1.jar file.reference.commons-net-3.6.jar=libs\\commons-net-3.6.jar file.reference.core.jar=libs\\core.jar +file.reference.fest-assert-1.2.jar=deps_tests\\fest-swing-1.2\\lib\\fest-assert-1.2.jar +file.reference.fest-reflect-1.2.jar=deps_tests\\fest-swing-1.2\\lib\\fest-reflect-1.2.jar +file.reference.fest-swing-1.2.jar=deps_old\\fest-swing-1.2\\fest-swing-1.2.jar +file.reference.fest-swing-1.2.jar-1=deps_tests\\fest-swing-1.2\\fest-swing-1.2.jar +file.reference.fest-util-1.1.2.jar=deps_tests\\fest-swing-1.2\\lib\\fest-util-1.1.2.jar file.reference.findbugs.jar=libs\\findbugs.jar file.reference.freemarker.jar=libs\\freemarker.jar file.reference.javase.jar=libs\\javase.jar @@ -45,6 +49,7 @@ file.reference.jaxb-api-1.0.jar=libs\\jaxb-api-1.0.jar file.reference.jaxen-1.1.6.jar=libs\\jaxen-1.1.6.jar file.reference.jaxen.jar=deps\\jdom\\lib\\jaxen.jar file.reference.jcalendar-1.4.jar=libs\\jcalendar-1.4.jar +file.reference.jcip-annotations-1.0.jar=deps_tests\\fest-swing-1.2\\lib\\jcip-annotations-1.0.jar file.reference.jcommon-1.0.18.jar=libs\\jcommon-1.0.18.jar file.reference.jdom-1.1.3.jar=libs\\jdom-1.1.3.jar file.reference.jfreechart-1.0.15.jar=libs\\jfreechart-1.0.15.jar @@ -61,7 +66,6 @@ jar.compress=false jar.index=${jnlp.enabled} javac.classpath=\ ${libs.absolutelayout.classpath}:\ - ${file.reference.colorchooser.jar}:\ ${file.reference.commons-logging-1.2.jar}:\ ${file.reference.commons-math3-3.6.1.jar}:\ ${file.reference.core.jar}:\ @@ -72,7 +76,6 @@ javac.classpath=\ ${file.reference.jcalendar-1.4.jar}:\ ${file.reference.jcommon-1.0.18.jar}:\ ${file.reference.jfreechart-1.0.15.jar}:\ - ${file.reference.xercesImpl.jar}:\ ${file.reference.xml-apis.jar-1}:\ ${file.reference.commons-imaging-1.0-R1534292.jar}:\ ${file.reference.findbugs.jar}:\ @@ -82,7 +85,8 @@ javac.classpath=\ ${file.reference.xmlsec-1.5.1.jar}:\ ${file.reference.jdom-1.1.3.jar}:\ ${file.reference.bcprov-jdk15on-160.jar}:\ - ${file.reference.bcpkix-jdk15on-160.jar} + ${file.reference.bcpkix-jdk15on-160.jar}:\ + ${file.reference.xercesImpl.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false @@ -100,7 +104,13 @@ javac.test.classpath=\ ${file.reference.jaxen.jar}:\ ${file.reference.xalan.jar}:\ ${file.reference.xerces.jar}:\ - ${file.reference.xml-apis.jar} + ${file.reference.xml-apis.jar}:\ + ${file.reference.fest-swing-1.2.jar}:\ + ${file.reference.fest-swing-1.2.jar-1}:\ + ${file.reference.fest-assert-1.2.jar}:\ + ${file.reference.fest-reflect-1.2.jar}:\ + ${file.reference.fest-util-1.1.2.jar}:\ + ${file.reference.jcip-annotations-1.0.jar} javadoc.additionalparam= javadoc.author=false javadoc.encoding=${source.encoding} @@ -141,5 +151,10 @@ run.test.classpath=\ ${javac.test.classpath}:\ ${build.test.classes.dir} source.encoding=UTF-8 +source.reference.fest-assert-1.2.jar=deps_tests/fest-swing-1.2/lib/fest-assert-1.2-sources.jar +source.reference.fest-reflect-1.2.jar=deps_tests/fest-swing-1.2/lib/fest-reflect-1.2-sources.jar +source.reference.fest-swing-1.2.jar-1=deps_tests/fest-swing-1.2/fest-swing-1.2-sources.jar +source.reference.fest-util-1.1.2.jar=deps_tests/fest-swing-1.2/lib/fest-util-1.1.2-sources.jar +source.reference.jcip-annotations-1.0.jar=deps_tests/fest-swing-1.2/lib/jcip-annotations-1.0-sources.jar src.dir=src test.src.dir=test diff --git a/obfuscate/TourMa.jar b/obfuscate/TourMa.jar deleted file mode 100644 index 9fc1cb56..00000000 Binary files a/obfuscate/TourMa.jar and /dev/null differ diff --git a/obfuscate/libs/bcpkix-jdk15on-160.jar b/obfuscate/libs/bcpkix-jdk15on-160.jar new file mode 100644 index 00000000..40f56f96 Binary files /dev/null and b/obfuscate/libs/bcpkix-jdk15on-160.jar differ diff --git a/obfuscate/libs/bcprov-jdk15on-160.jar b/obfuscate/libs/bcprov-jdk15on-160.jar new file mode 100644 index 00000000..91b8ba9f Binary files /dev/null and b/obfuscate/libs/bcprov-jdk15on-160.jar differ diff --git a/obfuscate/libs/colorchooser.jar b/obfuscate/libs/colorchooser.jar new file mode 100644 index 00000000..77d2f3db Binary files /dev/null and b/obfuscate/libs/colorchooser.jar differ diff --git a/obfuscate/libs/commons-imaging-1.0-R1534292.jar b/obfuscate/libs/commons-imaging-1.0-R1534292.jar new file mode 100644 index 00000000..12acc432 Binary files /dev/null and b/obfuscate/libs/commons-imaging-1.0-R1534292.jar differ diff --git a/obfuscate/libs/commons-lang3-3.4.jar b/obfuscate/libs/commons-lang3-3.4.jar new file mode 100644 index 00000000..5d8e63d3 Binary files /dev/null and b/obfuscate/libs/commons-lang3-3.4.jar differ diff --git a/obfuscate/libs/commons-logging-1.2.jar b/obfuscate/libs/commons-logging-1.2.jar new file mode 100644 index 00000000..695ddd2d Binary files /dev/null and b/obfuscate/libs/commons-logging-1.2.jar differ diff --git a/obfuscate/libs/commons-math3-3.6.1.jar b/obfuscate/libs/commons-math3-3.6.1.jar new file mode 100644 index 00000000..81bdbc96 Binary files /dev/null and b/obfuscate/libs/commons-math3-3.6.1.jar differ diff --git a/obfuscate/libs/commons-net-3.6.jar b/obfuscate/libs/commons-net-3.6.jar new file mode 100644 index 00000000..5ac184ae Binary files /dev/null and b/obfuscate/libs/commons-net-3.6.jar differ diff --git a/obfuscate/libs/core.jar b/obfuscate/libs/core.jar new file mode 100644 index 00000000..5fb35f30 Binary files /dev/null and b/obfuscate/libs/core.jar differ diff --git a/obfuscate/libs/findbugs.jar b/obfuscate/libs/findbugs.jar new file mode 100644 index 00000000..0b6987b6 Binary files /dev/null and b/obfuscate/libs/findbugs.jar differ diff --git a/obfuscate/libs/freemarker.jar b/obfuscate/libs/freemarker.jar new file mode 100644 index 00000000..e29a4df1 Binary files /dev/null and b/obfuscate/libs/freemarker.jar differ diff --git a/obfuscate/libs/javase.jar b/obfuscate/libs/javase.jar new file mode 100644 index 00000000..4f111048 Binary files /dev/null and b/obfuscate/libs/javase.jar differ diff --git a/obfuscate/libs/jaxb-api-1.0.jar b/obfuscate/libs/jaxb-api-1.0.jar new file mode 100644 index 00000000..5ccb2f51 Binary files /dev/null and b/obfuscate/libs/jaxb-api-1.0.jar differ diff --git a/obfuscate/libs/jaxen-1.1.6.jar b/obfuscate/libs/jaxen-1.1.6.jar new file mode 100644 index 00000000..3a9b92b7 Binary files /dev/null and b/obfuscate/libs/jaxen-1.1.6.jar differ diff --git a/obfuscate/libs/jcalendar-1.4.jar b/obfuscate/libs/jcalendar-1.4.jar new file mode 100644 index 00000000..bbe56425 Binary files /dev/null and b/obfuscate/libs/jcalendar-1.4.jar differ diff --git a/obfuscate/libs/jcommon-1.0.18.jar b/obfuscate/libs/jcommon-1.0.18.jar new file mode 100644 index 00000000..4ac10ad2 Binary files /dev/null and b/obfuscate/libs/jcommon-1.0.18.jar differ diff --git a/obfuscate/libs/jdom-1.1.3.jar b/obfuscate/libs/jdom-1.1.3.jar new file mode 100644 index 00000000..3f805230 Binary files /dev/null and b/obfuscate/libs/jdom-1.1.3.jar differ diff --git a/obfuscate/libs/jfreechart-1.0.15.jar b/obfuscate/libs/jfreechart-1.0.15.jar new file mode 100644 index 00000000..cbbd771c Binary files /dev/null and b/obfuscate/libs/jfreechart-1.0.15.jar differ diff --git a/obfuscate/libs/poi-4.0.0.jar b/obfuscate/libs/poi-4.0.0.jar new file mode 100644 index 00000000..f8436775 Binary files /dev/null and b/obfuscate/libs/poi-4.0.0.jar differ diff --git a/obfuscate/libs/xercesImpl.jar b/obfuscate/libs/xercesImpl.jar new file mode 100644 index 00000000..104ddc73 Binary files /dev/null and b/obfuscate/libs/xercesImpl.jar differ diff --git a/obfuscate/libs/xml-apis.jar b/obfuscate/libs/xml-apis.jar new file mode 100644 index 00000000..213cf048 Binary files /dev/null and b/obfuscate/libs/xml-apis.jar differ diff --git a/obfuscate/libs/xmlsec-1.5.1.jar b/obfuscate/libs/xmlsec-1.5.1.jar new file mode 100644 index 00000000..374f4cd8 Binary files /dev/null and b/obfuscate/libs/xmlsec-1.5.1.jar differ diff --git a/obfuscate/unused.txt b/obfuscate/unused.txt deleted file mode 100644 index 48afed0d..00000000 --- a/obfuscate/unused.txt +++ /dev/null @@ -1,9709 +0,0 @@ -com.bric.swing.ColorPicker: - private static final long serialVersionUID -com.bric.swing.ColorPickerDialog: - private static final long serialVersionUID -com.bric.swing.ColorPickerPanel: - private static final long serialVersionUID -com.bric.swing.ColorSwatch: - private static final long serialVersionUID -com.google.zxing.StringsResourceTranslator: - private static final java.lang.String API_KEY - private static final java.lang.String APACHE_2_LICENSE -com.google.zxing.client.j2se.CommandLineEncoder: - private static final java.lang.String DEFAULT_IMAGE_FORMAT - private static final java.lang.String DEFAULT_OUTPUT_FILE - private static final int DEFAULT_WIDTH - private static final int DEFAULT_HEIGHT -com.google.zxing.client.result.ProductParsedResult: - 28:29:ProductParsedResult(java.lang.String) -com.google.zxing.client.result.ResultParser: - private static final java.lang.String BYTE_ORDER_MARK -com.google.zxing.client.result.URIResultParser: - private static final java.lang.String ALPHANUM_PART -com.google.zxing.common.GlobalHistogramBinarizer: - private static final int LUMINANCE_BITS - private static final int LUMINANCE_SHIFT - private static final int LUMINANCE_BUCKETS -com.google.zxing.common.HybridBinarizer: - private static final int BLOCK_SIZE_POWER - private static final int BLOCK_SIZE - private static final int BLOCK_SIZE_MASK - private static final int MINIMUM_DIMENSION - private static final int MIN_DYNAMIC_RANGE -com.google.zxing.common.StringUtils: - private static final java.lang.String EUC_JP - private static final java.lang.String UTF8 - private static final java.lang.String ISO88591 -com.google.zxing.common.detector.MonochromeRectangleDetector: - private static final int MAX_MODULES -com.google.zxing.common.detector.WhiteRectangleDetector: - private static final int INIT_SIZE - private static final int CORR -com.google.zxing.common.reedsolomon.GenericGF: - private static final int INITIALIZATION_THRESHOLD -com.google.zxing.datamatrix.decoder.DecodedBitStreamParser: - 79:80:private DecodedBitStreamParser() -com.google.zxing.maxicode.MaxiCodeReader: - private static final int MATRIX_WIDTH - private static final int MATRIX_HEIGHT - 47:47:com.google.zxing.maxicode.decoder.Decoder getDecoder() -com.google.zxing.maxicode.decoder.DecodedBitStreamParser: - private static final char SHIFTA - private static final char SHIFTB - private static final char SHIFTC - private static final char SHIFTD - private static final char SHIFTE - private static final char TWOSHIFTA - private static final char THREESHIFTA - private static final char LATCHA - private static final char LATCHB - private static final char LOCK - private static final char ECI - private static final char NS - private static final char PAD - private static final char FS - private static final char GS - private static final char RS - 60:61:private DecodedBitStreamParser() -com.google.zxing.maxicode.decoder.Decoder: - private static final int ALL - private static final int EVEN - private static final int ODD -com.google.zxing.multi.GenericMultipleBarcodeReader: - private static final int MIN_DIMENSION_TO_RECUR -com.google.zxing.multi.qrcode.detector.MultiFinderPatternFinder: - private static final float MAX_MODULE_COUNT_PER_EDGE - private static final float MIN_MODULE_COUNT_PER_EDGE - private static final float DIFF_MODSIZE_CUTOFF_PERCENT - private static final float DIFF_MODSIZE_CUTOFF - 93:94:MultiFinderPatternFinder(com.google.zxing.common.BitMatrix) -com.google.zxing.oned.CodaBarReader: - private static final int MAX_ACCEPTABLE - private static final int PADDING - private static final java.lang.String ALPHABET_STRING - private static final int MIN_CHARACTER_LENGTH -com.google.zxing.oned.Code128Reader: - private static final int MAX_AVG_VARIANCE - private static final int MAX_INDIVIDUAL_VARIANCE - private static final int CODE_SHIFT - private static final int CODE_CODE_C - private static final int CODE_CODE_B - private static final int CODE_CODE_A - private static final int CODE_FNC_1 - private static final int CODE_FNC_2 - private static final int CODE_FNC_3 - private static final int CODE_FNC_4_A - private static final int CODE_FNC_4_B - private static final int CODE_START_A - private static final int CODE_START_B - private static final int CODE_START_C - private static final int CODE_STOP -com.google.zxing.oned.Code128Writer: - private static final int CODE_START_B - private static final int CODE_START_C - private static final int CODE_CODE_B - private static final int CODE_CODE_C - private static final int CODE_STOP - private static final char ESCAPE_FNC_1 - private static final char ESCAPE_FNC_2 - private static final char ESCAPE_FNC_3 - private static final char ESCAPE_FNC_4 - private static final int CODE_FNC_1 - private static final int CODE_FNC_2 - private static final int CODE_FNC_3 - private static final int CODE_FNC_4_B -com.google.zxing.oned.Code39Reader: - static final java.lang.String ALPHABET_STRING -com.google.zxing.oned.Code93Reader: - private static final java.lang.String ALPHABET_STRING -com.google.zxing.oned.EAN13Writer: - private static final int CODE_WIDTH -com.google.zxing.oned.EAN8Writer: - private static final int CODE_WIDTH -com.google.zxing.oned.ITFReader: - private static final int MAX_AVG_VARIANCE - private static final int MAX_INDIVIDUAL_VARIANCE - private static final int W - private static final int N -com.google.zxing.oned.UPCEANReader: - private static final int MAX_AVG_VARIANCE - private static final int MAX_INDIVIDUAL_VARIANCE -com.google.zxing.oned.rss.AbstractRSSReader: - private static final int MAX_AVG_VARIANCE - private static final int MAX_INDIVIDUAL_VARIANCE - private static final float MIN_FINDER_PATTERN_RATIO - private static final float MAX_FINDER_PATTERN_RATIO -com.google.zxing.oned.rss.RSSUtils: - 25:61:static int[] getRSSwidths(int,int,int,int,boolean) - 128:152:static int[] elements(int[],int,int) -com.google.zxing.oned.rss.expanded.BitArrayBuilder: - 39:40:private BitArrayBuilder() -com.google.zxing.oned.rss.expanded.RSSExpandedReader: - private static final int FINDER_PAT_A - private static final int FINDER_PAT_B - private static final int FINDER_PAT_C - private static final int FINDER_PAT_D - private static final int FINDER_PAT_E - private static final int FINDER_PAT_F - private static final int MAX_PAIRS -com.google.zxing.oned.rss.expanded.decoders.AI01392xDecoder: - private static final int HEADER_SIZE - private static final int LAST_DIGIT_SIZE -com.google.zxing.oned.rss.expanded.decoders.AI01393xDecoder: - private static final int HEADER_SIZE - private static final int LAST_DIGIT_SIZE - private static final int FIRST_THREE_DIGITS_SIZE -com.google.zxing.oned.rss.expanded.decoders.AI013x0x1xDecoder: - private static final int HEADER_SIZE - private static final int WEIGHT_SIZE - private static final int DATE_SIZE -com.google.zxing.oned.rss.expanded.decoders.AI013x0xDecoder: - private static final int HEADER_SIZE - private static final int WEIGHT_SIZE -com.google.zxing.oned.rss.expanded.decoders.AI01AndOtherAIs: - private static final int HEADER_SIZE -com.google.zxing.oned.rss.expanded.decoders.AI01decoder: - protected static final int GTIN_SIZE -com.google.zxing.oned.rss.expanded.decoders.AnyAIDecoder: - private static final int HEADER_SIZE -com.google.zxing.oned.rss.expanded.decoders.CurrentParsingState: - 65:65:boolean isNumeric() -com.google.zxing.oned.rss.expanded.decoders.DecodedChar: - static final char FNC1 -com.google.zxing.oned.rss.expanded.decoders.DecodedNumeric: - static final int FNC1 - 64:64:int getValue() - 76:76:boolean isAnyFNC1() -com.google.zxing.oned.rss.expanded.decoders.FieldParser: - 189:190:private FieldParser() -com.google.zxing.pdf417.decoder.BitMatrixParser: - private static final int MAX_ROW_DIFFERENCE - private static final int MAX_ROWS - private static final int MAX_CW_CAPACITY - private static final int MODULES_IN_SYMBOL -com.google.zxing.pdf417.decoder.DecodedBitStreamParser: - private static final int TEXT_COMPACTION_MODE_LATCH - private static final int BYTE_COMPACTION_MODE_LATCH - private static final int NUMERIC_COMPACTION_MODE_LATCH - private static final int BYTE_COMPACTION_MODE_LATCH_6 - private static final int BEGIN_MACRO_PDF417_CONTROL_BLOCK - private static final int BEGIN_MACRO_PDF417_OPTIONAL_FIELD - private static final int MACRO_PDF417_TERMINATOR - private static final int MODE_SHIFT_TO_BYTE_COMPACTION_MODE - private static final int MAX_NUMERIC_CODEWORDS - private static final int PL - private static final int LL - private static final int AS - private static final int ML - private static final int AL - private static final int PS - private static final int PAL - 83:84:private DecodedBitStreamParser() -com.google.zxing.pdf417.decoder.Decoder: - private static final int MAX_ERRORS - private static final int MAX_EC_CODEWORDS -com.google.zxing.pdf417.decoder.ec.ModulusPoly: - 56:56:int[] getCoefficients() - 205:227:com.google.zxing.pdf417.decoder.ec.ModulusPoly[] divide(com.google.zxing.pdf417.decoder.ec.ModulusPoly) -com.google.zxing.pdf417.detector.Detector: - private static final int INTEGER_MATH_SHIFT - private static final int PATTERN_MATCH_RESULT_SCALE_FACTOR - private static final int MAX_AVG_VARIANCE - private static final int MAX_INDIVIDUAL_VARIANCE - private static final int SKEW_THRESHOLD -com.google.zxing.pdf417.encoder.BarcodeMatrix: - 47:48:void set(int,int,byte) - 51:52:void setMatrix(int,int,boolean) - 63:63:byte[][] getMatrix() - 67:67:byte[][] getScaledMatrix(int) -com.google.zxing.pdf417.encoder.BarcodeRow: - 45:46:void set(int,byte) - 69:69:byte[] getRow() -com.google.zxing.pdf417.encoder.PDF417: - private static final int START_PATTERN - private static final int STOP_PATTERN - private static final float PREFERRED_RATIO - private static final float DEFAULT_MODULE_WIDTH - private static final float HEIGHT - 549:564:private static int getNumberOfRows(int,int,int) -com.google.zxing.pdf417.encoder.PDF417ErrorCorrection: - 127:128:private PDF417ErrorCorrection() - 152:167:static int getRecommendedMinimumErrorCorrectionLevel(int) -com.google.zxing.pdf417.encoder.PDF417HighLevelEncoder: - private static final int TEXT_COMPACTION - private static final int BYTE_COMPACTION - private static final int NUMERIC_COMPACTION - private static final int SUBMODE_ALPHA - private static final int SUBMODE_LOWER - private static final int SUBMODE_MIXED - private static final int SUBMODE_PUNCTUATION - private static final int LATCH_TO_TEXT - private static final int LATCH_TO_BYTE_PADDED - private static final int LATCH_TO_NUMERIC - private static final int SHIFT_TO_BYTE - private static final int LATCH_TO_BYTE - 111:112:private PDF417HighLevelEncoder() -com.google.zxing.qrcode.QRCodeWriter: - private static final int QUIET_ZONE_SIZE -com.google.zxing.qrcode.decoder.DecodedBitStreamParser: - private static final int GB2312_SUBSET - 53:54:private DecodedBitStreamParser() -com.google.zxing.qrcode.decoder.FormatInformation: - private static final int FORMAT_INFO_MASK_QR -com.google.zxing.qrcode.detector.FinderPattern: - 52:53:void incrementCount() -com.google.zxing.qrcode.detector.FinderPatternFinder: - private static final int CENTER_QUORUM - private static final int INTEGER_MATH_SHIFT -com.google.zxing.qrcode.encoder.Encoder: - static final java.lang.String DEFAULT_BYTE_MODE_ENCODING -com.google.zxing.qrcode.encoder.MaskUtil: - private static final int N1 - private static final int N2 - private static final int N3 - private static final int N4 - 32:34:private MaskUtil() -com.google.zxing.qrcode.encoder.MatrixUtil: - private static final int VERSION_INFO_POLY - private static final int TYPE_INFO_POLY - private static final int TYPE_INFO_MASK_PATTERN - 30:32:private MatrixUtil() -com.hexidec.ekit.EkitCore: - private com.hexidec.ekit.component.JComboBoxNoFocus jcmbColorSelector - 2221:2225:private void insertTableCell() - 2865:2866:private void loadDocument(java.io.File,java.lang.String) -com.hexidec.ekit.action.ListAutomationAction: - private java.lang.String sListType -com.hexidec.ekit.component.ImageFileChooserPreview: - private static final int previewWidth - private static final int previewHeight -com.hexidec.ekit.component.RelativeImageView: - private static final java.lang.String PENDING_IMAGE_SRC - private static final java.lang.String MISSING_IMAGE_SRC - private static final int DEFAULT_WIDTH - private static final int DEFAULT_HEIGHT - private static final int DEFAULT_BORDER -com.hexidec.ekit.component.UnicodeDialog: - private static final int UNICODEBLOCKSIZE - private static final java.lang.String CMDCHANGEBLOCK -com.itextpdf.awt.PdfGraphics2D: - private static final int FILL - private static final int STROKE - private static final int CLIP -com.itextpdf.awt.PdfGraphics2D$FakeComponent: - private static final long serialVersionUID -com.itextpdf.awt.geom.AffineTransform: - private static final long serialVersionUID - static final int TYPE_UNKNOWN - static final double ZERO - 641:642:private void writeObject(java.io.ObjectOutputStream) - 652:654:private void readObject(java.io.ObjectInputStream) -com.itextpdf.awt.geom.Dimension: - private static final long serialVersionUID -com.itextpdf.awt.geom.FlatteningPathIterator: - private static final int BUFFER_SIZE - private static final int BUFFER_LIMIT - private static final int BUFFER_CAPACITY -com.itextpdf.awt.geom.GeneralPath: - private static final int BUFFER_SIZE - private static final int BUFFER_CAPACITY -com.itextpdf.awt.geom.GeneralPath$Iterator: - 111:112:GeneralPath$Iterator(com.itextpdf.awt.geom.GeneralPath,com.itextpdf.awt.geom.GeneralPath) -com.itextpdf.awt.geom.IllegalPathStateException: - private static final long serialVersionUID -com.itextpdf.awt.geom.NoninvertibleTransformException: - private static final long serialVersionUID -com.itextpdf.awt.geom.Point: - private static final long serialVersionUID -com.itextpdf.awt.geom.Rectangle: - private static final long serialVersionUID -com.itextpdf.awt.geom.gl.Crossing: - static final double DELTA - static final double ROOT_DELTA - static final int UNKNOWN -com.itextpdf.testutils.CompareTool: - private static final java.lang.String cannotOpenTargetDirectory - private static final java.lang.String gsFailed - private static final java.lang.String unexpectedNumberOfPages - private static final java.lang.String differentPages - private static final java.lang.String undefinedGsPath - private static final java.lang.String ignoredAreasPrefix -com.itextpdf.testutils.CompareTool$ObjectPath: - 119:123:public CompareTool$ObjectPath(com.itextpdf.testutils.CompareTool) -com.itextpdf.text.Anchor: - private static final long serialVersionUID -com.itextpdf.text.BadElementException: - private static final long serialVersionUID -com.itextpdf.text.BaseColor: - private static final double FACTOR -com.itextpdf.text.Chapter: - private static final long serialVersionUID -com.itextpdf.text.ChapterAutoNumber: - private static final long serialVersionUID -com.itextpdf.text.DocumentException: - private static final long serialVersionUID -com.itextpdf.text.ExceptionConverter: - private static final long serialVersionUID -com.itextpdf.text.ImgCCITT: - 63:64:ImgCCITT(com.itextpdf.text.Image) -com.itextpdf.text.ImgJBIG2: - 66:67:ImgJBIG2(com.itextpdf.text.Image) -com.itextpdf.text.ImgRaw: - 62:63:ImgRaw(com.itextpdf.text.Image) -com.itextpdf.text.ImgTemplate: - 64:65:ImgTemplate(com.itextpdf.text.Image) -com.itextpdf.text.ImgWMF: - 70:71:ImgWMF(com.itextpdf.text.Image) -com.itextpdf.text.Jpeg: - 106:107:Jpeg(com.itextpdf.text.Image) -com.itextpdf.text.Jpeg2000: - 83:101:Jpeg2000(com.itextpdf.text.Image) -com.itextpdf.text.Jpeg2000$ZeroBoxSizeException: - 340:342:public Jpeg2000$ZeroBoxSizeException(com.itextpdf.text.Jpeg2000) -com.itextpdf.text.ListItem: - private static final long serialVersionUID -com.itextpdf.text.Paragraph: - private static final long serialVersionUID -com.itextpdf.text.Phrase: - private static final long serialVersionUID -com.itextpdf.text.Section: - private static final long serialVersionUID -com.itextpdf.text.api.package-info -com.itextpdf.text.error_messages.MessageLocalization: - private static final java.lang.String BASE_PATH -com.itextpdf.text.exceptions.BadPasswordException: - private static final long serialVersionUID -com.itextpdf.text.exceptions.IllegalPdfSyntaxException: - private static final long serialVersionUID -com.itextpdf.text.exceptions.InvalidImageException: - private static final long serialVersionUID -com.itextpdf.text.exceptions.InvalidPdfException: - private static final long serialVersionUID -com.itextpdf.text.exceptions.UnsupportedPdfException: - private static final long serialVersionUID -com.itextpdf.text.html.WebColors: - private static final long serialVersionUID -com.itextpdf.text.html.simpleparser.HTMLTagProcessors: - private static final long serialVersionUID -com.itextpdf.text.html.simpleparser.ImageStore: - private static final long serialVersionUID -com.itextpdf.text.io.PagedChannelRandomAccessSource: - public static final int DEFAULT_TOTAL_BUFSIZE - public static final int DEFAULT_MAX_OPEN_BUFFERS -com.itextpdf.text.pdf.BadPdfFormatException: - private static final long serialVersionUID -com.itextpdf.text.pdf.Barcode39: - private static final java.lang.String CHARS - private static final java.lang.String EXTENDED -com.itextpdf.text.pdf.BarcodeCodabar: - private static final java.lang.String CHARS - private static final int START_STOP_IDX -com.itextpdf.text.pdf.BarcodeDatamatrix: - private static final java.lang.String x12 -com.itextpdf.text.pdf.BarcodeDatamatrix$ReedSolomon: - 1080:1080:BarcodeDatamatrix$ReedSolomon() -com.itextpdf.text.pdf.BarcodeEAN: - private static final int TOTALBARS_EAN13 - private static final int TOTALBARS_EAN8 - private static final int TOTALBARS_UPCE - private static final int TOTALBARS_SUPP2 - private static final int TOTALBARS_SUPP5 - private static final int ODD - private static final int EVEN -com.itextpdf.text.pdf.BarcodePDF417: - private static final java.lang.String MIXED_SET - private static final java.lang.String PUNCTUATION_SET -com.itextpdf.text.pdf.BaseFont: - abstract com.itextpdf.text.pdf.PdfStream getFullFontStream() -com.itextpdf.text.pdf.BidiOrder: - 1059:1068:private int findRunStart(int,byte[]) -com.itextpdf.text.pdf.CFFFont: - 1205:1207:void ReadEncoding(int) -com.itextpdf.text.pdf.CFFFontSubset: - static final byte ENDCHAR_OP - static final byte RETURN_OP -com.itextpdf.text.pdf.CJKFont: - static final java.lang.String CJK_ENCODING - private static final int FIRST - private static final int BRACKET - private static final int SERIAL - private static final int V1Y - public static final java.lang.String RESOURCE_PATH_CMAP - 377:377:public com.itextpdf.text.pdf.PdfStream getFullFontStream() -com.itextpdf.text.pdf.CMYKColor: - private static final long serialVersionUID -com.itextpdf.text.pdf.DocumentFont: - 901:901:com.itextpdf.text.pdf.IntHashtable getUni2Byte() -com.itextpdf.text.pdf.ExtendedColor: - private static final long serialVersionUID -com.itextpdf.text.pdf.FontDetails: - 416:416:public boolean isSubset() -com.itextpdf.text.pdf.GrayColor: - private static final long serialVersionUID -com.itextpdf.text.pdf.LongHashtable$Entry: - 374:374:public long getKey() - 377:377:public long getValue() -com.itextpdf.text.pdf.MappedRandomAccessFile: - private static final int BUFSIZE -com.itextpdf.text.pdf.OutputStreamEncryption: - private static final int AES_128 - private static final int AES_256 -com.itextpdf.text.pdf.PRTokeniser: - static final java.lang.String EMPTY -com.itextpdf.text.pdf.PatternColor: - private static final long serialVersionUID -com.itextpdf.text.pdf.PdfAConformanceException: - private static final long serialVersionUID -com.itextpdf.text.pdf.PdfChunk: - private static final float ITALIC_ANGLE - private static final java.lang.String TABSTOP - 828:829:void setImageOffsetX(float) - 848:849:void setImageOffsetY(float) - 895:895:java.lang.String getEncoding() -com.itextpdf.text.pdf.PdfCopyFieldsImp: - 636:637:protected boolean isVisited(com.itextpdf.text.pdf.PdfReader,int,int) - 655:655:com.itextpdf.text.pdf.RandomAccessFileOrArray getReaderFile(com.itextpdf.text.pdf.PdfReader) -com.itextpdf.text.pdf.PdfDocument: - static final java.lang.String hangingPunctuation - 2804:2807:private com.itextpdf.text.pdf.PdfLine getLastLine() -com.itextpdf.text.pdf.PdfDocument$PdfInfo: - 110:114:PdfDocument$PdfInfo(java.lang.String,java.lang.String,java.lang.String) -com.itextpdf.text.pdf.PdfEncryption: - private static final int VALIDATION_SALT_OFFSET - private static final int KEY_SALT_OFFSET - private static final int SALT_LENGHT - private static final int OU_LENGHT -com.itextpdf.text.pdf.PdfException: - private static final long serialVersionUID -com.itextpdf.text.pdf.PdfImage: - static final int TRANSFERSIZE -com.itextpdf.text.pdf.PdfIsoConformanceException: - private static final long serialVersionUID -com.itextpdf.text.pdf.PdfNameTree: - private static final int leafSize -com.itextpdf.text.pdf.PdfNull: - private static final java.lang.String CONTENT -com.itextpdf.text.pdf.PdfNumberTree: - private static final int leafSize -com.itextpdf.text.pdf.PdfPage: - 120:121:PdfPage(com.itextpdf.text.pdf.PdfRectangle,java.util.HashMap,com.itextpdf.text.pdf.PdfDictionary) - 154:156:com.itextpdf.text.pdf.PdfRectangle rotateMediaBox() - 166:166:com.itextpdf.text.pdf.PdfRectangle getMediaBox() -com.itextpdf.text.pdf.PdfPageElement -com.itextpdf.text.pdf.PdfPages: - 159:159:com.itextpdf.text.pdf.PdfIndirectReference getTopParent() - 174:175:void addPage(com.itextpdf.text.pdf.PdfIndirectReference) -com.itextpdf.text.pdf.PdfPublicKeySecurityHandler: - static final int SEED_LENGTH -com.itextpdf.text.pdf.PdfReader$PageRefs: - 3706:3708:void reReadPages() - 3734:3736:public com.itextpdf.text.pdf.PRIndirectReference getPageOrigRefRelease(int) -com.itextpdf.text.pdf.PdfReaderInstance: - 102:102:com.itextpdf.text.pdf.RandomAccessFileOrArray getReaderFile() -com.itextpdf.text.pdf.PdfShadingPattern: - 77:77:com.itextpdf.text.pdf.PdfName getShadingName() -com.itextpdf.text.pdf.PdfSignatureAppearance: - private static final float TOP_SECTION - private static final float MARGIN - 1161:1161:com.itextpdf.text.pdf.ByteBuffer getSigout() - 1178:1178:java.io.OutputStream getOriginalout() -com.itextpdf.text.pdf.PdfStamperImp: - 589:598:com.itextpdf.text.pdf.RandomAccessFileOrArray getReaderFile(com.itextpdf.text.pdf.PdfReader) -com.itextpdf.text.pdf.PdfWriter: - static final int ENCRYPTION_MASK - 2436:2436:com.itextpdf.text.pdf.RandomAccessFileOrArray getReaderFile(com.itextpdf.text.pdf.PdfReader) -com.itextpdf.text.pdf.PdfWriter$PdfBody: - private static final int OBJSINSTREAM -com.itextpdf.text.pdf.PdfXConformanceException: - private static final long serialVersionUID -com.itextpdf.text.pdf.SequenceList: - private static final int FIRST - private static final int DIGIT - private static final int OTHER - private static final int DIGIT2 - private static final java.lang.String NOT_OTHER -com.itextpdf.text.pdf.ShadingColor: - private static final long serialVersionUID -com.itextpdf.text.pdf.SpotColor: - private static final long serialVersionUID -com.itextpdf.text.pdf.StandardDecryption: - private static final int AES_128 - private static final int AES_256 -com.itextpdf.text.pdf.TrueTypeFont: - 1568:1573:public com.itextpdf.text.pdf.PdfStream getFullFontStream() -com.itextpdf.text.pdf.TrueTypeFontSubSet: - static final int TABLE_CHECKSUM - static final int TABLE_OFFSET - static final int TABLE_LENGTH - static final int HEAD_LOCA_FORMAT_OFFSET - static final int ARG_1_AND_2_ARE_WORDS - static final int WE_HAVE_A_SCALE - static final int MORE_COMPONENTS - static final int WE_HAVE_AN_X_AND_Y_SCALE - static final int WE_HAVE_A_TWO_BY_TWO -com.itextpdf.text.pdf.TrueTypeFontUnicode: - 379:382:public com.itextpdf.text.pdf.PdfStream getFullFontStream() - 477:520:private void readGsubTable() -com.itextpdf.text.pdf.XfaForm$Stack2: - private static final long serialVersionUID -com.itextpdf.text.pdf.codec.Base64: - private static final int MAX_LINE_LENGTH - private static final byte EQUALS_SIGN - private static final byte NEW_LINE - private static final java.lang.String PREFERRED_ENCODING - private static final byte WHITE_SPACE_ENC - private static final byte EQUALS_SIGN_ENC - 446:448:private static final void usage(java.lang.String) -com.itextpdf.text.pdf.codec.BmpImage: - private static final int VERSION_2_1_BIT - private static final int VERSION_2_4_BIT - private static final int VERSION_2_8_BIT - private static final int VERSION_2_24_BIT - private static final int VERSION_3_1_BIT - private static final int VERSION_3_4_BIT - private static final int VERSION_3_8_BIT - private static final int VERSION_3_24_BIT - private static final int VERSION_3_NT_16_BIT - private static final int VERSION_3_NT_32_BIT - private static final int VERSION_4_1_BIT - private static final int VERSION_4_4_BIT - private static final int VERSION_4_8_BIT - private static final int VERSION_4_16_BIT - private static final int VERSION_4_24_BIT - private static final int VERSION_4_32_BIT - private static final int LCS_CALIBRATED_RGB - private static final int LCS_sRGB - private static final int LCS_CMYK - private static final int BI_RGB - private static final int BI_RLE8 - private static final int BI_RLE4 - private static final int BI_BITFIELDS - 1283:1285:private int readShort(java.io.InputStream) -com.itextpdf.text.pdf.codec.CCITTG4Encoder: - private static final int LENGTH - private static final int CODE - private static final int RUNLEN - private static final int EOL - private static final int G3CODE_EOL - private static final int G3CODE_INVALID - private static final int G3CODE_EOF - private static final int G3CODE_INCOMP -com.itextpdf.text.pdf.codec.LZWStringTable: - private static final int RES_CODES - private static final short HASH_FREE - private static final short NEXT_FIRST - private static final int MAXBITS - private static final int MAXSTR - private static final short HASHSIZE - private static final short HASHSTEP -com.itextpdf.text.pdf.codec.PngImage: - private static final int TRANSFERSIZE - private static final int PNG_FILTER_NONE - private static final int PNG_FILTER_SUB - private static final int PNG_FILTER_UP - private static final int PNG_FILTER_AVERAGE - private static final int PNG_FILTER_PAETH - 814:821:static int getPixel(byte[],int,int,int,int) -com.itextpdf.text.pdf.codec.PngWriter: - 157:157:private static int crc(byte[],int,int) - 161:161:private static int crc(byte[]) -com.itextpdf.text.pdf.codec.TIFFDirectory: - private static final long serialVersionUID - 560:563:private long readLong(com.itextpdf.text.pdf.RandomAccessFileOrArray) -com.itextpdf.text.pdf.codec.TIFFField: - private static final long serialVersionUID -com.itextpdf.text.pdf.codec.wmf.MetaFont: - static final int MARKER_BOLD - static final int MARKER_ITALIC - static final int MARKER_COURIER - static final int MARKER_HELVETICA - static final int MARKER_TIMES - static final int MARKER_SYMBOL - static final int DEFAULT_PITCH - static final int FIXED_PITCH - static final int VARIABLE_PITCH - static final int FF_DONTCARE - static final int FF_ROMAN - static final int FF_SWISS - static final int FF_MODERN - static final int FF_SCRIPT - static final int FF_DECORATIVE - static final int BOLDTHRESHOLD - static final int nameSize - static final int ETO_OPAQUE - static final int ETO_CLIPPED -com.itextpdf.text.pdf.fonts.cmaps.CMapParserEx: - private static final java.lang.String DEF - private static final java.lang.String ENDCIDRANGE - private static final java.lang.String ENDCIDCHAR - private static final java.lang.String ENDBFRANGE - private static final java.lang.String ENDBFCHAR - private static final java.lang.String USECMAP - private static final int MAXLEVEL - 138:159:private static void encodeSequence(int,byte[],char,java.util.ArrayList) -com.itextpdf.text.pdf.fonts.otf.FontReadingException: - private static final long serialVersionUID -com.itextpdf.text.pdf.hyphenation.ByteVector: - private static final long serialVersionUID - private static final int DEFAULT_BLOCK_SIZE -com.itextpdf.text.pdf.hyphenation.CharVector: - private static final long serialVersionUID - private static final int DEFAULT_BLOCK_SIZE -com.itextpdf.text.pdf.hyphenation.Hyphen: - private static final long serialVersionUID - 46:50:Hyphen(java.lang.String) -com.itextpdf.text.pdf.hyphenation.HyphenationException: - private static final long serialVersionUID -com.itextpdf.text.pdf.hyphenation.HyphenationTree: - private static final long serialVersionUID -com.itextpdf.text.pdf.hyphenation.Hyphenator: - private static final java.lang.String defaultHyphLocation -com.itextpdf.text.pdf.hyphenation.SimplePatternParser: - com.itextpdf.text.xml.simpleparser.SimpleXMLParser parser - static final int ELEM_CLASSES - static final int ELEM_EXCEPTIONS - static final int ELEM_PATTERNS - static final int ELEM_HYPHEN -com.itextpdf.text.pdf.hyphenation.TernaryTree: - private static final long serialVersionUID -com.itextpdf.text.pdf.internal.PdfA2Checker: - static final int maxPageSize - static final int minPageSize -com.itextpdf.text.pdf.internal.PdfViewerPreferencesImp: - private static final int viewerPreferencesMask -com.itextpdf.text.pdf.languages.ArabicLigaturizer: - private static final char ALEF - private static final char ALEFHAMZA - private static final char ALEFHAMZABELOW - private static final char ALEFMADDA - private static final char LAM - private static final char HAMZA - private static final char TATWEEL - private static final char ZWJ - private static final char HAMZAABOVE - private static final char HAMZABELOW - private static final char WAWHAMZA - private static final char YEHHAMZA - private static final char WAW - private static final char ALEFMAKSURA - private static final char YEH - private static final char FARSIYEH - private static final char SHADDA - private static final char KASRA - private static final char FATHA - private static final char DAMMA - private static final char MADDA - private static final char LAM_ALEF - private static final char LAM_ALEFHAMZA - private static final char LAM_ALEFHAMZABELOW - private static final char LAM_ALEFMADDA - private static final int DIGITS_RESERVED -com.itextpdf.text.pdf.mc.StructureItems: - private static final long serialVersionUID -com.itextpdf.text.pdf.parser.InlineImageUtils$InlineImageParseException: - private static final long serialVersionUID -com.itextpdf.text.pdf.parser.Path: - private static final java.lang.String START_PATH_ERR_MSG -com.itextpdf.text.pdf.parser.PdfContentStreamProcessor$EndPath -com.itextpdf.text.pdf.parser.clipper.ClipperBase: - private static final long LOW_RANGE - private static final long HI_RANGE -com.itextpdf.text.pdf.parser.clipper.ClipperOffset: - private static final double TWO_PI - private static final double DEFAULT_ARC_TOLERANCE - private static final double TOLERANCE -com.itextpdf.text.pdf.parser.clipper.Edge: - protected static final int SKIP - protected static final int UNASSIGNED - protected static final double HORIZONTAL -com.itextpdf.text.pdf.parser.clipper.Path: - private static final long serialVersionUID -com.itextpdf.text.pdf.parser.clipper.Paths: - private static final long serialVersionUID -com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpContext: - 86:87:public void setResources(com.itextpdf.text.pdf.PdfDictionary) - 94:95:public void setCanvas(com.itextpdf.text.pdf.PdfContentByte) -com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpProcessor: - private static final java.lang.String XOBJ_NAME_PREFIX - private static final java.lang.String STROKE_COLOR - private static final java.lang.String FILL_COLOR -com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter: - private static final double circleApproximationConst -com.itextpdf.text.pdf.qrcode.BitVector: - private static final int DEFAULT_SIZE_IN_BYTES -com.itextpdf.text.pdf.qrcode.ByteArray: - private static final int INITIAL_SIZE -com.itextpdf.text.pdf.qrcode.Encoder: - static final java.lang.String DEFAULT_BYTE_MODE_ENCODING -com.itextpdf.text.pdf.qrcode.FormatInformation -com.itextpdf.text.pdf.qrcode.GF256: - 71:71:com.itextpdf.text.pdf.qrcode.GF256Poly getOne() -com.itextpdf.text.pdf.qrcode.GF256Poly: - 99:116:int evaluateAt(int) - 172:183:com.itextpdf.text.pdf.qrcode.GF256Poly multiply(int) -com.itextpdf.text.pdf.qrcode.MatrixUtil: - private static final int VERSION_INFO_POLY - private static final int TYPE_INFO_POLY - private static final int TYPE_INFO_MASK_PATTERN -com.itextpdf.text.pdf.qrcode.QRCodeWriter: - private static final int QUIET_ZONE_SIZE -com.itextpdf.text.pdf.qrcode.ReedSolomonException: - private static final long serialVersionUID -com.itextpdf.text.pdf.qrcode.Version: - 113:135:static com.itextpdf.text.pdf.qrcode.Version decodeVersionInformation(int) - 142:177:com.itextpdf.text.pdf.qrcode.BitMatrix buildFunctionPattern() -com.itextpdf.text.pdf.qrcode.WriterException: - private static final long serialVersionUID -com.itextpdf.text.pdf.security.VerificationException: - private static final long serialVersionUID -com.itextpdf.text.xml.simpleparser.SimpleXMLParser: - private static final int UNKNOWN - private static final int TEXT - private static final int TAG_ENCOUNTERED - private static final int EXAMIN_TAG - private static final int TAG_EXAMINED - private static final int IN_CLOSETAG - private static final int SINGLE_TAG - private static final int CDATA - private static final int COMMENT - private static final int PI - private static final int ENTITY - private static final int QUOTE - private static final int ATTRIBUTE_KEY - private static final int ATTRIBUTE_EQUAL - private static final int ATTRIBUTE_VALUE -com.itextpdf.text.xml.xmp.DublinCoreSchema: - private static final long serialVersionUID -com.itextpdf.text.xml.xmp.LangAlt: - private static final long serialVersionUID -com.itextpdf.text.xml.xmp.PdfASchema: - private static final long serialVersionUID -com.itextpdf.text.xml.xmp.PdfAXmpWriter: - private static final java.lang.String pdfUaExtension - private static final java.lang.String zugferdExtension -com.itextpdf.text.xml.xmp.PdfSchema: - private static final long serialVersionUID -com.itextpdf.text.xml.xmp.XmpArray: - private static final long serialVersionUID -com.itextpdf.text.xml.xmp.XmpBasicSchema: - private static final long serialVersionUID -com.itextpdf.text.xml.xmp.XmpMMSchema: - private static final long serialVersionUID -com.itextpdf.text.xml.xmp.XmpSchema: - private static final long serialVersionUID -com.itextpdf.tool.xml.ElementList: - private static final long serialVersionUID -com.itextpdf.tool.xml.NoCustomContextException: - private static final long serialVersionUID -com.itextpdf.tool.xml.PipelineException: - private static final long serialVersionUID -com.itextpdf.tool.xml.css.CSS: - private static final java.lang.String DEFAULT -com.itextpdf.tool.xml.css.CssUtils: - private static final java.lang.String COLOR - private static final java.lang.String STYLE - private static final java.lang.String WIDTH - private static final java.lang.String BORDER2 - private static final java.lang.String _0_LEFT_1 - private static final java.lang.String _0_RIGHT_1 - private static final java.lang.String _0_BOTTOM_1 - private static final java.lang.String _0_TOP_1 -com.itextpdf.tool.xml.css.apply.package-info -com.itextpdf.tool.xml.css.package-info -com.itextpdf.tool.xml.css.parser.CssSelectorParser: - private static final java.lang.String selectorPatternString - private static final int a - private static final int b - private static final int c -com.itextpdf.tool.xml.css.parser.package-info -com.itextpdf.tool.xml.css.parser.state.package-info -com.itextpdf.tool.xml.exceptions.CssResolverException: - private static final long serialVersionUID -com.itextpdf.tool.xml.exceptions.NoDataException: - private static final long serialVersionUID -com.itextpdf.tool.xml.exceptions.NoSiblingException: - private static final long serialVersionUID -com.itextpdf.tool.xml.exceptions.NoTagProcessorException: - private static final long serialVersionUID -com.itextpdf.tool.xml.exceptions.NotImplementedException: - private static final long serialVersionUID -com.itextpdf.tool.xml.exceptions.RuntimeWorkerException: - private static final long serialVersionUID -com.itextpdf.tool.xml.exceptions.package-info -com.itextpdf.tool.xml.html.head.package-info -com.itextpdf.tool.xml.html.package-info -com.itextpdf.tool.xml.html.pdfelement.NoNewLineParagraph: - private static final long serialVersionUID -com.itextpdf.tool.xml.html.pdfelement.package-info -com.itextpdf.tool.xml.html.table.Table: - 533:554:private float calculateTargetWidth(com.itextpdf.tool.xml.Tag,float[],float,com.itextpdf.tool.xml.WorkerContext) -com.itextpdf.tool.xml.html.table.package-info -com.itextpdf.tool.xml.net.exc.NoImageException: - private static final long serialVersionUID -com.itextpdf.tool.xml.net.package-info -com.itextpdf.tool.xml.package-info -com.itextpdf.tool.xml.parser.io.package-info -com.itextpdf.tool.xml.parser.package-info -com.itextpdf.tool.xml.parser.state.package-info -com.itextpdf.tool.xml.pipeline.css.package-info -com.itextpdf.tool.xml.pipeline.ctx.package-info -com.itextpdf.tool.xml.pipeline.end.package-info -com.itextpdf.tool.xml.pipeline.html.NoImageProviderException: - private static final long serialVersionUID -com.itextpdf.tool.xml.pipeline.html.NoStackException: - private static final long serialVersionUID -com.itextpdf.tool.xml.pipeline.html.package-info -com.itextpdf.tool.xml.pipeline.package-info -com.itextpdf.xmp.impl.Base64: - private static final byte INVALID - private static final byte WHITESPACE - private static final byte EQUAL -com.itextpdf.xmp.impl.FixASCIIControlsReader: - private static final int STATE_START - private static final int STATE_AMP - private static final int STATE_HASH - private static final int STATE_HEX - private static final int STATE_DIG1 - private static final int STATE_ERROR - private static final int BUFFER_SIZE -com.itextpdf.xmp.impl.Latin1Converter: - private static final int STATE_START - private static final int STATE_UTF8CHAR -com.itextpdf.xmp.impl.ParameterAsserts: - 48:50:private ParameterAsserts() -com.itextpdf.xmp.impl.ParseState: - 433:433:public int length() -com.itextpdf.xmp.impl.XMPIteratorImpl$NodeIterator: - protected static final int ITERATE_NODE - protected static final int ITERATE_CHILDREN - protected static final int ITERATE_QUALIFIER - 516:516:protected java.util.Iterator getChildrenIterator() - 525:526:protected void setChildrenIterator(java.util.Iterator) -com.itextpdf.xmp.impl.XMPMetaImpl: - private static final int VALUE_STRING - private static final int VALUE_BOOLEAN - private static final int VALUE_INTEGER - private static final int VALUE_LONG - private static final int VALUE_DOUBLE - private static final int VALUE_DATE - private static final int VALUE_CALENDAR - private static final int VALUE_BASE64 -com.itextpdf.xmp.impl.XMPNodeUtils: - static final int CLT_NO_VALUES - static final int CLT_SPECIFIC_MATCH - static final int CLT_SINGLE_GENERIC - static final int CLT_MULTIPLE_GENERIC - static final int CLT_XDEFAULT - static final int CLT_FIRST_ITEM -com.itextpdf.xmp.impl.XMPSerializerRDF: - private static final int DEFAULT_PAD - private static final java.lang.String PACKET_HEADER - private static final java.lang.String PACKET_TRAILER - private static final java.lang.String PACKET_TRAILER2 - private static final java.lang.String RDF_XMPMETA_START - private static final java.lang.String RDF_XMPMETA_END - private static final java.lang.String RDF_RDF_START - private static final java.lang.String RDF_RDF_END - private static final java.lang.String RDF_SCHEMA_START - private static final java.lang.String RDF_SCHEMA_END - private static final java.lang.String RDF_STRUCT_START - private static final java.lang.String RDF_STRUCT_END - private static final java.lang.String RDF_EMPTY_STRUCT -com.itextpdf.xmp.impl.XMPUtilsImpl: - private static final int UCK_NORMAL - private static final int UCK_SPACE - private static final int UCK_COMMA - private static final int UCK_SEMICOLON - private static final int UCK_QUOTE - private static final int UCK_CONTROL - private static final java.lang.String SPACES - private static final java.lang.String COMMAS - private static final java.lang.String SEMICOLA - private static final java.lang.String QUOTES - private static final java.lang.String CONTROLS -com.itextpdf.xmp.options.SerializeOptions: - private static final int LITTLEENDIAN_BIT - private static final int UTF16_BIT - private static final int ENCODING_MASK -com.swabunga.spell.engine.SpellDictionary: - private static final int INITIAL_CAPACITY -com.swabunga.spell.swing.JSpellForm: - private static final java.lang.String SUGGESTIONS_RES - private static final java.lang.String INVALIDWORD_RES -com.toedter.calendar.JCalendar: - private static final long serialVersionUID -com.toedter.calendar.JDateChooser: - private static final long serialVersionUID -com.toedter.calendar.JDateChooser$1: - private static final long serialVersionUID -com.toedter.calendar.JDateChooser$2: - private static final long serialVersionUID -com.toedter.calendar.JDateChooserCellEditor: - private static final long serialVersionUID -com.toedter.calendar.JDayChooser: - private static final long serialVersionUID -com.toedter.calendar.JDayChooser$1: - private static final long serialVersionUID -com.toedter.calendar.JDayChooser$DecoratorButton: - private static final long serialVersionUID -com.toedter.calendar.JMonthChooser: - private static final long serialVersionUID -com.toedter.calendar.JMonthChooser$1: - private static final long serialVersionUID -com.toedter.calendar.JSpinnerDateEditor: - private static final long serialVersionUID -com.toedter.calendar.JTextFieldDateEditor: - private static final long serialVersionUID -com.toedter.calendar.JYearChooser: - private static final long serialVersionUID -com.toedter.calendar.demo.DateChooserPanel: - private static final long serialVersionUID -com.toedter.calendar.demo.DateChooserPanel$1: - private static final long serialVersionUID -com.toedter.calendar.demo.DemoTable: - private static final long serialVersionUID -com.toedter.calendar.demo.DemoTable$DemoTableModel: - private static final long serialVersionUID -com.toedter.calendar.demo.JCalendarDemo: - private static final long serialVersionUID -com.toedter.calendar.demo.JCalendarDemo$10: - private static final long serialVersionUID -com.toedter.calendar.demo.JCalendarDemo$AboutAction: - private static final long serialVersionUID -com.toedter.components.JLocaleChooser: - private static final long serialVersionUID -com.toedter.components.JSpinField: - private static final long serialVersionUID -com.toedter.components.JSpinField$1: - private static final long serialVersionUID -com.toedter.components.JTitlePanel: - private static final long serialVersionUID -com.toedter.components.JTitlePanel$GradientPanel: - private static final long serialVersionUID -edu.umd.cs.findbugs.BugInstance: - private static final long serialVersionUID - private static final int INVALID_HASH_CODE - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.BugProperty: - private static final long serialVersionUID -edu.umd.cs.findbugs.CheckBcel: - private static final java.lang.String ORG_APACHE_BCEL_REPOSITORY - private static final java.lang.String ORG_APACHE_BCEL_CLASSFILE_EMPTY_VISITOR - private static final java.lang.String ORG_APACHE_BCEL_CONSTANTS - private static final java.lang.String ORG_APACHE_BCEL_GENERIC_TYPE - private static final java.lang.String ORG_APACHE_BCEL_GENERIC_OBJECT_TYPE -edu.umd.cs.findbugs.ClassAnnotation: - private static final long serialVersionUID - private static final java.lang.String DEFAULT_ROLE - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.ClassScreener: - private static final java.lang.String SEP - private static final java.lang.String START - private static final java.lang.String JAVA_IDENTIFIER_PART -edu.umd.cs.findbugs.FatalException: - private static final long serialVersionUID -edu.umd.cs.findbugs.FieldAnnotation: - private static final long serialVersionUID - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.Footprint: - private static final int NOCLASSDEF_ERROR - private static final int CLASSCAST_ERROR - private static final int ERROR_ERROR - private static final int RUNTIME_EXCEPTION -edu.umd.cs.findbugs.FuzzyBugComparator: - private static final boolean DEBUG -edu.umd.cs.findbugs.I18N$DesignationKeyComparator: - private static final long serialVersionUID -edu.umd.cs.findbugs.IntAnnotation: - private static final long serialVersionUID - private static final java.lang.String DEFAULT_ROLE - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.JavaVersionException: - private static final long serialVersionUID -edu.umd.cs.findbugs.LocalVariableAnnotation: - private static final long serialVersionUID - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.MethodAnnotation: - private static final long serialVersionUID - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.OpcodeStack: - private static final java.lang.String JAVA_UTIL_ARRAYS_ARRAY_LIST - 2928:2931:int nullSafeSize(java.util.Collection) -edu.umd.cs.findbugs.OpcodeStack$Item: - private static final int IS_INITIAL_PARAMETER_FLAG - private static final int COULD_BE_ZERO_FLAG - private static final int IS_NULL_FLAG -edu.umd.cs.findbugs.OpcodeStack$JumpInfoFactory$JumpStackComputation: - static final boolean DEBUG1 - 2762:2762:public edu.umd.cs.findbugs.OpcodeStack getStack() -edu.umd.cs.findbugs.PackageMemberAnnotation: - private static final long serialVersionUID -edu.umd.cs.findbugs.Plugin: - private static final java.lang.String USE_FINDBUGS_VERSION -edu.umd.cs.findbugs.PluginException: - private static final long serialVersionUID -edu.umd.cs.findbugs.PluginLoader: - private static final java.lang.String XPATH_PLUGIN_SHORT_DESCRIPTION - private static final java.lang.String XPATH_PLUGIN_WEBSITE - private static final java.lang.String XPATH_PLUGIN_PROVIDER - private static final java.lang.String XPATH_PLUGIN_PLUGINID -edu.umd.cs.findbugs.Project: - private static final java.lang.String OPTIONS_KEY - private static final java.lang.String JAR_FILES_KEY - private static final java.lang.String SRC_DIRS_KEY - private static final java.lang.String AUX_CLASSPATH_ENTRIES_KEY - static final java.lang.String JAR_ELEMENT_NAME - static final java.lang.String AUX_CLASSPATH_ENTRY_ELEMENT_NAME - static final java.lang.String SRC_DIR_ELEMENT_NAME - static final java.lang.String WRK_DIR_ELEMENT_NAME - static final java.lang.String FILENAME_ATTRIBUTE_NAME - static final java.lang.String PROJECTNAME_ATTRIBUTE_NAME - static final java.lang.String CLOUD_ELEMENT_NAME - static final java.lang.String CLOUD_ID_ATTRIBUTE_NAME - static final java.lang.String CLOUD_PROPERTY_ELEMENT_NAME - static final java.lang.String PLUGIN_ELEMENT_NAME - static final java.lang.String PLUGIN_ID_ATTRIBUTE_NAME - static final java.lang.String PLUGIN_STATUS_ELEMENT_NAME -edu.umd.cs.findbugs.ProjectStats: - private static final java.lang.String TIMESTAMP_FORMAT -edu.umd.cs.findbugs.SAXBugCollectionHandler: - private static final java.lang.String FIND_BUGS_FILTER - private static final java.lang.String PROJECT - private static final java.lang.String BUG_COLLECTION -edu.umd.cs.findbugs.SourceLineAnnotation: - private static final long serialVersionUID - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.StackMapAnalyzer: - static final boolean DEBUG -edu.umd.cs.findbugs.StringAnnotation: - private static final long serialVersionUID - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.StringAnnotation$QuotedStringMarker -edu.umd.cs.findbugs.TextUIBugReporter: - static final java.lang.String OTHER_CATEGORY_ABBREV -edu.umd.cs.findbugs.TextUICommandLine: - private static final int PRINTING_REPORTER - private static final int SORTING_REPORTER - private static final int XML_REPORTER - private static final int EMACS_REPORTER - private static final int HTML_REPORTER - private static final int XDOCS_REPORTER -edu.umd.cs.findbugs.TypeAnnotation: - private static final long serialVersionUID - private static final java.lang.String ELEMENT_NAME -edu.umd.cs.findbugs.XDocsBugReporter: - private static final java.lang.String ROOT_ELEMENT_NAME - private static final java.lang.String PROJECT_ELEMENT_NAME - private static final java.lang.String ERRORS_ELEMENT_NAME - private static final java.lang.String ANALYSIS_ERROR_ELEMENT_NAME - private static final java.lang.String MISSING_CLASS_ELEMENT_NAME - private static final java.lang.String SUMMARY_HTML_ELEMENT_NAME - private static final java.lang.String ELEMENT_NAME - private static final java.lang.String FILE_ELEMENT_NAME -edu.umd.cs.findbugs.annotations.package-info -edu.umd.cs.findbugs.anttask.FindBugsViewerTask: - private static final long DEFAULT_TIMEOUT -edu.umd.cs.findbugs.ba.AbstractClassMember: - 174:175:void markAsResolved() -edu.umd.cs.findbugs.ba.AnalysisException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.BlockType: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.CFGBuilderException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.DataflowAnalysisException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.Frame: - private static final int DEFAULT_STACK_CAPACITY -edu.umd.cs.findbugs.ba.Hierarchy2: - 276:276:static edu.umd.cs.findbugs.ba.XClass getXClass(java.lang.String) -edu.umd.cs.findbugs.ba.InvalidBytecodeException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.LockSet: - private static final int INVALID - private static final int DEFAULT_CAPACITY -edu.umd.cs.findbugs.ba.MethodUnprofitableException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.MissingClassException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.Path: - private static final int DEFAULT_CAPACITY - private static final int INVALID_HASH_CODE - private static final java.lang.String SYMBOLS -edu.umd.cs.findbugs.ba.SourceFile: - private static final int DEFAULT_SIZE -edu.umd.cs.findbugs.ba.SourceFinder: - private static final int CACHE_SIZE - 248:277:edu.umd.cs.findbugs.ba.SourceFinder$SourceRepository makeJarURLConnectionSourceRepository(java.lang.String) -edu.umd.cs.findbugs.ba.SourceFinder$2 -edu.umd.cs.findbugs.ba.SourceFinder$Cache: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.URLClassPath: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.URLClassPathRepository: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.bcp.PatternMatcher$State: - 249:249:public edu.umd.cs.findbugs.ba.bcp.PatternElementMatch getCurrentMatch() -edu.umd.cs.findbugs.ba.bcp.package-info -edu.umd.cs.findbugs.ba.ca.package-info -edu.umd.cs.findbugs.ba.ch.ClassVertex: - private static final int FINISHED - private static final int APPLICATION_CLASS - private static final int INTERFACE -edu.umd.cs.findbugs.ba.ch.package-info -edu.umd.cs.findbugs.ba.constant.package-info -edu.umd.cs.findbugs.ba.deref.package-info -edu.umd.cs.findbugs.ba.generic.package-info -edu.umd.cs.findbugs.ba.heap.package-info -edu.umd.cs.findbugs.ba.interproc.PropertyDatabaseFormatException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.interproc.package-info -edu.umd.cs.findbugs.ba.jsr305.BackwardTypeQualifierDataflowAnalysis: - private static final boolean PRUNE_CONFLICTING_VALUES -edu.umd.cs.findbugs.ba.jsr305.FlowValue$Bits -edu.umd.cs.findbugs.ba.jsr305.TypeQualifierApplications: - static final boolean CHECK_EXCLUSIVE - static final boolean CHECK_EXHAUSTIVE -edu.umd.cs.findbugs.ba.jsr305.package-info -edu.umd.cs.findbugs.ba.npe.IsNullValue: - private static final int NULL - private static final int CHECKED_NULL - private static final int NN - private static final int CHECKED_NN - private static final int NO_KABOOM_NN - private static final int NSP - private static final int NN_UNKNOWN - private static final int NCP2 - private static final int NCP3 - private static final int FLAG_SHIFT - private static final int EXCEPTION - private static final int PARAM - private static final int RETURN_VAL - private static final int FIELD_VAL - private static final int READLINE_VAL - private static final int FLAG_MASK -edu.umd.cs.findbugs.ba.npe.IsNullValueFrame$PointerEqualityInfo -edu.umd.cs.findbugs.ba.npe.NullDerefAndRedundantComparisonFinder: - private static final boolean MY_DEBUG -edu.umd.cs.findbugs.ba.npe.ReturnPathType: - private static final int CAN_RETURN_NORMALLY - private static final int CANNOT_RETURN_NORMALLY - private static final int TOP -edu.umd.cs.findbugs.ba.npe.package-info -edu.umd.cs.findbugs.ba.obl.NonexistentObligationException: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.obl.ObligationSet: - private static final int INVALID_HASH_CODE -edu.umd.cs.findbugs.ba.obl.package-info -edu.umd.cs.findbugs.ba.package-info -edu.umd.cs.findbugs.ba.type.BottomType: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.DoubleExtraType: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.ExceptionObjectType: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.ExceptionSet: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.ExceptionSetFactory: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.LongExtraType: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.NullType: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.TopType: - private static final long serialVersionUID -edu.umd.cs.findbugs.ba.type.package-info -edu.umd.cs.findbugs.ba.vna.ValueNumber: - 114:117:private ValueNumber(int) -edu.umd.cs.findbugs.ba.vna.ValueNumberFrame: - private static final boolean USE_WRITTEN_OUTSIDE_OF_CONSTRUCTOR -edu.umd.cs.findbugs.ba.vna.package-info -edu.umd.cs.findbugs.bcel.BCELUtil: - private static final int JDK15_MAJOR - private static final int JDK15_MINOR -edu.umd.cs.findbugs.bcel.generic.package-info -edu.umd.cs.findbugs.bcel.package-info -edu.umd.cs.findbugs.charsets.UTF8: - private static final java.lang.String UTF_8 -edu.umd.cs.findbugs.classfile.ClassDescriptor: - private static final long serialVersionUID -edu.umd.cs.findbugs.classfile.analysis.package-info -edu.umd.cs.findbugs.classfile.engine.ClassParser$FieldOrMethodDescriptorCreator -edu.umd.cs.findbugs.classfile.engine.asm.package-info -edu.umd.cs.findbugs.classfile.engine.bcel.package-info -edu.umd.cs.findbugs.classfile.engine.package-info -edu.umd.cs.findbugs.classfile.impl.AnalysisCache: - private static final int MAX_JAVACLASS_RESULTS_TO_CACHE - private static final int MAX_FBCLASSREADER_RESULTS_TO_CACHE - private static final int MAX_CONSTANT_POOL_GEN_RESULTS_TO_CACHE - private static final int MAX_CLASS_RESULTS_TO_CACHE - 311:311:java.lang.String hex(java.lang.Object) -edu.umd.cs.findbugs.classfile.impl.ClassPathBuilder$DiscoveredCodeBase: - 132:132:public java.util.LinkedList getResourceList() -edu.umd.cs.findbugs.classfile.impl.ZipInputStreamCodeBase: - static final boolean DEBUG -edu.umd.cs.findbugs.classfile.impl.package-info -edu.umd.cs.findbugs.classfile.package-info -edu.umd.cs.findbugs.cloud.CloudFactory: - private static final java.lang.String FINDBUGS_NAMELOOKUP_CLASSNAME - private static final java.lang.String FINDBUGS_NAMELOOKUP_REQUIRED -edu.umd.cs.findbugs.cloud.username.WebCloudNameLookup: - private static final java.lang.String APPENGINE_HOST_PROPERTY_NAME - private static final java.lang.String KEY_SAVE_SESSION_INFO - static final java.lang.String KEY_APPENGINECLOUD_SESSION_ID - private static final java.lang.String SYSPROP_NEVER_SAVE_SESSION - private static final int USER_SIGNIN_TIMEOUT_SECS -edu.umd.cs.findbugs.config.CommandLine: - private static final java.lang.String SPACES -edu.umd.cs.findbugs.config.ProjectFilterSettings: - private static final char FIELD_DELIMITER - private static final java.lang.String LISTITEM_DELIMITER - private static final int DEFAULT_MIN_RANK -edu.umd.cs.findbugs.config.UserPreferences: - private static final char BOOL_SEPARATOR - private static final java.lang.String PREF_FILE_NAME - private static final int MAX_RECENT_FILES - private static final java.lang.String CLOUD_ID_KEY - private static final java.lang.String DETECTOR_THRESHOLD_KEY - private static final java.lang.String FILTER_SETTINGS_KEY - private static final java.lang.String FILTER_SETTINGS2_KEY - private static final java.lang.String RUN_AT_FULL_BUILD - private static final java.lang.String EFFORT_KEY -edu.umd.cs.findbugs.detect.AtomicityProblem: - static final boolean DEBUG -edu.umd.cs.findbugs.detect.BadResultSetAccess$1: - static final long serialVersionUID -edu.umd.cs.findbugs.detect.BuildCheckReturnAnnotationDatabase: - private static final java.lang.String DEFAULT_ANNOTATION_ANNOTATION_CLASS -edu.umd.cs.findbugs.detect.DefaultEncodingDetector$DefaultEncodingAnnotation: - 57:57:public static edu.umd.cs.findbugs.detect.DefaultEncodingDetector$DefaultEncodingAnnotation[] values() -edu.umd.cs.findbugs.detect.DontIgnoreResultOfPutIfAbsent: - static final boolean countOtherCalls - static final boolean DEBUG -edu.umd.cs.findbugs.detect.DroppedException: - private static final int START - private static final int CATCH - private static final int OPEN_PAREN - private static final int CLOSE_PAREN - private static final int OPEN_BRACE - private static final int NUM_CONTEXT_LINES - private static final int MAX_LINES -edu.umd.cs.findbugs.detect.DumbMethods: - private static final int OOM_CATCH_LEN - private static final int MICROS_PER_DAY_OVERFLOWED_AS_INT -edu.umd.cs.findbugs.detect.FindDeadLocalStores: - private static final java.lang.String FINDBUGS_EXCLUDED_LOCALS_PROP_NAME -edu.umd.cs.findbugs.detect.FindDoubleCheck: - static final boolean DEBUG -edu.umd.cs.findbugs.detect.FindFloatEquality: - private static final int SAW_NOTHING - private static final int SAW_COMP -edu.umd.cs.findbugs.detect.FindHEmismatch: - 494:500:org.apache.bcel.classfile.Method findMethod(org.apache.bcel.classfile.JavaClass,java.lang.String,java.lang.String) -edu.umd.cs.findbugs.detect.FindInconsistentSync2: - private static final boolean SYNC_ACCESS - private static final int UNLOCKED - private static final int LOCKED - private static final int READ - private static final int WRITE - private static final int NULLCHECK - private static final int READ_UNLOCKED - private static final int WRITE_UNLOCKED - private static final int NULLCHECK_UNLOCKED - private static final int READ_LOCKED - private static final int WRITE_LOCKED - private static final int NULLCHECK_LOCKED -edu.umd.cs.findbugs.detect.FindJSR166LockMonitorenter: - private static final java.lang.String UTIL_CONCURRRENT_SIG_PREFIX -edu.umd.cs.findbugs.detect.FindNonSerializableStoreIntoSession: - private static final boolean DEBUG -edu.umd.cs.findbugs.detect.FindNonSerializableValuePassedToWriteObject: - private static final boolean DEBUG -edu.umd.cs.findbugs.detect.FindNullDeref: - 1306:1326:edu.umd.cs.findbugs.BugAnnotation getVariableAnnotation(edu.umd.cs.findbugs.ba.Location) -edu.umd.cs.findbugs.detect.FindRefComparison: - private static final boolean REPORT_ALL_REF_COMPARISONS - private static final byte T_DYNAMIC_STRING - private static final byte T_STATIC_STRING - private static final byte T_PARAMETER_STRING - private static final java.lang.String STRING_SIGNATURE -edu.umd.cs.findbugs.detect.FindRefComparison$DynamicStringType: - private static final long serialVersionUID -edu.umd.cs.findbugs.detect.FindRefComparison$EmptyStringType: - private static final long serialVersionUID -edu.umd.cs.findbugs.detect.FindRefComparison$FinalConstant: - private static final long serialVersionUID -edu.umd.cs.findbugs.detect.FindRefComparison$ParameterStringType: - private static final long serialVersionUID -edu.umd.cs.findbugs.detect.FindRefComparison$StaticStringType: - private static final long serialVersionUID -edu.umd.cs.findbugs.detect.FindUnrelatedTypesInGenericContainer: - 858:897:private boolean compareTypesOld(org.apache.bcel.generic.Type,org.apache.bcel.generic.Type) -edu.umd.cs.findbugs.detect.FindUnsyncGet: - static final int doNotConsider -edu.umd.cs.findbugs.detect.FindUseOfNonSerializableValue: - private static final boolean DEBUG -edu.umd.cs.findbugs.detect.HugeSharedStringConstants: - private static final int SIZE_OF_HUGE_CONSTANT -edu.umd.cs.findbugs.detect.InefficientToArray: - static final int SEEN_NOTHING - static final int SEEN_ICONST_0 - static final int SEEN_ANEWARRAY -edu.umd.cs.findbugs.detect.InfiniteLoop: - static final boolean DEBUG -edu.umd.cs.findbugs.detect.InvalidJUnitTest: - private static final int SEEN_NOTHING - private static final int SEEN_ALOAD_0 -edu.umd.cs.findbugs.detect.MethodReturnCheck: - private static final int SCAN - private static final int SAW_INVOKE -edu.umd.cs.findbugs.detect.MultithreadedInstanceAccess: - private static final java.lang.String STRUTS_ACTION_NAME - private static final java.lang.String SERVLET_NAME -edu.umd.cs.findbugs.detect.Noise$HashQueue: - 60:64:public void reset() -edu.umd.cs.findbugs.detect.NoiseNullDeref: - 438:449:java.lang.String getDescription(edu.umd.cs.findbugs.ba.Location,edu.umd.cs.findbugs.ba.vna.ValueNumber) -edu.umd.cs.findbugs.detect.NoiseNullDeref$CheckCallSitesAndReturnInstructions -edu.umd.cs.findbugs.detect.NoteJCIPAnnotation: - private static final java.lang.String NET_JCIP_ANNOTATIONS - private static final java.lang.String JSR305_CONCURRENT_ANNOTATIONS -edu.umd.cs.findbugs.detect.OverridingEqualsNotSymmetrical: - private static final java.lang.String EQUALS_NAME - private static final java.lang.String EQUALS_SIGNATURE - private static final java.lang.String STATIC_EQUALS_SIGNATURE -edu.umd.cs.findbugs.detect.PublicSemaphores: - private static final int SEEN_NOTHING - private static final int SEEN_ALOAD_0 -edu.umd.cs.findbugs.detect.StaticCalendarDetector: - private static final java.lang.String PROP_SKIP_SYNCHRONIZED_CHECK -edu.umd.cs.findbugs.detect.StringConcatenation: - static final int SEEN_NOTHING - static final int SEEN_NEW - static final int SEEN_APPEND1 - static final int SEEN_APPEND2 - static final int CONSTRUCTED_STRING_ON_STACK - static final int POSSIBLE_CASE -edu.umd.cs.findbugs.detect.SuperfluousInstanceOf: - private static final int SEEN_NOTHING - private static final int SEEN_ALOAD -edu.umd.cs.findbugs.detect.UnnecessaryMath: - static final int SEEN_NOTHING - static final int SEEN_DCONST -edu.umd.cs.findbugs.detect.UnreadFields: - static final int DO_NOT_CONSIDER -edu.umd.cs.findbugs.detect.WrongMapIterator: - private static final int SAW_NOTHING - private static final int SAW_MAP_LOAD1 - private static final int SAW_KEYSET - private static final int SAW_KEYSET_STORE - private static final int SAW_ITERATOR - private static final int SAW_ITERATOR_STORE - private static final int SAW_ITERATOR_LOAD - private static final int SAW_NEXT - private static final int SAW_CHECKCAST_ON_NEXT - private static final int SAW_KEY_STORE - private static final int NEED_KEYSET_LOAD - private static final int SAW_MAP_LOAD2 - private static final int SAW_KEY_LOAD -edu.umd.cs.findbugs.detect.XMLFactoryBypass$1: - static final long serialVersionUID -edu.umd.cs.findbugs.filter.FilterException: - private static final long serialVersionUID -edu.umd.cs.findbugs.filter.RelationalOp: - 59:60:private RelationalOp(java.lang.String) -edu.umd.cs.findbugs.graph.VisitationTimeComparator: - private static final long serialVersionUID -edu.umd.cs.findbugs.gui2.AboutDialog: - private static final long serialVersionUID -edu.umd.cs.findbugs.gui2.BugAspects: - private static final long serialVersionUID -edu.umd.cs.findbugs.gui2.BugTreeModel: - private static final boolean DEBUG -edu.umd.cs.findbugs.gui2.CompoundMatcher: - private static final long serialVersionUID -edu.umd.cs.findbugs.gui2.FilterMatcher: - private static final long serialVersionUID -edu.umd.cs.findbugs.gui2.GUISaveState: - private static final java.lang.String SORTERTABLELENGTH - private static final java.lang.String PREVCOMMENTSSIZE - private static final java.lang.String DOCKINGLAYOUT - private static final java.lang.String FRAME_BOUNDS - private static final java.lang.String EXTENDED_WINDOW_STATE - private static final int MAXNUMRECENTPROJECTS - private static final int MAXNUMPREVCOMMENTS - private static final java.lang.String NUMPROJECTS - private static final java.lang.String STARTERDIRECTORY - private static final java.lang.String SPLIT_MAIN - private static final java.lang.String SPLIT_TREE_COMMENTS - private static final java.lang.String SPLIT_TOP - private static final java.lang.String SPLIT_SUMMARY_NEW - private static final java.lang.String TAB_SIZE - private static final java.lang.String FONT_SIZE - private static final java.lang.String PACKAGE_PREFIX_SEGEMENTS - private static final java.lang.String ENABLED_PLUGINS - private static final java.lang.String DISABLED_PLUGINS - private static final java.lang.String CUSTOM_PLUGINS -edu.umd.cs.findbugs.gui2.MainFrame: - private static final int SEARCH_TEXT_FIELD_SIZE - private static final java.lang.String WINDOW_MODIFIED -edu.umd.cs.findbugs.gui2.MainFrameTree$MyTreeExpansionListener -edu.umd.cs.findbugs.gui2.MainFrameTree$MyTreeExpansionListener$1 -edu.umd.cs.findbugs.gui2.NewProjectWizard: - private int currentPanel -edu.umd.cs.findbugs.gui2.PluginUpdateDialog: - private static final int SOFTWARE_UPDATE_DIALOG_DELAY_MS -edu.umd.cs.findbugs.gui2.PreferencesFrame: - private static final int TAB_MIN - private static final int TAB_MAX - private static final int FONT_MIN - private static final int FONT_MAX -edu.umd.cs.findbugs.gui2.PreferencesFrame$PluginWithDescription -edu.umd.cs.findbugs.gui2.ProjectSettings: - private static final long serialVersionUID - 196:196:java.util.ArrayList getAllFilters() -edu.umd.cs.findbugs.gui2.RecentMenu$LimitedArrayList: - public static final int MAX_ENTRIES -edu.umd.cs.findbugs.gui2.SourceDirectoryWizard: - private static final int MIN_STEP - private static final int MAX_STEP -edu.umd.cs.findbugs.gui2.StackedFilterMatcher: - private static final long serialVersionUID -edu.umd.cs.findbugs.gui2.SuppressionMatcher: - private static final long serialVersionUID -edu.umd.cs.findbugs.gui2.ViewFilter: - static final int NO_MATTER_WHEN_FIRST_SEEN -edu.umd.cs.findbugs.gui2.ViewFilter$ViewFilterEnum -edu.umd.cs.findbugs.internalAnnotations.SlashedClassName$Checker: - static final java.lang.String simpleName - static final java.lang.String slashedClassName -edu.umd.cs.findbugs.jaif.JAIFScanner: - private static final java.lang.String ID_START - private static final java.lang.String ID_REST - private static final java.lang.String DIGIT - private static final java.lang.String DIGITS - private static final java.lang.String DIGITS_OPT - private static final java.lang.String SIGN_OPT - private static final java.lang.String DOT - private static final java.lang.String EXP_PART - private static final java.lang.String EXP_PART_OPT - private static final java.lang.String FLOAT_TYPE_SUFFIX - private static final java.lang.String FLOAT_TYPE_SUFFIX_OPT - private static final java.lang.String OCTAL_DIGITS - private static final java.lang.String HEX_SIGNIFIER - private static final java.lang.String HEX_DIGITS - private static final java.lang.String INT_TYPE_SUFFIX_OPT - private static final java.lang.String INPUT_CHAR - private static final java.lang.String OCT_ESCAPE - private static final java.lang.String ESCAPE_SEQ - private static final java.lang.String STRING_CHARS_OPT -edu.umd.cs.findbugs.model.IdentityClassNameRewriter: - private static final long serialVersionUID -edu.umd.cs.findbugs.plan.OrderingConstraintException: - private static final long serialVersionUID -edu.umd.cs.findbugs.sourceViewer.NumberedParagraphView: - 85:95:public int getPreviousLineCount0() -edu.umd.cs.findbugs.updates.UpdateChecker: - private static final java.lang.String KEY_DISABLE_ALL_UPDATE_CHECKS - private static final java.lang.String KEY_REDIRECT_ALL_UPDATE_CHECKS - static final long DONT_REMIND_WINDOW -edu.umd.cs.findbugs.util.EditDistance: - private static final int INSERT_OR_DELETE_COST -edu.umd.cs.findbugs.util.FractionalMultiset$IncreasingOrderEntryComparator -edu.umd.cs.findbugs.util.MapCache: - private static final long serialVersionUID -edu.umd.cs.findbugs.util.Strings: - private static final int xmlAllowedLowCharacterBound - private static final java.lang.String unicodeUnescapeMatchExpression -edu.umd.cs.findbugs.util.TopologicalSort$Worker -edu.umd.cs.findbugs.util.Util: - static final float DEFAULT_LOAD_FACTOR -edu.umd.cs.findbugs.util.Util$ShutdownLogging: - 176:176:Util$ShutdownLogging() -edu.umd.cs.findbugs.util.WriteOnceProperties: - private static final long serialVersionUID -edu.umd.cs.findbugs.util.WriteOnceProperties$PropertyReadAt: - private static final long serialVersionUID -edu.umd.cs.findbugs.visitclass.DismantleBytecode: - private static final int INVALID_OFFSET - private static final java.lang.String NOT_AVAILABLE -edu.umd.cs.findbugs.visitclass.PrintClass$ZipEntryComparator: - private static final long serialVersionUID -edu.umd.cs.findbugs.workflow.BackdateHistoryUsingSource: - private static final java.lang.String USAGE -edu.umd.cs.findbugs.workflow.CloudReport: - private static final java.lang.String USAGE -edu.umd.cs.findbugs.workflow.CopyBuggySource: - private static final java.lang.String USAGE -edu.umd.cs.findbugs.workflow.CountByPackagePrefix: - private static final java.lang.String USAGE -edu.umd.cs.findbugs.workflow.Filter$FilterCommandLine: - public static final long MILLISECONDS_PER_DAY -edu.umd.cs.findbugs.workflow.MineBugHistory: - private static final int WIDTH - static final int ADDED - static final int NEWCODE - static final int REMOVED - static final int REMOVEDCODE - static final int RETAINED - static final int DEAD - static final int ACTIVE_NOW - static final int TUPLE_SIZE -edu.umd.cs.findbugs.workflow.RejarClassesForAnalysis$RejarClassesForAnalysisCommandLine$PrefixMatcher: - 110:115:public boolean matchesEverything() -edu.umd.cs.findbugs.workflow.SetBugDatabaseInfo: - private static final java.lang.String USAGE -edu.umd.cs.findbugs.xml.OutputStreamXMLOutput: - private static final java.lang.String OPENING -fi.iki.elonen.NanoHTTPD: - private static final java.lang.String CONTENT_DISPOSITION_REGEX - private static final java.lang.String CONTENT_TYPE_REGEX - private static final java.lang.String CONTENT_DISPOSITION_ATTRIBUTE_REGEX - private static final java.lang.String QUERY_STRING_PARAMETER -fi.iki.elonen.NanoHTTPD$ResponseException: - private static final long serialVersionUID -freemarker.cache.FileTemplateLoader: - private static final int CASE_CHECH_CACHE_HARD_SIZE - private static final int CASE_CHECK_CACHE__SOFT_SIZE -freemarker.cache.TemplateCache: - private static final java.lang.String ASTERISKSTR - private static final char ASTERISK - private static final char SLASH - private static final java.lang.String LOCALE_PART_SEPARATOR -freemarker.cache.TemplateCache$CachedTemplate: - private static final long serialVersionUID -freemarker.cache.TemplateLoaderUtils: - 26:28:private TemplateLoaderUtils() -freemarker.core.AliasTargetTemplateValueFormatException: - 33:34:public AliasTargetTemplateValueFormatException(java.lang.String) -freemarker.core.ArithmeticEngine$ConservativeEngine: - private static final int INTEGER - private static final int LONG - private static final int FLOAT - private static final int DOUBLE - private static final int BIGINTEGER - private static final int BIGDECIMAL -freemarker.core.ArithmeticExpression: - static final int TYPE_SUBSTRACTION - static final int TYPE_MULTIPLICATION - static final int TYPE_DIVISION - static final int TYPE_MODULO -freemarker.core.Assignment: - private static final int OPERATOR_TYPE_EQUALS - private static final int OPERATOR_TYPE_PLUS_EQUALS - private static final int OPERATOR_TYPE_PLUS_PLUS - private static final int OPERATOR_TYPE_MINUS_MINUS - static final int NAMESPACE - static final int LOCAL - static final int GLOBAL -freemarker.core.BodyInstruction: - 45:45:java.util.List getBodyParameters() -freemarker.core.BooleanLiteral: - 34:34:static freemarker.template.TemplateBooleanModel getTemplateModel(boolean) -freemarker.core.BugException: - private static final java.lang.String COMMON_MESSAGE -freemarker.core.BuiltIn: - static final int NUMBER_OF_BIS -freemarker.core.BuiltInsForDates: - 179:179:private BuiltInsForDates() -freemarker.core.BuiltInsForDates$dateType_if_unknownBI: - 70:70:protected freemarker.template.TemplateModel calculateResult(java.util.Date,int,freemarker.core.Environment) -freemarker.core.BuiltInsForExistenceHandling: - 36:36:private BuiltInsForExistenceHandling() -freemarker.core.BuiltInsForHashes: - 56:56:private BuiltInsForHashes() -freemarker.core.BuiltInsForLoopVariables: - 33:33:BuiltInsForLoopVariables() -freemarker.core.BuiltInsForMarkupOutputs: - 29:29:BuiltInsForMarkupOutputs() -freemarker.core.BuiltInsForMultipleTypes: - 720:720:private BuiltInsForMultipleTypes() -freemarker.core.BuiltInsForNodes: - 117:117:private BuiltInsForNodes() -freemarker.core.BuiltInsForNumbers: - 318:318:private BuiltInsForNumbers() -freemarker.core.BuiltInsForOutputFormatRelated: - 24:24:BuiltInsForOutputFormatRelated() -freemarker.core.BuiltInsForSequences: - 956:956:private BuiltInsForSequences() -freemarker.core.BuiltInsForSequences$sortBI: - static final int KEY_TYPE_NOT_YET_DETECTED - static final int KEY_TYPE_STRING - static final int KEY_TYPE_NUMBER - static final int KEY_TYPE_DATE - static final int KEY_TYPE_BOOLEAN -freemarker.core.BuiltInsForStringsBasic: - 682:682:private BuiltInsForStringsBasic() -freemarker.core.BuiltInsForStringsEncoding: - 149:149:private BuiltInsForStringsEncoding() -freemarker.core.BuiltInsForStringsMisc: - 170:170:private BuiltInsForStringsMisc() -freemarker.core.BuiltInsForStringsRegexp: - 305:305:private BuiltInsForStringsRegexp() -freemarker.core.BuiltInsWithParseTimeParameters: - 85:87:private BuiltInsWithParseTimeParameters() -freemarker.core.BuiltinVariable: - static final java.lang.String TEMPLATE_NAME_CC - static final java.lang.String TEMPLATE_NAME - static final java.lang.String MAIN_TEMPLATE_NAME_CC - static final java.lang.String MAIN_TEMPLATE_NAME - static final java.lang.String CURRENT_TEMPLATE_NAME_CC - static final java.lang.String CURRENT_TEMPLATE_NAME - static final java.lang.String NAMESPACE - static final java.lang.String MAIN - static final java.lang.String GLOBALS - static final java.lang.String LOCALS - static final java.lang.String DATA_MODEL_CC - static final java.lang.String DATA_MODEL - static final java.lang.String LANG - static final java.lang.String LOCALE - static final java.lang.String LOCALE_OBJECT_CC - static final java.lang.String LOCALE_OBJECT - static final java.lang.String CURRENT_NODE_CC - static final java.lang.String CURRENT_NODE - static final java.lang.String NODE - static final java.lang.String PASS - static final java.lang.String VARS - static final java.lang.String VERSION - static final java.lang.String INCOMPATIBLE_IMPROVEMENTS_CC - static final java.lang.String INCOMPATIBLE_IMPROVEMENTS - static final java.lang.String ERROR - static final java.lang.String OUTPUT_ENCODING_CC - static final java.lang.String OUTPUT_ENCODING - static final java.lang.String OUTPUT_FORMAT_CC - static final java.lang.String OUTPUT_FORMAT - static final java.lang.String AUTO_ESC_CC - static final java.lang.String AUTO_ESC - static final java.lang.String URL_ESCAPING_CHARSET_CC - static final java.lang.String URL_ESCAPING_CHARSET - static final java.lang.String NOW - static final java.lang.String GET_OPTIONAL_TEMPLATE - static final java.lang.String GET_OPTIONAL_TEMPLATE_CC - static final java.lang.String CALLER_TEMPLATE_NAME - static final java.lang.String CALLER_TEMPLATE_NAME_CC -freemarker.core.Case: - static final int TYPE_CASE - static final int TYPE_DEFAULT -freemarker.core.ConditionalBlock: - static final int TYPE_IF - static final int TYPE_ELSE - static final int TYPE_ELSE_IF -freemarker.core.Configurable: - static final java.lang.String C_TRUE_FALSE - private static final java.lang.String NULL - private static final java.lang.String DEFAULT - private static final java.lang.String DEFAULT_2_3_0 - private static final java.lang.String JVM_DEFAULT - private static final java.lang.String ALLOWED_CLASSES_SNAKE_CASE - private static final java.lang.String TRUSTED_TEMPLATES_SNAKE_CASE - private static final java.lang.String ALLOWED_CLASSES_CAMEL_CASE - private static final java.lang.String TRUSTED_TEMPLATES_CAMEL_CASE -freemarker.core.Environment: - private static final int CACHED_TDFS_ZONELESS_INPUT_OFFS - private static final int CACHED_TDFS_SQL_D_T_TZ_OFFS - private static final int CACHED_TDFS_LENGTH - private static final int TERSE_MODE_INSTRUCTION_STACK_TRACE_LIMIT - 401:401:private freemarker.core.TemplateElement replaceTopElement(freemarker.core.TemplateElement) - 1436:1437:void clearLastReturnValue() - 2798:2805:java.lang.String renderElementToString(freemarker.core.TemplateElement) -freemarker.core.EvalUtil: - static final int CMP_OP_EQUALS - static final int CMP_OP_NOT_EQUALS - static final int CMP_OP_LESS_THAN - static final int CMP_OP_GREATER_THAN - static final int CMP_OP_LESS_THAN_EQUALS - static final int CMP_OP_GREATER_THAN_EQUALS - private static final java.lang.String VALUE_OF_THE_COMPARISON_IS_UNKNOWN_DATE_LIKE - 51:51:private EvalUtil() -freemarker.core.Expression: - 108:108:java.lang.String evalAndCoerceToPlainText(freemarker.core.Environment,java.lang.String) - 112:112:java.lang.Object evalAndCoerceToStringOrMarkup(freemarker.core.Environment) - 119:119:java.lang.Object evalAndCoerceToStringOrMarkup(freemarker.core.Environment,java.lang.String) - 170:170:boolean modelToBoolean(freemarker.template.TemplateModel,freemarker.template.Configuration) -freemarker.core.ExtendedDecimalFormatParser: - private static final java.lang.String PARAM_ROUNDING_MODE - private static final java.lang.String PARAM_MULTIPIER - private static final java.lang.String PARAM_DECIMAL_SEPARATOR - private static final java.lang.String PARAM_MONETARY_DECIMAL_SEPARATOR - private static final java.lang.String PARAM_GROUP_SEPARATOR - private static final java.lang.String PARAM_EXPONENT_SEPARATOR - private static final java.lang.String PARAM_MINUS_SIGN - private static final java.lang.String PARAM_INFINITY - private static final java.lang.String PARAM_NAN - private static final java.lang.String PARAM_PERCENT - private static final java.lang.String PARAM_PER_MILL - private static final java.lang.String PARAM_ZERO_DIGIT - private static final java.lang.String PARAM_CURRENCY_CODE - private static final java.lang.String PARAM_CURRENCY_SYMBOL - private static final java.lang.String PARAM_VALUE_RND_UP - private static final java.lang.String PARAM_VALUE_RND_DOWN - private static final java.lang.String PARAM_VALUE_RND_CEILING - private static final java.lang.String PARAM_VALUE_RND_FLOOR - private static final java.lang.String PARAM_VALUE_RND_HALF_DOWN - private static final java.lang.String PARAM_VALUE_RND_HALF_EVEN - private static final java.lang.String PARAM_VALUE_RND_HALF_UP - private static final java.lang.String PARAM_VALUE_RND_UNNECESSARY - private static final java.lang.String SNIP_MARK - private static final int MAX_QUOTATION_LENGTH -freemarker.core.FMParser: - private static final int ITERATOR_BLOCK_KIND_LIST - private static final int ITERATOR_BLOCK_KIND_FOREACH - private static final int ITERATOR_BLOCK_KIND_ITEMS - private static final int ITERATOR_BLOCK_KIND_USER_DIRECTIVE -freemarker.core.FMParserConstants: - public static final int EOF - public static final int BLANK - public static final int START_TAG - public static final int END_TAG - public static final int CLOSE_TAG1 - public static final int CLOSE_TAG2 - public static final int ATTEMPT - public static final int RECOVER - public static final int IF - public static final int ELSE_IF - public static final int LIST - public static final int ITEMS - public static final int SEP - public static final int FOREACH - public static final int SWITCH - public static final int CASE - public static final int ASSIGN - public static final int GLOBALASSIGN - public static final int LOCALASSIGN - public static final int _INCLUDE - public static final int IMPORT - public static final int FUNCTION - public static final int MACRO - public static final int TRANSFORM - public static final int VISIT - public static final int STOP - public static final int RETURN - public static final int CALL - public static final int SETTING - public static final int OUTPUTFORMAT - public static final int AUTOESC - public static final int NOAUTOESC - public static final int COMPRESS - public static final int COMMENT - public static final int TERSE_COMMENT - public static final int NOPARSE - public static final int END_IF - public static final int END_LIST - public static final int END_ITEMS - public static final int END_SEP - public static final int END_RECOVER - public static final int END_ATTEMPT - public static final int END_FOREACH - public static final int END_LOCAL - public static final int END_GLOBAL - public static final int END_ASSIGN - public static final int END_FUNCTION - public static final int END_MACRO - public static final int END_OUTPUTFORMAT - public static final int END_AUTOESC - public static final int END_NOAUTOESC - public static final int END_COMPRESS - public static final int END_TRANSFORM - public static final int END_SWITCH - public static final int ELSE - public static final int BREAK - public static final int CONTINUE - public static final int SIMPLE_RETURN - public static final int HALT - public static final int FLUSH - public static final int TRIM - public static final int LTRIM - public static final int RTRIM - public static final int NOTRIM - public static final int DEFAUL - public static final int SIMPLE_NESTED - public static final int NESTED - public static final int SIMPLE_RECURSE - public static final int RECURSE - public static final int FALLBACK - public static final int ESCAPE - public static final int END_ESCAPE - public static final int NOESCAPE - public static final int END_NOESCAPE - public static final int UNIFIED_CALL - public static final int UNIFIED_CALL_END - public static final int FTL_HEADER - public static final int TRIVIAL_FTL_HEADER - public static final int UNKNOWN_DIRECTIVE - public static final int STATIC_TEXT_WS - public static final int STATIC_TEXT_NON_WS - public static final int STATIC_TEXT_FALSE_ALARM - public static final int DOLLAR_INTERPOLATION_OPENING - public static final int HASH_INTERPOLATION_OPENING - public static final int SQUARE_BRACKET_INTERPOLATION_OPENING - public static final int ESCAPED_CHAR - public static final int STRING_LITERAL - public static final int RAW_STRING - public static final int FALSE - public static final int TRUE - public static final int INTEGER - public static final int DECIMAL - public static final int DOT - public static final int DOT_DOT - public static final int DOT_DOT_LESS - public static final int DOT_DOT_ASTERISK - public static final int BUILT_IN - public static final int EXISTS - public static final int EQUALS - public static final int DOUBLE_EQUALS - public static final int NOT_EQUALS - public static final int PLUS_EQUALS - public static final int MINUS_EQUALS - public static final int TIMES_EQUALS - public static final int DIV_EQUALS - public static final int MOD_EQUALS - public static final int PLUS_PLUS - public static final int MINUS_MINUS - public static final int LESS_THAN - public static final int LESS_THAN_EQUALS - public static final int ESCAPED_GT - public static final int ESCAPED_GTE - public static final int PLUS - public static final int MINUS - public static final int TIMES - public static final int DOUBLE_STAR - public static final int ELLIPSIS - public static final int DIVIDE - public static final int PERCENT - public static final int AND - public static final int OR - public static final int EXCLAM - public static final int COMMA - public static final int SEMICOLON - public static final int COLON - public static final int OPEN_BRACKET - public static final int CLOSE_BRACKET - public static final int OPEN_PAREN - public static final int CLOSE_PAREN - public static final int OPENING_CURLY_BRACKET - public static final int CLOSING_CURLY_BRACKET - public static final int IN - public static final int AS - public static final int USING - public static final int ID - public static final int OPEN_MISPLACED_INTERPOLATION - public static final int NON_ESCAPED_ID_START_CHAR - public static final int ESCAPED_ID_CHAR - public static final int ID_START_CHAR - public static final int ASCII_DIGIT - public static final int DIRECTIVE_END - public static final int EMPTY_DIRECTIVE_END - public static final int NATURAL_GT - public static final int NATURAL_GTE - public static final int TERMINATING_WHITESPACE - public static final int TERMINATING_EXCLAM - public static final int TERSE_COMMENT_END - public static final int MAYBE_END - public static final int KEEP_GOING - public static final int LONE_LESS_THAN_OR_DASH - public static final int DEFAULT - public static final int NO_DIRECTIVE - public static final int FM_EXPRESSION - public static final int IN_PAREN - public static final int NAMED_PARAMETER_EXPRESSION - public static final int EXPRESSION_COMMENT - public static final int NO_SPACE_EXPRESSION - public static final int NO_PARSE -freemarker.core.FMParserTokenManager: - private static final java.lang.String PLANNED_DIRECTIVE_HINT - 314:314:public void setDebugStream(java.io.PrintStream) - 5731:5734:private final int jjStopStringLiteralDfa_5(int,long,long) - 5738:5738:private final int jjStartNfa_5(int,long,long) - 25:8743:public FMParserTokenManager(freemarker.core.SimpleCharStream,int) - 8696:8698:public void ReInit(freemarker.core.SimpleCharStream,int) -freemarker.core.GetOptionalTemplateMethod: - private static final java.lang.String OPTION_ENCODING - private static final java.lang.String OPTION_PARSE - private static final java.lang.String RESULT_INCLUDE - private static final java.lang.String RESULT_IMPORT - private static final java.lang.String RESULT_EXISTS -freemarker.core.ISOLikeTemplateDateFormat: - private static final java.lang.String XS_LESS_THAN_SECONDS_ACCURACY_ERROR_MESSAGE -freemarker.core.InvalidReferenceException: - private static final java.lang.String TIP_NO_DOLLAR - private static final java.lang.String TIP_LAST_STEP_DOT - private static final java.lang.String TIP_LAST_STEP_SQUARE_BRACKET - private static final java.lang.String TIP_JSP_TAGLIBS -freemarker.core.IteratorBlock: - 88:88:boolean isHashListing() -freemarker.core.IteratorBlock$IterationContext: - private static final java.lang.String LOOP_STATE_HAS_NEXT - private static final java.lang.String LOOP_STATE_INDEX -freemarker.core.JavaTemplateDateFormatFactory: - private static final int LEAK_ALERT_DATE_FORMAT_CACHE_SIZE -freemarker.core.JavaTemplateNumberFormat: - 58:58:public java.text.NumberFormat getJavaNumberFormat() -freemarker.core.JavaTemplateNumberFormatFactory: - private static final int LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE -freemarker.core.Macro: - static final int TYPE_MACRO - static final int TYPE_FUNCTION -freemarker.core.MethodCall: - 106:106:freemarker.template.TemplateModel getConstantValue() -freemarker.core.MiscUtil: - static final java.lang.String C_FALSE - static final java.lang.String C_TRUE - 34:34:private MiscUtil() -freemarker.core.MixedContent: - 46:47:void addElement(int,freemarker.core.TemplateElement) -freemarker.core.NestedContentNotSupportedException: - 55:56:private NestedContentNotSupportedException(java.lang.Exception,freemarker.core.Environment) - 59:60:private NestedContentNotSupportedException(java.lang.String,freemarker.core.Environment) -freemarker.core.NonBooleanException: - 41:42:NonBooleanException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 54:55:NonBooleanException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 59:60:NonBooleanException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonDateException: - 43:44:NonDateException(freemarker.core.Expression,freemarker.template.TemplateModel,freemarker.core.Environment) - 55:56:NonDateException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonExtendedHashException: - 41:42:NonExtendedHashException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 54:55:NonExtendedHashException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 59:60:NonExtendedHashException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonExtendedNodeException: - 43:44:NonExtendedNodeException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 56:57:NonExtendedNodeException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 61:62:NonExtendedNodeException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonHashException: - 43:44:NonHashException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 56:57:NonHashException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 61:62:NonHashException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonMarkupOutputException: - 42:43:NonMarkupOutputException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 55:56:NonMarkupOutputException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 60:61:NonMarkupOutputException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonMethodException: - 43:44:NonMethodException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 56:57:NonMethodException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 61:62:NonMethodException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonNamespaceException: - 34:35:public NonNamespaceException(freemarker.core.Environment) - 38:39:public NonNamespaceException(java.lang.String,freemarker.core.Environment) - 42:43:NonNamespaceException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 55:56:NonNamespaceException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 60:61:NonNamespaceException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonNodeException: - 43:44:NonNodeException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 61:62:NonNodeException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonNumericalException: - 54:55:NonNumericalException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 59:60:NonNumericalException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonSequenceException: - 44:45:NonSequenceException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 57:58:NonSequenceException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) -freemarker.core.NonSequenceOrCollectionException: - private static final java.lang.String ITERABLE_SUPPORT_HINT - 65:66:NonSequenceOrCollectionException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) -freemarker.core.NonStringException: - static final java.lang.String STRING_COERCABLE_TYPES_DESC - private static final java.lang.String DEFAULT_DESCRIPTION - 71:72:NonStringException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonStringOrTemplateOutputException: - static final java.lang.String STRING_COERCABLE_TYPES_OR_TOM_DESC - private static final java.lang.String DEFAULT_DESCRIPTION - 56:57:NonStringOrTemplateOutputException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 74:75:NonStringOrTemplateOutputException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NonUserDefinedDirectiveLikeException: - 38:39:public NonUserDefinedDirectiveLikeException(freemarker.core.Environment) - 42:43:public NonUserDefinedDirectiveLikeException(java.lang.String,freemarker.core.Environment) - 46:47:NonUserDefinedDirectiveLikeException(freemarker.core.Environment,freemarker.core._ErrorDescriptionBuilder) - 59:60:NonUserDefinedDirectiveLikeException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String,freemarker.core.Environment) - 64:65:NonUserDefinedDirectiveLikeException(freemarker.core.Expression,freemarker.template.TemplateModel,java.lang.String[],freemarker.core.Environment) -freemarker.core.NumberLiteral: - 54:54:java.lang.String getName() -freemarker.core.ParameterRole: - 85:85:public java.lang.String getName() -freemarker.core.ParentheticalExpression: - 59:59:freemarker.core.Expression getNestedExpression() -freemarker.core.Range: - static final int END_INCLUSIVE - static final int END_EXCLUSIVE - static final int END_UNBOUND - static final int END_SIZE_LIMITED - 47:47:int getEndType() -freemarker.core.RegexpHelper: - private static final int MAX_FLAG_WARNINGS_LOGGED - static final long RE_FLAG_REGEXP - static final long RE_FLAG_FIRST_ONLY - 63:63:private RegexpHelper() -freemarker.core.SimpleCharStream: - 471:471:boolean getTrackLineColumn() - 472:472:void setTrackLineColumn(boolean) -freemarker.core.TemplateElement: - private static final int INITIAL_REGULATED_CHILD_BUFFER_CAPACITY - 342:342:final int getIndex() -freemarker.core.TemplateElements: - 63:63:freemarker.core.TemplateElement getFirst() - 93:99:freemarker.core.MixedContent asMixedContent() -freemarker.core.TemplateElementsToVisit -freemarker.core.TemplateObject: - static final int RUNTIME_EVAL_LINE_DISPLACEMENT -freemarker.core.TemplatePostProcessor: - public abstract void postProcess(freemarker.template.Template) -freemarker.core.TemplatePostProcessorException: - 32:33:public TemplatePostProcessorException(java.lang.String) -freemarker.core.Token: - private static final long serialVersionUID - public freemarker.core.Token specialToken - 72:72:public java.lang.Object getValue() - 85:86:public Token(int) - 127:127:public static freemarker.core.Token newToken(int) -freemarker.core.TokenMgrError: - static final int LEXICAL_ERROR - static final int STATIC_LEXER_ERROR - static final int INVALID_LEXICAL_STATE - static final int LOOP_DETECTED -freemarker.core.TrimInstruction: - static final int TYPE_T - static final int TYPE_LT - static final int TYPE_RT - static final int TYPE_NT -freemarker.core.UnaryPlusMinusExpression: - private static final int TYPE_MINUS - private static final int TYPE_PLUS -freemarker.core._MessageUtil: - static final java.lang.String UNKNOWN_DATE_TO_STRING_ERROR_MESSAGE - static final java.lang.String UNKNOWN_DATE_PARSING_ERROR_MESSAGE - static final java.lang.String UNKNOWN_DATE_TYPE_ERROR_TIP - static final java.lang.String EMBEDDED_MESSAGE_BEGIN - static final java.lang.String EMBEDDED_MESSAGE_END - 63:63:static java.lang.String formatLocationForSimpleParsingError(freemarker.template.Template,int,int) - 71:71:static java.lang.String formatLocationForDependentParsingError(freemarker.template.Template,int,int) - 75:75:static java.lang.String formatLocationForDependentParsingError(java.lang.String,int,int) - 88:88:static java.lang.String formatLocationForEvaluationError(java.lang.String,int,int) -freemarker.core._ObjectBuilderSettingEvaluator: - private static final java.lang.String INSTANCE_FIELD_NAME - private static final java.lang.String BUILD_METHOD_NAME - private static final java.lang.String BUILDER_CLASS_POSTFIX -freemarker.debug.Breakpoint: - private static final long serialVersionUID -freemarker.debug.EnvironmentSuspendedEvent: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebugModelImpl: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebugModelImpl_Stub: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebuggedEnvironmentImpl: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebuggedEnvironmentImpl_Stub: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebuggerImpl: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebuggerImpl_Stub: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebuggerListenerImpl: - private static final long serialVersionUID -freemarker.debug.impl.RmiDebuggerListenerImpl_Stub: - private static final long serialVersionUID -freemarker.ext.beans.APIModel: - 42:42:protected boolean isMethodsShadowItems() -freemarker.ext.beans.ArgumentTypes: - private static final int CONVERSION_DIFFICULTY_REFLECTION - private static final int CONVERSION_DIFFICULTY_FREEMARKER - private static final int CONVERSION_DIFFICULTY_IMPOSSIBLE -freemarker.ext.beans.ArgumentTypes$SpecialConversionCallableMemberDescriptor: - 692:692:java.lang.String getName() -freemarker.ext.beans.BeansWrapper: - 661:661:freemarker.ext.beans.MethodSorter getMethodSorter() - 665:672:void setMethodSorter(freemarker.ext.beans.MethodSorter) - 1555:1555:freemarker.ext.util.ModelCache getModelCache() -freemarker.ext.beans.BeansWrapperBuilder: - 138:141:static void clearInstanceCache() - 147:147:static java.util.Map getInstanceCache() -freemarker.ext.beans.BeansWrapperConfiguration: - 251:251:freemarker.ext.beans.MethodSorter getMethodSorter() - 255:256:void setMethodSorter(freemarker.ext.beans.MethodSorter) -freemarker.ext.beans.BeansWrapperSingletonHolder: - 23:23:BeansWrapperSingletonHolder() -freemarker.ext.beans.CallableMemberDescriptor: - abstract java.lang.String getName() -freemarker.ext.beans.ClassIntrospector: - private static final java.lang.String JREBEL_SDK_CLASS_NAME - private static final java.lang.String JREBEL_INTEGRATION_ERROR_MSG - 1057:1057:freemarker.ext.beans.MethodSorter getMethodSorter() - 1090:1092:java.lang.Object[] getRegisteredModelFactoriesSnapshot() -freemarker.ext.beans.ClassIntrospectorBuilder: - 151:152:public void setMethodSorter(freemarker.ext.beans.MethodSorter) - 170:173:static void clearInstanceCache() - 177:177:static java.util.Map getInstanceCache() -freemarker.ext.beans.JRebelClassChangeNotifier: - 30:31:static void testAvailability() -freemarker.ext.beans.MemberAndArguments: - 46:46:java.lang.Object[] getArgs() -freemarker.ext.beans.OverloadedNumberUtil: - static final int BIG_MANTISSA_LOSS_PRICE - private static final long MAX_DOUBLE_OR_LONG - private static final long MIN_DOUBLE_OR_LONG - private static final int MAX_DOUBLE_OR_LONG_LOG_2 - private static final int MAX_FLOAT_OR_INT - private static final int MIN_FLOAT_OR_INT - private static final int MAX_FLOAT_OR_INT_LOG_2 - private static final double LOWEST_ABOVE_ZERO - private static final double HIGHEST_BELOW_ONE - 35:35:private OverloadedNumberUtil() -freemarker.ext.beans.OverloadedNumberUtil$BigDecimalSource -freemarker.ext.beans.OverloadedNumberUtil$BigIntegerSource -freemarker.ext.beans.OverloadedNumberUtil$ByteSource -freemarker.ext.beans.OverloadedNumberUtil$DoubleSource -freemarker.ext.beans.OverloadedNumberUtil$FloatSource -freemarker.ext.beans.OverloadedNumberUtil$IntegerSource -freemarker.ext.beans.OverloadedNumberUtil$LongSource -freemarker.ext.beans.OverloadedNumberUtil$ShortSource -freemarker.ext.beans.ReflectionCallableMemberDescriptor: - 92:92:java.lang.String getName() -freemarker.ext.beans.SimpleMethod: - static final java.lang.String MARKUP_OUTPUT_TO_STRING_TIP -freemarker.ext.beans.TypeFlags: - static final int WIDENED_NUMERICAL_UNWRAPPING_HINT - static final int BYTE - static final int SHORT - static final int INTEGER - static final int LONG - static final int FLOAT - static final int DOUBLE - static final int BIG_INTEGER - static final int BIG_DECIMAL - static final int UNKNOWN_NUMERICAL_TYPE - static final int ACCEPTS_NUMBER - static final int ACCEPTS_DATE - static final int ACCEPTS_STRING - static final int ACCEPTS_BOOLEAN - static final int ACCEPTS_MAP - static final int ACCEPTS_LIST - static final int ACCEPTS_SET - static final int ACCEPTS_ARRAY - static final int CHARACTER - static final int ACCEPTS_ANY_OBJECT - static final int MASK_KNOWN_INTEGERS - static final int MASK_KNOWN_NONINTEGERS - static final int MASK_ALL_KNOWN_NUMERICALS - static final int MASK_ALL_NUMERICALS - 33:33:TypeFlags() -freemarker.ext.beans.UnsafeMethods: - private static final java.lang.String UNSAFE_METHODS_PROPERTIES - 37:37:private UnsafeMethods() -freemarker.ext.dom.DocumentTypeModel: - 36:36:public java.lang.String getAsString() - 40:40:public freemarker.template.TemplateSequenceModel getChildren() -freemarker.ext.dom.DomStringUtil: - 32:34:private DomStringUtil() -freemarker.ext.dom.NodeModel: - 607:610:freemarker.ext.dom.NodeModel getDocumentNodeModel() -freemarker.ext.dom.SunInternalXalanXPathSupport: - private static final java.lang.String ERRMSG_RECOMMEND_JAXEN - private static final java.lang.String ERRMSG_EMPTY_NODE_SET -freemarker.ext.dom.XalanXPathSupport: - private static final java.lang.String ERRMSG_EMPTY_NODE_SET -freemarker.ext.jdom.NodeListModel: - private static final int SPECIAL_OPERATION_COPY - private static final int SPECIAL_OPERATION_UNIQUE - private static final int SPECIAL_OPERATION_FILTER_NAME - private static final int SPECIAL_OPERATION_FILTER_TYPE - private static final int SPECIAL_OPERATION_QUERY_TYPE - private static final int SPECIAL_OPERATION_REGISTER_NAMESPACE - private static final int SPECIAL_OPERATION_PLAINTEXT -freemarker.ext.jdom.NodeListModel$NameFilter: - 1058:1058:public boolean isEmpty() -freemarker.ext.jdom.NodeListModel$RegisterNamespace: - 1042:1042:public boolean isEmpty() -freemarker.ext.jdom.NodeListModel$TypeFilter: - 1088:1088:public boolean isEmpty() -freemarker.ext.jsp.CustomTagAndELFunctionCombiner: - 48:48:CustomTagAndELFunctionCombiner() -freemarker.ext.jsp.FreeMarkerJspApplicationContext: - 67:70:public void addELContextListener(javax.el.ELContextListener) - 103:104:public void addELResolver(javax.el.ELResolver) - 107:107:public javax.el.ExpressionFactory getExpressionFactory() - 48:48:static synthetic javax.el.CompositeELResolver access$000(freemarker.ext.jsp.FreeMarkerJspApplicationContext) - 48:48:static synthetic javax.el.ExpressionFactory access$200() -freemarker.ext.jsp.FreeMarkerJspApplicationContext$FreeMarkerELContext: - 131:131:public javax.el.ELResolver getELResolver() - 136:136:public javax.el.FunctionMapper getFunctionMapper() - 141:141:public javax.el.VariableMapper getVariableMapper() - 122:122:static synthetic freemarker.ext.jsp.FreeMarkerPageContext access$100(freemarker.ext.jsp.FreeMarkerJspApplicationContext$FreeMarkerELContext) -freemarker.ext.jsp.FreeMarkerJspApplicationContext$FreeMarkerELContext$1 -freemarker.ext.jsp.FreeMarkerJspFactory21: - 38:49:public javax.servlet.jsp.JspApplicationContext getJspApplicationContext(javax.servlet.ServletContext) -freemarker.ext.jsp.JspContextModel: - public static final int ANY_SCOPE - public static final int PAGE_SCOPE - public static final int REQUEST_SCOPE - public static final int SESSION_SCOPE - public static final int APPLICATION_SCOPE -freemarker.ext.jsp.PageContextFactory: - 31:31:PageContextFactory() -freemarker.ext.jsp.TagTransformModel$TagWriter: - 310:310:javax.servlet.jsp.tagext.Tag getTag() - 314:314:freemarker.ext.jsp.FreeMarkerPageContext getPageContext() -freemarker.ext.jsp.TaglibFactory: - private static final int URL_TYPE_FULL - private static final int URL_TYPE_ABSOLUTE - private static final int URL_TYPE_RELATIVE - private static final java.lang.String META_INF_REL_PATH - private static final java.lang.String META_INF_ABS_PATH - private static final java.lang.String DEFAULT_TLD_RESOURCE_PATH - private static final java.lang.String JAR_URL_ENTRY_PATH_START -freemarker.ext.jsp.TaglibFactory$TldParserForTaglibBuilding: - private static final java.lang.String E_TAG - private static final java.lang.String E_NAME - private static final java.lang.String E_TAG_CLASS - private static final java.lang.String E_TAG_CLASS_LEGACY - private static final java.lang.String E_FUNCTION - private static final java.lang.String E_FUNCTION_CLASS - private static final java.lang.String E_FUNCTION_SIGNATURE - private static final java.lang.String E_LISTENER - private static final java.lang.String E_LISTENER_CLASS -freemarker.ext.jsp.TaglibFactory$TldParserForTaglibUriExtraction: - private static final java.lang.String E_URI -freemarker.ext.jsp.TaglibFactory$WebXmlParser: - private static final java.lang.String E_TAGLIB - private static final java.lang.String E_TAGLIB_LOCATION - private static final java.lang.String E_TAGLIB_URI -freemarker.ext.jsp.TaglibMethodUtil: - 31:33:private TaglibMethodUtil() -freemarker.ext.jython.JythonHashModel: - private static final java.lang.String KEYS - private static final java.lang.String KEYSET - private static final java.lang.String VALUES -freemarker.ext.jython.JythonVersionAdapterHolder: - 32:32:JythonVersionAdapterHolder() -freemarker.ext.servlet.FreemarkerServlet: - private static final java.lang.String INIT_PARAM_DEBUG - private static final java.lang.String DEPR_INITPARAM_TEMPLATE_DELAY - private static final java.lang.String DEPR_INITPARAM_ENCODING - private static final java.lang.String DEPR_INITPARAM_OBJECT_WRAPPER - private static final java.lang.String DEPR_INITPARAM_WRAPPER_SIMPLE - private static final java.lang.String DEPR_INITPARAM_WRAPPER_BEANS - private static final java.lang.String DEPR_INITPARAM_WRAPPER_JYTHON - private static final java.lang.String DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER - private static final java.lang.String DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_RETHROW - private static final java.lang.String DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_DEBUG - private static final java.lang.String DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_HTML_DEBUG - private static final java.lang.String DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_IGNORE - private static final java.lang.String DEPR_INITPARAM_DEBUG - private static final java.lang.String ATTR_REQUEST_MODEL - private static final java.lang.String ATTR_REQUEST_PARAMETERS_MODEL - private static final java.lang.String ATTR_SESSION_MODEL - private static final java.lang.String ATTR_APPLICATION_MODEL - private static final java.lang.String ATTR_JSP_TAGLIBS_MODEL - private static final java.lang.String ATTR_JETTY_CP_TAGLIB_JAR_PATTERNS -freemarker.ext.servlet.HttpSessionHashModel: - private static final long serialVersionUID -freemarker.ext.servlet.InitParamParser: - static final java.lang.String TEMPLATE_PATH_PREFIX_CLASS - static final java.lang.String TEMPLATE_PATH_PREFIX_CLASSPATH - static final java.lang.String TEMPLATE_PATH_PREFIX_FILE - static final java.lang.String TEMPLATE_PATH_SETTINGS_BI_NAME - 52:54:private InitParamParser() -freemarker.ext.util.IdentityHashMap: - private static final int KEYS - private static final int VALUES - private static final int ENTRIES - 788:806:private void writeObject(java.io.ObjectOutputStream) - 815:830:private void readObject(java.io.ObjectInputStream) - 833:833:int capacity() - 837:837:float loadFactor() -freemarker.log.Logger: - private static final int MIN_LIBRARY_ENUM - private static final int MAX_LIBRARY_ENUM - private static final java.lang.String REAL_LOG4J_PRESENCE_CLASS - private static final java.lang.String LOG4J_OVER_SLF4J_TESTER_CLASS -freemarker.template.Configuration: - private static final java.lang.String VERSION_PROPERTIES_PATH - private static final java.lang.String NULL - private static final java.lang.String DEFAULT - private static final java.lang.String JVM_DEFAULT - private static final java.lang.String FM_24_DETECTION_CLASS_NAME -freemarker.template.FalseTemplateBooleanModel: - 32:32:private java.lang.Object readResolve() -freemarker.template.Template: - private static final int READER_BUFFER_SIZE - 307:310:Template(java.lang.String,freemarker.core.TemplateElement,freemarker.template.Configuration) -freemarker.template.Template$WrongEncodingException: - private static final long serialVersionUID -freemarker.template.TemplateException: - private static final java.lang.String FTL_INSTRUCTION_STACK_TRACE_TITLE - 579:586:private void writeObject(java.io.ObjectOutputStream) - 589:591:private void readObject(java.io.ObjectInputStream) -freemarker.template.TemplateExceptionHandler$4: - private static final java.lang.String FONT_RESET_CSS -freemarker.template.TrueTemplateBooleanModel: - 32:32:private java.lang.Object readResolve() -freemarker.template.utility.DateUtil: - private static final java.lang.String REGEX_XS_TIME_ZONE - private static final java.lang.String REGEX_ISO8601_BASIC_TIME_ZONE - private static final java.lang.String REGEX_ISO8601_EXTENDED_TIME_ZONE - private static final java.lang.String REGEX_XS_OPTIONAL_TIME_ZONE - private static final java.lang.String REGEX_ISO8601_BASIC_OPTIONAL_TIME_ZONE - private static final java.lang.String REGEX_ISO8601_EXTENDED_OPTIONAL_TIME_ZONE - private static final java.lang.String REGEX_XS_DATE_BASE - private static final java.lang.String REGEX_ISO8601_BASIC_DATE_BASE - private static final java.lang.String REGEX_ISO8601_EXTENDED_DATE_BASE - private static final java.lang.String REGEX_XS_TIME_BASE - private static final java.lang.String REGEX_ISO8601_BASIC_TIME_BASE - private static final java.lang.String REGEX_ISO8601_EXTENDED_TIME_BASE - private static final java.lang.String MSG_YEAR_0_NOT_ALLOWED -freemarker.template.utility.Execute: - private static final int OUTPUT_BUFFER_SIZE -freemarker.template.utility.StandardCompress: - private static final java.lang.String BUFFER_SIZE_KEY - private static final java.lang.String SINGLE_LINE_KEY -freemarker.template.utility.StandardCompress$StandardCompressWriter: - private static final int MAX_EOL_LENGTH - private static final int AT_BEGINNING - private static final int SINGLE_LINE - private static final int INIT - private static final int SAW_CR - private static final int LINEBREAK_CR - private static final int LINEBREAK_CRLF - private static final int LINEBREAK_LF -freemarker.template.utility.StringUtil: - private static final int NO_ESC - private static final int ESC_HEXA - private static final int ESC_BACKSLASH -javax.xml.bind.ContextFinder: - 41:41:ContextFinder() -javax.xml.bind.Messages: - static final java.lang.String PROVIDER_NOT_FOUND - static final java.lang.String COULD_NOT_INSTANTIATE - static final java.lang.String CANT_FIND_PROPERTIES_FILE - static final java.lang.String CANT_MIX_PROVIDERS - static final java.lang.String MISSING_PROPERTY - static final java.lang.String NAME_VALUE - static final java.lang.String CONVERTER_MUST_NOT_BE_NULL - 24:24:static java.lang.String format(java.lang.String,java.lang.Object,java.lang.Object,java.lang.Object) -javax.xml.bind.helpers.Messages: - static final java.lang.String INPUTSTREAM_NOT_NULL - static final java.lang.String MUST_BE_BOOLEAN - static final java.lang.String MUST_BE_STRING - static final java.lang.String SEVERITY_MESSAGE - static final java.lang.String LOCATION_UNAVAILABLE - static final java.lang.String UNRECOGNIZED_SEVERITY - static final java.lang.String WARNING - static final java.lang.String ERROR - static final java.lang.String FATAL_ERROR - static final java.lang.String ILLEGAL_SEVERITY - static final java.lang.String MUST_NOT_BE_NULL - 20:20:static java.lang.String format(java.lang.String,java.lang.Object,java.lang.Object) -javax.xml.bind.util.Messages: - static final java.lang.String UNRECOGNIZED_SEVERITY - static final java.lang.String RESULT_NULL_CONTEXT - static final java.lang.String RESULT_NULL_UNMARSHALLER - static final java.lang.String SOURCE_NULL_CONTEXT - static final java.lang.String SOURCE_NULL_CONTENT - static final java.lang.String SOURCE_NULL_MARSHALLER - 20:20:static java.lang.String format(java.lang.String,java.lang.Object,java.lang.Object) - 24:24:static java.lang.String format(java.lang.String,java.lang.Object,java.lang.Object,java.lang.Object) -javax.xml.crypto.KeySelectorException: - private static final long serialVersionUID -javax.xml.crypto.MarshalException: - private static final long serialVersionUID -javax.xml.crypto.NoSuchMechanismException: - private static final long serialVersionUID -javax.xml.crypto.URIReferenceException: - private static final long serialVersionUID -javax.xml.crypto.dsig.TransformException: - private static final long serialVersionUID -javax.xml.crypto.dsig.XMLSignatureException: - private static final long serialVersionUID -javax.xml.datatype.DatatypeConfigurationException: - private static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) -javax.xml.datatype.FactoryFinder: - private static final java.lang.String CLASS_NAME - private static final int DEFAULT_LINE_LENGTH -javax.xml.datatype.FactoryFinder$ConfigurationError: - private static final long serialVersionUID -javax.xml.datatype.SecuritySupport: - private SecuritySupport() -javax.xml.namespace.QName: - private static final long defaultSerialVersionUID - private static final long compatabilitySerialVersionUID - private void readObject(java.io.ObjectInputStream) -javax.xml.parsers.DocumentBuilder: - private static final boolean DEBUG -javax.xml.parsers.FactoryFinder: - private static final int DEFAULT_LINE_LENGTH -javax.xml.parsers.FilePathToURI: - FilePathToURI() -javax.xml.parsers.SAXParser: - private static final boolean DEBUG -javax.xml.parsers.SecuritySupport: - private SecuritySupport() -javax.xml.stream.FactoryConfigurationError: - private static final long serialVersionUID -javax.xml.stream.FactoryFinder: - private static final int DEFAULT_LINE_LENGTH -javax.xml.stream.FactoryFinder$ConfigurationError: - private static final long serialVersionUID -javax.xml.stream.SecuritySupport: - private SecuritySupport() -javax.xml.stream.XMLEventFactory: - private static final java.lang.String PROPERTY_NAME - private static final java.lang.String DEFAULT_FACTORY -javax.xml.stream.XMLInputFactory: - private static final java.lang.String PROPERTY_NAME - private static final java.lang.String DEFAULT_FACTORY -javax.xml.stream.XMLOutputFactory: - private static final java.lang.String PROPERTY_NAME - private static final java.lang.String DEFAULT_FACTORY -javax.xml.stream.XMLStreamException: - private static final long serialVersionUID -javax.xml.transform.FactoryFinder: - private static final int DEFAULT_LINE_LENGTH -javax.xml.transform.SecuritySupport: - private SecuritySupport() -javax.xml.transform.TransformerException: - private static final long serialVersionUID -javax.xml.transform.stream.FilePathToURI: - FilePathToURI() -javax.xml.validation.SchemaFactoryFinder: - private static final java.lang.String W3C_XML_SCHEMA10_NS_URI - private static final java.lang.String W3C_XML_SCHEMA11_NS_URI - private static final int DEFAULT_LINE_LENGTH -javax.xml.validation.SecuritySupport: - private SecuritySupport() - static java.io.InputStream getResourceAsStream(java.lang.ClassLoader,java.lang.String) -javax.xml.validation.SecuritySupport$7 -javax.xml.xpath.SecuritySupport: - private SecuritySupport() - static java.io.InputStream getResourceAsStream(java.lang.ClassLoader,java.lang.String) -javax.xml.xpath.SecuritySupport$7 -javax.xml.xpath.XPathException: - private static final long serialVersionUID -javax.xml.xpath.XPathExpressionException: - private static final long serialVersionUID -javax.xml.xpath.XPathFactoryConfigurationException: - private static final long serialVersionUID -javax.xml.xpath.XPathFactoryFinder: - private static final int DEFAULT_LINE_LENGTH -javax.xml.xpath.XPathFunctionException: - private static final long serialVersionUID -net.java.dev.colorchooser.ColorChooserBeanInfo: - private static final int PROPERTY_color - private static final int PROPERTY_continuousPalettePreferred - private static final int PROPERTY_cursor - private static final int PROPERTY_enabled - private static final int PROPERTY_height - private static final int PROPERTY_maximumSize - private static final int PROPERTY_minimumSize - private static final int PROPERTY_name - private static final int PROPERTY_preferredSize - private static final int PROPERTY_toolTipText - private static final int PROPERTY_transientColor - private static final int PROPERTY_visible - private static final int PROPERTY_width - private static final int PROPERTY_x - private static final int PROPERTY_y - private static final int EVENT_actionListener - private static final int EVENT_componentListener - private static final int EVENT_focusListener - private static final int EVENT_hierarchyBoundsListener - private static final int EVENT_inputMethodListener - private static final int EVENT_keyListener - private static final int EVENT_mouseListener - private static final int EVENT_mouseMotionListener - private static final int EVENT_propertyChangeListener - private static final int defaultPropertyIndex - private static final int defaultEventIndex -net.java.dev.colorchooser.ContinuousPalette: - public static final int SMALL_SPEC_WIDTH - public static final int SMALL_SPEC_HEIGHT - public static final int LARGE_SPEC_WIDTH - public static final int LARGE_SPEC_HEIGHT - public static final int SPEC_IMAGE_COUNT - 64:93:private ContinuousPalette(java.lang.String,int,int) - 188:190:public java.awt.Color colorFromPoint(java.awt.Point) - 213:213:public float getSaturation() - 230:230:public boolean isVerticalHue() - 236:240:public void setVerticalHue(boolean) - 254:260:public void setGrayStripSize(float) - 267:267:public float getGrayStripSize() -net.java.dev.colorchooser.NamedColor: - public abstract java.lang.String getName() - 87:87:public java.lang.String getInstantiationCode() - public abstract int compareTo(java.lang.Object) -net.java.dev.colorchooser.NamedColor$DefaultNamedColor: - 106:106:public java.lang.String getName() -net.java.dev.colorchooser.PredefinedPalette: - 119:119:protected int getCount() -net.java.dev.colorchooser.PredefinedPalette$BasicNamedColor: - 226:226:public java.lang.String getInstantiationCode() -net.java.dev.colorchooser.PredefinedPalette$SwingColor: - 419:419:public java.lang.String getInstantiationCode() -net.java.dev.colorchooser.RecentColors: - public static final java.lang.String INNER_DELIMITER - public static final java.lang.String OUTER_DELIMITER -org.apache.commons.imaging.ImageReadException: - private static final long serialVersionUID -org.apache.commons.imaging.ImageWriteException: - static final long serialVersionUID -org.apache.commons.imaging.ImagingException: - private static final long serialVersionUID -org.apache.commons.imaging.color.ColorConversions: - private static final double ref_X - private static final double ref_Y - private static final double ref_Z -org.apache.commons.imaging.common.RationalNumber: - private static final long serialVersionUID -org.apache.commons.imaging.common.RationalNumberUtilities: - private static final long serialVersionUID - private static final double TOLERANCE -org.apache.commons.imaging.common.bytesource.ByteSourceInputStream: - private static final int BLOCK_SIZE -org.apache.commons.imaging.common.itu_t4.HuffmanTreeException: - private static final long serialVersionUID -org.apache.commons.imaging.common.itu_t4.T4_T6_Tables: - 21:22:T4_T6_Tables() -org.apache.commons.imaging.common.mylzw.MyLzwDecompressor: - private static final int MAX_TABLE_SIZE -org.apache.commons.imaging.formats.bmp.BmpImageParser: - private static final java.lang.String DEFAULT_EXTENSION - private static final int BI_RGB - private static final int BI_RLE4 - private static final int BI_RLE8 - private static final int BI_BITFIELDS - private static final int BITMAP_FILE_HEADER_SIZE - private static final int BITMAP_INFO_HEADER_SIZE -org.apache.commons.imaging.formats.dcx.DcxImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.dcx.DcxImageParser$DcxHeader: - public static final int DCX_ID -org.apache.commons.imaging.formats.gif.GifImageParser: - private static final java.lang.String DEFAULT_EXTENSION - private static final int EXTENSION_CODE - private static final int IMAGE_SEPARATOR - private static final int GRAPHIC_CONTROL_EXTENSION - private static final int COMMENT_EXTENSION - private static final int PLAIN_TEXT_EXTENSION - private static final int XMP_EXTENSION - private static final int TERMINATOR_BYTE - private static final int APPLICATION_EXTENSION_LABEL - private static final int XMP_COMPLETE_CODE - private static final int LOCAL_COLOR_TABLE_FLAG_MASK - private static final int INTERLACE_FLAG_MASK - private static final int SORT_FLAG_MASK -org.apache.commons.imaging.formats.icns.IcnsImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.icns.Rle24Compression: - 19:19:Rle24Compression() -org.apache.commons.imaging.formats.ico.IcoImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.jpeg.JpegImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter$ExifOverflowException: - private static final long serialVersionUID -org.apache.commons.imaging.formats.jpeg.xmp.JpegRewriter$JpegSegmentOverflowException: - private static final long serialVersionUID -org.apache.commons.imaging.formats.pcx.PcxImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.pcx.PcxImageParser$PcxHeader: - public static final int ENCODING_UNCOMPRESSED - public static final int ENCODING_RLE - public static final int PALETTE_INFO_COLOR - public static final int PALETTE_INFO_GRAYSCALE -org.apache.commons.imaging.formats.png.GammaCorrection: - private static final boolean DEBUG -org.apache.commons.imaging.formats.png.PngImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.pnm.PnmImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.psd.ImageResourceBlock: - 35:36:public java.lang.String getName() -org.apache.commons.imaging.formats.psd.PsdImageParser: - private static final java.lang.String DEFAULT_EXTENSION - private static final int PSD_SECTION_HEADER - private static final int PSD_SECTION_COLOR_MODE - private static final int PSD_SECTION_IMAGE_RESOURCES - private static final int PSD_SECTION_LAYER_AND_MASK_DATA - private static final int PSD_SECTION_IMAGE_DATA - private static final int PSD_HEADER_LENGTH - private static final int COLOR_MODE_INDEXED -org.apache.commons.imaging.formats.tiff.TiffImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.tiff.TiffReader$DirectoryCollector -org.apache.commons.imaging.formats.wbmp.WbmpImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.xbm.XbmImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.formats.xpm.XpmImageParser: - private static final java.lang.String DEFAULT_EXTENSION -org.apache.commons.imaging.icc.IccTagType: - public abstract java.lang.String getName() - public abstract java.lang.String getTypeDescription() -org.apache.commons.imaging.palette.ColorGroup: - 87:104:public boolean contains(int) -org.apache.commons.imaging.palette.ColorSpaceSubset: - 56:80:public final boolean contains(int,int,int) - 84:109:public void dump(java.lang.String) - 112:119:public void dumpJustRGB(java.lang.String) - 122:127:public int getArea() -org.apache.commons.imaging.palette.ColorSpaceSubset$RgbComparator: - private static final long serialVersionUID -org.apache.commons.imaging.palette.MedianCutMostPopulatedBoxesImplementation$ColorComparer: - private static final long serialVersionUID -org.apache.commons.imaging.palette.PaletteFactory: - private static final boolean debug -org.apache.commons.imaging.util.Debug: - private static final boolean DEBUG -org.apache.commons.lang3.AnnotationUtils$1: - private static final long serialVersionUID -org.apache.commons.lang3.CharRange: - private static final long serialVersionUID - 138:138:public char getStart() - 147:147:public char getEnd() - 183:195:public boolean contains(org.apache.commons.lang3.CharRange) -org.apache.commons.lang3.CharSequenceUtils: - private static final int NOT_FOUND -org.apache.commons.lang3.CharSet: - private static final long serialVersionUID - 212:212:org.apache.commons.lang3.CharRange[] getCharRanges() -org.apache.commons.lang3.EnumUtils: - private static final java.lang.String NULL_ELEMENTS_NOT_PERMITTED - private static final java.lang.String CANNOT_STORE_S_S_VALUES_IN_S_BITS - private static final java.lang.String S_DOES_NOT_SEEM_TO_BE_AN_ENUM_TYPE - private static final java.lang.String ENUM_CLASS_MUST_BE_DEFINED -org.apache.commons.lang3.JavaVersion: - 129:129:static org.apache.commons.lang3.JavaVersion getJavaVersion(java.lang.String) -org.apache.commons.lang3.LocaleUtils$SyncAvoid: - 315:315:LocaleUtils$SyncAvoid() -org.apache.commons.lang3.NotImplementedException: - private static final long serialVersionUID -org.apache.commons.lang3.ObjectUtils$Null: - private static final long serialVersionUID - 698:698:private java.lang.Object readResolve() -org.apache.commons.lang3.Range: - private static final long serialVersionUID -org.apache.commons.lang3.SerializationException: - private static final long serialVersionUID -org.apache.commons.lang3.StringEscapeUtils$CsvEscaper: - private static final char CSV_DELIMITER - private static final char CSV_QUOTE -org.apache.commons.lang3.StringEscapeUtils$CsvUnescaper: - private static final char CSV_DELIMITER - private static final char CSV_QUOTE -org.apache.commons.lang3.StringUtils: - private static final int PAD_LIMIT -org.apache.commons.lang3.SystemUtils: - private static final java.lang.String OS_NAME_WINDOWS_PREFIX - private static final java.lang.String USER_HOME_KEY - private static final java.lang.String USER_DIR_KEY - private static final java.lang.String JAVA_IO_TMPDIR_KEY - private static final java.lang.String JAVA_HOME_KEY -org.apache.commons.lang3.Validate: - private static final java.lang.String DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE - private static final java.lang.String DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE - private static final java.lang.String DEFAULT_MATCHES_PATTERN_EX - private static final java.lang.String DEFAULT_IS_NULL_EX_MESSAGE - private static final java.lang.String DEFAULT_IS_TRUE_EX_MESSAGE - private static final java.lang.String DEFAULT_NO_NULL_ELEMENTS_ARRAY_EX_MESSAGE - private static final java.lang.String DEFAULT_NO_NULL_ELEMENTS_COLLECTION_EX_MESSAGE - private static final java.lang.String DEFAULT_NOT_BLANK_EX_MESSAGE - private static final java.lang.String DEFAULT_NOT_EMPTY_ARRAY_EX_MESSAGE - private static final java.lang.String DEFAULT_NOT_EMPTY_CHAR_SEQUENCE_EX_MESSAGE - private static final java.lang.String DEFAULT_NOT_EMPTY_COLLECTION_EX_MESSAGE - private static final java.lang.String DEFAULT_NOT_EMPTY_MAP_EX_MESSAGE - private static final java.lang.String DEFAULT_VALID_INDEX_ARRAY_EX_MESSAGE - private static final java.lang.String DEFAULT_VALID_INDEX_CHAR_SEQUENCE_EX_MESSAGE - private static final java.lang.String DEFAULT_VALID_INDEX_COLLECTION_EX_MESSAGE - private static final java.lang.String DEFAULT_VALID_STATE_EX_MESSAGE - private static final java.lang.String DEFAULT_IS_ASSIGNABLE_EX_MESSAGE - private static final java.lang.String DEFAULT_IS_INSTANCE_OF_EX_MESSAGE -org.apache.commons.lang3.builder.Diff: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$1: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$10: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$11: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$12: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$13: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$14: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$15: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$16: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$17: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$18: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$2: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$3: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$4: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$5: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$6: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$7: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$8: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffBuilder$9: - private static final long serialVersionUID -org.apache.commons.lang3.builder.DiffResult: - private static final java.lang.String DIFFERS_STRING -org.apache.commons.lang3.builder.HashCodeBuilder: - private static final int DEFAULT_INITIAL_VALUE - private static final int DEFAULT_MULTIPLIER_VALUE -org.apache.commons.lang3.builder.MultilineRecursiveToStringStyle -org.apache.commons.lang3.builder.RecursiveToStringStyle: - private static final long serialVersionUID -org.apache.commons.lang3.builder.StandardToStringStyle: - private static final long serialVersionUID -org.apache.commons.lang3.builder.ToStringStyle: - private static final long serialVersionUID -org.apache.commons.lang3.builder.ToStringStyle$DefaultToStringStyle: - private static final long serialVersionUID - 2167:2167:private java.lang.Object readResolve() -org.apache.commons.lang3.builder.ToStringStyle$JsonToStringStyle: - private static final long serialVersionUID - 2610:2610:private java.lang.Object readResolve() -org.apache.commons.lang3.builder.ToStringStyle$MultiLineToStringStyle: - private static final long serialVersionUID - 2308:2308:private java.lang.Object readResolve() -org.apache.commons.lang3.builder.ToStringStyle$NoClassNameToStringStyle: - private static final long serialVersionUID - 2343:2343:private java.lang.Object readResolve() -org.apache.commons.lang3.builder.ToStringStyle$NoFieldNameToStringStyle: - private static final long serialVersionUID - 2201:2201:private java.lang.Object readResolve() -org.apache.commons.lang3.builder.ToStringStyle$ShortPrefixToStringStyle: - private static final long serialVersionUID - 2235:2235:private java.lang.Object readResolve() -org.apache.commons.lang3.builder.ToStringStyle$SimpleToStringStyle: - private static final long serialVersionUID - 2272:2272:private java.lang.Object readResolve() -org.apache.commons.lang3.concurrent.ConcurrentException: - private static final long serialVersionUID -org.apache.commons.lang3.concurrent.ConcurrentRuntimeException: - private static final long serialVersionUID -org.apache.commons.lang3.concurrent.ConstantInitializer: - private static final java.lang.String FMT_TO_STRING -org.apache.commons.lang3.concurrent.TimedSemaphore: - private static final int THREAD_POOL_SIZE -org.apache.commons.lang3.event.EventListenerSupport: - private static final long serialVersionUID - 193:193:int getListenerCount() - 225:243:private void writeObject(java.io.ObjectOutputStream) - 254:263:private void readObject(java.io.ObjectInputStream) -org.apache.commons.lang3.exception.CloneFailedException: - private static final long serialVersionUID -org.apache.commons.lang3.exception.ContextedException: - private static final long serialVersionUID -org.apache.commons.lang3.exception.ContextedRuntimeException: - private static final long serialVersionUID -org.apache.commons.lang3.exception.DefaultExceptionContext: - private static final long serialVersionUID -org.apache.commons.lang3.exception.ExceptionUtils: - static final java.lang.String WRAPPED_MARKER -org.apache.commons.lang3.math.Fraction: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableBoolean: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableByte: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableDouble: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableFloat: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableInt: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableLong: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableObject: - private static final long serialVersionUID -org.apache.commons.lang3.mutable.MutableShort: - private static final long serialVersionUID -org.apache.commons.lang3.reflect.MemberUtils: - private static final int ACCESS_TEST - 32:32:MemberUtils() -org.apache.commons.lang3.text.CompositeFormat: - private static final long serialVersionUID -org.apache.commons.lang3.text.ExtendedMessageFormat: - private static final long serialVersionUID - private static final int HASH_SEED - private static final java.lang.String DUMMY_PATTERN - private static final char START_FMT - private static final char END_FE - private static final char START_FE - private static final char QUOTE -org.apache.commons.lang3.text.FormattableUtils: - private static final java.lang.String SIMPLEST_FORMAT -org.apache.commons.lang3.text.StrBuilder: - static final int CAPACITY - private static final long serialVersionUID -org.apache.commons.lang3.time.DurationFormatUtils$Token: - 612:615:DurationFormatUtils$Token(java.lang.Object,int) -org.apache.commons.lang3.time.FastDateFormat: - private static final long serialVersionUID -org.apache.commons.lang3.time.FastDateParser: - private static final long serialVersionUID - 224:224:java.util.regex.Pattern getParsePattern() - 277:281:private void readObject(java.io.ObjectInputStream) -org.apache.commons.lang3.time.FastDateParser$TimeZoneStrategy: - private static final int ID - private static final int LONG_STD - private static final int SHORT_STD - private static final int LONG_DST - private static final int SHORT_DST -org.apache.commons.lang3.time.FastDatePrinter: - private static final long serialVersionUID - 587:589:private void readObject(java.io.ObjectInputStream) -org.apache.commons.lang3.time.FormatCache: - static final int NONE -org.apache.commons.lang3.time.StopWatch: - private static final long NANO_2_MILLIS -org.apache.commons.lang3.tuple.ImmutablePair: - private static final long serialVersionUID -org.apache.commons.lang3.tuple.ImmutableTriple: - private static final long serialVersionUID -org.apache.commons.lang3.tuple.MutablePair: - private static final long serialVersionUID -org.apache.commons.lang3.tuple.MutableTriple: - private static final long serialVersionUID -org.apache.commons.lang3.tuple.Pair: - private static final long serialVersionUID -org.apache.commons.lang3.tuple.Triple: - private static final long serialVersionUID -org.apache.commons.logging.LogConfigurationException: - private static final long serialVersionUID -org.apache.commons.logging.LogFactory: - private static final java.lang.String WEAK_HASHTABLE_CLASSNAME -org.apache.commons.logging.impl.Jdk13LumberjackLogger: - private static final long serialVersionUID -org.apache.commons.logging.impl.Jdk14Logger: - private static final long serialVersionUID -org.apache.commons.logging.impl.Log4JLogger: - private static final long serialVersionUID -org.apache.commons.logging.impl.LogFactoryImpl: - private static final java.lang.String LOGGING_IMPL_LOG4J_LOGGER - private static final java.lang.String LOGGING_IMPL_JDK14_LOGGER - private static final java.lang.String LOGGING_IMPL_LUMBERJACK_LOGGER - private static final java.lang.String LOGGING_IMPL_SIMPLE_LOGGER - private static final java.lang.String PKG_IMPL -org.apache.commons.logging.impl.LogKitLogger: - private static final long serialVersionUID -org.apache.commons.logging.impl.NoOpLog: - private static final long serialVersionUID -org.apache.commons.logging.impl.SimpleLog: - private static final long serialVersionUID -org.apache.commons.logging.impl.WeakHashtable: - private static final long serialVersionUID - private static final int MAX_CHANGES_BEFORE_PURGE - private static final int PARTIAL_PURGE_COUNT -org.apache.commons.math3.analysis.differentiation.DerivativeStructure: - private static final long serialVersionUID - 1151:1151:private java.lang.Object writeReplace() -org.apache.commons.math3.analysis.differentiation.DerivativeStructure$DataTransferObject -org.apache.commons.math3.analysis.differentiation.FiniteDifferencesDifferentiator: - private static final long serialVersionUID -org.apache.commons.math3.analysis.differentiation.SparseGradient: - private static final long serialVersionUID -org.apache.commons.math3.analysis.function.Sinc: - private static final double SHORTCUT -org.apache.commons.math3.analysis.integration.gauss.HermiteRuleFactory: - private static final double SQRT_PI - private static final double H0 - private static final double H1 -org.apache.commons.math3.analysis.interpolation.AkimaSplineInterpolator: - private static final int MINIMUM_NUMBER_POINTS -org.apache.commons.math3.analysis.interpolation.BicubicFunction: - private static final short N -org.apache.commons.math3.analysis.interpolation.BicubicInterpolatingFunction: - private static final int NUM_COEFF -org.apache.commons.math3.analysis.interpolation.BicubicSplineFunction: - private static final short N - 461:462:BicubicSplineFunction(double[]) -org.apache.commons.math3.analysis.interpolation.BicubicSplineInterpolatingFunction: - private static final int NUM_COEFF -org.apache.commons.math3.analysis.interpolation.DividedDifferenceInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.analysis.interpolation.InterpolatingMicrosphere2D: - private static final int DIMENSION -org.apache.commons.math3.analysis.interpolation.LoessInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.analysis.interpolation.NevilleInterpolator: - static final long serialVersionUID -org.apache.commons.math3.analysis.interpolation.PiecewiseBicubicSplineInterpolatingFunction: - private static final int MIN_NUM_POINTS -org.apache.commons.math3.analysis.interpolation.TricubicFunction: - private static final short N -org.apache.commons.math3.analysis.interpolation.TricubicSplineFunction: - private static final short N -org.apache.commons.math3.analysis.polynomials.PolynomialFunction: - private static final long serialVersionUID -org.apache.commons.math3.analysis.solvers.BaseAbstractUnivariateSolver: - private static final double DEFAULT_RELATIVE_ACCURACY - private static final double DEFAULT_FUNCTION_VALUE_ACCURACY -org.apache.commons.math3.analysis.solvers.BisectionSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.analysis.solvers.BracketingNthOrderBrentSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY - private static final int DEFAULT_MAXIMAL_ORDER - private static final int MAXIMAL_AGING - private static final double REDUCTION_FACTOR -org.apache.commons.math3.analysis.solvers.BrentSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.analysis.solvers.FieldBracketingNthOrderBrentSolver: - private static final int MAXIMAL_AGING -org.apache.commons.math3.analysis.solvers.LaguerreSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.analysis.solvers.MullerSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.analysis.solvers.MullerSolver2: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.analysis.solvers.NewtonRaphsonSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.analysis.solvers.NewtonSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.analysis.solvers.RiddersSolver: - private static final double DEFAULT_ABSOLUTE_ACCURACY -org.apache.commons.math3.complex.Complex: - private static final long serialVersionUID -org.apache.commons.math3.complex.ComplexField: - private static final long serialVersionUID - 80:80:private java.lang.Object readResolve() -org.apache.commons.math3.complex.ComplexField$LazyHolder: - 69:69:private ComplexField$LazyHolder() -org.apache.commons.math3.complex.ComplexFormat: - private static final java.lang.String DEFAULT_IMAGINARY_CHARACTER -org.apache.commons.math3.complex.Quaternion: - private static final long serialVersionUID -org.apache.commons.math3.complex.RootsOfUnity: - private static final long serialVersionUID -org.apache.commons.math3.dfp.Dfp: - private static final java.lang.String NAN_STRING - private static final java.lang.String POS_INFINITY_STRING - private static final java.lang.String NEG_INFINITY_STRING - private static final java.lang.String ADD_TRAP - private static final java.lang.String MULTIPLY_TRAP - private static final java.lang.String DIVIDE_TRAP - private static final java.lang.String SQRT_TRAP - private static final java.lang.String ALIGN_TRAP - private static final java.lang.String TRUNC_TRAP - private static final java.lang.String NEXT_AFTER_TRAP - private static final java.lang.String LESS_THAN_TRAP - private static final java.lang.String GREATER_THAN_TRAP - private static final java.lang.String NEW_INSTANCE_TRAP -org.apache.commons.math3.dfp.DfpMath: - private static final java.lang.String POW_TRAP -org.apache.commons.math3.distribution.AbstractIntegerDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.AbstractRealDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.BetaDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.BetaDistribution$ChengBetaSampler: - 293:293:private BetaDistribution$ChengBetaSampler() -org.apache.commons.math3.distribution.BinomialDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.CauchyDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.ChiSquaredDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.ConstantRealDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.EnumeratedDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.EnumeratedIntegerDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.EnumeratedRealDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.ExponentialDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.FDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.GammaDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.GeometricDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.GumbelDistribution: - private static final long serialVersionUID - private static final double EULER -org.apache.commons.math3.distribution.HypergeometricDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.KolmogorovSmirnovDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.LaplaceDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.LevyDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.LogNormalDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.LogisticDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.NakagamiDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.NormalDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.ParetoDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.PascalDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.PoissonDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.SaddlePointExpansion: - 88:89:private SaddlePointExpansion() -org.apache.commons.math3.distribution.TDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.TriangularDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.UniformIntegerDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.UniformRealDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.WeibullDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.ZipfDistribution: - private static final long serialVersionUID -org.apache.commons.math3.distribution.fitting.MultivariateNormalMixtureExpectationMaximization: - private static final int DEFAULT_MAX_ITERATIONS - private static final double DEFAULT_THRESHOLD -org.apache.commons.math3.exception.ConvergenceException: - private static final long serialVersionUID -org.apache.commons.math3.exception.DimensionMismatchException: - private static final long serialVersionUID -org.apache.commons.math3.exception.InsufficientDataException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MathArithmeticException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MathIllegalArgumentException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MathIllegalNumberException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MathIllegalStateException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MathInternalError: - private static final long serialVersionUID - private static final java.lang.String REPORT_URL -org.apache.commons.math3.exception.MathParseException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MathRuntimeException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MathUnsupportedOperationException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MaxCountExceededException: - private static final long serialVersionUID -org.apache.commons.math3.exception.MultiDimensionMismatchException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NoBracketingException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NoDataException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NonMonotonicSequenceException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NotANumberException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NotFiniteNumberException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NotPositiveException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NotStrictlyPositiveException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NullArgumentException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NumberIsTooLargeException: - private static final long serialVersionUID -org.apache.commons.math3.exception.NumberIsTooSmallException: - private static final long serialVersionUID -org.apache.commons.math3.exception.OutOfRangeException: - private static final long serialVersionUID -org.apache.commons.math3.exception.TooManyEvaluationsException: - private static final long serialVersionUID -org.apache.commons.math3.exception.TooManyIterationsException: - private static final long serialVersionUID -org.apache.commons.math3.exception.ZeroException: - private static final long serialVersionUID -org.apache.commons.math3.exception.util.DummyLocalizable: - private static final long serialVersionUID -org.apache.commons.math3.exception.util.ExceptionContext: - private static final long serialVersionUID - 196:199:private void writeObject(java.io.ObjectOutputStream) - 210:213:private void readObject(java.io.ObjectInputStream) - 224:245:private void serializeMessages(java.io.ObjectOutputStream) - 258:275:private void deSerializeMessages(java.io.ObjectInputStream) - 286:300:private void serializeContext(java.io.ObjectOutputStream) - 313:322:private void deSerializeContext(java.io.ObjectInputStream) - 332:332:private java.lang.String nonSerializableReplacement(java.lang.Object) -org.apache.commons.math3.fitting.WeightedObservedPoint: - private static final long serialVersionUID -org.apache.commons.math3.fitting.WeightedObservedPoints: - private static final long serialVersionUID -org.apache.commons.math3.fitting.leastsquares.GaussNewtonOptimizer: - private static final double SINGULARITY_THRESHOLD -org.apache.commons.math3.fraction.AbstractFormat: - private static final long serialVersionUID -org.apache.commons.math3.fraction.BigFraction: - private static final long serialVersionUID -org.apache.commons.math3.fraction.BigFractionField: - private static final long serialVersionUID - 79:79:private java.lang.Object readResolve() -org.apache.commons.math3.fraction.BigFractionField$LazyHolder: - 68:68:private BigFractionField$LazyHolder() -org.apache.commons.math3.fraction.BigFractionFormat: - private static final long serialVersionUID -org.apache.commons.math3.fraction.Fraction: - private static final long serialVersionUID - private static final double DEFAULT_EPSILON -org.apache.commons.math3.fraction.FractionConversionException: - private static final long serialVersionUID -org.apache.commons.math3.fraction.FractionField: - private static final long serialVersionUID - 79:79:private java.lang.Object readResolve() -org.apache.commons.math3.fraction.FractionField$LazyHolder: - 68:68:private FractionField$LazyHolder() -org.apache.commons.math3.fraction.FractionFormat: - private static final long serialVersionUID -org.apache.commons.math3.fraction.ProperBigFractionFormat: - private static final long serialVersionUID -org.apache.commons.math3.fraction.ProperFractionFormat: - private static final long serialVersionUID -org.apache.commons.math3.genetics.Chromosome: - private static final double NO_FITNESS -org.apache.commons.math3.genetics.InvalidRepresentationException: - private static final long serialVersionUID -org.apache.commons.math3.geometry.enclosing.EnclosingBall: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.oned.Euclidean1D: - private static final long serialVersionUID - 79:79:private java.lang.Object readResolve() -org.apache.commons.math3.geometry.euclidean.oned.Euclidean1D$LazyHolder: - 68:68:private Euclidean1D$LazyHolder() -org.apache.commons.math3.geometry.euclidean.oned.Euclidean1D$NoSubSpaceException: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.oned.IntervalsSet: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.oned.OrientedPoint: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.oned.Vector1D: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.threed.CardanEulerSingularityException: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.threed.Euclidean3D: - private static final long serialVersionUID - 71:71:private java.lang.Object readResolve() -org.apache.commons.math3.geometry.euclidean.threed.Euclidean3D$LazyHolder: - 60:60:private Euclidean3D$LazyHolder() -org.apache.commons.math3.geometry.euclidean.threed.FieldRotation: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.threed.FieldVector3D: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.threed.Line: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.threed.NotARotationMatrixException: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.threed.Plane: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.threed.PolyhedronsSet: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.threed.Rotation: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.threed.SphericalCoordinates: - private static final long serialVersionUID - 351:351:private java.lang.Object writeReplace() -org.apache.commons.math3.geometry.euclidean.threed.SphericalCoordinates$DataTransferObject -org.apache.commons.math3.geometry.euclidean.threed.SubLine: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.threed.Vector3D: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.twod.Euclidean2D: - private static final long serialVersionUID - 71:71:private java.lang.Object readResolve() -org.apache.commons.math3.geometry.euclidean.twod.Euclidean2D$LazyHolder: - 60:60:private Euclidean2D$LazyHolder() -org.apache.commons.math3.geometry.euclidean.twod.Line: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.twod.NestedLoops -org.apache.commons.math3.geometry.euclidean.twod.PolygonsSet: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.twod.SubLine: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.twod.Vector2D: - private static final long serialVersionUID -org.apache.commons.math3.geometry.euclidean.twod.hull.AbstractConvexHullGenerator2D: - private static final double DEFAULT_TOLERANCE -org.apache.commons.math3.geometry.euclidean.twod.hull.ConvexHull2D: - private static final long serialVersionUID -org.apache.commons.math3.geometry.partitioning.utilities.OrderedTuple: - private static final long SIGN_MASK - private static final long EXPONENT_MASK - private static final long MANTISSA_MASK - private static final long IMPLICIT_ONE -org.apache.commons.math3.geometry.spherical.oned.ArcsSet$InconsistentStateAt2PiWrapping: - private static final long serialVersionUID -org.apache.commons.math3.geometry.spherical.oned.S1Point: - private static final long serialVersionUID -org.apache.commons.math3.geometry.spherical.oned.Sphere1D: - private static final long serialVersionUID - 85:85:private java.lang.Object readResolve() -org.apache.commons.math3.geometry.spherical.oned.Sphere1D$LazyHolder: - 74:74:private Sphere1D$LazyHolder() -org.apache.commons.math3.geometry.spherical.oned.Sphere1D$NoSubSpaceException: - private static final long serialVersionUID -org.apache.commons.math3.geometry.spherical.twod.S2Point: - private static final long serialVersionUID -org.apache.commons.math3.geometry.spherical.twod.Sphere2D: - private static final long serialVersionUID - 77:77:private java.lang.Object readResolve() -org.apache.commons.math3.geometry.spherical.twod.Sphere2D$LazyHolder: - 66:66:private Sphere2D$LazyHolder() -org.apache.commons.math3.linear.Array2DRowFieldMatrix: - private static final long serialVersionUID -org.apache.commons.math3.linear.Array2DRowRealMatrix: - private static final long serialVersionUID -org.apache.commons.math3.linear.ArrayFieldVector: - private static final long serialVersionUID -org.apache.commons.math3.linear.ArrayRealVector: - private static final long serialVersionUID -org.apache.commons.math3.linear.BiDiagonalTransformer -org.apache.commons.math3.linear.BlockFieldMatrix: - private static final long serialVersionUID -org.apache.commons.math3.linear.BlockRealMatrix: - private static final long serialVersionUID -org.apache.commons.math3.linear.DefaultIterativeLinearSolverEvent: - private static final long serialVersionUID -org.apache.commons.math3.linear.DiagonalMatrix: - private static final long serialVersionUID -org.apache.commons.math3.linear.EigenDecomposition: - private static final double EPSILON -org.apache.commons.math3.linear.HessenbergTransformer: - 129:134:public org.apache.commons.math3.linear.RealMatrix getPT() - 172:172:double[][] getHouseholderVectorsRef() -org.apache.commons.math3.linear.IllConditionedOperatorException: - private static final long serialVersionUID -org.apache.commons.math3.linear.IterativeLinearSolverEvent: - private static final long serialVersionUID -org.apache.commons.math3.linear.LUDecomposition: - private static final double DEFAULT_TOO_SMALL -org.apache.commons.math3.linear.MatrixDimensionMismatchException: - private static final long serialVersionUID -org.apache.commons.math3.linear.NonPositiveDefiniteMatrixException: - private static final long serialVersionUID -org.apache.commons.math3.linear.NonPositiveDefiniteOperatorException: - private static final long serialVersionUID -org.apache.commons.math3.linear.NonSelfAdjointOperatorException: - private static final long serialVersionUID -org.apache.commons.math3.linear.NonSquareMatrixException: - private static final long serialVersionUID -org.apache.commons.math3.linear.NonSquareOperatorException: - private static final long serialVersionUID -org.apache.commons.math3.linear.NonSymmetricMatrixException: - private static final long serialVersionUID -org.apache.commons.math3.linear.OpenMapRealMatrix: - private static final long serialVersionUID -org.apache.commons.math3.linear.OpenMapRealVector: - private static final long serialVersionUID -org.apache.commons.math3.linear.RealMatrixFormat: - private static final java.lang.String DEFAULT_PREFIX - private static final java.lang.String DEFAULT_SUFFIX - private static final java.lang.String DEFAULT_ROW_PREFIX - private static final java.lang.String DEFAULT_ROW_SUFFIX - private static final java.lang.String DEFAULT_ROW_SEPARATOR - private static final java.lang.String DEFAULT_COLUMN_SEPARATOR -org.apache.commons.math3.linear.RealVectorFormat: - private static final java.lang.String DEFAULT_PREFIX - private static final java.lang.String DEFAULT_SUFFIX - private static final java.lang.String DEFAULT_SEPARATOR -org.apache.commons.math3.linear.SchurTransformer: - private static final int MAX_ITERATIONS - 105:110:public org.apache.commons.math3.linear.RealMatrix getPT() -org.apache.commons.math3.linear.SingularMatrixException: - private static final long serialVersionUID -org.apache.commons.math3.linear.SingularOperatorException: - private static final long serialVersionUID -org.apache.commons.math3.linear.SingularValueDecomposition: - private static final double EPS - private static final double TINY -org.apache.commons.math3.linear.SparseFieldVector: - private static final long serialVersionUID -org.apache.commons.math3.linear.SymmLQ: - private static final java.lang.String OPERATOR - private static final java.lang.String THRESHOLD - private static final java.lang.String VECTOR - private static final java.lang.String VECTOR1 - private static final java.lang.String VECTOR2 -org.apache.commons.math3.linear.TriDiagonalTransformer: - 138:154:public org.apache.commons.math3.linear.RealMatrix getT() - 164:164:double[][] getHouseholderVectorsRef() -org.apache.commons.math3.ml.clustering.CentroidCluster: - private static final long serialVersionUID -org.apache.commons.math3.ml.clustering.Cluster: - private static final long serialVersionUID -org.apache.commons.math3.ml.clustering.DoublePoint: - private static final long serialVersionUID -org.apache.commons.math3.ml.clustering.FuzzyKMeansClusterer: - private static final double DEFAULT_EPSILON -org.apache.commons.math3.ml.distance.CanberraDistance: - private static final long serialVersionUID -org.apache.commons.math3.ml.distance.ChebyshevDistance: - private static final long serialVersionUID -org.apache.commons.math3.ml.distance.EarthMoversDistance: - private static final long serialVersionUID -org.apache.commons.math3.ml.distance.EuclideanDistance: - private static final long serialVersionUID -org.apache.commons.math3.ml.distance.ManhattanDistance: - private static final long serialVersionUID -org.apache.commons.math3.ml.neuralnet.Network: - private static final long serialVersionUID - 52:125:Network(long,int,org.apache.commons.math3.ml.neuralnet.Neuron[],long[][]) - 426:426:private void readObject(java.io.ObjectInputStream) - 435:449:private java.lang.Object writeReplace() -org.apache.commons.math3.ml.neuralnet.Network$NeuronIdentifierComparator: - private static final long serialVersionUID -org.apache.commons.math3.ml.neuralnet.Network$SerializationProxy -org.apache.commons.math3.ml.neuralnet.Neuron: - private static final long serialVersionUID - 228:228:private void readObject(java.io.ObjectInputStream) - 237:237:private java.lang.Object writeReplace() -org.apache.commons.math3.ml.neuralnet.Neuron$SerializationProxy -org.apache.commons.math3.ml.neuralnet.oned.NeuronString: - private static final long serialVersionUID - 59:79:NeuronString(boolean,double[][]) - 188:188:private void readObject(java.io.ObjectInputStream) - 197:202:private java.lang.Object writeReplace() -org.apache.commons.math3.ml.neuralnet.oned.NeuronString$SerializationProxy -org.apache.commons.math3.ml.neuralnet.twod.NeuronSquareMesh2D: - private static final long serialVersionUID - 109:137:NeuronSquareMesh2D(boolean,boolean,org.apache.commons.math3.ml.neuralnet.SquareNeighbourhood,double[][][]) - 562:562:private void readObject(java.io.ObjectInputStream) - 571:578:private java.lang.Object writeReplace() -org.apache.commons.math3.ml.neuralnet.twod.NeuronSquareMesh2D$SerializationProxy -org.apache.commons.math3.ode.AbstractFieldIntegrator: - private static final double DEFAULT_RELATIVE_ACCURACY - private static final double DEFAULT_FUNCTION_VALUE_ACCURACY -org.apache.commons.math3.ode.ContinuousOutputModel: - private static final long serialVersionUID -org.apache.commons.math3.ode.EquationsMapper: - private static final long serialVersionUID -org.apache.commons.math3.ode.FieldEquationsMapper: - private static final long serialVersionUID -org.apache.commons.math3.ode.JacobianMatrices$MismatchedEquations: - private static final long serialVersionUID -org.apache.commons.math3.ode.MultistepFieldIntegrator$InitializationCompletedMarkerException: - private static final long serialVersionUID -org.apache.commons.math3.ode.MultistepIntegrator$InitializationCompletedMarkerException: - private static final long serialVersionUID -org.apache.commons.math3.ode.ParameterConfiguration: - private static final long serialVersionUID -org.apache.commons.math3.ode.ParameterizedWrapper -org.apache.commons.math3.ode.UnknownParameterException: - private static final long serialVersionUID -org.apache.commons.math3.ode.events.EventFilter: - private static final int HISTORY_SIZE -org.apache.commons.math3.ode.events.EventState$LocalMaxCountExceededException: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.AdamsBashforthFieldIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.AdamsBashforthIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.AdamsMoultonFieldIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.AdamsMoultonIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.ClassicalRungeKuttaStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.DormandPrince54FieldIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.DormandPrince54Integrator: - private static final java.lang.String METHOD_NAME - private static final double E1 - private static final double E3 - private static final double E4 - private static final double E5 - private static final double E6 - private static final double E7 -org.apache.commons.math3.ode.nonstiff.DormandPrince54StepInterpolator: - private static final double A70 - private static final double A72 - private static final double A73 - private static final double A74 - private static final double A75 - private static final double D0 - private static final double D2 - private static final double D3 - private static final double D4 - private static final double D5 - private static final double D6 - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.DormandPrince853FieldIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.DormandPrince853Integrator: - private static final java.lang.String METHOD_NAME - private static final double E1_01 - private static final double E1_06 - private static final double E1_07 - private static final double E1_08 - private static final double E1_09 - private static final double E1_10 - private static final double E1_11 - private static final double E1_12 - private static final double E2_01 - private static final double E2_06 - private static final double E2_07 - private static final double E2_08 - private static final double E2_09 - private static final double E2_10 - private static final double E2_11 - private static final double E2_12 -org.apache.commons.math3.ode.nonstiff.DormandPrince853StepInterpolator: - private static final long serialVersionUID - private static final double B_01 - private static final double B_06 - private static final double B_07 - private static final double B_08 - private static final double B_09 - private static final double B_10 - private static final double B_11 - private static final double B_12 - private static final double C14 - private static final double K14_01 - private static final double K14_06 - private static final double K14_07 - private static final double K14_08 - private static final double K14_09 - private static final double K14_10 - private static final double K14_11 - private static final double K14_12 - private static final double K14_13 - private static final double C15 - private static final double K15_01 - private static final double K15_06 - private static final double K15_07 - private static final double K15_08 - private static final double K15_09 - private static final double K15_10 - private static final double K15_11 - private static final double K15_12 - private static final double K15_13 - private static final double K15_14 - private static final double C16 - private static final double K16_01 - private static final double K16_06 - private static final double K16_07 - private static final double K16_08 - private static final double K16_09 - private static final double K16_10 - private static final double K16_11 - private static final double K16_12 - private static final double K16_13 - private static final double K16_14 - private static final double K16_15 -org.apache.commons.math3.ode.nonstiff.EulerStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.GillStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.GraggBulirschStoerIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.GraggBulirschStoerStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.HighamHall54FieldIntegrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.HighamHall54Integrator: - private static final java.lang.String METHOD_NAME -org.apache.commons.math3.ode.nonstiff.HighamHall54StepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.LutherStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.MidpointStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.nonstiff.ThreeEighthesStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.ode.sampling.DummyStepHandler: - 86:86:private java.lang.Object readResolve() -org.apache.commons.math3.ode.sampling.DummyStepHandler$LazyHolder: - 75:75:private DummyStepHandler$LazyHolder() -org.apache.commons.math3.ode.sampling.NordsieckStepInterpolator: - private static final long serialVersionUID -org.apache.commons.math3.optim.PointValuePair: - private static final long serialVersionUID - 87:87:private java.lang.Object writeReplace() -org.apache.commons.math3.optim.PointValuePair$DataTransferObject -org.apache.commons.math3.optim.PointVectorValuePair: - private static final long serialVersionUID - 112:112:private java.lang.Object writeReplace() -org.apache.commons.math3.optim.PointVectorValuePair$DataTransferObject -org.apache.commons.math3.optim.SimplePointChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optim.SimpleValueChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optim.SimpleVectorValueChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optim.linear.LinearConstraint: - private static final long serialVersionUID - 215:217:private void writeObject(java.io.ObjectOutputStream) - 227:229:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.optim.linear.LinearObjectiveFunction: - private static final long serialVersionUID - 135:137:private void writeObject(java.io.ObjectOutputStream) - 147:149:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.optim.linear.NoFeasibleSolutionException: - private static final long serialVersionUID -org.apache.commons.math3.optim.linear.SimplexSolver: - static final int DEFAULT_ULPS - static final double DEFAULT_CUT_OFF - private static final double DEFAULT_EPSILON -org.apache.commons.math3.optim.linear.SimplexTableau: - private static final java.lang.String NEGATIVE_VAR_COLUMN_LABEL - private static final long serialVersionUID - 121:122:SimplexTableau(org.apache.commons.math3.optim.linear.LinearObjectiveFunction,java.util.Collection,org.apache.commons.math3.optim.nonlinear.scalar.GoalType,boolean,double) - 572:573:protected final void setEntry(int,int,double) - 609:609:protected final int getNumDecisionVariables() - 651:651:protected final double[][] getData() - 698:700:private void writeObject(java.io.ObjectOutputStream) - 710:712:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.optim.linear.UnboundedSolutionException: - private static final long serialVersionUID -org.apache.commons.math3.optim.nonlinear.scalar.LineSearch: - private static final double REL_TOL_UNUSED - private static final double ABS_TOL_UNUSED -org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer: - private static final double ZERO - private static final double ONE - private static final double TWO - private static final double TEN - private static final double SIXTEEN - private static final double TWO_HUNDRED_FIFTY - private static final double MINUS_ONE - private static final double HALF - private static final double ONE_OVER_FOUR - private static final double ONE_OVER_EIGHT - private static final double ONE_OVER_TEN - private static final double ONE_OVER_A_THOUSAND - 2444:2447:private static java.lang.String caller(int) - 49:49:static synthetic java.lang.String access$000(int) -org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer$PathIsExploredException -org.apache.commons.math3.optim.nonlinear.scalar.noderiv.MultiDirectionalSimplex: - private static final double DEFAULT_KHI - private static final double DEFAULT_GAMMA -org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex: - private static final double DEFAULT_RHO - private static final double DEFAULT_KHI - private static final double DEFAULT_GAMMA - private static final double DEFAULT_SIGMA -org.apache.commons.math3.optim.univariate.BracketFinder: - private static final double EPS_MIN - private static final double GOLD -org.apache.commons.math3.optim.univariate.SimpleUnivariateValueChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optim.univariate.UnivariatePointValuePair: - private static final long serialVersionUID -org.apache.commons.math3.optimization.PointValuePair: - private static final long serialVersionUID - 92:92:private java.lang.Object writeReplace() -org.apache.commons.math3.optimization.PointValuePair$DataTransferObject -org.apache.commons.math3.optimization.PointVectorValuePair: - private static final long serialVersionUID - 117:117:private java.lang.Object writeReplace() -org.apache.commons.math3.optimization.PointVectorValuePair$DataTransferObject -org.apache.commons.math3.optimization.SimplePointChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optimization.SimpleValueChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optimization.SimpleVectorValueChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optimization.direct.BOBYQAOptimizer: - private static final double ZERO - private static final double ONE - private static final double TWO - private static final double TEN - private static final double SIXTEEN - private static final double TWO_HUNDRED_FIFTY - private static final double MINUS_ONE - private static final double HALF - private static final double ONE_OVER_FOUR - private static final double ONE_OVER_EIGHT - private static final double ONE_OVER_TEN - private static final double ONE_OVER_A_THOUSAND - 2449:2452:private static java.lang.String caller(int) - 53:53:static synthetic java.lang.String access$000(int) -org.apache.commons.math3.optimization.direct.BOBYQAOptimizer$PathIsExploredException -org.apache.commons.math3.optimization.direct.MultiDirectionalSimplex: - private static final double DEFAULT_KHI - private static final double DEFAULT_GAMMA -org.apache.commons.math3.optimization.direct.NelderMeadSimplex: - private static final double DEFAULT_RHO - private static final double DEFAULT_KHI - private static final double DEFAULT_GAMMA - private static final double DEFAULT_SIGMA -org.apache.commons.math3.optimization.direct.PowellOptimizer$LineSearch: - private static final double REL_TOL_UNUSED - private static final double ABS_TOL_UNUSED -org.apache.commons.math3.optimization.fitting.WeightedObservedPoint: - private static final long serialVersionUID -org.apache.commons.math3.optimization.general.AbstractLeastSquaresOptimizer: - private static final double DEFAULT_SINGULARITY_THRESHOLD -org.apache.commons.math3.optimization.linear.LinearConstraint: - private static final long serialVersionUID - 220:222:private void writeObject(java.io.ObjectOutputStream) - 232:234:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.optimization.linear.LinearObjectiveFunction: - private static final long serialVersionUID - 134:136:private void writeObject(java.io.ObjectOutputStream) - 146:148:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.optimization.linear.NoFeasibleSolutionException: - private static final long serialVersionUID -org.apache.commons.math3.optimization.linear.SimplexSolver: - private static final double DEFAULT_EPSILON - private static final int DEFAULT_ULPS -org.apache.commons.math3.optimization.linear.SimplexTableau: - private static final java.lang.String NEGATIVE_VAR_COLUMN_LABEL - private static final int DEFAULT_ULPS - private static final double CUTOFF_THRESHOLD - private static final long serialVersionUID - 122:123:SimplexTableau(org.apache.commons.math3.optimization.linear.LinearObjectiveFunction,java.util.Collection,org.apache.commons.math3.optimization.GoalType,boolean,double) - 505:506:protected final void setEntry(int,int,double) - 542:542:protected final int getNumDecisionVariables() - 575:575:protected final double[][] getData() - 622:624:private void writeObject(java.io.ObjectOutputStream) - 634:636:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.optimization.linear.UnboundedSolutionException: - private static final long serialVersionUID -org.apache.commons.math3.optimization.univariate.BracketFinder: - private static final double EPS_MIN - private static final double GOLD -org.apache.commons.math3.optimization.univariate.SimpleUnivariateValueChecker: - private static final int ITERATION_CHECK_DISABLED -org.apache.commons.math3.optimization.univariate.UnivariatePointValuePair: - private static final long serialVersionUID -org.apache.commons.math3.primes.PollardRho -org.apache.commons.math3.primes.SmallPrimes: - 73:74:private SmallPrimes() -org.apache.commons.math3.random.AbstractWell: - private static final long serialVersionUID -org.apache.commons.math3.random.BitsStreamGenerator: - private static final long serialVersionUID -org.apache.commons.math3.random.EmpiricalDistribution: - private static final java.lang.String FILE_CHARSET - private static final long serialVersionUID -org.apache.commons.math3.random.ISAACRandom: - private static final long serialVersionUID - private static final int SIZE_L - private static final int SIZE - private static final int H_SIZE - private static final int MASK - private static final int GLD_RATIO -org.apache.commons.math3.random.JDKRandomGenerator: - private static final long serialVersionUID -org.apache.commons.math3.random.MersenneTwister: - private static final long serialVersionUID - private static final int N - private static final int M -org.apache.commons.math3.random.RandomAdaptor: - private static final long serialVersionUID -org.apache.commons.math3.random.RandomDataGenerator: - private static final long serialVersionUID -org.apache.commons.math3.random.RandomDataImpl: - private static final long serialVersionUID -org.apache.commons.math3.random.SobolSequenceGenerator: - private static final int BITS - private static final int MAX_DIMENSION - private static final java.lang.String RESOURCE_NAME - private static final java.lang.String FILE_CHARSET -org.apache.commons.math3.random.Well1024a: - private static final long serialVersionUID - private static final int K - private static final int M1 - private static final int M2 - private static final int M3 -org.apache.commons.math3.random.Well19937a: - private static final long serialVersionUID - private static final int K - private static final int M1 - private static final int M2 - private static final int M3 -org.apache.commons.math3.random.Well19937c: - private static final long serialVersionUID - private static final int K - private static final int M1 - private static final int M2 - private static final int M3 -org.apache.commons.math3.random.Well44497a: - private static final long serialVersionUID - private static final int K - private static final int M1 - private static final int M2 - private static final int M3 -org.apache.commons.math3.random.Well44497b: - private static final long serialVersionUID - private static final int K - private static final int M1 - private static final int M2 - private static final int M3 -org.apache.commons.math3.random.Well512a: - private static final long serialVersionUID - private static final int K - private static final int M1 - private static final int M2 - private static final int M3 -org.apache.commons.math3.special.BesselJ: - private static final double PI2 - private static final double TOWPI1 - private static final double TWOPI2 - private static final double TWOPI - private static final double ENTEN - private static final double ENSIG - private static final double RTNSIG - private static final double ENMTEN - private static final double X_MIN - private static final double X_MAX -org.apache.commons.math3.special.Beta: - private static final double DEFAULT_EPSILON - private static final double HALF_LOG_TWO_PI -org.apache.commons.math3.special.Erf: - private static final double X_CRIT -org.apache.commons.math3.special.Gamma: - private static final double DEFAULT_EPSILON - private static final double SQRT_TWO_PI - private static final double C_LIMIT - private static final double S_LIMIT - private static final double INV_GAMMA1P_M1_A0 - private static final double INV_GAMMA1P_M1_A1 - private static final double INV_GAMMA1P_M1_B1 - private static final double INV_GAMMA1P_M1_B2 - private static final double INV_GAMMA1P_M1_B3 - private static final double INV_GAMMA1P_M1_B4 - private static final double INV_GAMMA1P_M1_B5 - private static final double INV_GAMMA1P_M1_B6 - private static final double INV_GAMMA1P_M1_B7 - private static final double INV_GAMMA1P_M1_B8 - private static final double INV_GAMMA1P_M1_P0 - private static final double INV_GAMMA1P_M1_P1 - private static final double INV_GAMMA1P_M1_P2 - private static final double INV_GAMMA1P_M1_P3 - private static final double INV_GAMMA1P_M1_P4 - private static final double INV_GAMMA1P_M1_P5 - private static final double INV_GAMMA1P_M1_P6 - private static final double INV_GAMMA1P_M1_Q1 - private static final double INV_GAMMA1P_M1_Q2 - private static final double INV_GAMMA1P_M1_Q3 - private static final double INV_GAMMA1P_M1_Q4 - private static final double INV_GAMMA1P_M1_C - private static final double INV_GAMMA1P_M1_C0 - private static final double INV_GAMMA1P_M1_C1 - private static final double INV_GAMMA1P_M1_C2 - private static final double INV_GAMMA1P_M1_C3 - private static final double INV_GAMMA1P_M1_C4 - private static final double INV_GAMMA1P_M1_C5 - private static final double INV_GAMMA1P_M1_C6 - private static final double INV_GAMMA1P_M1_C7 - private static final double INV_GAMMA1P_M1_C8 - private static final double INV_GAMMA1P_M1_C9 - private static final double INV_GAMMA1P_M1_C10 - private static final double INV_GAMMA1P_M1_C11 - private static final double INV_GAMMA1P_M1_C12 - private static final double INV_GAMMA1P_M1_C13 -org.apache.commons.math3.stat.Frequency: - private static final long serialVersionUID -org.apache.commons.math3.stat.Frequency$NaturalComparator: - private static final long serialVersionUID -org.apache.commons.math3.stat.clustering.Cluster: - private static final long serialVersionUID -org.apache.commons.math3.stat.clustering.EuclideanDoublePoint: - private static final long serialVersionUID -org.apache.commons.math3.stat.clustering.EuclideanIntegerPoint: - private static final long serialVersionUID -org.apache.commons.math3.stat.correlation.StorelessBivariateCovariance: - 116:116:public double getN() -org.apache.commons.math3.stat.descriptive.AggregateSummaryStatistics: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.AggregateSummaryStatistics$AggregatingSummaryStatistics: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.DescriptiveStatistics: - private static final long serialVersionUID - private static final java.lang.String SET_QUANTILE_METHOD_NAME -org.apache.commons.math3.stat.descriptive.MultivariateSummaryStatistics: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.StatisticalSummaryValues: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.SummaryStatistics: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.SynchronizedDescriptiveStatistics: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.SynchronizedMultivariateSummaryStatistics: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.SynchronizedSummaryStatistics: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.FirstMoment: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.FourthMoment: - private static final long serialVersionUID - 81:83:FourthMoment(org.apache.commons.math3.stat.descriptive.moment.FourthMoment) -org.apache.commons.math3.stat.descriptive.moment.GeometricMean: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.Kurtosis: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.Mean: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.SecondMoment: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.SemiVariance: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.Skewness: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.StandardDeviation: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.ThirdMoment: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.Variance: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.VectorialCovariance: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.moment.VectorialMean: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.rank.Max: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.rank.Median: - private static final long serialVersionUID - private static final double FIXED_QUANTILE_50 -org.apache.commons.math3.stat.descriptive.rank.Min: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.rank.PSquarePercentile: - private static final int PSQUARE_CONSTANT - private static final double DEFAULT_QUANTILE_DESIRED - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.rank.PSquarePercentile$FixedCapacityList: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.rank.PSquarePercentile$Marker: - private static final long serialVersionUID - 848:851:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.stat.descriptive.rank.PSquarePercentile$Markers: - private static final long serialVersionUID - private static final int LOW - private static final int HIGH - 536:546:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.stat.descriptive.rank.Percentile: - private static final long serialVersionUID - private static final int MAX_CACHED_LEVELS - private static final int PIVOTS_HEAP_LENGTH - 374:374:int medianOf3(double[],int,int) -org.apache.commons.math3.stat.descriptive.rank.Percentile$EstimationType: - 1069:1069:java.lang.String getName() -org.apache.commons.math3.stat.descriptive.summary.Product: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.summary.Sum: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.summary.SumOfLogs: - private static final long serialVersionUID -org.apache.commons.math3.stat.descriptive.summary.SumOfSquares: - private static final long serialVersionUID -org.apache.commons.math3.stat.regression.ModelSpecificationException: - private static final long serialVersionUID -org.apache.commons.math3.stat.regression.RegressionResults: - private static final int SSE_IDX - private static final int SST_IDX - private static final int RSQ_IDX - private static final int MSE_IDX - private static final int ADJRSQ_IDX - private static final long serialVersionUID -org.apache.commons.math3.stat.regression.SimpleRegression: - private static final long serialVersionUID -org.apache.commons.math3.transform.FastCosineTransformer: - static final long serialVersionUID -org.apache.commons.math3.transform.FastFourierTransformer: - static final long serialVersionUID -org.apache.commons.math3.transform.FastHadamardTransformer: - static final long serialVersionUID -org.apache.commons.math3.transform.FastSineTransformer: - static final long serialVersionUID -org.apache.commons.math3.util.BigReal: - private static final long serialVersionUID -org.apache.commons.math3.util.BigRealField: - private static final long serialVersionUID - 80:80:private java.lang.Object readResolve() -org.apache.commons.math3.util.BigRealField$LazyHolder: - 69:69:private BigRealField$LazyHolder() -org.apache.commons.math3.util.CentralPivotingStrategy: - private static final long serialVersionUID -org.apache.commons.math3.util.Combinations$LexicographicComparator: - private static final long serialVersionUID -org.apache.commons.math3.util.ContinuedFraction: - private static final double DEFAULT_EPSILON -org.apache.commons.math3.util.Decimal64: - private static final long serialVersionUID -org.apache.commons.math3.util.DefaultTransformer: - private static final long serialVersionUID -org.apache.commons.math3.util.FastMath: - static final int EXP_INT_TABLE_MAX_INDEX - static final int EXP_INT_TABLE_LEN - static final int LN_MANT_LEN - static final int EXP_FRAC_TABLE_LEN - private static final boolean RECOMPUTE_TABLES_AT_RUNTIME - private static final double LN_2_A - private static final double LN_2_B - private static final int SINE_TABLE_LEN - private static final long HEX_40000000 - private static final long MASK_30BITS - private static final int MASK_NON_SIGN_INT - private static final long MASK_NON_SIGN_LONG - private static final long MASK_DOUBLE_EXPONENT - private static final long MASK_DOUBLE_MANTISSA - private static final long IMPLICIT_HIGH_BIT - private static final double TWO_POWER_52 - private static final double F_1_3 - private static final double F_1_5 - private static final double F_1_7 - private static final double F_1_9 - private static final double F_1_11 - private static final double F_1_13 - private static final double F_1_15 - private static final double F_1_17 - private static final double F_3_4 - private static final double F_15_16 - private static final double F_13_14 - private static final double F_11_12 - private static final double F_9_10 - private static final double F_7_8 - private static final double F_5_6 - private static final double F_1_2 - private static final double F_1_4 -org.apache.commons.math3.util.FastMath$ExpFracTable: - 4175:4175:private FastMath$ExpFracTable() -org.apache.commons.math3.util.FastMath$ExpIntTable: - 4136:4136:private FastMath$ExpIntTable() -org.apache.commons.math3.util.FastMath$lnMant: - 4208:4208:private FastMath$lnMant() -org.apache.commons.math3.util.FastMathCalc: - private static final long HEX_40000000 - private static final java.lang.String TABLE_START_DECL - private static final java.lang.String TABLE_END_DECL - 88:89:private FastMathCalc() - 104:195:private static void buildSinCosTables(double[],double[],double[],double[],int,double[],double[]) - 207:239:static double slowCos(double,double[]) - 251:283:static double slowSin(double,double[]) - 295:320:static double slowexp(double,double[]) - 329:338:private static void split(double,double[]) - 345:357:private static void resplit(double[]) - 365:370:private static void splitMult(double[],double[],double[]) - 378:382:private static void splitAdd(double[],double[],double[]) - 403:430:static void splitReciprocal(double[],double[]) - 438:484:private static void quadMult(double[],double[],double[]) - 493:528:static double expint(int,double[]) - 550:590:static double[] slowLog(double) -org.apache.commons.math3.util.FastMathLiteralArrays: - 6133:6133:private FastMathLiteralArrays() -org.apache.commons.math3.util.IterationEvent: - private static final long serialVersionUID -org.apache.commons.math3.util.KthSelector: - private static final long serialVersionUID - private static final int MIN_SELECT_SIZE -org.apache.commons.math3.util.MedianOf3PivotingStrategy: - private static final long serialVersionUID -org.apache.commons.math3.util.OpenIntToDoubleHashMap: - private static final long serialVersionUID - private static final float LOAD_FACTOR - private static final int DEFAULT_EXPECTED_SIZE - private static final int RESIZE_MULTIPLIER - private static final int PERTURB_SHIFT - 591:593:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.util.OpenIntToFieldHashMap: - private static final long serialVersionUID - private static final float LOAD_FACTOR - private static final int DEFAULT_EXPECTED_SIZE - private static final int RESIZE_MULTIPLIER - private static final int PERTURB_SHIFT - 604:606:private void readObject(java.io.ObjectInputStream) -org.apache.commons.math3.util.Precision: - private static final long EXPONENT_OFFSET - private static final long SGN_MASK - private static final int SGN_MASK_FLOAT - private static final double POSITIVE_ZERO -org.apache.commons.math3.util.RandomPivotingStrategy: - private static final long serialVersionUID -org.apache.commons.math3.util.ResizableDoubleArray: - private static final long serialVersionUID - private static final int DEFAULT_INITIAL_CAPACITY - private static final double DEFAULT_EXPANSION_FACTOR - private static final double DEFAULT_CONTRACTION_DELTA - 834:834:synchronized int getInternalLength() -org.apache.commons.math3.util.TransformerMap: - private static final long serialVersionUID -org.apache.commons.net.MalformedServerReplyException: - private static final long serialVersionUID -org.apache.commons.net.ProtocolCommandEvent: - private static final long serialVersionUID -org.apache.commons.net.ProtocolCommandSupport: - private static final long serialVersionUID -org.apache.commons.net.SocketClient: - private static final int DEFAULT_CONNECT_TIMEOUT -org.apache.commons.net.finger.FingerClient: - private static final java.lang.String __LONG_FLAG -org.apache.commons.net.ftp.FTP: - private static final java.lang.String __modes -org.apache.commons.net.ftp.FTPClient: - 3953:3953:org.apache.commons.net.ftp.FTPFileEntryParser getEntryParser() -org.apache.commons.net.ftp.FTPClient$PropertiesSingleton: - 428:428:private FTPClient$PropertiesSingleton() -org.apache.commons.net.ftp.FTPCommand: - private static final int LAST - 152:157:static void checkArray() -org.apache.commons.net.ftp.FTPConnectionClosedException: - private static final long serialVersionUID -org.apache.commons.net.ftp.FTPFile: - private static final long serialVersionUID -org.apache.commons.net.ftp.FTPSClient: - private static final java.lang.String DEFAULT_PROT - private static final java.lang.String DEFAULT_PROTOCOL - private static final java.lang.String CMD_AUTH - private static final java.lang.String CMD_ADAT - private static final java.lang.String CMD_PROT - private static final java.lang.String CMD_PBSZ - private static final java.lang.String CMD_MIC - private static final java.lang.String CMD_CONF - private static final java.lang.String CMD_ENC - private static final java.lang.String CMD_CCC -org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory: - private static final java.lang.String JAVA_IDENTIFIER - private static final java.lang.String JAVA_QUALIFIED_NAME -org.apache.commons.net.ftp.parser.EnterpriseUnixFTPEntryParser: - private static final java.lang.String MONTHS - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.FTPTimestampParserImpl: - 398:398:boolean isLenientFutureDates() - 404:405:void setLenientFutureDates(boolean) -org.apache.commons.net.ftp.parser.MVSFTPEntryParser: - static final int UNKNOWN_LIST_TYPE - static final int FILE_LIST_TYPE - static final int MEMBER_LIST_TYPE - static final int UNIX_LIST_TYPE - static final int JES_LEVEL_1_LIST_TYPE - static final int JES_LEVEL_2_LIST_TYPE - static final java.lang.String DEFAULT_DATE_FORMAT - static final java.lang.String FILE_LIST_REGEX - static final java.lang.String MEMBER_LIST_REGEX - static final java.lang.String JES_LEVEL_1_LIST_REGEX - static final java.lang.String JES_LEVEL_2_LIST_REGEX -org.apache.commons.net.ftp.parser.MacOsPeterFTPEntryParser: - static final java.lang.String DEFAULT_DATE_FORMAT - static final java.lang.String DEFAULT_RECENT_DATE_FORMAT - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.NTFTPEntryParser: - private static final java.lang.String DEFAULT_DATE_FORMAT - private static final java.lang.String DEFAULT_DATE_FORMAT2 - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.NetwareFTPEntryParser: - private static final java.lang.String DEFAULT_DATE_FORMAT - private static final java.lang.String DEFAULT_RECENT_DATE_FORMAT - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.OS2FTPEntryParser: - private static final java.lang.String DEFAULT_DATE_FORMAT - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.OS400FTPEntryParser: - private static final java.lang.String DEFAULT_DATE_FORMAT - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.ParserInitializationException: - private static final long serialVersionUID -org.apache.commons.net.ftp.parser.UnixFTPEntryParser: - static final java.lang.String DEFAULT_DATE_FORMAT - static final java.lang.String DEFAULT_RECENT_DATE_FORMAT - static final java.lang.String NUMERIC_DATE_FORMAT - private static final java.lang.String JA_MONTH - private static final java.lang.String JA_DAY - private static final java.lang.String JA_YEAR - private static final java.lang.String DEFAULT_DATE_FORMAT_JA - private static final java.lang.String DEFAULT_RECENT_DATE_FORMAT_JA - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.VMSFTPEntryParser: - private static final java.lang.String DEFAULT_DATE_FORMAT - private static final java.lang.String REGEX -org.apache.commons.net.ftp.parser.VMSVersioningFTPEntryParser: - private static final java.lang.String PRE_PARSE_REGEX -org.apache.commons.net.imap.IMAPClient: - private static final char DQUOTE - private static final java.lang.String DQUOTE_S -org.apache.commons.net.imap.IMAPCommand: - 73:74:private IMAPCommand(java.lang.String,int) - 77:78:private IMAPCommand(java.lang.String,int,java.lang.String) - 89:90:private IMAPCommand(java.lang.String,int,java.lang.String,int) -org.apache.commons.net.imap.IMAPReply: - private static final java.lang.String IMAP_OK - private static final java.lang.String IMAP_NO - private static final java.lang.String IMAP_BAD - private static final java.lang.String IMAP_UNTAGGED_PREFIX - private static final java.lang.String IMAP_CONTINUATION_PREFIX - private static final java.lang.String TAGGED_RESPONSE - private static final java.lang.String UNTAGGED_RESPONSE -org.apache.commons.net.io.CRLFLineReader: - private static final char LF - private static final char CR -org.apache.commons.net.io.CopyStreamEvent: - private static final long serialVersionUID -org.apache.commons.net.io.CopyStreamException: - private static final long serialVersionUID -org.apache.commons.net.io.DotTerminatedMessageReader: - private static final char LF - private static final char CR - private static final int DOT -org.apache.commons.net.io.DotTerminatedMessageWriter: - private static final int __NOTHING_SPECIAL_STATE - private static final int __LAST_WAS_CR_STATE - private static final int __LAST_WAS_NL_STATE -org.apache.commons.net.io.ToNetASCIIInputStream: - private static final int __NOTHING_SPECIAL - private static final int __LAST_WAS_CR - private static final int __LAST_WAS_NL -org.apache.commons.net.nntp.NNTP: - private static final java.lang.String __DEFAULT_ENCODING -org.apache.commons.net.nntp.NNTPConnectionClosedException: - private static final long serialVersionUID -org.apache.commons.net.ntp.NtpV3Impl: - private static final int MODE_INDEX - private static final int MODE_SHIFT - private static final int VERSION_INDEX - private static final int VERSION_SHIFT - private static final int LI_INDEX - private static final int LI_SHIFT - private static final int STRATUM_INDEX - private static final int POLL_INDEX - private static final int PRECISION_INDEX - private static final int ROOT_DELAY_INDEX - private static final int ROOT_DISPERSION_INDEX - private static final int REFERENCE_ID_INDEX - private static final int REFERENCE_TIMESTAMP_INDEX - private static final int ORIGINATE_TIMESTAMP_INDEX - private static final int RECEIVE_TIMESTAMP_INDEX - private static final int TRANSMIT_TIMESTAMP_INDEX -org.apache.commons.net.ntp.TimeStamp: - private static final long serialVersionUID -org.apache.commons.net.pop3.POP3: - static final java.lang.String _OK - static final java.lang.String _OK_INT - static final java.lang.String _ERROR - static final java.lang.String _DEFAULT_ENCODING -org.apache.commons.net.pop3.POP3Command: - private static final int _NEXT_ -org.apache.commons.net.pop3.POP3SClient: - private static final int DEFAULT_POP3S_PORT - private static final java.lang.String DEFAULT_PROTOCOL -org.apache.commons.net.smtp.SMTP: - private static final java.lang.String __DEFAULT_ENCODING -org.apache.commons.net.smtp.SMTPCommand: - private static final int _NEXT_ -org.apache.commons.net.smtp.SMTPConnectionClosedException: - private static final long serialVersionUID -org.apache.commons.net.smtp.SMTPSClient: - private static final java.lang.String DEFAULT_PROTOCOL -org.apache.commons.net.telnet.InvalidTelnetOptionException: - private static final long serialVersionUID -org.apache.commons.net.telnet.Telnet: - static final boolean debug - static final boolean debugoptions - static final int _WILL_MASK - static final int _DO_MASK - static final int _REQUESTED_WILL_MASK - static final int _REQUESTED_DO_MASK - static final int DEFAULT_PORT - 92:142:Telnet() -org.apache.commons.net.telnet.TelnetCommand: - private static final int __FIRST_COMMAND - private static final int __LAST_COMMAND -org.apache.commons.net.telnet.TelnetInputStream: - private static final int EOF - private static final int WOULD_BLOCK - static final int _STATE_DATA - static final int _STATE_IAC - static final int _STATE_WILL - static final int _STATE_WONT - static final int _STATE_DO - static final int _STATE_DONT - static final int _STATE_SB - static final int _STATE_SE - static final int _STATE_CR - static final int _STATE_IAC_SB - 79:80:TelnetInputStream(java.io.InputStream,org.apache.commons.net.telnet.TelnetClient) -org.apache.commons.net.telnet.TelnetOption: - private static final int __FIRST_OPTION - private static final int __LAST_OPTION -org.apache.commons.net.tftp.TFTP: - static final int PACKET_SIZE -org.apache.commons.net.tftp.TFTPPacket: - static final int MIN_PACKET_SIZE -org.apache.commons.net.tftp.TFTPPacketException: - private static final long serialVersionUID -org.apache.commons.net.util.Base64: - private static final int DEFAULT_BUFFER_RESIZE_FACTOR - private static final int DEFAULT_BUFFER_SIZE - static final int CHUNK_SIZE - private static final byte PAD - private static final int MASK_6BITS - private static final int MASK_8BITS - 351:351:boolean hasData() - 1040:1040:int getLineLength() - 1044:1044:byte[] getLineSeparator() -org.apache.commons.net.util.ListenerList: - private static final long serialVersionUID -org.apache.commons.net.util.SubnetUtils: - private static final java.lang.String IP_ADDRESS - private static final java.lang.String SLASH_FORMAT - private static final int NBITS -org.apache.commons.net.util.SubnetUtils$SubnetInfo: - private static final long UNSIGNED_INT_MASK -org.apache.html.dom.CollectionIndex: - int getIndex() -org.apache.html.dom.HTMLAnchorElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLAppletElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLAreaElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLBRElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLBaseElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLBaseFontElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLBodyElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLButtonElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLCollectionImpl: - private static final long serialVersionUID - static final short ANCHOR - static final short FORM - static final short IMAGE - static final short APPLET - static final short LINK - static final short OPTION - static final short ROW - static final short ELEMENT - static final short AREA - static final short TBODY - static final short CELL -org.apache.html.dom.HTMLDListElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLDirectoryElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLDivElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLDocumentImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLFieldSetElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLFontElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLFormElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLFrameElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLFrameSetElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLHRElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLHeadElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLHeadingElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLHtmlElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLIFrameElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLImageElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLInputElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLIsIndexElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLLIElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLLabelElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLLegendElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLLinkElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLMapElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLMenuElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLMetaElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLModElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLOListElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLObjectElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLOptGroupElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLOptionElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLParagraphElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLParamElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLPreElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLQuoteElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLScriptElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLSelectElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLStyleElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTableCaptionElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTableCellElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTableColElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTableElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTableRowElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTableSectionElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTextAreaElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLTitleElementImpl: - private static final long serialVersionUID -org.apache.html.dom.HTMLUListElementImpl: - private static final long serialVersionUID -org.apache.html.dom.ObjectFactory: - private static final java.lang.String DEFAULT_PROPERTIES_FILENAME - private static final int DEFAULT_LINE_LENGTH - static java.lang.Object createObject(java.lang.String,java.lang.String) - static java.lang.Object createObject(java.lang.String,java.lang.String,java.lang.String) - private static void debugPrintln(java.lang.String) - static java.lang.ClassLoader findClassLoader() - static java.lang.Object newInstance(java.lang.String,java.lang.ClassLoader,boolean) - private static java.lang.Object findJarServiceProvider(java.lang.String) -org.apache.html.dom.ObjectFactory$ConfigurationError: - static final long serialVersionUID - private java.lang.Exception exception - ObjectFactory$ConfigurationError(java.lang.String,java.lang.Exception) - java.lang.Exception getException() -org.apache.html.dom.SecuritySupport: - static java.lang.ClassLoader getContextClassLoader() - static java.lang.ClassLoader getSystemClassLoader() - static java.lang.ClassLoader getParentClassLoader(java.lang.ClassLoader) - static java.io.FileInputStream getFileInputStream(java.io.File) - static java.io.InputStream getResourceAsStream(java.lang.ClassLoader,java.lang.String) - static boolean getFileExists(java.io.File) - static long getLastModified(java.io.File) - private SecuritySupport() -org.apache.html.dom.SecuritySupport$1 -org.apache.html.dom.SecuritySupport$2 -org.apache.html.dom.SecuritySupport$3 -org.apache.html.dom.SecuritySupport$5 -org.apache.html.dom.SecuritySupport$6 -org.apache.html.dom.SecuritySupport$7 -org.apache.html.dom.SecuritySupport$8 -org.apache.jcp.xml.dsig.internal.dom.DOMDigestMethod: - static final java.lang.String SHA384 -org.apache.jcp.xml.dsig.internal.dom.DOMHMACSignatureMethod: - static final java.lang.String HMAC_SHA256 - static final java.lang.String HMAC_SHA384 - static final java.lang.String HMAC_SHA512 -org.apache.jcp.xml.dsig.internal.dom.DOMKeyValue: - private static final java.lang.String XMLDSIG_11_XMLNS -org.apache.jcp.xml.dsig.internal.dom.DOMSignatureMethod: - static final java.lang.String RSA_SHA256 - static final java.lang.String RSA_SHA384 - static final java.lang.String RSA_SHA512 - static final java.lang.String ECDSA_SHA1 - static final java.lang.String ECDSA_SHA256 - static final java.lang.String ECDSA_SHA384 - static final java.lang.String ECDSA_SHA512 -org.apache.jcp.xml.dsig.internal.dom.DOMSignedInfo: - private static final java.lang.String ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5 - private static final java.lang.String ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5 -org.apache.jcp.xml.dsig.internal.dom.DOMTransform: - 204:206:javax.xml.crypto.Data transform(javax.xml.crypto.Data,javax.xml.crypto.XMLCryptoContext,javax.xml.crypto.dsig.dom.DOMSignContext) -org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI: - static final long serialVersionUID - private static final java.lang.String INFO -org.apache.poi.EmptyFileException: - private static final long serialVersionUID -org.apache.poi.EncryptedDocumentException: - private static final long serialVersionUID -org.apache.poi.OldFileFormatException: - private static final long serialVersionUID -org.apache.poi.UnsupportedFileFormatException: - private static final long serialVersionUID -org.apache.poi.Version: - private static final java.lang.String VERSION_STRING - private static final java.lang.String RELEASE_DATE -org.apache.poi.ddf.EscherArrayProperty: - private static final int MAX_RECORD_LENGTH - private static final int FIXED_SIZE -org.apache.poi.ddf.EscherBSERecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.ddf.EscherBitmapBlip: - private static final int HEADER_SIZE -org.apache.poi.ddf.EscherBlipRecord: - private static final int MAX_RECORD_LENGTH - private static final int HEADER_SIZE -org.apache.poi.ddf.EscherClientAnchorRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.ddf.EscherClientDataRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.ddf.EscherMetafileBlip: - private static final int MAX_RECORD_LENGTH - private static final int HEADER_SIZE -org.apache.poi.ddf.EscherPictBlip: - private static final int MAX_RECORD_LENGTH - private static final int HEADER_SIZE -org.apache.poi.ddf.EscherPropertyFactory: - private static final int MAX_RECORD_LENGTH -org.apache.poi.ddf.EscherTextboxRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.ddf.UnknownEscherRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hpsf.Array$ArrayHeader: - 70:70:int getType() -org.apache.poi.hpsf.Blob: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hpsf.ClipboardData: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hpsf.CodePageString: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hpsf.Currency: - private static final int SIZE -org.apache.poi.hpsf.Date: - private static final int SIZE -org.apache.poi.hpsf.HPSFRuntimeException: - private static final long serialVersionUID -org.apache.poi.hpsf.PropertySet: - static final int BYTE_ORDER_ASSERTION - static final int FORMAT_ASSERTION - static final int OFFSET_HEADER -org.apache.poi.hpsf.Section: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hpsf.UnicodeString: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hpsf.VariantBool: - static final int SIZE -org.apache.poi.hpsf.VariantSupport: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.dev.BiffDrawingToXml: - private static final java.lang.String SHEET_NAME_PARAM - private static final java.lang.String SHEET_INDEXES_PARAM - private static final java.lang.String EXCLUDE_WORKBOOK_RECORDS -org.apache.poi.hssf.dev.BiffViewer: - private static final int DUMP_LINE_LEN -org.apache.poi.hssf.extractor.OldExcelExtractor: - private static final int FILE_PASS_RECORD_SID - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.model.InternalWorkbook: - private static final int MAX_SENSITIVE_SHEET_NAME_LEN - private static final short CODEPAGE -org.apache.poi.hssf.model.LinkTable$CRNBlock: - 89:89:public org.apache.poi.hssf.record.CRNRecord[] getCrns() -org.apache.poi.hssf.model.RecordOrderer: - 85:87:private RecordOrderer() -org.apache.poi.hssf.record.ArrayRecord: - private static final int OPT_ALWAYS_RECALCULATE - private static final int OPT_CALCULATE_ON_OPEN -org.apache.poi.hssf.record.CFRule12Record: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.CFRuleBase$ComparisonOperator: - private static final byte max_operator -org.apache.poi.hssf.record.CRNCountRecord: - private static final short DATA_SIZE -org.apache.poi.hssf.record.DConRefRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.DrawingGroupRecord: - static final int MAX_RECORD_SIZE - private static final int MAX_DATA_SIZE -org.apache.poi.hssf.record.DrawingSelectionRecord$OfficeArtRecordHeader: - public static final int ENCODED_SIZE -org.apache.poi.hssf.record.EmbeddedObjectRefSubRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.EndSubRecord: - private static final int ENCODED_SIZE -org.apache.poi.hssf.record.EscherAggregate: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.ExternSheetRecord$RefSubRecord: - public static final int ENCODED_SIZE - 43:45:public void adjustIndex(int) -org.apache.poi.hssf.record.ExternalNameRecord: - private static final int OPT_BUILTIN_NAME - private static final int OPT_AUTOMATIC_LINK - private static final int OPT_PICTURE_LINK - private static final int OPT_STD_DOCUMENT_NAME - private static final int OPT_OLE_LINK - private static final int OPT_ICONIFIED_PICTURE_LINK -org.apache.poi.hssf.record.FilePassRecord: - private static final int ENCRYPTION_XOR - private static final int ENCRYPTION_OTHER -org.apache.poi.hssf.record.FormulaRecord$SpecialCachedValue: - private static final long BIT_MARKER - private static final int VARIABLE_DATA_LENGTH - private static final int DATA_INDEX - public static final int STRING - public static final int BOOLEAN - public static final int ERROR_CODE - public static final int EMPTY -org.apache.poi.hssf.record.FtCblsSubRecord: - private static final int ENCODED_SIZE -org.apache.poi.hssf.record.GroupMarkerSubRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.HyperlinkRecord: - private static final int MAX_RECORD_LENGTH - static final int HLINK_URL - static final int HLINK_ABS - static final int HLINK_LABEL - static final int HLINK_PLACE - private static final int HLINK_TARGET_FRAME - private static final int HLINK_UNC_PATH - 330:330:org.apache.poi.hssf.record.HyperlinkRecord$GUID getGuid() - 338:338:org.apache.poi.hssf.record.HyperlinkRecord$GUID getMoniker() - 432:432:int getLinkOptions() -org.apache.poi.hssf.record.HyperlinkRecord$GUID: - private static final int TEXT_FORMAT_LENGTH - public static final int ENCODED_SIZE - 99:99:public int getD1() - 103:103:public int getD2() - 107:107:public int getD3() -org.apache.poi.hssf.record.MulRKRecord$RkRec: - public static final int ENCODED_SIZE -org.apache.poi.hssf.record.NameRecord$Option: - public static final int OPT_HIDDEN_NAME - public static final int OPT_FUNCTION_NAME - public static final int OPT_COMMAND_NAME - public static final int OPT_MACRO - public static final int OPT_COMPLEX - public static final int OPT_BUILTIN - public static final int OPT_BINDATA - 61:61:private NameRecord$Option() -org.apache.poi.hssf.record.NoteStructureSubRecord: - private static final int ENCODED_SIZE -org.apache.poi.hssf.record.ObjRecord: - private static final int NORMAL_PAD_ALIGNMENT -org.apache.poi.hssf.record.OldLabelRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.OldSheetRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.OldStringRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.PaletteRecord$PColor: - public static final short ENCODED_SIZE -org.apache.poi.hssf.record.RecordFactory: - private static final int NUM_RECORDS -org.apache.poi.hssf.record.RecordInputStream: - private static final int INVALID_SID_VALUE - private static final int MAX_RECORD_LENGTH - private static final int DATA_LEN_NEEDS_TO_BE_READ -org.apache.poi.hssf.record.RowRecord: - private static final int OPTION_BITS_ALWAYS_SET -org.apache.poi.hssf.record.SSTRecord: - static final int STD_RECORD_OVERHEAD - static final int SST_RECORD_OVERHEAD - static final int MAX_DATA_SPACE - 262:262:java.util.Iterator getStrings() - 269:269:int countStrings() - 280:280:org.apache.poi.hssf.record.SSTDeserializer getDeserializer() -org.apache.poi.hssf.record.SubRecord: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.SupBookRecord: - private static final short SMALL_RECORD_SIZE - private static final short TAG_INTERNAL_REFERENCES - private static final short TAG_ADD_IN_FUNCTIONS -org.apache.poi.hssf.record.TextObjectRecord: - private static final int FORMAT_RUN_ENCODED_SIZE -org.apache.poi.hssf.record.WriteAccessRecord: - private static final byte PAD_CHAR - private static final int DATA_SIZE -org.apache.poi.hssf.record.aggregates.CFRecordsAggregate: - private static final int MAX_97_2003_CONDTIONAL_FORMAT_RULES -org.apache.poi.hssf.record.aggregates.ColumnInfoRecordsAggregate: - 103:103:int getNumColumns() -org.apache.poi.hssf.record.aggregates.ValueRecordsAggregate: - private static final int MAX_ROW_INDEX - private static final int INDEX_NOT_SET -org.apache.poi.hssf.record.cf.FontFormatting: - private static final int OFFSET_FONT_NAME - private static final int OFFSET_FONT_HEIGHT - private static final int OFFSET_FONT_OPTIONS - private static final int OFFSET_FONT_WEIGHT - private static final int OFFSET_ESCAPEMENT_TYPE - private static final int OFFSET_UNDERLINE_TYPE - private static final int OFFSET_FONT_COLOR_INDEX - private static final int OFFSET_OPTION_FLAGS - private static final int OFFSET_ESCAPEMENT_TYPE_MODIFIED - private static final int OFFSET_UNDERLINE_TYPE_MODIFIED - private static final int OFFSET_FONT_WEIGHT_MODIFIED - private static final int OFFSET_NOT_USED1 - private static final int OFFSET_NOT_USED2 - private static final int OFFSET_NOT_USED3 - private static final int OFFSET_FONT_FORMATING_END - private static final int RAW_DATA_SIZE - private static final short FONT_WEIGHT_NORMAL - private static final short FONT_WEIGHT_BOLD -org.apache.poi.hssf.record.chart.ChartFRTInfoRecord$CFRTID: - public static final int ENCODED_SIZE -org.apache.poi.hssf.record.chart.ChartTitleFormatRecord$CTFormat: - public static final int ENCODED_SIZE -org.apache.poi.hssf.record.chart.SeriesTextRecord: - private static final int MAX_LEN -org.apache.poi.hssf.record.common.UnicodeString: - private static final int MAX_RECORD_LENGTH - 660:666:void setExtendedRst(org.apache.poi.hssf.record.common.UnicodeString$ExtRst) -org.apache.poi.hssf.record.cont.UnknownLengthRecordOutput: - private static final int MAX_DATA_SIZE -org.apache.poi.hssf.record.crypto.Biff8DecryptingStream: - private static final int MAX_RECORD_LENGTH -org.apache.poi.hssf.record.pivottable.ExtendedPivotTableViewFieldsRecord: - private static final int STRING_NOT_PRESENT_LEN -org.apache.poi.hssf.record.pivottable.PageItemRecord$FieldInfo: - public static final int ENCODED_SIZE -org.apache.poi.hssf.record.pivottable.ViewFieldsRecord: - private static final int STRING_NOT_PRESENT_LEN - private static final int BASE_SIZE -org.apache.poi.hssf.record.pivottable.ViewFieldsRecord$Axis -org.apache.poi.hssf.usermodel.EscherGraphics: - 550:550:org.apache.poi.hssf.usermodel.HSSFShapeGroup getEscherGraphics() -org.apache.poi.hssf.usermodel.HSSFCell: - private static final java.lang.String FILE_FORMAT_NAME -org.apache.poi.hssf.usermodel.HSSFComment: - private static final int FILL_TYPE_SOLID - private static final int FILL_TYPE_PICTURE - private static final int GROUP_SHAPE_PROPERTY_DEFAULT_VALUE - private static final int GROUP_SHAPE_HIDDEN_MASK - private static final int GROUP_SHAPE_NOT_HIDDEN_MASK -org.apache.poi.hssf.usermodel.HSSFConditionalFormattingRule: - private static final byte CELL_COMPARISON -org.apache.poi.hssf.usermodel.HSSFFont: - static final short BOLDWEIGHT_NORMAL - static final short BOLDWEIGHT_BOLD -org.apache.poi.hssf.usermodel.HSSFSheet: - private static final int DEBUG - private static final float PX_DEFAULT - private static final float PX_MODIFIED -org.apache.poi.hssf.usermodel.HSSFWorkbook: - private static final int MAX_RECORD_LENGTH - private static final int MAX_STYLES - private static final int DEBUG -org.apache.poi.hssf.usermodel.HeaderFooter$MarkupTag: - 344:344:public boolean occursPairs() -org.apache.poi.poifs.common.package-info -org.apache.poi.poifs.crypt.ChunkedCipherInputStream: - private static final int MAX_RECORD_LENGTH -org.apache.poi.poifs.crypt.ChunkedCipherOutputStream: - private static final int MAX_RECORD_LENGTH - private static final int STREAMING -org.apache.poi.poifs.crypt.CryptoFunctions: - private static final int MAX_RECORD_LENGTH -org.apache.poi.poifs.crypt.DataSpaceMapUtils: - private static final int MAX_RECORD_LENGTH -org.apache.poi.poifs.crypt.package-info -org.apache.poi.poifs.crypt.standard.StandardEncryptionVerifier: - private static final int SPIN_COUNT -org.apache.poi.poifs.dev.POIFSDump: - private static final int MAX_RECORD_LENGTH -org.apache.poi.poifs.dev.package-info -org.apache.poi.poifs.eventfilesystem.package-info -org.apache.poi.poifs.filesystem.DocumentInputStream: - private static final int EOF -org.apache.poi.poifs.filesystem.DocumentNode: - 61:61:org.apache.poi.poifs.filesystem.POIFSDocument getDocument() -org.apache.poi.poifs.filesystem.Ole10Native: - private static final int MAX_RECORD_LENGTH - private static final java.lang.String OLE_MARKER_NAME -org.apache.poi.poifs.filesystem.POIFSDocument: - private static final int MAX_RECORD_LENGTH - 174:174:int getDocumentBlockSize() -org.apache.poi.poifs.filesystem.POIFSFileSystem: - private static final int MAX_RECORD_LENGTH - private static final int MAX_BLOCK_COUNT -org.apache.poi.poifs.filesystem.POIFSStream: - 105:108:void updateContents(byte[]) -org.apache.poi.poifs.filesystem.package-info -org.apache.poi.poifs.macros.VBAMacroReader: - private static final int STREAMNAME_RESERVED - private static final int PROJECT_CONSTANTS_RESERVED - private static final int HELP_FILE_PATH_RESERVED - private static final int REFERENCE_NAME_RESERVED - private static final int DOC_STRING_RESERVED - private static final int MODULE_DOCSTRING_RESERVED -org.apache.poi.poifs.macros.VBAMacroReader$ASCIIUnicodeStringPair: - 440:440:private java.lang.String getUnicode() -org.apache.poi.poifs.nio.ByteArrayBackedDataSource: - private static final int MAX_RECORD_LENGTH -org.apache.poi.poifs.package-info -org.apache.poi.poifs.property.Property: - private static final byte _default_fill - private static final int _name_size_offset - private static final int _max_name_length - private static final int _node_color_offset - private static final int _previous_property_offset - private static final int _next_property_offset - private static final int _child_property_offset - private static final int _storage_clsid_offset - private static final int _user_flags_offset - private static final int _seconds_1_offset - private static final int _days_1_offset - private static final int _seconds_2_offset - private static final int _days_2_offset - private static final int _start_block_offset - private static final int _size_offset - private static final int _big_block_minimum_bytes -org.apache.poi.poifs.property.PropertyFactory: - 41:42:private PropertyFactory() -org.apache.poi.poifs.property.PropertyTable: - private static final int MAX_RECORD_LENGTH -org.apache.poi.poifs.property.RootProperty: - private static final java.lang.String NAME -org.apache.poi.poifs.property.package-info -org.apache.poi.poifs.storage.HeaderBlock: - private static final int MAX_RECORD_LENGTH - private static final byte _default_value -org.apache.poi.poifs.storage.package-info -org.apache.poi.sl.draw.DrawPictureShape: - private static final java.lang.String WMF_IMAGE_RENDERER -org.apache.poi.sl.draw.DrawSimpleShape: - private static final double DECO_SIZE_POW -org.apache.poi.sl.draw.binding.package-info -org.apache.poi.sl.draw.geom.BuiltInGuide: - 30:30:public java.lang.String getName() -org.apache.poi.sl.draw.geom.Guide: - 64:64:java.lang.String getFormula() -org.apache.poi.sl.image.ImageHeaderEMF: - private static final java.lang.String EMF_SIGNATURE -org.apache.poi.sl.usermodel.AutoNumberingScheme: - private static final java.lang.String ARABIC_LIST - private static final java.lang.String ALPHA_LIST - private static final java.lang.String WINGDINGS_WHITE_LIST - private static final java.lang.String WINGDINGS_BLACK_LIST - private static final java.lang.String CIRCLE_DB_LIST -org.apache.poi.ss.extractor.EmbeddedExtractor: - private static final int MAX_RECORD_LENGTH - private static final java.lang.String CONTENT_TYPE_BYTES - private static final java.lang.String CONTENT_TYPE_PDF - private static final java.lang.String CONTENT_TYPE_DOC - private static final java.lang.String CONTENT_TYPE_XLS -org.apache.poi.ss.format.CellElapsedFormatter: - private static final double HOUR__FACTOR - private static final double MIN__FACTOR - private static final double SEC__FACTOR -org.apache.poi.ss.format.CellFormat: - private static final java.lang.String INVALID_VALUE_FOR_FORMAT -org.apache.poi.ss.format.CellFormatCondition: - private static final int LT - private static final int LE - private static final int GT - private static final int GE - private static final int EQ - private static final int NE -org.apache.poi.ss.format.CellFormatType: - abstract org.apache.poi.ss.format.CellFormatter formatter(java.lang.String) -org.apache.poi.ss.format.CellFormatType$1: - 35:35:org.apache.poi.ss.format.CellFormatter formatter(java.lang.String) -org.apache.poi.ss.format.CellFormatType$2: - 47:47:org.apache.poi.ss.format.CellFormatter formatter(java.lang.String) -org.apache.poi.ss.format.CellFormatType$3: - 59:59:org.apache.poi.ss.format.CellFormatter formatter(java.lang.String) -org.apache.poi.ss.format.CellFormatType$4: - 71:71:org.apache.poi.ss.format.CellFormatter formatter(java.lang.String) -org.apache.poi.ss.format.CellFormatType$5: - 83:83:org.apache.poi.ss.format.CellFormatter formatter(java.lang.String) -org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment$WorkbookNotFoundException: - private static final long serialVersionUID -org.apache.poi.ss.formula.Formula: - private static final int MAX_ENCODED_LEN -org.apache.poi.ss.formula.FormulaCellCache: - 43:45:public org.apache.poi.ss.formula.CellCacheEntry[] getCacheEntries() -org.apache.poi.ss.formula.FormulaParser: - private static final char TAB - private static final char CR - private static final char LF - private static final java.lang.String specHeaders - private static final java.lang.String specAll - private static final java.lang.String specData - private static final java.lang.String specTotals - private static final java.lang.String specThisRow -org.apache.poi.ss.formula.OperationEvaluationContext: - 93:93:org.apache.poi.ss.formula.SheetRangeEvaluator createExternSheetRefEvaluator(org.apache.poi.ss.formula.ExternSheetReferenceToken) -org.apache.poi.ss.formula.OperationEvaluatorFactory: - 70:72:private OperationEvaluatorFactory() -org.apache.poi.ss.formula.SheetNameFormatter: - private static final char DELIMITER -org.apache.poi.ss.formula.WorkbookEvaluator: - 237:237:int getSheetIndexByExternIndex(int) -org.apache.poi.ss.formula.atp.YearFracCalculator: - private static final int MS_PER_HOUR - private static final int MS_PER_DAY - private static final int DAYS_PER_NORMAL_YEAR - private static final int DAYS_PER_LEAP_YEAR - private static final int LONG_MONTH_LEN - private static final int SHORT_MONTH_LEN - private static final int SHORT_FEB_LEN - private static final int LONG_FEB_LEN - 46:48:private YearFracCalculator() -org.apache.poi.ss.formula.atp.YearFracCalculator$SimpleDate: - public static final int JANUARY - public static final int FEBRUARY -org.apache.poi.ss.formula.constant.ConstantValueParser: - private static final int TYPE_EMPTY - private static final int TYPE_NUMBER - private static final int TYPE_STRING - private static final int TYPE_BOOLEAN - private static final int TYPE_ERROR_CODE - private static final int TRUE_ENCODING - private static final int FALSE_ENCODING -org.apache.poi.ss.formula.eval.FunctionEval$FunctionID -org.apache.poi.ss.formula.eval.NotImplementedException: - private static final long serialVersionUID -org.apache.poi.ss.formula.eval.NotImplementedFunctionException: - private static final long serialVersionUID -org.apache.poi.ss.formula.eval.OperandResolver: - private static final java.lang.String Digits - private static final java.lang.String Exp - private static final java.lang.String fpRegex -org.apache.poi.ss.formula.function.FunctionMetadata: - private static final short FUNCTION_MAX_PARAMS -org.apache.poi.ss.formula.function.FunctionMetadataReader: - private static final int MAX_RECORD_LENGTH - private static final java.lang.String METADATA_FILE_NAME - private static final java.lang.String ELLIPSIS -org.apache.poi.ss.formula.function.FunctionMetadataRegistry: - 57:57:java.util.Set getAllFunctionNames() -org.apache.poi.ss.formula.functions.CountUtils: - 32:34:private CountUtils() -org.apache.poi.ss.formula.functions.Countif$CmpOp: - public static final int NONE - public static final int EQ - public static final int NE - public static final int LE - public static final int LT - public static final int GT - public static final int GE -org.apache.poi.ss.formula.functions.Dec2Bin: - private static final long MIN_VALUE - private static final long MAX_VALUE - private static final int DEFAULT_PLACES_VALUE -org.apache.poi.ss.formula.functions.Dec2Hex: - private static final int DEFAULT_PLACES_VALUE -org.apache.poi.ss.formula.functions.Even: - private static final long PARITY_MASK -org.apache.poi.ss.formula.functions.Hex2Dec: - static final int HEXADECIMAL_BASE - static final int MAX_NUMBER_OF_PLACES -org.apache.poi.ss.formula.functions.LookupUtils: - 38:38:LookupUtils() -org.apache.poi.ss.formula.functions.MathX: - 30:32:private MathX() -org.apache.poi.ss.formula.functions.NumericFunction: - static final double ZERO - static final double TEN -org.apache.poi.ss.formula.functions.NumericFunction$36: - private static final double DEFAULT_RETURN_RESULT -org.apache.poi.ss.formula.functions.Oct2Dec: - static final int MAX_NUMBER_OF_PLACES - static final int OCTAL_BASE -org.apache.poi.ss.formula.functions.Odd: - private static final long PARITY_MASK -org.apache.poi.ss.formula.functions.Offset: - private static final int LAST_VALID_ROW_INDEX - private static final int LAST_VALID_COLUMN_INDEX -org.apache.poi.ss.formula.functions.StatsLib: - 29:31:private StatsLib() -org.apache.poi.ss.formula.functions.TimeFunc: - private static final int SECONDS_PER_MINUTE - private static final int SECONDS_PER_HOUR - private static final int HOURS_PER_DAY - private static final int SECONDS_PER_DAY -org.apache.poi.ss.formula.functions.Value: - private static final int MIN_DISTANCE_BETWEEN_THOUSANDS_SEPARATOR -org.apache.poi.ss.formula.ptg.AbstractFunctionPtg: - private static final short FUNCTION_INDEX_EXTERNAL -org.apache.poi.ss.formula.ptg.AddPtg: - private static final java.lang.String ADD -org.apache.poi.ss.formula.ptg.Area2DPtgBase: - private static final int SIZE -org.apache.poi.ss.formula.ptg.Area3DPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.ArrayPtg: - private static final int RESERVED_FIELD_LEN -org.apache.poi.ss.formula.ptg.AttrPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.ConcatPtg: - private static final java.lang.String CONCAT -org.apache.poi.ss.formula.ptg.ErrPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.ExpPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.ExternSheetNameResolver: - 29:31:private ExternSheetNameResolver() -org.apache.poi.ss.formula.ptg.FuncVarPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.GreaterThanPtg: - private static final java.lang.String GREATERTHAN -org.apache.poi.ss.formula.ptg.IntPtg: - private static final int MIN_VALUE - private static final int MAX_VALUE -org.apache.poi.ss.formula.ptg.LessThanPtg: - private static final java.lang.String LESSTHAN -org.apache.poi.ss.formula.ptg.MemAreaPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.MemErrPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.MissingArgPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.NamePtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.NameXPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.ParenthesisPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.PercentPtg: - private static final java.lang.String PERCENT -org.apache.poi.ss.formula.ptg.Ref2DPtgBase: - private static final int SIZE -org.apache.poi.ss.formula.ptg.Ref3DPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.RefErrorPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.StringPtg: - private static final char FORMULA_DELIMITER -org.apache.poi.ss.formula.ptg.TblPtg: - private static final int SIZE -org.apache.poi.ss.formula.ptg.UnaryMinusPtg: - private static final java.lang.String MINUS -org.apache.poi.ss.formula.ptg.UnaryPlusPtg: - private static final java.lang.String ADD -org.apache.poi.ss.usermodel.DataFormatter: - private static final java.lang.String defaultFractionWholePartFormat - private static final java.lang.String defaultFractionFractionPartFormat -org.apache.poi.ss.usermodel.DateUtil: - private static final int BAD_DATE -org.apache.poi.ss.usermodel.ExcelGeneralNumberFormat: - private static final long serialVersionUID -org.apache.poi.ss.usermodel.FractionFormat: - private static final int MAX_DENOM_POW -org.apache.poi.ss.util.AreaReference: - private static final char SHEET_NAME_DELIMITER - private static final char CELL_DELIMITER - private static final char SPECIAL_NAME_DELIMITER -org.apache.poi.ss.util.CellReference: - private static final char ABSOLUTE_REFERENCE_MARKER - private static final char SHEET_NAME_DELIMITER - private static final char SPECIAL_NAME_DELIMITER -org.apache.poi.ss.util.ExpandedDouble: - 95:95:public java.math.BigInteger getSignificand() -org.apache.poi.ss.util.IEEEDouble: - private static final long EXPONENT_MASK - private static final int EXPONENT_SHIFT - public static final long FRAC_MASK - public static final int EXPONENT_BIAS - public static final long FRAC_ASSUMED_HIGH_BIT - public static final int BIASED_EXPONENT_SPECIAL_VALUE - 26:26:IEEEDouble() -org.apache.poi.ss.util.MutableFPNumber: - private static final int C_64 - private static final int MIN_PRECISION - 63:63:public org.apache.poi.ss.util.MutableFPNumber copy() - 199:199:public org.apache.poi.ss.util.ExpandedDouble createExpandedDouble() -org.apache.poi.ss.util.MutableFPNumber$Rounder: - 132:132:private MutableFPNumber$Rounder() -org.apache.poi.ss.util.NormalisedDecimal: - private static final int EXPONENT_OFFSET - private static final int LOG_BASE_10_OF_2_TIMES_2_POW_20 - private static final int C_2_POW_19 - private static final int FRAC_HALF - private static final long MAX_REP_WHOLE_PART - 177:180:public org.apache.poi.ss.util.ExpandedDouble normaliseBaseTwo() - 187:189:java.math.BigInteger composeFrac() -org.apache.poi.ss.util.NumberToTextConverter: - private static final long EXCEL_NAN_BITS - private static final int MAX_TEXT_LEN -org.apache.poi.ss.util.SheetUtil: - private static final char defaultChar - private static final double fontHeightMultiple -org.apache.poi.util.ByteField: - private static final byte _default_value -org.apache.poi.util.DefaultTempFileCreationStrategy: - static final java.lang.String POIFILES -org.apache.poi.util.IOUtils: - private static final int SKIP_BUFFER_SIZE -org.apache.poi.util.IntList: - private static final int _default_size -org.apache.poi.util.IntMapper: - private static final int _default_size -org.apache.poi.util.LZWDecompresser: - private static final int MAX_RECORD_LENGTH -org.apache.poi.util.LittleEndian$BufferUnderrunException: - private static final long serialVersionUID -org.apache.poi.util.LittleEndianCP950Reader: - private static final char UNMAPPABLE - private static final char range1Low - private static final char range1High - private static final char range2Low - private static final char range2High - private static final char range3Low - private static final char range3High - private static final char range4Low - private static final char range4High - int cnt -org.apache.poi.util.LittleEndianInputStream: - private static final int EOF -org.apache.poi.util.StringUtil: - private static final int MAX_RECORD_LENGTH -org.apache.wml.dom.WMLAElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLAccessElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLAnchorElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLBElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLBigElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLBrElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLCardElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLDoElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLDocumentImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLEmElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLFieldsetElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLGoElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLHeadElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLIElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLImgElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLInputElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLMetaElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLNoopElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLOneventElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLOptgroupElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLOptionElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLPElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLPostfieldElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLPrevElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLRefreshElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLSelectElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLSetvarElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLSmallElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLStrongElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLTableElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLTdElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLTemplateElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLTimerElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLTrElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLUElementImpl: - private static final long serialVersionUID -org.apache.wml.dom.WMLWmlElementImpl: - private static final long serialVersionUID -org.apache.xerces.dom.AttrImpl: - static final long serialVersionUID - static final java.lang.String DTD_URI - private void writeObject(java.io.ObjectOutputStream) - private void readObject(java.io.ObjectInputStream) -org.apache.xerces.dom.AttrNSImpl: - static final long serialVersionUID - static final java.lang.String xmlnsURI - static final java.lang.String xmlURI -org.apache.xerces.dom.AttributeMap: - static final long serialVersionUID -org.apache.xerces.dom.CDATASectionImpl: - static final long serialVersionUID -org.apache.xerces.dom.CharacterDataImpl: - static final long serialVersionUID -org.apache.xerces.dom.ChildNode: - static final long serialVersionUID -org.apache.xerces.dom.CommentImpl: - static final long serialVersionUID -org.apache.xerces.dom.CoreDOMImplementationImpl: - private static final int SIZE -org.apache.xerces.dom.CoreDocumentImpl: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.apache.xerces.dom.DOMNormalizer: - final java.lang.String normalizeAttributeValue(java.lang.String,org.w3c.dom.Attr) -org.apache.xerces.dom.DeferredAttrImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredAttrNSImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredCDATASectionImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredCommentImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredDocumentImpl: - static final long serialVersionUID - private static final boolean DEBUG_PRINT_REF_COUNTS - private static final boolean DEBUG_PRINT_TABLES - private static final boolean DEBUG_IDS - boolean getNamespacesEnabled() - void setNamespacesEnabled(boolean) - private final java.lang.String getNodeValue(int,int) - private static void print(int[],int,int,int,int) -org.apache.xerces.dom.DeferredDocumentTypeImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredElementDefinitionImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredElementImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredElementNSImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredEntityImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredEntityReferenceImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredNotationImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredProcessingInstructionImpl: - static final long serialVersionUID -org.apache.xerces.dom.DeferredTextImpl: - static final long serialVersionUID -org.apache.xerces.dom.DocumentFragmentImpl: - static final long serialVersionUID -org.apache.xerces.dom.DocumentImpl: - static final long serialVersionUID -org.apache.xerces.dom.DocumentImpl$EnclosingAttr: - private static final long serialVersionUID -org.apache.xerces.dom.DocumentImpl$LEntry: - private static final long serialVersionUID -org.apache.xerces.dom.DocumentTypeImpl: - static final long serialVersionUID -org.apache.xerces.dom.ElementDefinitionImpl: - static final long serialVersionUID -org.apache.xerces.dom.ElementImpl: - static final long serialVersionUID -org.apache.xerces.dom.ElementNSImpl: - static final long serialVersionUID - static final java.lang.String xmlURI -org.apache.xerces.dom.EntityImpl: - static final long serialVersionUID -org.apache.xerces.dom.EntityReferenceImpl: - static final long serialVersionUID -org.apache.xerces.dom.NamedNodeMapImpl: - static final long serialVersionUID - boolean getReadOnly() - final boolean changed() - final void changed(boolean) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.apache.xerces.dom.NodeImpl: - static final long serialVersionUID - private void writeObject(java.io.ObjectOutputStream) -org.apache.xerces.dom.NodeListCache: - private static final long serialVersionUID -org.apache.xerces.dom.NotationImpl: - static final long serialVersionUID -org.apache.xerces.dom.ObjectFactory: - private static final java.lang.String DEFAULT_PROPERTIES_FILENAME - private static final int DEFAULT_LINE_LENGTH - static java.lang.Object createObject(java.lang.String,java.lang.String) - static java.lang.Object createObject(java.lang.String,java.lang.String,java.lang.String) - private static java.lang.Object findJarServiceProvider(java.lang.String) -org.apache.xerces.dom.ObjectFactory$ConfigurationError: - static final long serialVersionUID - java.lang.Exception getException() -org.apache.xerces.dom.PSVIAttrNSImpl: - static final long serialVersionUID - private void writeObject(java.io.ObjectOutputStream) - private void readObject(java.io.ObjectInputStream) -org.apache.xerces.dom.PSVIDocumentImpl: - static final long serialVersionUID - private void writeObject(java.io.ObjectOutputStream) - private void readObject(java.io.ObjectInputStream) -org.apache.xerces.dom.PSVIElementNSImpl: - static final long serialVersionUID - private void writeObject(java.io.ObjectOutputStream) - private void readObject(java.io.ObjectInputStream) -org.apache.xerces.dom.ParentNode: - static final long serialVersionUID - private void writeObject(java.io.ObjectOutputStream) - private void readObject(java.io.ObjectInputStream) -org.apache.xerces.dom.ParentNode$UserDataRecord: - private static final long serialVersionUID -org.apache.xerces.dom.ProcessingInstructionImpl: - static final long serialVersionUID -org.apache.xerces.dom.RangeExceptionImpl: - static final long serialVersionUID -org.apache.xerces.dom.RangeImpl: - static final int EXTRACT_CONTENTS - static final int CLONE_CONTENTS - static final int DELETE_CONTENTS - void deleteData(org.w3c.dom.CharacterData,int,int) - void insertData(org.w3c.dom.CharacterData,int,java.lang.String) - org.w3c.dom.Node removeChild(org.w3c.dom.Node,org.w3c.dom.Node) -org.apache.xerces.dom.SecuritySupport: - static java.io.FileInputStream getFileInputStream(java.io.File) - static java.io.InputStream getResourceAsStream(java.lang.ClassLoader,java.lang.String) - static boolean getFileExists(java.io.File) - static long getLastModified(java.io.File) - private SecuritySupport() -org.apache.xerces.dom.SecuritySupport$5 -org.apache.xerces.dom.SecuritySupport$6 -org.apache.xerces.dom.SecuritySupport$7 -org.apache.xerces.dom.SecuritySupport$8 -org.apache.xerces.dom.TextImpl: - static final long serialVersionUID -org.apache.xerces.impl.Version: - private static final java.lang.String fImmutableVersion -org.apache.xerces.impl.XMLDTDScannerImpl: - private static final boolean DEBUG_SCANNER_STATE - private static java.lang.String getScannerStateName(int) -org.apache.xerces.impl.XMLDocumentFragmentScannerImpl: - private static final boolean DEBUG_SCANNER_STATE - private static final boolean DEBUG_DISPATCHER -org.apache.xerces.impl.XMLEntityManager: - private static final boolean DEBUG_BUFFER - private static final boolean DEBUG_ENTITIES - private static final boolean DEBUG_ENCODINGS - private static final boolean DEBUG_RESOLVER -org.apache.xerces.impl.XMLEntityManager$ByteBufferPool: - private static final int DEFAULT_POOL_SIZE -org.apache.xerces.impl.XMLEntityManager$CharacterBufferPool: - private static final int DEFAULT_POOL_SIZE -org.apache.xerces.impl.XMLEntityScanner: - private static final boolean DEBUG_ENCODINGS - private static final boolean DEBUG_BUFFER -org.apache.xerces.impl.XMLEntityScanner$1: - private static final long serialVersionUID -org.apache.xerces.impl.dtd.DTDGrammar: - private static final int CHUNK_SHIFT - private static final int CHUNK_SIZE - private static final int CHUNK_MASK - private static final int INITIAL_CHUNK_COUNT - private static final short LIST_FLAG - private static final short LIST_MASK - private static final boolean DEBUG -org.apache.xerces.impl.dtd.DTDGrammar$QNameHashtable: - private static final int INITIAL_BUCKET_SIZE - private static final int HASHTABLE_SIZE -org.apache.xerces.impl.dtd.XML11DTDProcessor: - XML11DTDProcessor(org.apache.xerces.util.SymbolTable,org.apache.xerces.xni.grammars.XMLGrammarPool,org.apache.xerces.impl.XMLErrorReporter,org.apache.xerces.xni.parser.XMLEntityResolver) -org.apache.xerces.impl.dtd.XMLDTDProcessor: - private static final int TOP_LEVEL_SCOPE -org.apache.xerces.impl.dtd.XMLDTDValidator: - private static final int TOP_LEVEL_SCOPE - private static final boolean DEBUG_ATTRIBUTES - private static final boolean DEBUG_ELEMENT_CHILDREN - private int getContentSpecType(int) -org.apache.xerces.impl.dtd.models.CMAny: - final int getType() - final void setPosition(int) -org.apache.xerces.impl.dtd.models.CMLeaf: - final int getPosition() -org.apache.xerces.impl.dtd.models.CMNode: - final void setFollowPos(org.apache.xerces.impl.dtd.models.CMStateSet) -org.apache.xerces.impl.dtd.models.DFAContentModel: - private static final boolean DEBUG_VALIDATE_CONTENT - private void dumpTree(org.apache.xerces.impl.dtd.models.CMNode,int) -org.apache.xerces.impl.dv.DTDDVFactory: - private static final java.lang.String DEFAULT_FACTORY_CLASS -org.apache.xerces.impl.dv.DVFactoryException: - static final long serialVersionUID -org.apache.xerces.impl.dv.DatatypeException: - static final long serialVersionUID -org.apache.xerces.impl.dv.InvalidDatatypeFacetException: - static final long serialVersionUID -org.apache.xerces.impl.dv.InvalidDatatypeValueException: - static final long serialVersionUID -org.apache.xerces.impl.dv.ObjectFactory: - private static final java.lang.String DEFAULT_PROPERTIES_FILENAME - private static final int DEFAULT_LINE_LENGTH - static java.lang.Object createObject(java.lang.String,java.lang.String) - static java.lang.Object createObject(java.lang.String,java.lang.String,java.lang.String) - private static java.lang.Object findJarServiceProvider(java.lang.String) -org.apache.xerces.impl.dv.ObjectFactory$ConfigurationError: - static final long serialVersionUID - java.lang.Exception getException() -org.apache.xerces.impl.dv.SchemaDVFactory: - private static final java.lang.String DEFAULT_FACTORY_CLASS -org.apache.xerces.impl.dv.SecuritySupport: - static java.io.FileInputStream getFileInputStream(java.io.File) - static java.io.InputStream getResourceAsStream(java.lang.ClassLoader,java.lang.String) - static boolean getFileExists(java.io.File) - static long getLastModified(java.io.File) - private SecuritySupport() -org.apache.xerces.impl.dv.SecuritySupport$5 -org.apache.xerces.impl.dv.SecuritySupport$6 -org.apache.xerces.impl.dv.SecuritySupport$7 -org.apache.xerces.impl.dv.SecuritySupport$8 -org.apache.xerces.impl.dv.util.Base64: - private static final int BASELENGTH - private static final int LOOKUPLENGTH - private static final int TWENTYFOURBITGROUP - private static final int EIGHTBIT - private static final int SIXTEENBIT - private static final int SIXBIT - private static final int FOURBYTE - private static final int SIGN - private static final char PAD - private static final boolean fDebug -org.apache.xerces.impl.dv.util.HexBin: - private static final int BASELENGTH - private static final int LOOKUPLENGTH -org.apache.xerces.impl.dv.xs.AbstractDateTimeDV: - private static final boolean DEBUG -org.apache.xerces.impl.dv.xs.BaseDVFactory: - static final java.lang.String URI_SCHEMAFORSCHEMA -org.apache.xerces.impl.dv.xs.BaseSchemaDVFactory: - static final java.lang.String URI_SCHEMAFORSCHEMA -org.apache.xerces.impl.dv.xs.DayDV: - private static final int DAY_SIZE -org.apache.xerces.impl.dv.xs.FullDVFactory: - static final java.lang.String URI_SCHEMAFORSCHEMA -org.apache.xerces.impl.dv.xs.MonthDayDV: - private static final int MONTHDAY_SIZE -org.apache.xerces.impl.dv.xs.PrecisionDecimalDV$XPrecisionDecimal: - private int compareFractionalPart(org.apache.xerces.impl.dv.xs.PrecisionDecimalDV$XPrecisionDecimal) -org.apache.xerces.impl.dv.xs.SchemaDateTimeException: - static final long serialVersionUID -org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl: - static final short NORMALIZE_NONE - static final short NORMALIZE_TRIM - static final short NORMALIZE_FULL - static final short SPECIAL_PATTERN_NONE - static final short SPECIAL_PATTERN_NMTOKEN - static final short SPECIAL_PATTERN_NAME - static final short SPECIAL_PATTERN_NCNAME - static final java.lang.String URI_SCHEMAFORSCHEMA - static final java.lang.String ANY_TYPE - static final int DERIVATION_ANY - static final int DERIVATION_RESTRICTION - static final int DERIVATION_EXTENSION - static final int DERIVATION_UNION - static final int DERIVATION_LIST -org.apache.xerces.impl.io.MalformedByteSequenceException: - static final long serialVersionUID -org.apache.xerces.impl.io.UTF8Reader: - private static final boolean DEBUG_READ -org.apache.xerces.impl.xpath.XPath: - private static final boolean DEBUG_ALL - private static final boolean DEBUG_XPATH_PARSE - private static final boolean DEBUG_ANY -org.apache.xerces.impl.xpath.XPath$Scanner: - private static final byte CHARTYPE_INVALID - private static final byte CHARTYPE_OTHER - private static final byte CHARTYPE_WHITESPACE - private static final byte CHARTYPE_EXCLAMATION - private static final byte CHARTYPE_QUOTE - private static final byte CHARTYPE_DOLLAR - private static final byte CHARTYPE_OPEN_PAREN - private static final byte CHARTYPE_CLOSE_PAREN - private static final byte CHARTYPE_STAR - private static final byte CHARTYPE_PLUS - private static final byte CHARTYPE_COMMA - private static final byte CHARTYPE_MINUS - private static final byte CHARTYPE_PERIOD - private static final byte CHARTYPE_SLASH - private static final byte CHARTYPE_DIGIT - private static final byte CHARTYPE_COLON - private static final byte CHARTYPE_LESS - private static final byte CHARTYPE_EQUAL - private static final byte CHARTYPE_GREATER - private static final byte CHARTYPE_ATSIGN - private static final byte CHARTYPE_LETTER - private static final byte CHARTYPE_OPEN_BRACKET - private static final byte CHARTYPE_CLOSE_BRACKET - private static final byte CHARTYPE_UNDERSCORE - private static final byte CHARTYPE_UNION - private static final byte CHARTYPE_NONASCII -org.apache.xerces.impl.xpath.XPath$Tokens: - static final boolean DUMP_TOKENS - public static final int EXPRTOKEN_OPEN_PAREN - public static final int EXPRTOKEN_CLOSE_PAREN - public static final int EXPRTOKEN_OPEN_BRACKET - public static final int EXPRTOKEN_CLOSE_BRACKET - public static final int EXPRTOKEN_PERIOD - public static final int EXPRTOKEN_DOUBLE_PERIOD - public static final int EXPRTOKEN_ATSIGN - public static final int EXPRTOKEN_COMMA - public static final int EXPRTOKEN_DOUBLE_COLON - public static final int EXPRTOKEN_NAMETEST_ANY - public static final int EXPRTOKEN_NAMETEST_NAMESPACE - public static final int EXPRTOKEN_NAMETEST_QNAME - public static final int EXPRTOKEN_NODETYPE_COMMENT - public static final int EXPRTOKEN_NODETYPE_TEXT - public static final int EXPRTOKEN_NODETYPE_PI - public static final int EXPRTOKEN_NODETYPE_NODE - public static final int EXPRTOKEN_OPERATOR_AND - public static final int EXPRTOKEN_OPERATOR_OR - public static final int EXPRTOKEN_OPERATOR_MOD - public static final int EXPRTOKEN_OPERATOR_DIV - public static final int EXPRTOKEN_OPERATOR_MULT - public static final int EXPRTOKEN_OPERATOR_SLASH - public static final int EXPRTOKEN_OPERATOR_DOUBLE_SLASH - public static final int EXPRTOKEN_OPERATOR_UNION - public static final int EXPRTOKEN_OPERATOR_PLUS - public static final int EXPRTOKEN_OPERATOR_MINUS - public static final int EXPRTOKEN_OPERATOR_EQUAL - public static final int EXPRTOKEN_OPERATOR_NOT_EQUAL - public static final int EXPRTOKEN_OPERATOR_LESS - public static final int EXPRTOKEN_OPERATOR_LESS_EQUAL - public static final int EXPRTOKEN_OPERATOR_GREATER - public static final int EXPRTOKEN_OPERATOR_GREATER_EQUAL - public static final int EXPRTOKEN_FUNCTION_NAME - public static final int EXPRTOKEN_AXISNAME_ANCESTOR - public static final int EXPRTOKEN_AXISNAME_ANCESTOR_OR_SELF - public static final int EXPRTOKEN_AXISNAME_ATTRIBUTE - public static final int EXPRTOKEN_AXISNAME_CHILD - public static final int EXPRTOKEN_AXISNAME_DESCENDANT - public static final int EXPRTOKEN_AXISNAME_DESCENDANT_OR_SELF - public static final int EXPRTOKEN_AXISNAME_FOLLOWING - public static final int EXPRTOKEN_AXISNAME_FOLLOWING_SIBLING - public static final int EXPRTOKEN_AXISNAME_NAMESPACE - public static final int EXPRTOKEN_AXISNAME_PARENT - public static final int EXPRTOKEN_AXISNAME_PRECEDING - public static final int EXPRTOKEN_AXISNAME_PRECEDING_SIBLING - public static final int EXPRTOKEN_AXISNAME_SELF - public static final int EXPRTOKEN_LITERAL - public static final int EXPRTOKEN_NUMBER - public static final int EXPRTOKEN_VARIABLE_REFERENCE - private static final int INITIAL_TOKEN_COUNT - public void rewind() - public void dumpTokens() -org.apache.xerces.impl.xpath.XPathException: - static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.CaseInsensitiveMap: - CaseInsensitiveMap() -org.apache.xerces.impl.xpath.regex.Op: - static final int DOT - static final int CHAR - static final int RANGE - static final int NRANGE - static final int ANCHOR - static final int STRING - static final int CLOSURE - static final int NONGREEDYCLOSURE - static final int QUESTION - static final int NONGREEDYQUESTION - static final int UNION - static final int CAPTURE - static final int BACKREFERENCE - static final int LOOKAHEAD - static final int NEGATIVELOOKAHEAD - static final int LOOKBEHIND - static final int NEGATIVELOOKBEHIND - static final int INDEPENDENT - static final int MODIFIER - static final int CONDITION - static final boolean COUNT -org.apache.xerces.impl.xpath.regex.ParseException: - static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.ParserForXMLSchema: - private static final java.lang.String SPACES - private static final java.lang.String NAMECHARS - private static final java.lang.String LETTERS - private static final java.lang.String DIGITS -org.apache.xerces.impl.xpath.regex.REUtil: - static final int CACHESIZE - static void dumpString(java.lang.String) -org.apache.xerces.impl.xpath.regex.RangeToken: - private static final long serialVersionUID - private static final int MAPSIZE - synchronized org.apache.xerces.impl.xpath.regex.RangeToken getCaseInsensitiveToken() - void dumpRanges() -org.apache.xerces.impl.xpath.regex.RegexParser: - static final int T_CHAR - static final int T_EOF - static final int T_OR - static final int T_STAR - static final int T_PLUS - static final int T_QUESTION - static final int T_LPAREN - static final int T_RPAREN - static final int T_DOT - static final int T_LBRACKET - static final int T_BACKSOLIDUS - static final int T_CARET - static final int T_DOLLAR - static final int T_LPAREN2 - static final int T_LOOKAHEAD - static final int T_NEGATIVELOOKAHEAD - static final int T_LOOKBEHIND - static final int T_NEGATIVELOOKBEHIND - static final int T_INDEPENDENT - static final int T_SET_OPERATIONS - static final int T_POSIX_CHARCLASS_START - static final int T_COMMENT - static final int T_MODIFIERS - static final int T_CONDITION - static final int T_XMLSCHEMA_CC_SUBTRACTION - protected static final int S_NORMAL - protected static final int S_INBRACKETS - protected static final int S_INXBRACKETS -org.apache.xerces.impl.xpath.regex.RegularExpression: - private static final long serialVersionUID - static final boolean DEBUG - static final int IGNORE_CASE - static final int SINGLE_LINE - static final int MULTIPLE_LINES - static final int EXTENDED_COMMENT - static final int USE_UNICODE_CATEGORY - static final int UNICODE_WORD_BOUNDARY - static final int PROHIBIT_HEAD_CHARACTER_OPTIMIZATION - static final int PROHIBIT_FIXED_STRING_OPTIMIZATION - static final int XMLSCHEMA_MODE - static final int SPECIAL_COMMA - private static final int WT_IGNORE - private static final int WT_LETTER - private static final int WT_OTHER - static final int LINE_FEED - static final int CARRIAGE_RETURN - static final int LINE_SEPARATOR - static final int PARAGRAPH_SEPARATOR - RegularExpression(java.lang.String,org.apache.xerces.impl.xpath.regex.Token,int,boolean,int) -org.apache.xerces.impl.xpath.regex.Token: - private static final long serialVersionUID - static final boolean COUNTTOKENS - static final int CHAR - static final int DOT - static final int CONCAT - static final int UNION - static final int CLOSURE - static final int RANGE - static final int NRANGE - static final int PAREN - static final int EMPTY - static final int ANCHOR - static final int NONGREEDYCLOSURE - static final int STRING - static final int BACKREFERENCE - static final int LOOKAHEAD - static final int NEGATIVELOOKAHEAD - static final int LOOKBEHIND - static final int NEGATIVELOOKBEHIND - static final int INDEPENDENT - static final int MODIFIERGROUP - static final int CONDITION - static final int UTF16_MAX - static final int FC_CONTINUE - static final int FC_TERMINAL - static final int FC_ANY - static final int CHAR_INIT_QUOTE - static final int CHAR_FINAL_QUOTE - static final int CHAR_LETTER - static final int CHAR_MARK - static final int CHAR_NUMBER - static final int CHAR_SEPARATOR - static final int CHAR_OTHER - static final int CHAR_PUNCTUATION - static final int CHAR_SYMBOL - static final java.lang.String blockRanges - private static final int NONBMP_BLOCK_START - static final java.lang.String viramaString - final int getMaxLength() -org.apache.xerces.impl.xpath.regex.Token$CharToken: - private static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.Token$ClosureToken: - private static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.Token$ConcatToken: - private static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.Token$ConditionToken: - private static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.Token$ModifierToken: - private static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.Token$ParenToken: - private static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.Token$StringToken: - private static final long serialVersionUID -org.apache.xerces.impl.xpath.regex.Token$UnionToken: - private static final long serialVersionUID -org.apache.xerces.impl.xs.FilePathToURI: - private FilePathToURI() -org.apache.xerces.impl.xs.SchemaGrammar: - private static final int BASICSET_COUNT - private static final int FULLSET_COUNT - private static final int GRAMMAR_XS - private static final int GRAMMAR_XSI - private static final int INITIAL_SIZE - private static final int INC_SIZE - private static final int REDEFINED_GROUP_INIT_SIZE - private static final short MAX_COMP_IDX -org.apache.xerces.impl.xs.SchemaGrammar$BuiltinAttrDecl: - public void setValues(java.lang.String,java.lang.String,org.apache.xerces.impl.dv.XSSimpleType,short,short,org.apache.xerces.impl.dv.ValidatedInfo,org.apache.xerces.impl.xs.XSComplexTypeDecl) -org.apache.xerces.impl.xs.SchemaGrammar$BuiltinSchemaGrammar: - private static final java.lang.String EXTENDED_SCHEMA_FACTORY_CLASS -org.apache.xerces.impl.xs.SchemaGrammar$XSAnyType: - public void setValues(java.lang.String,java.lang.String,org.apache.xerces.xs.XSTypeDefinition,short,short,short,short,boolean,org.apache.xerces.impl.xs.XSAttributeGroupDecl,org.apache.xerces.impl.dv.XSSimpleType,org.apache.xerces.impl.xs.XSParticleDecl) -org.apache.xerces.impl.xs.XMLSchemaException: - static final long serialVersionUID -org.apache.xerces.impl.xs.XMLSchemaLoader$LocationArray: - public int getLength() -org.apache.xerces.impl.xs.XMLSchemaValidator: - private static final boolean DEBUG - static final int INITIAL_STACK_SIZE - static final int INC_STACK_SIZE - private static final boolean DEBUG_NORMALIZATION - private static final int BUFFER_SIZE -org.apache.xerces.impl.xs.XSAttributeGroupDecl: - private static final int INITIAL_SIZE -org.apache.xerces.impl.xs.XSComplexTypeDecl: - static final int DERIVATION_ANY - static final int DERIVATION_RESTRICTION - static final int DERIVATION_EXTENSION - static final int DERIVATION_UNION - static final int DERIVATION_LIST - private static final short CT_IS_ABSTRACT - private static final short CT_HAS_TYPE_ID - private static final short CT_IS_ANONYMOUS -org.apache.xerces.impl.xs.XSConstraints: - static final int OCCURRENCE_UNKNOWN -org.apache.xerces.impl.xs.XSDeclarationPool: - private static final int CHUNK_SHIFT - private static final int CHUNK_SIZE - private static final int CHUNK_MASK - private static final int INITIAL_CHUNK_COUNT -org.apache.xerces.impl.xs.XSElementDecl: - static final int INITIAL_SIZE - private static final short CONSTRAINT_MASK - private static final short NILLABLE - private static final short ABSTRACT -org.apache.xerces.impl.xs.XSModelImpl: - private static final short MAX_COMP_IDX - private org.apache.xerces.util.SymbolHash buildSubGroups_Org() -org.apache.xerces.impl.xs.identity.XPathMatcher: - private java.lang.String normalize(java.lang.String) -org.apache.xerces.impl.xs.models.CMNodeFactory: - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String SECURITY_MANAGER - private static final boolean DEBUG - private static final int MULTIPLICITY -org.apache.xerces.impl.xs.models.XSAllCM: - private static final short STATE_START - private static final short STATE_VALID - private static final short STATE_CHILD -org.apache.xerces.impl.xs.models.XSCMLeaf: - final void setPosition(int) -org.apache.xerces.impl.xs.models.XSDFACM: - private static final boolean DEBUG - private static final boolean DEBUG_VALIDATE_CONTENT - private void dumpTree(org.apache.xerces.impl.dtd.models.CMNode,int) -org.apache.xerces.impl.xs.models.XSEmptyCM: - private static final short STATE_START -org.apache.xerces.impl.xs.opti.SchemaDOM: - static final int relationsRowResizeFactor - static final int relationsColResizeFactor - boolean hidden - void endSyntheticAnnotationElement(org.apache.xerces.xni.QName,boolean) -org.apache.xerces.impl.xs.opti.SchemaParsingConfig: - private static final boolean PRINT_EXCEPTION_STACK_TRACE -org.apache.xerces.impl.xs.traversers.Container: - static final int THRESHOLD -org.apache.xerces.impl.xs.traversers.StAXSchemaParser: - private static final int CHUNK_SIZE - private static final int CHUNK_MASK -org.apache.xerces.impl.xs.traversers.XSAnnotationInfo: - XSAnnotationInfo(java.lang.String,int,int,int) -org.apache.xerces.impl.xs.traversers.XSAttributeChecker: - private static final java.lang.String ELEMENT_N - private static final java.lang.String ELEMENT_R - private static final java.lang.String ATTRIBUTE_N - private static final java.lang.String ATTRIBUTE_R - static final int INIT_POOL_SIZE - static final int INC_POOL_SIZE -org.apache.xerces.impl.xs.traversers.XSDAbstractTraverser: - protected static final java.lang.String NO_NAME - protected static final int NOT_ALL_CONTEXT - protected static final int PROCESSING_ALL_EL - protected static final int GROUP_REF_WITH_ALL - protected static final int CHILD_OF_GROUP - protected static final int PROCESSING_ALL_GP -org.apache.xerces.impl.xs.traversers.XSDComplexTypeTraverser: - private static final int GLOBAL_NUM - private static final boolean DEBUG - private void traverseSimpleContentDecl(org.w3c.dom.Element) - private void traverseComplexContentDecl(org.w3c.dom.Element,boolean) -org.apache.xerces.impl.xs.traversers.XSDComplexTypeTraverser$ComplexTypeRecoverableError: - private static final long serialVersionUID -org.apache.xerces.impl.xs.traversers.XSDHandler: - private static final java.lang.String NAMESPACE_PREFIXES - static final int ATTRIBUTE_TYPE - static final int ATTRIBUTEGROUP_TYPE - static final int ELEMENT_TYPE - static final int GROUP_TYPE - static final int IDENTITYCONSTRAINT_TYPE - static final int NOTATION_TYPE - static final int TYPEDECL_TYPE - private static final int INIT_STACK_SIZE - private static final int INC_STACK_SIZE - private static final int INIT_KEYREF_STACK - private static final int INC_KEYREF_STACK_AMOUNT -org.apache.xerces.impl.xs.traversers.XSDHandler$SAX2XNIUtil: - private XSDHandler$SAX2XNIUtil() -org.apache.xerces.impl.xs.traversers.XSDocumentInfo: - void removeAnnotations() -org.apache.xerces.impl.xs.util.XIntPool: - private static final short POOL_SIZE -org.apache.xerces.impl.xs.util.XSObjectListImpl: - private static final int DEFAULT_SIZE -org.apache.xerces.jaxp.DocumentBuilderFactoryImpl: - private static final java.lang.String NAMESPACES_FEATURE - private static final java.lang.String VALIDATION_FEATURE - private static final java.lang.String XINCLUDE_FEATURE - private static final java.lang.String INCLUDE_IGNORABLE_WHITESPACE - private static final java.lang.String CREATE_ENTITY_REF_NODES_FEATURE - private static final java.lang.String INCLUDE_COMMENTS_FEATURE - private static final java.lang.String CREATE_CDATA_NODES_FEATURE -org.apache.xerces.jaxp.DocumentBuilderImpl: - private static final java.lang.String NAMESPACES_FEATURE - private static final java.lang.String INCLUDE_IGNORABLE_WHITESPACE - private static final java.lang.String CREATE_ENTITY_REF_NODES_FEATURE - private static final java.lang.String INCLUDE_COMMENTS_FEATURE - private static final java.lang.String CREATE_CDATA_NODES_FEATURE - private static final java.lang.String XINCLUDE_FEATURE - private static final java.lang.String XMLSCHEMA_VALIDATION_FEATURE - private static final java.lang.String VALIDATION_FEATURE - private static final java.lang.String SECURITY_MANAGER -org.apache.xerces.jaxp.JAXPValidatorComponent: - private static final java.lang.String ENTITY_MANAGER - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String SYMBOL_TABLE -org.apache.xerces.jaxp.JAXPValidatorComponent$1: - public org.w3c.dom.TypeInfo getAttributeTypeInfo(java.lang.String) - public org.w3c.dom.TypeInfo getAttributeTypeInfo(java.lang.String,java.lang.String) -org.apache.xerces.jaxp.JAXPValidatorComponent$XNI2SAX: - public org.xml.sax.ContentHandler getContentHandler() -org.apache.xerces.jaxp.SAXParserFactoryImpl: - private static final java.lang.String NAMESPACES_FEATURE - private static final java.lang.String VALIDATION_FEATURE - private static final java.lang.String XINCLUDE_FEATURE -org.apache.xerces.jaxp.SAXParserImpl: - private static final java.lang.String NAMESPACES_FEATURE - private static final java.lang.String NAMESPACE_PREFIXES_FEATURE - private static final java.lang.String VALIDATION_FEATURE - private static final java.lang.String XMLSCHEMA_VALIDATION_FEATURE - private static final java.lang.String XINCLUDE_FEATURE - private static final java.lang.String SECURITY_MANAGER -org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser: - boolean getFeature0(java.lang.String) - java.lang.Object getProperty0(java.lang.String) -org.apache.xerces.jaxp.SchemaValidatorConfiguration: - private static final java.lang.String SCHEMA_VALIDATION - private static final java.lang.String VALIDATION - private static final java.lang.String USE_GRAMMAR_POOL_ONLY - private static final java.lang.String PARSER_SETTINGS - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String VALIDATION_MANAGER - private static final java.lang.String XMLGRAMMAR_POOL -org.apache.xerces.jaxp.TeeXMLDocumentFilterImpl: - public org.apache.xerces.xni.XMLDocumentHandler getSide() -org.apache.xerces.jaxp.datatype.DurationImpl: - private static final long serialVersionUID - public int signum() - private java.lang.Object writeReplace() -org.apache.xerces.jaxp.datatype.SerializedDuration -org.apache.xerces.jaxp.datatype.SerializedXMLGregorianCalendar -org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl: - private static final long serialVersionUID - private static final int BILLION_I - private static final int YEAR - private static final int MONTH - private static final int DAY - private static final int HOUR - private static final int MINUTE - private static final int SECOND - private static final int MILLISECOND - private static final int TIMEZONE - public static javax.xml.datatype.XMLGregorianCalendar createDateTime(java.math.BigInteger,int,int,int,int,int,java.math.BigDecimal,int) - public static javax.xml.datatype.XMLGregorianCalendar createDateTime(int,int,int,int,int,int) - public static javax.xml.datatype.XMLGregorianCalendar createDate(int,int,int,int) - public static javax.xml.datatype.XMLGregorianCalendar createTime(int,int,int,int) - public static javax.xml.datatype.XMLGregorianCalendar createTime(int,int,int,java.math.BigDecimal,int) - public static javax.xml.datatype.XMLGregorianCalendar createTime(int,int,int,int,int) - private java.lang.Object writeReplace() -org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl$DaysInMonth: - private XMLGregorianCalendarImpl$DaysInMonth() -org.apache.xerces.jaxp.validation.AbstractXMLSchema: - public abstract boolean isFullyComposed() - public abstract org.apache.xerces.xni.grammars.XMLGrammarPool getGrammarPool() -org.apache.xerces.jaxp.validation.DOMValidatorHelper: - private static final int CHUNK_SIZE - private static final int CHUNK_MASK - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String NAMESPACE_CONTEXT - private static final java.lang.String SCHEMA_VALIDATOR - private static final java.lang.String SYMBOL_TABLE - private static final java.lang.String VALIDATION_MANAGER -org.apache.xerces.jaxp.validation.JAXPValidationMessageFormatter: - JAXPValidationMessageFormatter() -org.apache.xerces.jaxp.validation.SoftReferenceGrammarPool: - protected static final int TABLE_SIZE - public SoftReferenceGrammarPool(int) - public org.apache.xerces.xni.grammars.Grammar removeGrammar(org.apache.xerces.xni.grammars.XMLGrammarDescription) - public boolean containsGrammar(org.apache.xerces.xni.grammars.XMLGrammarDescription) -org.apache.xerces.jaxp.validation.StAXValidatorHelper: - private static final java.lang.String STRING_INTERNING - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String SCHEMA_VALIDATOR - private static final java.lang.String SYMBOL_TABLE - private static final java.lang.String VALIDATION_MANAGER -org.apache.xerces.jaxp.validation.StAXValidatorHelper$EventHelper: - private static final int CHUNK_SIZE - private static final int CHUNK_MASK -org.apache.xerces.jaxp.validation.StreamValidatorHelper: - private static final java.lang.String PARSER_SETTINGS - private static final java.lang.String ENTITY_RESOLVER - private static final java.lang.String ERROR_HANDLER - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String SCHEMA_VALIDATOR - private static final java.lang.String SYMBOL_TABLE - private static final java.lang.String VALIDATION_MANAGER - private static final java.lang.String SECURITY_MANAGER -org.apache.xerces.jaxp.validation.Util: - Util() - public static final org.apache.xerces.xni.parser.XMLInputSource toXMLInputSource(javax.xml.transform.stream.StreamSource) -org.apache.xerces.jaxp.validation.ValidatorHandlerImpl: - private static final java.lang.String NAMESPACE_PREFIXES - private static final java.lang.String STRING_INTERNING - private static final java.lang.String STRINGS_INTERNED - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String LEXICAL_HANDLER - private static final java.lang.String NAMESPACE_CONTEXT - private static final java.lang.String SCHEMA_VALIDATOR - private static final java.lang.String SECURITY_MANAGER - private static final java.lang.String SYMBOL_TABLE - private static final java.lang.String VALIDATION_MANAGER -org.apache.xerces.jaxp.validation.ValidatorHandlerImpl$ResolutionForwarder: - private static final java.lang.String XML_TYPE - public org.w3c.dom.ls.LSResourceResolver getEntityResolver() -org.apache.xerces.jaxp.validation.ValidatorHandlerImpl$XMLSchemaTypeInfoProvider: - public org.w3c.dom.TypeInfo getAttributeTypeInfo(java.lang.String,java.lang.String) - public org.w3c.dom.TypeInfo getAttributeTypeInfo(java.lang.String) -org.apache.xerces.jaxp.validation.ValidatorHelper -org.apache.xerces.jaxp.validation.ValidatorImpl: - private static final java.lang.String JAXP_SOURCE_RESULT_FEATURE_PREFIX - private static final java.lang.String CURRENT_ELEMENT_NODE -org.apache.xerces.jaxp.validation.XMLSchemaFactory: - private static final java.lang.String JAXP_SOURCE_FEATURE_PREFIX - private static final java.lang.String SCHEMA_FULL_CHECKING - private static final java.lang.String USE_GRAMMAR_POOL_ONLY - private static final java.lang.String XMLGRAMMAR_POOL - private static final java.lang.String SECURITY_MANAGER -org.apache.xerces.jaxp.validation.XMLSchemaFactory$XMLGrammarPoolImplExtension: - public XMLSchemaFactory$XMLGrammarPoolImplExtension(int) -org.apache.xerces.jaxp.validation.XMLSchemaFactory$XMLGrammarPoolWrapper: - org.apache.xerces.xni.grammars.XMLGrammarPool getGrammarPool() -org.apache.xerces.jaxp.validation.XMLSchemaValidatorComponentManager: - private static final java.lang.String SCHEMA_VALIDATION - private static final java.lang.String VALIDATION - private static final java.lang.String USE_GRAMMAR_POOL_ONLY - private static final java.lang.String IGNORE_XSI_TYPE - private static final java.lang.String ID_IDREF_CHECKING - private static final java.lang.String UNPARSED_ENTITY_CHECKING - private static final java.lang.String IDENTITY_CONSTRAINT_CHECKING - private static final java.lang.String DISALLOW_DOCTYPE_DECL_FEATURE - private static final java.lang.String NORMALIZE_DATA - private static final java.lang.String SCHEMA_ELEMENT_DEFAULT - private static final java.lang.String SCHEMA_AUGMENT_PSVI - private static final java.lang.String ENTITY_MANAGER - private static final java.lang.String ENTITY_RESOLVER - private static final java.lang.String ERROR_HANDLER - private static final java.lang.String ERROR_REPORTER - private static final java.lang.String NAMESPACE_CONTEXT - private static final java.lang.String SCHEMA_VALIDATOR - private static final java.lang.String SECURITY_MANAGER - private static final java.lang.String SYMBOL_TABLE - private static final java.lang.String VALIDATION_MANAGER - private static final java.lang.String XMLGRAMMAR_POOL - private static final java.lang.String LOCALE -org.apache.xerces.parsers.AbstractDOMParser: - private static final boolean DEBUG_EVENTS - private static final boolean DEBUG_BASEURI -org.apache.xerces.parsers.AbstractDOMParser$Abort: - private static final long serialVersionUID -org.apache.xerces.parsers.NonValidatingConfiguration: - private static final boolean PRINT_EXCEPTION_STACK_TRACE -org.apache.xerces.parsers.ObjectFactory: - private static final java.lang.String DEFAULT_PROPERTIES_FILENAME - private static final int DEFAULT_LINE_LENGTH -org.apache.xerces.parsers.ObjectFactory$ConfigurationError: - static final long serialVersionUID - java.lang.Exception getException() -org.apache.xerces.parsers.SecuritySupport: - private SecuritySupport() -org.apache.xerces.parsers.XMLGrammarPreparser: - private static final java.lang.String CONTINUE_AFTER_FATAL_ERROR -org.apache.xerces.util.AugmentationsImpl$SmallContainer: - static final int SIZE_LIMIT -org.apache.xerces.util.DOMEntityResolverWrapper: - private static final java.lang.String XML_TYPE - private static final java.lang.String XSD_TYPE -org.apache.xerces.util.DOMErrorHandlerWrapper$DOMErrorTypeMap: - private DOMErrorHandlerWrapper$DOMErrorTypeMap() -org.apache.xerces.util.DOMUtil$ThrowableMethods: - private DOMUtil$ThrowableMethods() -org.apache.xerces.util.DatatypeMessageFormatter: - private static final java.lang.String BASE_NAME -org.apache.xerces.util.SecurityManager: - private static final int DEFAULT_ENTITY_EXPANSION_LIMIT - private static final int DEFAULT_MAX_OCCUR_NODE_LIMIT -org.apache.xerces.util.URI: - static final long serialVersionUID - private static final int RESERVED_CHARACTERS - private static final int MARK_CHARACTERS - private static final int SCHEME_CHARACTERS - private static final int USERINFO_CHARACTERS - private static final int ASCII_ALPHA_CHARACTERS - private static final int ASCII_DIGIT_CHARACTERS - private static final int ASCII_HEX_CHARACTERS - private static final int PATH_CHARACTERS - private static final int MASK_ALPHA_NUMERIC - private static final int MASK_UNRESERVED_MASK - private static final int MASK_URI_CHARACTER - private static final int MASK_SCHEME_CHARACTER - private static final int MASK_USERINFO_CHARACTER - private static final int MASK_PATH_CHARACTER - private static boolean isReservedCharacter(char) - private static boolean isUnreservedCharacter(char) -org.apache.xerces.util.URI$MalformedURIException: - static final long serialVersionUID -org.apache.xerces.util.XMLGrammarPoolImpl: - private static final boolean DEBUG -org.apache.xerces.xinclude.ObjectFactory: - private static final java.lang.String DEFAULT_PROPERTIES_FILENAME - private static final int DEFAULT_LINE_LENGTH - static java.lang.Object createObject(java.lang.String,java.lang.String) - static java.lang.Object createObject(java.lang.String,java.lang.String,java.lang.String) - private static java.lang.Object findJarServiceProvider(java.lang.String) -org.apache.xerces.xinclude.ObjectFactory$ConfigurationError: - static final long serialVersionUID - java.lang.Exception getException() -org.apache.xerces.xinclude.SecuritySupport: - static java.io.FileInputStream getFileInputStream(java.io.File) - static java.io.InputStream getResourceAsStream(java.lang.ClassLoader,java.lang.String) - static boolean getFileExists(java.io.File) - static long getLastModified(java.io.File) - private SecuritySupport() -org.apache.xerces.xinclude.SecuritySupport$5 -org.apache.xerces.xinclude.SecuritySupport$6 -org.apache.xerces.xinclude.SecuritySupport$7 -org.apache.xerces.xinclude.SecuritySupport$8 -org.apache.xerces.xinclude.XIncludeHandler: - private static final int STATE_NORMAL_PROCESSING - private static final int STATE_IGNORE - private static final int STATE_EXPECT_FALLBACK - private static final int INITIAL_SIZE -org.apache.xerces.xni.XNIException: - static final long serialVersionUID -org.apache.xerces.xni.parser.XMLConfigurationException: - static final long serialVersionUID -org.apache.xerces.xni.parser.XMLParseException: - static final long serialVersionUID -org.apache.xerces.xpointer.ElementSchemePointer: - public ElementSchemePointer(org.apache.xerces.util.SymbolTable) -org.apache.xerces.xpointer.ElementSchemePointer$Scanner: - private static final byte CHARTYPE_INVALID - private static final byte CHARTYPE_OTHER - private static final byte CHARTYPE_MINUS - private static final byte CHARTYPE_PERIOD - private static final byte CHARTYPE_SLASH - private static final byte CHARTYPE_DIGIT - private static final byte CHARTYPE_LETTER - private static final byte CHARTYPE_UNDERSCORE - private static final byte CHARTYPE_NONASCII -org.apache.xerces.xpointer.ElementSchemePointer$Tokens: - private static final int XPTRTOKEN_ELEM_NCNAME - private static final int XPTRTOKEN_ELEM_CHILD - private static final int INITIAL_TOKEN_COUNT - private java.lang.Integer getToken(int) - private void rewind() - private int peekToken() - private java.lang.String nextTokenAsString() -org.apache.xerces.xpointer.XPointerHandler$Scanner: - private static final byte CHARTYPE_INVALID - private static final byte CHARTYPE_OTHER - private static final byte CHARTYPE_WHITESPACE - private static final byte CHARTYPE_CARRET - private static final byte CHARTYPE_OPEN_PAREN - private static final byte CHARTYPE_CLOSE_PAREN - private static final byte CHARTYPE_MINUS - private static final byte CHARTYPE_PERIOD - private static final byte CHARTYPE_SLASH - private static final byte CHARTYPE_DIGIT - private static final byte CHARTYPE_COLON - private static final byte CHARTYPE_EQUAL - private static final byte CHARTYPE_LETTER - private static final byte CHARTYPE_UNDERSCORE - private static final byte CHARTYPE_NONASCII -org.apache.xerces.xpointer.XPointerHandler$Tokens: - private static final int XPTRTOKEN_OPEN_PAREN - private static final int XPTRTOKEN_CLOSE_PAREN - private static final int XPTRTOKEN_SHORTHAND - private static final int XPTRTOKEN_SCHEMENAME - private static final int XPTRTOKEN_SCHEMEDATA - private static final int INITIAL_TOKEN_COUNT - private void rewind() - private java.lang.String nextTokenAsString() -org.apache.xerces.xpointer.XPointerMessageFormatter: - public static final java.lang.String XPOINTER_DOMAIN -org.apache.xerces.xs.XSException: - static final long serialVersionUID -org.apache.xml.security.c14n.CanonicalizationException: - private static final long serialVersionUID -org.apache.xml.security.c14n.InvalidCanonicalizerException: - private static final long serialVersionUID -org.apache.xml.security.c14n.helper.AttrCompare: - private static final long serialVersionUID - private static final int ATTR0_BEFORE_ATTR1 - private static final int ATTR1_BEFORE_ATTR0 - private static final java.lang.String XMLNS -org.apache.xml.security.c14n.implementations.Canonicalizer11: - private static final java.lang.String XMLNS_URI - private static final java.lang.String XML_LANG_URI -org.apache.xml.security.c14n.implementations.Canonicalizer20010315: - private static final java.lang.String XMLNS_URI - private static final java.lang.String XML_LANG_URI -org.apache.xml.security.c14n.implementations.Canonicalizer20010315Excl: - private static final java.lang.String XML_LANG_URI - private static final java.lang.String XMLNS_URI -org.apache.xml.security.c14n.implementations.CanonicalizerBase: - private static final int NODE_BEFORE_DOCUMENT_ELEMENT - private static final int NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT - private static final int NODE_AFTER_DOCUMENT_ELEMENT -org.apache.xml.security.c14n.implementations.NameSpaceSymbTable: - private static final java.lang.String XMLNS -org.apache.xml.security.encryption.XMLCipher: - private static final java.lang.String ENC_ALGORITHMS -org.apache.xml.security.encryption.XMLCipher$Factory$CipherDataImpl: - private static final java.lang.String valueMessage - private static final java.lang.String referenceMessage -org.apache.xml.security.encryption.XMLEncryptionException: - private static final long serialVersionUID -org.apache.xml.security.exceptions.AlgorithmAlreadyRegisteredException: - private static final long serialVersionUID -org.apache.xml.security.exceptions.Base64DecodingException: - private static final long serialVersionUID -org.apache.xml.security.exceptions.XMLSecurityException: - private static final long serialVersionUID -org.apache.xml.security.exceptions.XMLSecurityRuntimeException: - private static final long serialVersionUID -org.apache.xml.security.keys.ContentHandlerAlreadyRegisteredException: - private static final long serialVersionUID -org.apache.xml.security.keys.KeyInfo: - 1150:1150:org.apache.xml.security.keys.keyresolver.KeyResolverSpi itemInternalKeyResolver(int) -org.apache.xml.security.keys.keyresolver.InvalidKeyResolverException: - private static final long serialVersionUID -org.apache.xml.security.keys.keyresolver.KeyResolverException: - private static final long serialVersionUID -org.apache.xml.security.keys.storage.StorageResolverException: - private static final long serialVersionUID -org.apache.xml.security.signature.InvalidDigestValueException: - private static final long serialVersionUID -org.apache.xml.security.signature.InvalidSignatureValueException: - private static final long serialVersionUID -org.apache.xml.security.signature.MissingResourceFailureException: - private static final long serialVersionUID -org.apache.xml.security.signature.ReferenceNotInitializedException: - private static final long serialVersionUID -org.apache.xml.security.signature.XMLSignature: - private static final int MODE_SIGN - private static final int MODE_VERIFY -org.apache.xml.security.signature.XMLSignatureException: - private static final long serialVersionUID -org.apache.xml.security.signature.XMLSignatureInputDebugger: - static final java.lang.String HTMLPrefix - static final java.lang.String HTMLSuffix - static final java.lang.String HTMLExcludePrefix - static final java.lang.String HTMLIncludePrefix - static final java.lang.String HTMLIncludeOrExcludeSuffix - static final java.lang.String HTMLIncludedInclusiveNamespacePrefix - static final java.lang.String HTMLExcludedInclusiveNamespacePrefix - private static final int NODE_BEFORE_DOCUMENT_ELEMENT - private static final int NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT - private static final int NODE_AFTER_DOCUMENT_ELEMENT -org.apache.xml.security.transforms.InvalidTransformException: - private static final long serialVersionUID -org.apache.xml.security.transforms.TransformationException: - private static final long serialVersionUID -org.apache.xml.security.transforms.implementations.FuncHere: - private static final long serialVersionUID -org.apache.xml.security.transforms.implementations.TransformXSLT: - static final java.lang.String XSLTSpecNS - static final java.lang.String defaultXSLTSpecNSprefix - static final java.lang.String XSLTSTYLESHEET -org.apache.xml.security.transforms.params.XPath2FilterContainer: - private static final java.lang.String _ATT_FILTER - private static final java.lang.String _ATT_FILTER_VALUE_INTERSECT - private static final java.lang.String _ATT_FILTER_VALUE_SUBTRACT - private static final java.lang.String _ATT_FILTER_VALUE_UNION -org.apache.xml.security.transforms.params.XPath2FilterContainer04: - private static final java.lang.String _ATT_FILTER - private static final java.lang.String _ATT_FILTER_VALUE_INTERSECT - private static final java.lang.String _ATT_FILTER_VALUE_SUBTRACT - private static final java.lang.String _ATT_FILTER_VALUE_UNION -org.apache.xml.security.transforms.params.XPathFilterCHGPContainer: - private static final java.lang.String _TAG_INCLUDE_BUT_SEARCH - private static final java.lang.String _TAG_EXCLUDE_BUT_SEARCH - private static final java.lang.String _TAG_EXCLUDE -org.apache.xml.security.utils.Base64: - private static final int BASELENGTH - private static final int LOOKUPLENGTH - private static final int TWENTYFOURBITGROUP - private static final int EIGHTBIT - private static final int SIXTEENBIT - private static final int FOURBYTE - private static final int SIGN - private static final char PAD -org.apache.xml.security.utils.RFC2253Parser: - 396:396:static java.lang.String removeWhiteSpace(java.lang.String,java.lang.String) -org.apache.xml.security.utils.UnsyncBufferedOutputStream: - static final int size -org.apache.xml.security.utils.UnsyncByteArrayOutputStream: - private static final int INITIAL_SIZE -org.apache.xml.security.utils.resolver.ResourceResolverException: - private static final long serialVersionUID -org.apache.xml.security.utils.resolver.implementations.ResolverDirectHTTP: - private static final int HttpProxyHost - private static final int HttpProxyPort - private static final int HttpProxyUser - private static final int HttpProxyPass - private static final int HttpBasicUser - private static final int HttpBasicPass -org.apache.xml.security.utils.resolver.implementations.ResolverXPointer: - private static final java.lang.String XP -org.apache.xml.serialize.DOMSerializerImpl$DocumentMethods: - private DOMSerializerImpl$DocumentMethods() -org.apache.xml.serialize.EncodingInfo$CharToByteConverterMethods: - private EncodingInfo$CharToByteConverterMethods() -org.apache.xml.serialize.EncodingInfo$CharsetMethods: - private EncodingInfo$CharsetMethods() -org.apache.xml.serialize.Encodings: - static final int DEFAULT_LAST_PRINTABLE - static final int LAST_PRINTABLE_UNICODE - static final java.lang.String DEFAULT_ENCODING - static final java.lang.String JIS_DANGER_CHARS -org.apache.xml.serialize.HTMLdtd: - private static final java.lang.String ENTITIES_RESOURCE - private static final int ONLY_OPENING - private static final int ELEM_CONTENT - private static final int PRESERVE - private static final int OPT_CLOSING - private static final int EMPTY - private static final int ALLOWED_HEAD - private static final int CLOSE_P - private static final int CLOSE_DD_DT - private static final int CLOSE_SELF - private static final int CLOSE_TABLE - private static final int CLOSE_TH_TD -org.apache.xml.serialize.ObjectFactory: - private static final java.lang.String DEFAULT_PROPERTIES_FILENAME - private static final int DEFAULT_LINE_LENGTH - static java.lang.Object createObject(java.lang.String,java.lang.String) - static java.lang.Object createObject(java.lang.String,java.lang.String,java.lang.String) - static java.lang.ClassLoader findClassLoader() - private static java.lang.Object findJarServiceProvider(java.lang.String) -org.apache.xml.serialize.ObjectFactory$ConfigurationError: - static final long serialVersionUID - java.lang.Exception getException() -org.apache.xml.serialize.Printer: - private static final int BufferSize -org.apache.xml.serialize.SecuritySupport: - static java.lang.ClassLoader getContextClassLoader() - static java.lang.ClassLoader getSystemClassLoader() - static java.lang.ClassLoader getParentClassLoader(java.lang.ClassLoader) - static java.io.FileInputStream getFileInputStream(java.io.File) - static java.io.InputStream getResourceAsStream(java.lang.ClassLoader,java.lang.String) - static boolean getFileExists(java.io.File) - static long getLastModified(java.io.File) - private SecuritySupport() -org.apache.xml.serialize.SecuritySupport$1 -org.apache.xml.serialize.SecuritySupport$2 -org.apache.xml.serialize.SecuritySupport$3 -org.apache.xml.serialize.SecuritySupport$5 -org.apache.xml.serialize.SecuritySupport$6 -org.apache.xml.serialize.SecuritySupport$7 -org.apache.xml.serialize.SecuritySupport$8 -org.bouncycastle.asn1.ASN1ObjectIdentifier: - private static final long LONG_LIMIT -org.bouncycastle.asn1.BERApplicationSpecific: - BERApplicationSpecific(boolean,int,byte[]) -org.bouncycastle.asn1.BERConstructedOctetString: - private static final int MAX_LENGTH -org.bouncycastle.asn1.BERFactory: - BERFactory() - static org.bouncycastle.asn1.BERSet createSet(org.bouncycastle.asn1.ASN1EncodableVector) -org.bouncycastle.asn1.BEROctetString: - private static final int DEFAULT_LENGTH -org.bouncycastle.asn1.DERBoolean: - DERBoolean(byte[]) -org.bouncycastle.asn1.DEREnumerated: - DEREnumerated(byte[]) -org.bouncycastle.asn1.DERFactory: - DERFactory() -org.bouncycastle.asn1.DERObjectIdentifier: - DERObjectIdentifier(byte[]) - DERObjectIdentifier(org.bouncycastle.asn1.ASN1ObjectIdentifier,java.lang.String) -org.bouncycastle.asn1.DERUTCTime: - DERUTCTime(byte[]) -org.bouncycastle.asn1.StreamUtil: - StreamUtil() -org.bouncycastle.asn1.cmc.Utils: - Utils() -org.bouncycastle.asn1.dvcs.DVCSCertInfo: - private static final int DEFAULT_VERSION - private static final int TAG_DV_STATUS - private static final int TAG_POLICY - private static final int TAG_REQ_SIGNATURE - private static final int TAG_CERTS - private void setVersion(int) - private void setDvReqInfo(org.bouncycastle.asn1.dvcs.DVCSRequestInformation) - private void setMessageImprint(org.bouncycastle.asn1.x509.DigestInfo) -org.bouncycastle.asn1.dvcs.DVCSCertInfoBuilder: - private static final int DEFAULT_VERSION - private static final int TAG_DV_STATUS - private static final int TAG_POLICY - private static final int TAG_REQ_SIGNATURE - private static final int TAG_CERTS -org.bouncycastle.asn1.dvcs.DVCSRequestInformation: - private static final int DEFAULT_VERSION - private static final int TAG_REQUESTER - private static final int TAG_REQUEST_POLICY - private static final int TAG_DVCS - private static final int TAG_DATA_LOCATIONS - private static final int TAG_EXTENSIONS -org.bouncycastle.asn1.dvcs.DVCSRequestInformationBuilder: - private static final int DEFAULT_VERSION - private static final int TAG_REQUESTER - private static final int TAG_REQUEST_POLICY - private static final int TAG_DVCS - private static final int TAG_DATA_LOCATIONS - private static final int TAG_EXTENSIONS -org.bouncycastle.asn1.eac.BidirectionalMap: - private static final long serialVersionUID -org.bouncycastle.asn1.eac.CVCertificateRequest: - private static final int bodyValid - private static final int signValid -org.bouncycastle.asn1.eac.CertificateBody: - org.bouncycastle.asn1.ASN1InputStream seq - private static final int CPI - private static final int CAR - private static final int PK - private static final int CHR - private static final int CHA - private static final int CEfD - private static final int CExD -org.bouncycastle.asn1.eac.CertificateHolderReference: - private static final java.lang.String ReferenceEncoding -org.bouncycastle.asn1.eac.ECDSAPublicKey: - private static final int P - private static final int A - private static final int B - private static final int G - private static final int R - private static final int Y - private static final int F -org.bouncycastle.asn1.eac.Flags: - java.lang.String decode(java.util.Hashtable) -org.bouncycastle.asn1.eac.Flags$StringJoiner -org.bouncycastle.asn1.est.Utils: - Utils() -org.bouncycastle.asn1.pkcs.EncryptedData: - org.bouncycastle.asn1.ASN1ObjectIdentifier bagId - org.bouncycastle.asn1.ASN1Primitive bagValue -org.bouncycastle.asn1.util.ASN1Dump: - private static final java.lang.String TAB - private static final int SAMPLE_SIZE -org.bouncycastle.asn1.x509.PolicyQualifierId: - private static final java.lang.String id_qt -org.bouncycastle.asn1.x509.qualified.Iso4217CurrencyCode: - int numeric -org.bouncycastle.cert.CertUtils: - CertUtils() -org.bouncycastle.cert.X509AttributeCertificateHolder: - private static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.cert.X509CRLHolder: - private static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.cert.X509CertificateHolder: - private static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.cert.cmp.CMPUtil: - CMPUtil() -org.bouncycastle.cert.crmf.CRMFUtil: - CRMFUtil() -org.bouncycastle.cert.dane.DANEEntry: - static final int CERT_USAGE - static final int SELECTOR - static final int MATCHING_TYPE -org.bouncycastle.cert.dane.fetcher.JndiDANEFetcherFactory: - private static final java.lang.String DANE_TYPE -org.bouncycastle.cert.ocsp.OCSPUtils: - OCSPUtils() -org.bouncycastle.cert.path.CertPathUtils: - CertPathUtils() -org.bouncycastle.cert.path.CertPathValidationContext: - private int index -org.bouncycastle.cert.path.validations.ValidationUtils: - ValidationUtils() -org.bouncycastle.cert.selector.MSOutlookKeyIdCalculator: - MSOutlookKeyIdCalculator() -org.bouncycastle.cert.selector.MSOutlookKeyIdCalculator$GeneralDigest: - private static final int BYTE_LENGTH - protected MSOutlookKeyIdCalculator$GeneralDigest(org.bouncycastle.cert.selector.MSOutlookKeyIdCalculator$GeneralDigest) - protected void copyIn(org.bouncycastle.cert.selector.MSOutlookKeyIdCalculator$GeneralDigest) -org.bouncycastle.cert.selector.MSOutlookKeyIdCalculator$SHA1Digest: - private static final int DIGEST_LENGTH - private static final int Y1 - private static final int Y2 - private static final int Y3 - private static final int Y4 - public java.lang.String getAlgorithmName() -org.bouncycastle.cms.CMSAuthEnvelopedData -org.bouncycastle.cms.CMSAuthEnvelopedData$1 -org.bouncycastle.cms.CMSAuthEnvelopedGenerator -org.bouncycastle.cms.CMSEnvelopedHelper: - CMSEnvelopedHelper() -org.bouncycastle.cms.CMSProcessableFile: - private static final int DEFAULT_BUF_SIZE -org.bouncycastle.cms.CMSStreamException: - CMSStreamException(java.lang.String) -org.bouncycastle.cms.CMSTypedStream: - private static final int BUF_SIZ -org.bouncycastle.cms.CMSUtils: - CMSUtils() - static boolean isMQV(org.bouncycastle.asn1.ASN1ObjectIdentifier) - static boolean isEC(org.bouncycastle.asn1.ASN1ObjectIdentifier) - static boolean isRFC2631(org.bouncycastle.asn1.ASN1ObjectIdentifier) - public static byte[] streamToByteArray(java.io.InputStream,int) -org.bouncycastle.cms.OriginatorId: - public org.bouncycastle.asn1.x500.X500Name getIssuer() -org.bouncycastle.cms.bc.CMSUtils: - CMSUtils() -org.bouncycastle.cms.bc.EnvelopedDataHelper: - java.lang.String getBaseCipherName(org.bouncycastle.asn1.ASN1ObjectIdentifier) -org.bouncycastle.cms.jcajce.CMSUtils: - CMSUtils() -org.bouncycastle.cms.jcajce.EnvelopedDataHelper: - javax.crypto.SecretKeyFactory createSecretKeyFactory(java.lang.String) -org.bouncycastle.cms.jcajce.JcaSignerInfoVerifierBuilder$Helper: - org.bouncycastle.operator.DigestCalculatorProvider createDigestCalculatorProvider() -org.bouncycastle.cms.jcajce.JcaSignerInfoVerifierBuilder$NamedHelper: - org.bouncycastle.operator.DigestCalculatorProvider createDigestCalculatorProvider() -org.bouncycastle.cms.jcajce.JcaSignerInfoVerifierBuilder$ProviderHelper: - org.bouncycastle.operator.DigestCalculatorProvider createDigestCalculatorProvider() -org.bouncycastle.cms.jcajce.JceAlgorithmIdentifierConverter: - private java.security.SecureRandom random -org.bouncycastle.cms.jcajce.ZlibCompressor: - private static final java.lang.String ZLIB -org.bouncycastle.crypto.agreement.DHStandardGroups: - private static final java.lang.String rfc2409_768_p - private static final java.lang.String rfc2409_768_g - private static final java.lang.String rfc2409_1024_p - private static final java.lang.String rfc2409_1024_g - private static final java.lang.String rfc3526_1536_p - private static final java.lang.String rfc3526_1536_g - private static final java.lang.String rfc3526_2048_p - private static final java.lang.String rfc3526_2048_g - private static final java.lang.String rfc3526_3072_p - private static final java.lang.String rfc3526_3072_g - private static final java.lang.String rfc3526_4096_p - private static final java.lang.String rfc3526_4096_g - private static final java.lang.String rfc3526_6144_p - private static final java.lang.String rfc3526_6144_g - private static final java.lang.String rfc3526_8192_p - private static final java.lang.String rfc3526_8192_g - private static final java.lang.String rfc5114_1024_160_p - private static final java.lang.String rfc5114_1024_160_g - private static final java.lang.String rfc5114_1024_160_q - private static final java.lang.String rfc5114_2048_224_p - private static final java.lang.String rfc5114_2048_224_g - private static final java.lang.String rfc5114_2048_224_q - private static final java.lang.String rfc5114_2048_256_p - private static final java.lang.String rfc5114_2048_256_g - private static final java.lang.String rfc5114_2048_256_q - private static final java.lang.String rfc7919_ffdhe2048_p - private static final java.lang.String rfc7919_ffdhe3072_p - private static final java.lang.String rfc7919_ffdhe4096_p - private static final java.lang.String rfc7919_ffdhe6144_p - private static final java.lang.String rfc7919_ffdhe8192_p -org.bouncycastle.crypto.agreement.srp.SRP6StandardGroups: - private static final java.lang.String rfc5054_1024_N - private static final java.lang.String rfc5054_1024_g - private static final java.lang.String rfc5054_1536_N - private static final java.lang.String rfc5054_1536_g - private static final java.lang.String rfc5054_2048_N - private static final java.lang.String rfc5054_2048_g - private static final java.lang.String rfc5054_3072_N - private static final java.lang.String rfc5054_3072_g - private static final java.lang.String rfc5054_4096_N - private static final java.lang.String rfc5054_4096_g - private static final java.lang.String rfc5054_6144_N - private static final java.lang.String rfc5054_6144_g - private static final java.lang.String rfc5054_8192_N - private static final java.lang.String rfc5054_8192_g -org.bouncycastle.crypto.digests.Blake2bDigest: - private static final int BLOCK_LENGTH_BYTES -org.bouncycastle.crypto.digests.Blake2sDigest: - private static final int ROUNDS - private static final int BLOCK_LENGTH_BYTES -org.bouncycastle.crypto.digests.DSTU7564Digest: - private static final int NB_512 - private static final int NB_1024 - private static final int NR_512 - private static final int NR_1024 -org.bouncycastle.crypto.digests.GOST3411Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.GeneralDigest: - private static final int BYTE_LENGTH -org.bouncycastle.crypto.digests.LongDigest: - private static final int BYTE_LENGTH -org.bouncycastle.crypto.digests.MD2Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.MD4Digest: - private static final int DIGEST_LENGTH - private static final int S11 - private static final int S12 - private static final int S13 - private static final int S14 - private static final int S21 - private static final int S22 - private static final int S23 - private static final int S24 - private static final int S31 - private static final int S32 - private static final int S33 - private static final int S34 -org.bouncycastle.crypto.digests.MD5Digest: - private static final int DIGEST_LENGTH - private static final int S11 - private static final int S12 - private static final int S13 - private static final int S14 - private static final int S21 - private static final int S22 - private static final int S23 - private static final int S24 - private static final int S31 - private static final int S32 - private static final int S33 - private static final int S34 - private static final int S41 - private static final int S42 - private static final int S43 - private static final int S44 -org.bouncycastle.crypto.digests.RIPEMD128Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.RIPEMD160Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.RIPEMD256Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.RIPEMD320Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.SHA1Digest: - private static final int DIGEST_LENGTH - private static final int Y1 - private static final int Y2 - private static final int Y3 - private static final int Y4 -org.bouncycastle.crypto.digests.SHA224Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.SHA256Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.SHA384Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.SHA512Digest: - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.SM3Digest: - private static final int DIGEST_LENGTH - private static final int BLOCK_SIZE -org.bouncycastle.crypto.digests.SkeinEngine: - private static final int PARAM_TYPE_KEY - private static final int PARAM_TYPE_CONFIG - private static final int PARAM_TYPE_MESSAGE - private static final int PARAM_TYPE_OUTPUT -org.bouncycastle.crypto.digests.SkeinEngine$UbiTweak: - private static final long LOW_RANGE - private static final long T1_FINAL - private static final long T1_FIRST -org.bouncycastle.crypto.digests.TigerDigest: - private static final int BYTE_LENGTH - private static final int DIGEST_LENGTH -org.bouncycastle.crypto.digests.WhirlpoolDigest: - private static final int BYTE_LENGTH - private static final int DIGEST_LENGTH_BYTES - private static final int ROUNDS - private static final int REDUCTION_POLYNOMIAL - private static final int BITCOUNT_ARRAY_SIZE -org.bouncycastle.crypto.ec.ECUtil: - ECUtil() -org.bouncycastle.crypto.encodings.PKCS1Encoding: - private static final int HEADER_LENGTH -org.bouncycastle.crypto.engines.AESEngine: - private static final int m1 - private static final int m2 - private static final int m3 - private static final int m4 - private static final int m5 - private static final int BLOCK_SIZE -org.bouncycastle.crypto.engines.AESFastEngine: - private static final int m1 - private static final int m2 - private static final int m3 - private static final int m4 - private static final int m5 - private static final int BLOCK_SIZE -org.bouncycastle.crypto.engines.AESLightEngine: - private static final int m1 - private static final int m2 - private static final int m3 - private static final int m4 - private static final int m5 - private static final int BLOCK_SIZE -org.bouncycastle.crypto.engines.BlowfishEngine: - private static final int ROUNDS - private static final int BLOCK_SIZE - private static final int SBOX_SK - private static final int P_SZ -org.bouncycastle.crypto.engines.CamelliaEngine: - private static final int BLOCK_SIZE - private static final int MASK8 -org.bouncycastle.crypto.engines.CamelliaLightEngine: - private static final int BLOCK_SIZE - private static final int MASK8 -org.bouncycastle.crypto.engines.CramerShoupCoreEngine$CramerShoupCiphertextException: - private static final long serialVersionUID -org.bouncycastle.crypto.engines.DSTU7624Engine: - private static final int ROUNDS_128 - private static final int ROUNDS_256 - private static final int ROUNDS_512 -org.bouncycastle.crypto.engines.DSTU7624WrapEngine: - private static final int BYTES_IN_INTEGER -org.bouncycastle.crypto.engines.Grain128Engine: - private static final int STATE_SIZE -org.bouncycastle.crypto.engines.Grainv1Engine: - private static final int STATE_SIZE -org.bouncycastle.crypto.engines.IDEAEngine: - private static final int MASK - private static final int BASE -org.bouncycastle.crypto.engines.NoekeonEngine: - private static final int genericSize -org.bouncycastle.crypto.engines.RC2Engine: - private static final int BLOCK_SIZE -org.bouncycastle.crypto.engines.RC4Engine: - private static final int STATE_LENGTH -org.bouncycastle.crypto.engines.RC532Engine: - private static final int P32 - private static final int Q32 -org.bouncycastle.crypto.engines.RC564Engine: - private static final int wordSize - private static final int bytesPerWord - private static final long P64 - private static final long Q64 -org.bouncycastle.crypto.engines.RC6Engine: - private static final int wordSize - private static final int bytesPerWord - private static final int _noRounds - private static final int P32 - private static final int Q32 - private static final int LGW -org.bouncycastle.crypto.engines.RijndaelEngine: - private static final int MAXROUNDS - private static final int MAXKC -org.bouncycastle.crypto.engines.SM4Engine: - private static final int BLOCK_SIZE -org.bouncycastle.crypto.engines.Salsa20Engine: - private static final int STATE_SIZE -org.bouncycastle.crypto.engines.SerpentEngineBase: - static final int ROUNDS - static final int PHI -org.bouncycastle.crypto.engines.Shacal2Engine: - private static final int BLOCK_SIZE - private static final int ROUNDS -org.bouncycastle.crypto.engines.SkipjackEngine: - static final int BLOCK_SIZE -org.bouncycastle.crypto.engines.TEAEngine: - private static final int rounds - private static final int block_size - private static final int delta - private static final int d_sum -org.bouncycastle.crypto.engines.ThreefishEngine: - private static final int TWEAK_SIZE_BYTES - private static final int TWEAK_SIZE_WORDS - private static final int ROUNDS_256 - private static final int ROUNDS_512 - private static final int ROUNDS_1024 - private static final int MAX_ROUNDS - private static final long C_240 -org.bouncycastle.crypto.engines.ThreefishEngine$Threefish1024Cipher: - private static final int ROTATION_0_0 - private static final int ROTATION_0_1 - private static final int ROTATION_0_2 - private static final int ROTATION_0_3 - private static final int ROTATION_0_4 - private static final int ROTATION_0_5 - private static final int ROTATION_0_6 - private static final int ROTATION_0_7 - private static final int ROTATION_1_0 - private static final int ROTATION_1_1 - private static final int ROTATION_1_2 - private static final int ROTATION_1_3 - private static final int ROTATION_1_4 - private static final int ROTATION_1_5 - private static final int ROTATION_1_6 - private static final int ROTATION_1_7 - private static final int ROTATION_2_0 - private static final int ROTATION_2_1 - private static final int ROTATION_2_2 - private static final int ROTATION_2_3 - private static final int ROTATION_2_4 - private static final int ROTATION_2_5 - private static final int ROTATION_2_6 - private static final int ROTATION_2_7 - private static final int ROTATION_3_0 - private static final int ROTATION_3_1 - private static final int ROTATION_3_2 - private static final int ROTATION_3_3 - private static final int ROTATION_3_4 - private static final int ROTATION_3_5 - private static final int ROTATION_3_6 - private static final int ROTATION_3_7 - private static final int ROTATION_4_0 - private static final int ROTATION_4_1 - private static final int ROTATION_4_2 - private static final int ROTATION_4_3 - private static final int ROTATION_4_4 - private static final int ROTATION_4_5 - private static final int ROTATION_4_6 - private static final int ROTATION_4_7 - private static final int ROTATION_5_0 - private static final int ROTATION_5_1 - private static final int ROTATION_5_2 - private static final int ROTATION_5_3 - private static final int ROTATION_5_4 - private static final int ROTATION_5_5 - private static final int ROTATION_5_6 - private static final int ROTATION_5_7 - private static final int ROTATION_6_0 - private static final int ROTATION_6_1 - private static final int ROTATION_6_2 - private static final int ROTATION_6_3 - private static final int ROTATION_6_4 - private static final int ROTATION_6_5 - private static final int ROTATION_6_6 - private static final int ROTATION_6_7 - private static final int ROTATION_7_0 - private static final int ROTATION_7_1 - private static final int ROTATION_7_2 - private static final int ROTATION_7_3 - private static final int ROTATION_7_4 - private static final int ROTATION_7_5 - private static final int ROTATION_7_6 - private static final int ROTATION_7_7 -org.bouncycastle.crypto.engines.ThreefishEngine$Threefish256Cipher: - private static final int ROTATION_0_0 - private static final int ROTATION_0_1 - private static final int ROTATION_1_0 - private static final int ROTATION_1_1 - private static final int ROTATION_2_0 - private static final int ROTATION_2_1 - private static final int ROTATION_3_0 - private static final int ROTATION_3_1 - private static final int ROTATION_4_0 - private static final int ROTATION_4_1 - private static final int ROTATION_5_0 - private static final int ROTATION_5_1 - private static final int ROTATION_6_0 - private static final int ROTATION_6_1 - private static final int ROTATION_7_0 - private static final int ROTATION_7_1 -org.bouncycastle.crypto.engines.ThreefishEngine$Threefish512Cipher: - private static final int ROTATION_0_0 - private static final int ROTATION_0_1 - private static final int ROTATION_0_2 - private static final int ROTATION_0_3 - private static final int ROTATION_1_0 - private static final int ROTATION_1_1 - private static final int ROTATION_1_2 - private static final int ROTATION_1_3 - private static final int ROTATION_2_0 - private static final int ROTATION_2_1 - private static final int ROTATION_2_2 - private static final int ROTATION_2_3 - private static final int ROTATION_3_0 - private static final int ROTATION_3_1 - private static final int ROTATION_3_2 - private static final int ROTATION_3_3 - private static final int ROTATION_4_0 - private static final int ROTATION_4_1 - private static final int ROTATION_4_2 - private static final int ROTATION_4_3 - private static final int ROTATION_5_0 - private static final int ROTATION_5_1 - private static final int ROTATION_5_2 - private static final int ROTATION_5_3 - private static final int ROTATION_6_0 - private static final int ROTATION_6_1 - private static final int ROTATION_6_2 - private static final int ROTATION_6_3 - private static final int ROTATION_7_0 - private static final int ROTATION_7_1 - private static final int ROTATION_7_2 - private static final int ROTATION_7_3 -org.bouncycastle.crypto.engines.TwofishEngine: - private static final int P_00 - private static final int P_01 - private static final int P_02 - private static final int P_03 - private static final int P_04 - private static final int P_10 - private static final int P_11 - private static final int P_12 - private static final int P_13 - private static final int P_14 - private static final int P_20 - private static final int P_21 - private static final int P_22 - private static final int P_23 - private static final int P_24 - private static final int P_30 - private static final int P_31 - private static final int P_32 - private static final int P_33 - private static final int P_34 - private static final int GF256_FDBK - private static final int GF256_FDBK_2 - private static final int GF256_FDBK_4 - private static final int RS_GF_FDBK - private static final int ROUNDS - private static final int MAX_ROUNDS - private static final int BLOCK_SIZE - private static final int MAX_KEY_BITS - private static final int INPUT_WHITEN - private static final int OUTPUT_WHITEN - private static final int ROUND_SUBKEYS - private static final int TOTAL_SUBKEYS - private static final int SK_STEP - private static final int SK_BUMP - private static final int SK_ROTL -org.bouncycastle.crypto.engines.XTEAEngine: - private static final int rounds - private static final int block_size - private static final int delta -org.bouncycastle.crypto.generators.BCrypt: - static final int MAGIC_STRING_LENGTH - private static final int ROUNDS - private static final int SBOX_SK - private static final int SBOX_SK2 - private static final int SBOX_SK3 - private static final int P_SZ - static final int SALT_SIZE_BYTES - static final int MIN_COST - static final int MAX_COST - static final int MAX_PASSWORD_BYTES -org.bouncycastle.crypto.generators.CramerShoupParametersGenerator$ParametersHelper: - private CramerShoupParametersGenerator$ParametersHelper() -org.bouncycastle.crypto.generators.DESedeKeyGenerator: - private static final int MAX_IT -org.bouncycastle.crypto.generators.DHParametersHelper: - DHParametersHelper() -org.bouncycastle.crypto.generators.OpenBSDBCrypt: - private static final java.lang.String defaultVersion -org.bouncycastle.crypto.generators.Poly1305KeyGenerator: - private static final byte R_MASK_LOW_2 - private static final byte R_MASK_HIGH_4 -org.bouncycastle.crypto.io.CipherIOException: - private static final long serialVersionUID -org.bouncycastle.crypto.io.CipherInputStream: - private static final int INPUT_BUF_SIZE -org.bouncycastle.crypto.io.InvalidCipherTextIOException: - private static final long serialVersionUID -org.bouncycastle.crypto.macs.DSTU7564Mac: - private static final int BITS_IN_BYTE -org.bouncycastle.crypto.macs.DSTU7624Mac: - private static final int BITS_IN_BYTE -org.bouncycastle.crypto.macs.HMac: - private static final byte IPAD - private static final byte OPAD -org.bouncycastle.crypto.macs.OldHMac: - private static final int BLOCK_LENGTH - private static final byte IPAD - private static final byte OPAD -org.bouncycastle.crypto.macs.Poly1305: - private static final int BLOCK_SIZE -org.bouncycastle.crypto.modes.EAXBlockCipher: - private static final byte nTAG - private static final byte hTAG - private static final byte cTAG -org.bouncycastle.crypto.modes.GCMBlockCipher: - private static final int BLOCK_SIZE -org.bouncycastle.crypto.modes.GOFBBlockCipher: - static final int C1 - static final int C2 -org.bouncycastle.crypto.modes.GOST3413CipherUtil: - GOST3413CipherUtil() -org.bouncycastle.crypto.modes.KCCMBlockCipher: - private static final int BYTES_IN_INT - private static final int BITS_IN_BYTE - private static final int MAX_MAC_BIT_LENGTH - private static final int MIN_MAC_BIT_LENGTH -org.bouncycastle.crypto.modes.KGCMBlockCipher: - private static final int MIN_MAC_BITS -org.bouncycastle.crypto.modes.KXTSBlockCipher: - private static final long RED_POLY_128 - private static final long RED_POLY_256 - private static final long RED_POLY_512 -org.bouncycastle.crypto.modes.OCBBlockCipher: - private static final int BLOCK_SIZE -org.bouncycastle.crypto.modes.gcm.GCMUtil: - private static final int E1 - private static final long E1L -org.bouncycastle.crypto.params.DESParameters: - private static final int N_DES_WEAK_KEYS -org.bouncycastle.crypto.params.DHParameters: - private static final int DEFAULT_MINIMUM_LENGTH -org.bouncycastle.crypto.params.KDFDoublePipelineIterationParameters: - private static final int UNUSED_R -org.bouncycastle.crypto.params.KDFFeedbackParameters: - private static final int UNUSED_R -org.bouncycastle.crypto.prng.X931RNG: - private static final long BLOCK64_RESEED_MAX - private static final long BLOCK128_RESEED_MAX - private static final int BLOCK64_MAX_BITS_REQUEST - private static final int BLOCK128_MAX_BITS_REQUEST -org.bouncycastle.crypto.prng.drbg.CTRSP800DRBG: - private static final long TDEA_RESEED_MAX - private static final long AES_RESEED_MAX - private static final int TDEA_MAX_BITS_REQUEST - private static final int AES_MAX_BITS_REQUEST -org.bouncycastle.crypto.prng.drbg.DualECSP800DRBG: - private static final long RESEED_MAX - private static final int MAX_ADDITIONAL_INPUT - private static final int MAX_ENTROPY_LENGTH - private static final int MAX_PERSONALIZATION_STRING - private org.bouncycastle.math.ec.ECCurve$Fp _curve -org.bouncycastle.crypto.prng.drbg.HMacSP800DRBG: - private static final long RESEED_MAX - private static final int MAX_BITS_REQUEST -org.bouncycastle.crypto.prng.drbg.HashSP800DRBG: - private static final long RESEED_MAX - private static final int MAX_BITS_REQUEST -org.bouncycastle.crypto.prng.drbg.Utils: - Utils() -org.bouncycastle.crypto.tls.ByteQueue: - private static final int DEFAULT_CAPACITY -org.bouncycastle.crypto.tls.DTLSEpoch: - long getSequenceNumber() -org.bouncycastle.crypto.tls.DTLSRecordLayer: - private static final int RECORD_HEADER_LENGTH - private static final int MAX_FRAGMENT_LENGTH - private static final long TCP_MSL - private static final long RETRANSMIT_TIMEOUT -org.bouncycastle.crypto.tls.DTLSReliableHandshake: - private static final int MAX_RECEIVE_AHEAD - private static final int MESSAGE_HEADER_LENGTH -org.bouncycastle.crypto.tls.DTLSReplayWindow: - private static final long VALID_SEQ_MASK - private static final long WINDOW_SIZE - void reset() -org.bouncycastle.crypto.tls.DeferredHash: - protected static final int BUFFERING_HASH_LIMIT -org.bouncycastle.crypto.tls.RecordStream: - static final int TLS_HEADER_SIZE - static final int TLS_HEADER_TYPE_OFFSET - static final int TLS_HEADER_VERSION_OFFSET - static final int TLS_HEADER_LENGTH_OFFSET -org.bouncycastle.crypto.tls.SSL3Mac: - private static final byte IPAD_BYTE - private static final byte OPAD_BYTE -org.bouncycastle.crypto.tls.TlsAEADCipher: - static final int NONCE_DRAFT_CHACHA20_POLY1305 -org.bouncycastle.crypto.tls.TlsDHUtils: - private static final java.lang.String draft_ffdhe2432_p - private static final java.lang.String draft_ffdhe3072_p - private static final java.lang.String draft_ffdhe4096_p - private static final java.lang.String draft_ffdhe6144_p - private static final java.lang.String draft_ffdhe8192_p -org.bouncycastle.crypto.util.DerUtil: - DerUtil() -org.bouncycastle.dvcs.DVCSConstructionException: - private static final long serialVersionUID -org.bouncycastle.dvcs.DVCSException: - private static final long serialVersionUID -org.bouncycastle.dvcs.DVCSParsingException: - private static final long serialVersionUID -org.bouncycastle.eac.operator.jcajce.EACUtil -org.bouncycastle.est.CTEBase64InputStream: - protected boolean end -org.bouncycastle.est.ESTException: - private static final long MAX_ERROR_BODY -org.bouncycastle.est.HttpUtil: - HttpUtil() -org.bouncycastle.est.HttpUtil$Headers: - private boolean hasHeader(java.lang.String) - public void ensureHeader(java.lang.String,java.lang.String) -org.bouncycastle.jcajce.provider.asymmetric.DH: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.DSA: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.DSTU4145: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.EC: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.ECGOST: - private static final java.lang.String PREFIX - private static final java.lang.String PREFIX_GOST_2012 -org.bouncycastle.jcajce.provider.asymmetric.ElGamal: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.GM: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.GOST: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.IES: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.RSA: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPrivateKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.dsa.BCDSAPrivateKey: - private static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.dsa.BCDSAPublicKey: - private static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.dstu.BCDSTU4145PrivateKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.dstu.BCDSTU4145PublicKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey: - static final long serialVersionUID - private org.bouncycastle.math.ec.ECPoint calculateQ(org.bouncycastle.jce.spec.ECParameterSpec) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.ec.ECUtils: - ECUtils() -org.bouncycastle.jcajce.provider.asymmetric.ecgost.BCECGOST3410PrivateKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.ecgost.BCECGOST3410PublicKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.ecgost12.BCECGOST3410_2012PrivateKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.ecgost12.BCECGOST3410_2012PublicKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.elgamal.BCElGamalPrivateKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.elgamal.BCElGamalPublicKey: - static final long serialVersionUID - BCElGamalPublicKey(java.math.BigInteger,org.bouncycastle.jce.spec.ElGamalParameterSpec) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.gost.BCGOST3410PrivateKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.gost.BCGOST3410PublicKey: - static final long serialVersionUID - BCGOST3410PublicKey(java.math.BigInteger,org.bouncycastle.jce.spec.GOST3410ParameterSpec) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPrivateCrtKey: - static final long serialVersionUID -org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPrivateKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey: - static final long serialVersionUID - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jcajce.provider.asymmetric.rsa.PSSSignatureSpi$NullPssDigest: - public int getByteLength() -org.bouncycastle.jcajce.provider.asymmetric.util.BaseCipherSpi: - private int ivSize - private byte[] iv -org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl: - int size() - java.util.Hashtable getAttributes() - java.util.Vector getOrdering() -org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory$ExCertificateException: - public CertificateFactory$ExCertificateException(org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory,java.lang.Throwable) -org.bouncycastle.jcajce.provider.asymmetric.x509.X509CRLEntryObject: - protected X509CRLEntryObject(org.bouncycastle.asn1.x509.TBSCertList$CRLEntry) -org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject: - public int originalHashCode() -org.bouncycastle.jcajce.provider.asymmetric.x509.X509SignatureUtil: - X509SignatureUtil() -org.bouncycastle.jcajce.provider.config.ProviderConfigurationPermission: - private static final int THREAD_LOCAL_EC_IMPLICITLY_CA - private static final int EC_IMPLICITLY_CA - private static final int THREAD_LOCAL_DH_DEFAULT_PARAMS - private static final int DH_DEFAULT_PARAMS - private static final int ACCEPTABLE_EC_CURVES - private static final int ADDITIONAL_EC_PARAMETERS - private static final int ALL - private static final java.lang.String THREAD_LOCAL_EC_IMPLICITLY_CA_STR - private static final java.lang.String EC_IMPLICITLY_CA_STR - private static final java.lang.String THREAD_LOCAL_DH_DEFAULT_PARAMS_STR - private static final java.lang.String DH_DEFAULT_PARAMS_STR - private static final java.lang.String ACCEPTABLE_EC_CURVES_STR - private static final java.lang.String ADDITIONAL_EC_PARAMETERS_STR - private static final java.lang.String ALL_STR -org.bouncycastle.jcajce.provider.keystore.BC: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.keystore.BCFKS: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.keystore.PKCS12: - private static final java.lang.String PREFIX -org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi: - private static final int STORE_VERSION - private static final int STORE_SALT_SIZE - private static final java.lang.String STORE_CIPHER - private static final int KEY_SALT_SIZE - private static final int MIN_ITERATIONS - private static final java.lang.String KEY_CIPHER - static final int NULL - static final int CERTIFICATE - static final int KEY - static final int SECRET - static final int SEALED - static final int KEY_PRIVATE - static final int KEY_PUBLIC - static final int KEY_SECRET -org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi: - static final java.lang.String PKCS12_MAX_IT_COUNT_PROPERTY - private static final int SALT_SIZE - private static final int MIN_ITERATIONS - static final int NULL - static final int CERTIFICATE - static final int KEY - static final int SECRET - static final int SEALED - static final int KEY_PRIVATE - static final int KEY_PUBLIC - static final int KEY_SECRET -org.bouncycastle.jcajce.provider.symmetric.AES$Mappings: - private static final java.lang.String wrongAES128 - private static final java.lang.String wrongAES192 - private static final java.lang.String wrongAES256 -org.bouncycastle.jcajce.provider.symmetric.DES$Mappings: - private static final java.lang.String PACKAGE -org.bouncycastle.jcajce.provider.symmetric.DESede$Mappings: - private static final java.lang.String PACKAGE -org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher: - public int processByte(byte,byte[],int) -org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher: - public int processByte(byte,byte[],int) -org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$GenericBlockCipher: - public abstract int processByte(byte,byte[],int) -org.bouncycastle.jce.provider.BouncyCastleProvider: - private static final java.lang.String SYMMETRIC_PACKAGE - private static final java.lang.String ASYMMETRIC_PACKAGE - private static final java.lang.String DIGEST_PACKAGE - private static final java.lang.String KEYSTORE_PACKAGE - private static final java.lang.String SECURE_RANDOM_PACKAGE -org.bouncycastle.jce.provider.BrokenPBE$Util: - static org.bouncycastle.crypto.CipherParameters makePBEMacParameters(org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey,java.security.spec.AlgorithmParameterSpec,int,int,int) -org.bouncycastle.jce.provider.CertPathValidatorUtilities: - protected static final java.lang.String ANY_POLICY - protected static final int KEY_CERT_SIGN - protected static final int CRL_SIGN - CertPathValidatorUtilities() - protected static java.security.cert.TrustAnchor findTrustAnchor(java.security.cert.X509Certificate,java.util.Set) - protected static void prepareNextCertB1(int,java.util.List[],java.lang.String,java.util.Map,java.security.cert.X509Certificate) - protected static org.bouncycastle.jce.provider.PKIXPolicyNode prepareNextCertB2(int,java.util.List[],java.lang.String,org.bouncycastle.jce.provider.PKIXPolicyNode) -org.bouncycastle.jce.provider.CertStatus: - public static final int UNREVOKED - public static final int UNDETERMINED -org.bouncycastle.jce.provider.JCEDHPrivateKey: - static final long serialVersionUID - JCEDHPrivateKey(javax.crypto.interfaces.DHPrivateKey) - JCEDHPrivateKey(javax.crypto.spec.DHPrivateKeySpec) - JCEDHPrivateKey(org.bouncycastle.asn1.pkcs.PrivateKeyInfo) - JCEDHPrivateKey(org.bouncycastle.crypto.params.DHPrivateKeyParameters) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JCEDHPublicKey: - static final long serialVersionUID - JCEDHPublicKey(javax.crypto.spec.DHPublicKeySpec) - JCEDHPublicKey(javax.crypto.interfaces.DHPublicKey) - JCEDHPublicKey(org.bouncycastle.crypto.params.DHPublicKeyParameters) - JCEDHPublicKey(java.math.BigInteger,javax.crypto.spec.DHParameterSpec) - JCEDHPublicKey(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) - private boolean isPKCSParam(org.bouncycastle.asn1.ASN1Sequence) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JCEECPrivateKey: - JCEECPrivateKey(org.bouncycastle.asn1.pkcs.PrivateKeyInfo) - private void populateFromPrivKeyInfo(org.bouncycastle.asn1.pkcs.PrivateKeyInfo) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JCEECPublicKey: - JCEECPublicKey(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) - private void populateFromPubKeyInfo(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JCEElGamalPrivateKey: - static final long serialVersionUID - JCEElGamalPrivateKey(org.bouncycastle.jce.interfaces.ElGamalPrivateKey) - JCEElGamalPrivateKey(javax.crypto.interfaces.DHPrivateKey) - JCEElGamalPrivateKey(org.bouncycastle.jce.spec.ElGamalPrivateKeySpec) - JCEElGamalPrivateKey(javax.crypto.spec.DHPrivateKeySpec) - JCEElGamalPrivateKey(org.bouncycastle.asn1.pkcs.PrivateKeyInfo) - JCEElGamalPrivateKey(org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JCEElGamalPublicKey: - static final long serialVersionUID - JCEElGamalPublicKey(org.bouncycastle.jce.spec.ElGamalPublicKeySpec) - JCEElGamalPublicKey(javax.crypto.spec.DHPublicKeySpec) - JCEElGamalPublicKey(org.bouncycastle.jce.interfaces.ElGamalPublicKey) - JCEElGamalPublicKey(javax.crypto.interfaces.DHPublicKey) - JCEElGamalPublicKey(org.bouncycastle.crypto.params.ElGamalPublicKeyParameters) - JCEElGamalPublicKey(java.math.BigInteger,org.bouncycastle.jce.spec.ElGamalParameterSpec) - JCEElGamalPublicKey(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JCERSAPrivateCrtKey: - static final long serialVersionUID - JCERSAPrivateCrtKey(org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters) - JCERSAPrivateCrtKey(java.security.spec.RSAPrivateCrtKeySpec) - JCERSAPrivateCrtKey(java.security.interfaces.RSAPrivateCrtKey) - JCERSAPrivateCrtKey(org.bouncycastle.asn1.pkcs.PrivateKeyInfo) - JCERSAPrivateCrtKey(org.bouncycastle.asn1.pkcs.RSAPrivateKey) -org.bouncycastle.jce.provider.JCERSAPrivateKey: - static final long serialVersionUID - JCERSAPrivateKey(org.bouncycastle.crypto.params.RSAKeyParameters) - JCERSAPrivateKey(java.security.spec.RSAPrivateKeySpec) - JCERSAPrivateKey(java.security.interfaces.RSAPrivateKey) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JCERSAPublicKey: - static final long serialVersionUID - JCERSAPublicKey(org.bouncycastle.crypto.params.RSAKeyParameters) - JCERSAPublicKey(java.security.spec.RSAPublicKeySpec) - JCERSAPublicKey(java.security.interfaces.RSAPublicKey) - JCERSAPublicKey(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) -org.bouncycastle.jce.provider.JDKDSAPrivateKey: - private static final long serialVersionUID - JDKDSAPrivateKey(java.security.interfaces.DSAPrivateKey) - JDKDSAPrivateKey(java.security.spec.DSAPrivateKeySpec) - JDKDSAPrivateKey(org.bouncycastle.asn1.pkcs.PrivateKeyInfo) - JDKDSAPrivateKey(org.bouncycastle.crypto.params.DSAPrivateKeyParameters) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.JDKDSAPublicKey: - private static final long serialVersionUID - JDKDSAPublicKey(java.security.spec.DSAPublicKeySpec) - JDKDSAPublicKey(java.security.interfaces.DSAPublicKey) - JDKDSAPublicKey(org.bouncycastle.crypto.params.DSAPublicKeyParameters) - JDKDSAPublicKey(java.math.BigInteger,java.security.spec.DSAParameterSpec) - JDKDSAPublicKey(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) - private boolean isNotNull(org.bouncycastle.asn1.ASN1Encodable) - private void readObject(java.io.ObjectInputStream) - private void writeObject(java.io.ObjectOutputStream) -org.bouncycastle.jce.provider.OldPKCS12ParametersGenerator: - public static final int KEY_MATERIAL - public static final int IV_MATERIAL - public static final int MAC_MATERIAL -org.bouncycastle.jce.provider.PrincipalUtils: - PrincipalUtils() -org.bouncycastle.jce.provider.RFC3280CertPathUtilities: - public static final java.lang.String ANY_POLICY - protected static final int KEY_CERT_SIGN - protected static final int CRL_SIGN - RFC3280CertPathUtilities() - protected static java.util.Set processCRLA1i(java.util.Date,org.bouncycastle.jcajce.PKIXExtendedParameters,java.security.cert.X509Certificate,java.security.cert.X509CRL) - protected static java.util.Set[] processCRLA1ii(java.util.Date,org.bouncycastle.jcajce.PKIXExtendedParameters,java.security.cert.X509Certificate,java.security.cert.X509CRL) -org.bouncycastle.jce.provider.RFC3281CertPathUtilities: - RFC3281CertPathUtilities() -org.bouncycastle.jce.provider.X509LDAPCertStoreSpi: - private static final java.lang.String SEARCH_SECURITY_LEVEL - private static final java.lang.String URL_CONTEXT_PREFIX -org.bouncycastle.jce.provider.X509SignatureUtil: - X509SignatureUtil() -org.bouncycastle.jce.spec.RepeatedSecretKeySpec: - private java.lang.String algorithm -org.bouncycastle.math.ec.ECCurve$F2m: - private static final int F2M_DEFAULT_COORDS -org.bouncycastle.math.ec.ECCurve$Fp: - private static final int FP_DEFAULT_COORDS -org.bouncycastle.math.ec.LongArray: - private static final java.lang.String ZEROES - private static long shiftUp(long[],int,int,int) - private static void distribute(long[],int,int,int,int) - public int getLength() - public org.bouncycastle.math.ec.LongArray modMultiplyLD(org.bouncycastle.math.ec.LongArray,int,int[]) - public org.bouncycastle.math.ec.LongArray modMultiplyAlt(org.bouncycastle.math.ec.LongArray,int,int[]) - public org.bouncycastle.math.ec.LongArray modReduce(int,int[]) - private static void interleave(long[],int,long[],int,int,int) - private static void interleave3(long[],int,long[],int,int) - private static long interleave3(long) - private static long interleave3_21to63(int) - private static void interleave5(long[],int,long[],int,int) - private static long interleave5(long) - private static long interleave3_13to65(int) - private static void interleave7(long[],int,long[],int,int) - private static long interleave7(long) - private static void interleave2_n(long[],int,long[],int,int,int) - private static long interleave2_n(long,int) - private static long interleave4_16to64(int) -org.bouncycastle.math.ec.SimpleBigDecimal: - private static final long serialVersionUID - public static org.bouncycastle.math.ec.SimpleBigDecimal getInstance(java.math.BigInteger,int) - public org.bouncycastle.math.ec.SimpleBigDecimal add(java.math.BigInteger) - public org.bouncycastle.math.ec.SimpleBigDecimal multiply(org.bouncycastle.math.ec.SimpleBigDecimal) - public org.bouncycastle.math.ec.SimpleBigDecimal multiply(java.math.BigInteger) - public org.bouncycastle.math.ec.SimpleBigDecimal divide(org.bouncycastle.math.ec.SimpleBigDecimal) - public org.bouncycastle.math.ec.SimpleBigDecimal divide(java.math.BigInteger) - public org.bouncycastle.math.ec.SimpleBigDecimal shiftLeft(int) - public int compareTo(org.bouncycastle.math.ec.SimpleBigDecimal) - public int intValue() - public long longValue() -org.bouncycastle.math.ec.Tnaf: - public static final byte WIDTH - public static final byte POW_2_WIDTH - Tnaf() - public static org.bouncycastle.math.ec.SimpleBigDecimal norm(byte,org.bouncycastle.math.ec.SimpleBigDecimal,org.bouncycastle.math.ec.SimpleBigDecimal) - public static byte[] tauAdicNaf(byte,org.bouncycastle.math.ec.ZTauElement) - public static org.bouncycastle.math.ec.ECPoint$AbstractF2m tau(org.bouncycastle.math.ec.ECPoint$AbstractF2m) - public static byte getMu(org.bouncycastle.math.ec.ECCurve$AbstractF2m) - public static byte getMu(org.bouncycastle.math.ec.ECFieldElement) - public static java.math.BigInteger[] getSi(int,int,java.math.BigInteger) - public static org.bouncycastle.math.ec.ECPoint$AbstractF2m multiplyRTnaf(org.bouncycastle.math.ec.ECPoint$AbstractF2m,java.math.BigInteger) - public static org.bouncycastle.math.ec.ECPoint$AbstractF2m multiplyTnaf(org.bouncycastle.math.ec.ECPoint$AbstractF2m,org.bouncycastle.math.ec.ZTauElement) -org.bouncycastle.math.ec.ValidityPrecompInfo: - static final java.lang.String PRECOMP_NAME -org.bouncycastle.math.ec.WTauNafMultiplier: - static final java.lang.String PRECOMP_NAME -org.bouncycastle.math.ec.custom.djb.Curve25519: - private static final int Curve25519_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.djb.Curve25519Field: - private static final long M - private static final int P7 - private static final int PInv -org.bouncycastle.math.ec.custom.gm.SM2P256V1Curve: - private static final int SM2P256V1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.gm.SM2P256V1Field: - private static final long M - private static final int P7s1 - private static final int PExt15s1 -org.bouncycastle.math.ec.custom.sec.SecP128R1Curve: - private static final int SecP128R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP128R1Field: - private static final long M - private static final int P3s1 - private static final int PExt7s1 -org.bouncycastle.math.ec.custom.sec.SecP160K1Curve: - private static final int SECP160K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP160R1Curve: - private static final int SecP160R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP160R1Field: - private static final long M - private static final int P4 - private static final int PExt9 - private static final int PInv -org.bouncycastle.math.ec.custom.sec.SecP160R2Curve: - private static final int SecP160R2_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP160R2Field: - private static final int P4 - private static final int PExt9 - private static final int PInv33 -org.bouncycastle.math.ec.custom.sec.SecP192K1Curve: - private static final int SecP192K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP192K1Field: - private static final int P5 - private static final int PExt11 - private static final int PInv33 -org.bouncycastle.math.ec.custom.sec.SecP192R1Curve: - private static final int SecP192R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP192R1Field: - private static final long M - private static final int P5 - private static final int PExt11 -org.bouncycastle.math.ec.custom.sec.SecP224K1Curve: - private static final int SECP224K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP224K1Field: - private static final int P6 - private static final int PExt13 - private static final int PInv33 -org.bouncycastle.math.ec.custom.sec.SecP224R1Curve: - private static final int SecP224R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP224R1Field: - private static final long M - private static final int P6 - private static final int PExt13 -org.bouncycastle.math.ec.custom.sec.SecP256K1Curve: - private static final int SECP256K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP256K1Field: - private static final int P7 - private static final int PExt15 - private static final int PInv33 -org.bouncycastle.math.ec.custom.sec.SecP256R1Curve: - private static final int SecP256R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP256R1Field: - private static final long M - private static final int P7 - private static final int PExt15s1 -org.bouncycastle.math.ec.custom.sec.SecP384R1Curve: - private static final int SecP384R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP384R1Field: - private static final long M - private static final int P11 - private static final int PExt23 -org.bouncycastle.math.ec.custom.sec.SecP521R1Curve: - private static final int SecP521R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecP521R1Field: - private static final int P16 -org.bouncycastle.math.ec.custom.sec.SecT113Field: - private static final long M49 - private static final long M57 -org.bouncycastle.math.ec.custom.sec.SecT113R1Curve: - private static final int SecT113R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT113R2Curve: - private static final int SecT113R2_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT131Field: - private static final long M03 - private static final long M44 -org.bouncycastle.math.ec.custom.sec.SecT131R1Curve: - private static final int SecT131R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT131R2Curve: - private static final int SecT131R2_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT163Field: - private static final long M35 - private static final long M55 -org.bouncycastle.math.ec.custom.sec.SecT163K1Curve: - private static final int SecT163K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT163R1Curve: - private static final int SecT163R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT163R2Curve: - private static final int SecT163R2_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT193Field: - private static final long M01 - private static final long M49 -org.bouncycastle.math.ec.custom.sec.SecT193R1Curve: - private static final int SecT193R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT193R2Curve: - private static final int SecT193R2_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT233Field: - private static final long M41 - private static final long M59 -org.bouncycastle.math.ec.custom.sec.SecT233K1Curve: - private static final int SecT233K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT233R1Curve: - private static final int SecT233R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT239Field: - private static final long M47 - private static final long M60 -org.bouncycastle.math.ec.custom.sec.SecT239K1Curve: - private static final int SecT239K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT283Field: - private static final long M27 - private static final long M57 -org.bouncycastle.math.ec.custom.sec.SecT283K1Curve: - private static final int SecT283K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT283R1Curve: - private static final int SecT283R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT409Field: - private static final long M25 - private static final long M59 -org.bouncycastle.math.ec.custom.sec.SecT409K1Curve: - private static final int SecT409K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT409R1Curve: - private static final int SecT409R1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT571Field: - private static final long M59 - private static final long RM -org.bouncycastle.math.ec.custom.sec.SecT571K1Curve: - private static final int SecT571K1_DEFAULT_COORDS -org.bouncycastle.math.ec.custom.sec.SecT571R1Curve: - private static final int SecT571R1_DEFAULT_COORDS -org.bouncycastle.math.ec.rfc7748.X25519: - private static final int C_A - private static final int C_A24 -org.bouncycastle.math.ec.rfc7748.X25519Field: - private static final int M24 - private static final int M25 - private static final int M26 -org.bouncycastle.math.ec.rfc7748.X448: - private static final int C_A - private static final int C_A24 -org.bouncycastle.math.ec.rfc7748.X448Field: - private static final int M28 -org.bouncycastle.math.ec.rfc8032.Ed25519: - private static final long M28L - private static final long M32L - private static final int POINT_BYTES - private static final int SCALAR_INTS - private static final int SCALAR_BYTES - private static final int L0 - private static final int L1 - private static final int L2 - private static final int L3 - private static final int L4 - private static final int WNAF_WIDTH_BASE - private static final int PRECOMP_BLOCKS - private static final int PRECOMP_TEETH - private static final int PRECOMP_SPACING - private static final int PRECOMP_POINTS - private static final int PRECOMP_MASK -org.bouncycastle.math.ec.rfc8032.Ed448: - private static final long M26L - private static final long M28L - private static final long M32L - private static final int POINT_BYTES - private static final int SCALAR_INTS - private static final int SCALAR_BYTES - private static final int L_0 - private static final int L_1 - private static final int L_2 - private static final int L_3 - private static final int L_4 - private static final int L_5 - private static final int L_6 - private static final int L_7 - private static final int L4_0 - private static final int L4_1 - private static final int L4_2 - private static final int L4_3 - private static final int L4_4 - private static final int L4_5 - private static final int L4_6 - private static final int L4_7 - private static final int C_d - private static final int WNAF_WIDTH_BASE - private static final int PRECOMP_BLOCKS - private static final int PRECOMP_TEETH - private static final int PRECOMP_SPACING - private static final int PRECOMP_POINTS - private static final int PRECOMP_MASK -org.bouncycastle.math.ec.tools.DiscoverEndomorphisms: - private static final int radix -org.bouncycastle.math.raw.Interleave: - private static final long M32 - private static final long M64 - private static final long M64R -org.bouncycastle.math.raw.Mont256: - private static final long M -org.bouncycastle.math.raw.Nat: - private static final long M -org.bouncycastle.math.raw.Nat128: - private static final long M -org.bouncycastle.math.raw.Nat160: - private static final long M -org.bouncycastle.math.raw.Nat192: - private static final long M -org.bouncycastle.math.raw.Nat224: - private static final long M -org.bouncycastle.math.raw.Nat256: - private static final long M -org.bouncycastle.openssl.PEMUtilities -org.bouncycastle.openssl.bc.PEMUtilities: - PEMUtilities() - static int getKeySize(java.lang.String) - static boolean isPKCS5Scheme1(org.bouncycastle.asn1.ASN1ObjectIdentifier) - static boolean isPKCS5Scheme2(org.bouncycastle.asn1.ASN1ObjectIdentifier) - public static boolean isPKCS12(org.bouncycastle.asn1.ASN1ObjectIdentifier) - public static org.bouncycastle.crypto.params.KeyParameter generateSecretKeyForPKCS5Scheme2(java.lang.String,char[],byte[],int) -org.bouncycastle.openssl.jcajce.JcaMiscPEMGenerator: - private java.lang.Object obj - private java.lang.String algorithm - private char[] password - private java.security.SecureRandom random - private java.security.Provider provider -org.bouncycastle.openssl.jcajce.PEMUtilities: - PEMUtilities() -org.bouncycastle.operator.bc.AESUtil: - AESUtil() -org.bouncycastle.operator.bc.CamelliaUtil -org.bouncycastle.operator.bc.OperatorUtils: - OperatorUtils() -org.bouncycastle.operator.bc.SEEDUtil -org.bouncycastle.operator.jcajce.OperatorHelper: - int getKeySizeInBits(org.bouncycastle.asn1.ASN1ObjectIdentifier) -org.bouncycastle.operator.jcajce.OperatorUtils: - OperatorUtils() -org.bouncycastle.pkcs.PKCSUtils -org.bouncycastle.pkcs.bc.BcPKCS12PBEInputDecryptorProviderBuilder$1$1: - public org.bouncycastle.operator.GenericKey getKey() -org.bouncycastle.pkcs.bc.PKCS12PBEUtils: - PKCS12PBEUtils() -org.bouncycastle.pkcs.jcajce.JceUtils: - JceUtils() -org.bouncycastle.pqc.asn1.GMSSPrivateKey: - private GMSSPrivateKey(org.bouncycastle.asn1.ASN1Sequence) - private static int checkBigIntegerInIntRange(org.bouncycastle.asn1.ASN1Encodable) -org.bouncycastle.pqc.crypto.gmss.GMSSUtils: - GMSSUtils() - static org.bouncycastle.pqc.crypto.gmss.GMSSLeaf[] clone(org.bouncycastle.pqc.crypto.gmss.GMSSLeaf[]) - static org.bouncycastle.pqc.crypto.gmss.GMSSRootCalc[] clone(org.bouncycastle.pqc.crypto.gmss.GMSSRootCalc[]) - static org.bouncycastle.pqc.crypto.gmss.GMSSRootSig[] clone(org.bouncycastle.pqc.crypto.gmss.GMSSRootSig[]) - static byte[][][] clone(byte[][][]) - static org.bouncycastle.pqc.crypto.gmss.Treehash[][] clone(org.bouncycastle.pqc.crypto.gmss.Treehash[][]) - static java.util.Vector[][] clone(java.util.Vector[][]) -org.bouncycastle.pqc.crypto.mceliece.Conversions: - private Conversions() - public static byte[] signConversion(int,int,byte[]) -org.bouncycastle.pqc.crypto.mceliece.McElieceCCA2Primitives: - private McElieceCCA2Primitives() -org.bouncycastle.pqc.crypto.mceliece.McElieceFujisakiCipher: - private static final java.lang.String DEFAULT_PRNG_NAME -org.bouncycastle.pqc.crypto.mceliece.McElieceKeyPairGenerator: - private static final java.lang.String OID -org.bouncycastle.pqc.crypto.mceliece.McElieceKobaraImaiCipher: - private static final java.lang.String DEFAULT_PRNG_NAME -org.bouncycastle.pqc.crypto.mceliece.McEliecePrivateKeyParameters: - private java.lang.String oid -org.bouncycastle.pqc.crypto.mceliece.Utils: - Utils() -org.bouncycastle.pqc.crypto.newhope.ChaCha20: - ChaCha20() -org.bouncycastle.pqc.crypto.newhope.ErrorCorrection: - ErrorCorrection() -org.bouncycastle.pqc.crypto.newhope.NTT: - NTT() -org.bouncycastle.pqc.crypto.newhope.NewHope: - private static final boolean STATISTICAL_TEST - public static final int AGREEMENT_SIZE - public static final int POLY_SIZE - public static final int SENDA_BYTES - public static final int SENDB_BYTES - NewHope() -org.bouncycastle.pqc.crypto.newhope.Params -org.bouncycastle.pqc.crypto.newhope.Poly: - Poly() -org.bouncycastle.pqc.crypto.newhope.Precomp: - Precomp() -org.bouncycastle.pqc.crypto.newhope.Reduce: - static final int QInv - static final int RLog - static final int RMask - Reduce() -org.bouncycastle.pqc.crypto.rainbow.RainbowSigner: - private static final int MAXITS -org.bouncycastle.pqc.crypto.sphincs.Horst: - static final int HORST_LOGT - static final int HORST_T - static final int HORST_K - static final int HORST_SKBYTES - static final int HORST_SIGBYTES - static final int N_MASKS -org.bouncycastle.pqc.crypto.sphincs.Permute: - private static final int CHACHA_ROUNDS -org.bouncycastle.pqc.crypto.sphincs.SPHINCS256Config -org.bouncycastle.pqc.crypto.sphincs.Seed: - Seed() -org.bouncycastle.pqc.crypto.sphincs.Tree: - Tree() -org.bouncycastle.pqc.crypto.sphincs.Wots: - static final int WOTS_LOGW - static final int WOTS_W - static final int WOTS_L1 - static final int WOTS_L - static final int WOTS_LOG_L - static final int WOTS_SIGBYTES -org.bouncycastle.pqc.crypto.xmss.BDS: - private static final long serialVersionUID - boolean isUsed() -org.bouncycastle.pqc.crypto.xmss.BDSTreeHash: - private static final long serialVersionUID -org.bouncycastle.pqc.crypto.xmss.HashTreeAddress: - private static final int TYPE - private static final int PADDING - protected int getPadding() -org.bouncycastle.pqc.crypto.xmss.LTreeAddress: - private static final int TYPE -org.bouncycastle.pqc.crypto.xmss.OTSHashAddress: - private static final int TYPE -org.bouncycastle.pqc.crypto.xmss.WOTSPlus: - protected boolean verifySignature(byte[],org.bouncycastle.pqc.crypto.xmss.WOTSPlusSignature,org.bouncycastle.pqc.crypto.xmss.OTSHashAddress) - protected byte[] getSecretKeySeed() - protected org.bouncycastle.pqc.crypto.xmss.WOTSPlusPrivateKeyParameters getPrivateKey() -org.bouncycastle.pqc.crypto.xmss.WOTSPlusParameters: - protected org.bouncycastle.pqc.crypto.xmss.XMSSOid getOid() -org.bouncycastle.pqc.crypto.xmss.WOTSPlusPrivateKeyParameters -org.bouncycastle.pqc.crypto.xmss.XMSSNode: - private static final long serialVersionUID -org.bouncycastle.pqc.crypto.xmss.XMSSNodeUtil: - XMSSNodeUtil() -org.bouncycastle.pqc.crypto.xmss.XMSSVerifierUtil: - XMSSVerifierUtil() -org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider: - private static final java.lang.String ALGORITHM_PACKAGE -org.bouncycastle.pqc.jcajce.provider.McEliece: - private static final java.lang.String PREFIX -org.bouncycastle.pqc.jcajce.provider.NH: - private static final java.lang.String PREFIX -org.bouncycastle.pqc.jcajce.provider.Rainbow: - private static final java.lang.String PREFIX -org.bouncycastle.pqc.jcajce.provider.SPHINCS: - private static final java.lang.String PREFIX -org.bouncycastle.pqc.jcajce.provider.XMSS: - private static final java.lang.String PREFIX -org.bouncycastle.pqc.jcajce.provider.gmss.BCGMSSPublicKey: - private static final long serialVersionUID - private org.bouncycastle.pqc.crypto.gmss.GMSSParameters gmssParams -org.bouncycastle.pqc.jcajce.provider.mceliece.BCMcElieceCCA2PrivateKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.mceliece.BCMcElieceCCA2PublicKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.mceliece.BCMcEliecePrivateKey: - private static final long serialVersionUID - org.bouncycastle.crypto.params.AsymmetricKeyParameter getKeyParams() -org.bouncycastle.pqc.jcajce.provider.mceliece.BCMcEliecePublicKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.mceliece.McElieceKeyFactorySpi: - private static org.bouncycastle.crypto.Digest getDigest(org.bouncycastle.asn1.x509.AlgorithmIdentifier) -org.bouncycastle.pqc.jcajce.provider.mceliece.Utils: - Utils() -org.bouncycastle.pqc.jcajce.provider.newhope.BCNHPrivateKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.newhope.BCNHPublicKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.rainbow.BCRainbowPrivateKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.rainbow.BCRainbowPublicKey: - private static final long serialVersionUID - private org.bouncycastle.pqc.crypto.rainbow.RainbowParameters rainbowParams -org.bouncycastle.pqc.jcajce.provider.sphincs.BCSphincs256PrivateKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.sphincs.BCSphincs256PublicKey: - private static final long serialVersionUID -org.bouncycastle.pqc.jcajce.provider.xmss.DigestUtil: - DigestUtil() -org.bouncycastle.pqc.math.linearalgebra.GF2nElement: - abstract void assignOne() -org.bouncycastle.pqc.math.linearalgebra.GF2nONBElement: - private static final int MAXLONG - void assignOne() -org.bouncycastle.pqc.math.linearalgebra.GF2nONBField: - private static final int MAXLONG - int[][] invMatrix(int[][]) -org.bouncycastle.pqc.math.linearalgebra.GF2nPolynomialElement: - void assignOne() -org.bouncycastle.pqc.math.linearalgebra.IntegerFunctions: - private static final long SMALL_PRIME_PRODUCT -org.bouncycastle.tsp.TimeStampToken: - java.util.Date genTime -org.bouncycastle.tsp.TimeStampToken$CertID: - public java.lang.String getHashAlgorithmName() -org.bouncycastle.util.BigIntegers: - private static final int MAX_ITERATIONS -org.bouncycastle.util.io.pem.PemReader: - private static final java.lang.String BEGIN - private static final java.lang.String END -org.bouncycastle.util.io.pem.PemWriter: - private static final int LINE_LENGTH -org.bouncycastle.x509.CertStatus: - public static final int UNREVOKED - public static final int UNDETERMINED - CertStatus() - public java.util.Date getRevocationDate() - public int getCertStatus() -org.bouncycastle.x509.PKIXCRLUtil: - public java.util.Set findCRLs(org.bouncycastle.x509.X509CRLStoreSelector,org.bouncycastle.x509.ExtendedPKIXParameters,java.util.Date) -org.bouncycastle.x509.PKIXCertPathReviewer: - private static final java.lang.String RESOURCE_NAME - private java.lang.String IPtoString(byte[]) -org.bouncycastle.x509.X509Util: - X509Util() -org.bouncycastle.x509.util.LDAPStoreHelper: - private static final java.lang.String SEARCH_SECURITY_LEVEL - private static final java.lang.String URL_CONTEXT_PREFIX -org.jaxen.BaseXPath: - private static final long serialVersionUID -org.jaxen.Context: - private static final long serialVersionUID -org.jaxen.ContextSupport: - private static final long serialVersionUID -org.jaxen.FunctionCallException: - private static final long serialVersionUID -org.jaxen.JaxenException: - private static final long serialVersionUID -org.jaxen.JaxenRuntimeException: - private static final long serialVersionUID -org.jaxen.QualifiedName: - private static final long serialVersionUID -org.jaxen.SimpleNamespaceContext: - private static final long serialVersionUID -org.jaxen.SimpleVariableContext: - private static final long serialVersionUID -org.jaxen.UnresolvableException: - private static final long serialVersionUID -org.jaxen.UnsupportedAxisException: - private static final long serialVersionUID -org.jaxen.XPathSyntaxException: - private static final long serialVersionUID -org.jaxen.dom.DOMXPath: - private static final long serialVersionUID -org.jaxen.dom.DocumentNavigator: - private static final long serialVersionUID -org.jaxen.dom4j.DocumentNavigator: - private static final long serialVersionUID -org.jaxen.dom4j.DocumentNavigator$Singleton: - 102:102:private DocumentNavigator$Singleton() -org.jaxen.dom4j.Dom4jXPath: - private static final long serialVersionUID -org.jaxen.expr.DefaultAbsoluteLocationPath: - private static final long serialVersionUID -org.jaxen.expr.DefaultAllNodeStep: - private static final long serialVersionUID -org.jaxen.expr.DefaultAndExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultCommentNodeStep: - private static final long serialVersionUID -org.jaxen.expr.DefaultDivExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultEqualsExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultFilterExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultFunctionCallExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultGreaterThanEqualExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultGreaterThanExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultLessThanEqualExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultLessThanExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultLiteralExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultMinusExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultModExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultMultiplyExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultNameStep: - private static final long serialVersionUID -org.jaxen.expr.DefaultNotEqualsExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultNumberExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultOrExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultPathExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultPlusExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultPredicate: - private static final long serialVersionUID -org.jaxen.expr.DefaultProcessingInstructionNodeStep: - private static final long serialVersionUID -org.jaxen.expr.DefaultRelativeLocationPath: - private static final long serialVersionUID -org.jaxen.expr.DefaultTextNodeStep: - private static final long serialVersionUID -org.jaxen.expr.DefaultTruthExpr: - 110:110:protected boolean bothAreBoolean(java.lang.Object,java.lang.Object) -org.jaxen.expr.DefaultUnaryExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultUnionExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultVariableReferenceExpr: - private static final long serialVersionUID -org.jaxen.expr.DefaultXPathExpr: - private static final long serialVersionUID -org.jaxen.expr.PredicateSet: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableAncestorAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableAncestorOrSelfAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableAttributeAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableChildAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableDescendantAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableDescendantOrSelfAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableFollowingAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableFollowingSiblingAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableNamespaceAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableParentAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterablePrecedingAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterablePrecedingSiblingAxis: - private static final long serialVersionUID -org.jaxen.expr.iter.IterableSelfAxis: - private static final long serialVersionUID -org.jaxen.function.LangFunction: - private static final java.lang.String LANG_LOCALNAME - private static final java.lang.String XMLNS_URI -org.jaxen.javabean.DocumentNavigator: - private static final long serialVersionUID -org.jaxen.javabean.JavaBeanXPath: - private static final long serialVersionUID -org.jaxen.jdom.DocumentNavigator: - private static final long serialVersionUID -org.jaxen.jdom.DocumentNavigator$Singleton: - 96:96:private DocumentNavigator$Singleton() -org.jaxen.jdom.JDOMXPath: - private static final long serialVersionUID -org.jaxen.pattern.PatternParser: - private static final boolean TRACE - private static final boolean USE_HANDLER -org.jaxen.saxpath.SAXPathException: - private static final long serialVersionUID -org.jaxen.saxpath.XPathSyntaxException: - private static final long serialVersionUID -org.jaxen.saxpath.base.TokenTypes: - static final int EOF - static final int SKIP - static final int ERROR - static final int EQUALS - static final int NOT_EQUALS - static final int LESS_THAN_SIGN - static final int LESS_THAN_OR_EQUALS_SIGN - static final int GREATER_THAN_SIGN - static final int GREATER_THAN_OR_EQUALS_SIGN - static final int PLUS - static final int MINUS - static final int STAR - static final int MOD - static final int DIV - static final int SLASH - static final int DOUBLE_SLASH - static final int DOT - static final int DOT_DOT - static final int IDENTIFIER - static final int AT - static final int PIPE - static final int COLON - static final int DOUBLE_COLON - static final int LEFT_BRACKET - static final int RIGHT_BRACKET - static final int LEFT_PAREN - static final int RIGHT_PAREN - static final int DOLLAR - static final int LITERAL - static final int AND - static final int OR - static final int DOUBLE - static final int COMMA - static final int STAR_OPERATOR - 52:52:TokenTypes() -org.jaxen.saxpath.base.Verifier: - 54:54:Verifier() -org.jaxen.xom.DocumentNavigator: - private static final long serialVersionUID -org.jaxen.xom.XOMXPath: - private static final long serialVersionUID -org.jdom.Attribute: - private static final java.lang.String CVS_ID - 701:707:private void writeObject(java.io.ObjectOutputStream) - 712:716:private void readObject(java.io.ObjectInputStream) -org.jdom.AttributeList: - private static final java.lang.String CVS_ID - private static final int INITIAL_ARRAY_SIZE -org.jdom.CDATA: - private static final java.lang.String CVS_ID -org.jdom.Comment: - private static final java.lang.String CVS_ID -org.jdom.ContentList: - private static final java.lang.String CVS_ID - private static final long serialVersionUID - private static final int INITIAL_ARRAY_SIZE -org.jdom.DataConversionException: - private static final java.lang.String CVS_ID -org.jdom.DefaultJDOMFactory: - private static final java.lang.String CVS_ID -org.jdom.DescendantIterator: - private static final java.lang.String CVS_ID -org.jdom.DocType: - private static final java.lang.String CVS_ID -org.jdom.Document: - private static final java.lang.String CVS_ID -org.jdom.Element: - private static final java.lang.String CVS_ID - private static final int INITIAL_ARRAY_SIZE - 1333:1352:private void writeObject(java.io.ObjectOutputStream) - 1357:1372:private void readObject(java.io.ObjectInputStream) -org.jdom.EntityRef: - private static final java.lang.String CVS_ID -org.jdom.FilterIterator: - private static final java.lang.String CVS_ID -org.jdom.IllegalAddException: - private static final java.lang.String CVS_ID - 103:111:IllegalAddException(org.jdom.Element,org.jdom.Element,java.lang.String) - 142:150:IllegalAddException(org.jdom.Element,org.jdom.ProcessingInstruction,java.lang.String) - 162:168:IllegalAddException(org.jdom.ProcessingInstruction,java.lang.String) - 181:189:IllegalAddException(org.jdom.Element,org.jdom.Comment,java.lang.String) - 202:210:IllegalAddException(org.jdom.Element,org.jdom.CDATA,java.lang.String) - 224:232:IllegalAddException(org.jdom.Element,org.jdom.Text,java.lang.String) - 243:249:IllegalAddException(org.jdom.Comment,java.lang.String) - 262:270:IllegalAddException(org.jdom.Element,org.jdom.EntityRef,java.lang.String) -org.jdom.IllegalDataException: - private static final java.lang.String CVS_ID -org.jdom.IllegalNameException: - private static final java.lang.String CVS_ID - 104:111:IllegalNameException(java.lang.String,java.lang.String) -org.jdom.IllegalTargetException: - private static final java.lang.String CVS_ID -org.jdom.JDOMException: - private static final java.lang.String CVS_ID -org.jdom.Namespace: - private static final java.lang.String CVS_ID -org.jdom.NamespaceKey: - private static final java.lang.String CVS_ID -org.jdom.ProcessingInstruction: - private static final java.lang.String CVS_ID -org.jdom.Text: - private static final java.lang.String CVS_ID - static final java.lang.String EMPTY_STRING -org.jdom.Verifier: - private static final java.lang.String CVS_ID -org.jdom.adapters.AbstractDOMAdapter: - private static final java.lang.String CVS_ID -org.jdom.adapters.CrimsonDOMAdapter: - private static final java.lang.String CVS_ID -org.jdom.adapters.JAXPDOMAdapter: - private static final java.lang.String CVS_ID -org.jdom.adapters.OracleV1DOMAdapter: - private static final java.lang.String CVS_ID -org.jdom.adapters.OracleV2DOMAdapter: - private static final java.lang.String CVS_ID -org.jdom.adapters.XML4JDOMAdapter: - private static final java.lang.String CVS_ID -org.jdom.adapters.XercesDOMAdapter: - private static final java.lang.String CVS_ID -org.jdom.filter.AbstractFilter: - private static final java.lang.String CVS_ID -org.jdom.filter.AndFilter: - private static final java.lang.String CVS_ID -org.jdom.filter.ContentFilter: - private static final java.lang.String CVS_ID -org.jdom.filter.ElementFilter: - private static final java.lang.String CVS_ID - 163:175:private void writeObject(java.io.ObjectOutputStream) - 180:188:private void readObject(java.io.ObjectInputStream) -org.jdom.filter.NegateFilter: - private static final java.lang.String CVS_ID -org.jdom.filter.OrFilter: - private static final java.lang.String CVS_ID -org.jdom.input.BuilderErrorHandler: - private static final java.lang.String CVS_ID -org.jdom.input.DOMBuilder: - private static final java.lang.String CVS_ID -org.jdom.input.JAXPParserFactory: - private static final java.lang.String CVS_ID - private static final java.lang.String JAXP_SCHEMA_LANGUAGE_PROPERTY - private static final java.lang.String JAXP_SCHEMA_LOCATION_PROPERTY - 122:145:public static org.xml.sax.XMLReader createParser(boolean,java.util.Map,java.util.Map) - 163:177:private static void setProperty(javax.xml.parsers.SAXParser,java.util.Map,java.lang.String) -org.jdom.input.JDOMParseException: - private static final java.lang.String CVS_ID -org.jdom.input.SAXBuilder: - private static final java.lang.String CVS_ID - private static final java.lang.String DEFAULT_SAX_DRIVER -org.jdom.input.SAXHandler: - private static final java.lang.String CVS_ID -org.jdom.input.TextBuffer: - private static final java.lang.String CVS_ID - 117:121:int size() -org.jdom.output.DOMOutputter: - private static final java.lang.String CVS_ID - private static final java.lang.String DEFAULT_ADAPTER_CLASS -org.jdom.output.Format: - private static final java.lang.String CVS_ID - private static final java.lang.String STANDARD_INDENT - private static final java.lang.String STANDARD_LINE_SEPARATOR - private static final java.lang.String STANDARD_ENCODING -org.jdom.output.JDOMLocator: - private static final java.lang.String CVS_ID -org.jdom.output.NamespaceStack: - private static final java.lang.String CVS_ID -org.jdom.output.SAXOutputter: - private static final java.lang.String CVS_ID - private static final java.lang.String NAMESPACES_SAX_FEATURE - private static final java.lang.String NS_PREFIXES_SAX_FEATURE - private static final java.lang.String VALIDATION_SAX_FEATURE - private static final java.lang.String LEXICAL_HANDLER_SAX_PROPERTY - private static final java.lang.String DECL_HANDLER_SAX_PROPERTY - private static final java.lang.String LEXICAL_HANDLER_ALT_PROPERTY - private static final java.lang.String DECL_HANDLER_ALT_PROPERTY -org.jdom.output.XMLOutputter: - private static final java.lang.String CVS_ID -org.jdom.transform.JDOMResult: - private static final java.lang.String CVS_ID -org.jdom.transform.JDOMSource: - private static final java.lang.String CVS_ID -org.jdom.transform.XSLTransformException: - private static final java.lang.String CVS_ID -org.jdom.transform.XSLTransformer: - private static final java.lang.String CVS_ID -org.jdom.xpath.JaxenXPath -org.jdom.xpath.JaxenXPath$NSContext -org.jdom.xpath.XPath: - private static final java.lang.String CVS_ID - private static final java.lang.String XPATH_CLASS_PROPERTY - private static final java.lang.String DEFAULT_XPATH_CLASS -org.jdom.xpath.XPath$XPathString: - 443:446:private java.lang.Object readResolve() -org.jfree.base.BasicProjectInfo$OptionalLibraryHolder: - 81:81:public java.lang.String getLibraryClass() -org.jfree.base.config.HierarchicalConfiguration: - 320:330:private void writeObject(java.io.ObjectOutputStream) - 343:354:private void readObject(java.io.ObjectInputStream) -org.jfree.base.modules.PackageManager: - private static final int RETURN_MODULE_LOADED - private static final int RETURN_MODULE_UNKNOWN - private static final int RETURN_MODULE_ERROR -org.jfree.chart.ChartMouseEvent: - private static final long serialVersionUID -org.jfree.chart.ChartPanel: - private static final long serialVersionUID - 3031:3034:private void writeObject(java.io.ObjectOutputStream) - 3046:3058:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.ChartRenderingInfo: - private static final long serialVersionUID - 237:239:private void writeObject(java.io.ObjectOutputStream) - 251:253:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.JFreeChart: - private static final long serialVersionUID - 1637:1641:private void writeObject(java.io.ObjectOutputStream) - 1653:1672:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.LegendItem: - private static final long serialVersionUID - 1111:1121:private void writeObject(java.io.ObjectOutputStream) - 1133:1143:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.LegendItemCollection: - private static final long serialVersionUID -org.jfree.chart.LegendRenderingOrder: - private static final long serialVersionUID - 113:119:private java.lang.Object readResolve() -org.jfree.chart.MouseWheelHandler: - 93:93:public double getZoomFactor() - 104:105:public void setZoomFactor(double) -org.jfree.chart.PaintMap: - static final long serialVersionUID - 188:198:private void writeObject(java.io.ObjectOutputStream) - 210:218:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.PolarChartPanel: - private static final java.lang.String POLAR_ZOOM_IN_ACTION_COMMAND - private static final java.lang.String POLAR_ZOOM_OUT_ACTION_COMMAND - private static final java.lang.String POLAR_AUTO_RANGE_ACTION_COMMAND -org.jfree.chart.StandardChartTheme: - 1785:1807:private void writeObject(java.io.ObjectOutputStream) - 1819:1841:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.StrokeMap: - static final long serialVersionUID - 183:193:private void writeObject(java.io.ObjectOutputStream) - 205:213:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.AbstractAnnotation: - 205:206:private void writeObject(java.io.ObjectOutputStream) - 218:220:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.CategoryLineAnnotation: - static final long serialVersionUID - 404:407:private void writeObject(java.io.ObjectOutputStream) - 419:422:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.CategoryPointerAnnotation: - private static final long serialVersionUID - 520:523:private void writeObject(java.io.ObjectOutputStream) - 535:538:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.CategoryTextAnnotation: - private static final long serialVersionUID -org.jfree.chart.annotations.TextAnnotation: - private static final long serialVersionUID - 349:351:private void writeObject(java.io.ObjectOutputStream) - 363:365:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYBoxAnnotation: - private static final long serialVersionUID - 286:290:private void writeObject(java.io.ObjectOutputStream) - 303:307:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYDataImageAnnotation: - 354:357:private void writeObject(java.io.ObjectOutputStream) - 369:372:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYDrawableAnnotation: - private static final long serialVersionUID -org.jfree.chart.annotations.XYImageAnnotation: - private static final long serialVersionUID - 300:302:private void writeObject(java.io.ObjectOutputStream) - 314:316:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYLineAnnotation: - private static final long serialVersionUID - 291:294:private void writeObject(java.io.ObjectOutputStream) - 306:309:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYPointerAnnotation: - private static final long serialVersionUID - 540:543:private void writeObject(java.io.ObjectOutputStream) - 555:558:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYPolygonAnnotation: - private static final long serialVersionUID - 337:341:private void writeObject(java.io.ObjectOutputStream) - 353:357:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYShapeAnnotation: - private static final long serialVersionUID - 288:293:private void writeObject(java.io.ObjectOutputStream) - 305:310:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYTextAnnotation: - private static final long serialVersionUID - 655:660:private void writeObject(java.io.ObjectOutputStream) - 672:677:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.annotations.XYTitleAnnotation: - private static final long serialVersionUID -org.jfree.chart.axis.Axis: - private static final long serialVersionUID - 1418:1425:private void writeObject(java.io.ObjectOutputStream) - 1437:1445:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.axis.AxisLocation: - private static final long serialVersionUID - 170:182:private java.lang.Object readResolve() -org.jfree.chart.axis.AxisSpace: - private static final long serialVersionUID -org.jfree.chart.axis.CategoryAnchor: - private static final long serialVersionUID - 120:129:private java.lang.Object readResolve() -org.jfree.chart.axis.CategoryAxis: - private static final long serialVersionUID - 1379:1381:private void writeObject(java.io.ObjectOutputStream) - 1393:1395:private void readObject(java.io.ObjectInputStream) - 1412:1423:private java.util.Map readPaintMap(java.io.ObjectInputStream) - 1439:1454:private void writePaintMap(java.util.Map,java.io.ObjectOutputStream) -org.jfree.chart.axis.CategoryAxis3D: - private static final long serialVersionUID -org.jfree.chart.axis.CategoryLabelPosition: - private static final long serialVersionUID -org.jfree.chart.axis.CategoryLabelPositions: - private static final long serialVersionUID -org.jfree.chart.axis.CategoryLabelWidthType: - private static final long serialVersionUID - 118:124:private java.lang.Object readResolve() -org.jfree.chart.axis.ColorBar: - private static final long serialVersionUID -org.jfree.chart.axis.CompassFormat: - private static final java.lang.String N - private static final java.lang.String E - private static final java.lang.String S - private static final java.lang.String W -org.jfree.chart.axis.CyclicNumberAxis: - static final long serialVersionUID - 1131:1135:private void writeObject(java.io.ObjectOutputStream) - 1148:1152:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.axis.DateAxis: - private static final long serialVersionUID -org.jfree.chart.axis.DateTickMarkPosition: - private static final long serialVersionUID - 120:129:private java.lang.Object readResolve() -org.jfree.chart.axis.DateTickUnit: - private static final long serialVersionUID -org.jfree.chart.axis.DateTickUnitType: - 150:171:private java.lang.Object readResolve() -org.jfree.chart.axis.ExtendedCategoryAxis: - static final long serialVersionUID - 238:240:private void writeObject(java.io.ObjectOutputStream) - 252:254:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.axis.LogarithmicAxis: - private static final long serialVersionUID -org.jfree.chart.axis.MarkerAxisBand: - private static final long serialVersionUID -org.jfree.chart.axis.NumberAxis: - private static final long serialVersionUID -org.jfree.chart.axis.NumberAxis3D: - private static final long serialVersionUID -org.jfree.chart.axis.NumberTickUnit: - private static final long serialVersionUID -org.jfree.chart.axis.PeriodAxis: - private static final long serialVersionUID - 1198:1201:private void writeObject(java.io.ObjectOutputStream) - 1213:1216:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.axis.PeriodAxisLabelInfo: - private static final long serialVersionUID - 362:366:private void writeObject(java.io.ObjectOutputStream) - 378:382:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.axis.QuarterDateFormat: - private static final long serialVersionUID -org.jfree.chart.axis.SegmentedTimeline: - private static final long serialVersionUID -org.jfree.chart.axis.SubCategoryAxis: - private static final long serialVersionUID - 418:420:private void writeObject(java.io.ObjectOutputStream) - 432:434:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.axis.SymbolAxis: - private static final long serialVersionUID - 785:788:private void writeObject(java.io.ObjectOutputStream) - 800:803:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.axis.Tick: - private static final long serialVersionUID -org.jfree.chart.axis.TickType: - 111:118:private java.lang.Object readResolve() -org.jfree.chart.axis.TickUnit: - private static final long serialVersionUID -org.jfree.chart.axis.TickUnits: - private static final long serialVersionUID -org.jfree.chart.axis.ValueAxis: - private static final long serialVersionUID - 1729:1734:private void writeObject(java.io.ObjectOutputStream) - 1747:1752:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.block.AbstractBlock: - private static final long serialVersionUID - 644:646:private void writeObject(java.io.ObjectOutputStream) - 658:660:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.block.BlockBorder: - private static final long serialVersionUID - 223:225:private void writeObject(java.io.ObjectOutputStream) - 237:239:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.block.BlockContainer: - private static final long serialVersionUID -org.jfree.chart.block.BorderArrangement: - private static final long serialVersionUID -org.jfree.chart.block.CenterArrangement: - private static final long serialVersionUID -org.jfree.chart.block.ColorBlock: - static final long serialVersionUID - 169:171:private void writeObject(java.io.ObjectOutputStream) - 183:185:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.block.ColumnArrangement: - private static final long serialVersionUID -org.jfree.chart.block.EmptyBlock: - private static final long serialVersionUID -org.jfree.chart.block.FlowArrangement: - private static final long serialVersionUID -org.jfree.chart.block.GridArrangement: - private static final long serialVersionUID -org.jfree.chart.block.LabelBlock: - static final long serialVersionUID - 427:429:private void writeObject(java.io.ObjectOutputStream) - 441:443:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.block.LengthConstraintType: - private static final long serialVersionUID - 126:135:private java.lang.Object readResolve() -org.jfree.chart.block.LineBorder: - static final long serialVersionUID - 213:216:private void writeObject(java.io.ObjectOutputStream) - 228:231:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.demo.BarChartDemo1: - private static final long serialVersionUID -org.jfree.chart.demo.PieChartDemo1: - private static final long serialVersionUID -org.jfree.chart.demo.TimeSeriesChartDemo1: - private static final long serialVersionUID -org.jfree.chart.editor.DefaultChartEditor: - 206:206:public org.jfree.chart.editor.DefaultTitleEditor getTitleEditor() - 215:215:public org.jfree.chart.editor.DefaultPlotEditor getPlotEditor() -org.jfree.chart.editor.DefaultPlotEditor: - private static final int ORIENTATION_VERTICAL - private static final int ORIENTATION_HORIZONTAL -org.jfree.chart.entity.AxisEntity: - private static final long serialVersionUID - 192:194:private void writeObject(java.io.ObjectOutputStream) - 206:208:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.entity.CategoryItemEntity: - private static final long serialVersionUID -org.jfree.chart.entity.ChartEntity: - private static final long serialVersionUID - 414:416:private void writeObject(java.io.ObjectOutputStream) - 428:430:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.entity.ContourEntity: - private static final long serialVersionUID -org.jfree.chart.entity.JFreeChartEntity: - private static final long serialVersionUID - 192:194:private void writeObject(java.io.ObjectOutputStream) - 206:208:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.entity.LegendItemEntity: - private static final long serialVersionUID -org.jfree.chart.entity.PieSectionEntity: - private static final long serialVersionUID -org.jfree.chart.entity.PlotEntity: - private static final long serialVersionUID - 192:194:private void writeObject(java.io.ObjectOutputStream) - 206:208:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.entity.StandardEntityCollection: - private static final long serialVersionUID -org.jfree.chart.entity.TickLabelEntity: - private static final long serialVersionUID -org.jfree.chart.entity.TitleEntity: - private static final long serialVersionUID - 192:194:private void writeObject(java.io.ObjectOutputStream) - 206:208:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.entity.XYAnnotationEntity: - private static final long serialVersionUID -org.jfree.chart.entity.XYItemEntity: - private static final long serialVersionUID -org.jfree.chart.event.ChartChangeEventType: - private static final long serialVersionUID - 126:135:private java.lang.Object readResolve() -org.jfree.chart.labels.AbstractCategoryItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.AbstractPieItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.AbstractXYItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.BoxAndWhiskerToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.BoxAndWhiskerXYToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.BubbleXYItemLabelGenerator: - static final long serialVersionUID -org.jfree.chart.labels.CustomXYToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.HighLowItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.IntervalCategoryItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.IntervalCategoryToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.ItemLabelAnchor: - private static final long serialVersionUID - 214:290:private java.lang.Object readResolve() -org.jfree.chart.labels.ItemLabelPosition: - private static final long serialVersionUID -org.jfree.chart.labels.MultipleXYSeriesLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardCategoryItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardCategorySeriesLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardCategoryToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardContourToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardPieSectionLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardPieToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardXYItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardXYSeriesLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardXYToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.StandardXYZToolTipGenerator: - private static final long serialVersionUID -org.jfree.chart.labels.SymbolicXYItemLabelGenerator: - private static final long serialVersionUID -org.jfree.chart.needle.ArrowNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.LineNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.LongNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.MeterNeedle: - private static final long serialVersionUID - 411:416:private void writeObject(java.io.ObjectOutputStream) - 428:433:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.needle.MiddlePinNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.PinNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.PlumNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.PointerNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.ShipNeedle: - private static final long serialVersionUID -org.jfree.chart.needle.WindNeedle: - private static final long serialVersionUID -org.jfree.chart.plot.CategoryPlot: - private static final long serialVersionUID - 5069:5082:private void writeObject(java.io.ObjectOutputStream) - 5095:5139:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.ColorPalette: - private static final long serialVersionUID -org.jfree.chart.plot.CombinedDomainCategoryPlot: - private static final long serialVersionUID -org.jfree.chart.plot.CombinedDomainXYPlot: - private static final long serialVersionUID -org.jfree.chart.plot.CombinedRangeCategoryPlot: - private static final long serialVersionUID - 556:565:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.CombinedRangeXYPlot: - private static final long serialVersionUID -org.jfree.chart.plot.CompassPlot: - private static final long serialVersionUID - 863:867:private void writeObject(java.io.ObjectOutputStream) - 879:883:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.ContourPlot: - private static final long serialVersionUID -org.jfree.chart.plot.Crosshair: - 695:702:private void writeObject(java.io.ObjectOutputStream) - 714:722:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.DatasetRenderingOrder: - private static final long serialVersionUID - 132:138:private java.lang.Object readResolve() -org.jfree.chart.plot.DefaultDrawingSupplier: - private static final long serialVersionUID - 427:459:private void writeObject(java.io.ObjectOutputStream) - 471:503:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.DialShape: - private static final long serialVersionUID - 125:134:private java.lang.Object readResolve() -org.jfree.chart.plot.FastScatterPlot: - private static final long serialVersionUID - 1077:1083:private void writeObject(java.io.ObjectOutputStream) - 1095:1111:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.GreyPalette: - private static final long serialVersionUID -org.jfree.chart.plot.IntervalMarker: - private static final long serialVersionUID -org.jfree.chart.plot.JThermometer: - private static final long serialVersionUID -org.jfree.chart.plot.Marker: - private static final long serialVersionUID - 636:642:private void writeObject(java.io.ObjectOutputStream) - 654:661:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.MeterInterval: - private static final long serialVersionUID - 202:206:private void writeObject(java.io.ObjectOutputStream) - 218:222:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.MeterPlot: - private static final long serialVersionUID - 1265:1272:private void writeObject(java.io.ObjectOutputStream) - 1284:1294:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.MultiplePiePlot: - private static final long serialVersionUID - 661:664:private void writeObject(java.io.ObjectOutputStream) - 676:680:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.PieLabelLinkStyle: - 126:136:private java.lang.Object readResolve() -org.jfree.chart.plot.PiePlot: - private static final long serialVersionUID - static final boolean DEBUG_DRAW_INTERIOR - static final boolean DEBUG_DRAW_LINK_AREA - static final boolean DEBUG_DRAW_PIE_AREA - 3514:3530:private void writeObject(java.io.ObjectOutputStream) - 3542:3558:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.PiePlot3D: - private static final long serialVersionUID -org.jfree.chart.plot.Plot: - private static final long serialVersionUID - 1393:1399:private void writeObject(java.io.ObjectOutputStream) - 1411:1420:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.PlotOrientation: - private static final long serialVersionUID - 124:131:private java.lang.Object readResolve() -org.jfree.chart.plot.PlotRenderingInfo: - private static final long serialVersionUID - 268:271:private void writeObject(java.io.ObjectOutputStream) - 283:286:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.PolarAxisLocation: - private static final long serialVersionUID - 139:163:private java.lang.Object readResolve() -org.jfree.chart.plot.PolarPlot: - private static final long serialVersionUID - private static final int DEFAULT_MARGIN - private static final double ANNOTATION_MARGIN - 1917:1923:private void writeObject(java.io.ObjectOutputStream) - 1936:1965:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.RainbowPalette: - private static final long serialVersionUID -org.jfree.chart.plot.RingPlot: - private static final long serialVersionUID - 542:545:private void writeObject(java.io.ObjectOutputStream) - 557:560:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.SeriesRenderingOrder: - private static final long serialVersionUID - 130:136:private java.lang.Object readResolve() -org.jfree.chart.plot.SpiderWebPlot: - private static final long serialVersionUID - 1603:1615:private void writeObject(java.io.ObjectOutputStream) - 1627:1642:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.ThermometerPlot: - private static final long serialVersionUID - 1663:1673:private void writeObject(java.io.ObjectOutputStream) - 1685:1699:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.WaferMapPlot: - private static final long serialVersionUID -org.jfree.chart.plot.XYPlot: - private static final long serialVersionUID - 5644:5667:private void writeObject(java.io.ObjectOutputStream) - 5680:5739:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.AbstractDialLayer: - 209:211:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.ArcDialFrame: - static final long serialVersionUID - 493:497:private void writeObject(java.io.ObjectOutputStream) - 509:513:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.DialBackground: - static final long serialVersionUID - 249:251:private void writeObject(java.io.ObjectOutputStream) - 263:265:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.DialCap: - static final long serialVersionUID - 314:318:private void writeObject(java.io.ObjectOutputStream) - 330:334:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.DialPlot: - 813:814:private void writeObject(java.io.ObjectOutputStream) - 826:827:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.DialPointer$Pin: - static final long serialVersionUID - 364:367:private void writeObject(java.io.ObjectOutputStream) - 379:382:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.DialPointer$Pointer: - static final long serialVersionUID - 624:627:private void writeObject(java.io.ObjectOutputStream) - 639:642:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.DialTextAnnotation: - static final long serialVersionUID - 382:384:private void writeObject(java.io.ObjectOutputStream) - 396:398:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.DialValueIndicator: - static final long serialVersionUID - 750:755:private void writeObject(java.io.ObjectOutputStream) - 767:772:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.StandardDialFrame: - static final long serialVersionUID - 334:338:private void writeObject(java.io.ObjectOutputStream) - 350:354:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.StandardDialRange: - static final long serialVersionUID - 416:418:private void writeObject(java.io.ObjectOutputStream) - 430:432:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.plot.dial.StandardDialScale: - static final long serialVersionUID - 991:997:private void writeObject(java.io.ObjectOutputStream) - 1009:1015:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.AbstractRenderer: - private static final long serialVersionUID - 3309:3327:private void writeObject(java.io.ObjectOutputStream) - 3340:3362:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.AreaRendererEndType: - private static final long serialVersionUID - 127:137:private java.lang.Object readResolve() -org.jfree.chart.renderer.DefaultPolarItemRenderer: - 979:982:private void readObject(java.io.ObjectInputStream) - 992:995:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.LookupPaintScale: - static final long serialVersionUID - 382:384:private void writeObject(java.io.ObjectOutputStream) - 396:398:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.LookupPaintScale$PaintItem: - static final long serialVersionUID - 148:150:private void writeObject(java.io.ObjectOutputStream) - 162:164:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.WaferMapRenderer: - private static final int DEFAULT_PAINT_LIMIT -org.jfree.chart.renderer.category.AbstractCategoryItemRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.AreaRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.BarRenderer: - private static final long serialVersionUID - 1392:1394:private void writeObject(java.io.ObjectOutputStream) - 1406:1408:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.BarRenderer3D: - private static final long serialVersionUID - 814:816:private void writeObject(java.io.ObjectOutputStream) - 828:830:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.BoxAndWhiskerRenderer: - private static final long serialVersionUID - 1095:1097:private void writeObject(java.io.ObjectOutputStream) - 1109:1111:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.CategoryStepRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.DefaultCategoryItemRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.GanttRenderer: - private static final long serialVersionUID - 617:620:private void writeObject(java.io.ObjectOutputStream) - 632:635:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.GroupedStackedBarRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.IntervalBarRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.LayeredBarRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.LevelRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.LineAndShapeRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.LineRenderer3D: - private static final long serialVersionUID - 657:659:private void writeObject(java.io.ObjectOutputStream) - 671:673:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.MinMaxCategoryRenderer: - private static final long serialVersionUID - 535:538:private void writeObject(java.io.ObjectOutputStream) - 550:559:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.ScatterRenderer: - 575:577:private void writeObject(java.io.ObjectOutputStream) - 588:590:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.StackedAreaRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.category.StackedBarRenderer: - static final long serialVersionUID -org.jfree.chart.renderer.category.StackedBarRenderer3D: - private static final long serialVersionUID -org.jfree.chart.renderer.category.StatisticalBarRenderer: - private static final long serialVersionUID - 579:582:private void writeObject(java.io.ObjectOutputStream) - 594:597:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.StatisticalLineAndShapeRenderer: - private static final long serialVersionUID - 473:476:private void writeObject(java.io.ObjectOutputStream) - 488:491:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.category.WaterfallBarRenderer: - private static final long serialVersionUID - 481:486:private void writeObject(java.io.ObjectOutputStream) - 498:503:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.xy.AbstractXYItemRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.CandlestickRenderer: - private static final long serialVersionUID - 947:951:private void writeObject(java.io.ObjectOutputStream) - 963:967:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.xy.ClusteredXYBarRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.CyclicXYItemRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.DefaultXYItemRenderer: - static final long serialVersionUID -org.jfree.chart.renderer.xy.HighLowRenderer: - private static final long serialVersionUID - 512:515:private void readObject(java.io.ObjectInputStream) - 525:528:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.SamplingXYLineRenderer: - 394:396:private void readObject(java.io.ObjectInputStream) - 406:408:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.StackedXYAreaRenderer: - private static final long serialVersionUID - 679:682:private void readObject(java.io.ObjectInputStream) - 692:695:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.StackedXYAreaRenderer2: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.StackedXYBarRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.StandardXYItemRenderer: - private static final long serialVersionUID - 1132:1134:private void readObject(java.io.ObjectInputStream) - 1144:1146:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.WindItemRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.XYAreaRenderer: - private static final long serialVersionUID - 758:760:private void readObject(java.io.ObjectInputStream) - 770:772:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYAreaRenderer2: - private static final long serialVersionUID - 460:462:private void readObject(java.io.ObjectInputStream) - 472:474:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYBarRenderer: - private static final long serialVersionUID - 1284:1286:private void readObject(java.io.ObjectInputStream) - 1296:1298:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYBoxAndWhiskerRenderer: - private static final long serialVersionUID - 819:822:private void writeObject(java.io.ObjectOutputStream) - 835:838:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.xy.XYDifferenceRenderer: - private static final long serialVersionUID - 1228:1232:private void writeObject(java.io.ObjectOutputStream) - 1244:1248:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.renderer.xy.XYDotRenderer: - private static final long serialVersionUID - 386:388:private void readObject(java.io.ObjectInputStream) - 398:400:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYErrorRenderer: - static final long serialVersionUID - 439:442:private void readObject(java.io.ObjectInputStream) - 452:455:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYLine3DRenderer: - private static final long serialVersionUID - 267:269:private void readObject(java.io.ObjectInputStream) - 279:281:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYLineAndShapeRenderer: - private static final long serialVersionUID - 1365:1367:private void readObject(java.io.ObjectInputStream) - 1377:1379:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYShapeRenderer: - private static final long serialVersionUID - 599:602:private void readObject(java.io.ObjectInputStream) - 612:615:private void writeObject(java.io.ObjectOutputStream) -org.jfree.chart.renderer.xy.XYStepAreaRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.XYStepRenderer: - private static final long serialVersionUID -org.jfree.chart.renderer.xy.YIntervalRenderer: - private static final long serialVersionUID -org.jfree.chart.title.CompositeTitle: - private static final long serialVersionUID - 228:230:private void writeObject(java.io.ObjectOutputStream) - 242:244:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.title.DateTitle: - private static final long serialVersionUID -org.jfree.chart.title.LegendGraphic: - static final long serialVersionUID - 724:732:private void writeObject(java.io.ObjectOutputStream) - 744:752:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.title.LegendTitle: - private static final long serialVersionUID - 675:678:private void writeObject(java.io.ObjectOutputStream) - 690:693:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.title.PaintScaleLegend: - static final long serialVersionUID - 703:707:private void writeObject(java.io.ObjectOutputStream) - 719:723:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.title.TextTitle: - private static final long serialVersionUID - 897:900:private void writeObject(java.io.ObjectOutputStream) - 912:915:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.title.Title: - private static final long serialVersionUID - 441:442:private void writeObject(java.io.ObjectOutputStream) - 454:456:private void readObject(java.io.ObjectInputStream) -org.jfree.chart.urls.CustomPieURLGenerator: - private static final long serialVersionUID -org.jfree.chart.urls.CustomXYURLGenerator: - private static final long serialVersionUID -org.jfree.chart.urls.StandardCategoryURLGenerator: - private static final long serialVersionUID -org.jfree.chart.urls.StandardPieURLGenerator: - private static final long serialVersionUID -org.jfree.chart.urls.StandardXYURLGenerator: - private static final long serialVersionUID -org.jfree.chart.urls.TimeSeriesURLGenerator: - private static final long serialVersionUID -org.jfree.chart.util.DefaultShadowGenerator: - private static final long serialVersionUID -org.jfree.chart.util.PaintAlpha: - private static final double FACTOR -org.jfree.chart.util.XYCoordinateType: - 123:132:private java.lang.Object readResolve() -org.jfree.data.ComparableObjectItem: - private static final long serialVersionUID -org.jfree.data.DefaultKeyedValue: - private static final long serialVersionUID -org.jfree.data.DefaultKeyedValues: - private static final long serialVersionUID -org.jfree.data.DefaultKeyedValues2D: - private static final long serialVersionUID -org.jfree.data.DomainOrder: - private static final long serialVersionUID - 126:135:private java.lang.Object readResolve() -org.jfree.data.KeyToGroupMap: - private static final long serialVersionUID -org.jfree.data.KeyedObject: - private static final long serialVersionUID -org.jfree.data.KeyedObjects: - private static final long serialVersionUID -org.jfree.data.KeyedObjects2D: - private static final long serialVersionUID -org.jfree.data.Range: - private static final long serialVersionUID -org.jfree.data.RangeType: - private static final long serialVersionUID - 127:136:private java.lang.Object readResolve() -org.jfree.data.category.CategoryToPieDataset: - static final long serialVersionUID -org.jfree.data.category.DefaultCategoryDataset: - private static final long serialVersionUID -org.jfree.data.contour.NonGridContourDataset: - static final int DEFAULT_NUM_X - static final int DEFAULT_NUM_Y - static final int DEFAULT_POWER -org.jfree.data.gantt.Task: - private static final long serialVersionUID -org.jfree.data.gantt.TaskSeriesCollection: - private static final long serialVersionUID -org.jfree.data.general.AbstractDataset: - private static final long serialVersionUID - 216:217:private void writeObject(java.io.ObjectOutputStream) - 229:233:private void readObject(java.io.ObjectInputStream) -org.jfree.data.general.AbstractSeriesDataset: - private static final long serialVersionUID -org.jfree.data.general.DatasetGroup: - private static final long serialVersionUID -org.jfree.data.general.DefaultKeyedValueDataset: - private static final long serialVersionUID -org.jfree.data.general.DefaultKeyedValues2DDataset: - private static final long serialVersionUID -org.jfree.data.general.DefaultKeyedValuesDataset: - private static final long serialVersionUID -org.jfree.data.general.DefaultPieDataset: - private static final long serialVersionUID -org.jfree.data.general.DefaultValueDataset: - private static final long serialVersionUID -org.jfree.data.general.Series: - private static final long serialVersionUID -org.jfree.data.general.SeriesChangeEvent: - private static final long serialVersionUID -org.jfree.data.general.SeriesException: - private static final long serialVersionUID -org.jfree.data.general.WaferMapDataset: - private static final double DEFAULT_CHIP_SPACE -org.jfree.data.jdbc.JDBCCategoryDataset: - static final long serialVersionUID -org.jfree.data.jdbc.JDBCPieDataset: - static final long serialVersionUID -org.jfree.data.statistics.BoxAndWhiskerItem: - private static final long serialVersionUID -org.jfree.data.statistics.HistogramBin: - private static final long serialVersionUID -org.jfree.data.statistics.HistogramDataset: - private static final long serialVersionUID -org.jfree.data.statistics.HistogramType: - private static final long serialVersionUID - 135:144:private java.lang.Object readResolve() -org.jfree.data.statistics.MeanAndStandardDeviation: - private static final long serialVersionUID -org.jfree.data.statistics.SimpleHistogramBin: - private static final long serialVersionUID -org.jfree.data.statistics.SimpleHistogramDataset: - private static final long serialVersionUID -org.jfree.data.time.DateRange: - private static final long serialVersionUID -org.jfree.data.time.Day: - private static final long serialVersionUID -org.jfree.data.time.FixedMillisecond: - private static final long serialVersionUID -org.jfree.data.time.Hour: - private static final long serialVersionUID -org.jfree.data.time.Millisecond: - static final long serialVersionUID -org.jfree.data.time.Minute: - private static final long serialVersionUID -org.jfree.data.time.Month: - private static final long serialVersionUID -org.jfree.data.time.Quarter: - private static final long serialVersionUID -org.jfree.data.time.Second: - private static final long serialVersionUID -org.jfree.data.time.SimpleTimePeriod: - private static final long serialVersionUID -org.jfree.data.time.TimePeriodAnchor: - private static final long serialVersionUID - 131:140:private java.lang.Object readResolve() -org.jfree.data.time.TimePeriodValue: - private static final long serialVersionUID -org.jfree.data.time.TimePeriodValues: - static final long serialVersionUID -org.jfree.data.time.TimePeriodValuesCollection: - private static final long serialVersionUID -org.jfree.data.time.TimeSeries: - private static final long serialVersionUID - 443:447:org.jfree.data.time.TimeSeriesDataItem getRawDataItem(org.jfree.data.time.RegularTimePeriod) -org.jfree.data.time.TimeSeriesCollection: - private static final long serialVersionUID -org.jfree.data.time.TimeSeriesDataItem: - private static final long serialVersionUID -org.jfree.data.time.Week: - private static final long serialVersionUID -org.jfree.data.time.Year: - private static final long serialVersionUID -org.jfree.data.xy.IntervalXYDelegate: - private static final long serialVersionUID -org.jfree.data.xy.MatrixSeries: - private static final long serialVersionUID -org.jfree.data.xy.MatrixSeriesCollection: - private static final long serialVersionUID -org.jfree.data.xy.OHLCDataItem: - private static final long serialVersionUID -org.jfree.data.xy.XYDataItem: - private static final long serialVersionUID -org.jfree.data.xy.XYSeries: - static final long serialVersionUID -org.jfree.data.xy.XYSeriesCollection: - private static final long serialVersionUID -org.jfree.date.SerialDate: - private static final long serialVersionUID -org.jfree.date.SpreadsheetDate: - private static final long serialVersionUID -org.jfree.layout.CenterLayout: - private static final long serialVersionUID -org.jfree.layout.FormatLayout: - private static final long serialVersionUID -org.jfree.layout.LCBLayout: - private static final long serialVersionUID - private static final int COLUMNS -org.jfree.layout.RadialLayout: - private static final long serialVersionUID -org.jfree.text.TextBlock: - private static final long serialVersionUID -org.jfree.text.TextBlockAnchor: - private static final long serialVersionUID - 162:189:private java.lang.Object readResolve() -org.jfree.text.TextBox: - private static final long serialVersionUID - 423:428:private void writeObject(java.io.ObjectOutputStream) - 440:445:private void readObject(java.io.ObjectInputStream) -org.jfree.text.TextFragment: - private static final long serialVersionUID - 314:316:private void writeObject(java.io.ObjectOutputStream) - 328:330:private void readObject(java.io.ObjectInputStream) -org.jfree.text.TextLine: - private static final long serialVersionUID -org.jfree.threads.ReaderWriterLock$ReaderWriterNode: - protected static final int READER - protected static final int WRITER -org.jfree.ui.BevelArrowIcon: - private static final int DEFAULT_SIZE -org.jfree.ui.FloatDimension: - private static final long serialVersionUID -org.jfree.ui.GradientPaintTransformType: - private static final long serialVersionUID - 140:153:private java.lang.Object readResolve() -org.jfree.ui.HorizontalAlignment: - private static final long serialVersionUID - 131:141:private java.lang.Object readResolve() -org.jfree.ui.KeyedComboBoxModel$ComboBoxItemPair: - 118:119:public void setValue(java.lang.Object) -org.jfree.ui.Layer: - private static final long serialVersionUID - 128:135:private java.lang.Object readResolve() -org.jfree.ui.LengthAdjustmentType: - private static final long serialVersionUID - 131:140:private java.lang.Object readResolve() -org.jfree.ui.RectangleAnchor: - private static final long serialVersionUID - 269:297:private java.lang.Object readResolve() -org.jfree.ui.RectangleEdge: - private static final long serialVersionUID - 213:226:private java.lang.Object readResolve() -org.jfree.ui.RectangleInsets: - private static final long serialVersionUID -org.jfree.ui.Size2D: - private static final long serialVersionUID -org.jfree.ui.StandardGradientPaintTransformer: - private static final long serialVersionUID -org.jfree.ui.TextAnchor: - private static final long serialVersionUID - 182:228:private java.lang.Object readResolve() -org.jfree.ui.VerticalAlignment: - private static final long serialVersionUID - 134:144:private java.lang.Object readResolve() -org.jfree.ui.about.SystemPropertiesFrame: - private static final java.lang.String COPY_COMMAND - private static final java.lang.String CLOSE_COMMAND -org.jfree.util.AbstractObjectList: - private static final long serialVersionUID - 244:258:private void writeObject(java.io.ObjectOutputStream) - 271:281:private void readObject(java.io.ObjectInputStream) -org.jfree.util.BooleanList: - private static final long serialVersionUID -org.jfree.util.ClassComparator: - private static final long serialVersionUID -org.jfree.util.HashNMap: - private static final long serialVersionUID -org.jfree.util.ObjectTable: - private static final long serialVersionUID - 353:370:private void writeObject(java.io.ObjectOutputStream) - 396:413:private void readObject(java.io.ObjectInputStream) -org.jfree.util.PaintList: - private static final long serialVersionUID - 134:148:private void writeObject(java.io.ObjectOutputStream) - 160:169:private void readObject(java.io.ObjectInputStream) -org.jfree.util.PrintStreamLogTarget: - private static final long serialVersionUID -org.jfree.util.Rotation: - private static final long serialVersionUID - 149:155:private java.lang.Object readResolve() -org.jfree.util.ShapeList: - 144:158:private void writeObject(java.io.ObjectOutputStream) - 170:179:private void readObject(java.io.ObjectInputStream) -org.jfree.util.SortOrder: - private static final long serialVersionUID - 132:138:private java.lang.Object readResolve() -org.jfree.util.SortedConfigurationWriter: - private static final int ESCAPE_KEY - private static final int ESCAPE_VALUE - private static final int ESCAPE_COMMENT -org.jfree.util.StrokeList: - 141:155:private void writeObject(java.io.ObjectOutputStream) - 167:176:private void readObject(java.io.ObjectInputStream) -org.jfree.util.TableOrder: - private static final long serialVersionUID - 125:131:private java.lang.Object readResolve() -org.jfree.util.UnitType: - private static final long serialVersionUID - 124:130:private java.lang.Object readResolve() -org.jfree.util.WaitingImageObserver: - static final long serialVersionUID -org.netbeans.lib.awtextra.AbsoluteConstraints: - static final long serialVersionUID -org.netbeans.lib.awtextra.AbsoluteLayout: - static final long serialVersionUID -org.w3c.dom.DOMException: - static final long serialVersionUID -org.w3c.dom.bootstrap.DOMImplementationRegistry: - private static final int DEFAULT_LINE_LENGTH - private static final java.lang.String DEFAULT_DOM_IMPLEMENTATION_SOURCE -org.xml.sax.SAXException: - static final long serialVersionUID -org.xml.sax.SAXNotRecognizedException: - static final long serialVersionUID -org.xml.sax.SAXNotSupportedException: - static final long serialVersionUID -org.xml.sax.SAXParseException: - static final long serialVersionUID -org.xml.sax.helpers.NewInstance: - private static final boolean DO_FALLBACK -org.xml.sax.helpers.ParserAdapter: - private static final java.lang.String FEATURES - private static final java.lang.String NAMESPACES - private static final java.lang.String NAMESPACE_PREFIXES - private static final java.lang.String XMLNS_URIs -org.xml.sax.helpers.SecuritySupport: - private SecuritySupport() - static java.io.FileInputStream getFileInputStream(java.io.File) -org.xml.sax.helpers.SecuritySupport$3 -org.xml.sax.helpers.XMLReaderFactory: - private static final java.lang.String property - private static final int DEFAULT_LINE_LENGTH -teamma.data.LRB: - private static final java.lang.String CS_Name - private static final java.lang.String CS_Skills - private static final java.lang.String CS_Teams - private static final java.lang.String CS_Team - private static final java.lang.String CS_Picture - private static final java.lang.String CS_Starplayers - private static final java.lang.String CS_Inducements - private static final java.lang.String CS_Mercenaries - private static final java.lang.String CS_Babes - private static final java.lang.String CS_Wizard - private static final java.lang.String CS_Cards - private static final java.lang.String CS_Check_nb_big_guys - private static final java.lang.String CS_ChaosWizard - private static final java.lang.String CS_KariColdstell - private static final java.lang.String CS_FinkDaFixer - private static final java.lang.String CS_PapaSkullbones - private static final java.lang.String CS_GalandrilSilverWater - private static final java.lang.String CS_KrotShockwhisker - private static final java.lang.String CS_HoracioXSchottenheim - private static final java.lang.String CS_Category - private static final java.lang.String CS_Accronym - private static final java.lang.String CS_Special - private static final java.lang.String CS_Skill - private static final java.lang.String CS_Reroll - private static final java.lang.String CS_Apothecary - private static final java.lang.String CS_Chef - private static final java.lang.String CS_Igor - private static final java.lang.String CS_Bribe - private static final java.lang.String CS_PlayerTypes - private static final java.lang.String CS_PlayerType - private static final java.lang.String CS_Position - private static final java.lang.String CS_Limit - private static final java.lang.String CS_Movement - private static final java.lang.String CS_Strength - private static final java.lang.String CS_Agility - private static final java.lang.String CS_Armor - private static final java.lang.String CS_Cost - private static final java.lang.String CS_Single - private static final java.lang.String CS_SkillType - private static final java.lang.String CS_Double - private static final java.lang.String CS_SkillNotFound - private static final java.lang.String CS_SkillTypeNotFound - private static final java.lang.String CS_RosterTypeNotFound - private static final java.lang.String CS_forThePlayer - private static final java.lang.String CS_Starplayer -teamma.data.Roster: - private static final java.lang.String CS_LRB - private static final java.lang.String CS_Roster - private static final java.lang.String CS_Composition - private static final java.lang.String CS_Apothecary - private static final java.lang.String CS_Assistants - private static final java.lang.String CS_Cheerleaders - private static final java.lang.String CS_FanFactor - private static final java.lang.String CS_Rerolls - private static final java.lang.String CS_Inducements - private static final java.lang.String CS_Chef - private static final java.lang.String CS_Igor - private static final java.lang.String CS_Wizard - private static final java.lang.String CS_Babes - private static final java.lang.String CS_Cards - private static final java.lang.String CS_Bribe - private static final java.lang.String CS_ExtraRerolls - private static final java.lang.String CS_LocalApothecary - private static final java.lang.String CS_StarPlayer - private static final java.lang.String CS_Name - private static final java.lang.String CS_Player - private static final java.lang.String CS_Position - private static final java.lang.String CS_Skill - private static final java.lang.String CS_Color -teamma.tableModel.MjtPlayerTypes: - private static final java.lang.String CS_Limit - private static final java.lang.String CS_Position - private static final java.lang.String CS_M - private static final java.lang.String CS_S - private static final java.lang.String CS_Ag - private static final java.lang.String CS_Ar - private static final java.lang.String CS_Skills - private static final java.lang.String CS_SR - private static final java.lang.String CS_DR - private static final java.lang.String CS_BaseCost - private static final java.lang.String CS_Characteristics -teamma.tableModel.MjtStarPlayers: - private static final java.lang.String CS_Limit - private static final java.lang.String CS_Position - private static final java.lang.String CS_M - private static final java.lang.String CS_S - private static final java.lang.String CS_Ag - private static final java.lang.String CS_Ar - private static final java.lang.String CS_Skills - private static final java.lang.String CS_BaseCost - private static final java.lang.String CS_Characteristics -teamma.tableModel.MjtTeamPlayers: - private static final java.lang.String CS_Name - private static final java.lang.String CS_Position - private static final java.lang.String CS_M - private static final java.lang.String CS_S - private static final java.lang.String CS_Ag - private static final java.lang.String CS_Ar - private static final java.lang.String CS_Skills - private static final java.lang.String CS_SR - private static final java.lang.String CS_DR - private static final java.lang.String CS_BaseCost - private static final java.lang.String CS_Cost - private static final java.lang.String CS_Characteristics -teamma.tableModel.MjtTeamStars: - private static final java.lang.String CS_Name - private static final java.lang.String CS_Position - private static final java.lang.String CS_M - private static final java.lang.String CS_S - private static final java.lang.String CS_Ag - private static final java.lang.String CS_Ar - private static final java.lang.String CS_Skills - private static final java.lang.String CS_Cost -teamma.views.JdgRoster: - private static final java.lang.String CS_ChooseRoster - private static final java.lang.String CS_RosterChoice - private static final java.lang.String CS_RosterChoiceError - private static final java.lang.String CS_ChooseCoach - private static final java.lang.String CS_CoachChoice - private static final java.lang.String CS_SelectSkillToRemove - private static final java.lang.String CS_Skill - private static final java.lang.String CS_RosterTypeNotSelectedClieckOnRoster - private static final java.lang.String CS_ChooseKindOfplayer - private static final java.lang.String CS_PlayerChoice - private static final java.lang.String CS_Roster - private static final java.lang.String CS_Coach - private static final java.lang.String CS_RosterUnknown - private static final java.lang.String CS_AssociateACoach -teamma.views.JdgSelectPosition: - private static final java.lang.String CS_Error - private static final java.lang.String CS_NoSkillSelected -teamma.views.JdgSelectSkill: - private static final java.lang.String CS_SingleRoll - private static final java.lang.String CS_DoubleRoll - private static final java.lang.String CS_Error - private static final java.lang.String CS_NoSkillSelected - 260:261:private void setPlayer(teamma.data.Player) -teamma.views.report.JdgPrintableRoster: - private static final java.lang.String CS_title - private static final java.lang.String CS_numero - private static final java.lang.String CS_name - private static final java.lang.String CS_position - private static final java.lang.String CS_movement - private static final java.lang.String CS_strength - private static final java.lang.String CS_agility - private static final java.lang.String CS_armor - private static final java.lang.String CS_skills - private static final java.lang.String CS_cost - private static final java.lang.String CS_single - private static final java.lang.String CS_double - private static final java.lang.String CS_NBSP - private static final java.lang.String CS_players - private static final java.lang.String CS_teamname - private static final java.lang.String CS_apothecary - private static final java.lang.String CS_apo_price - private static final java.lang.String CS_apo_cost - private static final java.lang.String CS_coachname - private static final java.lang.String CS_assists - private static final java.lang.String CS_ass_price - private static final java.lang.String CS_ass_cost - private static final java.lang.String CS_race - private static final java.lang.String CS_cheer - private static final java.lang.String CS_cheer_price - private static final java.lang.String CS_cheer_cost - private static final java.lang.String CS_rank - private static final java.lang.String CS_reroll - private static final java.lang.String CS_reroll_price - private static final java.lang.String CS_reroll_cost - private static final java.lang.String CS_pop - private static final java.lang.String CS_pop_price - private static final java.lang.String CS_pop_cost - private static final java.lang.String CS_extra - private static final java.lang.String CS_extra_price - private static final java.lang.String CS_extra_cost - private static final java.lang.String CS_local - private static final java.lang.String CS_local_price - private static final java.lang.String CS_local_cost - private static final java.lang.String CS_igor - private static final java.lang.String CS_igor_price - private static final java.lang.String CS_igor_cost - private static final java.lang.String CS_bribe - private static final java.lang.String CS_bribe_price - private static final java.lang.String CS_bribe_cost - private static final java.lang.String CS_wizard - private static final java.lang.String CS_wizard_price - private static final java.lang.String CS_wizard_cost - private static final java.lang.String CS_babes - private static final java.lang.String CS_babes_price - private static final java.lang.String CS_babes_cost - private static final java.lang.String CS_chef - private static final java.lang.String CS_chef_price - private static final java.lang.String CS_chef_cost - private static final java.lang.String CS_cards - private static final java.lang.String CS_total - private static final java.lang.String CS_chaoswizard - private static final java.lang.String CS_chaoswizard_price - private static final java.lang.String CS_chaoswizard_cost - private static final java.lang.String CS_horatio - private static final java.lang.String CS_horatio_price - private static final java.lang.String CS_horatio_cost - private static final java.lang.String CS_kari - private static final java.lang.String CS_kari_price - private static final java.lang.String CS_kari_cost - private static final java.lang.String CS_fink - private static final java.lang.String CS_fink_price - private static final java.lang.String CS_fink_cost - private static final java.lang.String CS_papa - private static final java.lang.String CS_papa_price - private static final java.lang.String CS_papa_cost - private static final java.lang.String CS_galandril - private static final java.lang.String CS_galandril_price - private static final java.lang.String CS_galandril_cost - private static final java.lang.String CS_krot - private static final java.lang.String CS_krot_price - private static final java.lang.String CS_krot_cost -tourma.JdgChangePairing: - private static final long serialVersionUID - private static final java.lang.String CS_Matchs - private static final java.lang.String CS_Confirm - private static final java.lang.String CS_DoYouConfirmNewpairing - 303:303:private void writeObject(java.io.ObjectOutputStream) - 307:307:private void readObject(java.io.ObjectInputStream) -tourma.JdgCoach: - private static final java.lang.String CS_AnotherCoachHasTheSameName - private static final java.lang.String CS_NameIsEmpty - private static final java.lang.String CS_TeamIsEmpty - private static final java.lang.String CS_RosterIsEmpty - private static final java.lang.String CS_RostersChoice - private static final java.lang.String CS_ChooseRoster - private static final java.lang.String CS_RostersChoiceError0 - private static final java.lang.String CS_SelectPicture - private static final java.lang.String CS_Picture - private static final java.lang.String CS_PleaseSelectCategory - 1018:1018:private void writeObject(java.io.ObjectOutputStream) - 1022:1022:private void readObject(java.io.ObjectInputStream) -tourma.JdgMassAdd: - private static final long serialVersionUID - private static final java.lang.String CS_DownloadFromNAF - private static final java.lang.String CS_Downloading -tourma.JdgPairing: - private static final java.lang.String CS_ACCR_Versus - 333:333:private void writeObject(java.io.ObjectOutputStream) - 337:337:private void readObject(java.io.ObjectInputStream) -tourma.JdgParameters: - 530:530:private void writeObject(java.io.ObjectOutputStream) - 534:534:private void readObject(java.io.ObjectInputStream) -tourma.JdgRosters: - private static final java.lang.String CS_NewRoster - private static final java.lang.String CS_NewRosterName -tourma.JdgSelectNumber: - 122:122:private void writeObject(java.io.ObjectOutputStream) - 126:126:private void readObject(java.io.ObjectInputStream) -tourma.JdgTeam: - private boolean mTeamTournament - private static final java.lang.String CS_EmptyTeamName - private static final java.lang.String CS_SelectPicture - private static final java.lang.String CS_Picture - private static final java.lang.String CS_PleaseSelectCategory - 619:619:private void writeObject(java.io.ObjectOutputStream) - 623:623:private void readObject(java.io.ObjectInputStream) -tourma.JdgTeamPairing: - 237:237:private void writeObject(java.io.ObjectOutputStream) - 241:241:private void readObject(java.io.ObjectInputStream) -tourma.MainFrame: - private static final java.lang.String CS_TourMaXMLFile - private static final java.lang.String CS_None - private static final java.lang.String CS_NAFXMLFile - private static final java.lang.String CS_DoYouWantToSave - private static final java.lang.String CS_Exit - private static final java.lang.String CS_FBBCSVFile - private static final java.lang.String CS_FBBXMLFile - private static final java.lang.String CS_Check - private static final java.lang.String CS_LargeVictoryPointsAreNotSuperiorToVictoryPoints - private static final java.lang.String CS_LittleLossPointsAreNotSuperiorToLossPoints - private static final java.lang.String CS_LargeVictoryGapIsNotMoreThanOneTouchdown - private static final java.lang.String CS_LittleLostGapIsNotSuperiorTo0 - private static final java.lang.String CS_2DrawsAreMoreThan1Victory - private static final java.lang.String CS_2LostAreMoreThan1Draw - private static final java.lang.String CS_2LittleLostAreMoreThanOneDraw - private static final java.lang.String CS_2TeamDrawsAreMoreThan1TeamVictory - private static final java.lang.String CS_2TeamLostAreMoreThan1TeamVictory - private static final java.lang.String CS_2TeamDrawBonusAreMoreThan1TeamVictoryBonus - private static final java.lang.String CS_Random - private static final java.lang.String CS_Cup - private static final java.lang.String CS_RegisteringOrder - private static final java.lang.String CS_RoundRobin - private static final java.lang.String CS_OddTeamNumber - private static final java.lang.String CS_ManualChoice - private static final java.lang.String CS_Pools - private static final java.lang.String CS_FreeRound - private static final java.lang.String CS_NafRanking - private static final java.lang.String CS_NafRankingAvg - private static final java.lang.String CS_RandomAndBalancing - private static final java.lang.String CS_Generation - private static final java.lang.String CS_ChooseGenerationMethod - private static final java.lang.String CS_DownloadFromNAF - private static final java.lang.String CS_Downloading - private static final java.lang.String CS_WhichCoachIsSubstituted - private static final java.lang.String CS_Substitution - private static final java.lang.String CS_Round - private static final java.lang.String CS_ACCR_Versus - private static final java.lang.String CS_WhichMatch - private static final java.lang.String CS_ChooseASubstitute - private static final java.lang.String CS_NewDOTDOTDOT - private static final java.lang.String CS_FirstTableCoef - private static final java.lang.String CS_LastTableCoef - private static final java.lang.String CS_RoundCoefficient - private static final java.lang.String CS_SwissRound - private static final java.lang.String CS_SwissRound_TopDown - private static final java.lang.String CS_AcceleratedSwissRound - private static final java.lang.String CS_Animation - private static final java.lang.String CS_Confirm - private static final java.lang.String CS_WebMacthNotChecked - private static final java.lang.String CS_FreeMatch - private static final java.lang.String CS_Error - private static final java.lang.String CS_ImpossibleMatch - private static final java.lang.String CS_MatchAlreadyConceededOrRefused - private static final java.lang.String CS_Cancel - private static final java.lang.String CS_ConceedAMatch - private static final java.lang.String CS_WhoConceedTheMatch - private static final java.lang.String CS_RefuseAMatch - private static final java.lang.String CS_WhoRefuseMatch - private static final java.lang.String COLOR_1 - private static final java.lang.String COLOR_2 - private static final java.lang.String COLOR_WRITING - private static final java.lang.String COLOR_BORDER - private static final java.lang.String CS_Download - private static final java.lang.String CS_NewGame - private static final java.lang.String CS_Open - private static final java.lang.String CS_UseRosterEditor - private static final java.lang.String CS_ClientViewer - private static final java.lang.String CS_NewGameOrOpen - private static final java.lang.String CS_EnterRemoteTourmaServer - private static final java.lang.String CS_Exiting - private static final java.lang.String CS_ConnectionImpossibleTo - private static final java.lang.String CS_ChooseFullScreen - private static final java.lang.String CS_IndividualRanking - private static final java.lang.String CS_IndividualAnnexRanking - private static final java.lang.String CS_TeamRanking - private static final java.lang.String CS_TeamAnnexRanking - private static final java.lang.String CS_ClanRanking - private static final java.lang.String CS_ClanAnnexRanking - private static final java.lang.String CS_MatchsClash - private static final java.lang.String CS_CategoryRanking - private static final java.lang.String CS_CategoryAnnexRanking - private static final java.lang.String CS_GroupeRanking - private static final java.lang.String CS_GroupeAnnexRanking - private static final java.lang.String CS_IndividualPoolRanking - private static final java.lang.String CS_IndividualPoolAnnexRanking - private static final java.lang.String CS_TeamPoolRanking - private static final java.lang.String CS_TeamPoolAnnexRanking - private static final java.lang.String CS_Matchs - 3570:3570:private void writeObject(java.io.ObjectOutputStream) - 3574:3574:private void readObject(java.io.ObjectInputStream) -tourma.data.Coach: - private static final java.lang.String CS_MESSAGE1 - private static final java.lang.String CS_MESSAGE2 - 1009:1056:java.util.ArrayList getMinimumTeamsBalanced(tourma.data.Round) -tourma.data.TeamMatch: - 1311:1330:int getValue(tourma.data.Team,tourma.data.TeamMatch,tourma.data.Criteria,int) -tourma.tableModel.MjtAnnexRank: - 170:170:private void writeObject(java.io.ObjectOutputStream) - 174:174:private void readObject(java.io.ObjectInputStream) -tourma.tableModel.MjtCriterias: - private static final java.lang.String CS_CriteriaAlreadyExists - 226:226:private void writeObject(java.io.ObjectOutputStream) - 230:230:private void readObject(java.io.ObjectInputStream) -tourma.tableModel.MjtCriteriasIndivBonus: - private static final java.lang.String CS_CriteriaAlreadyExists - 254:254:private void writeObject(java.io.ObjectOutputStream) - 258:258:private void readObject(java.io.ObjectInputStream) -tourma.tableModel.MjtCriteriasTeamBonus: - private static final java.lang.String CS_CriteriaAlreadyExists - 218:218:private void writeObject(java.io.ObjectOutputStream) - 222:222:private void readObject(java.io.ObjectInputStream) -tourma.tableModel.MjtMatchTeams: - 237:237:private void writeObject(java.io.ObjectOutputStream) - 241:241:private void readObject(java.io.ObjectInputStream) -tourma.tableModel.MjtMatches: - 836:836:private void writeObject(java.io.ObjectOutputStream) - 840:840:private void readObject(java.io.ObjectInputStream) -tourma.tableModel.MjtPairs: - 138:138:private void writeObject(java.io.ObjectOutputStream) - 142:142:private void readObject(java.io.ObjectInputStream) -tourma.tableModel.MjtRankingTeam: - 47:83:private static int getTeamVND(tourma.data.Team,java.util.ArrayList) - 93:161:private static int getTeamPoints(tourma.data.Team,java.util.ArrayList) -tourma.tableModel.MjtTeams: - 153:153:private void writeObject(java.io.ObjectOutputStream) - 157:157:private void readObject(java.io.ObjectInputStream) -tourma.utility.Version: - private static final java.lang.String CS_VERSION_RESOURCES - private static final java.lang.String CS_VERSION_KEY -tourma.utils.Generation: - private static final java.lang.String CS_GenerationError - private static final java.lang.String CS_BadNumberOfActivePlayersForTeam - private static final java.lang.String CS_OddNumberOfActiveCoachs - private static final java.lang.String CS_DoYouWantATeamFirstPairing - private static final java.lang.String CS_FirstRound - private static final java.lang.String CS_NumberByPool - private static final java.lang.String CS_TheNumberOfTeamsIsNotAMultipleOfYourChoice - private static final java.lang.String CS_DoYouWantToChooseRankTeam - private static final java.lang.String CS_ChooseCompetitor - private static final java.lang.String CS_ChooseOpponentFor - private static final java.lang.String CS_ChoosOpponent - private static final java.lang.String CS_IsItDoubleKickTournament - private static final java.lang.String CS_NotEnoughRoundToAvoidSameMatch - private static final java.lang.String CS_AccleratedSwissMethodIsNotApplicable - private static final java.lang.String CS_DoYouWantToMixDraw - private static final java.lang.String CS_FinalRoundReached - private static final java.lang.String CS_DoYouWantToGenerateThirdPlaceMatch - private static final java.lang.String CS_NumberOfTurns - private static final java.lang.String CS_DoYouWantToUseCategoriesForTheCup - private static final java.lang.String CS_PleaseSelectCategoriesToUseForTheCup - private static final java.lang.String CS_MixAll - private static final java.lang.String CS_MixByAbsoluteRanking - private static final java.lang.String CS_MixByCategoryRanking - private static final java.lang.String CS_KeepGroup - private static final java.lang.String CS_AffectRoundsToRemainingCoachs - private static final java.lang.String CS_UseSwissRoundOrRandom - 827:830:private static int factorielle(int) -tourma.utils.NafTask: - private static final java.lang.String CS_DownloadFromNAF - private static final java.lang.String CS_Downloading - private static final java.lang.String CS_Download -tourma.utils.web.WebRules: - private static final java.lang.String CS_Criterias - private static final java.lang.String CS_Individual_Points - private static final java.lang.String CS_LargeVictory - private static final java.lang.String CS_LargeVictoryGap - private static final java.lang.String CS_Victory - private static final java.lang.String CS_TeamVictoryBonus - private static final java.lang.String CS_TeamDrawBonus - private static final java.lang.String CS_Draw - private static final java.lang.String CS_Lost - private static final java.lang.String CS_LittleLost - private static final java.lang.String CS_LittleLostGap - private static final java.lang.String CS_Order - private static final java.lang.String CS_Options - private static final java.lang.String CS_ExceptBestAndWorst - private static final java.lang.String CS_UseBestResults - private static final java.lang.String CS_ExceptBestAndWorstForAnnex - private static final java.lang.String CS_NumberOfPlayersForClan - private static final java.lang.String CS_AvoidFirstRoundMatchClan - private static final java.lang.String CS_AvoidRoundMatchClan - private static final java.lang.String CS_Categories - private static final java.lang.String CS_Groups - private static final java.lang.String CS_MatchAdditional -tourma.views.GraphicalMatch: - private static final long serialVersionUID - 181:181:private void writeObject(java.io.ObjectOutputStream) - 185:185:private void readObject(java.io.ObjectInputStream) -tourma.views.JPNStatistics: - private static final java.lang.String CS_OpponentByTeam - private static final java.lang.String CS_OpponentByCoach - private static final java.lang.String CS_Done - private static final java.lang.String CS_DoneAgainst - private static final java.lang.String CS_ValueByRoster - private static final java.lang.String CS_Roster - private static final java.lang.String CS_Number - private static final java.lang.String CS_Victories - private static final java.lang.String CS_Drawns - private static final java.lang.String CS_Losts - private static final java.lang.String CS_ResultsByRoster - private static final java.lang.String CS_Results - private static final java.lang.String CS_Groups - private static final java.lang.String CS_Points - private static final java.lang.String CS_OpponentsPoints - private static final java.lang.String CS_Rankings - private static final java.lang.String CS_TeamRankings - private static final java.lang.String CS_Ranking - private static final java.lang.String CS_Round - private static final java.lang.String CS_OpponentsByTeam - private static final java.lang.String CS_OpponentsByCoach - private static final java.lang.String CS_Opponents - private static final java.lang.String CS_MatchsCount - 1146:1146:private void writeObject(java.io.ObjectOutputStream) - 1150:1150:private void readObject(java.io.ObjectInputStream) -tourma.views.fullscreen.JFullScreenClanRank: - private static final long serialVersionUID - private static final java.lang.String CS_Clan - private static final java.lang.String CS_Members -tourma.views.fullscreen.JFullScreenClanTeamAnnex: - private static final java.lang.String CS_Clan - private static final java.lang.String CS_Team - private static final java.lang.String CS_Pool -tourma.views.fullscreen.JFullScreenIndivAnnex: - private static final java.lang.String CS_Pool - private static final java.lang.String CS_Team - private static final java.lang.String CS_Clan - private static final java.lang.String CS_Coach -tourma.views.fullscreen.JFullScreenIndivRank: - private static final long serialVersionUID - private static final java.lang.String CS_Pool - private static final java.lang.String CS_Team - private static final java.lang.String CS_Clan - private static final java.lang.String CS_Coach - private static final java.lang.String CS_Roster - private static final java.lang.String CS_RosterName -tourma.views.fullscreen.JFullScreenMatchs$Animation: - private static final java.lang.String CS_Round - private static final java.lang.String CS_Table -tourma.views.fullscreen.JFullScreenTeamRank: - private static final java.lang.String CS_Pool - private static final java.lang.String CS_Team -tourma.views.parameters.JPNParamCategories: - private static final java.lang.String CS_EnterCategoryNameKey -tourma.views.parameters.JPNParamClan: - private static final java.lang.String CS_EnterClanNameKey - private static final java.lang.String CS_SelectAnPicture - private static final java.lang.String CS_Picture -tourma.views.parameters.JPNParamCriterias: - private static final java.lang.String CS_Criteria -tourma.views.parameters.JPNParamGroup: - private static final java.lang.String CS_EnterNewGroupName - private static final java.lang.String CS_EnterGroupNewName -tourma.views.parameters.JPNParamIndiv: - 676:676:private void writeObject(java.io.ObjectOutputStream) - 680:680:private void readObject(java.io.ObjectInputStream) -tourma.views.parameters.JPNParamTeam: - private static final java.lang.String CS_None - private static final java.lang.String CS_Points - private static final java.lang.String CS_OpponentPoints - private static final java.lang.String CS_ACCR_VictoryDrawLost - private static final java.lang.String CS_ELO - private static final java.lang.String CS_OpponentsElo - private static final java.lang.String CS_MatchCount - private static final java.lang.String CS_OpponentsPointsExceptOwnMatch - private static final java.lang.String CS_TablesPoints - private static final java.lang.String CS_PointsWithoutBonus - private static final java.lang.String CS_BonusPoints - private static final java.lang.String CS_Player - private static final java.lang.String CS_Opponent - private static final java.lang.String CS_Difference -tourma.views.parameters.JPNParameters: - private static final java.lang.String CS_Individual - private static final java.lang.String CS_Criterias - private static final java.lang.String CS_ByTeam - private static final java.lang.String CS_Clan - private static final java.lang.String CS_Group - private static final java.lang.String CS_Category -tourma.views.parameters.JPNTeams: - private static final java.lang.String CS_ByTeam - private static final java.lang.String CS_Single - private static final java.lang.String CS_Membersnumber -tourma.views.report.JdgGlobal: - private static final long serialVersionUID - private static final java.lang.String CS_Round - private static final java.lang.String CS_ByClan - private static final java.lang.String CS_ByTeam - private static final java.lang.String CS_ByCoach - private static final java.lang.String CS_TheMostFor - private static final java.lang.String CS_TheLessFor - private static final java.lang.String CS_TheMoreAgainst - private static final java.lang.String CS_TheLessAgainst -tourma.views.report.JdgPrintLabel: - private static final java.lang.String CS_ACCR_Versus - 469:469:private void writeObject(java.io.ObjectOutputStream) - 473:473:private void readObject(java.io.ObjectInputStream) -tourma.views.report.JdgRanking: - private static final java.lang.String CS_Round -tourma.views.report.JdgReport: - private static final long serialVersionUID - private static final java.lang.String CS_IncludeMembersReports - private static final java.lang.String CS_TheMostFor - private static final java.lang.String CS_TheLessFor - private static final java.lang.String CS_TheMoreAgainst - private static final java.lang.String CS_TheLessAgainst -tourma.views.report.JdgRound: - private static final java.lang.String CS_Round -tourma.views.report.Match -tourma.views.round.JPNAnnexRanking: - private static final java.lang.String CS_Clan - private static final java.lang.String CS_Opponents - private static final java.lang.String CS_Team - private static final java.lang.String CS_Coach - private static final java.lang.String CS_ByTheClan - private static final java.lang.String CS_ByTheCoach - private static final java.lang.String CS_ByTheTeam - private static final java.lang.String CS_AgainstTheClan - private static final java.lang.String CS_AgainstTheCoach - private static final java.lang.String CS_AgainstTheTeam -tourma.views.round.JPNCategory: - private static final java.lang.String CS_GeneralByCategory -tourma.views.round.JPNClan: - private static final java.lang.String CS_GeneralByClan -tourma.views.round.JPNGroup: - private static final java.lang.String CS_Group -tourma.views.round.JPNPool: - private static final long serialVersionUID - private static final java.lang.String CS_GeneralByPool -tourma.views.round.JPNRound: - private static final long serialVersionUID - private static final java.lang.String CS_ByTeam - private static final java.lang.String CS_ByClan - private static final java.lang.String CS_None - private static final java.lang.String CS_Group - private static final java.lang.String CS_Category - private static final java.lang.String CS_Pool - private static final java.lang.String CS_GeneralByCoach - private static final java.lang.String CS_ChooseARosterFor - private static final java.lang.String CS_Roster -tourma.views.round.JPNTeamRound: - private static final java.lang.String CS_Matchs - private static final java.lang.String CS_generalByTeam -tourma.views.system.JdgAbout: - private static final java.lang.String CS_Name - private static final java.lang.String CS_Date - private static final java.lang.String CS_Version -tourma.views.system.MtRevisions: - private static final java.lang.String CS_Version - private static final java.lang.String CS_Description diff --git a/proguard.cfg b/proguard.cfg index 706bc8c8..d8ac313a 100644 --- a/proguard.cfg +++ b/proguard.cfg @@ -1,56 +1,45 @@ -injars store\TourMa.jar -outjars obfuscate\TourMa.jar - --libraryjars 'C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar' --libraryjars deps\findbugs-ant.jar --libraryjars deps\j2ee-1.4.jar --libraryjars deps\xalan.jar --libraryjars deps\bcel-6.0-SNAPSHOT.jar --libraryjars deps\ant.jar --libraryjars deps\asm-debug-all-5.0.2.jar --libraryjars deps\jsr305.jar --libraryjars deps\annotations.jar --libraryjars deps\jython-2.2.jar --libraryjars 'C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar' --libraryjars deps\javarebel-sdk-2.0.2.jar --libraryjars 'C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar' --libraryjars deps\jgoodies-looks-2.7.0.jar --libraryjars deps\dom4j-1.4.jar --libraryjars deps\jFormatString.jar --libraryjars deps\commons-lang-2.6.jar --libraryjars deps\AppleJavaExtensions-1.4.jar --libraryjars deps\js-14.jar --libraryjars deps\slf4j-api-1.7.10.jar --libraryjars deps\avalon-framework-impl-4.3.1.jar --libraryjars deps\log4j-1.2.17.jar --libraryjars deps\xml-resolver-1.2.jar --libraryjars deps\xom-1.2.10.jar --libraryjars deps\logkit-1.2.jar --libraryjars deps\commons-collections4-4.2.jar --libraryjars deps\jsp-api-2.0.jar --libraryjars deps\crimson-1.1.3.jar --libraryjars deps\commons-codec-1.11.jar - --keepdirectories +-injars 'C:\Program Files\Java\jre1.8.0_221\lib\rt.jar' + +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\resources.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\jsse.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\jce.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\charsets.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\jfr.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\jfxrt.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\access-bridge-64.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\cldrdata.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\dnsns.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\jaccess.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\localedata.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\nashorn.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\sunec.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\sunjce_provider.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\sunmscapi.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\sunpkcs11.jar' +-libraryjars 'C:\Program Files\Java\jre1.8.0_221\lib\ext\zipfs.jar' + +-dontskipnonpubliclibraryclassmembers +-keepdirectories 'tourma/naf/**;tourma/languages/**',tourma/images/** -target 1.8 -forceprocessing -printusage obfuscate\unused.txt -dontobfuscate --printmapping obfuscate\out.map -dontusemixedcaseclassnames --keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod --renamesourcefileattribute SourceFile --dontnote javax.xml.**,org.w3c.dom.**,org.xml.sax.**,edu.umd.cs.findbugs.anttask.**,javax.activation.**,javax.management.**,javax.transaction.**,edu.umd.cs.findbugs.annotations.**,javax.annotation.**,org.jaxen.**,javax.servlet.jsp.**,org.apache.xerces.impl.dv.xs.**,org.apache.commons.math3.**,edu.umd.cs.findbugs.ba.**,org.bouncycastle.pqc.crypto.xmss.** --dontwarn com.apple.eawt.ApplicationAdapter,javax.servlet.jsp.JspApplicationContext,javax.el.**,com.sun.beans.decoder.DocumentHandler,com.sun.istack.internal.**,com.sun.javafx.font.AndroidFontFinder$1,com.sun.org.apache.xerces.internal.**,com.sun.org.apache.xml.internal.**,com.sun.org.apache.xpath.internal.**,com.sun.rowset.internal.**,com.sun.webkit.dom.**,com.sun.xml.internal.**,com.sun.org.apache.xalan.internal.**,javax.imageio.metadata.**,javax.imageio.metadata.**,org.apache.tools.ant.**,org.apache.xalan.processor.**,org.apache.xml.dtm.**,org.jcp.xml.dsig.internal.**,sun.util.xml.**,org.apache.xalan.transformer.**,org.apache.xalan.serialize.**,javax.xml.soap.**,org.apache.xml.utils.**,org.apache.xpath.**,org.objectweb.asm.**,java.util.prefs.XmlSupport$EH,java.util.prefs.XmlSupport$Resolver,javafx.fxml.FXMLLoader$2,javax.swing.plaf.synth.SynthParser,javax.xml.bind.DatatypeConverterImpl,org.apache.xalan.templates.StylesheetRoot,org.dom4j.dom.**,org.dom4j.io.**,org.dom4j.swing.XMLTableDefinition,org.dom4j.xpath.DefaultNamespaceContext,org.jaxen.function.DocumentFunction,org.jaxen.util.PrecedingAxisIterator$ReverseDescendantOrSelfAxisIterator,org.dom4j.util.XMLErrorHandler,org.jaxen.function.ext.MatrixConcatFunction,nu.xom.**,org.apache.avalon.framework.**,org.apache.xml.resolver.**,org.mozilla.javascript.xmlimpl.**,org.apache.log4j.**,javax.servlet.jsp.**,org.apache.crimson.**,freemarker.ext.jdom.**,freemarker.ext.jython.**,freemarker.ext.xml._JdomNavigator,org.apache.poi.** --ignorewarnings +-microedition +-verbose +-dontnote +-whyareyoukeeping class org.apache.xerces.impl.xpath.regex.Token --keep class org.jdom.Content --keep class org.jdom.Element extends org.jdom.Content { - public *** getParent(...); -} +-keep class org.apache.xerces.impl.xpath.regex.Token + +-keep class org.apache.xerces.impl.xpath.regex.Token$UnionToken + +-keep class java.lang.StringBuffer -keepclasseswithmembers,allowshrinking class * { native ; @@ -61,22 +50,9 @@ public static void main(java.lang.String[]); } -# Keep - Libraries. Keep all public and protected classes, fields, and methods. --keep public class * { - public protected ; - public protected ; -} - # Also keep - Enumerations. Keep the special static methods that are required in # enumeration classes. -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } - -# Keep - _class method names. Keep all .class method names. This may be -# useful for libraries that will be obfuscated again with different obfuscators. --keepclassmembers,allowshrinking class * { - java.lang.Class class$(java.lang.String); - java.lang.Class class$(java.lang.String,boolean); -} diff --git a/proguard.conf b/proguard.conf deleted file mode 100644 index 776b2a9a..00000000 --- a/proguard.conf +++ /dev/null @@ -1,307 +0,0 @@ --injars store\TourMa.jar --outjars store\TourMal.jar - --libraryjars 'C:\Program Files\Java\jre1.8.0_151\lib\rt.jar' - --keepdirectories --target 1.8 --forceprocessing --dontobfuscate --dontusemixedcaseclassnames - - - -# Keep - Applications. Keep all application classes, along with their 'main' methods. --keepclasseswithmembers public class * { - public static void main(java.lang.String[]); -} - -# Also keep - Enumerations. Keep the special static methods that are required in -# enumeration classes. --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Also keep - Database drivers. Keep all implementations of java.sql.Driver. --keep class * extends java.sql.Driver - -# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI, -# along with the special 'createUI' method. --keep class * extends javax.swing.plaf.ComponentUI { - public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent); -} - -# Remove - System method calls. Remove all invocations of System -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.System { - public static long currentTimeMillis(); - static java.lang.Class getCallerClass(); - public static int identityHashCode(java.lang.Object); - public static java.lang.SecurityManager getSecurityManager(); - public static java.util.Properties getProperties(); - public static java.lang.String getProperty(java.lang.String); - public static java.lang.String getenv(java.lang.String); - public static java.lang.String mapLibraryName(java.lang.String); - public static java.lang.String getProperty(java.lang.String,java.lang.String); -} - -# Remove - Math method calls. Remove all invocations of Math -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.Math { - public static double sin(double); - public static double cos(double); - public static double tan(double); - public static double asin(double); - public static double acos(double); - public static double atan(double); - public static double toRadians(double); - public static double toDegrees(double); - public static double exp(double); - public static double log(double); - public static double log10(double); - public static double sqrt(double); - public static double cbrt(double); - public static double IEEEremainder(double,double); - public static double ceil(double); - public static double floor(double); - public static double rint(double); - public static double atan2(double,double); - public static double pow(double,double); - public static int round(float); - public static long round(double); - public static double random(); - public static int abs(int); - public static long abs(long); - public static float abs(float); - public static double abs(double); - public static int max(int,int); - public static long max(long,long); - public static float max(float,float); - public static double max(double,double); - public static int min(int,int); - public static long min(long,long); - public static float min(float,float); - public static double min(double,double); - public static double ulp(double); - public static float ulp(float); - public static double signum(double); - public static float signum(float); - public static double sinh(double); - public static double cosh(double); - public static double tanh(double); - public static double hypot(double,double); - public static double expm1(double); - public static double log1p(double); -} - -# Remove - Number method calls. Remove all invocations of Number -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.* extends java.lang.Number { - public static java.lang.String toString(byte); - public static java.lang.Byte valueOf(byte); - public static byte parseByte(java.lang.String); - public static byte parseByte(java.lang.String,int); - public static java.lang.Byte valueOf(java.lang.String,int); - public static java.lang.Byte valueOf(java.lang.String); - public static java.lang.Byte decode(java.lang.String); - public int compareTo(java.lang.Byte); - public static java.lang.String toString(short); - public static short parseShort(java.lang.String); - public static short parseShort(java.lang.String,int); - public static java.lang.Short valueOf(java.lang.String,int); - public static java.lang.Short valueOf(java.lang.String); - public static java.lang.Short valueOf(short); - public static java.lang.Short decode(java.lang.String); - public static short reverseBytes(short); - public int compareTo(java.lang.Short); - public static java.lang.String toString(int,int); - public static java.lang.String toHexString(int); - public static java.lang.String toOctalString(int); - public static java.lang.String toBinaryString(int); - public static java.lang.String toString(int); - public static int parseInt(java.lang.String,int); - public static int parseInt(java.lang.String); - public static java.lang.Integer valueOf(java.lang.String,int); - public static java.lang.Integer valueOf(java.lang.String); - public static java.lang.Integer valueOf(int); - public static java.lang.Integer getInteger(java.lang.String); - public static java.lang.Integer getInteger(java.lang.String,int); - public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer); - public static java.lang.Integer decode(java.lang.String); - public static int highestOneBit(int); - public static int lowestOneBit(int); - public static int numberOfLeadingZeros(int); - public static int numberOfTrailingZeros(int); - public static int bitCount(int); - public static int rotateLeft(int,int); - public static int rotateRight(int,int); - public static int reverse(int); - public static int signum(int); - public static int reverseBytes(int); - public int compareTo(java.lang.Integer); - public static java.lang.String toString(long,int); - public static java.lang.String toHexString(long); - public static java.lang.String toOctalString(long); - public static java.lang.String toBinaryString(long); - public static java.lang.String toString(long); - public static long parseLong(java.lang.String,int); - public static long parseLong(java.lang.String); - public static java.lang.Long valueOf(java.lang.String,int); - public static java.lang.Long valueOf(java.lang.String); - public static java.lang.Long valueOf(long); - public static java.lang.Long decode(java.lang.String); - public static java.lang.Long getLong(java.lang.String); - public static java.lang.Long getLong(java.lang.String,long); - public static java.lang.Long getLong(java.lang.String,java.lang.Long); - public static long highestOneBit(long); - public static long lowestOneBit(long); - public static int numberOfLeadingZeros(long); - public static int numberOfTrailingZeros(long); - public static int bitCount(long); - public static long rotateLeft(long,int); - public static long rotateRight(long,int); - public static long reverse(long); - public static int signum(long); - public static long reverseBytes(long); - public int compareTo(java.lang.Long); - public static java.lang.String toString(float); - public static java.lang.String toHexString(float); - public static java.lang.Float valueOf(java.lang.String); - public static java.lang.Float valueOf(float); - public static float parseFloat(java.lang.String); - public static boolean isNaN(float); - public static boolean isInfinite(float); - public static int floatToIntBits(float); - public static int floatToRawIntBits(float); - public static float intBitsToFloat(int); - public static int compare(float,float); - public boolean isNaN(); - public boolean isInfinite(); - public int compareTo(java.lang.Float); - public static java.lang.String toString(double); - public static java.lang.String toHexString(double); - public static java.lang.Double valueOf(java.lang.String); - public static java.lang.Double valueOf(double); - public static double parseDouble(java.lang.String); - public static boolean isNaN(double); - public static boolean isInfinite(double); - public static long doubleToLongBits(double); - public static long doubleToRawLongBits(double); - public static double longBitsToDouble(long); - public static int compare(double,double); - public boolean isNaN(); - public boolean isInfinite(); - public int compareTo(java.lang.Double); - public byte byteValue(); - public short shortValue(); - public int intValue(); - public long longValue(); - public float floatValue(); - public double doubleValue(); - public int compareTo(java.lang.Object); - public boolean equals(java.lang.Object); - public int hashCode(); - public java.lang.String toString(); -} - -# Remove - String method calls. Remove all invocations of String -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.String { - public static java.lang.String copyValueOf(char[]); - public static java.lang.String copyValueOf(char[],int,int); - public static java.lang.String valueOf(boolean); - public static java.lang.String valueOf(char); - public static java.lang.String valueOf(char[]); - public static java.lang.String valueOf(char[],int,int); - public static java.lang.String valueOf(double); - public static java.lang.String valueOf(float); - public static java.lang.String valueOf(int); - public static java.lang.String valueOf(java.lang.Object); - public static java.lang.String valueOf(long); - public boolean contentEquals(java.lang.StringBuffer); - public boolean endsWith(java.lang.String); - public boolean equalsIgnoreCase(java.lang.String); - public boolean equals(java.lang.Object); - public boolean matches(java.lang.String); - public boolean regionMatches(boolean,int,java.lang.String,int,int); - public boolean regionMatches(int,java.lang.String,int,int); - public boolean startsWith(java.lang.String); - public boolean startsWith(java.lang.String,int); - public byte[] getBytes(); - public byte[] getBytes(java.lang.String); - public char charAt(int); - public char[] toCharArray(); - public int compareToIgnoreCase(java.lang.String); - public int compareTo(java.lang.Object); - public int compareTo(java.lang.String); - public int hashCode(); - public int indexOf(int); - public int indexOf(int,int); - public int indexOf(java.lang.String); - public int indexOf(java.lang.String,int); - public int lastIndexOf(int); - public int lastIndexOf(int,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.CharSequence subSequence(int,int); - public java.lang.String concat(java.lang.String); - public java.lang.String replaceAll(java.lang.String,java.lang.String); - public java.lang.String replace(char,char); - public java.lang.String replaceFirst(java.lang.String,java.lang.String); - public java.lang.String[] split(java.lang.String); - public java.lang.String[] split(java.lang.String,int); - public java.lang.String substring(int); - public java.lang.String substring(int,int); - public java.lang.String toLowerCase(); - public java.lang.String toLowerCase(java.util.Locale); - public java.lang.String toString(); - public java.lang.String toUpperCase(); - public java.lang.String toUpperCase(java.util.Locale); - public java.lang.String trim(); -} - -# Remove - StringBuffer method calls. Remove all invocations of StringBuffer -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.StringBuffer { - public java.lang.String toString(); - public char charAt(int); - public int capacity(); - public int codePointAt(int); - public int codePointBefore(int); - public int indexOf(java.lang.String,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.String substring(int); - public java.lang.String substring(int,int); -} - -# Remove - StringBuilder method calls. Remove all invocations of StringBuilder -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.StringBuilder { - public java.lang.String toString(); - public char charAt(int); - public int capacity(); - public int codePointAt(int); - public int codePointBefore(int); - public int indexOf(java.lang.String,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.String substring(int); - public java.lang.String substring(int,int); -} - -# Remove debugging - All logging API calls. Remove all invocations of the -# logging API whose return values are not used. --assumenosideeffects public class java.util.logging.* { - ; -} - -# Remove debugging - All Log4j API calls. Remove all invocations of the -# Log4j API whose return values are not used. --assumenosideeffects public class org.apache.log4j.** { - ; -} diff --git a/renamelog.xml b/renamelog.xml index 02060459..61b3efd5 100644 --- a/renamelog.xml +++ b/renamelog.xml @@ -1,11 +1,11 @@ @@ -14,106 +14,12 @@ Methods are called which may break in obfuscated version at runtime. Please review your source code to ensure that the dangerous methods are not intended to act on classes which have been obfuscated. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -124,42 +30,24 @@ to act on classes which have been obfuscated. Your class freemarker.core.Configurable calls the java.lang.Class method java.lang.reflect.Field getField(java.lang.String) --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -270,51 +90,17 @@ to act on classes which have been obfuscated. Your class org.apache.xml.security.utils.ClassLoaderUtils calls the java.lang.ClassLoader method java.lang.Class loadClass(java.lang.String) --> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shrinklog.xml b/shrinklog.xml index c1e3bd71..76f0dd12 100644 --- a/shrinklog.xml +++ b/shrinklog.xml @@ -1,80119 +1,37 @@ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -80231,11 +149,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80262,32 +206,39 @@ + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -80301,48 +252,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80367,10 +408,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80397,6 +462,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80406,6 +518,11 @@ + + + + + @@ -80413,7 +530,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80461,7 +606,10 @@ + + + @@ -80470,6 +618,20 @@ + + + + + + + + + + + + + + @@ -80486,6 +648,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80510,40 +715,255 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80551,8 +971,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80560,248 +1010,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -80860,7 +1327,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80882,10 +1390,26 @@ + + + + + + + + + + + + + + + + @@ -80896,8 +1420,18 @@ + + + + + + + + + + @@ -80914,7 +1448,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80924,26 +1547,142 @@ - + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80963,6 +1702,24 @@ + + + + + + + + + + + + + + + + + + @@ -80977,20 +1734,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + @@ -81008,10 +1833,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -81020,19 +1989,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -81064,12 +2233,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -81082,74 +2371,615 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -81220,45 +3050,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + @@ -81268,12 +3208,34 @@ + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -81287,453 +3249,122 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -81741,53 +3372,82 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -81826,659 +3486,438 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -82488,13 +3927,68 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -82521,5551 +4015,259 @@ - - + + + - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - diff --git a/src/teamma/data/Inducement.java b/src/teamma/data/Inducement.java new file mode 100644 index 00000000..ffe693f1 --- /dev/null +++ b/src/teamma/data/Inducement.java @@ -0,0 +1,32 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package teamma.data; + +/** + * + * @author WFMJ7631 + */ +public class Inducement { + + public InducementType getType() { + return _type; + } + + public void setType(InducementType _type) { + this._type = _type; + } + + public int getNb() { + return _nb; + } + + public void setNb(int _nb) { + this._nb = _nb; + } + + InducementType _type; + int _nb; +} diff --git a/src/teamma/data/InducementType.java b/src/teamma/data/InducementType.java new file mode 100644 index 00000000..1de6ac9c --- /dev/null +++ b/src/teamma/data/InducementType.java @@ -0,0 +1,40 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package teamma.data; + +/** + * + * @author WFMJ7631 + */ +public class InducementType { + private String _name; + private int _cost; + private int _nbMax; + + public String getName() { + return _name; + } + + public void setName(String _name) { + this._name = _name; + } + + public int getCost() { + return _cost; + } + + public void setCost(int _cost) { + this._cost = _cost; + } + + public int getNbMax() { + return _nbMax; + } + + public void setNbMax(int _nbMax) { + this._nbMax = _nbMax; + } +} diff --git a/src/teamma/data/LRB.java b/src/teamma/data/LRB.java index 39cf7aff..707f90a8 100644 --- a/src/teamma/data/LRB.java +++ b/src/teamma/data/LRB.java @@ -24,7 +24,7 @@ public final class LRB { public enum E_Version { - LRB1, LRB2, LRB3, LRB4, LRB5, LRB6, CRP1, NAF2017 + LRB1, LRB2, LRB3, LRB4, LRB5, LRB6, CRP1, BB2016 }; /** * @@ -47,6 +47,12 @@ public static boolean isChef_enabled() { return _chef_enabled; } + private E_Version _version = E_Version.BB2016; + + public E_Version getVersion() { + return _version; + } + public static void setChef_enabled(boolean _chef_enabled) { LRB._chef_enabled = _chef_enabled; } @@ -196,7 +202,7 @@ public static LRB getLRB(E_Version version) { _crp1 = new LRB(version); } return _crp1; - case NAF2017: + case BB2016: if (_naf2017 == null) { _naf2017 = new LRB(version); } @@ -235,7 +241,7 @@ private LRB(E_Version version) { _rosterTypes = new ArrayList<>(); _starPlayers = new ArrayList<>(); _skillTypes = new ArrayList<>(); - + _version = version; String path = ""; switch (version) { case LRB1: @@ -259,8 +265,8 @@ private LRB(E_Version version) { case CRP1: path = "crp1"; break; - case NAF2017: - path = "naf2017"; + case BB2016: + path = "BB2016"; break; } @@ -282,6 +288,7 @@ private LRB(E_Version version) { private final static String CS_Picture = "image"; private final static String CS_Starplayers = "starplayers"; private final static String CS_Inducements = "inducements"; + private final static String CS_Inducement = "inducement"; private final static String CS_Mercenaries = "mercenaries"; private final static String CS_Babes = "babes"; private final static String CS_Wizard = "wizard"; @@ -375,14 +382,14 @@ private void loadLRB(InputStream file, String path) { } catch (Exception e) { } - - try { + + try { Element e_horacio = e_inducements.getChild(CS_HoracioXSchottenheim); _horacio_x_schottenheim = e_horacio.getText().equals("yes"); } catch (Exception e) { } - + try { Element e_checkBG = e_inducements.getChild(CS_Check_nb_big_guys); _check_nb_big_guys = e_checkBG.getText().equals("yes"); @@ -491,6 +498,7 @@ private void loadSkills(InputStream file) { private final static String CS_Agility = "agility"; private final static String CS_Armor = "armor"; private final static String CS_Cost = "cost"; + private final static String CS_Max = "max"; private final static String CS_Single = "single"; private final static String CS_SkillType = "skillType"; private final static String CS_Double = "double"; @@ -523,93 +531,24 @@ private void loadTeam(InputStream file, String image) { Element e_apo = racine.getChild(CS_Apothecary); rt.setApothecary(Boolean.parseBoolean(e_apo.getValue())); - Element e_chef_cost = racine.getChild(CS_Chef); - if (e_chef_cost != null) { - rt.setChef_cost(Integer.parseInt(e_chef_cost.getValue())); - } else { - rt.setChef_cost(0); - } - Element e_igor = racine.getChild(CS_Igor); - if (e_igor != null) { - rt.setIgor(Boolean.parseBoolean(e_igor.getValue())); - } else { - rt.setIgor(false); - } + Element e_inducements = racine.getChild(CS_Inducements); - Element e_bribe_cost = racine.getChild(CS_Bribe); - if (e_bribe_cost != null) { - rt.setBribe_cost(Integer.parseInt(e_bribe_cost.getValue())); - } else { - rt.setBribe_cost(0); - } + if (e_inducements != null) { + List l_inducType = e_inducements.getChildren(CS_Inducement); + Iterator cr = l_inducType.iterator(); + rt.clearInducementType(); - try { - Element e_chaos_wizard = racine.getChild(CS_ChaosWizard); - if (e_chaos_wizard != null) { - rt.setChaos_wizard(e_chaos_wizard.getValue().equals("true")); - } else { - rt.setChaos_wizard(false); + while (cr.hasNext()) { + InducementType it = new InducementType(); + Element e_it = cr.next(); + it.setName(e_it.getAttributeValue(CS_Name)); + it.setNbMax(Integer.parseInt(e_it.getAttributeValue(CS_Max))); + it.setCost(Integer.parseInt(e_it.getAttributeValue(CS_Cost))); + rt.addInducementType(it); } - } catch (Exception e) { - } - try { - Element e_kari = racine.getChild(CS_KariColdstell); - if (e_kari != null) { - rt.setKari_Coldstell(e_kari.getValue().equals("true")); - } else { - rt.setKari_Coldstell(false); - } - } catch (Exception e) { - - } - - try { - Element e_fink = racine.getChild(CS_FinkDaFixer); - if (e_fink != null) { - rt.setFink_Da_Fixer(e_fink.getValue().equals("true")); - } else { - rt.setFink_Da_Fixer(false); - } - } catch (Exception e) { - - } - - try { - Element e_papa = racine.getChild(CS_PapaSkullbones); - if (e_papa != null) { - rt.setPapa_Skullbones(e_papa.getValue().equals("true")); - } else { - rt.setPapa_Skullbones(false); - } - } catch (Exception e) { - - } - - try { - Element e_galandril = racine.getChild(CS_GalandrilSilverWater); - if (e_galandril != null) { - rt.setGalandril_Silverwater(e_galandril.getValue().equals("true")); - } else { - rt.setGalandril_Silverwater(false); - } - } catch (Exception e) { - - } - - try { - Element e_krot = racine.getChild(CS_KrotShockwhisker); - if (e_krot != null) { - rt.setKrot_Shockwhisker(e_krot.getValue().equals("true")); - } else { - rt.setKrot_Shockwhisker(false); - } - } catch (Exception e) { - - } - Element e_playerType = racine.getChild(CS_PlayerTypes); List l_players = e_playerType.getChildren(CS_PlayerType); Iterator cr = l_players.iterator(); @@ -673,7 +612,7 @@ private void loadTeam(InputStream file, String image) { } rt.addPlayerType(pt); } - + rt.setVersion(this._version); addRosterType(rt); } catch (JDOMException | IOException jdomexception) { JOptionPane.showMessageDialog(null, "Team: from file " + file.toString() + " " + jdomexception.getLocalizedMessage()); @@ -969,10 +908,10 @@ public static boolean isAllowSpecialSkills() { } /** - * @param _allowSpecialSkills the _allowSpecialSkills to set + * @param allowSpecialSkills the _allowSpecialSkills to set */ - public static void setAllowSpecialSkills(boolean _allowSpecialSkills) { - _allowSpecialSkills = _allowSpecialSkills; + public static void setAllowSpecialSkills(boolean allowSpecialSkills) { + _allowSpecialSkills = allowSpecialSkills; } /** diff --git a/src/teamma/data/Roster.java b/src/teamma/data/Roster.java index 2bc3e2a8..d9f5f2f4 100644 --- a/src/teamma/data/Roster.java +++ b/src/teamma/data/Roster.java @@ -27,6 +27,9 @@ public class Roster implements IXMLExport, Serializable { private final static String CS_FanFactor = "FanFactor"; private final static String CS_Rerolls = "Rerolls"; private final static String CS_Inducements = "Inducements"; + private final static String CS_Inducement = "Inducement"; + private final static String CS_Nb = "Nb"; + private final static String CS_Type = "Type"; private final static String CS_Chef = "Chef"; private final static String CS_Igor = "Igor"; private final static String CS_Wizard = "Wizard"; @@ -50,6 +53,9 @@ public class Roster implements IXMLExport, Serializable { * Standard creation team */ private final ArrayList _players; + + private final ArrayList _inducements; + /** * */ @@ -73,110 +79,9 @@ public class Roster implements IXMLExport, Serializable { /* * Inducements */ - /** - * - */ - private int _extrarerolls; - /** - * - */ - private int _localapothecary; - /** - * - */ - private int _bloodweiserbabes; - /** - * - */ - private int _corruptions; - /** - * - */ - private boolean _chef; - /** - * - */ - private boolean _igor; - /** - * - */ - private boolean _wizard; - - /** - * Chaos Wizard - */ - private boolean _chaos_wizard; - - public boolean isChaos_wizard() { - return _chaos_wizard; - } - - public void setChaos_wizard(boolean _chaos_wizard) { - this._chaos_wizard = _chaos_wizard; - } - - public boolean isHoratio_X_Schottenheim() { - return Horatio_X_Schottenheim; - } - - public void setHoratio_X_Schottenheim(boolean Horatio_X_Schottenheim) { - this.Horatio_X_Schottenheim = Horatio_X_Schottenheim; - } - private boolean Horatio_X_Schottenheim; - - - private boolean Kari_Coldsteel; - - public boolean isKari_Coldsteel() { - return Kari_Coldsteel; - } + - public void setKari_Coldsteel(boolean Kari_Coldsteel) { - this.Kari_Coldsteel = Kari_Coldsteel; - } - - private boolean Fink_Da_Fixer; - - public boolean isFink_Da_Fixer() { - return Fink_Da_Fixer; - } - - public void setFink_Da_Fixer(boolean Fink_Da_Fixer) { - this.Fink_Da_Fixer = Fink_Da_Fixer; - } - - private boolean Papa_Skullbones; - private boolean Galandril_Silverwater; - private boolean Krot_Shockwhisker; - - public boolean isPapa_Skullbones() { - return Papa_Skullbones; - } - - public void setPapa_Skullbones(boolean Papa_Skullbones) { - this.Papa_Skullbones = Papa_Skullbones; - } - - public boolean isGalandril_Silverwater() { - return Galandril_Silverwater; - } - - public void setGalandril_Silverwater(boolean Galandril_Silverwater) { - this.Galandril_Silverwater = Galandril_Silverwater; - } - - public boolean isKrot_Shockwhisker() { - return Krot_Shockwhisker; - } - - public void setKrot_Shockwhisker(boolean Krot_Shockwhisker) { - this.Krot_Shockwhisker = Krot_Shockwhisker; - } - - /** - * - */ - private int _cards; + /* * No mercenary ? */ @@ -201,22 +106,19 @@ public void setVersion(LRB.E_Version _version) { public Roster() { _players = new ArrayList<>(); _champions = new ArrayList<>(); + _inducements = new ArrayList<>(); } public void pull(Roster roster) { this._apothecary = roster._apothecary; this._assistants = roster._assistants; - this._bloodweiserbabes = roster._bloodweiserbabes; - this._cards = roster._cards; + this._cheerleaders = roster._cheerleaders; - this._chef = roster._chef; - this._corruptions = roster._corruptions; - this._extrarerolls = roster._extrarerolls; + this._fanfactor = roster._fanfactor; - this._igor = roster._igor; - this._localapothecary = roster._localapothecary; + this._rerolls = roster._rerolls; - this._wizard = roster._wizard; + this._roster = LRB.getLRB(roster.getRoster().getVersion()).getRosterType(roster.getRoster().getName()); @@ -236,6 +138,42 @@ public void pull(Roster roster) { } + public int getInducementsSize() { + return _inducements.size(); + } + + public Inducement getInducement(int i) { + return _inducements.get(i); + } + + public void setInducement(InducementType it, int nb) { + boolean found = false; + for (int cpt = 0; cpt < _inducements.size(); cpt++) { + Inducement induc = _inducements.get(cpt); + if (induc.getType() == it) { + induc.setNb(nb); + found = true; + } + } + if (!found) { + Inducement induc = new Inducement(); + induc.setType(it); + induc.setNb(nb); + _inducements.add(induc); + } + } + + public int getNbInduc(InducementType it) { + int value = 0; + for (int cpt = 0; cpt < _inducements.size(); cpt++) { + Inducement induc = _inducements.get(cpt); + if (induc.getType() == it) { + value = induc.getNb(); + } + } + return value; + } + /** * * @param bWithSkill @@ -268,23 +206,12 @@ public int getValue(boolean bWithSkill) { cost += _champion.getCost(); } - cost += getBloodweiserbabes() * RosterType.getBabe_cost(); - cost += getCards(); - cost += getRoster() != null ? getCorruptions() * getRoster().getBribe_cost() : 0; - cost += getExtrarerolls() * RosterType.getExtraRerollCost(); - cost += getLocalapothecary() * RosterType.getLocal_apo_cost(); - cost += (isChef()) && (getRoster() != null) ? getRoster().getChef_cost() : 0; - cost += isIgor() ? RosterType.getIgor_cost() : 0; - cost += isWizard() ? RosterType.getWizard_cost() : 0; - - cost += isChaos_wizard()? RosterType.getChaos_wizard_cost() : 0; - cost += isHoratio_X_Schottenheim()? RosterType.getHoratio_X_Schottenheim_cost(): 0; - cost += isFink_Da_Fixer()? RosterType.getFink_Da_Fixer_cost(): 0; - cost += isGalandril_Silverwater()? RosterType.getGalandril_Silverwater_cost(): 0; - cost += isKari_Coldsteel()? RosterType.getKari_Coldstell_cost() : 0; - cost += isKrot_Shockwhisker()? RosterType.getKrot_Shockwhisker_cost(): 0; - cost += isPapa_Skullbones()? RosterType.getPapa_Skullbones_cost(): 0; - + + for (Inducement induc:_inducements) + { + cost+=induc.getNb()*induc.getType().getCost(); + } + return cost; } @@ -298,9 +225,8 @@ public Element getXMLElement() { Element compo = new Element(CS_Composition); if (this.getRoster() != null) { - if (this._version==null) - { - this._version=LRB.E_Version.NAF2017; + if (this._version == null) { + this._version = LRB.E_Version.BB2016; } switch (this._version) { case LRB1: @@ -324,7 +250,7 @@ public Element getXMLElement() { case CRP1: compo.setAttribute(CS_LRB, "CRP1"); break; - case NAF2017: + case BB2016: compo.setAttribute(CS_LRB, "NAF2017"); break; @@ -338,14 +264,14 @@ public Element getXMLElement() { compo.setAttribute(CS_Rerolls, Integer.toString(this.getRerolls())); final Element inducements = new Element(CS_Inducements); - inducements.setAttribute(CS_Chef, Boolean.toString(this.isChef())); - inducements.setAttribute(CS_Igor, Boolean.toString(this.isIgor())); - inducements.setAttribute(CS_Wizard, Boolean.toString(this.isWizard())); - inducements.setAttribute(CS_Babes, Integer.toString(this.getBloodweiserbabes())); - inducements.setAttribute(CS_Cards, Integer.toString(this.getCards())); - inducements.setAttribute(CS_Bribe, Integer.toString(this.getCorruptions())); - inducements.setAttribute(CS_ExtraRerolls, Integer.toString(this.getExtrarerolls())); - inducements.setAttribute(CS_LocalApothecary, Integer.toString(this.getLocalapothecary())); + for (Inducement induc: _inducements) + { + Element e_induc=new Element(CS_Inducement); + e_induc.setAttribute(CS_Nb,Integer.toString(induc._nb)); + e_induc.setAttribute(CS_Type,induc._type.getName()); + inducements.addContent(e_induc); + } + for (int cpt = 0; cpt < getChampionCount(); cpt++) { StarPlayer _champion = getChampion(cpt); @@ -430,14 +356,15 @@ public void setXMLElement(Element e) { final Element inducements = e.getChild(CS_Inducements); if (inducements != null) { - this.setBloodweiserbabes(Integer.parseInt(inducements.getAttributeValue(CS_Babes))); - this.setCards(Integer.parseInt(inducements.getAttributeValue(CS_Cards))); - this.setChef(Boolean.parseBoolean(inducements.getAttributeValue(CS_Chef))); - this.setCorruptions(Integer.parseInt(inducements.getAttributeValue(CS_Bribe))); - this.setExtrarerolls(Integer.parseInt(inducements.getAttributeValue(CS_ExtraRerolls))); - this.setIgor(Boolean.parseBoolean(inducements.getAttributeValue(CS_Igor))); - this.setLocalapothecary(Integer.parseInt(inducements.getAttributeValue(CS_LocalApothecary))); - this.setWizard(Boolean.parseBoolean(inducements.getAttributeValue(CS_Wizard))); + + final List inducs = inducements.getChildren(CS_Inducement); + final Iterator i_induc = inducs.iterator(); + while (i_induc.hasNext()) { + final Element e_induc = i_induc.next(); + final String it_name = e_induc.getAttributeValue(CS_Type); + InducementType it= this.getRoster().getInducementType(it_name); + this.setInducement(it, Integer.parseInt( e_induc.getAttributeValue(CS_Nb))); + } final List stars = inducements.getChildren(CS_StarPlayer); final Iterator s = stars.iterator(); @@ -502,117 +429,7 @@ public void setAssistants(int _assistants) { this._assistants = _assistants; } - /** - * @return the _extrarerolls - */ - public int getExtrarerolls() { - return _extrarerolls; - } - - /** - * @param _extrarerolls the _extrarerolls to set - */ - public void setExtrarerolls(int _extrarerolls) { - this._extrarerolls = _extrarerolls; - } - - /** - * @return the _localapothecary - */ - public int getLocalapothecary() { - return _localapothecary; - } - - /** - * @param _localapothecary the _localapothecary to set - */ - public void setLocalapothecary(int _localapothecary) { - this._localapothecary = _localapothecary; - } - - /** - * @return the _bloodweiserbabes - */ - public int getBloodweiserbabes() { - return _bloodweiserbabes; - } - - /** - * @param _bloodweiserbabes the _bloodweiserbabes to set - */ - public void setBloodweiserbabes(int _bloodweiserbabes) { - this._bloodweiserbabes = _bloodweiserbabes; - } - - /** - * @return the _corruptions - */ - public int getCorruptions() { - return _corruptions; - } - - /** - * @param _corruptions the _corruptions to set - */ - public void setCorruptions(int _corruptions) { - this._corruptions = _corruptions; - } - - /** - * @return the _chef - */ - public boolean isChef() { - return _chef; - } - - /** - * @param _chef the _chef to set - */ - public void setChef(boolean _chef) { - this._chef = _chef; - } - - /** - * @return the _igor - */ - public boolean isIgor() { - return _igor; - } - - /** - * @param _igor the _igor to set - */ - public void setIgor(boolean _igor) { - this._igor = _igor; - } - - /** - * @return the _wizard - */ - public boolean isWizard() { - return _wizard; - } - - /** - * @param _wizard the _wizard to set - */ - public void setWizard(boolean _wizard) { - this._wizard = _wizard; - } - - /** - * @return the _cards - */ - public int getCards() { - return _cards; - } - - /** - * @param _cards the _cards to set - */ - public void setCards(int _cards) { - this._cards = _cards; - } + /** * @param i diff --git a/src/teamma/data/RosterType.java b/src/teamma/data/RosterType.java index 0c06920d..30eceede 100644 --- a/src/teamma/data/RosterType.java +++ b/src/teamma/data/RosterType.java @@ -1,575 +1,607 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package teamma.data; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.logging.Logger; -import teamma.languages.Translate; - -/** - * - * @author WFMJ7631 - */ -public class RosterType implements Serializable { - - teamma.data.LRB.E_Version version=LRB.E_Version.CRP1; - - public LRB.E_Version getVersion() - { - return version; - } - - public void setVersion(LRB.E_Version v) - { - version=v; - } - - /** - * - */ - private static int extraRerollCost = 100000; - /** - * - */ - private static int _babe_cost = 50000; - /** - * - */ - private static int _wizard_cost = 150000; - - private static int _chaos_wizard_cost = 150000; - /** - * - */ - private static int _local_apo_cost = 100000; - /** - * - */ - private static int _igor_cost = 100000; - - - /** - * - */ - private static int _assistant_cost = 10000; - /** - * - */ - private static int _fan_factor_cost = 10000; - /** - * - */ - private static int _cheerleader_cost = 10000; - /** - * - */ - private static int _apothecary_cost = 50000; - private static final Logger LOG = Logger.getLogger(RosterType.class.getName()); - - /** - * @return the extraRerollCost - */ - public static int getExtraRerollCost() { - return extraRerollCost; - } - - /** - * @param aExtra_reroll_cost the extraRerollCost to set - */ - public static void setExtraRerollCost(int aExtra_reroll_cost) { - extraRerollCost = aExtra_reroll_cost; - } - - /** - * @return the _babe_cost - */ - public static int getBabe_cost() { - return _babe_cost; - } - - /** - * @param aBabe_cost the _babe_cost to set - */ - public static void setBabe_cost(int aBabe_cost) { - _babe_cost = aBabe_cost; - } - - /** - * @return the _wizard_cost - */ - public static int getWizard_cost() { - return _wizard_cost; - } - - - /** - * @param aWizard_cost the _wizard_cost to set - */ - public static void setWizard_cost(int aWizard_cost) { - _wizard_cost = aWizard_cost; - } - - /** - * @return the _local_apo_cost - */ - public static int getLocal_apo_cost() { - return _local_apo_cost; - } - - /** - * @param aLocal_apo_cost the _local_apo_cost to set - */ - public static void setLocal_apo_cost(int aLocal_apo_cost) { - _local_apo_cost = aLocal_apo_cost; - } - - /** - * @return the _igor_cost - */ - public static int getIgor_cost() { - return _igor_cost; - } - - /** - * @param aIgor_cost the _igor_cost to set - */ - public static void setIgor_cost(int aIgor_cost) { - _igor_cost = aIgor_cost; - } - - /** - * @return the _assistant_cost - */ - public static int getAssistant_cost() { - return _assistant_cost; - } - - /** - * @param aAssistant_cost the _assistant_cost to set - */ - public static void setAssistant_cost(int aAssistant_cost) { - _assistant_cost = aAssistant_cost; - } - - /** - * @return the _fan_factor_cost - */ - public static int getFan_factor_cost() { - return _fan_factor_cost; - } - - /** - * @param aFan_factor_cost the _fan_factor_cost to set - */ - public static void setFan_factor_cost(int aFan_factor_cost) { - _fan_factor_cost = aFan_factor_cost; - } - - /** - * @return the _cheerleader_cost - */ - public static int getCheerleader_cost() { - return _cheerleader_cost; - } - - /** - * @param aCheerleader_cost the _cheerleader_cost to set - */ - public static void setCheerleader_cost(int aCheerleader_cost) { - _cheerleader_cost = aCheerleader_cost; - } - - /** - * @return the _apothecary_cost - */ - public static int getApothecary_cost() { - return _apothecary_cost; - } - - /** - * @param aApothecary_cost the _apothecary_cost to set - */ - public static void setApothecary_cost(int aApothecary_cost) { - _apothecary_cost = aApothecary_cost; - } - /** - * - */ - private String _name; - /** - * - */ - private int _reroll_cost; - /** - * - */ - private boolean _apothecary; - /** - * - */ - private int _bribe_cost; - /** - * - */ - private int _chef_cost; - /** - * - */ - private boolean _igor; - - public boolean isChaos_wizard() { - return _chaos_wizard; - } - - public void setChaos_wizard(boolean _chaos_wizard) { - this._chaos_wizard = _chaos_wizard; - } - - public static int getChaos_wizard_cost() { - return _chaos_wizard_cost; - } - - public static void setChaos_wizard_cost(int _chaos_wizard_cost) { - _chaos_wizard_cost = _chaos_wizard_cost; - } - - public static int getHoratio_X_Schottenheim_cost() { - return Horatio_X_Schottenheim_cost; - } - - public static void setHoratio_X_Schottenheim_cost(int Horatio_X_Schottenheim_cost) { - RosterType.Horatio_X_Schottenheim_cost = Horatio_X_Schottenheim_cost; - } - - public boolean isKari_Coldstell() { - return Kari_Coldstell; - } - - public void setKari_Coldstell(boolean Kari_Coldstell) { - this.Kari_Coldstell = Kari_Coldstell; - } - - public static int getKari_Coldstell_cost() { - return Kari_Coldstell_cost; - } - - public static void setKari_Coldstell_cost(int Kari_Coldstell_cost) { - Kari_Coldstell_cost = Kari_Coldstell_cost; - } - - public boolean isFink_Da_Fixer() { - return Fink_Da_Fixer; - } - - public void setFink_Da_Fixer(boolean Fink_Da_Fixer) { - this.Fink_Da_Fixer = Fink_Da_Fixer; - } - - public static int getFink_Da_Fixer_cost() { - return Fink_Da_Fixer_cost; - } - - public static void setFink_Da_Fixer_cost(int Fink_Da_Fixer_cost) { - Fink_Da_Fixer_cost = Fink_Da_Fixer_cost; - } - - public boolean isPapa_Skullbones() { - return Papa_Skullbones; - } - - public void setPapa_Skullbones(boolean Papa_Skullbones) { - this.Papa_Skullbones = Papa_Skullbones; - } - - public static int getPapa_Skullbones_cost() { - return Papa_Skullbones_cost; - } - - public static void setPapa_Skullbones_cost(int Papa_Skullbones_cost) { - Papa_Skullbones_cost = Papa_Skullbones_cost; - } - - public boolean isGalandril_Silverwater() { - return Galandril_Silverwater; - } - - public void setGalandril_Silverwater(boolean Galandril_Silverwater) { - this.Galandril_Silverwater = Galandril_Silverwater; - } - - public static int getGalandril_Silverwater_cost() { - return Galandril_Silverwater_cost; - } - - public static void setGalandril_Silverwater_cost(int Galandril_Silverwater_cost) { - Galandril_Silverwater_cost = Galandril_Silverwater_cost; - } - - public boolean isKrot_Shockwhisker() { - return Krot_Shockwhisker; - } - - public void setKrot_Shockwhisker(boolean Krot_Shockwhisker) { - this.Krot_Shockwhisker = Krot_Shockwhisker; - } - - public static int getKrot_Shockwhisker_cost() { - return Krot_Shockwhisker_cost; - } - - /** - * Chaos Wizard Allowed - */ - public static void setKrot_Shockwhisker_cost(int Krot_Shockwhisker_cost) { - Krot_Shockwhisker_cost = Krot_Shockwhisker_cost; - } - - private boolean _chaos_wizard; - /** - * Chaos Wizard cost - */ - - private static int Horatio_X_Schottenheim_cost=80000; - private boolean Kari_Coldstell; - private static int Kari_Coldstell_cost=50000; - - private boolean Fink_Da_Fixer; - private static int Fink_Da_Fixer_cost=50000; - - private boolean Papa_Skullbones; - private static int Papa_Skullbones_cost=80000; - - private boolean Galandril_Silverwater; - private static int Galandril_Silverwater_cost=50000; - - private boolean Krot_Shockwhisker; - private static int Krot_Shockwhisker_cost=80000; - /** - * - */ - private String _image; - /** - * - */ - private final ArrayList _player_types; - /** - * - */ - private final ArrayList _available_starplayers; - - /** - * - * @param name - */ - public RosterType(String name) { - _name = name; - _player_types = new ArrayList<>(); - _available_starplayers = new ArrayList<>(); - } - - /** - * - * @param name - * @return - */ - public PlayerType getPlayerType(String name, boolean translate) { - int i; - for (i = 0; i < getPlayerTypeCount(); i++) { - PlayerType rt = getPlayerType(i); - - if (translate) { - - if (name.equals(Translate.translate(rt.getPosition()))) { - return rt; - } - } else { - if (name.equals(rt.getPosition())) { - return rt; - } - } - - } - return null; - } - - /** - * - * @param name - * @return - */ - public StarPlayer getStarPlayer(String name, boolean translate) { - int i; - for (i = 0; i < getAvailableStarplayerCount(); i++) { - StarPlayer sp = getAvailableStarplayer(i); - - if (translate) { - if (name.equals(Translate.translate(sp.getName()))) { - return sp; - } - } else { - if (name.equals(sp.getName())) { - return sp; - } - } - } - return null; - } - - /** - * @return the _name - */ - public String getName() { - return _name; - } - - /** - * @param _name the _name to set - */ - public void setName(String _name) { - this._name = _name; - } - - /** - * @return the _reroll_cost - */ - public int getReroll_cost() { - return _reroll_cost; - } - - /** - * @param _reroll_cost the _reroll_cost to set - */ - public void setReroll_cost(int _reroll_cost) { - this._reroll_cost = _reroll_cost; - } - - /** - * @return the _apothecary - */ - public boolean isApothecary() { - return _apothecary; - } - - /** - * @param _apothecary the _apothecary to set - */ - public void setApothecary(boolean _apothecary) { - this._apothecary = _apothecary; - } - - /** - * @return the _bribe_cost - */ - public int getBribe_cost() { - return _bribe_cost; - } - - /** - * @param _bribe_cost the _bribe_cost to set - */ - public void setBribe_cost(int _bribe_cost) { - this._bribe_cost = _bribe_cost; - } - - /** - * @return the _chef_cost - */ - public int getChef_cost() { - return _chef_cost; - } - - /** - * @param _chef_cost the _chef_cost to set - */ - public void setChef_cost(int _chef_cost) { - this._chef_cost = _chef_cost; - } - - /** - * @return the _igor - */ - public boolean isIgor() { - return _igor; - } - - /** - * @param _igor the _igor to set - */ - public void setIgor(boolean _igor) { - this._igor = _igor; - } - - /** - * @return the _image - */ - public String getImage() { - return _image; - } - - /** - * @param _image the _image to set - */ - public void setImage(String _image) { - this._image = _image; - } - - /** - * @param p - */ - public void addPlayerType(PlayerType p) { - _player_types.add(p); - } - - /** - * Clear the player type list - */ - public void clearPlayerType() { - _player_types.clear(); - } - - public void clearAvailableStarPlayerType() { - _available_starplayers.clear(); - } - - /** - * @return the _player_types - */ - public int getPlayerTypeCount() { - return _player_types.size(); - } - - /** - * @param i - * @return the _player_types - */ - public PlayerType getPlayerType(int i) { - return _player_types.get(i); - } - - /** - * @param i - * @return the _available_starplayers - */ - public StarPlayer getAvailableStarplayer(int i) { - return _available_starplayers.get(i); - } - - /** - * @return the _available_starplayers - */ - public int getAvailableStarplayerCount() { - return _available_starplayers.size(); - } - - /** - * - * @param s - */ - public void addAvailableStarPlayer(StarPlayer s) { - _available_starplayers.add(s); - } - -} +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package teamma.data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.logging.Logger; +import teamma.languages.Translate; + +/** + * + * @author WFMJ7631 + */ +public class RosterType implements Serializable { + + teamma.data.LRB.E_Version version=LRB.E_Version.BB2016; + + public LRB.E_Version getVersion() + { + return version; + } + + public void setVersion(LRB.E_Version v) + { + version=v; + } + + /** + * + */ + private static int extraRerollCost = 100000; + /** + * + */ + private static int _babe_cost = 50000; + /** + * + */ + private static int _wizard_cost = 150000; + + private static int _chaos_wizard_cost = 150000; + /** + * + */ + private static int _local_apo_cost = 100000; + /** + * + */ + private static int _igor_cost = 100000; + + + /** + * + */ + private static int _assistant_cost = 10000; + /** + * + */ + private static int _fan_factor_cost = 10000; + /** + * + */ + private static int _cheerleader_cost = 10000; + /** + * + */ + private static int _apothecary_cost = 50000; + private static final Logger LOG = Logger.getLogger(RosterType.class.getName()); + + private ArrayList _inducements=new ArrayList<>(); + + /** + * @return the extraRerollCost + */ + public static int getExtraRerollCost() { + return extraRerollCost; + } + + /** + * @param aExtra_reroll_cost the extraRerollCost to set + */ + public static void setExtraRerollCost(int aExtra_reroll_cost) { + extraRerollCost = aExtra_reroll_cost; + } + + /** + * @return the _babe_cost + */ + public static int getBabe_cost() { + return _babe_cost; + } + + /** + * @param aBabe_cost the _babe_cost to set + */ + public static void setBabe_cost(int aBabe_cost) { + _babe_cost = aBabe_cost; + } + + /** + * @return the _wizard_cost + */ + public static int getWizard_cost() { + return _wizard_cost; + } + + + /** + * @param aWizard_cost the _wizard_cost to set + */ + public static void setWizard_cost(int aWizard_cost) { + _wizard_cost = aWizard_cost; + } + + /** + * @return the _local_apo_cost + */ + public static int getLocal_apo_cost() { + return _local_apo_cost; + } + + /** + * @param aLocal_apo_cost the _local_apo_cost to set + */ + public static void setLocal_apo_cost(int aLocal_apo_cost) { + _local_apo_cost = aLocal_apo_cost; + } + + /** + * @return the _igor_cost + */ + public static int getIgor_cost() { + return _igor_cost; + } + + /** + * @param aIgor_cost the _igor_cost to set + */ + public static void setIgor_cost(int aIgor_cost) { + _igor_cost = aIgor_cost; + } + + /** + * @return the _assistant_cost + */ + public static int getAssistant_cost() { + return _assistant_cost; + } + + /** + * @param aAssistant_cost the _assistant_cost to set + */ + public static void setAssistant_cost(int aAssistant_cost) { + _assistant_cost = aAssistant_cost; + } + + /** + * @return the _fan_factor_cost + */ + public static int getFan_factor_cost() { + return _fan_factor_cost; + } + + /** + * @param aFan_factor_cost the _fan_factor_cost to set + */ + public static void setFan_factor_cost(int aFan_factor_cost) { + _fan_factor_cost = aFan_factor_cost; + } + + /** + * @return the _cheerleader_cost + */ + public static int getCheerleader_cost() { + return _cheerleader_cost; + } + + /** + * @param aCheerleader_cost the _cheerleader_cost to set + */ + public static void setCheerleader_cost(int aCheerleader_cost) { + _cheerleader_cost = aCheerleader_cost; + } + + /** + * @return the _apothecary_cost + */ + public static int getApothecary_cost() { + return _apothecary_cost; + } + + /** + * @param aApothecary_cost the _apothecary_cost to set + */ + public static void setApothecary_cost(int aApothecary_cost) { + _apothecary_cost = aApothecary_cost; + } + /** + * + */ + private String _name; + /** + * + */ + private int _reroll_cost; + /** + * + */ + private boolean _apothecary; + /** + * + */ + private int _bribe_cost; + /** + * + */ + private int _chef_cost; + /** + * + */ + private boolean _igor; + + public boolean isChaos_wizard() { + return _chaos_wizard; + } + + public void setChaos_wizard(boolean _chaos_wizard) { + this._chaos_wizard = _chaos_wizard; + } + + public static int getChaos_wizard_cost() { + return _chaos_wizard_cost; + } + + public static void setChaos_wizard_cost(int chaos_wizard_cost) { + _chaos_wizard_cost = chaos_wizard_cost; + } + + public static int getHoratio_X_Schottenheim_cost() { + return _Horatio_X_Schottenheim_cost; + } + + public static void setHoratio_X_Schottenheim_cost(int Horatio_X_Schottenheim_cost) { + _Horatio_X_Schottenheim_cost = Horatio_X_Schottenheim_cost; + } + + public boolean isKari_Coldstell() { + return Kari_Coldstell; + } + + public void setKari_Coldstell(boolean Kari_Coldstell) { + this.Kari_Coldstell = Kari_Coldstell; + } + + public static int getKari_Coldstell_cost() { + return _Kari_Coldstell_cost; + } + + public static void setKari_Coldstell_cost(int Kari_Coldstell_cost) { + _Kari_Coldstell_cost = Kari_Coldstell_cost; + } + + public boolean isFink_Da_Fixer() { + return Fink_Da_Fixer; + } + + public void setFink_Da_Fixer(boolean Fink_Da_Fixer) { + this.Fink_Da_Fixer = Fink_Da_Fixer; + } + + public static int getFink_Da_Fixer_cost() { + return _Fink_Da_Fixer_cost; + } + + public static void setFink_Da_Fixer_cost(int Fink_Da_Fixer_cost) { + _Fink_Da_Fixer_cost = Fink_Da_Fixer_cost; + } + + public boolean isPapa_Skullbones() { + return Papa_Skullbones; + } + + public void setPapa_Skullbones(boolean Papa_Skullbones) { + this.Papa_Skullbones = Papa_Skullbones; + } + + public static int getPapa_Skullbones_cost() { + return _Papa_Skullbones_cost; + } + + public static void setPapa_Skullbones_cost(int Papa_Skullbones_cost) { + _Papa_Skullbones_cost = Papa_Skullbones_cost; + } + + public boolean isGalandril_Silverwater() { + return Galandril_Silverwater; + } + + public void setGalandril_Silverwater(boolean Galandril_Silverwater) { + this.Galandril_Silverwater = Galandril_Silverwater; + } + + public static int getGalandril_Silverwater_cost() { + return _Galandril_Silverwater_cost; + } + + public static void setGalandril_Silverwater_cost(int Galandril_Silverwater_cost) { + _Galandril_Silverwater_cost = Galandril_Silverwater_cost; + } + + public boolean isKrot_Shockwhisker() { + return Krot_Shockwhisker; + } + + public void setKrot_Shockwhisker(boolean Krot_Shockwhisker) { + this.Krot_Shockwhisker = Krot_Shockwhisker; + } + + public static int getKrot_Shockwhisker_cost() { + return _Krot_Shockwhisker_cost; + } + + /** + * Chaos Wizard Allowed + */ + public static void setKrot_Shockwhisker_cost(int Krot_Shockwhisker_cost) { + _Krot_Shockwhisker_cost = Krot_Shockwhisker_cost; + } + + private boolean _chaos_wizard; + /** + * Chaos Wizard cost + */ + + private static int _Horatio_X_Schottenheim_cost=80000; + private boolean Kari_Coldstell; + private static int _Kari_Coldstell_cost=50000; + + private boolean Fink_Da_Fixer; + private static int _Fink_Da_Fixer_cost=50000; + + private boolean Papa_Skullbones; + private static int _Papa_Skullbones_cost=80000; + + private boolean Galandril_Silverwater; + private static int _Galandril_Silverwater_cost=50000; + + private boolean Krot_Shockwhisker; + private static int _Krot_Shockwhisker_cost=80000; + /** + * + */ + private String _image; + /** + * + */ + private final ArrayList _player_types; + /** + * + */ + private final ArrayList _available_starplayers; + + /** + * + * @param name + */ + public RosterType(String name) { + _name = name; + _player_types = new ArrayList<>(); + _available_starplayers = new ArrayList<>(); + } + + /** + * + * @param name + * @return + */ + public PlayerType getPlayerType(String name, boolean translate) { + int i; + for (i = 0; i < getPlayerTypeCount(); i++) { + PlayerType rt = getPlayerType(i); + + if (translate) { + + if (name.equals(Translate.translate(rt.getPosition()))) { + return rt; + } + } else { + if (name.equals(rt.getPosition())) { + return rt; + } + } + + } + return null; + } + + /** + * + * @param name + * @return + */ + public StarPlayer getStarPlayer(String name, boolean translate) { + int i; + for (i = 0; i < getAvailableStarplayerCount(); i++) { + StarPlayer sp = getAvailableStarplayer(i); + + if (translate) { + if (name.equals(Translate.translate(sp.getName()))) { + return sp; + } + } else { + if (name.equals(sp.getName())) { + return sp; + } + } + } + return null; + } + + /** + * @return the _name + */ + public String getName() { + return _name; + } + + /** + * @param _name the _name to set + */ + public void setName(String _name) { + this._name = _name; + } + + /** + * @return the _reroll_cost + */ + public int getReroll_cost() { + return _reroll_cost; + } + + /** + * @param _reroll_cost the _reroll_cost to set + */ + public void setReroll_cost(int _reroll_cost) { + this._reroll_cost = _reroll_cost; + } + + /** + * @return the _apothecary + */ + public boolean isApothecary() { + return _apothecary; + } + + /** + * @param _apothecary the _apothecary to set + */ + public void setApothecary(boolean _apothecary) { + this._apothecary = _apothecary; + } + + /** + * @return the _bribe_cost + */ + public int getBribe_cost() { + return _bribe_cost; + } + + /** + * @param _bribe_cost the _bribe_cost to set + */ + public void setBribe_cost(int _bribe_cost) { + this._bribe_cost = _bribe_cost; + } + + /** + * @return the _chef_cost + */ + public int getChef_cost() { + return _chef_cost; + } + + /** + * @param _chef_cost the _chef_cost to set + */ + public void setChef_cost(int _chef_cost) { + this._chef_cost = _chef_cost; + } + + /** + * @return the _igor + */ + public boolean isIgor() { + return _igor; + } + + /** + * @param _igor the _igor to set + */ + public void setIgor(boolean _igor) { + this._igor = _igor; + } + + /** + * @return the _image + */ + public String getImage() { + return _image; + } + + /** + * @param _image the _image to set + */ + public void setImage(String _image) { + this._image = _image; + } + + /** + * @param p + */ + public void addPlayerType(PlayerType p) { + _player_types.add(p); + } + + /** + * Clear the player type list + */ + public void clearPlayerType() { + _player_types.clear(); + } + + public void clearInducementType() { + _inducements.clear(); + } + + public void clearAvailableStarPlayerType() { + _available_starplayers.clear(); + } + + public void addInducementType(InducementType it) + { + _inducements.add(it); + } + + public int getInducementTypeSize() + { + return _inducements.size(); + } + + public InducementType getInducementType(int i) + { + return _inducements.get(i); + } + + public InducementType getInducementType(String s) + { + for (InducementType it:_inducements) + { + if (it.getName().equals(s)) + { + return it; + } + } + return null; + } + /** + * @return the _player_types + */ + public int getPlayerTypeCount() { + return _player_types.size(); + } + + /** + * @param i + * @return the _player_types + */ + public PlayerType getPlayerType(int i) { + return _player_types.get(i); + } + + /** + * @param i + * @return the _available_starplayers + */ + public StarPlayer getAvailableStarplayer(int i) { + return _available_starplayers.get(i); + } + + /** + * @return the _available_starplayers + */ + public int getAvailableStarplayerCount() { + return _available_starplayers.size(); + } + + /** + * + * @param s + */ + public void addAvailableStarPlayer(StarPlayer s) { + _available_starplayers.add(s); + } + +} diff --git a/src/teamma/images/owa.png b/src/teamma/images/owa.png new file mode 100644 index 00000000..e28144e3 Binary files /dev/null and b/src/teamma/images/owa.png differ diff --git a/src/teamma/images/snotlings.png b/src/teamma/images/snotlings.png new file mode 100644 index 00000000..e28144e3 Binary files /dev/null and b/src/teamma/images/snotlings.png differ diff --git a/src/teamma/languages/language.properties b/src/teamma/languages/language.properties index 5ca0b9c3..36926abd 100644 --- a/src/teamma/languages/language.properties +++ b/src/teamma/languages/language.properties @@ -1,380 +1,383 @@ -SkillNotFound=Skill not found -forThePlayer=For the plqyer -SkillTypeNotFound=Skill kind nor found -RosterTypeNotFound=Roster not found - -Name=Name -Position=Position -M=M -S=F -Ag=Ag -Ar=Ar -Skills=Skills -SR=S -DR=D -Base\ Cost=Basic cost -Cost=Cost -OK=OK -Print=Print -HTMLExport=HTML export -SelectColor=Choose a color -Cancel=Cancel -Single\ Roll=Simple -Double\ Roll=Double -Error=Error -No\ skill\ selected=No skill selected -TeamName=Team name -Roster\:\ Unknown=Roster: Unknown -Coach\:\ Unknown=Coach: Unknown -Player=Player -#tourma.MainFrame -Skill=Comp\u00e9tence -TeamGoods=Team goods -Inducements=Inducements -Mercenaires\ et\ Champions=Mercenaries and Starplayers -Coach=Coach -Assistants=Assists : -Cheerleaders=Cheerleaders : -FanFactor=Fan Factor : -Rerolls=Rerolls : -Apothecary=Apothecary : -Extra\ Reroll=Extra Reroll : -Bribe\ the\ Ref=Bribe the Ref : -Local\ Apothecary=Local Apothecary : -Wizard=Wizard : -Igor=Igor : -Straplayer=Starplayer -Associate\ a\ coach=Associate a coach -Include\ skills=Include skills -Total\ Cost=Total cost -Ranking=Ranking -HTML=HTML -Export=Export -Import=Import -Choisissez\ le\ roster=Choose a roster -Choix\ du\ roster=Roster's choice -Erreur\ de\ choix\ du\ roster=Error choosing roster -Choix\ du\ coach=Coach selection -Choisissez\ le\ coach=Select the coach -Select\ skill\ to\ remove=Select skill to remove -Skill=Skill -Roster\ type\ not\ selected,\ please\ click\ on\ roster=Undefined roster, Please, Choose a roster firstly -Choisissez\ le\ type\ de\ joueur=Select player's type -Choix\ du\ joueur=Player selection -Roster=Roster - -# Skills -General=General -G=G -Kick-off\ Return=Kick-off Return -Strip\ Ball=Strip Ball -Block=Block -Pass\ Block=Pass Block -Sure\ Hands=Sure Hands -Kick=Kick -Frenzy=Frenzy -Dauntless=Dauntless -Dirty\ Player=Dirty Player -Wrestle=Wrestle -Fend=Fend -Shadowing=Shadowing -Pro=Pro -Tackle=Tackle -Pass=Pass -P=P -Leader=Leader -Hail\ Mary\ Pass=Hail Mary Pass -Safe\ Throw=Safe Throw -Nerves\ of\ Steel=Nerves of Steel -Dump-Off=Dump Off -Accurate=Accurate -Strength=Strength -S=S -Multiple\ Block=Multiple Block -Mighty\ Blow=Mighty Blow -Strong\ Arm=Strong Arm -Thick\ Skull= Thick Skull -Piling\ On=Piling On -Break\ Tackle=Break tackle -Guard=Guard -Juggernaut=Juggernaut -Grab=Grab -Stand\ Firm=Stand Firm -Mutation=Mutation -M=M -Extra\ Arms=Extra Arms -Horns=Horns -Two\ Heads=Two Heads -Big\ Hand=Big hand -Claw=Claws -Disturbing\ Presence=Disturbing presence -Prehensile\ Tail=Prehensile Tail -Foul\ Appearance=Foul appearance -Tentacles=Tentacles -Very\ Long\ Legs=Very Long Legs -Agility=Agilit\u00e9 -A=A -Jump\ Up=Jump Up -Sure\ Feet=Sure Feets -Dodge=Dodge -Side\ Step=Side Step -Diving\ Catch=Diving Catch -Catch=Catch -Leap=Leap -Sneaky\ Git=Sneaky git -Sprint=Sprint -Diving\ Tackle=Diving Tackle - -Extraordinary=Extraordinary -E=E -Wild\ Animal=Wild Animal -Animosity=Animosity -Secret\ Weapon=Secret Weapon -Bombardier=Bombardier -Bone\ Head=Bone Head -Ball\ And\ Chain=Ball and chain -Decay=Decay -Really\ Stupid=Really Stupid -Fan\ Favourite=Fan's Favorite -Throw\ Team-Mate=Throw a team mate -Kick\ Team-Mate=Kick Team-Mate -Monstrous\ Mouth=Monstrous Mouth -No\ Hands=No Arm -Titchy=Titchy -Stunty=Stunty -Stakes=Stakes -Right\ Stuff=Right Stuff -Stab=Stab -Nurgle's\ Rot=Nurgle's rot -Take\ Roots=Take root -Hypnotic\ Gaze=Hypnotic gaze -Regeneration=Regeneration -Blood\ Lust=Blood Lust -Loner=Loner -Always\ Hungry=Always Hungry -Chainsaw=Chainsaw -Characteristics=Characteristics -C=C -+1\ Movement=+1 Move -+1\ Strength=+1 Strength -+1\ Agility=+1 Agility -+1\ Armor=+1 Armor -Injury=Injuries -I=I -Niggling\ Injury=Niggling Injury --1\ Movement=-1 Move --1\ Strength=-1 Strength --1\ Agility=-1 Agility --1\ Armor=-1 Armor -Weeping\ Dagger=Weeping Dagger -Swoop=Swoop - - -#Positions -Amazon\ Blitzer=Blitzer -Amazon\ Thrower=Thrower -Amazon\ Catcher=Catcher -Amazon\ Linewoman=Linewoman -Chaos\ Warrior=Chaos Warrior -Beastman= Beastman -Minotaur=Minotaur -Blocker=Blocker -Bull\ Cantaur=BullCentaur -Hobgoblin=Hobgobelin -Blitzer=Blitzer -Thrower=Thrower -Catcher=Catcher -Lineman=Lineman -Chaos\ Troll=Chaos Troll -Chaos\ Ogre=Chaos Ogre -Marauder=Marauder -Goblin=Goblin -Dark\ Elf=Dark Elf -Skaven=Skaven -Witch\ Elf=Witch Elf -Runner=Runner -Assassin=Assassin -Troll\ Slayer=Troll Slayer -Deathroller=DeathRoller -Troll=Troll -Bombardier=Bomber -Pogo\ Stick=Pogo Stick -Looney=Looney -Fanatic=Fanatic -Treeman=Treeman -Halflings=Halfling -Ogre=Ogre -Tomb\ Guardian=Tomb Guardian -Thro-Ra=Thro-Ra -Skeleton=Skeleton -Blitz-Ra=Blitz-Ra -Blood\ Thirter=Blood Thirter -Herald=Herald -BloodLetter=BloodLetter -Pitfighter=Pitfighter -Saurus=Saurus -Skink=Skink -Kroxigor=Kroxigor -Werewolf=Werewolf -Ghoul=Goule -Wigth=Revenant -Flesh\ Golem=Flesh Golem -Zombie=Zombie -Yeti=Yethee -Ulfwerner=Ulfwerner -Berserker=Berzerker -Nurgle's\ Warrior=Nurgle's Warrior -Pestigor=Pestigor -Nurgle's\ Beast=Nurgle's Beast -Rotter=Rooter -Snotling=Snotling -Black\ Orc\ Blocker=Black Orc Blocker -Stormvemins=Stormvermin -Gutter\ Runner=Gutter runner -Rat\ Ogre=Rat Ogre -Wardanser=Wardancer -Vampires=Vampire -Thrall=Thrall -Skaven\ Linerat=Skaven lineman -Skaven\ Thrower=Skaven thrower -Stormvermin=Stormvermin -Warpstone\ Troll=Warpstone Troll -Mummy=Mummy -Doom\ Diver=Doom Diver -Hooligan=Hooligan -Timm-ber!=Timm-ber! - -# Starplayers -Bertha\ Bigfist=Bertha Bigfist -Barik\ Farblast=Barik Farblast -Boomer\ Ezaiasson=Blam Eziasson -Ripper\ Bolgrot=Ripper Bolgrot -Boomer\ Dribblesnot=Boomer Dribblesnot -Headsplitter=Headsplitter -Count\ Luthor\ Von\ Drakenborg=Count Luthor Von Drakenborg -Dolfar\ Longstride=Dolfar Dolfar Longstride -Eldril\ Sidewinder=Eldril Sidewinder -Fezglish=Fezglish -Fungus\ The\ Loon=Fungus The Loon -Glart\ Smarship\ Jr=Glart Smarship Jr -Grashnak\ Blackhoof=Grashnak Blackhoof -Griff\ Oberwald=Griff Oberwald -Grim\ Ironjaws=Grom Ironjaws -Hack\ Enslash=Hack Enslash -Hakflem\ Skuttlespike=Hakflem Skuttlespike -Helmut\ Wulf=Helmut Wulf -Hemlock=Hemlock -Horkon\ Heartripper=Horkon Heartripper -Hthark\ the\ Unstoppable=Hhtark the Unstoppable -Hubris\ Rakarth=Hubris Rakarth -Icepelt\ Hammerblow=Icepelt Hammerblow -Crazy\ Igor=Crazy Igor -Humerus\ Carpa=Humerus Carpal -Ithaca\ Benoin=Ithaca Benoin -J\ Earlice=J; Earlice -Lewdgrip\ Whiparm=Lewdgrip Whiparm -Jordell\ Freshbreeze=Jordell Freshbreeze -Lord\ Borak\ The\ Despoiler=lord Borak The Despoiler -Bouta\u00efdo=Bouta\u00efdo -Max\ Spleenripper=Max Spleenripper -Morg'N'Torg=Morg'N'Torg -Nobbla\ Blackwart=Nobbla Blackwart -Brick\ Far'th=Brick Far'th -Grotty=Grotty -Prince\ Moranion=Prince Moranion -Puggy\ Baconbreath=Puggy Baconbreath -Quetzal\ Leap=Quetzal Leap -Deeproot\ Strongbranch=Deeproot Strongbranch -Ratmut\ III=Ratmut III -Rashnak\ Backstab=Rashnak Backstab -Roxanna\ Darknails=Roxanna Darknails -Scrappa\ Sorehead=Scrappa Sorehead -Setekh=Setekh -Skitter\ Stab-Stab=Skitter Stab-Stab -Silibili=Silibili -Sinnedbad=Sinnedbad -Soaren\ Hightower=Soaren Hightower -Flint\ Churnblade=Flint Churnblade -Ugroth\ Bolgrot=Ugroth Bolgrot -Varag\ Ghoul-Chewer=Varag Ghoul-Chewer -Wilhelm\ Chaney=Wilhem Chaney -Willow\ Rosebark=Willow Rosebark -Zara\ The\ Slayer=Zara The Slayer -Mighty\ Zug=Mighty Zug -Zzharg\ Madeye=Zzharg Madeye - - -AmazonKey=Amazon -UnderworldKey=Underworld -ChaosKey=Chaos -ElfKey=Elf -WoodElfKey=Wood elf -DarkElfKey=Dark Elf -GoblinKey=Gobelin -HalflingKey=Halfling -HighElfKey=High Elf -LizardmenKey=Lizardman -HumanKey=Human -KhemriKey=Khemri -UndeadKey=Undead -DwarfKey=Dwarf -ChaosDwarfKey=Chaos Dwarf -NecromanticKey=Necromantic -NorseKey=Norse -NurgleKey=Nurgle's Rotter -OgreKey=Ogre -OrcKey=Orc -ChaosPactKey=Chaos Pact -SkavenKey=Skaven -SlannKey=Slann -VampireKey=Vampire -KhornesDaemonsKey=Daemons of Khorne -ChaosRenegadesKey=Chaos Renegades -ElfUnionKey=Elf Union -UnderworldDenizenKey=Underworld Denizens -ChaosChosenKey=Chaos Chosen -KhemriTombKingsKey=Khemri Tombs Kings -NecromanticHorrorKey=Necromantic Horrors -ShamblingUndeadKey=Shambling Undead - -# Report translation -RosterTitle=Roster -NameTitle=Name -PositionTitle=Position -MTitle=M -STitle=S -AgTitle=Ag -ArTitle=Ar -SkillsTitle=Skills -CostTitle=Cost -SRTitle=S -DRTitle=D -TeamNameTitle=Team Name -ApothecaryTitle=Apothicary -CoachNameTitle=Coach Name -AssistTitle=Assists -RaceTitle=Roster -CheerleadersTitle=Cheerleaders -FanFactorTitle=Fan factor -ExtraRerollTitle=Extra Reroll -LocalApothecaryTitle=Local Apothecary -IgorTitle=Igor -BribeTitle=Bribe the ref -WizardTitle=Wizard -BabesTitle=Bloodweiser babe -ChefTitle=Halfling Chef -CardsTitle=Special cards -TotalTitle=Total -RerollTitle=Reroll -RankTitle=Rank - -# To translate the test -Translate=Translate - -ChaosWizardTitle= Chaos Wizard -HoratioTitle = Horatio X. Schottenheim, Magic master -KariTitle = Kari Coldwater, Norse Cheerleader -FinkTitle = Fink Da Fixer, Goblin personnal assistant -PapaTitle = Papa Skullbones, Chaos Chaman -GalandrilTitle = Galandril Silverwater, Elf Cheerleader -KrotTitle = Krot Shockwhisker, Skaven engineer \ No newline at end of file +SkillNotFound=Skill not found +forThePlayer=For the player +SkillTypeNotFound=Skill kind nor found +RosterTypeNotFound=Roster not found + +Name=Name +Position=Position +M=M +S=F +Ag=Ag +Ar=Ar +Skills=Skills +SR=S +DR=D +Base\ Cost=Basic cost +Cost=Cost +OK=OK +Print=Print +HTMLExport=HTML export +SelectColor=Choose a color +Cancel=Cancel +Single\ Roll=Simple +Double\ Roll=Double +Error=Error +No\ skill\ selected=No skill selected +TeamName=Team name +Roster\:\ Unknown=Roster: Unknown +Coach\:\ Unknown=Coach: Unknown +Player=Player +#tourma.MainFrame +Skill=Comp\u00e9tence +TeamGoods=Team goods +Inducements=Inducements +Mercenaires\ et\ Champions=Mercenaries and Starplayers +Coach=Coach +Assistants=Assists : +Cheerleaders=Cheerleaders : +FanFactor=Fan Factor : +Rerolls=Rerolls : +Apothecary=Apothecary : +Extra\ Reroll=Extra Reroll : +Bribe\ the\ Ref=Bribe the Ref : +Local\ Apothecary=Local Apothecary : +Wizard=Wizard : +Igor=Igor : +Straplayer=Starplayer +Associate\ a\ coach=Associate a coach +Include\ skills=Include skills +Total\ Cost=Total cost +Ranking=Ranking +HTML=HTML +Export=Export +Import=Import +Choisissez\ le\ roster=Choose a roster +Choix\ du\ roster=Roster's choice +Erreur\ de\ choix\ du\ roster=Error choosing roster +Choix\ du\ coach=Coach selection +Choisissez\ le\ coach=Select the coach +Select\ skill\ to\ remove=Select skill to remove +Skill=Skill +Roster\ type\ not\ selected,\ please\ click\ on\ roster=Undefined roster, Please, Choose a roster firstly +Choisissez\ le\ type\ de\ joueur=Select player's type +Choix\ du\ joueur=Player selection +Roster=Roster + +# Skills +General=General +G=G +Kick-off\ Return=Kick-off Return +Strip\ Ball=Strip Ball +Block=Block +Pass\ Block=Pass Block +Sure\ Hands=Sure Hands +Kick=Kick +Frenzy=Frenzy +Dauntless=Dauntless +Dirty\ Player=Dirty Player +Wrestle=Wrestle +Fend=Fend +Shadowing=Shadowing +Pro=Pro +Tackle=Tackle +Pass=Pass +P=P +Leader=Leader +Hail\ Mary\ Pass=Hail Mary Pass +Safe\ Throw=Safe Throw +Nerves\ of\ Steel=Nerves of Steel +Dump-Off=Dump Off +Accurate=Accurate +Strength=Strength +S=S +Multiple\ Block=Multiple Block +Mighty\ Blow=Mighty Blow +Strong\ Arm=Strong Arm +Thick\ Skull= Thick Skull +Piling\ On=Piling On +Break\ Tackle=Break tackle +Guard=Guard +Juggernaut=Juggernaut +Grab=Grab +Stand\ Firm=Stand Firm +Mutation=Mutation +M=M +Extra\ Arms=Extra Arms +Horns=Horns +Two\ Heads=Two Heads +Big\ Hand=Big hand +Claw=Claws +Disturbing\ Presence=Disturbing presence +Prehensile\ Tail=Prehensile Tail +Foul\ Appearance=Foul appearance +Tentacles=Tentacles +Very\ Long\ Legs=Very Long Legs +Agility=Agilit\u00e9 +A=A +Jump\ Up=Jump Up +Sure\ Feet=Sure Feets +Dodge=Dodge +Side\ Step=Side Step +Diving\ Catch=Diving Catch +Catch=Catch +Leap=Leap +Sneaky\ Git=Sneaky git +Sprint=Sprint +Diving\ Tackle=Diving Tackle + +Extraordinary=Extraordinary +E=E +Wild\ Animal=Wild Animal +Animosity=Animosity +Secret\ Weapon=Secret Weapon +Bombardier=Bombardier +Bone\ Head=Bone Head +Ball\ And\ Chain=Ball and chain +Decay=Decay +Really\ Stupid=Really Stupid +Fan\ Favourite=Fan's Favorite +Throw\ Team-Mate=Throw a team mate +Kick\ Team-Mate=Kick Team-Mate +Monstrous\ Mouth=Monstrous Mouth +No\ Hands=No Arm +Titchy=Titchy +Stunty=Stunty +Stakes=Stakes +Right\ Stuff=Right Stuff +Stab=Stab +Nurgle's\ Rot=Nurgle's rot +Take\ Roots=Take root +Hypnotic\ Gaze=Hypnotic gaze +Regeneration=Regeneration +Blood\ Lust=Blood Lust +Loner=Loner +Always\ Hungry=Always Hungry +Chainsaw=Chainsaw +Characteristics=Characteristics +C=C ++1\ Movement=+1 Move ++1\ Strength=+1 Strength ++1\ Agility=+1 Agility ++1\ Armor=+1 Armor +Injury=Injuries +I=I +Niggling\ Injury=Niggling Injury +-1\ Movement=-1 Move +-1\ Strength=-1 Strength +-1\ Agility=-1 Agility +-1\ Armor=-1 Armor +Weeping\ Dagger=Weeping Dagger +Swoop=Swoop + + +#Positions +Amazon\ Blitzer=Blitzer +Amazon\ Thrower=Thrower +Amazon\ Catcher=Catcher +Amazon\ Linewoman=Linewoman +Chaos\ Warrior=Chaos Warrior +Beastman= Beastman +Minotaur=Minotaur +Blocker=Blocker +Bull\ Cantaur=BullCentaur +Hobgoblin=Hobgobelin +Blitzer=Blitzer +Thrower=Thrower +Catcher=Catcher +Lineman=Lineman +Chaos\ Troll=Chaos Troll +Chaos\ Ogre=Chaos Ogre +Marauder=Marauder +Goblin=Goblin +Dark\ Elf=Dark Elf +Skaven=Skaven +Witch\ Elf=Witch Elf +Runner=Runner +Assassin=Assassin +Troll\ Slayer=Troll Slayer +Deathroller=DeathRoller +Troll=Troll +Bombardier=Bomber +Pogo\ Stick=Pogo Stick +Looney=Looney +Fanatic=Fanatic +Treeman=Treeman +Halflings=Halfling +Ogre=Ogre +Tomb\ Guardian=Tomb Guardian +Thro-Ra=Thro-Ra +Skeleton=Skeleton +Blitz-Ra=Blitz-Ra +Blood\ Thirter=Blood Thirter +Herald=Herald +BloodLetter=BloodLetter +Pitfighter=Pitfighter +Saurus=Saurus +Skink=Skink +Kroxigor=Kroxigor +Werewolf=Werewolf +Ghoul=Goule +Wigth=Revenant +Flesh\ Golem=Flesh Golem +Zombie=Zombie +Yeti=Yethee +Ulfwerner=Ulfwerner +Berserker=Berzerker +Nurgle's\ Warrior=Nurgle's Warrior +Pestigor=Pestigor +Nurgle's\ Beast=Nurgle's Beast +Rotter=Rooter +Snotling=Snotling +Black\ Orc\ Blocker=Black Orc Blocker +Stormvemins=Stormvermin +Gutter\ Runner=Gutter runner +Rat\ Ogre=Rat Ogre +Wardanser=Wardancer +Vampires=Vampire +Thrall=Thrall +Skaven\ Linerat=Skaven lineman +Skaven\ Thrower=Skaven thrower +Stormvermin=Stormvermin +Warpstone\ Troll=Warpstone Troll +Mummy=Mummy +Doom\ Diver=Doom Diver +Hooligan=Hooligan +Timm-ber!=Timm-ber! + +# Starplayers +Bertha\ Bigfist=Bertha Bigfist +Barik\ Farblast=Barik Farblast +Boomer\ Ezaiasson=Blam Eziasson +Ripper\ Bolgrot=Ripper Bolgrot +Boomer\ Dribblesnot=Boomer Dribblesnot +Headsplitter=Headsplitter +Count\ Luthor\ Von\ Drakenborg=Count Luthor Von Drakenborg +Dolfar\ Longstride=Dolfar Dolfar Longstride +Eldril\ Sidewinder=Eldril Sidewinder +Fezglish=Fezglish +Fungus\ The\ Loon=Fungus The Loon +Glart\ Smarship\ Jr=Glart Smarship Jr +Grashnak\ Blackhoof=Grashnak Blackhoof +Griff\ Oberwald=Griff Oberwald +Grim\ Ironjaws=Grom Ironjaws +Hack\ Enslash=Hack Enslash +Hakflem\ Skuttlespike=Hakflem Skuttlespike +Helmut\ Wulf=Helmut Wulf +Hemlock=Hemlock +Horkon\ Heartripper=Horkon Heartripper +Hthark\ the\ Unstoppable=Hhtark the Unstoppable +Hubris\ Rakarth=Hubris Rakarth +Icepelt\ Hammerblow=Icepelt Hammerblow +Crazy\ Igor=Crazy Igor +Humerus\ Carpa=Humerus Carpal +Ithaca\ Benoin=Ithaca Benoin +J\ Earlice=J; Earlice +Lewdgrip\ Whiparm=Lewdgrip Whiparm +Jordell\ Freshbreeze=Jordell Freshbreeze +Lord\ Borak\ The\ Despoiler=lord Borak The Despoiler +Bouta\u00efdo=Bouta\u00efdo +Max\ Spleenripper=Max Spleenripper +Morg'N'Torg=Morg'N'Torg +Nobbla\ Blackwart=Nobbla Blackwart +Brick\ Far'th=Brick Far'th +Grotty=Grotty +Prince\ Moranion=Prince Moranion +Puggy\ Baconbreath=Puggy Baconbreath +Quetzal\ Leap=Quetzal Leap +Deeproot\ Strongbranch=Deeproot Strongbranch +Ratmut\ III=Ratmut III +Rashnak\ Backstab=Rashnak Backstab +Roxanna\ Darknails=Roxanna Darknails +Scrappa\ Sorehead=Scrappa Sorehead +Setekh=Setekh +Skitter\ Stab-Stab=Skitter Stab-Stab +Silibili=Silibili +Sinnedbad=Sinnedbad +Soaren\ Hightower=Soaren Hightower +Flint\ Churnblade=Flint Churnblade +Ugroth\ Bolgrot=Ugroth Bolgrot +Varag\ Ghoul-Chewer=Varag Ghoul-Chewer +Wilhelm\ Chaney=Wilhem Chaney +Willow\ Rosebark=Willow Rosebark +Zara\ The\ Slayer=Zara The Slayer +Mighty\ Zug=Mighty Zug +Zzharg\ Madeye=Zzharg Madeye + + +AmazonKey=Amazon +UnderworldKey=Underworld +ChaosKey=Chaos +ElfKey=Elf +WoodElfKey=Wood elf +DarkElfKey=Dark Elf +GoblinKey=Gobelin +HalflingKey=Halfling +HighElfKey=High Elf +LizardmenKey=Lizardman +HumanKey=Human +KhemriKey=Khemri +UndeadKey=Undead +DwarfKey=Dwarf +ChaosDwarfKey=Chaos Dwarf +NecromanticKey=Necromantic +NorseKey=Norse +NurgleKey=Nurgle's Rotter +OgreKey=Ogre +OrcKey=Orc +ChaosPactKey=Chaos Pact +SkavenKey=Skaven +SlannKey=Slann +VampireKey=Vampire +KhornesDaemonsKey=Daemons of Khorne +ChaosRenegadesKey=Chaos Renegades +ElfUnionKey=Elf Union +UnderworldDenizenKey=Underworld Denizens +ChaosChosenKey=Chaos Chosen +KhemriTombKingsKey=Khemri Tombs Kings +NecromanticHorrorKey=Necromantic Horrors +ShamblingUndeadKey=Shambling Undead + +# Report translation +RosterTitle=Roster +NameTitle=Name +PositionTitle=Position +MTitle=M +STitle=S +AgTitle=Ag +ArTitle=Ar +SkillsTitle=Skills +CostTitle=Cost +SRTitle=S +DRTitle=D +TeamNameTitle=Team Name +ApothecaryTitle=Apothicary +CoachNameTitle=Coach Name +AssistTitle=Assists +RaceTitle=Roster +CheerleadersTitle=Cheerleaders +FanFactorTitle=Fan factor +ExtraRerollTitle=Extra Reroll +LocalApothecaryTitle=Local Apothecary +IgorTitle=Igor +BribeTitle=Bribe the ref +WizardTitle=Wizard +BabesTitle=Bloodweiser babe +ChefTitle=Halfling Chef +CardsTitle=Special cards +TotalTitle=Total +RerollTitle=Reroll +RankTitle=Rank + +# To translate the test +Translate=Translate + +ChaosWizardTitle= Chaos Wizard +HoratioTitle = Horatio X. Schottenheim, Magic master +KariTitle = Kari Coldwater, Norse Cheerleader +FinkTitle = Fink Da Fixer, Goblin personnal assistant +PapaTitle = Papa Skullbones, Chaos Chaman +GalandrilTitle = Galandril Silverwater, Elf Cheerleader +KrotTitle = Krot Shockwhisker, Skaven engineer + +# Inducements +chef=Halfling Chef \ No newline at end of file diff --git a/src/teamma/languages/language_fr.properties b/src/teamma/languages/language_fr.properties index 8562fb3c..b779323d 100644 --- a/src/teamma/languages/language_fr.properties +++ b/src/teamma/languages/language_fr.properties @@ -1,381 +1,386 @@ -SkillNotFound=Comp\u00e9tence non trouv\u00e9e -forThePlayer=pour le joueur -SkillTypeNotFound=Type de comp\u00e9tence non trouv\u00e9 -RosterTypeNotFound=Roster non trouv\u00e9 - -Name=Nom -Position=Position -M=M -S=F -Ag=Ag -Ar=Ar -Skills=Comp\u00e9tences -SR=S -DR=D -Base\ Cost=Co\u00fbt basique -Cost=Co\u00fbt -OK=OK -Print=Imprimer -HTMLExport=Exporter vers HTML -SelectColor=Choisissez une couleur : -Cancel=Annuler -Single\ Roll=Simple -Double\ Roll=Double -Error=Erreur -No\ skill\ selected=Aucune comp\u00e9tence s\u00e9lectionn\u00e9e -TeamName=Nom de l'\u00e9quipe -Roster\:\ Unknown=Roster: Inconnu -Coach\:\ Unknown=Coach: Inconnu -Player=Joueur -#tourma.MainFrame -Skill=Comp\u00e9tence -TeamGoods=Biens d'\u00e9quipe -Inducements=Primes de match -Mercenaires\ et\ Champions=Mercenaires et champions -Coach=Coach -Assistants=Assistants : -Cheerleaders=Pom Pom girls : -FanFactor=Popularit\u00e9 : -Rerolls=Relances : -Apothecary=Apothicaire : -Extra\ Reroll=Relance additionelle -Bribe\ the\ Ref=Corruption: -Local\ Apothecary=Apothicaire local : -Wizard=Sorcier : -Igor=Igor : -Straplayer=Champion -Associate\ a\ coach=Associer un coach -Include\ skills=Inclure les comp\u00e9tences -Total\ Cost=Prix total -Ranking=Classement -HTML=HTML -Export=Exporter -Import=Importer -Choisissez\ le\ roster=Choisissez le roster -Choix\ du\ roster=Choix du roster -Erreur\ de\ choix\ du\ roster=Erreur de choix du roster -Choix\ du\ coach=Choix du coach -Choisissez\ le\ coach=Choisissez le coach -Select\ skill\ to\ remove=Choisissez la comp\u00e9tence \u00e0 retirer. -Skill=Comp\u00e9tence -Roster\ type\ not\ selected,\ please\ click\ on\ roster=le roster n'est pas d\u00e9fini, SVP choisisszez un roster d'abord. -Choisissez\ le\ type\ de\ joueur=Choisissez le type de joueur -Choix\ du\ joueur=Choix du joueur -Roster=Roster - -# Skills -General=General -G=G -Kick-off\ Return=Anticipation -Strip\ Ball=Arracher le ballon -Block=Blocage -Pass\ Block=Blocage de passe -Sure\ Hands=Dext\u00e9rit\u00e9/Prise s\u00fbre -Kick=Frappe pr\u00e9cise -Frenzy=Fr\u00e9n\u00e9sie -Dauntless=Intr\u00e9pidit\u00e9 -Dirty\ Player=Joueur vicieux/d\u00e9loyal -Wrestle=Lutte -Fend=Parade -Shadowing=Poursuite -Pro=Pro -Tackle=Tacle -Pass=Passe -P=P -Leader=Chef -Hail\ Mary\ Pass=Main de Dieu/Passe d\u00e9sesp\u00e9r\u00e9e -Safe\ Throw=Lancer Pr\u00e9cis/Prudent -Nerves\ of\ Steel=Nerfs d'acier -Dump-Off=Passe rapide/D\u00e9lestage -Accurate=Pr\u00e9cision -Strength=Force -S=F -Multiple\ Block=Blocage multiple -Mighty\ Blow=Ch\u00e2taigne -Strong\ Arm=Costaud/Bras muscl\u00e9 -Thick\ Skull= Cr\u00e2ne \u00e9pais -Piling\ On=Ecrasement -Break\ Tackle=Esquive en force -Guard=Garde -Juggernaut=Juggernaut -Grab=Projection -Stand\ Firm=Stabilit\u00e9 -Mutation=Mutation -M=M -Extra\ Arms=Bras suppl\u00e9mentaire -Horns=Cornes -Two\ Heads=2 T\u00eates -Big\ Hand=Main d\u00e9mesur\u00e9e -Claw=Griffes -Disturbing\ Presence=Pr\u00e9sence perturbante -Prehensile\ Tail=Queue pr\u00e9hensile -Foul\ Appearance=Apparence refoulante -Tentacles=Tentacules -Very\ Long\ Legs=Tr\u00e8s longues jambes -Agility=Agilit\u00e9 -A=A -Jump\ Up=Bond/R\u00e9tablissement -Sure\ Feet=Equilibre -Dodge=Esquive -Side\ Step=Glissade contr\u00f4l\u00e9e -Diving\ Catch=Plongeon/R\u00e9ception plongeante -Catch=R\u00e9c\u00e9ption -Leap=Saut -Sneaky\ Git=Sournois -Sprint=Sprint -Diving\ Tackle=tacle plongeant - -Extraordinary=Extraordinaire -E=E -Wild\ Animal=Animal sauvage -Animosity=Animosit\u00e9 -Secret\ Weapon=Arme secr\u00e8te -Bombardier=Bombardier -Bone\ Head=Cerveau lent -Ball\ And\ Chain=Cha\u00eene et boulet -Decay=D\u00e9composition -Really\ Stupid=Gros d\u00e9bile -Fan\ Favourite=Idole des foules -Throw\ Team-Mate=Lancer un co\u00e9quipier -Kick\ Team-Mate=Botter un co\u00e9quipier -Monstrous\ Mouth=Grande gueule -No\ Hands=Manchot/Sans les mains -Titchy=Microbe -Stunty=Minus -Stakes=Pieux -Right\ Stuff=Poids plume -Stab=Poignard -Nurgle's\ Rot=Pourriture de Nurgle -Take\ Roots=Prendre racine -Hypnotic\ Gaze=Regard hypnotique -Regeneration=R\u00e9g\u00e9n\u00e9ration -Blood\ Lust=Petite soif -Loner=Perso -Always\ Hungry=Toujours affam\u00e9 -Chainsaw=Tron\u00e7onneuse -Characteristics=Caract\u00e9ristiques -C=C -+1\ Movement=+1 Mouvement -+1\ Strength=+1 Force -+1\ Agility=+1 Agilit\u00e9 -+1\ Armor=+1 Armure -Injury=Blessure -I=I -Niggling\ Injury=Blessure persistante --1\ Movement=-1 Mouvement --1\ Strength=-1 Force --1\ Agility=-1 Agilit\u00e9 --1\ Armor=-1 Armure -Swoop=Piqu\u00e9 -Weeping\ Dagger=Dague suintante - -#Positions -Amazon\ Blitzer=Blitzeuse -Amazon\ Thrower=Lan\u00e7euse -Amazon\ Catcher=Receveuse -Amazon\ Linewoman=Trois-Quart -Chaos\ Warrior=Guerrier du Chaos -Beastman= Homme B\u00eate -Minotaur=Minotaure -Blocker=Bloqueur -Bull\ Cantaur=Centaure Taureau -Hobgoblin=Hobgobelin -Blitzer=Blitzeur -Thrower=Lanceur -Catcher=Receveur -Lineman=Trois-Quart -Chaos\ Troll=Troll du Chaos -Chaos\ Ogre=Ogre du Chaos -Marauder=Maraudeur -Goblin=Gobelin -Dark\ Elf=Elfes noir -Skaven=Skaven -Witch\ Elf=Furie -Runner=Coureur -Assassin=Assassin -Troll\ Slayer=Tueur de troll -Deathroller=Roule-mort -Troll=Troll -Bombardier=Bombardier -Pogo\ Stick=B\u00e2ton \u00e0 ressort -Looney=Barjot -Fanatic=Fanatique -Treeman=Homme-arbre -Halflings=Halfling -Ogre=Ogre -Tomb\ Guardian=Gardien des tombes -Thro-Ra=Thro-Ra -Skeleton=Squelette -Blitz-Ra=Blitz-Ra -Blood\ Thirter=Buveur de sang -Herald=Heraut de Khorne -BloodLetter=Lettre de sang -Pitfighter=Gladiateur -Saurus=Saurus -Skink=Skink -Kroxigor=Kroxigor -Werewolf=Loup-Garou -Ghoul=Goule -Wigth=Revenant -Flesh\ Golem=Golem de chair -Zombie=Zombie -Yeti=Y\u00e9ti -Ulfwerner=Ulfwerner -Berserker=Berserker -Nurgle's\ Warrior=Guerrier de Nurgle -Pestigor=Pestigor -Nurgle's\ Beast=B\u00eate de Nurgle -Rotter=Pourri -Snotling=Snotling -Black\ Orc\ Blocker=Bloqueur Orque noir -Stormvemins=Vermine de choc -Gutter\ Runner=Coureur d'\u00e9gout -Rat\ Ogre=Rat Ogre -Wardanser=Danseur de guerre -Vampires=Vampire -Thrall=Serviteur -Skaven\ Linerat=Trois-Quart Skaven -Skaven\ Thrower=Lanceur Skaven -Stormvermin=Vermine de choc -Warpstone\ Troll=Troll de Malepierre -Mummy=Momie -Hooligan=Hooligan -Doom\ Diver=Plongeur de la mort -Timm-ber!=Timm-ber! - -# Starplayers -Bertha\ Bigfist=Bertha GroPOing -Barik\ Farblast=Bark Tirloin -Boomer\ Ezaiasson=Blam Eziasson -Ripper\ Bolgrot=Bolgrot L'Ecrabouilleur -Boomer\ Dribblesnot=Boomer Morvonez -Headsplitter=Cass'Cr\u00e2ne -Count\ Luthor\ Von\ Drakenborg=Comte Luthor Von Drakenborg -Dolfar\ Longstride=Dolfar Long'jambes -Eldril\ Sidewinder=Eldril Fendlabise -Fezglish=Fezglish -Fungus\ The\ Loon=Fungus le Cingl\u00e9 -Glart\ Smarship\ Jr=Glart Lavoll\u00e9e Jr. -Grashnak\ Blackhoof=Grashnak noirsabo -Griff\ Oberwald=Griff Oberwald -Grim\ Ironjaws=Grom Croc d'acier -Hack\ Enslash=Hack L'etripeur -Hakflem\ Skuttlespike=Hakflem Pointu -Helmut\ Wulf=Helmut Wulf -Hemlock=Hemlock -Horkon\ Heartripper=Horkon L'Ecorcheur -Hthark\ the\ Unstoppable=Hhtark le D\u00e9fonceur -Hubris\ Rakarth=Hubris Rakarth -Icepelt\ Hammerblow=Icepelt Eclat'Marteau -Crazy\ Igor=Igor le fou -Humerus\ Carpa=Humerus Carpal -Ithaca\ Benoin=Ithaca Benoin -J\ Earlice=J; Oreillefine -Lewdgrip\ Whiparm=Lewdgrip Fouet'bras -Jordell\ Freshbreeze=Jordell Flechevive -Lord\ Borak\ The\ Despoiler=lord Borak le Destructeur -Bouta\u00efdo=Bouta\u00efdo -Max\ Spleenripper=Max Eclaterate -Morg'N'Torg=Morg'N'Torg -Nobbla\ Blackwart=Nobbla la teigne -Brick\ Far'th=Pet'Brick -Grotty=Minab -Prince\ Moranion=Prince Moranion -Puggy\ Baconbreath=Puggy Haleinedebacon -Quetzal\ Leap=Quetzal le Bondissant -Deeproot\ Strongbranch=Racine Dutronc -Ratmut\ III=Ratmut III -Rashnak\ Backstab=Rashnak Lamedansledos -Roxanna\ Darknails=Roxanna Onglenoir -Scrappa\ Sorehead=Scrappa Malocrane -Setekh=Setekh -Skitter\ Stab-Stab=Skitter Pic-Pic -Silibili=Silibili -Sinnedbad=Sinnedbad -Soaren\ Hightower=Soaren Hautetour -Flint\ Churnblade=Tron\u00e7onneuse Flint -Ugroth\ Bolgrot=Ugrot Tranchegrots -Varag\ Ghoul-Chewer=Varag Mache Goule -Wilhelm\ Chaney=Wilhem Chaney -Willow\ Rosebark=Willow Teinrose -Zara\ The\ Slayer=Zara la Tueuse -Mighty\ Zug=Zug la B\u00eate -Zzharg\ Madeye=Zzharg le Borgne - - -AmazonKey=Amazones -UnderworldKey=Bas-fonds -ChaosKey=Chaos -ElfKey=Elfes -ElfUnionKey=Union Elfique -WoodElfKey=Elfes sylvains -DarkElfKey=Elfes noirs -GoblinKey=Gobelins -HalflingKey=Halflings -HighElfKey=Haut-Elfes -LizardmenKey=Hommes-L\u00e9zards -HumanKey=Humains -KhemriKey=Khemri -UndeadKey=Morts-Vivants -DwarfKey=Nains -ChaosDwarfKey=Nains du chaos -NecromanticKey=Necromantiques -NorseKey=Nordiques -NurgleKey=Pouris de Nurgle -OgreKey=Ogres -OrcKey=Orques -ChaosPactKey=Pacte Chaotique -SkavenKey=Skavens -SlannKey=Slanns -VampireKey=Vampires -KhornesDaemonsKey=D\u00e9mons de Khorne -BretonianKey=Bretonniens -ChaosRenegadesKey=Ren\u00e9gats du Chaos -UnderworldDenizenKey=Habitants des bas-fonds -ChaosChosenKey=Elus du Chaos -KhemriTombKingsKey=Rois des tombes Khemri -NecromanticHorrorKey=Horreurs n\u00e9cromantiques -ShamblingUndeadKey=Morts-vivants rampants - -# Report translation -RosterTitle=Roster -NameTitle=Nom -PositionTitle=Position -MTitle=M -STitle=F -AgTitle=Ag -ArTitle=Ar -SkillsTitle=Comp\u00e9tences -CostTitle=Co\u00fbt -SRTitle=S -DRTitle=D -TeamNameTitle=Nom de l'\u00e9quipe -ApothecaryTitle=Apothicaire -CoachNameTitle=Nom du Coach -AssistTitle=Assistants -RaceTitle=Race -CheerleadersTitle=Pom-Pom Girls -FanFactorTitle=Facteur de popularit\u00e9 -ExtraRerollTitle=Relance additionnelle -LocalApothecaryTitle=Apothicaire local -IgorTitle=Igor -BribeTitle=Corruption d'arbitre -WizardTitle=Sorcier -BabesTitle=Serveuse de Bloodweiser -ChefTitle=Cuistot Halfling -CardsTitle=Cartes sp\u00e9ciales -TotalTitle=Total -RerollTitle=Relance -RankTitle=Classement - -# To translate the test -Translate=Traduire -PinCode=Code PIN - -ChaosWizardTitle= Sorcier du Chaos -HoratioTitle = Horatio X. Schottenheim, Ma\u00eetre mage -KariTitle = Kari Coldwater, Cheerleader nordique -FinkTitle = Fink Da Fixer, assistant personnel gobelin -PapaTitle = Papa Skullbones, Chamane du Chaos -GalandrilTitle = Galandril Silverwater, Cheerleader elfe -KrotTitle = Krot Shockwhisker, Ing\u00e9nieur skaven +SkillNotFound=Comp\u00e9tence non trouv\u00e9e +forThePlayer=pour le joueur +SkillTypeNotFound=Type de comp\u00e9tence non trouv\u00e9 +RosterTypeNotFound=Roster non trouv\u00e9 + +Name=Nom +Position=Position +M=M +S=F +Ag=Ag +Ar=Ar +Skills=Comp\u00e9tences +SR=S +DR=D +Base\ Cost=Co\u00fbt basique +Cost=Co\u00fbt +OK=OK +Print=Imprimer +HTMLExport=Exporter vers HTML +SelectColor=Choisissez une couleur : +Cancel=Annuler +Single\ Roll=Simple +Double\ Roll=Double +Error=Erreur +No\ skill\ selected=Aucune comp\u00e9tence s\u00e9lectionn\u00e9e +TeamName=Nom de l'\u00e9quipe +Roster\:\ Unknown=Roster: Inconnu +Coach\:\ Unknown=Coach: Inconnu +Player=Joueur +#tourma.MainFrame +Skill=Comp\u00e9tence +TeamGoods=Biens d'\u00e9quipe +Inducements=Primes de match +Mercenaires\ et\ Champions=Mercenaires et champions +Coach=Coach +Assistants=Assistants : +Cheerleaders=Pom Pom girls : +FanFactor=Popularit\u00e9 : +Rerolls=Relances : +Apothecary=Apothicaire : +Extra\ Reroll=Relance additionelle +Bribe\ the\ Ref=Corruption: +Local\ Apothecary=Apothicaire local : +Wizard=Sorcier : +Igor=Igor : +Straplayer=Champion +Associate\ a\ coach=Associer un coach +Include\ skills=Inclure les comp\u00e9tences +Total\ Cost=Prix total +Ranking=Classement +HTML=HTML +Export=Exporter +Import=Importer +Choisissez\ le\ roster=Choisissez le roster +Choix\ du\ roster=Choix du roster +Erreur\ de\ choix\ du\ roster=Erreur de choix du roster +Choix\ du\ coach=Choix du coach +Choisissez\ le\ coach=Choisissez le coach +Select\ skill\ to\ remove=Choisissez la comp\u00e9tence \u00e0 retirer. +Skill=Comp\u00e9tence +Roster\ type\ not\ selected,\ please\ click\ on\ roster=le roster n'est pas d\u00e9fini, SVP choisisszez un roster d'abord. +Choisissez\ le\ type\ de\ joueur=Choisissez le type de joueur +Choix\ du\ joueur=Choix du joueur +Roster=Roster + +# Skills +General=General +G=G +Kick-off\ Return=Anticipation +Strip\ Ball=Arracher le ballon +Block=Blocage +Pass\ Block=Blocage de passe +Sure\ Hands=Dext\u00e9rit\u00e9/Prise s\u00fbre +Kick=Frappe pr\u00e9cise +Frenzy=Fr\u00e9n\u00e9sie +Dauntless=Intr\u00e9pidit\u00e9 +Dirty\ Player=Joueur vicieux/d\u00e9loyal +Wrestle=Lutte +Fend=Parade +Shadowing=Poursuite +Pro=Pro +Tackle=Tacle +Pass=Passe +P=P +Leader=Chef +Hail\ Mary\ Pass=Main de Dieu/Passe d\u00e9sesp\u00e9r\u00e9e +Safe\ Throw=Lancer Pr\u00e9cis/Prudent +Nerves\ of\ Steel=Nerfs d'acier +Dump-Off=Passe rapide/D\u00e9lestage +Accurate=Pr\u00e9cision +Strength=Force +S=F +Multiple\ Block=Blocage multiple +Mighty\ Blow=Ch\u00e2taigne +Strong\ Arm=Costaud/Bras muscl\u00e9 +Thick\ Skull= Cr\u00e2ne \u00e9pais +Piling\ On=Ecrasement +Break\ Tackle=Esquive en force +Guard=Garde +Juggernaut=Juggernaut +Grab=Projection +Stand\ Firm=Stabilit\u00e9 +Mutation=Mutation +M=M +Extra\ Arms=Bras suppl\u00e9mentaire +Horns=Cornes +Two\ Heads=2 T\u00eates +Big\ Hand=Main d\u00e9mesur\u00e9e +Claw=Griffe +Claws=Griffes +Disturbing\ Presence=Pr\u00e9sence perturbante +Prehensile\ Tail=Queue pr\u00e9hensile +Foul\ Appearance=Apparence refoulante +Tentacles=Tentacules +Very\ Long\ Legs=Tr\u00e8s longues jambes +Agility=Agilit\u00e9 +A=A +Jump\ Up=Bond/R\u00e9tablissement +Sure\ Feet=Equilibre +Dodge=Esquive +Side\ Step=Glissade contr\u00f4l\u00e9e +Diving\ Catch=Plongeon/R\u00e9ception plongeante +Catch=R\u00e9c\u00e9ption +Leap=Saut +Sneaky\ Git=Sournois +Sprint=Sprint +Diving\ Tackle=tacle plongeant + +Extraordinary=Extraordinaire +E=E +Wild\ Animal=Animal sauvage +Animosity=Animosit\u00e9 +Secret\ Weapon=Arme secr\u00e8te +Bombardier=Bombardier +Bone\ Head=Cerveau lent +Ball\ And\ Chain=Cha\u00eene et boulet +Decay=D\u00e9composition +Really\ Stupid=Gros d\u00e9bile +Fan\ Favourite=Idole des foules +Throw\ Team-Mate=Lancer un co\u00e9quipier +Kick\ Team-Mate=Botter un co\u00e9quipier +Monstrous\ Mouth=Grande gueule +No\ Hands=Manchot/Sans les mains +Titchy=Microbe +Stunty=Minus +Stakes=Pieux +Right\ Stuff=Poids plume +Stab=Poignard +Nurgle's\ Rot=Pourriture de Nurgle +Take\ Roots=Prendre racine +Hypnotic\ Gaze=Regard hypnotique +Regeneration=R\u00e9g\u00e9n\u00e9ration +Blood\ Lust=Petite soif +Loner=Perso +Always\ Hungry=Toujours affam\u00e9 +Chainsaw=Tron\u00e7onneuse +Characteristics=Caract\u00e9ristiques +C=C ++1\ Movement=+1 Mouvement ++1\ Strength=+1 Force ++1\ Agility=+1 Agilit\u00e9 ++1\ Armor=+1 Armure +Injury=Blessure +I=I +Niggling\ Injury=Blessure persistante +-1\ Movement=-1 Mouvement +-1\ Strength=-1 Force +-1\ Agility=-1 Agilit\u00e9 +-1\ Armor=-1 Armure +Swoop=Piqu\u00e9 +Weeping\ Dagger=Dague suintante + +#Positions +Amazon\ Blitzer=Blitzeuse +Amazon\ Thrower=Lan\u00e7euse +Amazon\ Catcher=Receveuse +Amazon\ Linewoman=Trois-Quart +Chaos\ Warrior=Guerrier du Chaos +Beastman= Homme B\u00eate +Minotaur=Minotaure +Blocker=Bloqueur +Bull\ Cantaur=Centaure Taureau +Hobgoblin=Hobgobelin +Blitzer=Blitzeur +Thrower=Lanceur +Catcher=Receveur +Lineman=Trois-Quart +Chaos\ Troll=Troll du Chaos +Chaos\ Ogre=Ogre du Chaos +Marauder=Maraudeur +Goblin=Gobelin +Dark\ Elf=Elfes noir +Skaven=Skaven +Witch\ Elf=Furie +Runner=Coureur +Assassin=Assassin +Troll\ Slayer=Tueur de troll +Deathroller=Roule-mort +Troll=Troll +Bombardier=Bombardier +Pogo\ Stick=B\u00e2ton \u00e0 ressort +Looney=Barjot +Fanatic=Fanatique +Treeman=Homme-arbre +Halflings=Halfling +Ogre=Ogre +Tomb\ Guardian=Gardien des tombes +Thro-Ra=Thro-Ra +Skeleton=Squelette +Blitz-Ra=Blitz-Ra +Blood\ Thirter=Buveur de sang +Herald=Heraut de Khorne +BloodLetter=Lettre de sang +Pitfighter=Gladiateur +Saurus=Saurus +Skink=Skink +Kroxigor=Kroxigor +Werewolf=Loup-Garou +Ghoul=Goule +Wigth=Revenant +Flesh\ Golem=Golem de chair +Zombie=Zombie +Yeti=Y\u00e9ti +Ulfwerner=Ulfwerner +Berserker=Berserker +Nurgle's\ Warrior=Guerrier de Nurgle +Pestigor=Pestigor +Nurgle's\ Beast=B\u00eate de Nurgle +Rotter=Pourri +Snotling=Snotling +Black\ Orc\ Blocker=Bloqueur Orque noir +Stormvemins=Vermine de choc +Gutter\ Runner=Coureur d'\u00e9gout +Rat\ Ogre=Rat Ogre +Wardanser=Danseur de guerre +Vampires=Vampire +Vampire=Vampire +Thrall=Serviteur +Skaven\ Linerat=Trois-Quart Skaven +Skaven\ Thrower=Lanceur Skaven +Stormvermin=Vermine de choc +Warpstone\ Troll=Troll de Malepierre +Mummy=Momie +Hooligan=Hooligan +Doom\ Diver=Plongeur de la mort +Timm-ber!=Timm-ber! + +# Starplayers +Bertha\ Bigfist=Bertha GroPOing +Barik\ Farblast=Bark Tirloin +Boomer\ Ezaiasson=Blam Eziasson +Ripper\ Bolgrot=Bolgrot L'Ecrabouilleur +Boomer\ Dribblesnot=Boomer Morvonez +Headsplitter=Cass'Cr\u00e2ne +Count\ Luthor\ Von\ Drakenborg=Comte Luthor Von Drakenborg +Dolfar\ Longstride=Dolfar Long'jambes +Eldril\ Sidewinder=Eldril Fendlabise +Fezglish=Fezglish +Fungus\ The\ Loon=Fungus le Cingl\u00e9 +Glart\ Smarship\ Jr=Glart Lavoll\u00e9e Jr. +Grashnak\ Blackhoof=Grashnak noirsabo +Griff\ Oberwald=Griff Oberwald +Grim\ Ironjaws=Grom Croc d'acier +Hack\ Enslash=Hack L'etripeur +Hakflem\ Skuttlespike=Hakflem Pointu +Helmut\ Wulf=Helmut Wulf +Hemlock=Hemlock +Horkon\ Heartripper=Horkon L'Ecorcheur +Hthark\ the\ Unstoppable=Hhtark le D\u00e9fonceur +Hubris\ Rakarth=Hubris Rakarth +Icepelt\ Hammerblow=Icepelt Eclat'Marteau +Crazy\ Igor=Igor le fou +Humerus\ Carpa=Humerus Carpal +Ithaca\ Benoin=Ithaca Benoin +J\ Earlice=J; Oreillefine +Lewdgrip\ Whiparm=Lewdgrip Fouet'bras +Jordell\ Freshbreeze=Jordell Flechevive +Lord\ Borak\ The\ Despoiler=lord Borak le Destructeur +Bouta\u00efdo=Bouta\u00efdo +Max\ Spleenripper=Max Eclaterate +Morg'N'Torg=Morg'N'Torg +Nobbla\ Blackwart=Nobbla la teigne +Brick\ Far'th=Pet'Brick +Grotty=Minab +Prince\ Moranion=Prince Moranion +Puggy\ Baconbreath=Puggy Haleinedebacon +Quetzal\ Leap=Quetzal le Bondissant +Deeproot\ Strongbranch=Racine Dutronc +Ratmut\ III=Ratmut III +Rashnak\ Backstab=Rashnak Lamedansledos +Roxanna\ Darknails=Roxanna Onglenoir +Scrappa\ Sorehead=Scrappa Malocrane +Setekh=Setekh +Skitter\ Stab-Stab=Skitter Pic-Pic +Silibili=Silibili +Sinnedbad=Sinnedbad +Soaren\ Hightower=Soaren Hautetour +Flint\ Churnblade=Tron\u00e7onneuse Flint +Ugroth\ Bolgrot=Ugrot Tranchegrots +Varag\ Ghoul-Chewer=Varag Mache Goule +Wilhelm\ Chaney=Wilhem Chaney +Willow\ Rosebark=Willow Teinrose +Zara\ The\ Slayer=Zara la Tueuse +Mighty\ Zug=Zug la B\u00eate +Zzharg\ Madeye=Zzharg le Borgne + + +AmazonKey=Amazones +UnderworldKey=Bas-fonds +ChaosKey=Chaos +ElfKey=Elfes +ElfUnionKey=Union Elfique +WoodElfKey=Elfes sylvains +DarkElfKey=Elfes noirs +GoblinKey=Gobelins +HalflingKey=Halflings +HighElfKey=Haut-Elfes +LizardmenKey=Hommes-L\u00e9zards +HumanKey=Humains +KhemriKey=Khemri +UndeadKey=Morts-Vivants +DwarfKey=Nains +ChaosDwarfKey=Nains du chaos +NecromanticKey=Necromantiques +NorseKey=Nordiques +NurgleKey=Pouris de Nurgle +OgreKey=Ogres +OrcKey=Orques +ChaosPactKey=Pacte Chaotique +SkavenKey=Skavens +SlannKey=Slanns +VampireKey=Vampires +KhornesDaemonsKey=D\u00e9mons de Khorne +BretonianKey=Bretonniens +ChaosRenegadesKey=Ren\u00e9gats du Chaos +UnderworldDenizenKey=Habitants des bas-fonds +ChaosChosenKey=Elus du Chaos +KhemriTombKingsKey=Rois des tombes Khemri +NecromanticHorrorKey=Horreurs n\u00e9cromantiques +ShamblingUndeadKey=Morts-vivants rampants + +# Report translation +RosterTitle=Roster +NameTitle=Nom +PositionTitle=Position +MTitle=M +STitle=F +AgTitle=Ag +ArTitle=Ar +SkillsTitle=Comp\u00e9tences +CostTitle=Co\u00fbt +SRTitle=S +DRTitle=D +TeamNameTitle=Nom de l'\u00e9quipe +ApothecaryTitle=Apothicaire +CoachNameTitle=Nom du Coach +AssistTitle=Assistants +RaceTitle=Race +CheerleadersTitle=Pom-Pom Girls +FanFactorTitle=Facteur de popularit\u00e9 +ExtraRerollTitle=Relance additionnelle +LocalApothecaryTitle=Apothicaire local +IgorTitle=Igor +BribeTitle=Corruption d'arbitre +WizardTitle=Sorcier +BabesTitle=Serveuse de Bloodweiser +ChefTitle=Cuistot Halfling +CardsTitle=Cartes sp\u00e9ciales +TotalTitle=Total +RerollTitle=Relance +RankTitle=Classement + +# To translate the test +Translate=Traduire +PinCode=Code PIN + +ChaosWizardTitle= Sorcier du Chaos +HoratioTitle = Horatio X. Schottenheim, Ma\u00eetre mage +KariTitle = Kari Coldwater, Cheerleader nordique +FinkTitle = Fink Da Fixer, assistant personnel gobelin +PapaTitle = Papa Skullbones, Chamane du Chaos +GalandrilTitle = Galandril Silverwater, Cheerleader elfe +KrotTitle = Krot Shockwhisker, Ing\u00e9nieur skaven + +# Inducements +chef=Cuistot Halfling \ No newline at end of file diff --git a/src/teamma/rules/naf2017/amazons.xml b/src/teamma/rules/BB2016/amazons.xml similarity index 65% rename from src/teamma/rules/naf2017/amazons.xml rename to src/teamma/rules/BB2016/amazons.xml index 87f25b85..c144946e 100644 --- a/src/teamma/rules/naf2017/amazons.xml +++ b/src/teamma/rules/BB2016/amazons.xml @@ -11,15 +11,45 @@ and open the template in the editor. AmazonKey 50000 true - 300000 - false - 100000 - false - true - false - false - false - false + + + + + + + + + + + + + + + + + + + + + 4 diff --git a/src/teamma/rules/naf2017/bretonians.xml b/src/teamma/rules/BB2016/bretonians.xml similarity index 83% rename from src/teamma/rules/naf2017/bretonians.xml rename to src/teamma/rules/BB2016/bretonians.xml index 1557d074..fc6dbb42 100644 --- a/src/teamma/rules/naf2017/bretonians.xml +++ b/src/teamma/rules/BB2016/bretonians.xml @@ -11,15 +11,26 @@ and open the template in the editor. BretonianKey 70000 true + 300000 - false 100000 - false - true - false - false - false - false + + + 300000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + 80000 + 4 diff --git a/src/teamma/rules/naf2017/chaos.xml b/src/teamma/rules/BB2016/chaos.xml similarity index 79% rename from src/teamma/rules/naf2017/chaos.xml rename to src/teamma/rules/BB2016/chaos.xml index 80e80921..98208423 100644 --- a/src/teamma/rules/naf2017/chaos.xml +++ b/src/teamma/rules/BB2016/chaos.xml @@ -11,15 +11,28 @@ and open the template in the editor. ChaosChosenKey 60000 true - 300000 - false - 100000 - true - false - false - true - false - false + + + 300000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 150000 + 150000 + 80000 + 80000 + + 4 diff --git a/src/teamma/rules/naf2017/chaosdwarves.xml b/src/teamma/rules/BB2016/chaosdwarves.xml similarity index 85% rename from src/teamma/rules/naf2017/chaosdwarves.xml rename to src/teamma/rules/BB2016/chaosdwarves.xml index c56e8720..f5db6082 100644 --- a/src/teamma/rules/naf2017/chaosdwarves.xml +++ b/src/teamma/rules/BB2016/chaosdwarves.xml @@ -11,15 +11,26 @@ and open the template in the editor. ChaosDwarfKey 70000 true - 300000 - false - 100000 - true - false - false - false - false - false + + + 300000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 150000 + 80000 + + 6 diff --git a/src/teamma/rules/naf2017/chaosrenegades.xml b/src/teamma/rules/BB2016/chaosrenegades.xml similarity index 90% rename from src/teamma/rules/naf2017/chaosrenegades.xml rename to src/teamma/rules/BB2016/chaosrenegades.xml index f5595e74..76c0e843 100644 --- a/src/teamma/rules/naf2017/chaosrenegades.xml +++ b/src/teamma/rules/BB2016/chaosrenegades.xml @@ -11,15 +11,29 @@ and open the template in the editor. ChaosRenegadesKey 70000 true - 300000 - false - 100000 - true - false - false - true - false - false + + + 300000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 150000 + 100000 + 150000 + 80000 + 80000 + + 1 diff --git a/src/teamma/rules/naf2017/darkelves.xml b/src/teamma/rules/BB2016/darkelves.xml similarity index 86% rename from src/teamma/rules/naf2017/darkelves.xml rename to src/teamma/rules/BB2016/darkelves.xml index 14708ac1..98901b2d 100644 --- a/src/teamma/rules/naf2017/darkelves.xml +++ b/src/teamma/rules/BB2016/darkelves.xml @@ -11,15 +11,26 @@ and open the template in the editor. DarkElfKey 50000 true - 300000 - false - 100000 - false - false - false - false - false - false + + + 300000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 150000 + 80000 + + 4 diff --git a/src/teamma/rules/naf2017/dwarves.xml b/src/teamma/rules/BB2016/dwarves.xml similarity index 86% rename from src/teamma/rules/naf2017/dwarves.xml rename to src/teamma/rules/BB2016/dwarves.xml index 62fb128c..56b09e2c 100644 --- a/src/teamma/rules/naf2017/dwarves.xml +++ b/src/teamma/rules/BB2016/dwarves.xml @@ -11,15 +11,29 @@ and open the template in the editor. DwarfKey 50000 true - 300000 - false - 100000 - false - true - false - false - false - false + + + 300000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 80000 + 50000 + 70000 + + + + 2 @@ -118,7 +132,7 @@ and open the template in the editor. Loner Secret Weapon - No Hands + No Hand Mighty Blow Break Tackle Dirty Player diff --git a/src/teamma/rules/naf2017/elves.xml b/src/teamma/rules/BB2016/elves.xml similarity index 82% rename from src/teamma/rules/naf2017/elves.xml rename to src/teamma/rules/BB2016/elves.xml index 2514d20b..e024a1ad 100644 --- a/src/teamma/rules/naf2017/elves.xml +++ b/src/teamma/rules/BB2016/elves.xml @@ -11,15 +11,27 @@ and open the template in the editor. ElfUnionKey 50000 true - 300000 - false - 100000 - false - false - false - false - true - false + + + 300000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 80000 + 150000 + 50000 + + 2 diff --git a/src/teamma/rules/naf2017/goblins.xml b/src/teamma/rules/BB2016/goblins.xml similarity index 90% rename from src/teamma/rules/naf2017/goblins.xml rename to src/teamma/rules/BB2016/goblins.xml index 1250ee22..2411ca2e 100644 --- a/src/teamma/rules/naf2017/goblins.xml +++ b/src/teamma/rules/BB2016/goblins.xml @@ -11,16 +11,27 @@ and open the template in the editor. GoblinKey 60000 true - 300000 - false - 50000 - false - false - true - false - false - false - + + + 300000 + 50000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 80000 + 50000 + + + 16 Goblin @@ -145,7 +156,7 @@ and open the template in the editor. 7 Stunty - No Hands + No Hand Secret Weapon Ball And Chain diff --git a/src/teamma/rules/naf2017/halflings.xml b/src/teamma/rules/BB2016/halflings.xml similarity index 76% rename from src/teamma/rules/naf2017/halflings.xml rename to src/teamma/rules/BB2016/halflings.xml index 278c9d6e..2947df7c 100644 --- a/src/teamma/rules/naf2017/halflings.xml +++ b/src/teamma/rules/BB2016/halflings.xml @@ -1,75 +1,88 @@ - - - - - - - HalflingKey - 60000 - true - 100000 - false - 100000 - false - false - false - false - false - false - - - 2 - Treeman - 2 - 6 - 1 - 10 - - Take Roots - Stand Firm - Mighty Blow - Thick Skull - Strong Arm - Throw Team-Mate - Timm-ber! - - 120000 - - Strength - - - General - Agility - Pass - - - - 16 - Halflings - 5 - 2 - 3 - 6 - - Dodge - Stunty - Right Stuff - - 30000 - - Agility - - - Strength - General - Pass - - - - - - + + + + + + + HalflingKey + 60000 + true + + + 100000 + 100000 + 50000 + 150000 + 100000 + 100000 + + yes + yes + + 20000 + 20000 + 30000 + + 80000 + 70000 + 60000 + 40000 + + + + + 2 + Treeman + 2 + 6 + 1 + 10 + + Take Roots + Stand Firm + Mighty Blow + Thick Skull + Strong Arm + Throw Team-Mate + Timm-ber! + + 120000 + + Strength + + + General + Agility + Pass + + + + 16 + Halflings + 5 + 2 + 3 + 6 + + Dodge + Stunty + Right Stuff + + 30000 + + Agility + + + Strength + General + Pass + + + + + + diff --git a/src/teamma/rules/naf2017/highelves.xml b/src/teamma/rules/BB2016/highelves.xml similarity index 86% rename from src/teamma/rules/naf2017/highelves.xml rename to src/teamma/rules/BB2016/highelves.xml index 27534c19..c1742f00 100644 --- a/src/teamma/rules/naf2017/highelves.xml +++ b/src/teamma/rules/BB2016/highelves.xml @@ -14,6 +14,19 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + false + false + false + false + + false + false + false + false false false false diff --git a/src/teamma/rules/naf2017/humans.xml b/src/teamma/rules/BB2016/humans.xml similarity index 88% rename from src/teamma/rules/naf2017/humans.xml rename to src/teamma/rules/BB2016/humans.xml index 5b269f03..50836cf0 100644 --- a/src/teamma/rules/naf2017/humans.xml +++ b/src/teamma/rules/BB2016/humans.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + false + false + false + true + false + false + false + false false false false diff --git a/src/teamma/rules/naf2017/khemris.xml b/src/teamma/rules/BB2016/khemris.xml similarity index 87% rename from src/teamma/rules/naf2017/khemris.xml rename to src/teamma/rules/BB2016/khemris.xml index 63f507f8..ece44027 100644 --- a/src/teamma/rules/naf2017/khemris.xml +++ b/src/teamma/rules/BB2016/khemris.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + false + false + false + false + false + false + false + true false false false diff --git a/src/teamma/rules/naf2017/khornesdaemons.xml b/src/teamma/rules/BB2016/khornesdaemons.xml similarity index 87% rename from src/teamma/rules/naf2017/khornesdaemons.xml rename to src/teamma/rules/BB2016/khornesdaemons.xml index 13a4c136..fba04971 100644 --- a/src/teamma/rules/naf2017/khornesdaemons.xml +++ b/src/teamma/rules/BB2016/khornesdaemons.xml @@ -14,6 +14,20 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + + false + false + true + false + false + false + false + false + true false false diff --git a/src/teamma/rules/naf2017/lizardmen.xml b/src/teamma/rules/BB2016/lizardmen.xml similarity index 68% rename from src/teamma/rules/naf2017/lizardmen.xml rename to src/teamma/rules/BB2016/lizardmen.xml index edb63004..ae1c7308 100644 --- a/src/teamma/rules/naf2017/lizardmen.xml +++ b/src/teamma/rules/BB2016/lizardmen.xml @@ -10,16 +10,31 @@ and open the template in the editor. LizardmenKey 60000 + true + 300000 false 100000 + true + true + true + false + false + false + false + false + true + false + false + false false false false false false false + 6 @@ -40,6 +55,29 @@ and open the template in the editor. Pass + + 2 + Chameleon Skink + 7 + 2 + 3 + 7 + + Dodge + Stunty + Pass Block + Shadowing + + 70000 + + Agility + + + General + Pass + Strength + + 16 Skink diff --git a/src/teamma/rules/naf2017/necromantics.xml b/src/teamma/rules/BB2016/necromantics.xml similarity index 88% rename from src/teamma/rules/naf2017/necromantics.xml rename to src/teamma/rules/BB2016/necromantics.xml index 2e92d939..0f6edeb9 100644 --- a/src/teamma/rules/naf2017/necromantics.xml +++ b/src/teamma/rules/BB2016/necromantics.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 true 100000 + true + true + true + false + false + false + false + false + false + false + false + true false false false diff --git a/src/teamma/rules/naf2017/norses.xml b/src/teamma/rules/BB2016/norses.xml similarity index 90% rename from src/teamma/rules/naf2017/norses.xml rename to src/teamma/rules/BB2016/norses.xml index a671da09..2a11fc2a 100644 --- a/src/teamma/rules/naf2017/norses.xml +++ b/src/teamma/rules/BB2016/norses.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + false + false + false + true + false + false + false + false false true false diff --git a/src/teamma/rules/naf2017/nurgle.xml b/src/teamma/rules/BB2016/nurgle.xml similarity index 87% rename from src/teamma/rules/naf2017/nurgle.xml rename to src/teamma/rules/BB2016/nurgle.xml index 5fe0a49b..ad22fe13 100644 --- a/src/teamma/rules/naf2017/nurgle.xml +++ b/src/teamma/rules/BB2016/nurgle.xml @@ -14,7 +14,20 @@ and open the template in the editor. 300000 true 100000 - true + true + true + true + false + true + true + true + false + false + false + false + false + true + false false true diff --git a/src/teamma/rules/naf2017/ogres.xml b/src/teamma/rules/BB2016/ogres.xml similarity index 81% rename from src/teamma/rules/naf2017/ogres.xml rename to src/teamma/rules/BB2016/ogres.xml index 184e0fa2..3f242879 100644 --- a/src/teamma/rules/naf2017/ogres.xml +++ b/src/teamma/rules/BB2016/ogres.xml @@ -14,6 +14,19 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + false + false + false + true + false + true + true + false + false false true diff --git a/src/teamma/rules/BB2016/oldworldalliance.xml b/src/teamma/rules/BB2016/oldworldalliance.xml new file mode 100644 index 00000000..c144946e --- /dev/null +++ b/src/teamma/rules/BB2016/oldworldalliance.xml @@ -0,0 +1,140 @@ + + + + + + + AmazonKey + 50000 + true + + + + + + + + + + + + + + + + + + + + + + + + 4 + Amazon Blitzer + 6 + 3 + 3 + 7 + + Dodge + Block + + 90000 + + General + Strength + + + Agility + Pass + + + + 2 + Amazon Thrower + 6 + 3 + 3 + 7 + + Dodge + Pass + + 70000 + + General + Pass + + + Agility + Strength + + + + 2 + Amazon Catcher + 6 + 3 + 3 + 7 + + Dodge + Catch + + 70000 + + General + Agility + + + Strength + Pass + + + + 16 + Amazon Linewoman + 6 + 3 + 3 + 7 + + Dodge + + 50000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/naf2017/orcs.xml b/src/teamma/rules/BB2016/orcs.xml similarity index 89% rename from src/teamma/rules/naf2017/orcs.xml rename to src/teamma/rules/BB2016/orcs.xml index 88d14338..4ce81c8d 100644 --- a/src/teamma/rules/naf2017/orcs.xml +++ b/src/teamma/rules/BB2016/orcs.xml @@ -14,7 +14,19 @@ and open the template in the editor. 300000 false 100000 - false + true + true + true + false + false + false + false + false + false + false + false +false +false false true false diff --git a/src/teamma/rules/naf2017/roster.xsd b/src/teamma/rules/BB2016/roster.xsd similarity index 100% rename from src/teamma/rules/naf2017/roster.xsd rename to src/teamma/rules/BB2016/roster.xsd diff --git a/src/teamma/rules/naf2017/roster.xsl b/src/teamma/rules/BB2016/roster.xsl similarity index 100% rename from src/teamma/rules/naf2017/roster.xsl rename to src/teamma/rules/BB2016/roster.xsl diff --git a/src/teamma/rules/naf2017/rules.xml b/src/teamma/rules/BB2016/rules.xml similarity index 72% rename from src/teamma/rules/naf2017/rules.xml rename to src/teamma/rules/BB2016/rules.xml index aba72e48..96068af0 100644 --- a/src/teamma/rules/naf2017/rules.xml +++ b/src/teamma/rules/BB2016/rules.xml @@ -1,6 +1,6 @@ - NAF2017 + BB2016 amazons.xml chaos.xml @@ -28,26 +28,11 @@ vampires.xml woodelves.xml bretonians.xml + snotlings.xml + oldworldalliance.xml - yes - yes - yes - yes - yes - yes - yes - yes - yes yes - - yes - yes - yes - yes - yes - yes - yes no 0 diff --git a/src/teamma/rules/naf2017/skavens.xml b/src/teamma/rules/BB2016/skavens.xml similarity index 89% rename from src/teamma/rules/naf2017/skavens.xml rename to src/teamma/rules/BB2016/skavens.xml index ce5cb269..c81a9aae 100644 --- a/src/teamma/rules/naf2017/skavens.xml +++ b/src/teamma/rules/BB2016/skavens.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + false + false + false + false + false + false + false + false false false false diff --git a/src/teamma/rules/naf2017/skills.xml b/src/teamma/rules/BB2016/skills.xml similarity index 96% rename from src/teamma/rules/naf2017/skills.xml rename to src/teamma/rules/BB2016/skills.xml index 81e0d27c..7e620152 100644 --- a/src/teamma/rules/naf2017/skills.xml +++ b/src/teamma/rules/BB2016/skills.xml @@ -1,141 +1,142 @@ - - - - - - - General - G - false - Kick-off Return - Strip Ball - Block - Pass Block - Kick - Frenzy - Dauntless - Dirty Player - Wrestle - Fend - Shadowing - Sure Hands - Pro - Tackle - - - Pass - P - false - Leader - Dump-Off - Safe Throw - - Nerves of Steel - Hail Mary Pass - Pass - - Accurate - - - Strength - S - false - Multiple Block - Mighty Blow - Strong Arm - Thick Skull - Piling On - Break Tackle - Guard - Juggernaut - Grab - Stand Firm - - - Mutation - M - false - Extra Arms - Horns - Two Heads - Big Hand - Claws - Disturbing Presence - Prehensile Tail - Foul Appearance - Tentacles - Very Long Legs - - - Agility - A - false - Jump Up - Sure Feet - Dodge - Side Step - Diving Catch - Catch - Leap - Sneaky Git - Sprint - Diving Tackle - - - Extraordinary - E - true - Wild Animal - Animosity - Secret Weapon - Bombardier - Bone Head - Ball And Chain - Decay - Really Stupid - Fan Favourite - Throw Team-Mate - Kick Team-Mate - Monstrous Mouth - No Hands - Titchy - Timm-Ber ! - Stunty - Stakes - Right Stuff - Stab - Nurgle's Rot - Take Roots - Hypnotic Gaze - Regeneration - Blood Lust - Loner - Always Hungry - Chainsaw - Swoop - Timm-ber! - Weeping Dagger - - - Characteristics - C - true - +1 Movement - +1 Strength - +1 Agility - +1 Armor - - - Injury - I - true - Niggling Injury - -1 Movement - -1 Strength - -1 Agility - -1 Armor - - + + + + + + + General + G + false + Kick-off Return + Strip Ball + Block + Pass Block + Kick + Frenzy + Dauntless + Dirty Player + Wrestle + Fend + Shadowing + Sure Hands + Pro + Tackle + + + Pass + P + false + Leader + Dump-Off + Safe Throw + + Nerves of Steel + Hail Mary Pass + Pass + + Accurate + + + Strength + S + false + Multiple Block + Mighty Blow + Strong Arm + Thick Skull + Piling On + Break Tackle + Guard + Juggernaut + Grab + Stand Firm + + + Mutation + M + false + Extra Arms + Horns + Two Heads + Big Hand + Claws + Disturbing Presence + Prehensile Tail + Foul Appearance + Tentacles + Very Long Legs + + + Agility + A + false + Jump Up + Sure Feet + Dodge + Side Step + Diving Catch + Catch + Leap + Sneaky Git + Sprint + Diving Tackle + + + Extraordinary + E + true + Wild Animal + Animosity + Secret Weapon + Bombardier + Bone Head + Ball And Chain + Decay + Really Stupid + Fan Favourite + Throw Team-Mate + Kick Team-Mate + Monstrous Mouth + No Hand + Titchy + Timm-Ber ! + Stunty + Stakes + Right Stuff + Stab + Nurgle's Rot + Take Roots + Hypnotic Gaze + Regeneration + Blood Lust + Loner + Always Hungry + Chainsaw + Swoop + Timm-ber! + Weeping Dagger + Trademark Stilts + + + Characteristics + C + true + +1 Movement + +1 Strength + +1 Agility + +1 Armor + + + Injury + I + true + Niggling Injury + -1 Movement + -1 Strength + -1 Agility + -1 Armor + + diff --git a/src/teamma/rules/naf2017/slanns.xml b/src/teamma/rules/BB2016/slanns.xml similarity index 87% rename from src/teamma/rules/naf2017/slanns.xml rename to src/teamma/rules/BB2016/slanns.xml index 62e874b8..77a1b413 100644 --- a/src/teamma/rules/naf2017/slanns.xml +++ b/src/teamma/rules/BB2016/slanns.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 false 100000 + true + true + true + false + false + false + false + false + false + false + false + false false false false diff --git a/src/teamma/rules/BB2016/snotlings.xml b/src/teamma/rules/BB2016/snotlings.xml new file mode 100644 index 00000000..c144946e --- /dev/null +++ b/src/teamma/rules/BB2016/snotlings.xml @@ -0,0 +1,140 @@ + + + + + + + AmazonKey + 50000 + true + + + + + + + + + + + + + + + + + + + + + + + + 4 + Amazon Blitzer + 6 + 3 + 3 + 7 + + Dodge + Block + + 90000 + + General + Strength + + + Agility + Pass + + + + 2 + Amazon Thrower + 6 + 3 + 3 + 7 + + Dodge + Pass + + 70000 + + General + Pass + + + Agility + Strength + + + + 2 + Amazon Catcher + 6 + 3 + 3 + 7 + + Dodge + Catch + + 70000 + + General + Agility + + + Strength + Pass + + + + 16 + Amazon Linewoman + 6 + 3 + 3 + 7 + + Dodge + + 50000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/naf2017/starplayers.xml b/src/teamma/rules/BB2016/starplayers.xml similarity index 65% rename from src/teamma/rules/naf2017/starplayers.xml rename to src/teamma/rules/BB2016/starplayers.xml index 112b0cda..3324a542 100644 --- a/src/teamma/rules/naf2017/starplayers.xml +++ b/src/teamma/rules/BB2016/starplayers.xml @@ -8,131 +8,205 @@ and open the template in the editor. + + + Gretchen Wätcher 'The Blood Bowl Widow' + + Spike + + Banshee + 7 + 3 + 4 + 7 + + Loner + Disturbing Presence + Dodge + Foul Appearance + Jump Up + No Hand + Regeneration + Shadowing + Side Step + + 280000 + VampireKey + NecromanticHorrorKey + ShamblingUndeadKey + - Bertha Bigfist *CRP* - Ogre + Throttlesnot 'The Impaler' + + Spike + + Zombie Goblin 6 - 5 - 2 - 9 + 2 + 3 + 7 Loner - Bone Head + Dirty Player Dodge - Mighty Blow - Thick Skull - Throw Team-Mate + Regeneration + Leap + Secret Weapon + Stab + Stunty - 260000 - AmazonKey - HalflingKey - OgreKey + 100000 + ShamblingUndeadKey + NecromanticHorrorKey - - Barik Farblast *CRP/BB2016* - Runner + + 'Rotten' Rick Bupkeis + + Spike + + Zombie + 4 + 3 + 2 + 8 + + Loner + Dirty Player + Sneaky Git + Regeneration + + 110000 + ShamblingUndeadKey + NecromanticHorrorKey + + + + Skrull Halfheight + + Spike + + Skeletal Dwarf 6 3 3 8 Loner - Hail Mary Pass + Accurate + Nerves of Steel Pass - Secret Weapon - Strong Arm + Regeneration Sure Hands Thick Skull - 60000 - DwarfKey + 190000 + KhemriTombKingsKey + ShamblingUndeadKey - Boomer Ezaiasson *CRP* - Longbeard - 4 - 3 + Ivan 'The Animal' Deathshourd + + Spike + + Wight + 6 + 4 2 - 9 + 8 Loner - Accurate Block - Bombardier - Secret Weapon - Loner - Thick Skull + Disturbing Presence + Juggernaut + Regeneration + Strip Ball + Tackle - 60000 - DwarfKey - NorseKey + 230000 + KhemriTombKingsKey + ShamblingUndeadKey + NecromanticHorrorKey - Ripper Bolgrot *CRP + BB2016* - Troll - 4 - 6 - 1 - 9 + Bryce 'The Slice' Cambuel + + Spike + + Looney + 5 + 3 + 2 + 8 Loner - Mighty Blow - Throw Team-Mate - Grab + Chainsaw Regeneration + Secret Weapon + Stand Firm + Thick Skull - 270000 - GoblinKey - OrcKey + 130000 + KhemriTombKingsKey + ShamblingUndeadKey - Boomer Dribblesnot *CRP* - Bombardier - 6 - 2 + G'Ral Blodschüker + + Spike + + Ghoul + 7 + 3 3 7 Loner - Accurate - Bombardier + Catch Dodge - Stunty - Right Stuff - Secret Weapon + Sure Feet + Wrestle - 60000 - GoblinKey - OrcKey - OgreKey - ChaosRenegadesKey - UnderworldDenizenKey + 160000 + VampireKey + NecromanticHorrorKey + ShamblingUndeadKey - Headsplitter *CRP* - Rat Ogre - 6 - 6 - 3 - 8 + Frank'N'Stein + + Spike + + Golem + 4 + 5 + 1 + 9 Loner - Frenzy - Prehensile Tail + Break Tackle Mighty Blow + Regeneration + Stand Firm + Thick Skull - 340000 - SkavenKey + 270000 + HumanKey + NecromanticHorrorKey + ShamblingUndeadKey - Count Luthor Von Drakenborg *CRP* + Count Luthor Von Drakenborg + + CRP + Spike + Vampire 6 5 @@ -152,1414 +226,2168 @@ and open the template in the editor. - Dolfar Longstride *CRP* - Thrower - 7 - 3 - 4 - 7 + Ratmut III + + CRP + Spike + + Mummy + 5 + 6 + 1 + 9 Loner - Diving Catch - Hail Mary Pass - Kick-off Return - Pass Block - Kick + Mighty Blow + Break Tackle + Wrestle + Regeneration - 170000 - ElfUnionKey - HighElfKey - WoodElfKey - BretonianKey + 380000 + KhemriTombKingsKey + ShamblingUndeadKey + NecromanticHorrorKey - Eldril Sidewinder *CRP+BB2016* - Catcher - 8 + Big Jobo Hairyfoor + + Spike + + Blocker + 4 3 - 4 - 7 + 2 + 8 Loner - Pass Block - Dodge - Nerves of Steel - Catch - Hypnotic Gaze + Dirty Player + Stand Firm + Stunty + Tackle + Wrestle - 200000 - DarkElfKey - ElfUnionKey - HighElfKey - WoodElfKey + 120000 + OgreKey + HalflingKey - Fezglish *CRP* - Fanatic - 4 - 7 + Rumbelow Sheepskin + + Spike + + halfling + 6 + 3 3 7 Loner - Ball And Chain - Disturbing Presence - Foul Appearance - No Hands - Secret Weapon + Block + Horns + Juggernaut + No Hand + Tackle + Thick Skull - 80000 - SkavenKey - UnderworldDenizenKey + 170000 + HalflingKey - Fungus The Loon *CRP* - Fanatic - 4 - 7 + Cindy Piewhistle + + Spike + + halfling + 5 + 2 3 - 7 + 6 Loner - Ball And Chain - No Hands + Accurate + Bombardier + Dodge + Stunty Secret Weapon - Mighty Blow - Stunty - 80000 - GoblinKey + 50000 + HalflingKey - Glart Smarship Jr *CRP* - Blitzer - 7 - 4 + Neddley Verrüca + + Spike + + halfling + 5 + 2 3 - 8 + 6 Loner - Block - Claws - Juggernaut + Dodge + Secret Weapon + Stab + Stunty + Trademark Stilts - 200000 - SkavenKey - UnderworldDenizenKey + 70000 + HalflingKey - Grashnak Blackhoof *CRP* - Minotaur - 6 - 6 - 2 - 8 + Deeproot Strongbranch + + CRP + Spike + + Treeman + 2 + 7 + 1 + 10 Loner - Horns + Stand Firm Mighty Blow + Block + Strong Arm Thick Skull - Frenzy + Throw Team-Mate + Timm-ber! - 310000 - ChaosChosenKey - ChaosDwarfKey - NurgleKey - KhornesDaemonsKey + 300000 + HalflingKey - Griff Oberwald *CRP+BB2016* - Blitzer - 7 - 4 - 4 - 8 + Puggy Baconbreath + + CRP + Spike + + Halfling + 5 + 3 + 3 + 6 Loner Block Dodge - Fend - Sprint - Sure Feet + Nerves of Steel + Stunty + Right Stuff - 320000 + 140000 HumanKey - BretonianKey + HalflingKey + - Grim Ironjaw *CRP+BB2016* - Dragon Slayer - 5 - 4 - 3 - 8 + Curnoth Darkwold + + Spike + + Witch + 7 + 3 + 4 + 7 Loner - Block - Dauntless + Dodge Frenzy - Multiple Block + Jump Up + Leap + Wrestle + + 240000 + WoodElfKey + + + + Maple Highgrove + + Spike + + Treeman + 3 + 5 + 1 + 10 + + Loner + Grab + Mighty Blow + Stand Firm + Tentacles Thick Skull - 220000 - DwarfKey + 300000 + WoodElfKey - Hack Enslash *CRP* - Skeleton - 6 - 3 - 2 - 7 + Swiftvine Climmershard + + Spike + + Fairy + 7 + 2 + 3 + 6 Loner - Chainsaw - Regeneration - Secret Weapon + Disturbing Presence + Fend Side Step + Stab + Stunty - 120000 - KhemriTombKingsKey - NecromanticHorrorKey - ShamblingUndeadKey + 130000 + WoodElfKey - Hakflem Skuttlespike *CRP+BB2016* - Gutter Runner - 9 - 3 + Gloriel Summerbloom + + Spike + + Thrower + 7 + 2 4 7 Loner - Extra Arms - Two Heads + Accurate Dodge + Pass + Side Step + Sure Hands + + 160000 + WoodElfKey + + + + Zolcat The Zoat + + Spike + + Blocker + 5 + 5 + 2 + 9 + + Loner + Disturbing Presence + Juggernaut + Mighty Blow Prehensile Tail + Regeneration + Sure Feet - 200000 - SkavenKey + 280000 + LizardmenKey + AmazonKey + WoodElfKey - Helmut Wulf *CRP+BB2016* - Lineman + Glotl Stop + + Spike + + Blocker 6 - 3 - 3 - 8 + 6 + 1 + 9 Loner - Chainsaw - Secret Weapon - Stand Firm + Frenzy + Mighty Blow + Piling On + Prehensile Tail + Thick Skull + Wild Animal - 110000 - AmazonKey + 360000 LizardmenKey - HumanKey - NorseKey - VampireKey - SlannKey + AmazonKey - Hemlock *CRP* - Assassin + Drull + + Spike + + Skink 8 2 3 7 Loner - Jump Up - Block Dodge Side Step - Stunty Stab + Stunty - 170000 + 190000 LizardmenKey - SlannKey - Horkon Heartripper *CRP+BB2016* - Assassin - 7 - 3 - 4 + Dribl + + Spike + + Skink + 8 + 2 + 3 7 Loner - Multiple Block Dodge - Stab - Shadowing - Leap + Side Step + Sneaky Git + Dirty Player + Stunty - 210000 - DarkElfKey + 190000 + LizardmenKey - Hthark the Unstoppable *CRP* - Bull Centaur - 6 - 5 - 2 + Anqi Panqi + + Spike + + Saurus + 7 + 4 + 1 9 Loner + Grab Block - Thick Skull - Sure Feet - Break Tackle - Sprint - Juggernaut + Stand Firm - 330000 - ChaosDwarfKey + 210000 + LizardmenKey - Hubris Rakarth *CRP* - Blitzer - 7 + Willow Rosebark + + CRP + Spike + + Dryad + 5 4 - 4 + 3 8 Loner - Strip Ball - Jump Up - Block - Mighty Blow - Dirty Player + Dauntless + Side Step + Thick Skull - 260000 - ElfUnionKey - DarkElfKey + 150000 + AmazonKey + HalflingKey + WoodElfKey + BretonianKey - Icepelt Hammerblow *CRP* - Yetee - 5 - 6 - 1 - 8 - - Loner - Mighty Blow - Claws - Frenzy - Disturbing Presence - Regeneration - - 330000 - NorseKey - - - - Crazy Igor *CRP* - Thrall + Varag Ghoul-Chewer + + CRP + Spike + + Blitzer 6 - 3 + 4 3 - 8 + 9 Loner - Dauntless - Regeneration + Block + Jump Up + Mighty Blow Thick Skull - 130000 - VampireKey - ChaosRenegadesKey - KhornesDaemonsKey + 290000 + OrcKey - Humerus Carpa *CRP* - Catcher + Lucien Swift + + Spike + + Blitzer 7 - 2 - 3 - 7 + 3 + 4 + 8 Loner - Catch - Dodge - Regeneration - Nerves of Steel + Block + Tackle + Mighty Blow - 130000 - KhemriTombKingsKey + 390000 + ElfUnionKey + HighElfKey + WoodElfKey - - Ithaca Benoin *CRP* - Runner + Valen Swift *BB2016* + + Spike + + Thrower 7 3 - 3 + 5 7 - Loner Accurate - Dump-Off + Loner Nerves of Steel - Pass - Regeneration Sure Hands + Pass + Safe Throw - 220000 - KhemriTombKingsKey - DarkElfKey + 0 + ElfUnionKey + HighElfKey + WoodElfKey - J Earlice *CRP* - Ghoul - 8 - 3 + Scrappa Sorehead + + CRP + Spike + + Pogo Stick + 7 + 2 3 7 Loner - Catch - Diving Catch + Dirty Player Dodge + Leap + Right Stuff Sprint + Stunty + Very Long Legs + Sure Feet - 180000 - NecromanticHorrorKey - ShamblingUndeadKey - VampireKey + 150000 + GoblinKey + OgreKey + OrcKey - Lewdgrip Whiparm *CRP+BB2018* - Thrower - 6 - 3 - 3 + Ripper Bolgrot + + CRP + Spike + + Troll + 4 + 6 + 1 9 Loner - Dodge - Pass - Strong Arm - Sure Hands - Tentacles + Mighty Blow + Throw Team-Mate + Grab + Regeneration - 160000 - ChaosChosenKey - ChaosRenegadesKey - NurgleKey + 270000 + GoblinKey + OrcKey - Jordell Freshbreeze *CRP+BB2016* - Wardancer - 8 - 3 - 5 - 7 + Prince Moranion + + CRP + Spike + + Prince Dragon + 7 + 4 + 4 + 8 Loner Block - Dodge - Leap - Side Step - Diving Catch + Dauntless + Tackle + Wrestle 230000 ElfUnionKey - WoodElfKey + HighElfKey - Lord Borak The Despoiler *CRP* - Chaos Lord - 5 + Mighty Zug + + CRP + Spike + + Blocker + 4 5 - 3 + 2 9 Loner Block Mighty Blow - Dirty Player - 300000 - ChaosChosenKey - NurgleKey - KhornesDaemonsKey + 260000 + HumanKey + BretonianKey - Boutaïdo *CRP* - Blitzer - 8 - 3 + Madcap Miggz + + Spike + + Squig + + 6 + 4 3 8 - Loner - Catch - Diving Tackle - Jump Up - Pass Block - Shadowing + Break Tackle + Claws Leap + Loner + No Hand Very Long Legs + Wild Animal - 220000 - LizardmenKey - SlannKey + 170000 + GoblinKey + UnderworldDenizenKey + - Max Spleenripper *CRP* - Chaos Warrior + Kreek Rustgouger + + Spike + + Skaven Blocker 5 - 4 - 3 - 8 + 7 + 2 + 9 + Ball And Chain Loner - Chainsaw + Mighty Blow + No Hand + Prehensile Tail Secret Weapon 130000 - ChaosChosenKey - NurgleKey - KhornesDaemonsKey + SkavenKey + UnderworldDenizenKey + - Morg'N'Torg *CRP+BB2016* - Superstar + Karla Von Kill + + Spike + + Human Blitzer 6 - 6 + 4 3 - 10 + 8 - Loner Block - Mighty Blow - Thick Skull - Throw Team-Mate + Dauntless + Dodge + Jump Up + Loner - 450000 - AmazonKey - ChaosChosenKey - ChaosDwarfKey - ChaosRenegadesKey - DarkElfKey - DwarfKey - ElfUnionKey - GoblinKey + 220000 + AmazonKey + BretonianKey HalflingKey - HighElfKey HumanKey - LizardmenKey NorseKey - NurgleKey - OgreKey - OrcKey - SkavenKey - SlannKey - UnderworldDenizenKey - VampireKey - WoodElfKey - KhornesDaemonsKey - BretonianKey + - Nobbla Blackwart *CRP* - Goblin - 6 - 2 - 3 + Jordell Freshbreeze + + CRP + Spike + + Wardancer + 8 + 3 + 5 7 Loner Block Dodge - Chainsaw - Secret Weapon - Stunty + Leap + Side Step + Diving Catch - 130000 - GoblinKey - OgreKey - ChaosDwarfKey - UnderworldDenizenKey + 230000 + ElfUnionKey + WoodElfKey + - Brick Far'th *CRP* - Ogre - 5 - 5 - 2 - 9 + Helmut Wulf + + CRP + Spike + + Lineman + 6 + 3 + 3 + 8 Loner - Bone Head - Mighty Blow - Thick Skull - Strong Arm - Throw Team-Mate - Nerves of Steel + Chainsaw + Secret Weapon + Stand Firm - 290000 - NurgleKey - OgreKey + 110000 + AmazonKey + LizardmenKey + HumanKey + NorseKey + VampireKey + SlannKey + - Grotty *CRP* - Goblin - 6 - 2 + Hakflem Skuttlespike + + CRP + Spike + + Gutter Runner + 9 + 3 4 7 Loner + Extra Arms + Two Heads Dodge - Stunty - Right Stuff + Prehensile Tail - 0 - NurgleKey - OgreKey + 200000 + SkavenKey + - Prince Moranion *CRP+BB20016* - Prince Dragon - 7 + Grim Ironjaw + + CRP + Spike + + Dragon Slayer + 5 4 - 4 + 3 8 Loner Block Dauntless - Tackle - Wrestle + Frenzy + Multiple Block + Thick Skull - 230000 - ElfUnionKey - HighElfKey + 220000 + DwarfKey - - Puggy Baconbreath *CRP* - Halfling - 5 - 3 - 3 - 6 + + + Griff Oberwald + + CRP + Spike + + Blitzer + 7 + 4 + 4 + 8 Loner Block Dodge - Nerves of Steel - Stunty - Right Stuff + Fend + Sprint + Sure Feet - 140000 + 320000 HumanKey - HalflingKey + BretonianKey + - Quetzal Leap *CRP* - Catcher - 8 - 2 - 4 - 7 + Glart Smashrip + + Spike + + Skaven Blocker + 5 + 4 + 2 + 8 Loner - Catch - Diving Catch - Fend - Kick-off Return - Leap - Nerves of Steel - Very Long Legs + Block + Claws + Juggernaut + Grab + Stand Firm - 250000 - LizardmenKey - SlannKey + 190000 + SkavenKey + UnderworldDenizenKey - - Deeproot Strongbranch *CRP* - Treeman - 2 - 7 - 1 - 10 + + + Flint Churnblade + + CRP + Spike + + Troll Slayer + 5 + 3 + 2 + 8 Loner - Stand Firm - Mighty Blow + Chainsaw Block - Strong Arm + Secret Weapon Thick Skull - Throw Team-Mate - 250000 - HalflingKey + 130000 + DwarfKey + - Ratmut III *CRP* - Mummy - 5 - 6 - 1 + Boomer Ezaiasson + + CRP + Spike + + Longbeard + 4 + 3 + 2 9 Loner - Mighty Blow - Break Tackle - Wrestle - Regeneration + Accurate + Block + Bombardier + Secret Weapon + Loner + Thick Skull - 380000 - KhemriTombKingsKey - ShamblingUndeadKey - NecromanticHorrorKey + 60000 + DwarfKey + NorseKey + - Rashnak Backstab *CRP* - Assassin - 7 + Bo Gallanté + + Spike + + High-elf catcher + 8 3 - 3 + 4 7 - Loner Dodge + Loner Side Step - Stab - Sneaky Git + Sure Feet + Sprint - 200000 - ChaosDwarfKey + 160000 + HighElfKey - - Roxanna Darknails *CRP+BB2016* - With Elf - 8 + + + Grombrindal, The White Dwarf + + Special Event + + + Dwarf Blocker + 5 3 - 5 - 7 + 3 + 9 Loner - Dodge - Frenzy - Jump Up - Juggernaut - Leap + Block + Dauntless + Mighty Blow + Stand Firm + Thick Skull - 250000 - DarkElfKey - AmazonKey + 0 + DwarfKey + HalflingKey + HumanKey + NorseKey + - Scrappa Sorehead *CRP+BB2016* - Pogo Stick - 7 + The Black Gobbo *Special Event* + + Special Event + + Bombardier + 6 2 3 - 7 + 8 Loner - Dirty Player Dodge - Leap - Right Stuff - Sprint + Disturbing Presence + Bombardier + Sneaky Git + Stab + Side Step Stunty - Very Long Legs - Sure Feet - 150000 + 0 + ChaosRenegadesKey GoblinKey - OgreKey OrcKey + UnderworldDenizenKey + - Setekh *CRP* - Blitz-Ra - 6 - 4 + Tolly Glocklinger + + Spike + + Ball and Chain + 3 + 7 2 - 8 + 9 + + Loner + Disturbing Presence + Foul Appearance + No Hand + Nurgle's Rot + Secret Weapon + Stand Firm + + 110000 + NurgleKey + + + + Bulla Shardhorn + + Spike + + Pestigor + 6 + 3 + 3 + 8 Loner - Strip Ball Block - Break Tackle - Juggernaut + Extra Arms + Foul Appearance + Horns + Nurgle's Rot + Two Heads Regeneration + Stab - 220000 - KhemriTombKingsKey - ShamblingUndeadKey - NecromanticHorrorKey + 230000 + NurgleKey + + + + + Jeremiah Kool + + Spike Golden age + + Starplayer + 8 + 3 + 5 + 8 + + Loner + Block + Dodge + Dump-Off + Diving Catch + Nerves of Steel + Kick-off Return + Pass + Side Step + + 390000 + DarkElfKey + - Skitter Stab-Stab *CRP* - Assassin - 9 - 2 + Roxanna Darknails + + Spike + CRP + + With Elf + 8 + 3 + 5 + 7 + + Loner + Dodge + Frenzy + Jump Up + Juggernaut + Leap + + 250000 + DarkElfKey + AmazonKey + + + + Mordrix Hex + + Spike + + Blitzer + 7 + 3 4 7 Loner + Block + Dauntless Dodge - Stab - Prehensile Tail - Shadowing + Fend + Frenzy + Mighty Blow - 160000 - SkavenKey - UnderworldDenizenKey + 230000 + DarkElfKey + + + + Kiroth Krakeneye + + Spike + + Blitzer + 7 + 3 + 4 + 8 + + Loner + Disturbing Presence + Foul Appearance + Tackle + Pass Block + Tentacles + + 170000 + ElfUnionKey + DarkElfKey + - Silibili *CRP* - Saurus + Hubris Rakarth + + CRP + Spike + + Blitzer 7 4 - 1 - 9 + 4 + 8 Loner + Strip Ball + Jump Up Block - Guard - Grab - Stand Firm + Mighty Blow + Dirty Player - 250000 - LizardmenKey - SlannKey + 260000 + ElfUnionKey + DarkElfKey - - Sinnedbad *CRP* + + + Horkon Heartripper + + CRP + Spike + Assassin - 6 + 7 3 - 2 + 4 7 Loner - Block - Jump Up - Pass Block - Regeneration - Secret Weapon - Side Step + Multiple Block + Dodge Stab + Shadowing + Leap - 80000 - ShamblingUndeadKey - KhemriTombKingsKey + 210000 + DarkElfKey + - Soaren Hightower *CRP* - Thrower + Elijah Doom + + Spike + + Blocker 6 3 4 - 8 + 9 Loner Fend - Kick-off Return - Pass - Safe Throw - Sure Hands - Strong Arm + Guard + Stand Firm + Wrestle - 180000 + 190000 + DarkElfKey + ElfUnionKey + + + + Eldril Sidewinder + + CRP + Spike + + Catcher + 8 + 3 + 4 + 7 + + Loner + Pass Block + Dodge + Nerves of Steel + Catch + Hypnotic Gaze + + 200000 + DarkElfKey + ElfUnionKey HighElfKey + WoodElfKey + - Flint Churnblade *CRP* - Troll Slayer - 5 + Asperon Thorn + + Spike + + Thrower + 6 3 - 2 + 4 8 Loner - Chainsaw - Block + Hail Mary Pass + Pass Secret Weapon + Strong Arm + Sure Hands Thick Skull - 130000 - DwarfKey + 160000 + DarkElfKey + ElfUnionKey + HighElfKey + - Ugroth Bolgrot *CRP* - Lineman + Guffle Pusmaw + + Spike + + Chaos Catcher 5 3 - 3 + 4 9 + Foul Appearance Loner - Chainsaw - Secret Weapon + Monstrous Mouth + Loner + Nurgle's Rot - 100000 - OrcKey + 210000 + ChaosChosenKey ChaosRenegadesKey + NurgleKey + - Varag Ghoul-Chewer *CRP+BB2016* - Blitzer + Morg'N'Torg + + CRP + Spike + + Superstar 6 - 4 + 6 3 - 9 + 10 Loner Block - Jump Up Mighty Blow Thick Skull + Throw Team-Mate - 290000 + 450000 + AmazonKey + ChaosChosenKey + ChaosDwarfKey + ChaosRenegadesKey + DarkElfKey + DwarfKey + ElfUnionKey + GoblinKey + HalflingKey + HighElfKey + HumanKey + LizardmenKey + NorseKey + NurgleKey + OgreKey OrcKey - - - Wilhelm Chaney *CRP* - Werewolf - 8 + SkavenKey + SlannKey + UnderworldDenizenKey + VampireKey + WoodElfKey + KhornesDaemonsKey + BretonianKey + + + + Gobbler Grimlich + + Spike + + Catcher + 5 4 - 3 - 8 + 2 + 9 Loner - Catch - Claws - Frenzy - Wrestle + Big Hand + Leap + Tentacles + Monstrous Mouth + Disturbing Presence Regeneration + Very Long Legs - 240000 - NecromanticHorrorKey - NorseKey - VampireKey + 230000 + ChaosChosenKey + ChaosRenegadesKey + UnderworldDenizenKey + - Willow Rosebark *CRP+BB2016* - Dryad + Scyla Anfingrimm + + Spike + + Blocker 5 - 4 - 3 - 8 + 5 + 1 + 9 Loner - Dauntless - Side Step + Frenzy + Claws + Prehensile Tail Thick Skull + Wild Animal - 150000 - AmazonKey - HalflingKey - WoodElfKey - BretonianKey + 250000 + ChaosChosenKey + KhornesDaemonsKey + NorseKey + - Zara The Slayer *CRP* - Assassin + Withergrasp Doubledrool + + Spike + + Lineman 6 - 4 + 3 3 8 Loner - Jump Up - Block - Dodge - Dauntless - Stab - Stakes + Tackle + Wrestle + Prehensile Tail + Two Heads + Tentacles - 270000 - AmazonKey - HumanKey - DwarfKey - NorseKey - HalflingKey - HighElfKey - WoodElfKey - BretonianKey + 170000 + ChaosChosenKey + NurgleKey + KhornesDaemonsKey + ChaosRenegadesKey + - Mighty Zug *CRP+BB2016* - Blocker + Bilerot Vomitflesh + + Spike + + Nurgle 4 5 2 9 Loner - Block - Mighty Blow + Dirty Player + Disturbing Presence + Foul Appearance - 260000 - HumanKey - BretonianKey + 180000 + ChaosChosenKey + NurgleKey + - Zzharg Madeye *CRP* - Chaos Dwarf - 4 + Max Spleenripper + + CRP + Spike + + Chaos Warrior + 5 4 3 - 9 + 8 Loner + Chainsaw Secret Weapon - Strong Arm + + 130000 + ChaosChosenKey + NurgleKey + KhornesDaemonsKey + + + + Lord Borak The Despoiler + + CRP + Spike + + Chaos Lord + 5 + 5 + 3 + 9 + + Loner + Block + Mighty Blow + Dirty Player + + 300000 + ChaosChosenKey + NurgleKey + KhornesDaemonsKey + + + + Grashnak Blackhoof *CRP* + + CRP + Spike + + Minotaur + 6 + 6 + 2 + 8 + + Loner + Horns + Mighty Blow Thick Skull - Sure Hands - Hail Mary Pass - Pass - Tackle + Frenzy - 60000 - ChaosRenegadesKey + 310000 + ChaosChosenKey ChaosDwarfKey + NurgleKey KhornesDaemonsKey - + + + Lewdgrip Whiparm + + CRP + Spike + + Thrower + 6 + 3 + 3 + 9 + + Loner + Dodge + Pass + Strong Arm + Sure Hands + Tentacles + + 160000 + ChaosChosenKey + ChaosRenegadesKey + NurgleKey + + + + + + + - Grak *BB2016* + Bertha Bigfist *CRP* Ogre - 5 + 6 5 2 9 Loner + Bone Head + Dodge Mighty Blow Thick Skull - Kick Team-Mate - Bone Head + Throw Team-Mate - 300000 - AmazonKey - BretonianKey - ChaosChosenKey - ChaosRenegadesKey - ChaosDwarfKey - DarkElfKey - DwarfKey - ElfUnionKey - GoblinKey + 260000 + AmazonKey HalflingKey - HighElfKey - HumanKey - KhemriTombKingsKey - KhornesDaemonsKey - LizardmenKey - NecromanticHorrorKey - NorseKey - NurgleKey OgreKey - OrcKey - SkavenKey - SlannKey - ShamblingUndeadKey - UnderworldDenizenKey - VampireKey - WoodElfKey + - Crumbleberyy *BB2016* - Halfling catcher - 5 + Barik Farblast *CRP/BB2016* + Runner + 6 + 3 + 3 + 8 + + Loner + Hail Mary Pass + Pass + Secret Weapon + Strong Arm + Sure Hands + Thick Skull + + 60000 + DwarfKey + + + + Boomer Dribblesnot *CRP* + Bombardier + 6 2 3 - 6 + 7 Loner + Accurate + Bombardier Dodge Stunty Right Stuff - Sure Hands + Secret Weapon - 0 - AmazonKey - BretonianKey - ChaosChosenKey + 60000 + GoblinKey + OrcKey + OgreKey ChaosRenegadesKey - ChaosDwarfKey - DarkElfKey - DwarfKey + UnderworldDenizenKey + + + + Headsplitter *CRP* + Rat Ogre + 6 + 6 + 3 + 8 + + Loner + Frenzy + Prehensile Tail + Mighty Blow + + 340000 + SkavenKey + + + + + + Dolfar Longstride *CRP* + Thrower + 7 + 3 + 4 + 7 + + Loner + Diving Catch + Hail Mary Pass + Kick-off Return + Pass Block + Kick + + 170000 ElfUnionKey - GoblinKey - HalflingKey HighElfKey - HumanKey + WoodElfKey + BretonianKey + + + + + + Fezglish *CRP* + Fanatic + 4 + 7 + 3 + 7 + + Loner + Ball And Chain + Disturbing Presence + Foul Appearance + No Hand + Secret Weapon + + 80000 + SkavenKey + UnderworldDenizenKey + + + + Fungus The Loon *CRP* + Fanatic + 4 + 7 + 3 + 7 + + Loner + Ball And Chain + No Hand + Secret Weapon + Mighty Blow + Stunty + + 80000 + GoblinKey + + + + Glart Smarship Jr *CRP* + Blitzer + 7 + 4 + 3 + 8 + + Loner + Block + Claws + Juggernaut + + 200000 + SkavenKey + UnderworldDenizenKey + + + + + Hack Enslash *CRP* + Skeleton + 6 + 3 + 2 + 7 + + Loner + Chainsaw + Regeneration + Secret Weapon + Side Step + + 120000 KhemriTombKingsKey - KhornesDaemonsKey - LizardmenKey NecromanticHorrorKey - NorseKey - NurgleKey - OgreKey - OrcKey - SkavenKey - SlannKey ShamblingUndeadKey - UnderworldDenizenKey + + + + + + + + Hemlock *CRP* + Assassin + 8 + 2 + 3 + 7 + + Loner + Jump Up + Block + Dodge + Side Step + Stunty + Stab + + 170000 + LizardmenKey + SlannKey + + + + + + Hthark the Unstoppable *CRP* + Bull Centaur + 6 + 5 + 2 + 9 + + Loner + Block + Thick Skull + Sure Feet + Break Tackle + Sprint + Juggernaut + + 330000 + ChaosDwarfKey + + + + + + Icepelt Hammerblow *CRP* + Yetee + 5 + 6 + 1 + 8 + + Loner + Mighty Blow + Claws + Frenzy + Disturbing Presence + Regeneration + + 330000 + NorseKey + + + + Crazy Igor *CRP* + Thrall + 6 + 3 + 3 + 8 + + Loner + Dauntless + Regeneration + Thick Skull + + 130000 VampireKey - WoodElfKey + ChaosRenegadesKey + KhornesDaemonsKey + - Lucien Swift *BB2016* - Blitzer + Humerus Carpa *CRP* + Catcher 7 - 3 - 4 - 8 + 2 + 3 + 7 Loner - Block - Tackle - Mighty Blow + Catch + Dodge + Regeneration + Nerves of Steel - 390000 - ElfUnionKey - HighElfKey - WoodElfKey + 130000 + KhemriTombKingsKey + - Valen Swift *BB2016* - Thrower + Ithaca Benoin *CRP* + Runner 7 3 - 5 + 3 7 - Accurate Loner + Accurate + Dump-Off Nerves of Steel - Sure Hands Pass - Safe Throw + Regeneration + Sure Hands - 0 - ElfUnionKey - HighElfKey - WoodElfKey + 220000 + KhemriTombKingsKey + DarkElfKey - Madcap Miggz *BB2016* - Squig - 6 - 4 + J Earlice *CRP* + Ghoul + 8 + 3 + 3 + 7 + + Loner + Catch + Diving Catch + Dodge + Sprint + + 180000 + NecromanticHorrorKey + ShamblingUndeadKey + VampireKey + + + + + + + + + Boutaïdo *CRP* + Blitzer + 8 + 3 3 8 - Break Tackle - Claws - Leap Loner - No Hands + Catch + Diving Tackle + Jump Up + Pass Block + Shadowing + Leap Very Long Legs - Wild Animal - 170000 + 220000 + LizardmenKey + SlannKey + + + + + + Nobbla Blackwart *CRP* + Goblin + 6 + 2 + 3 + 7 + + Loner + Block + Dodge + Chainsaw + Secret Weapon + Stunty + + 130000 GoblinKey + OgreKey + ChaosDwarfKey UnderworldDenizenKey - - Kreek Rustgouger *BB2016* - Skaven Blocker + Brick Far'th *CRP* + Ogre 5 - 7 + 5 2 9 - Ball And Chain Loner + Bone Head Mighty Blow - No Hands - Prehensile Tail - Secret Weapon + Thick Skull + Strong Arm + Throw Team-Mate + Nerves of Steel - 130000 - SkavenKey - UnderworldDenizenKey + 290000 + NurgleKey + OgreKey - - - - Karla Von Kill *BB2016* - Human Blitzer + + Grotty *CRP* + Goblin 6 - 4 - 3 - 8 + 2 + 4 + 7 - Block - Dauntless - Dodge - Jump Up Loner + Dodge + Stunty + Right Stuff 0 - AmazonKey - BretonianKey - HalflingKey - HumanKey - NorseKey + NurgleKey + OgreKey + - Guffle Pusmaw *BB2016* - Chaos Catcher - 5 - 3 + Quetzal Leap *CRP* + Catcher + 8 + 2 4 - 9 + 7 - Foul Appearance - Loner - Monstrous Mouth Loner - Nurgle's Rot + Catch + Diving Catch + Fend + Kick-off Return + Leap + Nerves of Steel + Very Long Legs - 210000 - ChaosRenegadesKey - NurgleKey + 250000 + LizardmenKey + SlannKey - Bo Gallanté *BB2016* - High-elf catcher - 8 + Rashnak Backstab *CRP* + Assassin + 7 3 - 4 + 3 7 - Dodge Loner + Dodge Side Step - Sure Feet - Sprint + Stab + Sneaky Git - 160000 - HighElfKey + 200000 + ChaosDwarfKey + - Glart Smashrip *BB2016* - Skaven Blocker - 5 + Setekh *CRP* + Blitz-Ra + 6 4 2 8 Loner + Strip Ball Block - Claws + Break Tackle Juggernaut - Grab - Stand Firm + Regeneration - 190000 + 220000 + KhemriTombKingsKey + ShamblingUndeadKey + NecromanticHorrorKey + + + Skitter Stab-Stab *CRP* + Assassin + 9 + 2 + 4 + 7 + + Loner + Dodge + Stab + Prehensile Tail + Shadowing + + 160000 SkavenKey UnderworldDenizenKey - - - Rasta Tailspike *Bugman's* - Skaven - 8 - 3 - 3 - 7 + Silibili *CRP* + Saurus + 7 + 4 + 1 + 9 Loner - Extra Arms - Catch + Block + Guard + Grab + Stand Firm - 110000 - SkavenKey + 250000 + LizardmenKey + SlannKey - - Frank'N'Stein *Bugman's* - Golem - 4 - 5 - 1 - 9 + Sinnedbad *CRP* + Assassin + 6 + 3 + 2 + 7 Loner - Break Tackle - Mighty Blow + Block + Jump Up + Pass Block Regeneration - Stand Firm - Thick Skull + Secret Weapon + Side Step + Stab - 210000 - HumanKey - NecromanticHorrorKey + 80000 ShamblingUndeadKey + KhemriTombKingsKey - - Bilerot Vomitflesh *Bugman's* - Nurgle - 4 - 5 - 2 - 9 + Soaren Hightower *CRP* + Thrower + 6 + 3 + 4 + 8 Loner - Dirty Player - Disturbing Presence - Foul Appearance + Fend + Kick-off Return + Pass + Safe Throw + Sure Hands + Strong Arm 180000 - ChaosChosenKey - NurgleKey + HighElfKey - + - Gobbler Grimlich *BB2018* - Catcher + Ugroth Bolgrot *CRP* + Lineman 5 - 4 - 2 + 3 + 3 9 Loner - Big Hand - Leap - Tentacles - Monstrous Mouth - Disturbing Presence - Regeneration - Very Long Legs + Chainsaw + Secret Weapon - 230000 - ChaosChosenKey + 100000 + OrcKey ChaosRenegadesKey - UnderworldDenizenKey - Scyla Anfingrimm *BB2018* - Blocker - 5 - 5 - 1 - 9 + Wilhelm Chaney *CRP* + Werewolf + 8 + 4 + 3 + 8 Loner - Frenzy + Catch Claws - Prehensile Tail - Thick Skull - Wild Animal + Frenzy + Wrestle + Regeneration - 250000 - ChaosChosenKey - KhornesDaemonsKey + 240000 + NecromanticHorrorKey NorseKey + VampireKey - Withergrasp Doubledrool *BB2018* - Lineman + Zara The Slayer *CRP* + Assassin 6 - 3 + 4 3 8 Loner - Tackle - Wrestle - Prehensile Tail - Two Heads - Tentacles + Jump Up + Block + Dodge + Dauntless + Stab + Stakes - 170000 - ChaosChosenKey - NurgleKey - ChaosRenegadesKey + 270000 + AmazonKey + HumanKey + DwarfKey + NorseKey + HalflingKey + HighElfKey + WoodElfKey + BretonianKey - - Grombrindal, The White Dwarf *Special Event* - Dwarf Blocker - 5 - 3 + Zzharg Madeye *CRP* + Chaos Dwarf + 4 + 4 3 9 Loner - Block - Dauntless + Secret Weapon + Strong Arm + Thick Skull + Sure Hands + Hail Mary Pass + Pass + Tackle + + 60000 + ChaosRenegadesKey + ChaosDwarfKey + KhornesDaemonsKey + + + + Grak *BB2016* + Ogre + 5 + 5 + 2 + 9 + + Loner Mighty Blow - Stand Firm Thick Skull + Kick Team-Mate + Bone Head - 0 + 300000 + AmazonKey + BretonianKey + ChaosChosenKey + ChaosRenegadesKey + ChaosDwarfKey + DarkElfKey DwarfKey + ElfUnionKey + GoblinKey HalflingKey + HighElfKey HumanKey + KhemriTombKingsKey + KhornesDaemonsKey + LizardmenKey + NecromanticHorrorKey NorseKey + NurgleKey + OgreKey + OrcKey + SkavenKey + SlannKey + ShamblingUndeadKey + UnderworldDenizenKey + VampireKey + WoodElfKey - - The Black Gobbo *Special Event* - Bombardier - 6 + Crumbleberry *BB2016* + Halfling catcher + 5 2 3 - 8 + 6 Loner Dodge - Disturbing Presence - Bombardier - Sneaky Git - Stab - Side Step Stunty + Right Stuff + Sure Hands 0 + AmazonKey + BretonianKey + ChaosChosenKey ChaosRenegadesKey + ChaosDwarfKey + DarkElfKey + DwarfKey + ElfUnionKey GoblinKey + HalflingKey + HighElfKey + HumanKey + KhemriTombKingsKey + KhornesDaemonsKey + LizardmenKey + NecromanticHorrorKey + NorseKey + NurgleKey + OgreKey OrcKey + SkavenKey + SlannKey + ShamblingUndeadKey UnderworldDenizenKey + VampireKey + WoodElfKey + + + + + Rasta Tailspike *Bugman's* + Skaven + 8 + 3 + 3 + 7 + + Loner + Extra Arms + Catch + + 110000 + SkavenKey + + diff --git a/src/teamma/rules/naf2017/undeads.xml b/src/teamma/rules/BB2016/undeads.xml similarity index 88% rename from src/teamma/rules/naf2017/undeads.xml rename to src/teamma/rules/BB2016/undeads.xml index 3c016902..798c4459 100644 --- a/src/teamma/rules/naf2017/undeads.xml +++ b/src/teamma/rules/BB2016/undeads.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 true 100000 + true + true + true + false + false + false + false + false + false + false + false + true false false false diff --git a/src/teamma/rules/naf2017/underworld.xml b/src/teamma/rules/BB2016/underworld.xml similarity index 89% rename from src/teamma/rules/naf2017/underworld.xml rename to src/teamma/rules/BB2016/underworld.xml index 95bf2476..313be391 100644 --- a/src/teamma/rules/naf2017/underworld.xml +++ b/src/teamma/rules/BB2016/underworld.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 false 50000 + true + true + true + false + false + false + false + false + false + false + false + false false false true diff --git a/src/teamma/rules/naf2017/vampires.xml b/src/teamma/rules/BB2016/vampires.xml similarity index 80% rename from src/teamma/rules/naf2017/vampires.xml rename to src/teamma/rules/BB2016/vampires.xml index 6e78537f..a86da050 100644 --- a/src/teamma/rules/naf2017/vampires.xml +++ b/src/teamma/rules/BB2016/vampires.xml @@ -14,6 +14,18 @@ and open the template in the editor. 300000 true 100000 + true + true + true + false + false + false + false + false + false + false + false + true false false false diff --git a/src/teamma/rules/naf2017/woodelves.xml b/src/teamma/rules/BB2016/woodelves.xml similarity index 87% rename from src/teamma/rules/naf2017/woodelves.xml rename to src/teamma/rules/BB2016/woodelves.xml index ce58284b..184ff8c4 100644 --- a/src/teamma/rules/naf2017/woodelves.xml +++ b/src/teamma/rules/BB2016/woodelves.xml @@ -14,16 +14,28 @@ and open the template in the editor. 300000 false 100000 - false + true + true + true + false + false + false + false + false + false + false false false false true false + false + false + false 2 - Wardanser + Wardancer 8 3 4 diff --git a/src/teamma/rules/lrb1/amazons.xml b/src/teamma/rules/lrb1/amazons.xml index d566fc88..1fedb02f 100644 --- a/src/teamma/rules/lrb1/amazons.xml +++ b/src/teamma/rules/lrb1/amazons.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + AmazonKey 40000 true diff --git a/src/teamma/rules/lrb1/chaos.xml b/src/teamma/rules/lrb1/chaos.xml index 1b21c243..70be8f1b 100644 --- a/src/teamma/rules/lrb1/chaos.xml +++ b/src/teamma/rules/lrb1/chaos.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosKey 70000 true diff --git a/src/teamma/rules/lrb1/chaosdwarves.xml b/src/teamma/rules/lrb1/chaosdwarves.xml index 8811b885..dfe4acf1 100644 --- a/src/teamma/rules/lrb1/chaosdwarves.xml +++ b/src/teamma/rules/lrb1/chaosdwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosDwarfKey 50000 true diff --git a/src/teamma/rules/lrb1/darkelves.xml b/src/teamma/rules/lrb1/darkelves.xml index c3e6f17c..ef2f301a 100644 --- a/src/teamma/rules/lrb1/darkelves.xml +++ b/src/teamma/rules/lrb1/darkelves.xml @@ -1,112 +1,112 @@ - - - - - - - DarkElfKey - 50000 - true - 300000 - false - 100000 - 1 - - - 4 - Blitzer - 7 - 3 - 4 - 8 - - Block - - 100000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Pass Skill - Strength Skill - - - - 2 - Witch Elf - 7 - 3 - 4 - 7 - - Dodge - Frenzy - Jump Up - - 110000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 2 - Thrower - 6 - 3 - 4 - 7 - - Pass - - 980000 - - General Skill - Agility Skill - Pass Skill - - - Strength Skill - Pass Trait - General Trait - Agility Trait - - - - 12 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Pass Skill - Strength Skill - - - - - - + + + + + + + DarkElfKey + 50000 + true + 300000 + false + 100000 + 1 + + + 4 + Blitzer + 7 + 3 + 4 + 8 + + Block + + 100000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Pass Skill + Strength Skill + + + + 2 + Witch Elf + 7 + 3 + 4 + 7 + + Dodge + Frenzy + Jump Up + + 110000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 2 + Thrower + 6 + 3 + 4 + 7 + + Pass + + 980000 + + General Skill + Agility Skill + Pass Skill + + + Strength Skill + Pass Trait + General Trait + Agility Trait + + + + 12 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Pass Skill + Strength Skill + + + + + + diff --git a/src/teamma/rules/lrb1/dwarves.xml b/src/teamma/rules/lrb1/dwarves.xml index 98903625..8e32ad43 100644 --- a/src/teamma/rules/lrb1/dwarves.xml +++ b/src/teamma/rules/lrb1/dwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + DwarfKey 40000 true diff --git a/src/teamma/rules/lrb1/goblins.xml b/src/teamma/rules/lrb1/goblins.xml index b3f0124a..a4bab162 100644 --- a/src/teamma/rules/lrb1/goblins.xml +++ b/src/teamma/rules/lrb1/goblins.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + GoblinKey 60000 true diff --git a/src/teamma/rules/lrb1/halflings.xml b/src/teamma/rules/lrb1/halflings.xml index da01f8b2..61de2e08 100644 --- a/src/teamma/rules/lrb1/halflings.xml +++ b/src/teamma/rules/lrb1/halflings.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HalflingKey 60000 true diff --git a/src/teamma/rules/lrb1/highelves.xml b/src/teamma/rules/lrb1/highelves.xml index bd96bdbc..1e1397b5 100644 --- a/src/teamma/rules/lrb1/highelves.xml +++ b/src/teamma/rules/lrb1/highelves.xml @@ -1,110 +1,110 @@ - - - - - - - HighElfKey - 50000 - true - 300000 - false - 100000 - 1 - - - 2 - Dragon Warrior - 7 - 3 - 4 - 8 - - Block - - 100000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 2 - Phoenix Warrior - 6 - 3 - 4 - 8 - - Pass - - 90000 - - General Skill - Agility Skill - Pass Skill - - - General Trait - Agility Trait - Strength Skill - Pass Trait - - - - 4 - Lion Warrior - 8 - 3 - 4 - 7 - - Catch - - 90000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 16 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - - - + + + + + + + HighElfKey + 50000 + true + 300000 + false + 100000 + 1 + + + 2 + Dragon Warrior + 7 + 3 + 4 + 8 + + Block + + 100000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 2 + Phoenix Warrior + 6 + 3 + 4 + 8 + + Pass + + 90000 + + General Skill + Agility Skill + Pass Skill + + + General Trait + Agility Trait + Strength Skill + Pass Trait + + + + 4 + Lion Warrior + 8 + 3 + 4 + 7 + + Catch + + 90000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 16 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + + + diff --git a/src/teamma/rules/lrb1/humans.xml b/src/teamma/rules/lrb1/humans.xml index 3a976a50..71ddd64c 100644 --- a/src/teamma/rules/lrb1/humans.xml +++ b/src/teamma/rules/lrb1/humans.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HumanKey 50000 true diff --git a/src/teamma/rules/lrb1/lizardmen.xml b/src/teamma/rules/lrb1/lizardmen.xml index f992a3cd..c2beac63 100644 --- a/src/teamma/rules/lrb1/lizardmen.xml +++ b/src/teamma/rules/lrb1/lizardmen.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + LizardmenKey 60000 true diff --git a/src/teamma/rules/lrb1/norses.xml b/src/teamma/rules/lrb1/norses.xml index 395a95c5..f3414a53 100644 --- a/src/teamma/rules/lrb1/norses.xml +++ b/src/teamma/rules/lrb1/norses.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + NorseKey 60000 true diff --git a/src/teamma/rules/lrb1/orcs.xml b/src/teamma/rules/lrb1/orcs.xml index 9ac2785e..eafc873c 100644 --- a/src/teamma/rules/lrb1/orcs.xml +++ b/src/teamma/rules/lrb1/orcs.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + OrcKey 60000 true diff --git a/src/teamma/rules/lrb1/skavens.xml b/src/teamma/rules/lrb1/skavens.xml index 9b34cbf2..66c100a1 100644 --- a/src/teamma/rules/lrb1/skavens.xml +++ b/src/teamma/rules/lrb1/skavens.xml @@ -1,139 +1,139 @@ - - - - - - - SkavenKey - 60000 - true - 300000 - false - 100000 - 1 - - - 2 - Stormvemins - 7 - 3 - 3 - 8 - - Block - - 90000 - - General Skill - Strength Skill - - - General Trait - Strength Trait - Agility Skill - Pass Skill - Physical Trait - - - - 2 - Thrower - 7 - 3 - 3 - 7 - - Sure Hands - Pass - - 70000 - - General Skill - Pass Skill - - - General Trait - Pass Trait - Agility Skill - Strength Skill - Physical Trait - - - - 4 - Gutter Runner - 9 - 2 - 4 - 7 - - Dodge - - 80000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - Physical Trait - - - - 12 - Lineman - 7 - 3 - 3 - 7 - - - 50000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - Physical Trait - - - - 1 - Rat Ogre - 6 - 5 - 2 - 8 - - Big Guy - Wild Animal - Prehensile Tail - Frenzy - Mighty Blow - - 130000 - - Strength Skill - - - Strength Trait - General Skill - Pass Skill - Agility Skill - Physical Trait - - - - - - + + + + + + + SkavenKey + 60000 + true + 300000 + false + 100000 + 1 + + + 2 + Stormvemins + 7 + 3 + 3 + 8 + + Block + + 90000 + + General Skill + Strength Skill + + + General Trait + Strength Trait + Agility Skill + Pass Skill + Physical Trait + + + + 2 + Thrower + 7 + 3 + 3 + 7 + + Sure Hands + Pass + + 70000 + + General Skill + Pass Skill + + + General Trait + Pass Trait + Agility Skill + Strength Skill + Physical Trait + + + + 4 + Gutter Runner + 9 + 2 + 4 + 7 + + Dodge + + 80000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + Physical Trait + + + + 12 + Lineman + 7 + 3 + 3 + 7 + + + 50000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + Physical Trait + + + + 1 + Rat Ogre + 6 + 5 + 2 + 8 + + Big Guy + Wild Animal + Prehensile Tail + Frenzy + Mighty Blow + + 130000 + + Strength Skill + + + Strength Trait + General Skill + Pass Skill + Agility Skill + Physical Trait + + + + + + diff --git a/src/teamma/rules/lrb1/undeads.xml b/src/teamma/rules/lrb1/undeads.xml index d049559e..bcb1a188 100644 --- a/src/teamma/rules/lrb1/undeads.xml +++ b/src/teamma/rules/lrb1/undeads.xml @@ -1,131 +1,131 @@ - - - - - - - UndeadKey - 70000 - false - 300000 - true - 100000 - 1 - - - 2 - Mummy - 3 - 5 - 1 - 9 - - Mighty Blow - Regeneration - - 110000 - - Strength Skill - General Skill - - - Strength Trait - General Trait - Pass Skill - Agility Skill - - - - 2 - Wight - 6 - 3 - 3 - 8 - - Block - Regeneration - - 90000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - 4 - Ghoul - 7 - 3 - 3 - 7 - - Dodge - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 12 - Zombie - 4 - 3 - 2 - 8 - - Regeneration - - 30000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - 12 - Skeleton - 5 - 3 - 2 - 7 - - Regeneration - - 30000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + UndeadKey + 70000 + false + 300000 + true + 100000 + 1 + + + 2 + Mummy + 3 + 5 + 1 + 9 + + Mighty Blow + Regeneration + + 110000 + + Strength Skill + General Skill + + + Strength Trait + General Trait + Pass Skill + Agility Skill + + + + 2 + Wight + 6 + 3 + 3 + 8 + + Block + Regeneration + + 90000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + 4 + Ghoul + 7 + 3 + 3 + 7 + + Dodge + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 12 + Zombie + 4 + 3 + 2 + 8 + + Regeneration + + 30000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + 12 + Skeleton + 5 + 3 + 2 + 7 + + Regeneration + + 30000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb1/woodelves.xml b/src/teamma/rules/lrb1/woodelves.xml index 309d49f0..24501cdc 100644 --- a/src/teamma/rules/lrb1/woodelves.xml +++ b/src/teamma/rules/lrb1/woodelves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + WoodElfKey 50000 true diff --git a/src/teamma/rules/lrb2/amazons.xml b/src/teamma/rules/lrb2/amazons.xml index 1346f7f7..2bc84b29 100644 --- a/src/teamma/rules/lrb2/amazons.xml +++ b/src/teamma/rules/lrb2/amazons.xml @@ -1,112 +1,112 @@ - - - - - - - AmazonKey - 40000 - true - 300000 - false - 100000 - 1 - - - 4 - Amazon Blitzer - 6 - 3 - 3 - 7 - - Dodge - Block - - 90000 - - General Skill - Strength Skill - - - Agility Skill - Pass Skill - General Trait - Strength Trait - - - - 2 - Amazon Thrower - 6 - 3 - 3 - 7 - - Dodge - Pass - - 70000 - - General Skill - Pass Skill - - - Agility Skill - Strength Skill - General Trait - Pass Trait - - - - 2 - Amazon Catcher - 6 - 3 - 3 - 7 - - Dodge - Catch - - 70000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 12 - Amazon Linewoman - 6 - 3 - 3 - 7 - - Dodge - - 50000 - - General Skill - - - Strength Skill - Pass Skill - Agility Skill - General Trait - - - - - - + + + + + + + AmazonKey + 40000 + true + 300000 + false + 100000 + 1 + + + 4 + Amazon Blitzer + 6 + 3 + 3 + 7 + + Dodge + Block + + 90000 + + General Skill + Strength Skill + + + Agility Skill + Pass Skill + General Trait + Strength Trait + + + + 2 + Amazon Thrower + 6 + 3 + 3 + 7 + + Dodge + Pass + + 70000 + + General Skill + Pass Skill + + + Agility Skill + Strength Skill + General Trait + Pass Trait + + + + 2 + Amazon Catcher + 6 + 3 + 3 + 7 + + Dodge + Catch + + 70000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 12 + Amazon Linewoman + 6 + 3 + 3 + 7 + + Dodge + + 50000 + + General Skill + + + Strength Skill + Pass Skill + Agility Skill + General Trait + + + + + + diff --git a/src/teamma/rules/lrb2/chaos.xml b/src/teamma/rules/lrb2/chaos.xml index 1b21c243..d78191d9 100644 --- a/src/teamma/rules/lrb2/chaos.xml +++ b/src/teamma/rules/lrb2/chaos.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosKey 70000 true diff --git a/src/teamma/rules/lrb2/chaosdwarves.xml b/src/teamma/rules/lrb2/chaosdwarves.xml index 8811b885..dd413aeb 100644 --- a/src/teamma/rules/lrb2/chaosdwarves.xml +++ b/src/teamma/rules/lrb2/chaosdwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosDwarfKey 50000 true diff --git a/src/teamma/rules/lrb2/darkelves.xml b/src/teamma/rules/lrb2/darkelves.xml index c3e6f17c..f8bdf19c 100644 --- a/src/teamma/rules/lrb2/darkelves.xml +++ b/src/teamma/rules/lrb2/darkelves.xml @@ -1,112 +1,112 @@ - - - - - - - DarkElfKey - 50000 - true - 300000 - false - 100000 - 1 - - - 4 - Blitzer - 7 - 3 - 4 - 8 - - Block - - 100000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Pass Skill - Strength Skill - - - - 2 - Witch Elf - 7 - 3 - 4 - 7 - - Dodge - Frenzy - Jump Up - - 110000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 2 - Thrower - 6 - 3 - 4 - 7 - - Pass - - 980000 - - General Skill - Agility Skill - Pass Skill - - - Strength Skill - Pass Trait - General Trait - Agility Trait - - - - 12 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Pass Skill - Strength Skill - - - - - - + + + + + + + DarkElfKey + 50000 + true + 300000 + false + 100000 + 1 + + + 4 + Blitzer + 7 + 3 + 4 + 8 + + Block + + 100000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Pass Skill + Strength Skill + + + + 2 + Witch Elf + 7 + 3 + 4 + 7 + + Dodge + Frenzy + Jump Up + + 110000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 2 + Thrower + 6 + 3 + 4 + 7 + + Pass + + 980000 + + General Skill + Agility Skill + Pass Skill + + + Strength Skill + Pass Trait + General Trait + Agility Trait + + + + 12 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Pass Skill + Strength Skill + + + + + + diff --git a/src/teamma/rules/lrb2/dwarves.xml b/src/teamma/rules/lrb2/dwarves.xml index 64f85434..e443693e 100644 --- a/src/teamma/rules/lrb2/dwarves.xml +++ b/src/teamma/rules/lrb2/dwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + DwarfKey 40000 true diff --git a/src/teamma/rules/lrb2/goblins.xml b/src/teamma/rules/lrb2/goblins.xml index b3f0124a..f7d2d1d3 100644 --- a/src/teamma/rules/lrb2/goblins.xml +++ b/src/teamma/rules/lrb2/goblins.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + GoblinKey 60000 true diff --git a/src/teamma/rules/lrb2/halflings.xml b/src/teamma/rules/lrb2/halflings.xml index da01f8b2..ca0603b8 100644 --- a/src/teamma/rules/lrb2/halflings.xml +++ b/src/teamma/rules/lrb2/halflings.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HalflingKey 60000 true diff --git a/src/teamma/rules/lrb2/highelves.xml b/src/teamma/rules/lrb2/highelves.xml index bd96bdbc..559d4ec8 100644 --- a/src/teamma/rules/lrb2/highelves.xml +++ b/src/teamma/rules/lrb2/highelves.xml @@ -1,110 +1,110 @@ - - - - - - - HighElfKey - 50000 - true - 300000 - false - 100000 - 1 - - - 2 - Dragon Warrior - 7 - 3 - 4 - 8 - - Block - - 100000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 2 - Phoenix Warrior - 6 - 3 - 4 - 8 - - Pass - - 90000 - - General Skill - Agility Skill - Pass Skill - - - General Trait - Agility Trait - Strength Skill - Pass Trait - - - - 4 - Lion Warrior - 8 - 3 - 4 - 7 - - Catch - - 90000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 16 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - - - + + + + + + + HighElfKey + 50000 + true + 300000 + false + 100000 + 1 + + + 2 + Dragon Warrior + 7 + 3 + 4 + 8 + + Block + + 100000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 2 + Phoenix Warrior + 6 + 3 + 4 + 8 + + Pass + + 90000 + + General Skill + Agility Skill + Pass Skill + + + General Trait + Agility Trait + Strength Skill + Pass Trait + + + + 4 + Lion Warrior + 8 + 3 + 4 + 7 + + Catch + + 90000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 16 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + + + diff --git a/src/teamma/rules/lrb2/humans.xml b/src/teamma/rules/lrb2/humans.xml index 3a976a50..b9a7085f 100644 --- a/src/teamma/rules/lrb2/humans.xml +++ b/src/teamma/rules/lrb2/humans.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HumanKey 50000 true diff --git a/src/teamma/rules/lrb2/lizardmen.xml b/src/teamma/rules/lrb2/lizardmen.xml index c2d7e6c3..4f8be4c0 100644 --- a/src/teamma/rules/lrb2/lizardmen.xml +++ b/src/teamma/rules/lrb2/lizardmen.xml @@ -1,90 +1,90 @@ - - - - - - - LizardmenKey - 60000 - true - 300000 - false - 100000 - 1 - - - 6 - Saurus - 6 - 4 - 1 - 9 - - - 80000 - - General Skill - Strength Skill - - - General Trait - Strength Trait - Agility Skill - Pass Skill - - - - 16 - Skink - 8 - 2 - 3 - 7 - - Dodge - Stunty - - 60000 - - Agility Skill - - - Agility Trait - General Skill - Pass Skill - Strength Skill - - - - 1 - Kroxigor - 6 - 5 - 1 - 9 - - Mighty Blow - Bone Head - Thick Skull - Prehensile Tail - Big Guy - - 130000 - - Strength Skill - - - Strength Trait - General Skill - Agility Skill - Pass Skill - - - - - - + + + + + + + LizardmenKey + 60000 + true + 300000 + false + 100000 + 1 + + + 6 + Saurus + 6 + 4 + 1 + 9 + + + 80000 + + General Skill + Strength Skill + + + General Trait + Strength Trait + Agility Skill + Pass Skill + + + + 16 + Skink + 8 + 2 + 3 + 7 + + Dodge + Stunty + + 60000 + + Agility Skill + + + Agility Trait + General Skill + Pass Skill + Strength Skill + + + + 1 + Kroxigor + 6 + 5 + 1 + 9 + + Mighty Blow + Bone Head + Thick Skull + Prehensile Tail + Big Guy + + 130000 + + Strength Skill + + + Strength Trait + General Skill + Agility Skill + Pass Skill + + + + + + diff --git a/src/teamma/rules/lrb2/norses.xml b/src/teamma/rules/lrb2/norses.xml index 395a95c5..038385e8 100644 --- a/src/teamma/rules/lrb2/norses.xml +++ b/src/teamma/rules/lrb2/norses.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + NorseKey 60000 true diff --git a/src/teamma/rules/lrb2/orcs.xml b/src/teamma/rules/lrb2/orcs.xml index 9ac2785e..15aa12da 100644 --- a/src/teamma/rules/lrb2/orcs.xml +++ b/src/teamma/rules/lrb2/orcs.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + OrcKey 60000 true diff --git a/src/teamma/rules/lrb2/skavens.xml b/src/teamma/rules/lrb2/skavens.xml index 9b34cbf2..153c190e 100644 --- a/src/teamma/rules/lrb2/skavens.xml +++ b/src/teamma/rules/lrb2/skavens.xml @@ -1,139 +1,139 @@ - - - - - - - SkavenKey - 60000 - true - 300000 - false - 100000 - 1 - - - 2 - Stormvemins - 7 - 3 - 3 - 8 - - Block - - 90000 - - General Skill - Strength Skill - - - General Trait - Strength Trait - Agility Skill - Pass Skill - Physical Trait - - - - 2 - Thrower - 7 - 3 - 3 - 7 - - Sure Hands - Pass - - 70000 - - General Skill - Pass Skill - - - General Trait - Pass Trait - Agility Skill - Strength Skill - Physical Trait - - - - 4 - Gutter Runner - 9 - 2 - 4 - 7 - - Dodge - - 80000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - Physical Trait - - - - 12 - Lineman - 7 - 3 - 3 - 7 - - - 50000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - Physical Trait - - - - 1 - Rat Ogre - 6 - 5 - 2 - 8 - - Big Guy - Wild Animal - Prehensile Tail - Frenzy - Mighty Blow - - 130000 - - Strength Skill - - - Strength Trait - General Skill - Pass Skill - Agility Skill - Physical Trait - - - - - - + + + + + + + SkavenKey + 60000 + true + 300000 + false + 100000 + 1 + + + 2 + Stormvemins + 7 + 3 + 3 + 8 + + Block + + 90000 + + General Skill + Strength Skill + + + General Trait + Strength Trait + Agility Skill + Pass Skill + Physical Trait + + + + 2 + Thrower + 7 + 3 + 3 + 7 + + Sure Hands + Pass + + 70000 + + General Skill + Pass Skill + + + General Trait + Pass Trait + Agility Skill + Strength Skill + Physical Trait + + + + 4 + Gutter Runner + 9 + 2 + 4 + 7 + + Dodge + + 80000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + Physical Trait + + + + 12 + Lineman + 7 + 3 + 3 + 7 + + + 50000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + Physical Trait + + + + 1 + Rat Ogre + 6 + 5 + 2 + 8 + + Big Guy + Wild Animal + Prehensile Tail + Frenzy + Mighty Blow + + 130000 + + Strength Skill + + + Strength Trait + General Skill + Pass Skill + Agility Skill + Physical Trait + + + + + + diff --git a/src/teamma/rules/lrb2/undeads.xml b/src/teamma/rules/lrb2/undeads.xml index d049559e..bf277dba 100644 --- a/src/teamma/rules/lrb2/undeads.xml +++ b/src/teamma/rules/lrb2/undeads.xml @@ -1,131 +1,131 @@ - - - - - - - UndeadKey - 70000 - false - 300000 - true - 100000 - 1 - - - 2 - Mummy - 3 - 5 - 1 - 9 - - Mighty Blow - Regeneration - - 110000 - - Strength Skill - General Skill - - - Strength Trait - General Trait - Pass Skill - Agility Skill - - - - 2 - Wight - 6 - 3 - 3 - 8 - - Block - Regeneration - - 90000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - 4 - Ghoul - 7 - 3 - 3 - 7 - - Dodge - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 12 - Zombie - 4 - 3 - 2 - 8 - - Regeneration - - 30000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - 12 - Skeleton - 5 - 3 - 2 - 7 - - Regeneration - - 30000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + UndeadKey + 70000 + false + 300000 + true + 100000 + 1 + + + 2 + Mummy + 3 + 5 + 1 + 9 + + Mighty Blow + Regeneration + + 110000 + + Strength Skill + General Skill + + + Strength Trait + General Trait + Pass Skill + Agility Skill + + + + 2 + Wight + 6 + 3 + 3 + 8 + + Block + Regeneration + + 90000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + 4 + Ghoul + 7 + 3 + 3 + 7 + + Dodge + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 12 + Zombie + 4 + 3 + 2 + 8 + + Regeneration + + 30000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + 12 + Skeleton + 5 + 3 + 2 + 7 + + Regeneration + + 30000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb2/woodelves.xml b/src/teamma/rules/lrb2/woodelves.xml index 309d49f0..711e1dee 100644 --- a/src/teamma/rules/lrb2/woodelves.xml +++ b/src/teamma/rules/lrb2/woodelves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + WoodElfKey 50000 true diff --git a/src/teamma/rules/lrb3/amazons.xml b/src/teamma/rules/lrb3/amazons.xml index 1346f7f7..2bc84b29 100644 --- a/src/teamma/rules/lrb3/amazons.xml +++ b/src/teamma/rules/lrb3/amazons.xml @@ -1,112 +1,112 @@ - - - - - - - AmazonKey - 40000 - true - 300000 - false - 100000 - 1 - - - 4 - Amazon Blitzer - 6 - 3 - 3 - 7 - - Dodge - Block - - 90000 - - General Skill - Strength Skill - - - Agility Skill - Pass Skill - General Trait - Strength Trait - - - - 2 - Amazon Thrower - 6 - 3 - 3 - 7 - - Dodge - Pass - - 70000 - - General Skill - Pass Skill - - - Agility Skill - Strength Skill - General Trait - Pass Trait - - - - 2 - Amazon Catcher - 6 - 3 - 3 - 7 - - Dodge - Catch - - 70000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 12 - Amazon Linewoman - 6 - 3 - 3 - 7 - - Dodge - - 50000 - - General Skill - - - Strength Skill - Pass Skill - Agility Skill - General Trait - - - - - - + + + + + + + AmazonKey + 40000 + true + 300000 + false + 100000 + 1 + + + 4 + Amazon Blitzer + 6 + 3 + 3 + 7 + + Dodge + Block + + 90000 + + General Skill + Strength Skill + + + Agility Skill + Pass Skill + General Trait + Strength Trait + + + + 2 + Amazon Thrower + 6 + 3 + 3 + 7 + + Dodge + Pass + + 70000 + + General Skill + Pass Skill + + + Agility Skill + Strength Skill + General Trait + Pass Trait + + + + 2 + Amazon Catcher + 6 + 3 + 3 + 7 + + Dodge + Catch + + 70000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 12 + Amazon Linewoman + 6 + 3 + 3 + 7 + + Dodge + + 50000 + + General Skill + + + Strength Skill + Pass Skill + Agility Skill + General Trait + + + + + + diff --git a/src/teamma/rules/lrb3/chaos.xml b/src/teamma/rules/lrb3/chaos.xml index 1b21c243..d78191d9 100644 --- a/src/teamma/rules/lrb3/chaos.xml +++ b/src/teamma/rules/lrb3/chaos.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosKey 70000 true diff --git a/src/teamma/rules/lrb3/chaosdwarves.xml b/src/teamma/rules/lrb3/chaosdwarves.xml index 8811b885..dd413aeb 100644 --- a/src/teamma/rules/lrb3/chaosdwarves.xml +++ b/src/teamma/rules/lrb3/chaosdwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosDwarfKey 50000 true diff --git a/src/teamma/rules/lrb3/darkelves.xml b/src/teamma/rules/lrb3/darkelves.xml index c3e6f17c..f8bdf19c 100644 --- a/src/teamma/rules/lrb3/darkelves.xml +++ b/src/teamma/rules/lrb3/darkelves.xml @@ -1,112 +1,112 @@ - - - - - - - DarkElfKey - 50000 - true - 300000 - false - 100000 - 1 - - - 4 - Blitzer - 7 - 3 - 4 - 8 - - Block - - 100000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Pass Skill - Strength Skill - - - - 2 - Witch Elf - 7 - 3 - 4 - 7 - - Dodge - Frenzy - Jump Up - - 110000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 2 - Thrower - 6 - 3 - 4 - 7 - - Pass - - 980000 - - General Skill - Agility Skill - Pass Skill - - - Strength Skill - Pass Trait - General Trait - Agility Trait - - - - 12 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Pass Skill - Strength Skill - - - - - - + + + + + + + DarkElfKey + 50000 + true + 300000 + false + 100000 + 1 + + + 4 + Blitzer + 7 + 3 + 4 + 8 + + Block + + 100000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Pass Skill + Strength Skill + + + + 2 + Witch Elf + 7 + 3 + 4 + 7 + + Dodge + Frenzy + Jump Up + + 110000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 2 + Thrower + 6 + 3 + 4 + 7 + + Pass + + 980000 + + General Skill + Agility Skill + Pass Skill + + + Strength Skill + Pass Trait + General Trait + Agility Trait + + + + 12 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Pass Skill + Strength Skill + + + + + + diff --git a/src/teamma/rules/lrb3/dwarves.xml b/src/teamma/rules/lrb3/dwarves.xml index a3ecdba1..d4c1d4cf 100644 --- a/src/teamma/rules/lrb3/dwarves.xml +++ b/src/teamma/rules/lrb3/dwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + DwarfKey 40000 true diff --git a/src/teamma/rules/lrb3/elves.xml b/src/teamma/rules/lrb3/elves.xml index cb354f5b..645ab7ce 100644 --- a/src/teamma/rules/lrb3/elves.xml +++ b/src/teamma/rules/lrb3/elves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ElfKey 50000 true diff --git a/src/teamma/rules/lrb3/goblins.xml b/src/teamma/rules/lrb3/goblins.xml index 794f0c51..fc722c43 100644 --- a/src/teamma/rules/lrb3/goblins.xml +++ b/src/teamma/rules/lrb3/goblins.xml @@ -1,71 +1,71 @@ - - - - - - - GoblinKey - 60000 - true - 300000 - false - 50000 - 2 - - - 16 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - - 40000 - - Agility Skill - - - Agility Trait - General Skill - Strength Skill - Pass Skill - - - - 2 - Troll - 4 - 5 - 1 - 9 - - Big Guy - Really Stupid - Always Hungry - Mighty Blow - Regeneration - Throw Team-Mate - - 100000 - - Strength Skill - - - Strength Trait - General Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + GoblinKey + 60000 + true + 300000 + false + 50000 + 2 + + + 16 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + + 40000 + + Agility Skill + + + Agility Trait + General Skill + Strength Skill + Pass Skill + + + + 2 + Troll + 4 + 5 + 1 + 9 + + Big Guy + Really Stupid + Always Hungry + Mighty Blow + Regeneration + Throw Team-Mate + + 100000 + + Strength Skill + + + Strength Trait + General Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb3/halflings.xml b/src/teamma/rules/lrb3/halflings.xml index 07f67f7e..f4f50146 100644 --- a/src/teamma/rules/lrb3/halflings.xml +++ b/src/teamma/rules/lrb3/halflings.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HalflingKey 60000 true diff --git a/src/teamma/rules/lrb3/highelves.xml b/src/teamma/rules/lrb3/highelves.xml index bd96bdbc..559d4ec8 100644 --- a/src/teamma/rules/lrb3/highelves.xml +++ b/src/teamma/rules/lrb3/highelves.xml @@ -1,110 +1,110 @@ - - - - - - - HighElfKey - 50000 - true - 300000 - false - 100000 - 1 - - - 2 - Dragon Warrior - 7 - 3 - 4 - 8 - - Block - - 100000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 2 - Phoenix Warrior - 6 - 3 - 4 - 8 - - Pass - - 90000 - - General Skill - Agility Skill - Pass Skill - - - General Trait - Agility Trait - Strength Skill - Pass Trait - - - - 4 - Lion Warrior - 8 - 3 - 4 - 7 - - Catch - - 90000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 16 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - - - + + + + + + + HighElfKey + 50000 + true + 300000 + false + 100000 + 1 + + + 2 + Dragon Warrior + 7 + 3 + 4 + 8 + + Block + + 100000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 2 + Phoenix Warrior + 6 + 3 + 4 + 8 + + Pass + + 90000 + + General Skill + Agility Skill + Pass Skill + + + General Trait + Agility Trait + Strength Skill + Pass Trait + + + + 4 + Lion Warrior + 8 + 3 + 4 + 7 + + Catch + + 90000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 16 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + + + diff --git a/src/teamma/rules/lrb3/humans.xml b/src/teamma/rules/lrb3/humans.xml index 3a976a50..b9a7085f 100644 --- a/src/teamma/rules/lrb3/humans.xml +++ b/src/teamma/rules/lrb3/humans.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HumanKey 50000 true diff --git a/src/teamma/rules/lrb3/khemris.xml b/src/teamma/rules/lrb3/khemris.xml index e344c41d..9e699097 100644 --- a/src/teamma/rules/lrb3/khemris.xml +++ b/src/teamma/rules/lrb3/khemris.xml @@ -1,114 +1,114 @@ - - - - - - - KhemriKey - 70000 - false - 300000 - false - 100000 - 1 - - - 4 - Mummy - 3 - 5 - 1 - 9 - - Regeneration - Mighty Blow - - 110000 - - General Skill - Strength Skill - - - General Trait - Pass Skill - Agility Skill - Strength Trait - - - - 2 - Thro-Ra - 6 - 3 - 2 - 7 - - Sure Hands - Pass - Regeneration - - 70000 - - General Skill - Pass Skill - - - General Trait - Strength Skill - Agility Skill - Pass Trait - - - - 2 - Blitz-Ra - 6 - 3 - 2 - 8 - - Block - Regeneration - - 90000 - - General Skill - Strength Skill - - - General Trait - Pass Skill - Agility Skill - Strength Trait - - - - 16 - Skeleton - 5 - 3 - 2 - 7 - - Regeneration - Thick Skull - - 40000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + KhemriKey + 70000 + false + 300000 + false + 100000 + 1 + + + 4 + Mummy + 3 + 5 + 1 + 9 + + Regeneration + Mighty Blow + + 110000 + + General Skill + Strength Skill + + + General Trait + Pass Skill + Agility Skill + Strength Trait + + + + 2 + Thro-Ra + 6 + 3 + 2 + 7 + + Sure Hands + Pass + Regeneration + + 70000 + + General Skill + Pass Skill + + + General Trait + Strength Skill + Agility Skill + Pass Trait + + + + 2 + Blitz-Ra + 6 + 3 + 2 + 8 + + Block + Regeneration + + 90000 + + General Skill + Strength Skill + + + General Trait + Pass Skill + Agility Skill + Strength Trait + + + + 16 + Skeleton + 5 + 3 + 2 + 7 + + Regeneration + Thick Skull + + 40000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb3/lizardmen.xml b/src/teamma/rules/lrb3/lizardmen.xml index c2d7e6c3..4f8be4c0 100644 --- a/src/teamma/rules/lrb3/lizardmen.xml +++ b/src/teamma/rules/lrb3/lizardmen.xml @@ -1,90 +1,90 @@ - - - - - - - LizardmenKey - 60000 - true - 300000 - false - 100000 - 1 - - - 6 - Saurus - 6 - 4 - 1 - 9 - - - 80000 - - General Skill - Strength Skill - - - General Trait - Strength Trait - Agility Skill - Pass Skill - - - - 16 - Skink - 8 - 2 - 3 - 7 - - Dodge - Stunty - - 60000 - - Agility Skill - - - Agility Trait - General Skill - Pass Skill - Strength Skill - - - - 1 - Kroxigor - 6 - 5 - 1 - 9 - - Mighty Blow - Bone Head - Thick Skull - Prehensile Tail - Big Guy - - 130000 - - Strength Skill - - - Strength Trait - General Skill - Agility Skill - Pass Skill - - - - - - + + + + + + + LizardmenKey + 60000 + true + 300000 + false + 100000 + 1 + + + 6 + Saurus + 6 + 4 + 1 + 9 + + + 80000 + + General Skill + Strength Skill + + + General Trait + Strength Trait + Agility Skill + Pass Skill + + + + 16 + Skink + 8 + 2 + 3 + 7 + + Dodge + Stunty + + 60000 + + Agility Skill + + + Agility Trait + General Skill + Pass Skill + Strength Skill + + + + 1 + Kroxigor + 6 + 5 + 1 + 9 + + Mighty Blow + Bone Head + Thick Skull + Prehensile Tail + Big Guy + + 130000 + + Strength Skill + + + Strength Trait + General Skill + Agility Skill + Pass Skill + + + + + + diff --git a/src/teamma/rules/lrb3/necromantics.xml b/src/teamma/rules/lrb3/necromantics.xml index 59548d16..b633a976 100644 --- a/src/teamma/rules/lrb3/necromantics.xml +++ b/src/teamma/rules/lrb3/necromantics.xml @@ -1,134 +1,134 @@ - - - - - - - NecromanticKey - 70000 - false - 300000 - true - 100000 - 1 - - - 2 - Werewolf - 8 - 3 - 3 - 8 - - Frenzy - Catch - Claw - - 120000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 2 - Ghoul - 7 - 3 - 3 - 7 - - Dodge - - 70000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 2 - Wight - 6 - 3 - 3 - 8 - - Block - Regeneration - - 90000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - 2 - Flesh Golem - 4 - 4 - 2 - 9 - - Stand Firm - Regeneration - - 110000 - - General Skill - Strength Skill - - - General Trait - Strength Trait - Pass Skill - Agility Skill - - - - 12 - Zombie - 4 - 3 - 2 - 8 - - Regeneration - - 30000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + NecromanticKey + 70000 + false + 300000 + true + 100000 + 1 + + + 2 + Werewolf + 8 + 3 + 3 + 8 + + Frenzy + Catch + Claw + + 120000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 2 + Ghoul + 7 + 3 + 3 + 7 + + Dodge + + 70000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 2 + Wight + 6 + 3 + 3 + 8 + + Block + Regeneration + + 90000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + 2 + Flesh Golem + 4 + 4 + 2 + 9 + + Stand Firm + Regeneration + + 110000 + + General Skill + Strength Skill + + + General Trait + Strength Trait + Pass Skill + Agility Skill + + + + 12 + Zombie + 4 + 3 + 2 + 8 + + Regeneration + + 30000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb3/norses.xml b/src/teamma/rules/lrb3/norses.xml index 395a95c5..038385e8 100644 --- a/src/teamma/rules/lrb3/norses.xml +++ b/src/teamma/rules/lrb3/norses.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + NorseKey 60000 true diff --git a/src/teamma/rules/lrb3/nurgle.xml b/src/teamma/rules/lrb3/nurgle.xml index 4306ee40..76d1ee9a 100644 --- a/src/teamma/rules/lrb3/nurgle.xml +++ b/src/teamma/rules/lrb3/nurgle.xml @@ -1,100 +1,100 @@ - - - - - - - NurgleKey - 70000 - false - 300000 - true - 100000 - 1 - - - 4 - Rotter - 4 - 4 - 2 - 9 - - Foul Appearance - Regeneration - - 110000 - - Strength Skill - General Skill - - - Strength Trait - General Trait - Physical Trait - General Skill - Pass Skill - Agility Skill - - - - 16 - Nurgle's Beastman - 6 - 3 - 3 - 8 - - Horns - - 60000 - - Strength Skill - General Skill - - - Strength Trait - General Trait - Physical Trait - General Skill - Pass Skill - Agility Skill - - - - 1 - Beast Of Nurgle - 4 - 5 - 1 - 9 - - Foul Appearance - Nurgle's Rot - Regeneration - Big Guy - Really Stupid - Tentacles - Mighty Blow - - 120000 - - Strength Skill - - - Strength Trait - General Skill - Physical Trait - General Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + NurgleKey + 70000 + false + 300000 + true + 100000 + 1 + + + 4 + Rotter + 4 + 4 + 2 + 9 + + Foul Appearance + Regeneration + + 110000 + + Strength Skill + General Skill + + + Strength Trait + General Trait + Physical Trait + General Skill + Pass Skill + Agility Skill + + + + 16 + Nurgle's Beastman + 6 + 3 + 3 + 8 + + Horns + + 60000 + + Strength Skill + General Skill + + + Strength Trait + General Trait + Physical Trait + General Skill + Pass Skill + Agility Skill + + + + 1 + Beast Of Nurgle + 4 + 5 + 1 + 9 + + Foul Appearance + Nurgle's Rot + Regeneration + Big Guy + Really Stupid + Tentacles + Mighty Blow + + 120000 + + Strength Skill + + + Strength Trait + General Skill + Physical Trait + General Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb3/orcs.xml b/src/teamma/rules/lrb3/orcs.xml index 4b1ed2ee..3c90f48b 100644 --- a/src/teamma/rules/lrb3/orcs.xml +++ b/src/teamma/rules/lrb3/orcs.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + OrcKey 60000 true diff --git a/src/teamma/rules/lrb3/skavens.xml b/src/teamma/rules/lrb3/skavens.xml index 9b34cbf2..153c190e 100644 --- a/src/teamma/rules/lrb3/skavens.xml +++ b/src/teamma/rules/lrb3/skavens.xml @@ -1,139 +1,139 @@ - - - - - - - SkavenKey - 60000 - true - 300000 - false - 100000 - 1 - - - 2 - Stormvemins - 7 - 3 - 3 - 8 - - Block - - 90000 - - General Skill - Strength Skill - - - General Trait - Strength Trait - Agility Skill - Pass Skill - Physical Trait - - - - 2 - Thrower - 7 - 3 - 3 - 7 - - Sure Hands - Pass - - 70000 - - General Skill - Pass Skill - - - General Trait - Pass Trait - Agility Skill - Strength Skill - Physical Trait - - - - 4 - Gutter Runner - 9 - 2 - 4 - 7 - - Dodge - - 80000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - Physical Trait - - - - 12 - Lineman - 7 - 3 - 3 - 7 - - - 50000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - Physical Trait - - - - 1 - Rat Ogre - 6 - 5 - 2 - 8 - - Big Guy - Wild Animal - Prehensile Tail - Frenzy - Mighty Blow - - 130000 - - Strength Skill - - - Strength Trait - General Skill - Pass Skill - Agility Skill - Physical Trait - - - - - - + + + + + + + SkavenKey + 60000 + true + 300000 + false + 100000 + 1 + + + 2 + Stormvemins + 7 + 3 + 3 + 8 + + Block + + 90000 + + General Skill + Strength Skill + + + General Trait + Strength Trait + Agility Skill + Pass Skill + Physical Trait + + + + 2 + Thrower + 7 + 3 + 3 + 7 + + Sure Hands + Pass + + 70000 + + General Skill + Pass Skill + + + General Trait + Pass Trait + Agility Skill + Strength Skill + Physical Trait + + + + 4 + Gutter Runner + 9 + 2 + 4 + 7 + + Dodge + + 80000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + Physical Trait + + + + 12 + Lineman + 7 + 3 + 3 + 7 + + + 50000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + Physical Trait + + + + 1 + Rat Ogre + 6 + 5 + 2 + 8 + + Big Guy + Wild Animal + Prehensile Tail + Frenzy + Mighty Blow + + 130000 + + Strength Skill + + + Strength Trait + General Skill + Pass Skill + Agility Skill + Physical Trait + + + + + + diff --git a/src/teamma/rules/lrb3/undeads.xml b/src/teamma/rules/lrb3/undeads.xml index d049559e..bf277dba 100644 --- a/src/teamma/rules/lrb3/undeads.xml +++ b/src/teamma/rules/lrb3/undeads.xml @@ -1,131 +1,131 @@ - - - - - - - UndeadKey - 70000 - false - 300000 - true - 100000 - 1 - - - 2 - Mummy - 3 - 5 - 1 - 9 - - Mighty Blow - Regeneration - - 110000 - - Strength Skill - General Skill - - - Strength Trait - General Trait - Pass Skill - Agility Skill - - - - 2 - Wight - 6 - 3 - 3 - 8 - - Block - Regeneration - - 90000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - 4 - Ghoul - 7 - 3 - 3 - 7 - - Dodge - - 70000 - - General Skill - Agility Skill - - - General Trait - Agility Trait - Strength Skill - Pass Skill - - - - 12 - Zombie - 4 - 3 - 2 - 8 - - Regeneration - - 30000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - 12 - Skeleton - 5 - 3 - 2 - 7 - - Regeneration - - 30000 - - General Skill - - - General Trait - Strength Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + UndeadKey + 70000 + false + 300000 + true + 100000 + 1 + + + 2 + Mummy + 3 + 5 + 1 + 9 + + Mighty Blow + Regeneration + + 110000 + + Strength Skill + General Skill + + + Strength Trait + General Trait + Pass Skill + Agility Skill + + + + 2 + Wight + 6 + 3 + 3 + 8 + + Block + Regeneration + + 90000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + 4 + Ghoul + 7 + 3 + 3 + 7 + + Dodge + + 70000 + + General Skill + Agility Skill + + + General Trait + Agility Trait + Strength Skill + Pass Skill + + + + 12 + Zombie + 4 + 3 + 2 + 8 + + Regeneration + + 30000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + 12 + Skeleton + 5 + 3 + 2 + 7 + + Regeneration + + 30000 + + General Skill + + + General Trait + Strength Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb3/woodelves.xml b/src/teamma/rules/lrb3/woodelves.xml index 309d49f0..711e1dee 100644 --- a/src/teamma/rules/lrb3/woodelves.xml +++ b/src/teamma/rules/lrb3/woodelves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + WoodElfKey 50000 true diff --git a/src/teamma/rules/lrb4/amazons.xml b/src/teamma/rules/lrb4/amazons.xml index 1b443fb5..2bc84b29 100644 --- a/src/teamma/rules/lrb4/amazons.xml +++ b/src/teamma/rules/lrb4/amazons.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + AmazonKey 40000 true diff --git a/src/teamma/rules/lrb4/chaos.xml b/src/teamma/rules/lrb4/chaos.xml index 1b21c243..d78191d9 100644 --- a/src/teamma/rules/lrb4/chaos.xml +++ b/src/teamma/rules/lrb4/chaos.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosKey 70000 true diff --git a/src/teamma/rules/lrb4/chaosdwarves.xml b/src/teamma/rules/lrb4/chaosdwarves.xml index 46bd1ce8..4f16f669 100644 --- a/src/teamma/rules/lrb4/chaosdwarves.xml +++ b/src/teamma/rules/lrb4/chaosdwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + ChaosDwarfKey 70000 true diff --git a/src/teamma/rules/lrb4/darkelves.xml b/src/teamma/rules/lrb4/darkelves.xml index 1724479e..f8bdf19c 100644 --- a/src/teamma/rules/lrb4/darkelves.xml +++ b/src/teamma/rules/lrb4/darkelves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + DarkElfKey 50000 true diff --git a/src/teamma/rules/lrb4/dwarves.xml b/src/teamma/rules/lrb4/dwarves.xml index 6c592927..9918d477 100644 --- a/src/teamma/rules/lrb4/dwarves.xml +++ b/src/teamma/rules/lrb4/dwarves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + DwarfKey 40000 true diff --git a/src/teamma/rules/lrb4/elves.xml b/src/teamma/rules/lrb4/elves.xml index 6a044198..645ab7ce 100644 --- a/src/teamma/rules/lrb4/elves.xml +++ b/src/teamma/rules/lrb4/elves.xml @@ -1,112 +1,112 @@ - - - - - - - ElfKey - 50000 - true - 300000 - false - 100000 - 1 - - - 2 - Blitzer - 7 - 3 - 4 - 8 - - Side Step - Block - - 110000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 2 - Thrower - 6 - 3 - 4 - 7 - - Pass - - 70000 - - General Skill - Agility Skill - Pass Skill - - - Strength Skill - Pass Trait - General Trait - Agility Trait - - - - 4 - Catcher - 8 - 3 - 4 - 7 - - Nerves of Steel - Catch - - 100000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - 12 - Lineman - 6 - 3 - 4 - 7 - - - 60000 - - General Skill - Agility Skill - - - Strength Skill - Pass Skill - General Trait - Agility Trait - - - - - - + + + + + + + ElfKey + 50000 + true + 300000 + false + 100000 + 1 + + + 2 + Blitzer + 7 + 3 + 4 + 8 + + Side Step + Block + + 110000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 2 + Thrower + 6 + 3 + 4 + 7 + + Pass + + 70000 + + General Skill + Agility Skill + Pass Skill + + + Strength Skill + Pass Trait + General Trait + Agility Trait + + + + 4 + Catcher + 8 + 3 + 4 + 7 + + Nerves of Steel + Catch + + 100000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + 12 + Lineman + 6 + 3 + 4 + 7 + + + 60000 + + General Skill + Agility Skill + + + Strength Skill + Pass Skill + General Trait + Agility Trait + + + + + + diff --git a/src/teamma/rules/lrb4/goblins.xml b/src/teamma/rules/lrb4/goblins.xml index 794f0c51..fc722c43 100644 --- a/src/teamma/rules/lrb4/goblins.xml +++ b/src/teamma/rules/lrb4/goblins.xml @@ -1,71 +1,71 @@ - - - - - - - GoblinKey - 60000 - true - 300000 - false - 50000 - 2 - - - 16 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - - 40000 - - Agility Skill - - - Agility Trait - General Skill - Strength Skill - Pass Skill - - - - 2 - Troll - 4 - 5 - 1 - 9 - - Big Guy - Really Stupid - Always Hungry - Mighty Blow - Regeneration - Throw Team-Mate - - 100000 - - Strength Skill - - - Strength Trait - General Skill - Pass Skill - Agility Skill - - - - - - + + + + + + + GoblinKey + 60000 + true + 300000 + false + 50000 + 2 + + + 16 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + + 40000 + + Agility Skill + + + Agility Trait + General Skill + Strength Skill + Pass Skill + + + + 2 + Troll + 4 + 5 + 1 + 9 + + Big Guy + Really Stupid + Always Hungry + Mighty Blow + Regeneration + Throw Team-Mate + + 100000 + + Strength Skill + + + Strength Trait + General Skill + Pass Skill + Agility Skill + + + + + + diff --git a/src/teamma/rules/lrb4/halflings.xml b/src/teamma/rules/lrb4/halflings.xml index 07f67f7e..f4f50146 100644 --- a/src/teamma/rules/lrb4/halflings.xml +++ b/src/teamma/rules/lrb4/halflings.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HalflingKey 60000 true diff --git a/src/teamma/rules/lrb4/highelves.xml b/src/teamma/rules/lrb4/highelves.xml index bcd80143..559d4ec8 100644 --- a/src/teamma/rules/lrb4/highelves.xml +++ b/src/teamma/rules/lrb4/highelves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HighElfKey 50000 true diff --git a/src/teamma/rules/lrb4/humans.xml b/src/teamma/rules/lrb4/humans.xml index 3a976a50..b9a7085f 100644 --- a/src/teamma/rules/lrb4/humans.xml +++ b/src/teamma/rules/lrb4/humans.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + HumanKey 50000 true diff --git a/src/teamma/rules/lrb4/khemris.xml b/src/teamma/rules/lrb4/khemris.xml index 58678f3f..9e699097 100644 --- a/src/teamma/rules/lrb4/khemris.xml +++ b/src/teamma/rules/lrb4/khemris.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + KhemriKey 70000 false diff --git a/src/teamma/rules/lrb4/lizardmen.xml b/src/teamma/rules/lrb4/lizardmen.xml index aeafed8e..4f8be4c0 100644 --- a/src/teamma/rules/lrb4/lizardmen.xml +++ b/src/teamma/rules/lrb4/lizardmen.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + LizardmenKey 60000 true diff --git a/src/teamma/rules/lrb4/necromantics.xml b/src/teamma/rules/lrb4/necromantics.xml index 57075bc1..b633a976 100644 --- a/src/teamma/rules/lrb4/necromantics.xml +++ b/src/teamma/rules/lrb4/necromantics.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + NecromanticKey 70000 false diff --git a/src/teamma/rules/lrb4/norses.xml b/src/teamma/rules/lrb4/norses.xml index 395a95c5..038385e8 100644 --- a/src/teamma/rules/lrb4/norses.xml +++ b/src/teamma/rules/lrb4/norses.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + NorseKey 60000 true diff --git a/src/teamma/rules/lrb4/nurgle.xml b/src/teamma/rules/lrb4/nurgle.xml index 67989e18..76d1ee9a 100644 --- a/src/teamma/rules/lrb4/nurgle.xml +++ b/src/teamma/rules/lrb4/nurgle.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + NurgleKey 70000 false diff --git a/src/teamma/rules/lrb4/ogres.xml b/src/teamma/rules/lrb4/ogres.xml index e47378cb..7fe6c688 100644 --- a/src/teamma/rules/lrb4/ogres.xml +++ b/src/teamma/rules/lrb4/ogres.xml @@ -1,70 +1,70 @@ - - - - - - - OgreKey - 70000 - true - 300000 - false - 100000 - - - - 12 - Ogre - 5 - 5 - 2 - 9 - - Bone Head - Mighty Blow - Thick Skull - Throw Team-Mate - - 120000 - - Strength Skill - - - Strength Trait - General Skill - Pass Skill - Agility Skill - - - - - 6 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Right Stuff - Stunty - - 40000 - - Agility Skill - - - Agility Trait - Strength Skill - Pass Skill - General Skill - - - - - - + + + + + + + OgreKey + 70000 + true + 300000 + false + 100000 + + + + 12 + Ogre + 5 + 5 + 2 + 9 + + Bone Head + Mighty Blow + Thick Skull + Throw Team-Mate + + 120000 + + Strength Skill + + + Strength Trait + General Skill + Pass Skill + Agility Skill + + + + + 6 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Right Stuff + Stunty + + 40000 + + Agility Skill + + + Agility Trait + Strength Skill + Pass Skill + General Skill + + + + + + diff --git a/src/teamma/rules/lrb4/orcs.xml b/src/teamma/rules/lrb4/orcs.xml index 4b1ed2ee..3c90f48b 100644 --- a/src/teamma/rules/lrb4/orcs.xml +++ b/src/teamma/rules/lrb4/orcs.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + OrcKey 60000 true diff --git a/src/teamma/rules/lrb4/skavens.xml b/src/teamma/rules/lrb4/skavens.xml index 527689f0..153c190e 100644 --- a/src/teamma/rules/lrb4/skavens.xml +++ b/src/teamma/rules/lrb4/skavens.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + SkavenKey 60000 true diff --git a/src/teamma/rules/lrb4/undeads.xml b/src/teamma/rules/lrb4/undeads.xml index 411f3e51..bf277dba 100644 --- a/src/teamma/rules/lrb4/undeads.xml +++ b/src/teamma/rules/lrb4/undeads.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + UndeadKey 70000 false diff --git a/src/teamma/rules/lrb4/vampires.xml b/src/teamma/rules/lrb4/vampires.xml index dc2512b2..95630b4f 100644 --- a/src/teamma/rules/lrb4/vampires.xml +++ b/src/teamma/rules/lrb4/vampires.xml @@ -7,14 +7,14 @@ and open the template in the editor. - + VampireKey 70000 false 300000 true 100000 -1 + 1 6 diff --git a/src/teamma/rules/lrb4/woodelves.xml b/src/teamma/rules/lrb4/woodelves.xml index 309d49f0..711e1dee 100644 --- a/src/teamma/rules/lrb4/woodelves.xml +++ b/src/teamma/rules/lrb4/woodelves.xml @@ -7,7 +7,7 @@ and open the template in the editor. - + WoodElfKey 50000 true diff --git a/src/teamma/rules/lrb5/amazons.xml b/src/teamma/rules/lrb5/amazons.xml index 02112279..da10fada 100644 --- a/src/teamma/rules/lrb5/amazons.xml +++ b/src/teamma/rules/lrb5/amazons.xml @@ -1,104 +1,114 @@ - - - - - - - AmazonKey - 50000 - true - 300000 - false - 100000 - - - 4 - Amazon Blitzer - 6 - 3 - 3 - 7 - - Dodge - Block - - 90000 - - General - Strength - - - Agility - Pass - - - - 2 - Amazon Thrower - 6 - 3 - 3 - 7 - - Dodge - Pass - - 70000 - - General - Pass - - - Agility - Strength - - - - 2 - Amazon Catcher - 6 - 3 - 3 - 7 - - Dodge - Catch - - 70000 - - General - Agility - - - Strength - Pass - - - - 16 - Amazon Linewoman - 6 - 3 - 3 - 7 - - Dodge - - 50000 - - General - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + + + AmazonKey + 50000 + true + 300000 + false + 100000 + + + 4 + Amazon Blitzer + 6 + 3 + 3 + 7 + + Dodge + Block + + 90000 + + General + Strength + + + Agility + Pass + + + + 2 + Amazon Thrower + 6 + 3 + 3 + 7 + + Dodge + Pass + + 70000 + + General + Pass + + + Agility + Strength + + + + 2 + Amazon Catcher + 6 + 3 + 3 + 7 + + Dodge + Catch + + 70000 + + General + Agility + + + Strength + Pass + + + + 16 + Amazon Linewoman + 6 + 3 + 3 + 7 + + Dodge + + 50000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb5/chaos.xml b/src/teamma/rules/lrb5/chaos.xml index c5d690b4..f195cb81 100644 --- a/src/teamma/rules/lrb5/chaos.xml +++ b/src/teamma/rules/lrb5/chaos.xml @@ -1,88 +1,96 @@ - - - - - - - ChaosKey - 60000 - true - 300000 - false - 100000 - - - 4 - Chaos Warrior - 5 - 4 - 3 - 9 - - - 100000 - - General - Strength - Mutation - - - Agility - Pass - - - - 16 - Beastman - 6 - 3 - 3 - 8 - - Horns - - 60000 - - General - Strength - Mutation - - - Agility - Pass - - - - 1 - Minotaur - 5 - 5 - 2 - 8 - - Loner - Wild Animal - Mighty Blow - Thick Skull - Frenzy - Horns - - 150000 - - Strength - Mutation - - - General - Agility - Pass - - - - - - + + + + + + + + + + + + + + + ChaosKey + 60000 + true + 300000 + false + 100000 + + + 4 + Chaos Warrior + 5 + 4 + 3 + 9 + + + 100000 + + General + Strength + Mutation + + + Agility + Pass + + + + 16 + Beastman + 6 + 3 + 3 + 8 + + Horns + + 60000 + + General + Strength + Mutation + + + Agility + Pass + + + + 1 + Minotaur + 5 + 5 + 2 + 8 + + Loner + Wild Animal + Mighty Blow + Thick Skull + Frenzy + Horns + + 150000 + + Strength + Mutation + + + General + Agility + Pass + + + + + + diff --git a/src/teamma/rules/lrb5/chaosdwarves.xml b/src/teamma/rules/lrb5/chaosdwarves.xml index bb3874a4..19324309 100644 --- a/src/teamma/rules/lrb5/chaosdwarves.xml +++ b/src/teamma/rules/lrb5/chaosdwarves.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + ChaosDwarfKey 70000 true diff --git a/src/teamma/rules/lrb5/darkelves.xml b/src/teamma/rules/lrb5/darkelves.xml index 4d5fa914..a2a9230c 100644 --- a/src/teamma/rules/lrb5/darkelves.xml +++ b/src/teamma/rules/lrb5/darkelves.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + DarkElfKey 50000 true diff --git a/src/teamma/rules/lrb5/dwarves.xml b/src/teamma/rules/lrb5/dwarves.xml index ecddf6d8..5ef5217d 100644 --- a/src/teamma/rules/lrb5/dwarves.xml +++ b/src/teamma/rules/lrb5/dwarves.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + DwarfKey 50000 true diff --git a/src/teamma/rules/lrb5/elves.xml b/src/teamma/rules/lrb5/elves.xml index 9472366d..51cfc42b 100644 --- a/src/teamma/rules/lrb5/elves.xml +++ b/src/teamma/rules/lrb5/elves.xml @@ -1,102 +1,110 @@ - - - - - - - ElfKey - 50000 - true - 300000 - false - 100000 - - - 2 - Blitzer - 7 - 3 - 4 - 8 - - Side Step - Block - - 110000 - - General - Agility - - - Strength - Pass - - - - 2 - Thrower - 6 - 3 - 4 - 7 - - Pass - - 70000 - - General - Pass - Agility - - - Strength - - - - 4 - Catcher - 8 - 3 - 4 - 7 - - Nerves of Steel - Catch - - 100000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 6 - 3 - 4 - 7 - - - 60000 - - General - Agility - - - Strength - Pass - - - - - - + + + + + + + + + + + + + + + ElfKey + 50000 + true + 300000 + false + 100000 + + + 2 + Blitzer + 7 + 3 + 4 + 8 + + Side Step + Block + + 110000 + + General + Agility + + + Strength + Pass + + + + 2 + Thrower + 6 + 3 + 4 + 7 + + Pass + + 70000 + + General + Pass + Agility + + + Strength + + + + 4 + Catcher + 8 + 3 + 4 + 7 + + Nerves of Steel + Catch + + 100000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 6 + 3 + 4 + 7 + + + 60000 + + General + Agility + + + Strength + Pass + + + + + + diff --git a/src/teamma/rules/lrb5/goblins.xml b/src/teamma/rules/lrb5/goblins.xml index 77753701..c366e903 100644 --- a/src/teamma/rules/lrb5/goblins.xml +++ b/src/teamma/rules/lrb5/goblins.xml @@ -1,162 +1,170 @@ - - - - - - - GoblinKey - 60000 - true - 300000 - false - 50000 - - - 16 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - - 40000 - - Agility - - - General - Strength - Pass - - - - 2 - Troll - 4 - 5 - 1 - 9 - - Loner - Really Stupid - Always Hungry - Mighty Blow - Regeneration - Throw Team-Mate - - 110000 - - Strength - - - General - Pass - Agility - - - - 1 - Bombardier - 6 - 2 - 3 - 7 - - Dodge - No Hands - Bombardier - Secret Weapon - - 40000 - - Agility - - - General - Strength - Pass - - - - 1 - Pogo Stick - 7 - 2 - 3 - 7 - - Dodge - Leap - Very Long Legs - Stunty - Dirty Player - Secret Weapon - - 70000 - - Agility - - - Strength - Pass - General - - - - 1 - Looney - 6 - 2 - 3 - 7 - - Chainsaw - Secret Weapon - Stunty - No Hands - - 40000 - - Agility - - - Strength - Pass - General - - - - 1 - Fanatic - 3 - 7 - 3 - 7 - - Stunty - No Hands - Secret Weapon - Ball And Chain - - 70000 - - Strength - - - Agility - Pass - General - - - - - - + + + + + + + + + + + + + + + GoblinKey + 60000 + true + 300000 + false + 50000 + + + 16 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + + 40000 + + Agility + + + General + Strength + Pass + + + + 2 + Troll + 4 + 5 + 1 + 9 + + Loner + Really Stupid + Always Hungry + Mighty Blow + Regeneration + Throw Team-Mate + + 110000 + + Strength + + + General + Pass + Agility + + + + 1 + Bombardier + 6 + 2 + 3 + 7 + + Dodge + No Hands + Bombardier + Secret Weapon + + 40000 + + Agility + + + General + Strength + Pass + + + + 1 + Pogo Stick + 7 + 2 + 3 + 7 + + Dodge + Leap + Very Long Legs + Stunty + Dirty Player + Secret Weapon + + 70000 + + Agility + + + Strength + Pass + General + + + + 1 + Looney + 6 + 2 + 3 + 7 + + Chainsaw + Secret Weapon + Stunty + No Hands + + 40000 + + Agility + + + Strength + Pass + General + + + + 1 + Fanatic + 3 + 7 + 3 + 7 + + Stunty + No Hands + Secret Weapon + Ball And Chain + + 70000 + + Strength + + + Agility + Pass + General + + + + + + diff --git a/src/teamma/rules/lrb5/halflings.xml b/src/teamma/rules/lrb5/halflings.xml index 7ebc20bb..67cce0f7 100644 --- a/src/teamma/rules/lrb5/halflings.xml +++ b/src/teamma/rules/lrb5/halflings.xml @@ -1,68 +1,76 @@ - - - - - - - HalflingKey - 60000 - true - 100000 - false - 100000 - - - 2 - Treeman - 2 - 6 - 1 - 10 - - Take Roots - Stand Firm - Mighty Blow - Thick Skull - Strong Arm - Throw Team-Mate - - 120000 - - Strength - - - General - Agility - Pass - - - - 16 - Halflings - 5 - 2 - 3 - 6 - - Dodge - Stunty - Right Stuff - - 30000 - - Agility - - - Strength - General - Pass - - - - - - + + + + + + + + + + + + + + + HalflingKey + 60000 + true + 100000 + false + 100000 + + + 2 + Treeman + 2 + 6 + 1 + 10 + + Take Roots + Stand Firm + Mighty Blow + Thick Skull + Strong Arm + Throw Team-Mate + + 120000 + + Strength + + + General + Agility + Pass + + + + 16 + Halflings + 5 + 2 + 3 + 6 + + Dodge + Stunty + Right Stuff + + 30000 + + Agility + + + Strength + General + Pass + + + + + + diff --git a/src/teamma/rules/lrb5/highelves.xml b/src/teamma/rules/lrb5/highelves.xml index 5e5e2dc9..d9255372 100644 --- a/src/teamma/rules/lrb5/highelves.xml +++ b/src/teamma/rules/lrb5/highelves.xml @@ -1,101 +1,109 @@ - - - - - - - HighElfKey - 50000 - true - 300000 - false - 100000 - - - 2 - Blitzer - 7 - 3 - 4 - 8 - - Block - - 100000 - - General - Agility - - - Strength - Pass - - - - 2 - Thrower - 6 - 3 - 4 - 8 - - Safe Throw - Pass - - 90000 - - General - Pass - Agility - - - Strength - - - - 4 - Catcher - 8 - 3 - 4 - 7 - - Catch - - 90000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General - Agility - - - Strength - Pass - - - - - - + + + + + + + + + + + + + + + HighElfKey + 50000 + true + 300000 + false + 100000 + + + 2 + Blitzer + 7 + 3 + 4 + 8 + + Block + + 100000 + + General + Agility + + + Strength + Pass + + + + 2 + Thrower + 6 + 3 + 4 + 8 + + Safe Throw + Pass + + 90000 + + General + Pass + Agility + + + Strength + + + + 4 + Catcher + 8 + 3 + 4 + 7 + + Catch + + 90000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General + Agility + + + Strength + Pass + + + + + + diff --git a/src/teamma/rules/lrb5/humans.xml b/src/teamma/rules/lrb5/humans.xml index bf17ccec..4e5357c1 100644 --- a/src/teamma/rules/lrb5/humans.xml +++ b/src/teamma/rules/lrb5/humans.xml @@ -1,128 +1,136 @@ - - - - - - - HumanKey - 50000 - true - 300000 - false - 100000 - - - 4 - Blitzer - 7 - 3 - 3 - 8 - - Block - - 90000 - - General - Strength - - - - - Pass - Agility - - - - 2 - Thrower - 6 - 3 - 3 - 8 - - Sure Hands - Pass - - 70000 - - General - Pass - - - Strength - Agility - - - - 4 - Catcher - 8 - 2 - 3 - 7 - - Dodge - Catch - - 70000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 6 - 3 - 2 - 8 - - - 50000 - - General - - - Strength - Pass - Agility - - - - 1 - Ogre - 5 - 5 - 2 - 9 - - Loner - Bone Head - Mighty Blow - Thick Skull - Throw Team-Mate - - 140000 - - Strength - - - General - Pass - Agility - - - - - - + + + + + + + + + + + + + + + HumanKey + 50000 + true + 300000 + false + 100000 + + + 4 + Blitzer + 7 + 3 + 3 + 8 + + Block + + 90000 + + General + Strength + + + + + Pass + Agility + + + + 2 + Thrower + 6 + 3 + 3 + 8 + + Sure Hands + Pass + + 70000 + + General + Pass + + + Strength + Agility + + + + 4 + Catcher + 8 + 2 + 3 + 7 + + Dodge + Catch + + 70000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 6 + 3 + 2 + 8 + + + 50000 + + General + + + Strength + Pass + Agility + + + + 1 + Ogre + 5 + 5 + 2 + 9 + + Loner + Bone Head + Mighty Blow + Thick Skull + Throw Team-Mate + + 140000 + + Strength + + + General + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb5/khemris.xml b/src/teamma/rules/lrb5/khemris.xml index b0041fac..198815d2 100644 --- a/src/teamma/rules/lrb5/khemris.xml +++ b/src/teamma/rules/lrb5/khemris.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + KhemriKey 70000 false diff --git a/src/teamma/rules/lrb5/lizardmen.xml b/src/teamma/rules/lrb5/lizardmen.xml index c0a3dbe3..19c589f1 100644 --- a/src/teamma/rules/lrb5/lizardmen.xml +++ b/src/teamma/rules/lrb5/lizardmen.xml @@ -1,86 +1,94 @@ - - - - - - - LizardmenKey - 60000 - true - 300000 - false - 100000 - - - 6 - Saurus - 6 - 4 - 1 - 9 - - - 80000 - - General - Strength - - - Agility - Pass - - - - 16 - Skink - 8 - 2 - 3 - 7 - - Dodge - Stunty - - 60000 - - - Agility - - - General - Pass - Strength - - - - 1 - Kroxigor - 6 - 5 - 1 - 9 - - Loner - Mighty Blow - Bone Head - Thick Skull - Prehensile Tail - - 140000 - - Strength - - - General - Agility - Pass - - - - - - + + + + + + + + + + + + + + + LizardmenKey + 60000 + true + 300000 + false + 100000 + + + 6 + Saurus + 6 + 4 + 1 + 9 + + + 80000 + + General + Strength + + + Agility + Pass + + + + 16 + Skink + 8 + 2 + 3 + 7 + + Dodge + Stunty + + 60000 + + + Agility + + + General + Pass + Strength + + + + 1 + Kroxigor + 6 + 5 + 1 + 9 + + Loner + Mighty Blow + Bone Head + Thick Skull + Prehensile Tail + + 140000 + + Strength + + + General + Agility + Pass + + + + + + diff --git a/src/teamma/rules/lrb5/necromantics.xml b/src/teamma/rules/lrb5/necromantics.xml index ae8a4056..640d4c6c 100644 --- a/src/teamma/rules/lrb5/necromantics.xml +++ b/src/teamma/rules/lrb5/necromantics.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + NecromanticKey 70000 false diff --git a/src/teamma/rules/lrb5/norses.xml b/src/teamma/rules/lrb5/norses.xml index 416aac14..9b05e3cc 100644 --- a/src/teamma/rules/lrb5/norses.xml +++ b/src/teamma/rules/lrb5/norses.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + NorseKey 60000 true diff --git a/src/teamma/rules/lrb5/nurgle.xml b/src/teamma/rules/lrb5/nurgle.xml index 03a41b8f..43c6bdcf 100644 --- a/src/teamma/rules/lrb5/nurgle.xml +++ b/src/teamma/rules/lrb5/nurgle.xml @@ -1,117 +1,125 @@ - - - - - - - NurgleKey - 70000 - false - 300000 - true - 100000 - - - 4 - Nurgle's Warrior - 4 - 4 - 2 - 9 - - Disturbing Presence - Foul Appearance - Nurgle's Rot - Regeneration - - 110000 - - General - Strength - Mutation - - - Pass - Agility - - - - 4 - Pestigor - 6 - 3 - 3 - 8 - - Horns - Nurgle's Rot - Regeneration - - 80000 - - General - Strength - Mutation - - - Pass - Agility - - - - 1 - Nurgle's Beast - 4 - 5 - 1 - 9 - - Disturbing Presence - Foul Appearance - Nurgle's Rot - Regeneration - Loner - Really Stupid - Tentacles - Mighty Blow - - 140000 - - Strength - - - General - Agility - Pass - - - - 16 - Rotter - 5 - 3 - 3 - 8 - - Nurgle's Rot - Decay - - 40000 - - General - Mutation - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + NurgleKey + 70000 + false + 300000 + true + 100000 + + + 4 + Nurgle's Warrior + 4 + 4 + 2 + 9 + + Disturbing Presence + Foul Appearance + Nurgle's Rot + Regeneration + + 110000 + + General + Strength + Mutation + + + Pass + Agility + + + + 4 + Pestigor + 6 + 3 + 3 + 8 + + Horns + Nurgle's Rot + Regeneration + + 80000 + + General + Strength + Mutation + + + Pass + Agility + + + + 1 + Nurgle's Beast + 4 + 5 + 1 + 9 + + Disturbing Presence + Foul Appearance + Nurgle's Rot + Regeneration + Loner + Really Stupid + Tentacles + Mighty Blow + + 140000 + + Strength + + + General + Agility + Pass + + + + 16 + Rotter + 5 + 3 + 3 + 8 + + Nurgle's Rot + Decay + + 40000 + + General + Mutation + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb5/ogres.xml b/src/teamma/rules/lrb5/ogres.xml index 566f957b..e3d53d39 100644 --- a/src/teamma/rules/lrb5/ogres.xml +++ b/src/teamma/rules/lrb5/ogres.xml @@ -1,70 +1,78 @@ - - - - - - - OgreKey - 70000 - true - 300000 - false - 100000 - - - 6 - Ogre - 5 - 5 - 2 - 9 - - Bone Head - Mighty Blow - Thick Skull - Throw Team-Mate - - 140000 - - Strength - - - General - - Pass - Agility - - - - - 16 - Snotling - 4 - 1 - 3 - 5 - - Dodge - Right Stuff - Stunty - Titchy - Side Step - - 20000 - - Agility - - - Strength - Pass - General - - - - - - + + + + + + + + + + + + + + + OgreKey + 70000 + true + 300000 + false + 100000 + + + 6 + Ogre + 5 + 5 + 2 + 9 + + Bone Head + Mighty Blow + Thick Skull + Throw Team-Mate + + 140000 + + Strength + + + General + + Pass + Agility + + + + + 16 + Snotling + 4 + 1 + 3 + 5 + + Dodge + Right Stuff + Stunty + Titchy + Side Step + + 20000 + + Agility + + + Strength + Pass + General + + + + + + diff --git a/src/teamma/rules/lrb5/orcs.xml b/src/teamma/rules/lrb5/orcs.xml index d7841618..2e9e9c9a 100644 --- a/src/teamma/rules/lrb5/orcs.xml +++ b/src/teamma/rules/lrb5/orcs.xml @@ -1,147 +1,155 @@ - - - - - - - OrcKey - 60000 - true - 300000 - false - 100000 - - - 4 - Blitzer - 6 - 3 - 3 - 9 - - Block - - 80000 - - General - Strength - - - Agility - Pass - - - - 4 - Black Orc Blocker - 4 - 4 - 2 - 9 - - - 80000 - - General - Strength - - - Pass - Agility - - - - 4 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - - 40000 - - Agility - - - General - Strength - Pass - - - - 16 - Lineman - 5 - 3 - 3 - 9 - - - 50000 - - General - - - Strength - Pass - Agility - - - - 2 - Thrower - 5 - 3 - 3 - 8 - - Sure Hands - Pass - - 70000 - - General - Pass - - - Strength - Agility - - - - 1 - Troll - 4 - 5 - 1 - 9 - - Loner - Really Stupid - Always Hungry - Mighty Blow - Regeneration - Throw Team-Mate - - 110000 - - Strength - - - General - Pass - Agility - - - - - - + + + + + + + + + + + + + + + OrcKey + 60000 + true + 300000 + false + 100000 + + + 4 + Blitzer + 6 + 3 + 3 + 9 + + Block + + 80000 + + General + Strength + + + Agility + Pass + + + + 4 + Black Orc Blocker + 4 + 4 + 2 + 9 + + + 80000 + + General + Strength + + + Pass + Agility + + + + 4 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + + 40000 + + Agility + + + General + Strength + Pass + + + + 16 + Lineman + 5 + 3 + 3 + 9 + + + 50000 + + General + + + Strength + Pass + Agility + + + + 2 + Thrower + 5 + 3 + 3 + 8 + + Sure Hands + Pass + + 70000 + + General + Pass + + + Strength + Agility + + + + 1 + Troll + 4 + 5 + 1 + 9 + + Loner + Really Stupid + Always Hungry + Mighty Blow + Regeneration + Throw Team-Mate + + 110000 + + Strength + + + General + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb5/skavens.xml b/src/teamma/rules/lrb5/skavens.xml index ccf71319..774adf09 100644 --- a/src/teamma/rules/lrb5/skavens.xml +++ b/src/teamma/rules/lrb5/skavens.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + SkavenKey 60000 true diff --git a/src/teamma/rules/lrb5/undeads.xml b/src/teamma/rules/lrb5/undeads.xml index 7864de27..0869a9cc 100644 --- a/src/teamma/rules/lrb5/undeads.xml +++ b/src/teamma/rules/lrb5/undeads.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + UndeadKey 70000 false diff --git a/src/teamma/rules/lrb5/vampires.xml b/src/teamma/rules/lrb5/vampires.xml index fdf10cf2..8cd4ca9e 100644 --- a/src/teamma/rules/lrb5/vampires.xml +++ b/src/teamma/rules/lrb5/vampires.xml @@ -1,62 +1,70 @@ - - - - - - - VampireKey - 70000 - false - 300000 - true - 100000 - - - 6 - Vampires - 6 - 4 - 4 - 8 - - Regeneration - Hypnotic Gaze - Blood Lust - - 110000 - - General - Strength - Agility - - - Pass - - - - 16 - Thrall - 6 - 3 - 3 - 7 - - - 40000 - - General - - - Pass - Agility - Strength - - - - - - + + + + + + + + + + + + + + + VampireKey + 70000 + false + 300000 + true + 100000 + + + 6 + Vampires + 6 + 4 + 4 + 8 + + Regeneration + Hypnotic Gaze + Blood Lust + + 110000 + + General + Strength + Agility + + + Pass + + + + 16 + Thrall + 6 + 3 + 3 + 7 + + + 40000 + + General + + + Pass + Agility + Strength + + + + + + diff --git a/src/teamma/rules/lrb5/woodelves.xml b/src/teamma/rules/lrb5/woodelves.xml index 1a9091f1..34e10718 100644 --- a/src/teamma/rules/lrb5/woodelves.xml +++ b/src/teamma/rules/lrb5/woodelves.xml @@ -1,129 +1,137 @@ - - - - - - - WoodElfKey - 50000 - true - 300000 - false - 100000 - - - 2 - Wardanser - 8 - 3 - 4 - 7 - - Dodge - Block - Leap - - 120000 - - General - Agility - - - Pass - Strength - - - - 2 - Thrower - 7 - 3 - 4 - 7 - - Pass - - 90000 - - General - Pass - Agility - - - Strength - - - - 4 - Catcher - 9 - 2 - 4 - 7 - - Dodge - Catch - - 90000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 7 - 3 - 4 - 7 - - - 70000 - - General - Agility - - - Strength - Pass - - - - 1 - Treeman - 2 - 6 - 1 - 10 - - Take Roots - Loner - Stand Firm - Mighty Blow - Thick Skull - Strong Arm - Throw Team-Mate - - 120000 - - Strength - - - General - Agility - Pass - - - - - - + + + + + + + + + + + + + + + WoodElfKey + 50000 + true + 300000 + false + 100000 + + + 2 + Wardanser + 8 + 3 + 4 + 7 + + Dodge + Block + Leap + + 120000 + + General + Agility + + + Pass + Strength + + + + 2 + Thrower + 7 + 3 + 4 + 7 + + Pass + + 90000 + + General + Pass + Agility + + + Strength + + + + 4 + Catcher + 9 + 2 + 4 + 7 + + Dodge + Catch + + 90000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 7 + 3 + 4 + 7 + + + 70000 + + General + Agility + + + Strength + Pass + + + + 1 + Treeman + 2 + 6 + 1 + 10 + + Take Roots + Loner + Stand Firm + Mighty Blow + Thick Skull + Strong Arm + Throw Team-Mate + + 120000 + + Strength + + + General + Agility + Pass + + + + + + diff --git a/src/teamma/rules/lrb6/amazons.xml b/src/teamma/rules/lrb6/amazons.xml index 02112279..b2f51d8e 100644 --- a/src/teamma/rules/lrb6/amazons.xml +++ b/src/teamma/rules/lrb6/amazons.xml @@ -1,104 +1,112 @@ - - - - - - - AmazonKey - 50000 - true - 300000 - false - 100000 - - - 4 - Amazon Blitzer - 6 - 3 - 3 - 7 - - Dodge - Block - - 90000 - - General - Strength - - - Agility - Pass - - - - 2 - Amazon Thrower - 6 - 3 - 3 - 7 - - Dodge - Pass - - 70000 - - General - Pass - - - Agility - Strength - - - - 2 - Amazon Catcher - 6 - 3 - 3 - 7 - - Dodge - Catch - - 70000 - - General - Agility - - - Strength - Pass - - - - 16 - Amazon Linewoman - 6 - 3 - 3 - 7 - - Dodge - - 50000 - - General - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + AmazonKey + 50000 + true + 300000 + false + 100000 + + + 4 + Amazon Blitzer + 6 + 3 + 3 + 7 + + Dodge + Block + + 90000 + + General + Strength + + + Agility + Pass + + + + 2 + Amazon Thrower + 6 + 3 + 3 + 7 + + Dodge + Pass + + 70000 + + General + Pass + + + Agility + Strength + + + + 2 + Amazon Catcher + 6 + 3 + 3 + 7 + + Dodge + Catch + + 70000 + + General + Agility + + + Strength + Pass + + + + 16 + Amazon Linewoman + 6 + 3 + 3 + 7 + + Dodge + + 50000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/bretonians.xml b/src/teamma/rules/lrb6/bretonians.xml index ac31f25d..50c09464 100644 --- a/src/teamma/rules/lrb6/bretonians.xml +++ b/src/teamma/rules/lrb6/bretonians.xml @@ -1,83 +1,91 @@ - - - - - - - BretonianKey - 70000 - true - 300000 - false - 100000 - - - 4 - Blitzer - 7 - 3 - 3 - 8 - - Block - Catch - Dauntless - - 110000 - - General - Pass - Agility - - - Strength - - - - 4 - Yeomen - 6 - 3 - 3 - 8 - - Wrestle - - 70000 - - General - Strength - - - Pass - Agility - - - - 16 - Lineman - 6 - 3 - 2 - 7 - - Fend - - 40000 - - General - - - Agility - Strength - Pass - - - - - - + + + + + + + + + + + + + + + BretonianKey + 70000 + true + 300000 + false + 100000 + + + 4 + Blitzer + 7 + 3 + 3 + 8 + + Block + Catch + Dauntless + + 110000 + + General + Pass + Agility + + + Strength + + + + 4 + Yeomen + 6 + 3 + 3 + 8 + + Wrestle + + 70000 + + General + Strength + + + Pass + Agility + + + + 16 + Lineman + 6 + 3 + 2 + 7 + + Fend + + 40000 + + General + + + Agility + Strength + Pass + + + + + + diff --git a/src/teamma/rules/lrb6/chaos.xml b/src/teamma/rules/lrb6/chaos.xml index e9a4d4d6..f195cb81 100644 --- a/src/teamma/rules/lrb6/chaos.xml +++ b/src/teamma/rules/lrb6/chaos.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + ChaosKey 60000 true diff --git a/src/teamma/rules/lrb6/chaosdwarves.xml b/src/teamma/rules/lrb6/chaosdwarves.xml index bb3874a4..19324309 100644 --- a/src/teamma/rules/lrb6/chaosdwarves.xml +++ b/src/teamma/rules/lrb6/chaosdwarves.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + ChaosDwarfKey 70000 true diff --git a/src/teamma/rules/lrb6/chaospact.xml b/src/teamma/rules/lrb6/chaospact.xml index 55f42565..f89a5b80 100644 --- a/src/teamma/rules/lrb6/chaospact.xml +++ b/src/teamma/rules/lrb6/chaospact.xml @@ -1,182 +1,190 @@ - - - - - - - ChaosPactKey - 70000 - true - 300000 - false - 100000 - - - 1 - Chaos Troll - 4 - 5 - 1 - 9 - - Loner - Really Stupid - Always Hungry - Mighty Blow - Regeneration - Throw Team-Mate - - 110000 - - Strength - - - General - Pass - Agility - Mutation - - - - 1 - Chaos Ogre - 5 - 5 - 2 - 9 - - Loner - Bone Head - Mighty Blow - Thick Skull - Throw Team-Mate - - 140000 - - Strength - - - General - Mutation - Pass - Agility - - - - 1 - Minotaur - 5 - 5 - 2 - 8 - - Loner - Wild Animal - Mighty Blow - Horns - - 150000 - - Strength - - - General - Agility - Pass - Mutation - - - - 16 - Marauder - 6 - 3 - 3 - 8 - - - 50000 - - General - Strength - Pass - Mutation - - - Agility - - - - 1 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - Animosity - - 40000 - - Agility - Mutation - - - General - Strength - Pass - - - - 1 - Dark Elf - 6 - 3 - 4 - 8 - - Animosity - - 70000 - - General - Agility - Mutation - - - Strength - Pass - - - - 1 - Skaven - 7 - 3 - 3 - 7 - - Animosity - - 70000 - - General - Mutation - - - Agility - Strength - Pass - - - - - - + + + + + + + + + + + + + + + ChaosPactKey + 70000 + true + 300000 + false + 100000 + + + 1 + Chaos Troll + 4 + 5 + 1 + 9 + + Loner + Really Stupid + Always Hungry + Mighty Blow + Regeneration + Throw Team-Mate + + 110000 + + Strength + + + General + Pass + Agility + Mutation + + + + 1 + Chaos Ogre + 5 + 5 + 2 + 9 + + Loner + Bone Head + Mighty Blow + Thick Skull + Throw Team-Mate + + 140000 + + Strength + + + General + Mutation + Pass + Agility + + + + 1 + Minotaur + 5 + 5 + 2 + 8 + + Loner + Wild Animal + Mighty Blow + Horns + + 150000 + + Strength + + + General + Agility + Pass + Mutation + + + + 16 + Marauder + 6 + 3 + 3 + 8 + + + 50000 + + General + Strength + Pass + Mutation + + + Agility + + + + 1 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + Animosity + + 40000 + + Agility + Mutation + + + General + Strength + Pass + + + + 1 + Dark Elf + 6 + 3 + 4 + 8 + + Animosity + + 70000 + + General + Agility + Mutation + + + Strength + Pass + + + + 1 + Skaven + 7 + 3 + 3 + 7 + + Animosity + + 70000 + + General + Mutation + + + Agility + Strength + Pass + + + + + + diff --git a/src/teamma/rules/lrb6/darkelves.xml b/src/teamma/rules/lrb6/darkelves.xml index 4d5fa914..a2a9230c 100644 --- a/src/teamma/rules/lrb6/darkelves.xml +++ b/src/teamma/rules/lrb6/darkelves.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + DarkElfKey 50000 true diff --git a/src/teamma/rules/lrb6/dwarves.xml b/src/teamma/rules/lrb6/dwarves.xml index ecddf6d8..5ef5217d 100644 --- a/src/teamma/rules/lrb6/dwarves.xml +++ b/src/teamma/rules/lrb6/dwarves.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + DwarfKey 50000 true diff --git a/src/teamma/rules/lrb6/elves.xml b/src/teamma/rules/lrb6/elves.xml index 9472366d..51cfc42b 100644 --- a/src/teamma/rules/lrb6/elves.xml +++ b/src/teamma/rules/lrb6/elves.xml @@ -1,102 +1,110 @@ - - - - - - - ElfKey - 50000 - true - 300000 - false - 100000 - - - 2 - Blitzer - 7 - 3 - 4 - 8 - - Side Step - Block - - 110000 - - General - Agility - - - Strength - Pass - - - - 2 - Thrower - 6 - 3 - 4 - 7 - - Pass - - 70000 - - General - Pass - Agility - - - Strength - - - - 4 - Catcher - 8 - 3 - 4 - 7 - - Nerves of Steel - Catch - - 100000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 6 - 3 - 4 - 7 - - - 60000 - - General - Agility - - - Strength - Pass - - - - - - + + + + + + + + + + + + + + + ElfKey + 50000 + true + 300000 + false + 100000 + + + 2 + Blitzer + 7 + 3 + 4 + 8 + + Side Step + Block + + 110000 + + General + Agility + + + Strength + Pass + + + + 2 + Thrower + 6 + 3 + 4 + 7 + + Pass + + 70000 + + General + Pass + Agility + + + Strength + + + + 4 + Catcher + 8 + 3 + 4 + 7 + + Nerves of Steel + Catch + + 100000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 6 + 3 + 4 + 7 + + + 60000 + + General + Agility + + + Strength + Pass + + + + + + diff --git a/src/teamma/rules/lrb6/goblins.xml b/src/teamma/rules/lrb6/goblins.xml index acbdf913..6fcd0523 100644 --- a/src/teamma/rules/lrb6/goblins.xml +++ b/src/teamma/rules/lrb6/goblins.xml @@ -1,159 +1,167 @@ - - - - - - - GoblinKey - 60000 - true - 300000 - false - 50000 - - - 16 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - - 40000 - - Agility - - - General - Strength - Pass - - - - 2 - Troll - 4 - 5 - 1 - 9 - - Loner - Really Stupid - Always Hungry - Mighty Blow - Regeneration - Throw Team-Mate - - 110000 - - Strength - - - General - Pass - Agility - - - - 1 - Bombardier - 6 - 2 - 3 - 7 - - Dodge - No Hands - Bombardier - Secret Weapon - - 40000 - - Agility - - - General - Strength - Pass - - - - 1 - Pogo Stick - 7 - 2 - 3 - 7 - - Dodge - Leap - Very Long Legs - Stunty - - 70000 - - Agility - - - Strength - Pass - General - - - - 1 - Looney - 6 - 2 - 3 - 7 - - Chainsaw - Secret Weapon - Stunty - - 40000 - - Agility - - - Strength - Pass - General - - - - 1 - Fanatic - 3 - 7 - 3 - 7 - - Stunty - No Hands - Secret Weapon - Ball And Chain - - 70000 - - Strength - - - Agility - Pass - General - - - - - - + + + + + + + + + + + + + + + GoblinKey + 60000 + true + 300000 + false + 50000 + + + 16 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + + 40000 + + Agility + + + General + Strength + Pass + + + + 2 + Troll + 4 + 5 + 1 + 9 + + Loner + Really Stupid + Always Hungry + Mighty Blow + Regeneration + Throw Team-Mate + + 110000 + + Strength + + + General + Pass + Agility + + + + 1 + Bombardier + 6 + 2 + 3 + 7 + + Dodge + No Hands + Bombardier + Secret Weapon + + 40000 + + Agility + + + General + Strength + Pass + + + + 1 + Pogo Stick + 7 + 2 + 3 + 7 + + Dodge + Leap + Very Long Legs + Stunty + + 70000 + + Agility + + + Strength + Pass + General + + + + 1 + Looney + 6 + 2 + 3 + 7 + + Chainsaw + Secret Weapon + Stunty + + 40000 + + Agility + + + Strength + Pass + General + + + + 1 + Fanatic + 3 + 7 + 3 + 7 + + Stunty + No Hands + Secret Weapon + Ball And Chain + + 70000 + + Strength + + + Agility + Pass + General + + + + + + diff --git a/src/teamma/rules/lrb6/halflings.xml b/src/teamma/rules/lrb6/halflings.xml index 7ebc20bb..67cce0f7 100644 --- a/src/teamma/rules/lrb6/halflings.xml +++ b/src/teamma/rules/lrb6/halflings.xml @@ -1,68 +1,76 @@ - - - - - - - HalflingKey - 60000 - true - 100000 - false - 100000 - - - 2 - Treeman - 2 - 6 - 1 - 10 - - Take Roots - Stand Firm - Mighty Blow - Thick Skull - Strong Arm - Throw Team-Mate - - 120000 - - Strength - - - General - Agility - Pass - - - - 16 - Halflings - 5 - 2 - 3 - 6 - - Dodge - Stunty - Right Stuff - - 30000 - - Agility - - - Strength - General - Pass - - - - - - + + + + + + + + + + + + + + + HalflingKey + 60000 + true + 100000 + false + 100000 + + + 2 + Treeman + 2 + 6 + 1 + 10 + + Take Roots + Stand Firm + Mighty Blow + Thick Skull + Strong Arm + Throw Team-Mate + + 120000 + + Strength + + + General + Agility + Pass + + + + 16 + Halflings + 5 + 2 + 3 + 6 + + Dodge + Stunty + Right Stuff + + 30000 + + Agility + + + Strength + General + Pass + + + + + + diff --git a/src/teamma/rules/lrb6/highelves.xml b/src/teamma/rules/lrb6/highelves.xml index 5e5e2dc9..d9255372 100644 --- a/src/teamma/rules/lrb6/highelves.xml +++ b/src/teamma/rules/lrb6/highelves.xml @@ -1,101 +1,109 @@ - - - - - - - HighElfKey - 50000 - true - 300000 - false - 100000 - - - 2 - Blitzer - 7 - 3 - 4 - 8 - - Block - - 100000 - - General - Agility - - - Strength - Pass - - - - 2 - Thrower - 6 - 3 - 4 - 8 - - Safe Throw - Pass - - 90000 - - General - Pass - Agility - - - Strength - - - - 4 - Catcher - 8 - 3 - 4 - 7 - - Catch - - 90000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 6 - 3 - 4 - 8 - - - 70000 - - General - Agility - - - Strength - Pass - - - - - - + + + + + + + + + + + + + + + HighElfKey + 50000 + true + 300000 + false + 100000 + + + 2 + Blitzer + 7 + 3 + 4 + 8 + + Block + + 100000 + + General + Agility + + + Strength + Pass + + + + 2 + Thrower + 6 + 3 + 4 + 8 + + Safe Throw + Pass + + 90000 + + General + Pass + Agility + + + Strength + + + + 4 + Catcher + 8 + 3 + 4 + 7 + + Catch + + 90000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 6 + 3 + 4 + 8 + + + 70000 + + General + Agility + + + Strength + Pass + + + + + + diff --git a/src/teamma/rules/lrb6/humans.xml b/src/teamma/rules/lrb6/humans.xml index c6536281..8011f13e 100644 --- a/src/teamma/rules/lrb6/humans.xml +++ b/src/teamma/rules/lrb6/humans.xml @@ -1,129 +1,137 @@ - - - - - - - HumanKey - 50000 - true - 300000 - false - 100000 - - - 4 - Blitzer - 7 - 3 - 3 - 8 - - Block - - 90000 - - General - Strength - - - - - Pass - Agility - - - - 2 - Thrower - 6 - 3 - 3 - 8 - - Sure Hands - Pass - - 70000 - - General - Pass - - - Strength - Agility - - - - 4 - Catcher - 8 - 2 - 3 - 7 - - Dodge - Catch - - 70000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 6 - 3 - 2 - 8 - - - 50000 - - General - - - Strength - Pass - Agility - - - - 1 - Ogre - 5 - 5 - 2 - 9 - - Loner - Bone Head - Mighty Blow - Thick Skull - Throw Team-Mate - - 140000 - - Strength - - - General - - Pass - Agility - - - - - - + + + + + + + + + + + + + + + HumanKey + 50000 + true + 300000 + false + 100000 + + + 4 + Blitzer + 7 + 3 + 3 + 8 + + Block + + 90000 + + General + Strength + + + + + Pass + Agility + + + + 2 + Thrower + 6 + 3 + 3 + 8 + + Sure Hands + Pass + + 70000 + + General + Pass + + + Strength + Agility + + + + 4 + Catcher + 8 + 2 + 3 + 7 + + Dodge + Catch + + 70000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 6 + 3 + 2 + 8 + + + 50000 + + General + + + Strength + Pass + Agility + + + + 1 + Ogre + 5 + 5 + 2 + 9 + + Loner + Bone Head + Mighty Blow + Thick Skull + Throw Team-Mate + + 140000 + + Strength + + + General + + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/khemris.xml b/src/teamma/rules/lrb6/khemris.xml index 406ff60c..552f636b 100644 --- a/src/teamma/rules/lrb6/khemris.xml +++ b/src/teamma/rules/lrb6/khemris.xml @@ -1,108 +1,116 @@ - - - - - - - KhemriKey - 70000 - false - 300000 - false - 100000 - - - 4 - Tomb Guardian - 4 - 5 - 1 - 9 - - Regeneration - Decay - - 100000 - - - Strength - - - - General - Pass - Agility - - - - 2 - Thro-Ra - 6 - 3 - 2 - 7 - - Sure Hands - Pass - Regeneration - - 70000 - - General - Pass - - - Strength - Agility - - - - 2 - Blitz-Ra - 6 - 3 - 2 - 8 - - Block - Regeneration - - 90000 - - General - Strength - - - Agility - Pass - - - - 16 - Skeleton - 5 - 3 - 2 - 7 - - Regeneration - Thick Skull - - 40000 - - General - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + KhemriKey + 70000 + false + 300000 + false + 100000 + + + 4 + Tomb Guardian + 4 + 5 + 1 + 9 + + Regeneration + Decay + + 100000 + + + Strength + + + + General + Pass + Agility + + + + 2 + Thro-Ra + 6 + 3 + 2 + 7 + + Sure Hands + Pass + Regeneration + + 70000 + + General + Pass + + + Strength + Agility + + + + 2 + Blitz-Ra + 6 + 3 + 2 + 8 + + Block + Regeneration + + 90000 + + General + Strength + + + Agility + Pass + + + + 16 + Skeleton + 5 + 3 + 2 + 7 + + Regeneration + Thick Skull + + 40000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/khornesdaemons.xml b/src/teamma/rules/lrb6/khornesdaemons.xml index 3379c4a3..b0a49cfa 100644 --- a/src/teamma/rules/lrb6/khornesdaemons.xml +++ b/src/teamma/rules/lrb6/khornesdaemons.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + KhornesDaemonsKey 70000 true diff --git a/src/teamma/rules/lrb6/lizardmen.xml b/src/teamma/rules/lrb6/lizardmen.xml index c0a3dbe3..19c589f1 100644 --- a/src/teamma/rules/lrb6/lizardmen.xml +++ b/src/teamma/rules/lrb6/lizardmen.xml @@ -1,86 +1,94 @@ - - - - - - - LizardmenKey - 60000 - true - 300000 - false - 100000 - - - 6 - Saurus - 6 - 4 - 1 - 9 - - - 80000 - - General - Strength - - - Agility - Pass - - - - 16 - Skink - 8 - 2 - 3 - 7 - - Dodge - Stunty - - 60000 - - - Agility - - - General - Pass - Strength - - - - 1 - Kroxigor - 6 - 5 - 1 - 9 - - Loner - Mighty Blow - Bone Head - Thick Skull - Prehensile Tail - - 140000 - - Strength - - - General - Agility - Pass - - - - - - + + + + + + + + + + + + + + + LizardmenKey + 60000 + true + 300000 + false + 100000 + + + 6 + Saurus + 6 + 4 + 1 + 9 + + + 80000 + + General + Strength + + + Agility + Pass + + + + 16 + Skink + 8 + 2 + 3 + 7 + + Dodge + Stunty + + 60000 + + + Agility + + + General + Pass + Strength + + + + 1 + Kroxigor + 6 + 5 + 1 + 9 + + Loner + Mighty Blow + Bone Head + Thick Skull + Prehensile Tail + + 140000 + + Strength + + + General + Agility + Pass + + + + + + diff --git a/src/teamma/rules/lrb6/necromantics.xml b/src/teamma/rules/lrb6/necromantics.xml index ae8a4056..640d4c6c 100644 --- a/src/teamma/rules/lrb6/necromantics.xml +++ b/src/teamma/rules/lrb6/necromantics.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + NecromanticKey 70000 false diff --git a/src/teamma/rules/lrb6/norses.xml b/src/teamma/rules/lrb6/norses.xml index ad7e0e7e..8e4d9c15 100644 --- a/src/teamma/rules/lrb6/norses.xml +++ b/src/teamma/rules/lrb6/norses.xml @@ -1,149 +1,157 @@ - - - - - - - NorseKey - 60000 - true - 300000 - false - 100000 - - - 1 - Yeti - 5 - 5 - 2 - 8 - - Loner - Wild Animal - Claw - Frenzy - Disturbing Presence - - 140000 - - Strength - - - General - Agility - Pass - - - - 2 - Ulfwerner - 6 - 4 - 2 - 8 - - Frenzy - - 110000 - - General - Strength - - - Pass - Agility - - - - 2 - Berserker - 6 - 3 - 3 - 7 - - Block - Jump Up - Frenzy - - 90000 - - General - Strength - - - Agility - Pass - - - - 2 - Runner - 7 - 3 - 3 - 7 - - Block - Dauntless - - 90000 - - General - Agility - - - Strength - Pass - - - - 2 - Thrower - 6 - 3 - 3 - 7 - - Block - Pass - - 70000 - - General - Pass - - - Strength - Agility - - - - 16 - Lineman - 6 - 3 - 3 - 7 - - Block - - 50000 - - General - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + NorseKey + 60000 + true + 300000 + false + 100000 + + + 1 + Yeti + 5 + 5 + 2 + 8 + + Loner + Wild Animal + Claw + Frenzy + Disturbing Presence + + 140000 + + Strength + + + General + Agility + Pass + + + + 2 + Ulfwerner + 6 + 4 + 2 + 8 + + Frenzy + + 110000 + + General + Strength + + + Pass + Agility + + + + 2 + Berserker + 6 + 3 + 3 + 7 + + Block + Jump Up + Frenzy + + 90000 + + General + Strength + + + Agility + Pass + + + + 2 + Runner + 7 + 3 + 3 + 7 + + Block + Dauntless + + 90000 + + General + Agility + + + Strength + Pass + + + + 2 + Thrower + 6 + 3 + 3 + 7 + + Block + Pass + + 70000 + + General + Pass + + + Strength + Agility + + + + 16 + Lineman + 6 + 3 + 3 + 7 + + Block + + 50000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/nurgle.xml b/src/teamma/rules/lrb6/nurgle.xml index 03a41b8f..43c6bdcf 100644 --- a/src/teamma/rules/lrb6/nurgle.xml +++ b/src/teamma/rules/lrb6/nurgle.xml @@ -1,117 +1,125 @@ - - - - - - - NurgleKey - 70000 - false - 300000 - true - 100000 - - - 4 - Nurgle's Warrior - 4 - 4 - 2 - 9 - - Disturbing Presence - Foul Appearance - Nurgle's Rot - Regeneration - - 110000 - - General - Strength - Mutation - - - Pass - Agility - - - - 4 - Pestigor - 6 - 3 - 3 - 8 - - Horns - Nurgle's Rot - Regeneration - - 80000 - - General - Strength - Mutation - - - Pass - Agility - - - - 1 - Nurgle's Beast - 4 - 5 - 1 - 9 - - Disturbing Presence - Foul Appearance - Nurgle's Rot - Regeneration - Loner - Really Stupid - Tentacles - Mighty Blow - - 140000 - - Strength - - - General - Agility - Pass - - - - 16 - Rotter - 5 - 3 - 3 - 8 - - Nurgle's Rot - Decay - - 40000 - - General - Mutation - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + NurgleKey + 70000 + false + 300000 + true + 100000 + + + 4 + Nurgle's Warrior + 4 + 4 + 2 + 9 + + Disturbing Presence + Foul Appearance + Nurgle's Rot + Regeneration + + 110000 + + General + Strength + Mutation + + + Pass + Agility + + + + 4 + Pestigor + 6 + 3 + 3 + 8 + + Horns + Nurgle's Rot + Regeneration + + 80000 + + General + Strength + Mutation + + + Pass + Agility + + + + 1 + Nurgle's Beast + 4 + 5 + 1 + 9 + + Disturbing Presence + Foul Appearance + Nurgle's Rot + Regeneration + Loner + Really Stupid + Tentacles + Mighty Blow + + 140000 + + Strength + + + General + Agility + Pass + + + + 16 + Rotter + 5 + 3 + 3 + 8 + + Nurgle's Rot + Decay + + 40000 + + General + Mutation + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/ogres.xml b/src/teamma/rules/lrb6/ogres.xml index 566f957b..e3d53d39 100644 --- a/src/teamma/rules/lrb6/ogres.xml +++ b/src/teamma/rules/lrb6/ogres.xml @@ -1,70 +1,78 @@ - - - - - - - OgreKey - 70000 - true - 300000 - false - 100000 - - - 6 - Ogre - 5 - 5 - 2 - 9 - - Bone Head - Mighty Blow - Thick Skull - Throw Team-Mate - - 140000 - - Strength - - - General - - Pass - Agility - - - - - 16 - Snotling - 4 - 1 - 3 - 5 - - Dodge - Right Stuff - Stunty - Titchy - Side Step - - 20000 - - Agility - - - Strength - Pass - General - - - - - - + + + + + + + + + + + + + + + OgreKey + 70000 + true + 300000 + false + 100000 + + + 6 + Ogre + 5 + 5 + 2 + 9 + + Bone Head + Mighty Blow + Thick Skull + Throw Team-Mate + + 140000 + + Strength + + + General + + Pass + Agility + + + + + 16 + Snotling + 4 + 1 + 3 + 5 + + Dodge + Right Stuff + Stunty + Titchy + Side Step + + 20000 + + Agility + + + Strength + Pass + General + + + + + + diff --git a/src/teamma/rules/lrb6/orcs.xml b/src/teamma/rules/lrb6/orcs.xml index d7841618..2e9e9c9a 100644 --- a/src/teamma/rules/lrb6/orcs.xml +++ b/src/teamma/rules/lrb6/orcs.xml @@ -1,147 +1,155 @@ - - - - - - - OrcKey - 60000 - true - 300000 - false - 100000 - - - 4 - Blitzer - 6 - 3 - 3 - 9 - - Block - - 80000 - - General - Strength - - - Agility - Pass - - - - 4 - Black Orc Blocker - 4 - 4 - 2 - 9 - - - 80000 - - General - Strength - - - Pass - Agility - - - - 4 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - - 40000 - - Agility - - - General - Strength - Pass - - - - 16 - Lineman - 5 - 3 - 3 - 9 - - - 50000 - - General - - - Strength - Pass - Agility - - - - 2 - Thrower - 5 - 3 - 3 - 8 - - Sure Hands - Pass - - 70000 - - General - Pass - - - Strength - Agility - - - - 1 - Troll - 4 - 5 - 1 - 9 - - Loner - Really Stupid - Always Hungry - Mighty Blow - Regeneration - Throw Team-Mate - - 110000 - - Strength - - - General - Pass - Agility - - - - - - + + + + + + + + + + + + + + + OrcKey + 60000 + true + 300000 + false + 100000 + + + 4 + Blitzer + 6 + 3 + 3 + 9 + + Block + + 80000 + + General + Strength + + + Agility + Pass + + + + 4 + Black Orc Blocker + 4 + 4 + 2 + 9 + + + 80000 + + General + Strength + + + Pass + Agility + + + + 4 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + + 40000 + + Agility + + + General + Strength + Pass + + + + 16 + Lineman + 5 + 3 + 3 + 9 + + + 50000 + + General + + + Strength + Pass + Agility + + + + 2 + Thrower + 5 + 3 + 3 + 8 + + Sure Hands + Pass + + 70000 + + General + Pass + + + Strength + Agility + + + + 1 + Troll + 4 + 5 + 1 + 9 + + Loner + Really Stupid + Always Hungry + Mighty Blow + Regeneration + Throw Team-Mate + + 110000 + + Strength + + + General + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/skavens.xml b/src/teamma/rules/lrb6/skavens.xml index be42feac..7a5accb1 100644 --- a/src/teamma/rules/lrb6/skavens.xml +++ b/src/teamma/rules/lrb6/skavens.xml @@ -7,7 +7,15 @@ and open the template in the editor. - + + + + + + + + + SkavenKey 60000 true diff --git a/src/teamma/rules/lrb6/slanns.xml b/src/teamma/rules/lrb6/slanns.xml index f9bf334c..b0fcbf69 100644 --- a/src/teamma/rules/lrb6/slanns.xml +++ b/src/teamma/rules/lrb6/slanns.xml @@ -1,111 +1,119 @@ - - - - - - - SlannKey - 50000 - true - 300000 - false - 100000 - - - 4 - Blitzer - 7 - 3 - 3 - 8 - - Diving Tackle - Jump Up - Leap - Very Long Legs - - 110000 - - General - Strength - Agility - - - Pass - - - - 4 - Catcher - 7 - 2 - 4 - 7 - - Diving Catch - Leap - Very Long Legs - - 80000 - - General - Agility - - - Pass - Strength - - - - 1 - Kroxigor - 6 - 5 - 1 - 9 - - Loner - Mighty Blow - Bone Head - Thick Skull - Prehensile Tail - - 140000 - - Strength - - - General - Agility - Pass - - - - 16 - Lineman - 6 - 3 - 3 - 6 - - Leap - Very Long Legs - - 60000 - - General - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + SlannKey + 50000 + true + 300000 + false + 100000 + + + 4 + Blitzer + 7 + 3 + 3 + 8 + + Diving Tackle + Jump Up + Leap + Very Long Legs + + 110000 + + General + Strength + Agility + + + Pass + + + + 4 + Catcher + 7 + 2 + 4 + 7 + + Diving Catch + Leap + Very Long Legs + + 80000 + + General + Agility + + + Pass + Strength + + + + 1 + Kroxigor + 6 + 5 + 1 + 9 + + Loner + Mighty Blow + Bone Head + Thick Skull + Prehensile Tail + + 140000 + + Strength + + + General + Agility + Pass + + + + 16 + Lineman + 6 + 3 + 3 + 6 + + Leap + Very Long Legs + + 60000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/undeads.xml b/src/teamma/rules/lrb6/undeads.xml index 93caf633..ace4844a 100644 --- a/src/teamma/rules/lrb6/undeads.xml +++ b/src/teamma/rules/lrb6/undeads.xml @@ -1,124 +1,132 @@ - - - - - - - UndeadKey - 70000 - false - 300000 - true - 100000 - - - 2 - Mummy - 3 - 5 - 1 - 9 - - Mighty Blow - Regeneration - - 120000 - - Strength - - - General - Pass - Agility - - - - 2 - Wigth - 6 - 3 - 3 - 8 - - Block - Regeneration - - 90000 - - General - Strength - - - Pass - Agility - - - - 4 - Ghoul - 7 - 3 - 3 - 7 - - Dodge - - 70000 - - General - Agility - - - Strength - Pass - - - - 16 - Zombie - 4 - 3 - 2 - 8 - - Regeneration - - 40000 - - General - - - Strength - Pass - Agility - - - - 16 - Skeleton - 5 - 3 - 2 - 7 - - Regeneration - Thick Skull - - 40000 - - General - - - Strength - Pass - Agility - - - - - - + + + + + + + + + + + + + + + UndeadKey + 70000 + false + 300000 + true + 100000 + + + 2 + Mummy + 3 + 5 + 1 + 9 + + Mighty Blow + Regeneration + + 120000 + + Strength + + + General + Pass + Agility + + + + 2 + Wigth + 6 + 3 + 3 + 8 + + Block + Regeneration + + 90000 + + General + Strength + + + Pass + Agility + + + + 4 + Ghoul + 7 + 3 + 3 + 7 + + Dodge + + 70000 + + General + Agility + + + Strength + Pass + + + + 16 + Zombie + 4 + 3 + 2 + 8 + + Regeneration + + 40000 + + General + + + Strength + Pass + Agility + + + + 16 + Skeleton + 5 + 3 + 2 + 7 + + Regeneration + Thick Skull + + 40000 + + General + + + Strength + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/underworld.xml b/src/teamma/rules/lrb6/underworld.xml index 76a03629..b665079f 100644 --- a/src/teamma/rules/lrb6/underworld.xml +++ b/src/teamma/rules/lrb6/underworld.xml @@ -1,136 +1,144 @@ - - - - - - - UnderworldKey - 70000 - true - 300000 - false - 50000 - - - 16 - Goblin - 6 - 2 - 3 - 7 - - Dodge - Stunty - Right Stuff - - 40000 - - Mutation - Agility - - - Pass - General - Strength - - - - 2 - Skaven Linerat - 7 - 3 - 3 - 7 - - Animosity - - 50000 - - General - Mutation - - - Strength - Agility - Pass - - - - 2 - Skaven Thrower - 7 - 3 - 3 - 7 - - Sure Hands - Animosity - Pass - - 70000 - - General - Pass - Mutation - - - Strength - Agility - - - - 2 - Stormvermin - 7 - 3 - 3 - 8 - - Block - Animosity - - 90000 - - General - Strength - Mutation - - - Pass - Agility - - - - 1 - Warpstone Troll - 4 - 5 - 1 - 9 - - Loner - Always Hungry - Mighty Blow - Really Stupid - Regeneration - Throw Team-Mate - - 110000 - - Strength - Mutation - - - General - Pass - Agility - - - - - - + + + + + + + + + + + + + + + UnderworldKey + 70000 + true + 300000 + false + 50000 + + + 16 + Goblin + 6 + 2 + 3 + 7 + + Dodge + Stunty + Right Stuff + + 40000 + + Mutation + Agility + + + Pass + General + Strength + + + + 2 + Skaven Linerat + 7 + 3 + 3 + 7 + + Animosity + + 50000 + + General + Mutation + + + Strength + Agility + Pass + + + + 2 + Skaven Thrower + 7 + 3 + 3 + 7 + + Sure Hands + Animosity + Pass + + 70000 + + General + Pass + Mutation + + + Strength + Agility + + + + 2 + Stormvermin + 7 + 3 + 3 + 8 + + Block + Animosity + + 90000 + + General + Strength + Mutation + + + Pass + Agility + + + + 1 + Warpstone Troll + 4 + 5 + 1 + 9 + + Loner + Always Hungry + Mighty Blow + Really Stupid + Regeneration + Throw Team-Mate + + 110000 + + Strength + Mutation + + + General + Pass + Agility + + + + + + diff --git a/src/teamma/rules/lrb6/vampires.xml b/src/teamma/rules/lrb6/vampires.xml index fdf10cf2..8cd4ca9e 100644 --- a/src/teamma/rules/lrb6/vampires.xml +++ b/src/teamma/rules/lrb6/vampires.xml @@ -1,62 +1,70 @@ - - - - - - - VampireKey - 70000 - false - 300000 - true - 100000 - - - 6 - Vampires - 6 - 4 - 4 - 8 - - Regeneration - Hypnotic Gaze - Blood Lust - - 110000 - - General - Strength - Agility - - - Pass - - - - 16 - Thrall - 6 - 3 - 3 - 7 - - - 40000 - - General - - - Pass - Agility - Strength - - - - - - + + + + + + + + + + + + + + + VampireKey + 70000 + false + 300000 + true + 100000 + + + 6 + Vampires + 6 + 4 + 4 + 8 + + Regeneration + Hypnotic Gaze + Blood Lust + + 110000 + + General + Strength + Agility + + + Pass + + + + 16 + Thrall + 6 + 3 + 3 + 7 + + + 40000 + + General + + + Pass + Agility + Strength + + + + + + diff --git a/src/teamma/rules/lrb6/woodelves.xml b/src/teamma/rules/lrb6/woodelves.xml index f72dc596..56226ce6 100644 --- a/src/teamma/rules/lrb6/woodelves.xml +++ b/src/teamma/rules/lrb6/woodelves.xml @@ -1,130 +1,138 @@ - - - - - - - WoodElfKey - 50000 - true - 300000 - false - 100000 - - - 2 - Wardanser - 8 - 3 - 4 - 7 - - Dodge - Block - Leap - - 120000 - - General - Agility - - - Pass - Strength - - - - 2 - Thrower - 7 - 3 - 4 - 7 - - Pass - - 90000 - - General - Pass - Agility - - - Strength - - - - 4 - Catcher - 8 - 2 - 4 - 7 - - Dodge - Catch - Sprint - - 90000 - - General - Agility - - - Strength - Pass - - - - 16 - Lineman - 7 - 3 - 4 - 7 - - - 70000 - - General - Agility - - - Strength - Pass - - - - 1 - Treeman - 2 - 6 - 1 - 10 - - Take Roots - Loner - Stand Firm - Mighty Blow - Thick Skull - Strong Arm - Throw Team-Mate - - 120000 - - Strength - - - General - Agility - Pass - - - - - - + + + + + + + + + + + + + + + WoodElfKey + 50000 + true + 300000 + false + 100000 + + + 2 + Wardanser + 8 + 3 + 4 + 7 + + Dodge + Block + Leap + + 120000 + + General + Agility + + + Pass + Strength + + + + 2 + Thrower + 7 + 3 + 4 + 7 + + Pass + + 90000 + + General + Pass + Agility + + + Strength + + + + 4 + Catcher + 8 + 2 + 4 + 7 + + Dodge + Catch + Sprint + + 90000 + + General + Agility + + + Strength + Pass + + + + 16 + Lineman + 7 + 3 + 4 + 7 + + + 70000 + + General + Agility + + + Strength + Pass + + + + 1 + Treeman + 2 + 6 + 1 + 10 + + Take Roots + Loner + Stand Firm + Mighty Blow + Thick Skull + Strong Arm + Throw Team-Mate + + 120000 + + Strength + + + General + Agility + Pass + + + + + + diff --git a/src/teamma/views/JdgRoster.form b/src/teamma/views/JdgRoster.form index 63e195eb..8d4b4914 100644 --- a/src/teamma/views/JdgRoster.form +++ b/src/teamma/views/JdgRoster.form @@ -472,7 +472,7 @@ - + @@ -497,1840 +497,8 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/teamma/views/JdgRoster.java b/src/teamma/views/JdgRoster.java index 3b6da7f7..4b7765fb 100644 --- a/src/teamma/views/JdgRoster.java +++ b/src/teamma/views/JdgRoster.java @@ -8,6 +8,7 @@ import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; +import java.awt.GridBagLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; @@ -21,13 +22,18 @@ import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; import javax.swing.JFileChooser; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.JSpinner; import javax.swing.filechooser.FileFilter; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; +import teamma.data.InducementType; import teamma.data.LRB; import teamma.data.Player; import teamma.data.PlayerType; @@ -52,8 +58,8 @@ public final class JdgRoster extends javax.swing.JDialog { private Roster _data = null; private Coach _coach = null; - private LRB.E_Version lrbversion = LRB.E_Version.NAF2017; - private LRB _lrb = LRB.getLRB(LRB.E_Version.NAF2017); + private LRB.E_Version lrbversion = LRB.E_Version.BB2016; + private LRB _lrb = LRB.getLRB(LRB.E_Version.BB2016); /** * Creates new form JdgRoster @@ -108,7 +114,7 @@ public JdgRoster(java.awt.Frame parent, Coach coach, Roster roster, boolean moda if (roster != null) { lrbversion = roster.getVersion(); } else { - lrbversion = LRB.E_Version.NAF2017; + lrbversion = LRB.E_Version.BB2016; } update(); @@ -124,7 +130,6 @@ public JdgRoster(java.awt.Frame parent, Coach coach, Roster roster, boolean moda @SuppressWarnings({"unchecked", "PMD"}) // //GEN-BEGIN:initComponents private void initComponents() { - java.awt.GridBagConstraints gridBagConstraints; jtpGoods = new javax.swing.JTabbedPane(); jPanel14 = new javax.swing.JPanel(); @@ -169,124 +174,7 @@ private void initComponents() { jlbX20 = new javax.swing.JLabel(); jlbCostApothecary = new javax.swing.JLabel(); jPanel19 = new javax.swing.JPanel(); - jPanel8 = new javax.swing.JPanel(); - jPanel1 = new javax.swing.JPanel(); - jLabel2 = new javax.swing.JLabel(); - jslExtraReroll = new javax.swing.JSlider(); - jlbNbExtraReroll = new javax.swing.JLabel(); - jlbX = new javax.swing.JLabel(); - jlbPriceExtraReroll = new javax.swing.JLabel(); - jlbX1 = new javax.swing.JLabel(); - jlbCostExtraReroll = new javax.swing.JLabel(); - jPanel9 = new javax.swing.JPanel(); - jLabel3 = new javax.swing.JLabel(); - jslBribeTheRef = new javax.swing.JSlider(); - jlbNbBribeTheRef = new javax.swing.JLabel(); - jlbX2 = new javax.swing.JLabel(); - jlbPriceBribeTheRef = new javax.swing.JLabel(); - jlbX3 = new javax.swing.JLabel(); - jlbCostBribeTheRef = new javax.swing.JLabel(); - jPanel10 = new javax.swing.JPanel(); - jLabel4 = new javax.swing.JLabel(); - jslLocalApothecary = new javax.swing.JSlider(); - jlbNbLocalApothecary = new javax.swing.JLabel(); - jlbX4 = new javax.swing.JLabel(); - jlbPriceLocalApothecary = new javax.swing.JLabel(); - jlbX5 = new javax.swing.JLabel(); - jlbCostLocalApothecary = new javax.swing.JLabel(); - jPanel11 = new javax.swing.JPanel(); - jLabel5 = new javax.swing.JLabel(); - jslWizard = new javax.swing.JSlider(); - jlbNbWizard = new javax.swing.JLabel(); - jlbX6 = new javax.swing.JLabel(); - jlbPriceWizard = new javax.swing.JLabel(); - jlbX7 = new javax.swing.JLabel(); - jlbCostWizard = new javax.swing.JLabel(); - jPanel12 = new javax.swing.JPanel(); - jLabel6 = new javax.swing.JLabel(); - jslIgor = new javax.swing.JSlider(); - jlbNbIgor = new javax.swing.JLabel(); - jlbX8 = new javax.swing.JLabel(); - jlbPriceIgor = new javax.swing.JLabel(); - jlbX9 = new javax.swing.JLabel(); - jlbCostIgor = new javax.swing.JLabel(); - jPanel13 = new javax.swing.JPanel(); - jLabel7 = new javax.swing.JLabel(); - jslCardBudget = new javax.swing.JSlider(); - jlbX11 = new javax.swing.JLabel(); - jlbCostCard = new javax.swing.JLabel(); - jPanel21 = new javax.swing.JPanel(); - jlbBabes = new javax.swing.JLabel(); - jslBabes = new javax.swing.JSlider(); - jlbNbBabes = new javax.swing.JLabel(); - jlbX12 = new javax.swing.JLabel(); - jlbPriceBabes = new javax.swing.JLabel(); - jlbX13 = new javax.swing.JLabel(); - jlbCostBabes = new javax.swing.JLabel(); - jPanel23 = new javax.swing.JPanel(); - jlChef = new javax.swing.JLabel(); - jslChef = new javax.swing.JSlider(); - jlbNbChef = new javax.swing.JLabel(); - jlbX14 = new javax.swing.JLabel(); - jlbPriceChef = new javax.swing.JLabel(); - jlbX15 = new javax.swing.JLabel(); - jlbCostChef = new javax.swing.JLabel(); - jPanel24 = new javax.swing.JPanel(); - jlbChaosWizard = new javax.swing.JLabel(); - jslChaosWizard = new javax.swing.JSlider(); - jlbNbChaosWizard = new javax.swing.JLabel(); - jlbX16 = new javax.swing.JLabel(); - jlbPriceChaosWizard = new javax.swing.JLabel(); - jlbX17 = new javax.swing.JLabel(); - jlbCostChaosWizard = new javax.swing.JLabel(); - jPanel25 = new javax.swing.JPanel(); - jlbHoratio = new javax.swing.JLabel(); - jslHoratio = new javax.swing.JSlider(); - jlbNbHoratio = new javax.swing.JLabel(); - jlbX18 = new javax.swing.JLabel(); - jlbPriceHoratio = new javax.swing.JLabel(); - jlbX19 = new javax.swing.JLabel(); - jlbCostHoratio = new javax.swing.JLabel(); - jPanel26 = new javax.swing.JPanel(); - jlbKari = new javax.swing.JLabel(); - jslKari = new javax.swing.JSlider(); - jlbNbKari = new javax.swing.JLabel(); - jlbX21 = new javax.swing.JLabel(); - jlbPriceKari = new javax.swing.JLabel(); - jlbX22 = new javax.swing.JLabel(); - jlbCostKari = new javax.swing.JLabel(); - jPanel27 = new javax.swing.JPanel(); - jlbFink = new javax.swing.JLabel(); - jslFink = new javax.swing.JSlider(); - jlbNbFink = new javax.swing.JLabel(); - jlbX23 = new javax.swing.JLabel(); - jlbPriceFink = new javax.swing.JLabel(); - jlbX24 = new javax.swing.JLabel(); - jlbCostFink = new javax.swing.JLabel(); - jPanel28 = new javax.swing.JPanel(); - jlbPapa = new javax.swing.JLabel(); - jslPapa = new javax.swing.JSlider(); - jlbNbPapa = new javax.swing.JLabel(); - jlbX25 = new javax.swing.JLabel(); - jlbPricePapa = new javax.swing.JLabel(); - jlbX26 = new javax.swing.JLabel(); - jlbCostPapa = new javax.swing.JLabel(); - jPanel29 = new javax.swing.JPanel(); - jlbGalandril = new javax.swing.JLabel(); - jslGalandril = new javax.swing.JSlider(); - jlbNbGalandril = new javax.swing.JLabel(); - jlbX27 = new javax.swing.JLabel(); - jlbPriceGalandril = new javax.swing.JLabel(); - jlbX28 = new javax.swing.JLabel(); - jlbCostGalandril = new javax.swing.JLabel(); - jPanel30 = new javax.swing.JPanel(); - jlbKrot = new javax.swing.JLabel(); - jslKrot = new javax.swing.JSlider(); - jlbNbKrot = new javax.swing.JLabel(); - jlbX29 = new javax.swing.JLabel(); - jlbPriceKrot = new javax.swing.JLabel(); - jlbX30 = new javax.swing.JLabel(); - jlbCostKrot = new javax.swing.JLabel(); + jpnInducements = new javax.swing.JPanel(); jPanel4 = new javax.swing.JPanel(); jScrollPane2 = new javax.swing.JScrollPane(); jtbStars = new javax.swing.JTable(); @@ -587,869 +475,10 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) { jtpGoods.addTab(bundle.getString("TeamGoods"), jPanel14); // NOI18N java.util.ResourceBundle bundle1 = java.util.ResourceBundle.getBundle("tourma/languages/language"); // NOI18N - jPanel8.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle1.getString("Mercenaires et Champions"))); // NOI18N - jPanel8.setPreferredSize(new java.awt.Dimension(200, 250)); - jPanel8.setLayout(new java.awt.GridLayout(5, 3)); - - jPanel1.setLayout(new java.awt.GridBagLayout()); - - jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel2.setText(bundle.getString("Extra Reroll")); // NOI18N - jLabel2.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel1.add(jLabel2, gridBagConstraints); - - jslExtraReroll.setMajorTickSpacing(2); - jslExtraReroll.setMaximum(4); - jslExtraReroll.setMinorTickSpacing(1); - jslExtraReroll.setPaintTicks(true); - jslExtraReroll.setSnapToTicks(true); - jslExtraReroll.setValue(0); - jslExtraReroll.setMaximumSize(new java.awt.Dimension(50, 23)); - jslExtraReroll.setMinimumSize(new java.awt.Dimension(30, 23)); - jslExtraReroll.setName("jslExtraReroll"); // NOI18N - jslExtraReroll.setPreferredSize(new java.awt.Dimension(50, 23)); - jslExtraReroll.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslExtraRerollStateChanged(evt); - } - }); - jPanel1.add(jslExtraReroll, new java.awt.GridBagConstraints()); - - jlbNbExtraReroll.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbExtraReroll.setLabelFor(jslExtraReroll); - jlbNbExtraReroll.setText("0"); - jlbNbExtraReroll.setName("jlbNbExtraReroll"); // NOI18N - jlbNbExtraReroll.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel1.add(jlbNbExtraReroll, new java.awt.GridBagConstraints()); - - jlbX.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX.setText("x"); - jlbX.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel1.add(jlbX, new java.awt.GridBagConstraints()); - - jlbPriceExtraReroll.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceExtraReroll.setText("100 000"); - jlbPriceExtraReroll.setName("jlbPriceExtraReroll"); // NOI18N - jlbPriceExtraReroll.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel1.add(jlbPriceExtraReroll, new java.awt.GridBagConstraints()); - - jlbX1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX1.setText("="); - jlbX1.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel1.add(jlbX1, new java.awt.GridBagConstraints()); - - jlbCostExtraReroll.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostExtraReroll.setText("0"); - jlbCostExtraReroll.setName("jlbCostExtraReroll"); // NOI18N - jlbCostExtraReroll.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel1.add(jlbCostExtraReroll, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel1); - - jPanel9.setLayout(new java.awt.GridBagLayout()); - - jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel3.setText(bundle.getString("Bribe the Ref")); // NOI18N - jLabel3.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel9.add(jLabel3, gridBagConstraints); - - jslBribeTheRef.setMajorTickSpacing(2); - jslBribeTheRef.setMaximum(4); - jslBribeTheRef.setMinorTickSpacing(1); - jslBribeTheRef.setPaintTicks(true); - jslBribeTheRef.setSnapToTicks(true); - jslBribeTheRef.setValue(0); - jslBribeTheRef.setMaximumSize(new java.awt.Dimension(50, 23)); - jslBribeTheRef.setMinimumSize(new java.awt.Dimension(30, 23)); - jslBribeTheRef.setName("jslBribeTheRef"); // NOI18N - jslBribeTheRef.setPreferredSize(new java.awt.Dimension(50, 23)); - jslBribeTheRef.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslBribeTheRefStateChanged(evt); - } - }); - jPanel9.add(jslBribeTheRef, new java.awt.GridBagConstraints()); - - jlbNbBribeTheRef.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbBribeTheRef.setLabelFor(jslBribeTheRef); - jlbNbBribeTheRef.setText("0"); - jlbNbBribeTheRef.setName("jlbNbBribeTheRef"); // NOI18N - jlbNbBribeTheRef.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel9.add(jlbNbBribeTheRef, new java.awt.GridBagConstraints()); - - jlbX2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX2.setText("x"); - jlbX2.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel9.add(jlbX2, new java.awt.GridBagConstraints()); - - jlbPriceBribeTheRef.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceBribeTheRef.setText("100 000"); - jlbPriceBribeTheRef.setName("jlbPriceBribeTheRef"); // NOI18N - jlbPriceBribeTheRef.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel9.add(jlbPriceBribeTheRef, new java.awt.GridBagConstraints()); - - jlbX3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX3.setText("="); - jlbX3.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel9.add(jlbX3, new java.awt.GridBagConstraints()); - - jlbCostBribeTheRef.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostBribeTheRef.setText("0"); - jlbCostBribeTheRef.setName("jlbCostBribeTheRef"); // NOI18N - jlbCostBribeTheRef.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel9.add(jlbCostBribeTheRef, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel9); - - jPanel10.setLayout(new java.awt.GridBagLayout()); - - jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel4.setText(bundle.getString("Local Apothecary")); // NOI18N - jLabel4.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel10.add(jLabel4, gridBagConstraints); - - jslLocalApothecary.setMajorTickSpacing(2); - jslLocalApothecary.setMaximum(4); - jslLocalApothecary.setMinorTickSpacing(1); - jslLocalApothecary.setPaintTicks(true); - jslLocalApothecary.setSnapToTicks(true); - jslLocalApothecary.setValue(0); - jslLocalApothecary.setMaximumSize(new java.awt.Dimension(50, 23)); - jslLocalApothecary.setMinimumSize(new java.awt.Dimension(30, 23)); - jslLocalApothecary.setName("jslLocalApothecary"); // NOI18N - jslLocalApothecary.setPreferredSize(new java.awt.Dimension(50, 23)); - jslLocalApothecary.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslLocalApothecaryStateChanged(evt); - } - }); - jPanel10.add(jslLocalApothecary, new java.awt.GridBagConstraints()); - - jlbNbLocalApothecary.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbLocalApothecary.setLabelFor(jslLocalApothecary); - jlbNbLocalApothecary.setText("0"); - jlbNbLocalApothecary.setName("jlbNbLocalApothecary"); // NOI18N - jlbNbLocalApothecary.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel10.add(jlbNbLocalApothecary, new java.awt.GridBagConstraints()); - - jlbX4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX4.setText("x"); - jlbX4.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel10.add(jlbX4, new java.awt.GridBagConstraints()); - - jlbPriceLocalApothecary.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceLocalApothecary.setText("100 000"); - jlbPriceLocalApothecary.setName("jlbPriceLocalApothecary"); // NOI18N - jlbPriceLocalApothecary.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel10.add(jlbPriceLocalApothecary, new java.awt.GridBagConstraints()); - - jlbX5.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX5.setText("="); - jlbX5.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel10.add(jlbX5, new java.awt.GridBagConstraints()); - - jlbCostLocalApothecary.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostLocalApothecary.setText("0"); - jlbCostLocalApothecary.setName("jlbCostLocalApothecary"); // NOI18N - jlbCostLocalApothecary.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel10.add(jlbCostLocalApothecary, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel10); - - jPanel11.setLayout(new java.awt.GridBagLayout()); - - jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel5.setText(bundle.getString("Wizard")); // NOI18N - jLabel5.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel11.add(jLabel5, gridBagConstraints); - - jslWizard.setMajorTickSpacing(1); - jslWizard.setMaximum(1); - jslWizard.setPaintTicks(true); - jslWizard.setSnapToTicks(true); - jslWizard.setValue(0); - jslWizard.setMaximumSize(new java.awt.Dimension(50, 23)); - jslWizard.setMinimumSize(new java.awt.Dimension(30, 23)); - jslWizard.setName("jslWizard"); // NOI18N - jslWizard.setPreferredSize(new java.awt.Dimension(50, 23)); - jslWizard.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslWizardStateChanged(evt); - } - }); - jPanel11.add(jslWizard, new java.awt.GridBagConstraints()); - - jlbNbWizard.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbWizard.setLabelFor(jslWizard); - jlbNbWizard.setText("0"); - jlbNbWizard.setName("jlbNbWizard"); // NOI18N - jlbNbWizard.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel11.add(jlbNbWizard, new java.awt.GridBagConstraints()); - - jlbX6.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX6.setText("x"); - jlbX6.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel11.add(jlbX6, new java.awt.GridBagConstraints()); - - jlbPriceWizard.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceWizard.setText("150 000"); - jlbPriceWizard.setName("jlbPriceWizard"); // NOI18N - jlbPriceWizard.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel11.add(jlbPriceWizard, new java.awt.GridBagConstraints()); - - jlbX7.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX7.setText("="); - jlbX7.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel11.add(jlbX7, new java.awt.GridBagConstraints()); - - jlbCostWizard.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostWizard.setText("0"); - jlbCostWizard.setName("jlbCostWizard"); // NOI18N - jlbCostWizard.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel11.add(jlbCostWizard, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel11); - - jPanel12.setLayout(new java.awt.GridBagLayout()); - - jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel6.setText(bundle.getString("Igor")); // NOI18N - jLabel6.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel12.add(jLabel6, gridBagConstraints); - - jslIgor.setMajorTickSpacing(1); - jslIgor.setMaximum(1); - jslIgor.setMinorTickSpacing(1); - jslIgor.setPaintTicks(true); - jslIgor.setSnapToTicks(true); - jslIgor.setValue(0); - jslIgor.setMaximumSize(new java.awt.Dimension(50, 23)); - jslIgor.setMinimumSize(new java.awt.Dimension(30, 23)); - jslIgor.setName("jslIgor"); // NOI18N - jslIgor.setPreferredSize(new java.awt.Dimension(50, 23)); - jslIgor.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslIgorStateChanged(evt); - } - }); - jPanel12.add(jslIgor, new java.awt.GridBagConstraints()); - - jlbNbIgor.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbIgor.setLabelFor(jslIgor); - jlbNbIgor.setText("0"); - jlbNbIgor.setName("jlbNbIgor"); // NOI18N - jlbNbIgor.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel12.add(jlbNbIgor, new java.awt.GridBagConstraints()); - - jlbX8.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX8.setText("x"); - jlbX8.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel12.add(jlbX8, new java.awt.GridBagConstraints()); - - jlbPriceIgor.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceIgor.setText("100 000"); - jlbPriceIgor.setName("jlbPriceIgor"); // NOI18N - jlbPriceIgor.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel12.add(jlbPriceIgor, new java.awt.GridBagConstraints()); - - jlbX9.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX9.setText("="); - jlbX9.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel12.add(jlbX9, new java.awt.GridBagConstraints()); - - jlbCostIgor.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostIgor.setText("0"); - jlbCostIgor.setName("jlbCostIgor"); // NOI18N - jlbCostIgor.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel12.add(jlbCostIgor, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel12); - - jPanel13.setLayout(new java.awt.GridBagLayout()); - - jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel7.setText("Card Budget"); - jLabel7.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel13.add(jLabel7, gridBagConstraints); - - jslCardBudget.setMajorTickSpacing(200000); - jslCardBudget.setMaximum(1000000); - jslCardBudget.setMinorTickSpacing(50000); - jslCardBudget.setPaintTicks(true); - jslCardBudget.setSnapToTicks(true); - jslCardBudget.setValue(0); - jslCardBudget.setMaximumSize(new java.awt.Dimension(50, 23)); - jslCardBudget.setMinimumSize(new java.awt.Dimension(30, 23)); - jslCardBudget.setName("jslCardBudget"); // NOI18N - jslCardBudget.setPreferredSize(new java.awt.Dimension(155, 23)); - jslCardBudget.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslCardBudgetStateChanged(evt); - } - }); - jPanel13.add(jslCardBudget, new java.awt.GridBagConstraints()); - - jlbX11.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX11.setText("="); - jlbX11.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel13.add(jlbX11, new java.awt.GridBagConstraints()); - - jlbCostCard.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostCard.setLabelFor(jslCardBudget); - jlbCostCard.setText("0"); - jlbCostCard.setName("jlbCardBudget"); // NOI18N - jlbCostCard.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel13.add(jlbCostCard, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel13); - - jPanel21.setLayout(new java.awt.GridBagLayout()); - - jlbBabes.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbBabes.setText("Bloodweiser Babes"); - jlbBabes.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel21.add(jlbBabes, gridBagConstraints); - - jslBabes.setMajorTickSpacing(1); - jslBabes.setMaximum(2); - jslBabes.setPaintTicks(true); - jslBabes.setSnapToTicks(true); - jslBabes.setValue(0); - jslBabes.setMaximumSize(new java.awt.Dimension(50, 23)); - jslBabes.setMinimumSize(new java.awt.Dimension(30, 23)); - jslBabes.setName("jslBabes"); // NOI18N - jslBabes.setPreferredSize(new java.awt.Dimension(50, 23)); - jslBabes.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslBabesStateChanged(evt); - } - }); - jPanel21.add(jslBabes, new java.awt.GridBagConstraints()); - - jlbNbBabes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbBabes.setLabelFor(jslExtraReroll); - jlbNbBabes.setText("0"); - jlbNbBabes.setName("jlbNbBabes"); // NOI18N - jlbNbBabes.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel21.add(jlbNbBabes, new java.awt.GridBagConstraints()); - - jlbX12.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX12.setText("x"); - jlbX12.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel21.add(jlbX12, new java.awt.GridBagConstraints()); - - jlbPriceBabes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceBabes.setText("50 000"); - jlbPriceBabes.setName("jlbPriceBabes"); // NOI18N - jlbPriceBabes.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel21.add(jlbPriceBabes, new java.awt.GridBagConstraints()); - - jlbX13.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX13.setText("="); - jlbX13.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel21.add(jlbX13, new java.awt.GridBagConstraints()); - - jlbCostBabes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostBabes.setText("0"); - jlbCostBabes.setName("jlbCostBabes"); // NOI18N - jlbCostBabes.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel21.add(jlbCostBabes, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel21); - - jPanel23.setLayout(new java.awt.GridBagLayout()); - - jlChef.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlChef.setText("Halfling Chef"); - jlChef.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel23.add(jlChef, gridBagConstraints); - - jslChef.setMajorTickSpacing(1); - jslChef.setMaximum(1); - jslChef.setPaintTicks(true); - jslChef.setSnapToTicks(true); - jslChef.setValue(0); - jslChef.setMaximumSize(new java.awt.Dimension(50, 23)); - jslChef.setMinimumSize(new java.awt.Dimension(30, 23)); - jslChef.setName("jslChef"); // NOI18N - jslChef.setPreferredSize(new java.awt.Dimension(50, 23)); - jslChef.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslChefStateChanged(evt); - } - }); - jPanel23.add(jslChef, new java.awt.GridBagConstraints()); - - jlbNbChef.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbChef.setLabelFor(jslWizard); - jlbNbChef.setText("0"); - jlbNbChef.setName("jlbNbChef"); // NOI18N - jlbNbChef.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel23.add(jlbNbChef, new java.awt.GridBagConstraints()); - - jlbX14.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX14.setText("x"); - jlbX14.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel23.add(jlbX14, new java.awt.GridBagConstraints()); - - jlbPriceChef.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceChef.setText("0"); - jlbPriceChef.setName("jlbPriceChef"); // NOI18N - jlbPriceChef.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel23.add(jlbPriceChef, new java.awt.GridBagConstraints()); - - jlbX15.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX15.setText("="); - jlbX15.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel23.add(jlbX15, new java.awt.GridBagConstraints()); - - jlbCostChef.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostChef.setText("0"); - jlbCostChef.setName("jlbCostChef"); // NOI18N - jlbCostChef.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel23.add(jlbCostChef, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel23); - - jPanel24.setLayout(new java.awt.GridBagLayout()); - - jlbChaosWizard.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbChaosWizard.setText(bundle1.getString("ChaosWizard")); // NOI18N - jlbChaosWizard.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel24.add(jlbChaosWizard, gridBagConstraints); - - jslChaosWizard.setMajorTickSpacing(1); - jslChaosWizard.setMaximum(1); - jslChaosWizard.setPaintTicks(true); - jslChaosWizard.setSnapToTicks(true); - jslChaosWizard.setValue(0); - jslChaosWizard.setMaximumSize(new java.awt.Dimension(50, 23)); - jslChaosWizard.setMinimumSize(new java.awt.Dimension(30, 23)); - jslChaosWizard.setName("jslChef"); // NOI18N - jslChaosWizard.setPreferredSize(new java.awt.Dimension(50, 23)); - jslChaosWizard.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslChaosWizardStateChanged(evt); - } - }); - jPanel24.add(jslChaosWizard, new java.awt.GridBagConstraints()); - - jlbNbChaosWizard.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbChaosWizard.setLabelFor(jslWizard); - jlbNbChaosWizard.setText("0"); - jlbNbChaosWizard.setName("jlbNbChef"); // NOI18N - jlbNbChaosWizard.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel24.add(jlbNbChaosWizard, new java.awt.GridBagConstraints()); - - jlbX16.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX16.setText("x"); - jlbX16.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel24.add(jlbX16, new java.awt.GridBagConstraints()); - - jlbPriceChaosWizard.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceChaosWizard.setText("150 000"); - jlbPriceChaosWizard.setName("jlbPriceChef"); // NOI18N - jlbPriceChaosWizard.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel24.add(jlbPriceChaosWizard, new java.awt.GridBagConstraints()); - - jlbX17.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX17.setText("="); - jlbX17.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel24.add(jlbX17, new java.awt.GridBagConstraints()); - - jlbCostChaosWizard.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostChaosWizard.setText("0"); - jlbCostChaosWizard.setName("jlbCostChef"); // NOI18N - jlbCostChaosWizard.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel24.add(jlbCostChaosWizard, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel24); - - jPanel25.setLayout(new java.awt.GridBagLayout()); - - jlbHoratio.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbHoratio.setText(bundle1.getString("Horatio X. Schottenheim, Wizard Master")); // NOI18N - jlbHoratio.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel25.add(jlbHoratio, gridBagConstraints); - - jslHoratio.setMajorTickSpacing(1); - jslHoratio.setMaximum(1); - jslHoratio.setPaintTicks(true); - jslHoratio.setSnapToTicks(true); - jslHoratio.setValue(0); - jslHoratio.setMaximumSize(new java.awt.Dimension(50, 23)); - jslHoratio.setMinimumSize(new java.awt.Dimension(30, 23)); - jslHoratio.setName("jslChef"); // NOI18N - jslHoratio.setPreferredSize(new java.awt.Dimension(50, 23)); - jslHoratio.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslHoratioStateChanged(evt); - } - }); - jPanel25.add(jslHoratio, new java.awt.GridBagConstraints()); - - jlbNbHoratio.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbHoratio.setLabelFor(jslWizard); - jlbNbHoratio.setText("0"); - jlbNbHoratio.setName("jlbNbChef"); // NOI18N - jlbNbHoratio.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel25.add(jlbNbHoratio, new java.awt.GridBagConstraints()); - - jlbX18.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX18.setText("x"); - jlbX18.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel25.add(jlbX18, new java.awt.GridBagConstraints()); - - jlbPriceHoratio.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceHoratio.setText("80 000"); - jlbPriceHoratio.setName("jlbPriceChef"); // NOI18N - jlbPriceHoratio.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel25.add(jlbPriceHoratio, new java.awt.GridBagConstraints()); - - jlbX19.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX19.setText("="); - jlbX19.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel25.add(jlbX19, new java.awt.GridBagConstraints()); - - jlbCostHoratio.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostHoratio.setText("0"); - jlbCostHoratio.setName("jlbCostChef"); // NOI18N - jlbCostHoratio.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel25.add(jlbCostHoratio, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel25); - - jPanel26.setLayout(new java.awt.GridBagLayout()); - - jlbKari.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbKari.setText(bundle1.getString("Kari Coldstell, Norse cheerleader")); // NOI18N - jlbKari.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel26.add(jlbKari, gridBagConstraints); - - jslKari.setMajorTickSpacing(1); - jslKari.setMaximum(1); - jslKari.setPaintTicks(true); - jslKari.setSnapToTicks(true); - jslKari.setValue(0); - jslKari.setMaximumSize(new java.awt.Dimension(50, 23)); - jslKari.setMinimumSize(new java.awt.Dimension(30, 23)); - jslKari.setName("jslChef"); // NOI18N - jslKari.setPreferredSize(new java.awt.Dimension(50, 23)); - jslKari.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslKariStateChanged(evt); - } - }); - jPanel26.add(jslKari, new java.awt.GridBagConstraints()); - - jlbNbKari.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbKari.setLabelFor(jslWizard); - jlbNbKari.setText("0"); - jlbNbKari.setName("jlbNbChef"); // NOI18N - jlbNbKari.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel26.add(jlbNbKari, new java.awt.GridBagConstraints()); - - jlbX21.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX21.setText("x"); - jlbX21.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel26.add(jlbX21, new java.awt.GridBagConstraints()); - - jlbPriceKari.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceKari.setText("50 000"); - jlbPriceKari.setName("jlbPriceChef"); // NOI18N - jlbPriceKari.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel26.add(jlbPriceKari, new java.awt.GridBagConstraints()); - - jlbX22.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX22.setText("="); - jlbX22.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel26.add(jlbX22, new java.awt.GridBagConstraints()); - - jlbCostKari.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostKari.setText("0"); - jlbCostKari.setName("jlbCostChef"); // NOI18N - jlbCostKari.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel26.add(jlbCostKari, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel26); - - jPanel27.setLayout(new java.awt.GridBagLayout()); - - jlbFink.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbFink.setText(bundle1.getString("FinkDaFixer")); // NOI18N - jlbFink.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel27.add(jlbFink, gridBagConstraints); - - jslFink.setMajorTickSpacing(1); - jslFink.setMaximum(1); - jslFink.setPaintTicks(true); - jslFink.setSnapToTicks(true); - jslFink.setValue(0); - jslFink.setMaximumSize(new java.awt.Dimension(50, 23)); - jslFink.setMinimumSize(new java.awt.Dimension(30, 23)); - jslFink.setName("jslChef"); // NOI18N - jslFink.setPreferredSize(new java.awt.Dimension(50, 23)); - jslFink.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslFinkStateChanged(evt); - } - }); - jPanel27.add(jslFink, new java.awt.GridBagConstraints()); - - jlbNbFink.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbFink.setLabelFor(jslWizard); - jlbNbFink.setText("0"); - jlbNbFink.setName("jlbNbChef"); // NOI18N - jlbNbFink.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel27.add(jlbNbFink, new java.awt.GridBagConstraints()); - - jlbX23.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX23.setText("x"); - jlbX23.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel27.add(jlbX23, new java.awt.GridBagConstraints()); - - jlbPriceFink.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceFink.setText("50 000"); - jlbPriceFink.setName("jlbPriceChef"); // NOI18N - jlbPriceFink.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel27.add(jlbPriceFink, new java.awt.GridBagConstraints()); - - jlbX24.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX24.setText("="); - jlbX24.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel27.add(jlbX24, new java.awt.GridBagConstraints()); - - jlbCostFink.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostFink.setText("0"); - jlbCostFink.setName("jlbCostChef"); // NOI18N - jlbCostFink.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel27.add(jlbCostFink, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel27); - - jPanel28.setLayout(new java.awt.GridBagLayout()); - - jlbPapa.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbPapa.setText(bundle1.getString("PapaSkullbones")); // NOI18N - jlbPapa.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel28.add(jlbPapa, gridBagConstraints); - - jslPapa.setMajorTickSpacing(1); - jslPapa.setMaximum(1); - jslPapa.setPaintTicks(true); - jslPapa.setSnapToTicks(true); - jslPapa.setValue(0); - jslPapa.setMaximumSize(new java.awt.Dimension(50, 23)); - jslPapa.setMinimumSize(new java.awt.Dimension(30, 23)); - jslPapa.setName("jslChef"); // NOI18N - jslPapa.setPreferredSize(new java.awt.Dimension(50, 23)); - jslPapa.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslPapaStateChanged(evt); - } - }); - jPanel28.add(jslPapa, new java.awt.GridBagConstraints()); - - jlbNbPapa.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbPapa.setLabelFor(jslWizard); - jlbNbPapa.setText("0"); - jlbNbPapa.setName("jlbNbChef"); // NOI18N - jlbNbPapa.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel28.add(jlbNbPapa, new java.awt.GridBagConstraints()); - - jlbX25.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX25.setText("x"); - jlbX25.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel28.add(jlbX25, new java.awt.GridBagConstraints()); - - jlbPricePapa.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPricePapa.setText("80 000"); - jlbPricePapa.setName("jlbPriceChef"); // NOI18N - jlbPricePapa.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel28.add(jlbPricePapa, new java.awt.GridBagConstraints()); - - jlbX26.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX26.setText("="); - jlbX26.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel28.add(jlbX26, new java.awt.GridBagConstraints()); - - jlbCostPapa.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostPapa.setText("0"); - jlbCostPapa.setName("jlbCostChef"); // NOI18N - jlbCostPapa.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel28.add(jlbCostPapa, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel28); - - jPanel29.setLayout(new java.awt.GridBagLayout()); - - jlbGalandril.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbGalandril.setText(bundle1.getString("GalandrlSilverwater")); // NOI18N - jlbGalandril.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel29.add(jlbGalandril, gridBagConstraints); - - jslGalandril.setMajorTickSpacing(1); - jslGalandril.setMaximum(1); - jslGalandril.setPaintTicks(true); - jslGalandril.setSnapToTicks(true); - jslGalandril.setValue(0); - jslGalandril.setMaximumSize(new java.awt.Dimension(50, 23)); - jslGalandril.setMinimumSize(new java.awt.Dimension(30, 23)); - jslGalandril.setName("jslChef"); // NOI18N - jslGalandril.setPreferredSize(new java.awt.Dimension(50, 23)); - jslGalandril.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslGalandrilStateChanged(evt); - } - }); - jPanel29.add(jslGalandril, new java.awt.GridBagConstraints()); - - jlbNbGalandril.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbGalandril.setLabelFor(jslWizard); - jlbNbGalandril.setText("0"); - jlbNbGalandril.setName("jlbNbChef"); // NOI18N - jlbNbGalandril.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel29.add(jlbNbGalandril, new java.awt.GridBagConstraints()); - - jlbX27.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX27.setText("x"); - jlbX27.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel29.add(jlbX27, new java.awt.GridBagConstraints()); - - jlbPriceGalandril.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceGalandril.setText("50 000"); - jlbPriceGalandril.setName("jlbPriceChef"); // NOI18N - jlbPriceGalandril.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel29.add(jlbPriceGalandril, new java.awt.GridBagConstraints()); - - jlbX28.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX28.setText("="); - jlbX28.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel29.add(jlbX28, new java.awt.GridBagConstraints()); - - jlbCostGalandril.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostGalandril.setText("0"); - jlbCostGalandril.setName("jlbCostChef"); // NOI18N - jlbCostGalandril.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel29.add(jlbCostGalandril, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel29); - - jPanel30.setLayout(new java.awt.GridBagLayout()); - - jlbKrot.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jlbKrot.setText(bundle1.getString("KrotShockwhisker")); // NOI18N - jlbKrot.setPreferredSize(new java.awt.Dimension(120, 14)); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridwidth = 2; - gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; - gridBagConstraints.weightx = 2.0; - jPanel30.add(jlbKrot, gridBagConstraints); - - jslKrot.setMajorTickSpacing(1); - jslKrot.setMaximum(1); - jslKrot.setPaintTicks(true); - jslKrot.setSnapToTicks(true); - jslKrot.setValue(0); - jslKrot.setMaximumSize(new java.awt.Dimension(50, 23)); - jslKrot.setMinimumSize(new java.awt.Dimension(30, 23)); - jslKrot.setName("jslChef"); // NOI18N - jslKrot.setPreferredSize(new java.awt.Dimension(50, 23)); - jslKrot.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jslKrotStateChanged(evt); - } - }); - jPanel30.add(jslKrot, new java.awt.GridBagConstraints()); - - jlbNbKrot.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbNbKrot.setLabelFor(jslWizard); - jlbNbKrot.setText("0"); - jlbNbKrot.setName("jlbNbChef"); // NOI18N - jlbNbKrot.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel30.add(jlbNbKrot, new java.awt.GridBagConstraints()); - - jlbX29.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX29.setText("x"); - jlbX29.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel30.add(jlbX29, new java.awt.GridBagConstraints()); - - jlbPriceKrot.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbPriceKrot.setText("80 000"); - jlbPriceKrot.setName("jlbPriceChef"); // NOI18N - jlbPriceKrot.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel30.add(jlbPriceKrot, new java.awt.GridBagConstraints()); - - jlbX30.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbX30.setText("="); - jlbX30.setPreferredSize(new java.awt.Dimension(10, 14)); - jPanel30.add(jlbX30, new java.awt.GridBagConstraints()); - - jlbCostKrot.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jlbCostKrot.setText("0"); - jlbCostKrot.setName("jlbCostChef"); // NOI18N - jlbCostKrot.setPreferredSize(new java.awt.Dimension(70, 14)); - jPanel30.add(jlbCostKrot, new java.awt.GridBagConstraints()); - - jPanel8.add(jPanel30); - - jtpGoods.addTab(bundle.getString("Inducements"), jPanel8); // NOI18N + jpnInducements.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle1.getString("Mercenaires et Champions"))); // NOI18N + jpnInducements.setPreferredSize(new java.awt.Dimension(200, 250)); + jpnInducements.setLayout(new java.awt.GridLayout(0, 3)); + jtpGoods.addTab(bundle.getString("Inducements"), jpnInducements); // NOI18N jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle1.getString("Mercenaires et Champions"))); // NOI18N jPanel4.setPreferredSize(new java.awt.Dimension(160, 150)); @@ -1930,18 +959,18 @@ private void jbtAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: } } - PlayerType pt =positions.get(0); - JdgSelectPosition jdg=new JdgSelectPosition(null,true,positions, pt); + PlayerType pt = positions.get(0); + JdgSelectPosition jdg = new JdgSelectPosition(null, true, positions, pt); jdg.setVisible(true); - pt=jdg.getPosition(); - + pt = jdg.getPosition(); + /*String input = (String) JOptionPane.showInputDialog(this, Translate.translate(CS_ChooseKindOfplayer), Translate.translate(CS_PlayerChoice), JOptionPane.INFORMATION_MESSAGE, null, positions.toArray(), positions.get(0)); - */ + */ if (pt != null) { - // PlayerType pt = _data.getRoster().getPlayerType(input, true); + // PlayerType pt = _data.getRoster().getPlayerType(input, true); Player p = new Player(pt); _data.addPlayer(p); } @@ -1950,41 +979,6 @@ private void jbtAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: update(); }//GEN-LAST:event_jbtAddActionPerformed - private void jslBabesStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslBabesStateChanged - _data.setBloodweiserbabes(jslBabes.getValue()); - update(); - }//GEN-LAST:event_jslBabesStateChanged - - private void jslCardBudgetStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslCardBudgetStateChanged - _data.setCards(jslCardBudget.getValue()); - update(); - }//GEN-LAST:event_jslCardBudgetStateChanged - - private void jslIgorStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslIgorStateChanged - _data.setIgor(jslIgor.getValue() == 1); - update(); - }//GEN-LAST:event_jslIgorStateChanged - - private void jslWizardStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslWizardStateChanged - _data.setWizard(jslWizard.getValue() == 1); - update(); - }//GEN-LAST:event_jslWizardStateChanged - - private void jslLocalApothecaryStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslLocalApothecaryStateChanged - _data.setLocalapothecary(jslLocalApothecary.getValue()); - update(); - }//GEN-LAST:event_jslLocalApothecaryStateChanged - - private void jslBribeTheRefStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslBribeTheRefStateChanged - _data.setCorruptions(jslBribeTheRef.getValue()); - update(); - }//GEN-LAST:event_jslBribeTheRefStateChanged - - private void jslExtraRerollStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslExtraRerollStateChanged - _data.setExtrarerolls(jslExtraReroll.getValue()); - update(); - }//GEN-LAST:event_jslExtraRerollStateChanged - private void jbtRemoveStarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtRemoveStarActionPerformed int i = jtbStars.getSelectedRow(); if (i > -1) { @@ -2014,19 +1008,18 @@ private void jbtAddStarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI names.add(sp); } } -/* + /* String input = (String) JOptionPane.showInputDialog(this, Translate.translate(CS_ChooseKindOfplayer), Translate.translate(CS_PlayerChoice), JOptionPane.INFORMATION_MESSAGE, null, names.toArray(), ""); StarPlayer sp = _data.getRoster().getStarPlayer(input, true);*/ - - StarPlayer sp =names.get(0); - JdgSelectPosition jdg=new JdgSelectPosition(null,true,names, sp); - jdg.setVisible(true); - sp=jdg.getStarPlayer(); + StarPlayer sp = names.get(0); + JdgSelectPosition jdg = new JdgSelectPosition(null, true, names, sp); + jdg.setVisible(true); + sp = jdg.getStarPlayer(); _data.addChampion(sp); } @@ -2042,11 +1035,6 @@ private void jbtHTMLActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST jdg.setVisible(true); }//GEN-LAST:event_jbtHTMLActionPerformed - private void jslChefStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslChefStateChanged - _data.setChef(jslChef.getValue() == 1); - update(); - }//GEN-LAST:event_jslChefStateChanged - private void jbtExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtExportActionPerformed final JFileChooser jfc = new JFileChooser(); final FileFilter filter1 = new ExtensionFileFilter(java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("TourMaXMLFile"), new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); @@ -2121,7 +1109,7 @@ private void jbtImportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIR private void jcbLRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbLRBActionPerformed int index = jcbLRB.getSelectedIndex(); - LRB.E_Version newversion = LRB.E_Version.NAF2017; + LRB.E_Version newversion = LRB.E_Version.BB2016; switch (index) { case 0: newversion = LRB.E_Version.LRB1; @@ -2145,7 +1133,7 @@ private void jcbLRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: newversion = LRB.E_Version.CRP1; break; case 7: - newversion = LRB.E_Version.NAF2017; + newversion = LRB.E_Version.BB2016; break; } if (newversion != lrbversion) { @@ -2156,41 +1144,6 @@ private void jcbLRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: update(); }//GEN-LAST:event_jcbLRBActionPerformed - private void jslChaosWizardStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslChaosWizardStateChanged - _data.setChaos_wizard(jslChaosWizard.getValue() == 1); - update(); - }//GEN-LAST:event_jslChaosWizardStateChanged - - private void jslHoratioStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslHoratioStateChanged - _data.setHoratio_X_Schottenheim(jslHoratio.getValue() == 1); - update(); - }//GEN-LAST:event_jslHoratioStateChanged - - private void jslKariStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslKariStateChanged - _data.setKari_Coldsteel(jslKari.getValue() == 1); - update(); - }//GEN-LAST:event_jslKariStateChanged - - private void jslFinkStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslFinkStateChanged - _data.setFink_Da_Fixer(jslFink.getValue() == 1); - update(); - }//GEN-LAST:event_jslFinkStateChanged - - private void jslPapaStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslPapaStateChanged - _data.setPapa_Skullbones(jslPapa.getValue() == 1); - update(); - }//GEN-LAST:event_jslPapaStateChanged - - private void jslGalandrilStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslGalandrilStateChanged - _data.setGalandril_Silverwater(jslGalandril.getValue() == 1); - update(); - }//GEN-LAST:event_jslGalandrilStateChanged - - private void jslKrotStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslKrotStateChanged - _data.setKrot_Shockwhisker(jslKrot.getValue() == 1); - update(); - }//GEN-LAST:event_jslKrotStateChanged - private static final String CS_Roster = "Roster"; private static final String CS_Coach = "Coach"; private static final String CS_RosterUnknown = "Roster: Unknown"; @@ -2204,7 +1157,7 @@ private void clearRoster() { private void update() { switch (lrbversion) { - case LRB1: + case LRB1: jcbLRB.setSelectedIndex(0); break; case LRB2: @@ -2225,7 +1178,7 @@ private void update() { case CRP1: jcbLRB.setSelectedIndex(6); break; - case NAF2017: + case BB2016: jcbLRB.setSelectedIndex(7); break; } @@ -2265,11 +1218,6 @@ private void update() { */ MjtTeamPlayers playersModel = new MjtTeamPlayers(_data); - if (_data.getRoster() != null) { - jlbPriceBribeTheRef.setText(Integer.toString(_data.getRoster().getBribe_cost())); - jlbPriceChef.setText(Integer.toString(_data.getRoster().getChef_cost())); - } - jtbPlayers.setModel(playersModel); jtbPlayers.getColumnModel().getColumn(0).setMinWidth(5); jtbPlayers.getColumnModel().getColumn(1).setMinWidth(80); @@ -2355,115 +1303,17 @@ public void propertyChange(PropertyChangeEvent evt) { } } - /** - * Team inducements - */ - jlbPriceExtraReroll.setText(Integer.toString(RosterType.getExtraRerollCost())); - jlbNbExtraReroll.setText(Integer.toString(_data.getExtrarerolls())); - jlbCostExtraReroll.setText(Integer.toString(_data.getExtrarerolls() * RosterType.getExtraRerollCost())); - - jlbPriceBabes.setText(Integer.toString(RosterType.getBabe_cost())); - jlbNbBabes.setText(Integer.toString(_data.getBloodweiserbabes())); - jlbCostBabes.setText(Integer.toString(_data.getBloodweiserbabes() * RosterType.getBabe_cost())); - - if (_data.isChef()) { - jlbNbChef.setText("1"); + jpnInducements.removeAll(); + if (_data != null) { if (_data.getRoster() != null) { - jlbCostChef.setText(Integer.toString(_data.getRoster().getChef_cost())); - } - } else { - jlbNbChef.setText("0"); - jlbCostChef.setText(""); - } - - if (_data.isWizard()) { - jlbNbWizard.setText("1"); - jlbCostWizard.setText(Integer.toString(RosterType.getWizard_cost())); - } else { - jlbNbWizard.setText("0"); - jlbCostWizard.setText("0"); - } - jlbPriceWizard.setText(Integer.toString(RosterType.getWizard_cost())); - - jlbNbBribeTheRef.setText(Integer.toString(_data.getCorruptions())); - if (_data.getRoster() != null) { - jlbCostBribeTheRef.setText(Integer.toString(_data.getCorruptions() * _data.getRoster().getBribe_cost())); - } - - boolean canHaveApo = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isApothecary()) { - canHaveApo = true; - } - } - - jlbCostLocalApothecary.setEnabled(canHaveApo); - jslLocalApothecary.setEnabled(canHaveApo); - jlbCostLocalApothecary.setEnabled(canHaveApo); - jlbPriceLocalApothecary.setEnabled(canHaveApo); - jlbNbLocalApothecary.setEnabled(canHaveApo); - jlbX4.setEnabled(canHaveApo); - - if (!canHaveApo) { - _data.setLocalapothecary(0); - jlbCostLocalApothecary.setText("0"); - jlbPriceLocalApothecary.setText("100000"); - jlbNbLocalApothecary.setText("0"); - jslLocalApothecary.setValue(0); - } else { - jlbNbLocalApothecary.setText(Integer.toString(_data.getLocalapothecary())); - jlbCostLocalApothecary.setText(Integer.toString(_data.getLocalapothecary() * RosterType.getLocal_apo_cost())); - jlbPriceLocalApothecary.setText(Integer.toString(RosterType.getLocal_apo_cost())); - } - - /** - * IGOR Section - */ - boolean canIgor = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isIgor()) { - canIgor = true; + for (int cpt = 0; cpt < _data.getRoster().getInducementTypeSize(); cpt++) { + InducementType it = _data.getRoster().getInducementType(cpt); + JPanel jpnItPanel = createInducementPanel(it, _data); + jpnInducements.add(jpnItPanel); + } } } - jlbCostIgor.setEnabled(canIgor); - jslIgor.setEnabled(canIgor); - jlbCostIgor.setEnabled(canIgor); - jlbPriceIgor.setEnabled(canIgor); - jlbNbIgor.setEnabled(canIgor); - jlbX6.setEnabled(canIgor); - - if (!canIgor) { - _data.setIgor(false); - jlbCostIgor.setText("0"); - jlbPriceIgor.setText("100000"); - jlbNbIgor.setText("0"); - jslIgor.setValue(0); - } else { - - jlbNbIgor.setText(Integer.toString(jslIgor.getValue())); - jlbCostIgor.setText(Integer.toString(jslIgor.getValue() * RosterType.getIgor_cost())); - jlbPriceIgor.setText(Integer.toString(RosterType.getIgor_cost())); - } - - updateChaosWizard(); - updateHoratio(); - updateKari(); - updateFink(); - updatePapa(); - updateGalandril(); - updateKrot(); - - /** - * Cards - */ - - jlbCostCard.setText(Integer.toString(_data.getCards())); -// jlbCardBudget.setText(Integer.toString(_data._cards)); - if (_data.getRoster() != null) { - jlbCostBribeTheRef.setText(Integer.toString(_data.getCorruptions() * _data.getRoster().getBribe_cost())); - } - jbtAddStar.setEnabled(_data.getChampionCount() < 2); jbtRemoveStar.setEnabled(jtbStars.getSelectedRow() > -1); @@ -2474,212 +1324,86 @@ public void propertyChange(PropertyChangeEvent evt) { jlbTotalCost.setText(Integer.toString(cost)); jlbRanking.setText(Integer.toString(cost / 10000)); } - - private void updateChaosWizard() - { - boolean canChaosWizard = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isChaos_wizard()) { - canChaosWizard = true; - } - } - jlbCostChaosWizard.setEnabled(canChaosWizard); - jslChaosWizard.setEnabled(canChaosWizard); - jlbCostChaosWizard.setEnabled(canChaosWizard); - jlbPriceChaosWizard.setEnabled(canChaosWizard); - jlbNbChaosWizard.setEnabled(canChaosWizard); - jlbX16.setEnabled(canChaosWizard); - - if (!canChaosWizard) { - _data.setChaos_wizard(false); - jlbCostChaosWizard.setText("0"); - jlbPriceChaosWizard.setText("150000"); - jlbNbChaosWizard.setText("0"); - jslChaosWizard.setValue(0); - } else { - jlbNbChaosWizard.setText(Integer.toString(jslChaosWizard.getValue())); - jlbCostChaosWizard.setText(Integer.toString(jslChaosWizard.getValue() * RosterType.getChaos_wizard_cost())); - jlbPriceChaosWizard.setText(Integer.toString(RosterType.getChaos_wizard_cost())); - } - } - - private void updateKari() - { - boolean canKari = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isKari_Coldstell()) { - canKari = true; - } - } - jlbCostKari.setEnabled(canKari); - jslKari.setEnabled(canKari); - jlbCostKari.setEnabled(canKari); - jlbPriceKari.setEnabled(canKari); - jlbNbKari.setEnabled(canKari); - jlbX21.setEnabled(canKari); - - if (!canKari) { - _data.setKari_Coldsteel(false); - jlbCostKari.setText("0"); - jlbPriceKari.setText("50000"); - jlbNbKari.setText("0"); - jslKari.setValue(0); - } else { + private JPanel createInducementPanel(InducementType it, Roster team) { + JPanel jpn = new JPanel(new java.awt.GridBagLayout()); - jlbNbKari.setText(Integer.toString(jslKari.getValue())); - jlbCostKari.setText(Integer.toString(jslKari.getValue() *RosterType.getKari_Coldstell_cost())); - jlbPriceKari.setText(Integer.toString(RosterType.getKari_Coldstell_cost())); - } - } - - - private void updateFink() - { - boolean canFink = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isFink_Da_Fixer()) { - canFink = true; - } - } - jlbCostFink.setEnabled(canFink); - jslFink.setEnabled(canFink); - jlbCostFink.setEnabled(canFink); - jlbPriceFink.setEnabled(canFink); - jlbNbFink.setEnabled(canFink); - jlbX23.setEnabled(canFink); - - if (!canFink) { - _data.setFink_Da_Fixer(false); - jlbCostFink.setText("0"); - jlbPriceFink.setText("50000"); - jlbNbFink.setText("0"); - jslFink.setValue(0); - } else { + java.awt.GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints(); + JLabel jlbName = new JLabel(); - jlbNbFink.setText(Integer.toString(jslFink.getValue())); - jlbCostFink.setText(Integer.toString(jslFink.getValue() * RosterType.getFink_Da_Fixer_cost())); - jlbPriceFink.setText(Integer.toString(RosterType.getFink_Da_Fixer_cost())); - } - } - - private void updatePapa() - { - boolean canPapa = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isPapa_Skullbones()) { - canPapa = true; - } - } - jlbCostPapa.setEnabled(canPapa); - jslPapa.setEnabled(canPapa); - jlbCostPapa.setEnabled(canPapa); - jlbPricePapa.setEnabled(canPapa); - jlbNbPapa.setEnabled(canPapa); - jlbX25.setEnabled(canPapa); - - if (!canPapa) { - _data.setPapa_Skullbones(false); - jlbCostPapa.setText("0"); - jlbPricePapa.setText("50000"); - jlbNbPapa.setText("0"); - jslPapa.setValue(0); - } else { + jlbName.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jlbName.setText(Translate.translate(it.getName())); + jlbName.setPreferredSize(new java.awt.Dimension(120, 14)); + gridBagConstraints.gridwidth = 2; + gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; + gridBagConstraints.weightx = 2.0; + jpn.add(jlbName, gridBagConstraints); + + javax.swing.JSlider jslNb = new JSlider(0, it.getNbMax()); + jslNb.setMinorTickSpacing(1); + jslNb.setPaintTicks(true); + jslNb.setSnapToTicks(true); + jslNb.setValue(team.getNbInduc(it)); + jslNb.setMaximumSize(new java.awt.Dimension(50, 23)); + jslNb.setMinimumSize(new java.awt.Dimension(30, 23)); + jslNb.setName("jsl" + it.getName()); // NOI18N + jslNb.setPreferredSize(new java.awt.Dimension(50, 23)); + + jpn.add(jslNb, new java.awt.GridBagConstraints()); + + JLabel jlbNb = new JLabel(); + jlbNb.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jlbNb.setLabelFor(jslNb); + jlbNb.setText(Integer.toString(team.getNbInduc(it))); + jlbNb.setName("jlb" + it.getName()); // NOI18N + jlbNb.setPreferredSize(new java.awt.Dimension(10, 14)); + jpn.add(jlbNb, new java.awt.GridBagConstraints()); + + JLabel jlX = new JLabel(); + jlX.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jlX.setText("x"); + jlX.setPreferredSize(new java.awt.Dimension(10, 14)); + jpn.add(jlX, new java.awt.GridBagConstraints()); + + JLabel jlbCost = new JLabel(); + jlbCost.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jlbCost.setText(Integer.toString(it.getCost())); + jlbCost.setName("jlbCost" + it.getName()); // NOI18N + jlbCost.setPreferredSize(new java.awt.Dimension(70, 14)); + jpn.add(jlbCost, new java.awt.GridBagConstraints()); + + JLabel jlEqual = new JLabel(); + jlEqual.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jlEqual.setText("="); + jlEqual.setPreferredSize(new java.awt.Dimension(10, 14)); + jpn.add(jlEqual, new java.awt.GridBagConstraints()); + + JLabel jlbTotalCost = new JLabel(); + jlbTotalCost.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + int totalcost = team.getNbInduc(it) * it.getCost(); + jlbTotalCost.setText(Integer.toString(totalcost)); + jlbTotalCost.setName("jlbTotalCost" + it.getName()); // NOI18N + jlbTotalCost.setPreferredSize(new java.awt.Dimension(70, 14)); + jpn.add(jlbTotalCost, new java.awt.GridBagConstraints()); - jlbNbPapa.setText(Integer.toString(jslPapa.getValue())); - jlbCostPapa.setText(Integer.toString(jslPapa.getValue() * RosterType.getPapa_Skullbones_cost())); - jlbPricePapa.setText(Integer.toString(RosterType.getPapa_Skullbones_cost())); - } - } - - private void updateGalandril() - { - boolean canGalandril = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isGalandril_Silverwater()) { - canGalandril = true; + jslNb.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + int value = jslNb.getValue(); + int previous_value = team.getNbInduc(it); + + if (value != previous_value) { + team.setInducement(it, value); + int totalcost = value * it.getCost(); + jlbTotalCost.setText(Integer.toString(totalcost)); + update(); + } } - } - jlbCostGalandril.setEnabled(canGalandril); - jslGalandril.setEnabled(canGalandril); - jlbCostGalandril.setEnabled(canGalandril); - jlbPriceGalandril.setEnabled(canGalandril); - jlbNbGalandril.setEnabled(canGalandril); - jlbX27.setEnabled(canGalandril); - - if (!canGalandril) { - _data.setGalandril_Silverwater(false); - jlbCostGalandril.setText("0"); - jlbPriceGalandril.setText("50000"); - jlbNbGalandril.setText("0"); - jslGalandril.setValue(0); - } else { + }); - jlbNbGalandril.setText(Integer.toString(jslGalandril.getValue())); - jlbCostGalandril.setText(Integer.toString(jslGalandril.getValue() *RosterType.getGalandril_Silverwater_cost())); - jlbPriceGalandril.setText(Integer.toString(RosterType.getGalandril_Silverwater_cost())); - } + return jpn; } - - private void updateKrot() - { - boolean canKrot = false; - if (_data.getRoster() != null) { - if (_data.getRoster().isKrot_Shockwhisker()) { - canKrot = true; - } - } - jlbCostKrot.setEnabled(canKrot); - jslKrot.setEnabled(canKrot); - jlbCostKrot.setEnabled(canKrot); - jlbPriceKrot.setEnabled(canKrot); - jlbNbKrot.setEnabled(canKrot); - jlbX29.setEnabled(canKrot); - - if (!canKrot) { - _data.setKrot_Shockwhisker(false); - jlbCostKrot.setText("0"); - jlbPriceKrot.setText("80000"); - jlbNbKrot.setText("0"); - jslKrot.setValue(0); - } else { - jlbNbKrot.setText(Integer.toString(jslKrot.getValue())); - jlbCostKrot.setText(Integer.toString(jslKrot.getValue() * RosterType.getKrot_Shockwhisker_cost())); - jlbPriceKrot.setText(Integer.toString(RosterType.getKrot_Shockwhisker_cost())); - } - } - - private void updateHoratio() - { - boolean canHoratio = false; - - if (lrbversion==LRB.E_Version.NAF2017) - { - canHoratio=true; - } - - jlbCostHoratio.setEnabled(canHoratio); - jslHoratio.setEnabled(canHoratio); - jlbCostHoratio.setEnabled(canHoratio); - jlbPriceHoratio.setEnabled(canHoratio); - jlbNbHoratio.setEnabled(canHoratio); - jlbX18.setEnabled(canHoratio); - - if (!canHoratio) { - _data.setHoratio_X_Schottenheim(false); - jlbCostHoratio.setText("0"); - jlbPriceHoratio.setText("80000"); - jlbNbHoratio.setText("0"); - jslHoratio.setValue(0); - } else { - jlbNbHoratio.setText(Integer.toString(jslHoratio.getValue())); - jlbCostHoratio.setText(Integer.toString(jslHoratio.getValue() * RosterType.getHoratio_X_Schottenheim_cost())); - jlbPriceHoratio.setText(Integer.toString(RosterType.getHoratio_X_Schottenheim_cost())); - } - } - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; @@ -2688,19 +1412,8 @@ private void updateHoratio() private javax.swing.JLabel jLabel16; private javax.swing.JLabel jLabel17; private javax.swing.JLabel jLabel18; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel4; - private javax.swing.JLabel jLabel5; - private javax.swing.JLabel jLabel6; - private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel10; - private javax.swing.JPanel jPanel11; - private javax.swing.JPanel jPanel12; - private javax.swing.JPanel jPanel13; private javax.swing.JPanel jPanel14; private javax.swing.JPanel jPanel15; private javax.swing.JPanel jPanel16; @@ -2709,23 +1422,12 @@ private void updateHoratio() private javax.swing.JPanel jPanel19; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel20; - private javax.swing.JPanel jPanel21; private javax.swing.JPanel jPanel22; - private javax.swing.JPanel jPanel23; - private javax.swing.JPanel jPanel24; - private javax.swing.JPanel jPanel25; - private javax.swing.JPanel jPanel26; - private javax.swing.JPanel jPanel27; - private javax.swing.JPanel jPanel28; - private javax.swing.JPanel jPanel29; private javax.swing.JPanel jPanel3; - private javax.swing.JPanel jPanel30; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel5; private javax.swing.JPanel jPanel6; private javax.swing.JPanel jPanel7; - private javax.swing.JPanel jPanel8; - private javax.swing.JPanel jPanel9; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JButton jbtAdd; @@ -2741,37 +1443,14 @@ private void updateHoratio() private javax.swing.JButton jbtSelectCoach; private javax.swing.JComboBox jcbLRB; private javax.swing.JCheckBox jcbWithSkills; - private javax.swing.JLabel jlChef; private javax.swing.JLabel jlbApothecary; - private javax.swing.JLabel jlbBabes; - private javax.swing.JLabel jlbChaosWizard; private javax.swing.JLabel jlbCoachName; private javax.swing.JLabel jlbCostApothecary; private javax.swing.JLabel jlbCostAssists; - private javax.swing.JLabel jlbCostBabes; - private javax.swing.JLabel jlbCostBribeTheRef; - private javax.swing.JLabel jlbCostCard; - private javax.swing.JLabel jlbCostChaosWizard; private javax.swing.JLabel jlbCostCheerleaders; - private javax.swing.JLabel jlbCostChef; - private javax.swing.JLabel jlbCostExtraReroll; private javax.swing.JLabel jlbCostFanFactor; - private javax.swing.JLabel jlbCostFink; - private javax.swing.JLabel jlbCostGalandril; - private javax.swing.JLabel jlbCostHoratio; - private javax.swing.JLabel jlbCostIgor; - private javax.swing.JLabel jlbCostKari; - private javax.swing.JLabel jlbCostKrot; - private javax.swing.JLabel jlbCostLocalApothecary; - private javax.swing.JLabel jlbCostPapa; private javax.swing.JLabel jlbCostReroll; - private javax.swing.JLabel jlbCostWizard; - private javax.swing.JLabel jlbFink; - private javax.swing.JLabel jlbGalandril; - private javax.swing.JLabel jlbHoratio; private javax.swing.JButton jlbIcon; - private javax.swing.JLabel jlbKari; - private javax.swing.JLabel jlbKrot; private javax.swing.JLabel jlbNbApothecary; private javax.swing.JLabel jlbNbAssists; private javax.swing.JLabel jlbNbAssists1; @@ -2782,100 +1461,28 @@ private void updateHoratio() private javax.swing.JLabel jlbNbAssists6; private javax.swing.JLabel jlbNbAssists8; private javax.swing.JLabel jlbNbAssists9; - private javax.swing.JLabel jlbNbBabes; - private javax.swing.JLabel jlbNbBribeTheRef; - private javax.swing.JLabel jlbNbChaosWizard; - private javax.swing.JLabel jlbNbChef; private javax.swing.JLabel jlbNbCherrleaders; - private javax.swing.JLabel jlbNbExtraReroll; private javax.swing.JLabel jlbNbFanFactor; - private javax.swing.JLabel jlbNbFink; - private javax.swing.JLabel jlbNbGalandril; - private javax.swing.JLabel jlbNbHoratio; - private javax.swing.JLabel jlbNbIgor; - private javax.swing.JLabel jlbNbKari; - private javax.swing.JLabel jlbNbKrot; - private javax.swing.JLabel jlbNbLocalApothecary; - private javax.swing.JLabel jlbNbPapa; private javax.swing.JLabel jlbNbReroll; - private javax.swing.JLabel jlbNbWizard; - private javax.swing.JLabel jlbPapa; private javax.swing.JLabel jlbPriceApothecary; private javax.swing.JLabel jlbPriceAssists; - private javax.swing.JLabel jlbPriceBabes; - private javax.swing.JLabel jlbPriceBribeTheRef; - private javax.swing.JLabel jlbPriceChaosWizard; private javax.swing.JLabel jlbPriceCheerleaders; - private javax.swing.JLabel jlbPriceChef; - private javax.swing.JLabel jlbPriceExtraReroll; private javax.swing.JLabel jlbPriceFanFactor; - private javax.swing.JLabel jlbPriceFink; - private javax.swing.JLabel jlbPriceGalandril; - private javax.swing.JLabel jlbPriceHoratio; - private javax.swing.JLabel jlbPriceIgor; - private javax.swing.JLabel jlbPriceKari; - private javax.swing.JLabel jlbPriceKrot; - private javax.swing.JLabel jlbPriceLocalApothecary; - private javax.swing.JLabel jlbPricePapa; private javax.swing.JLabel jlbPriceReroll; - private javax.swing.JLabel jlbPriceWizard; private javax.swing.JLabel jlbRanking; private javax.swing.JLabel jlbRosterType; private javax.swing.JLabel jlbTeamName; private javax.swing.JLabel jlbTotalCost; - private javax.swing.JLabel jlbX; - private javax.swing.JLabel jlbX1; private javax.swing.JLabel jlbX10; - private javax.swing.JLabel jlbX11; - private javax.swing.JLabel jlbX12; - private javax.swing.JLabel jlbX13; - private javax.swing.JLabel jlbX14; - private javax.swing.JLabel jlbX15; - private javax.swing.JLabel jlbX16; - private javax.swing.JLabel jlbX17; - private javax.swing.JLabel jlbX18; - private javax.swing.JLabel jlbX19; - private javax.swing.JLabel jlbX2; private javax.swing.JLabel jlbX20; - private javax.swing.JLabel jlbX21; - private javax.swing.JLabel jlbX22; - private javax.swing.JLabel jlbX23; - private javax.swing.JLabel jlbX24; - private javax.swing.JLabel jlbX25; - private javax.swing.JLabel jlbX26; - private javax.swing.JLabel jlbX27; - private javax.swing.JLabel jlbX28; - private javax.swing.JLabel jlbX29; - private javax.swing.JLabel jlbX3; - private javax.swing.JLabel jlbX30; - private javax.swing.JLabel jlbX4; - private javax.swing.JLabel jlbX5; - private javax.swing.JLabel jlbX6; - private javax.swing.JLabel jlbX7; - private javax.swing.JLabel jlbX8; - private javax.swing.JLabel jlbX9; private javax.swing.JPanel jpnCenter; + private javax.swing.JPanel jpnInducements; private javax.swing.JPanel jpnTitle; private javax.swing.JSlider jslApothecary; private javax.swing.JSlider jslAssists; - private javax.swing.JSlider jslBabes; - private javax.swing.JSlider jslBribeTheRef; - private javax.swing.JSlider jslCardBudget; - private javax.swing.JSlider jslChaosWizard; private javax.swing.JSlider jslCheerleaders; - private javax.swing.JSlider jslChef; - private javax.swing.JSlider jslExtraReroll; private javax.swing.JSlider jslFanFactor; - private javax.swing.JSlider jslFink; - private javax.swing.JSlider jslGalandril; - private javax.swing.JSlider jslHoratio; - private javax.swing.JSlider jslIgor; - private javax.swing.JSlider jslKari; - private javax.swing.JSlider jslKrot; - private javax.swing.JSlider jslLocalApothecary; - private javax.swing.JSlider jslPapa; private javax.swing.JSlider jslReroll; - private javax.swing.JSlider jslWizard; private javax.swing.JTable jtbPlayers; private javax.swing.JTable jtbStars; private javax.swing.JTabbedPane jtpGoods; diff --git a/src/teamma/views/JdgSelectPosition.form b/src/teamma/views/JdgSelectPosition.form index 8bacadd7..f33fea4e 100644 --- a/src/teamma/views/JdgSelectPosition.form +++ b/src/teamma/views/JdgSelectPosition.form @@ -85,6 +85,7 @@ + diff --git a/src/teamma/views/JdgSelectPosition.java b/src/teamma/views/JdgSelectPosition.java index 04faeaa7..1509fc6c 100644 --- a/src/teamma/views/JdgSelectPosition.java +++ b/src/teamma/views/JdgSelectPosition.java @@ -147,6 +147,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { "Title 1", "Title 2", "Title 3", "Title 4" } )); + jtPositions.setName("jtPositions"); // NOI18N jtPositions.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jtPositionsMouseClicked(evt); diff --git a/src/teamma/views/JdgSelectSkill.form b/src/teamma/views/JdgSelectSkill.form index 3228e59a..2e5383a4 100644 --- a/src/teamma/views/JdgSelectSkill.form +++ b/src/teamma/views/JdgSelectSkill.form @@ -38,7 +38,7 @@ - + @@ -92,30 +92,14 @@ - + - - - - + - + - - - - - - - - - - - - - - + diff --git a/src/teamma/views/JdgSelectSkill.java b/src/teamma/views/JdgSelectSkill.java index f4870aed..e7ddc6ae 100644 --- a/src/teamma/views/JdgSelectSkill.java +++ b/src/teamma/views/JdgSelectSkill.java @@ -1,276 +1,269 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package teamma.views; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.DisplayMode; -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.awt.GridLayout; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.util.ArrayList; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import teamma.data.LRB; -import teamma.data.Player; -import teamma.data.Skill; -import teamma.data.SkillType; -import teamma.languages.Translate; - -/** - * - * @author Perso - */ -public class JdgSelectSkill extends javax.swing.JDialog { - - private Player _player; - private ArrayList _jcbs; - private Color _color = Color.BLACK; - private LRB _lrb; - private final static String CS_SingleRoll="Single Roll"; - private final static String CS_DoubleRoll="Double Roll"; - - /** - * Creates new form JdgSelectSkill - * - * @param parent - * @param modal - * @param player - */ - public JdgSelectSkill(java.awt.Frame parent, boolean modal, Player player,LRB lrb) { - super(parent, modal); - initComponents(); - - _jcbs = new ArrayList<>(); - int nbcats = lrb.getSkillTypeCount(); - _player = player; -_lrb=lrb; - GridLayout layout = new GridLayout(nbcats, 3); - jpnSkills.setLayout(layout); - int i; - int j; - for (i = 0; i < nbcats; i++) { - SkillType st = lrb.getSkillType(i); - JLabel jlb = new JLabel(st.getName()); - jlb.setHorizontalAlignment(JLabel.TRAILING); - ArrayList sa = new ArrayList<>(); - sa.add(""); - for (j = 0; j < st.getSkillCount(); j++) { - sa.add(Translate.translate(st.getSkill(j).getmName())); - } - JComboBox jcb = new JComboBox(sa.toArray()); - jcb.setName("jcb"+st.getName()); - System.out.println("SkillType: "+st.getName()); - _jcbs.add(jcb); - jcb.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - int i; - for (i = 0; i < _jcbs.size(); i++) { - JComboBox jcb = _jcbs.get(i); - if (!e.getSource().equals(jcb)) { - jcb.setSelectedIndex(0); - } - } - } - }); - - jpnSkills.add(jlb); - jpnSkills.add(jcb); - - JLabel jlb2 = new JLabel(""); - boolean enabled = st.isSpecial() && LRB.isAllowSpecialSkills(); - - /* Get if Single Roll or doubl roll */ - if (_player.getPlayertype().containedBySingle(st)) { - jlb2.setText(Translate.translate(CS_SingleRoll)); - enabled = true; - } - if (_player.getPlayertype().containedByDouble(st)) { - jlb2.setText(Translate.translate(CS_DoubleRoll)); - enabled = true; - } - - jpnSkills.add(jlb2); - jlb.setEnabled(enabled); - jcb.setEnabled(enabled); - jlb2.setEnabled(enabled); - } - - this.setPreferredSize(new Dimension(400, 260)); - pack(); - - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice gs = ge.getDefaultScreenDevice(); - DisplayMode dmode = gs.getDisplayMode(); - - this.setSize(400, 260); - - int screenWidth = dmode.getWidth(); - int screenHeight = dmode.getHeight(); - this.setLocation((screenWidth - this.getWidth()) / 2, (screenHeight - this.getHeight()) / 2); - - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings({"unchecked", "PMD"}) - // //GEN-BEGIN:initComponents - private void initComponents() { - - jpnSkills = new javax.swing.JPanel(); - jPanel2 = new javax.swing.JPanel(); - jbtOK = new javax.swing.JButton(); - jbtCancel = new javax.swing.JButton(); - jPanel1 = new javax.swing.JPanel(); - jLabel1 = new javax.swing.JLabel(); - ccColor = new net.java.dev.colorchooser.ColorChooser(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - - javax.swing.GroupLayout jpnSkillsLayout = new javax.swing.GroupLayout(jpnSkills); - jpnSkills.setLayout(jpnSkillsLayout); - jpnSkillsLayout.setHorizontalGroup( - jpnSkillsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 400, Short.MAX_VALUE) - ); - jpnSkillsLayout.setVerticalGroup( - jpnSkillsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 231, Short.MAX_VALUE) - ); - - getContentPane().add(jpnSkills, java.awt.BorderLayout.CENTER); - - java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("teamma/languages/language"); // NOI18N - jbtOK.setText(bundle.getString("OK")); // NOI18N - jbtOK.setName("ok"); // NOI18N - jbtOK.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jbtOKActionPerformed(evt); - } - }); - jPanel2.add(jbtOK); - - jbtCancel.setText(bundle.getString("Cancel")); // NOI18N - jbtCancel.setName("cancel"); // NOI18N - jbtCancel.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jbtCancelActionPerformed(evt); - } - }); - jPanel2.add(jbtCancel); - - getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH); - - jLabel1.setText(bundle.getString("SelectColor")); // NOI18N - jPanel1.add(jLabel1); - - ccColor.setColor(new java.awt.Color(0, 0, 0)); - ccColor.setName("colorChooser"); // NOI18N - ccColor.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - ccColorActionPerformed(evt); - } - }); - - javax.swing.GroupLayout ccColorLayout = new javax.swing.GroupLayout(ccColor); - ccColor.setLayout(ccColorLayout); - ccColorLayout.setHorizontalGroup( - ccColorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 22, Short.MAX_VALUE) - ); - ccColorLayout.setVerticalGroup( - ccColorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 22, Short.MAX_VALUE) - ); - - jPanel1.add(ccColor); - - getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START); - - pack(); - }// //GEN-END:initComponents - - private void jbtCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtCancelActionPerformed - this.setVisible(false); - }//GEN-LAST:event_jbtCancelActionPerformed - - private final static String CS_Error="Error"; - private final static String CS_NoSkillSelected="No skill selected"; - - private void jbtOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtOKActionPerformed - - Skill s = null; - int i; - String stringName; - for (i = 0; i < _jcbs.size(); i++) { - JComboBox jcb = _jcbs.get(i); - if (jcb.getSelectedIndex() > 0) { - stringName = (String) jcb.getSelectedItem(); - s = _lrb.getSkill(stringName,true); - break; - } - } - - if (s != null) { - Skill s2 = new Skill(s.getmName(), s.getmCategory()); - s2.setmColor(getColor()); - getPlayer().addSkill(s2); - - } - this.setVisible(false); - /*else { - JOptionPane.showMessageDialog(this, CS_Error, CS_NoSkillSelected, JOptionPane.ERROR_MESSAGE); - }*/ - }//GEN-LAST:event_jbtOKActionPerformed - - private void ccColorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ccColorActionPerformed - setColor(ccColor.getColor()); - }//GEN-LAST:event_ccColorActionPerformed - - // Variables declaration - do not modify//GEN-BEGIN:variables - private net.java.dev.colorchooser.ColorChooser ccColor; - private javax.swing.JLabel jLabel1; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel2; - private javax.swing.JButton jbtCancel; - private javax.swing.JButton jbtOK; - private javax.swing.JPanel jpnSkills; - // End of variables declaration//GEN-END:variables - - - /** - * @return the _player - */ - private Player getPlayer() { - return _player; - } - - /** - * @param _player the _player to set - */ - private void setPlayer(Player _player) { - this._player = _player; - } - - /** - * @return the _color - */ - private Color getColor() { - return _color; - } - - /** - * @param _color the _color to set - */ - private void setColor(Color _color) { - this._color = _color; - } -} +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package teamma.views; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.DisplayMode; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.GridLayout; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import javax.swing.JColorChooser; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import teamma.data.LRB; +import teamma.data.Player; +import teamma.data.Skill; +import teamma.data.SkillType; +import teamma.languages.Translate; + +/** + * + * @author Perso + */ +public class JdgSelectSkill extends javax.swing.JDialog { + + private Player _player; + private ArrayList _jcbs; + private Color _color = Color.BLACK; + private LRB _lrb; + private final static String CS_SingleRoll="Single Roll"; + private final static String CS_DoubleRoll="Double Roll"; + + /** + * Creates new form JdgSelectSkill + * + * @param parent + * @param modal + * @param player + */ + public JdgSelectSkill(java.awt.Frame parent, boolean modal, Player player,LRB lrb) { + super(parent, modal); + initComponents(); + + _jcbs = new ArrayList<>(); + int nbcats = lrb.getSkillTypeCount(); + _player = player; + _lrb=lrb; + GridLayout layout = new GridLayout(nbcats, 3); + jpnSkills.setLayout(layout); + int i; + int j; + for (i = 0; i < nbcats; i++) { + SkillType st = lrb.getSkillType(i); + JLabel jlb = new JLabel(st.getName()); + jlb.setHorizontalAlignment(JLabel.TRAILING); + ArrayList sa = new ArrayList<>(); + sa.add(""); + for (j = 0; j < st.getSkillCount(); j++) { + sa.add(Translate.translate(st.getSkill(j).getmName())); + } + JComboBox jcb = new JComboBox(sa.toArray()); + jcb.setEnabled(true); + jcb.setName("jcb"+st.getName()); + System.out.println("SkillType: "+st.getName()); + _jcbs.add(jcb); + jcb.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + int i; + for (i = 0; i < _jcbs.size(); i++) { + JComboBox jcb = _jcbs.get(i); + if (!e.getSource().equals(jcb)) { + jcb.setSelectedIndex(0); + } + } + } + }); + + jpnSkills.add(jlb); + jpnSkills.add(jcb); + + JLabel jlb2 = new JLabel(""); + boolean enabled = st.isSpecial() && LRB.isAllowSpecialSkills(); + + /* Get if Single Roll or doubl roll */ + if (_player.getPlayertype().containedBySingle(st)) { + jlb2.setText(Translate.translate(CS_SingleRoll)); + enabled = true; + } + if (_player.getPlayertype().containedByDouble(st)) { + jlb2.setText(Translate.translate(CS_DoubleRoll)); + enabled = true; + } + + jpnSkills.add(jlb2); + jlb.setEnabled(enabled); + jcb.setEnabled(enabled); + jlb2.setEnabled(enabled); + } + + this.setPreferredSize(new Dimension(400, 260)); + + jbtColor.setBackground(_color); + + pack(); + + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice gs = ge.getDefaultScreenDevice(); + DisplayMode dmode = gs.getDisplayMode(); + + this.setSize(400, 260); + + int screenWidth = dmode.getWidth(); + int screenHeight = dmode.getHeight(); + this.setLocation((screenWidth - this.getWidth()) / 2, (screenHeight - this.getHeight()) / 2); + + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings({"unchecked", "PMD"}) + // //GEN-BEGIN:initComponents + private void initComponents() { + + jpnSkills = new javax.swing.JPanel(); + jPanel2 = new javax.swing.JPanel(); + jbtOK = new javax.swing.JButton(); + jbtCancel = new javax.swing.JButton(); + jPanel1 = new javax.swing.JPanel(); + jLabel1 = new javax.swing.JLabel(); + jbtColor = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + javax.swing.GroupLayout jpnSkillsLayout = new javax.swing.GroupLayout(jpnSkills); + jpnSkills.setLayout(jpnSkillsLayout); + jpnSkillsLayout.setHorizontalGroup( + jpnSkillsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 400, Short.MAX_VALUE) + ); + jpnSkillsLayout.setVerticalGroup( + jpnSkillsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 234, Short.MAX_VALUE) + ); + + getContentPane().add(jpnSkills, java.awt.BorderLayout.CENTER); + + java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("teamma/languages/language"); // NOI18N + jbtOK.setText(bundle.getString("OK")); // NOI18N + jbtOK.setName("ok"); // NOI18N + jbtOK.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtOKActionPerformed(evt); + } + }); + jPanel2.add(jbtOK); + + jbtCancel.setText(bundle.getString("Cancel")); // NOI18N + jbtCancel.setName("cancel"); // NOI18N + jbtCancel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtCancelActionPerformed(evt); + } + }); + jPanel2.add(jbtCancel); + + getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH); + + jLabel1.setText(bundle.getString("SelectColor")); // NOI18N + jPanel1.add(jLabel1); + + jbtColor.setText(" "); + jbtColor.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtColorActionPerformed(evt); + } + }); + jPanel1.add(jbtColor); + + getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START); + + pack(); + }// //GEN-END:initComponents + + private void jbtCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtCancelActionPerformed + this.setVisible(false); + }//GEN-LAST:event_jbtCancelActionPerformed + + private final static String CS_Error="Error"; + private final static String CS_NoSkillSelected="No skill selected"; + + private void jbtOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtOKActionPerformed + + Skill s = null; + int i; + String stringName; + for (i = 0; i < _jcbs.size(); i++) { + JComboBox jcb = _jcbs.get(i); + if (jcb.getSelectedIndex() > 0) { + stringName = (String) jcb.getSelectedItem(); + s = _lrb.getSkill(stringName,true); + break; + } + } + + if (s != null) { + Skill s2 = new Skill(s.getmName(), s.getmCategory()); + s2.setmColor(getColor()); + getPlayer().addSkill(s2); + + } + this.setVisible(false); + /*else { + JOptionPane.showMessageDialog(this, CS_Error, CS_NoSkillSelected, JOptionPane.ERROR_MESSAGE); + }*/ + }//GEN-LAST:event_jbtOKActionPerformed + + private void jbtColorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtColorActionPerformed + Color c=JColorChooser.showDialog(this,"Choose",Color.CYAN); + this._color=c; + }//GEN-LAST:event_jbtColorActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JButton jbtCancel; + private javax.swing.JButton jbtColor; + private javax.swing.JButton jbtOK; + private javax.swing.JPanel jpnSkills; + // End of variables declaration//GEN-END:variables + + + /** + * @return the _player + */ + private Player getPlayer() { + return _player; + } + + /** + * @param _player the _player to set + */ + private void setPlayer(Player _player) { + this._player = _player; + } + + /** + * @return the _color + */ + private Color getColor() { + return _color; + } + + /** + * @param _color the _color to set + */ + private void setColor(Color _color) { + this._color = _color; + } +} diff --git a/src/teamma/views/report/JdgPrintableRoster.java b/src/teamma/views/report/JdgPrintableRoster.java index 14ffc2b4..b06f0e2e 100644 --- a/src/teamma/views/report/JdgPrintableRoster.java +++ b/src/teamma/views/report/JdgPrintableRoster.java @@ -42,6 +42,7 @@ import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import org.apache.commons.lang3.StringEscapeUtils; +import teamma.data.Inducement; import teamma.data.Player; import teamma.data.Roster; import teamma.data.RosterType; @@ -324,6 +325,7 @@ private void jbtExportPDFActionPerformed(java.awt.event.ActionEvent evt) {//GEN- private static final String CS_armor = "armor"; private static final String CS_skills = "skills"; private static final String CS_cost = "cost"; + private static final String CS_nb = "nb"; private static final String CS_single = "single"; private static final String CS_double = "double"; private static final String CS_NBSP = " "; @@ -371,29 +373,8 @@ private void jbtExportPDFActionPerformed(java.awt.event.ActionEvent evt) {//GEN- private static final String CS_chef_cost = "chef_cost"; private static final String CS_cards = "cards"; private static final String CS_total = "total"; - - private static final String CS_chaoswizard = "chaoswizard"; - private static final String CS_chaoswizard_price = "chaoswizard_price"; - private static final String CS_chaoswizard_cost = "chaoswizard_cost"; - private static final String CS_horatio = "horatio"; - private static final String CS_horatio_price = "horatio_price"; - private static final String CS_horatio_cost = "horatio_cost"; - private static final String CS_kari = "kari"; - private static final String CS_kari_price = "kari_price"; - private static final String CS_kari_cost = "kari_cost"; - private static final String CS_fink = "fink"; - private static final String CS_fink_price = "fink_price"; - private static final String CS_fink_cost = "fink_cost"; - private static final String CS_papa = "papa"; - private static final String CS_papa_price = "papa_price"; - private static final String CS_papa_cost = "papa_cost"; - private static final String CS_galandril = "galandril"; - private static final String CS_galandril_price = "galandril_price"; - private static final String CS_galandril_cost = "galandril_cost"; - private static final String CS_krot = "krot"; - private static final String CS_krot_price = "krot_price"; - private static final String CS_krot_cost = "krot_cost"; - + private static final String CS_inducements="inducements"; + private File createReport() { File address = null; HtmlEscape html=new HtmlEscape(); @@ -543,77 +524,21 @@ private File createReport() { root.put(CS_pop_price, RosterType.getFan_factor_cost()); root.put(CS_pop_cost, getmRoster().getFanfactor() * RosterType.getFan_factor_cost()); - root.put(CS_extra, getmRoster().getExtrarerolls()); - root.put(CS_extra_price, RosterType.getExtraRerollCost()); - root.put(CS_extra_cost, getmRoster().getExtrarerolls() * RosterType.getExtraRerollCost()); - - root.put(CS_local, getmRoster().getLocalapothecary()); - root.put(CS_local_price, RosterType.getLocal_apo_cost()); - root.put(CS_local_cost, getmRoster().getLocalapothecary() * RosterType.getLocal_apo_cost()); - - root.put(CS_igor, getmRoster().isIgor() ? 1 : 0); - root.put(CS_igor_price, RosterType.getIgor_cost()); - root.put(CS_igor_cost, getmRoster().isIgor() ? RosterType.getIgor_cost() : 0); - - root.put(CS_bribe, getmRoster().getCorruptions()); - if (getmRoster().getRoster() != null) { - root.put(CS_bribe_price, getmRoster().getRoster().getBribe_cost()); - root.put(CS_bribe_cost, getmRoster().getCorruptions() * getmRoster().getRoster().getBribe_cost()); - } else { - root.put(CS_bribe_price, 0); - root.put(CS_bribe_cost, 0); - } - - - root.put(CS_wizard, getmRoster().isWizard() ? 1 : 0); - root.put(CS_wizard_price, RosterType.getWizard_cost()); - root.put(CS_wizard_cost, getmRoster().isWizard() ? RosterType.getWizard_cost() : 0); - - root.put(CS_babes, getmRoster().getBloodweiserbabes()); - root.put(CS_babes_price, RosterType.getBabe_cost()); - root.put(CS_babes_cost, getmRoster().getBloodweiserbabes() * RosterType.getBabe_cost()); - - root.put(CS_chef, getmRoster().isChef() ? 1 : 0); - if (getmRoster().getRoster() != null) { - root.put(CS_chef_price, getmRoster().getRoster().getChef_cost()); - root.put(CS_chef_cost, getmRoster().isChef() ? getmRoster().getRoster().getChef_cost() : 0); - } else { - root.put(CS_chef_price, 0); - root.put(CS_chef_cost, 0); - } - - root.put(CS_cards, getmRoster().getCards()); + ArrayList> inducements = new ArrayList<>(); + for (int i = 0; i < this.mRoster.getInducementsSize(); i++) { + Inducement induc=mRoster.getInducement(i); + HashMap inducement=new HashMap<>(); + + inducement.put(CS_name, StringEscapeUtils.escapeHtml4(Translate.translate(induc.getType().getName()))); + inducement.put(CS_nb, induc.getNb()); + inducement.put(CS_cost, induc.getType().getCost()); + inducement.put(CS_total, induc.getType().getCost()*induc.getNb()); + + inducements.add(inducement); + } + + root.put(CS_inducements,inducements); - root.put(CS_chaoswizard, getmRoster().isChaos_wizard()? 1 : 0); - root.put(CS_chaoswizard_price, RosterType.getChaos_wizard_cost()); - root.put(CS_chaoswizard_cost, getmRoster().isChaos_wizard() ? RosterType.getChaos_wizard_cost() : 0); - - root.put(CS_horatio, getmRoster().isHoratio_X_Schottenheim()? 1 : 0); - root.put(CS_horatio_price, RosterType.getHoratio_X_Schottenheim_cost()); - root.put(CS_horatio_cost, getmRoster().isHoratio_X_Schottenheim() ? RosterType.getHoratio_X_Schottenheim_cost() : 0); - - root.put(CS_kari, getmRoster().isKari_Coldsteel()? 1 : 0); - root.put(CS_kari_price, RosterType.getKari_Coldstell_cost() ); - root.put(CS_kari_cost, getmRoster().isKari_Coldsteel() ? RosterType.getKari_Coldstell_cost() : 0); - - root.put(CS_fink, getmRoster().isFink_Da_Fixer()? 1 : 0); - root.put(CS_fink_price, RosterType.getFink_Da_Fixer_cost()); - root.put(CS_fink_cost, getmRoster().isFink_Da_Fixer() ? RosterType.getFink_Da_Fixer_cost() : 0); - - root.put(CS_papa, getmRoster().isPapa_Skullbones()? 1 : 0); - root.put(CS_papa_price, RosterType.getPapa_Skullbones_cost()); - root.put(CS_papa_cost, getmRoster().isPapa_Skullbones() ? RosterType.getPapa_Skullbones_cost() : 0); - - root.put(CS_galandril, getmRoster().isGalandril_Silverwater()? 1 : 0); - root.put(CS_galandril_price, RosterType.getGalandril_Silverwater_cost()); - root.put(CS_galandril_cost, getmRoster().isGalandril_Silverwater() ? RosterType.getGalandril_Silverwater_cost() : 0); - - root.put(CS_krot, getmRoster().isKrot_Shockwhisker()? 1 : 0); - root.put(CS_krot_price, RosterType.getKrot_Shockwhisker_cost()); - root.put(CS_krot_cost, getmRoster().isKrot_Shockwhisker() ? RosterType.getKrot_Shockwhisker_cost() : 0); - - - root.put(CS_total, getmRoster().getValue(isWithSkill())); root.put(CS_rank, getmRoster().getValue(isWithSkill()) / 10000); @@ -648,15 +573,7 @@ private File createReport() { root.put("RerollTitle",StringEscapeUtils.escapeHtml4(Translate.translate("RerollTitle"))); root.put("RankTitle",StringEscapeUtils.escapeHtml4(Translate.translate("RankTitle"))); - root.put("ChaosWizardTitle",StringEscapeUtils.escapeHtml4(Translate.translate("ChaosWizardTitle"))); - root.put("HoratioTitle",StringEscapeUtils.escapeHtml4(Translate.translate("HoratioTitle"))); - root.put("KariTitle",StringEscapeUtils.escapeHtml4(Translate.translate("KariTitle"))); - root.put("FinkTitle",StringEscapeUtils.escapeHtml4(Translate.translate("FinkTitle"))); - root.put("PapaTitle",StringEscapeUtils.escapeHtml4(Translate.translate("PapaTitle"))); - root.put("GalandrilTitle",StringEscapeUtils.escapeHtml4(Translate.translate("GalandrilTitle"))); - root.put("KrotTitle",StringEscapeUtils.escapeHtml4(Translate.translate("KrotTitle"))); - - + final SimpleDateFormat format = new SimpleDateFormat("EEEEEEE dd MMMMMMMMMMM yyyy", Locale.getDefault()); final SimpleDateFormat formatShort = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()); root.put(ReportKeys.CS_DateGeneration, formatShort.format(new Date())); diff --git a/src/teamma/views/report/roster.html b/src/teamma/views/report/roster.html index 50fb4a1c..49bd08fd 100644 --- a/src/teamma/views/report/roster.html +++ b/src/teamma/views/report/roster.html @@ -1,476 +1,187 @@ - - - - - - - - - <#setting locale="fr_FR"> - <#setting number_format="0.##"> - -
${RosterTitle}
-
- - - - - - - - - - - - - - - - <#assign odd=0> - <#list players as player> - <#assign odd=player.numero> - <#if (player.numero%2 == 1) > - <#assign backgroud="background-color:#ffffff"> - <#else> - <#assign backgroud="background-color:#eeeeee"> - - - - - - - - - - - - - - - - - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - <#if (extra > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (local > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (igor > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (bribe > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (wizard > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (babes > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (chef > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (cards > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - <#if (chaoswizard > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (horatio > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (kari > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (fink > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (papa > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (galandril > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - <#if (krot > 0) > - <#assign odd=odd+1> - <#if (odd%2 == 1) > - <#assign background="background-color:#ffffff"> - <#else> - <#assign background="background-color:#eeeeee"> - - - - - - - - - - - - - - - - - - - -
#${NameTitle}${PositionTitle}${MTitle}${STitle}${AgTitle}${ArTitle}${SkillsTitle}${CostTitle}${SRTitle}${DRTitle}
${player.numero}${player.name} ${player.position}${player.movement}${player.strength}${player.agility}${player.armor} - <#list player.skills as skill> - ${skill} - - ${player.cost}<#list player.single as s>${s}<#list player.double as d>${d}
- ${TeamNameTitle} - ${teamname}${ApothecaryTitle} ${apothecary} X${apo_price}${apo_cost}
- ${CoachNameTitle} - ${coachname}${AssistTitle}${assists}X${ass_price}${ass_cost}
- ${RaceTitle} - ${race}${CheerleadersTitle} ${cheer}X${cheer_price}${cheer_cost}
- ${RankTitle} - ${rank}${FanFactorTitle}${pop}X${pop_price}${pop_cost}
-   - ${RerollTitle} ${reroll}X${reroll_price}${reroll_cost}
-   - ${ExtraRerollTitle}${extra}X${extra_price}${extra_cost}
-   - ${LocalApothecaryTitle} ${local}X${local_price}${local_cost}
-   - ${IgorTitle} ${igor}X${igor_price}${igor_cost}
-   - ${BribeTitle} ${bribe}X${bribe_price}${bribe_cost}
-   - ${WizardTitle} ${wizard} X${wizard_price}${wizard_cost}
-   - ${BabesTitle} ${babes}X${babes_price}${babes_cost}
-   - ${ChefTitle}${chef}X${chef_price}${chef_cost}
-   - ${CardsTitle}  ${cards}
-   - ${ChaosWizardTitle} ${chaoswizard}X${chaoswizard_price}${chaoswizard_cost}
-   - ${HoratioTitle} ${horatio}X${horatio_price}${horatio_cost}
-   - ${KariTitle} ${kari}X${kari_price}${kari_cost}
-   - ${FinkTitle} ${fink}X${fink_price}${fink_cost}
-   - ${PapaTitle} ${papa}X${papa_price}${papa_cost}
-   - ${GalandrilTitle} ${galandril}X${galandril_price}${galandril_cost}
-   - ${KrotTitle} ${krot}X${krot_price}${krot_cost}
-   - ${TotalTitle} ${total}
-
- - + + + + + + + + + <#setting locale="fr_FR"> + <#setting number_format="0.##"> + +
${RosterTitle}
+
+ + + + + + + + + + + + + + + + <#assign odd=0> + + <#list players as player> + <#assign odd=player.numero> + <#if (player.numero%2 == 1) > + <#assign backgroud="background-color:#ffffff"> + <#else> + <#assign backgroud="background-color:#eeeeee"> + + + + + + + + + + + + + + + + + <#if (odd%2 == 1) > + <#assign background="background-color:#ffffff"> + <#else> + <#assign background="background-color:#eeeeee"> + + + + + + + + + + + <#assign odd=odd+1> + <#if (odd%2 == 1) > + <#assign background="background-color:#ffffff"> + <#else> + <#assign background="background-color:#eeeeee"> + + + + + + + + + + + <#assign odd=odd+1> + <#if (odd%2 == 1) > + <#assign background="background-color:#ffffff"> + <#else> + <#assign background="background-color:#eeeeee"> + + + + + + + + + + + + <#assign odd=odd+1> + <#if (odd%2 == 1) > + <#assign background="background-color:#ffffff"> + <#else> + <#assign background="background-color:#eeeeee"> + + + + + + + + + + + + + <#assign odd=odd+1> + <#if (odd%2 == 1) > + <#assign background="background-color:#ffffff"> + <#else> + <#assign background="background-color:#eeeeee"> + + + + + + + + + + + + <#list inducements as inducement> + + + + + + + + + + + + + + + + + + + +
#${NameTitle}${PositionTitle}${MTitle}${STitle}${AgTitle}${ArTitle}${SkillsTitle}${CostTitle}${SRTitle}${DRTitle}
${player.numero}${player.name} ${player.position}${player.movement}${player.strength}${player.agility}${player.armor} + <#list player.skills as skill> + ${skill} + + ${player.cost}<#list player.single as s>${s}<#list player.double as d>${d}
+ ${TeamNameTitle} + ${teamname}${ApothecaryTitle} ${apothecary} X${apo_price}${apo_cost}
+ ${CoachNameTitle} + ${coachname}${AssistTitle}${assists}X${ass_price}${ass_cost}
+ ${RaceTitle} + ${race}${CheerleadersTitle} ${cheer}X${cheer_price}${cheer_cost}
+ ${RankTitle} + ${rank}${FanFactorTitle}${pop}X${pop_price}${pop_cost}
+   + ${RerollTitle} ${reroll}X${reroll_price}${reroll_cost}
+   + ${inducement.name}${inducement.nb}X${inducement.cost}${inducement.total}
+   + ${TotalTitle} ${total}
+
+ + diff --git a/src/tourma/JdgCoach.form b/src/tourma/JdgCoach.form index 0a1eedf9..f48e17b7 100644 --- a/src/tourma/JdgCoach.form +++ b/src/tourma/JdgCoach.form @@ -435,7 +435,7 @@ - + diff --git a/src/tourma/JdgCoach.java b/src/tourma/JdgCoach.java index c65b28ea..d9bec6dd 100644 --- a/src/tourma/JdgCoach.java +++ b/src/tourma/JdgCoach.java @@ -113,14 +113,14 @@ public JdgCoach(final java.awt.Frame parent, final boolean modal) { jbtAddCategory.setEnabled(Tournament.getTournament().getCategoriesCount() > 1); jbtDelCategory.setEnabled((Tournament.getTournament().getCategoriesCount() > 1) && (jlsCategories.getSelectedValuesList().size() > 0)); - jbtEditRoster.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jbtAdd.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jpnBtns.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jlsCompositions.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); + jbtEditRoster.setEnabled(true); + jbtAdd.setEnabled(true); + jpnBtns.setEnabled(true); + jlsCompositions.setEnabled(true); updatelist(); - jLabel4.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jtfNAF.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); + jLabel4.setEnabled(true); + jtfNAF.setEnabled(true); jlbNafRanking.setText(Double.toString(mCoach.getNafRank()) + " (" + Double.toString(mCoach.getNafRankAvg()) + ")"); jcbRoster.setModel(RosterType.getRostersNamesModel()); @@ -186,14 +186,14 @@ public JdgCoach(final java.awt.Frame parent, final boolean modal, final Team tea jbtAddCategory.setEnabled(Tournament.getTournament().getCategoriesCount() > 1); jbtDelCategory.setEnabled((Tournament.getTournament().getCategoriesCount() > 1) && (jlsCategories.getSelectedValuesList().size() > 0)); - jbtEditRoster.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jLabel4.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jtfNAF.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); + jbtEditRoster.setEnabled(true); + jLabel4.setEnabled(true); + jtfNAF.setEnabled(true); jlbNafRanking.setText(Double.toString(mCoach.getNafRank()) + " (" + Double.toString(mCoach.getNafRankAvg()) + ")"); - jbtAdd.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jpnBtns.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jlsCompositions.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); + jbtAdd.setEnabled(true); + jpnBtns.setEnabled(true); + jlsCompositions.setEnabled(true); updatelist(); jcbRoster.setModel(RosterType.getRostersNamesModel()); @@ -293,14 +293,14 @@ public JdgCoach(final java.awt.Frame parent, final boolean modal, final Coach co jcbClan.setSelectedItem(mCoach.getClan().getName()); } - jbtEditRoster.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jLabel4.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jtfNAF.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); + jbtEditRoster.setEnabled(true); + jLabel4.setEnabled(true); + jtfNAF.setEnabled(true); jlbNafRanking.setText(Double.toString(mCoach.getNafRank()) + " (" + Double.toString(mCoach.getNafRankAvg()) + ")"); - jbtAdd.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jpnBtns.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); - jlsCompositions.setEnabled(Tournament.getTournament().getParams().getGame() == RosterType.C_BLOOD_BOWL); + jbtAdd.setEnabled(true); + jpnBtns.setEnabled(true); + jlsCompositions.setEnabled(true); updatelist(); if (coach.getPicture() == null) { @@ -543,7 +543,7 @@ public void propertyChange(java.beans.PropertyChangeEvent evt) { jtfHandicap.setText(bundle.getString("110")); // NOI18N jPanel1.add(jtfHandicap); - jPanel7.setLayout(new java.awt.GridLayout()); + jPanel7.setLayout(new java.awt.GridLayout(1, 0)); jbtDownloadFromNaf.setText(bundle.getString("DOWNLOAD FROM NAF")); // NOI18N jbtDownloadFromNaf.addActionListener(new java.awt.event.ActionListener() { @@ -567,8 +567,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { jlbNafRanking.setText("150"); jPanel1.add(jlbNafRanking); - java.util.ResourceBundle bundle1 = java.util.ResourceBundle.getBundle("teamma/languages/language"); // NOI18N - jbtPinCode.setText(bundle1.getString("PinCode")); // NOI18N + jbtPinCode.setText(bundle.getString("PinCode")); // NOI18N jbtPinCode.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jbtPinCodeActionPerformed(evt); @@ -784,7 +783,7 @@ private void jbtAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: JOptionPane.INFORMATION_MESSAGE, null, RosterType.getRostersNames(), RosterType.getRostersNames()[0]); - LRB.E_Version version=LRB.E_Version.NAF2017; + LRB.E_Version version=LRB.E_Version.BB2016; teamma.data.RosterType rt = teamma.data.LRB.getLRB(version).getRosterType(input, false); if (rt != null) { diff --git a/src/tourma/JdgCupOptions.form b/src/tourma/JdgCupOptions.form new file mode 100644 index 00000000..f25d88dd --- /dev/null +++ b/src/tourma/JdgCupOptions.form @@ -0,0 +1,333 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tourma/JdgCupOptions.java b/src/tourma/JdgCupOptions.java new file mode 100644 index 00000000..7985f832 --- /dev/null +++ b/src/tourma/JdgCupOptions.java @@ -0,0 +1,455 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + /* + * jdgCoach.java + * + * Created on 10 mai 2010, 19:37:53 + */ +package tourma; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.awt.DisplayMode; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.util.ArrayList; +import javax.swing.SpinnerNumberModel; +import tourma.data.Coach; +import tourma.data.Cup; +import tourma.data.Round; +import tourma.data.Team; +import tourma.data.TeamMatch; +import tourma.data.Tournament; +import tourma.tableModel.MjtPairs; +import tourma.views.report.JdgRound; + +/** + * + * @author Frederic Berger + */ +@SuppressWarnings("serial") +public class JdgCupOptions extends javax.swing.JDialog { + + Cup mCup; + + /** + * Creates new form jdgCoach + * + * @param parent + * @param modal + * + */ + public JdgCupOptions(final java.awt.Frame parent, final boolean modal, int MaxTour) { + super(parent, modal); + initComponents(); + + final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + final GraphicsDevice gs = ge.getDefaultScreenDevice(); + final DisplayMode dmode = gs.getDisplayMode(); + + final int screenWidth = dmode.getWidth(); + final int screenHeight = dmode.getHeight(); + + this.setSize(768, 300); + + this.setLocation((screenWidth - this.getWidth()) / 2, (screenHeight - this.getHeight()) / 2); + + mCup = Tournament.getTournament().getCup(); + if (mCup == null) { + mCup = new Cup(Cup.ROUND_TYPE.CLASSIC, 1, true, true, Cup.INITIAL_DRAW.RANDOM); + Tournament.getTournament().setCup(mCup); + } + + final SpinnerNumberModel model = new SpinnerNumberModel(1, 1, MaxTour, 1); + jspNumberOfCupRounds.setModel(model); + update(); + } + + private void update() { + + jcxShuffle.setSelected(mCup.isShuffle()); + jcxSwissForOthers.setSelected(mCup.isSwissForLoosers()); + + jspNumberOfCupRounds.setValue(mCup.getRoundsCount()); + + jrbClassic3rd.setSelected(mCup.getType() == Cup.ROUND_TYPE.CLASSIC_THIRD); + jrbTypeClassic.setSelected(mCup.getType() == Cup.ROUND_TYPE.CLASSIC); + jrbRankingMatchs.setSelected(mCup.getType() == Cup.ROUND_TYPE.RANKING_MATCHES); + jrbLooserCup.setSelected(mCup.getType() == Cup.ROUND_TYPE.LOOSER); + + jrbDrawRandom.setSelected(mCup.getInitialDraw() == Cup.INITIAL_DRAW.RANDOM); + jrbRankingOrder.setSelected(mCup.getInitialDraw() == Cup.INITIAL_DRAW.RANKING); + jrbManualChoice.setSelected(mCup.getInitialDraw() == Cup.INITIAL_DRAW.MANUAL); + + if (Tournament.getTournament().getCategoriesCount()>= 2) { + jrbCategoriesCrossed.setSelected(mCup.getInitialDraw() == Cup.INITIAL_DRAW.CATEGORIES_CROSSED); + jrbCategoriesMixed.setSelected(mCup.getInitialDraw() == Cup.INITIAL_DRAW.CATEGORIES_MIXED); + jrbCategoriesAbsoluteRanking.setSelected(mCup.getInitialDraw() == Cup.INITIAL_DRAW.CATEGORIES_ABSOLUTE_RANKING); + jrbCategoriesNotMixed.setSelected(mCup.getInitialDraw() == Cup.INITIAL_DRAW.CATEGORIES_NOT_MIXED); + } + else + { + jrbCategoriesCrossed.setEnabled(false); + jrbCategoriesMixed.setEnabled(false); + jrbCategoriesAbsoluteRanking.setEnabled(false); + } + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings({"unchecked", "PMD"}) + @SuppressFBWarnings( + value = "UI_INHERITANCE_UNSAFE_GETRESOURCE", + justification = "GeneratedCode") + // //GEN-BEGIN:initComponents + private void initComponents() { + + bgCupType = new javax.swing.ButtonGroup(); + bgInitialDraw = new javax.swing.ButtonGroup(); + jPanel2 = new javax.swing.JPanel(); + jbtOK = new javax.swing.JButton(); + jPanel1 = new javax.swing.JPanel(); + jPanel3 = new javax.swing.JPanel(); + jPanel7 = new javax.swing.JPanel(); + jspNumberOfCupRounds = new javax.swing.JSpinner(); + jLabel1 = new javax.swing.JLabel(); + jcxSwissForOthers = new javax.swing.JCheckBox(); + jcxShuffle = new javax.swing.JCheckBox(); + jPanel4 = new javax.swing.JPanel(); + jrbTypeClassic = new javax.swing.JRadioButton(); + jrbClassic3rd = new javax.swing.JRadioButton(); + jrbRankingMatchs = new javax.swing.JRadioButton(); + jrbLooserCup = new javax.swing.JRadioButton(); + jPanel6 = new javax.swing.JPanel(); + jrbDrawRandom = new javax.swing.JRadioButton(); + jrbRankingOrder = new javax.swing.JRadioButton(); + jrbManualChoice = new javax.swing.JRadioButton(); + jLabel3 = new javax.swing.JLabel(); + jrbCategoriesCrossed = new javax.swing.JRadioButton(); + jrbCategoriesMixed = new javax.swing.JRadioButton(); + jrbCategoriesNotMixed = new javax.swing.JRadioButton(); + jrbCategoriesAbsoluteRanking = new javax.swing.JRadioButton(); + jPanel5 = new javax.swing.JPanel(); + jLabel2 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + + jbtOK.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Select.png"))); // NOI18N + java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("tourma/languages/language"); // NOI18N + jbtOK.setText(bundle.getString("OK")); // NOI18N + jbtOK.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtOKActionPerformed(evt); + } + }); + jPanel2.add(jbtOK); + + getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH); + + jPanel1.setLayout(new java.awt.GridLayout(1, 2)); + + jPanel3.setLayout(new java.awt.GridLayout(4, 1)); + + jPanel7.setLayout(new java.awt.BorderLayout()); + + jspNumberOfCupRounds.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + jspNumberOfCupRoundsStateChanged(evt); + } + }); + jPanel7.add(jspNumberOfCupRounds, java.awt.BorderLayout.WEST); + + jLabel1.setText(bundle.getString("CupRoundNumber")); // NOI18N + jPanel7.add(jLabel1, java.awt.BorderLayout.CENTER); + + jPanel3.add(jPanel7); + + jcxSwissForOthers.setText(bundle.getString("CupSwissForLoosers")); // NOI18N + jcxSwissForOthers.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jcxSwissForOthersActionPerformed(evt); + } + }); + jPanel3.add(jcxSwissForOthers); + + jcxShuffle.setText(bundle.getString("CupDrawShuffle")); // NOI18N + jcxShuffle.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jcxShuffleActionPerformed(evt); + } + }); + jPanel3.add(jcxShuffle); + + jPanel1.add(jPanel3); + + jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("CupType"))); // NOI18N + jPanel4.setLayout(new java.awt.GridLayout(4, 1)); + + bgCupType.add(jrbTypeClassic); + jrbTypeClassic.setText(bundle.getString("CupTypeClassic")); // NOI18N + jrbTypeClassic.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbTypeClassicActionPerformed(evt); + } + }); + jPanel4.add(jrbTypeClassic); + + bgCupType.add(jrbClassic3rd); + jrbClassic3rd.setText(bundle.getString("CupTypeClassicThirdPlace")); // NOI18N + jrbClassic3rd.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbClassic3rdActionPerformed(evt); + } + }); + jPanel4.add(jrbClassic3rd); + + bgCupType.add(jrbRankingMatchs); + jrbRankingMatchs.setText(bundle.getString("CupTypeRankingMatches")); // NOI18N + jrbRankingMatchs.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbRankingMatchsActionPerformed(evt); + } + }); + jPanel4.add(jrbRankingMatchs); + + bgCupType.add(jrbLooserCup); + jrbLooserCup.setText(bundle.getString("CupTypeLooserCup")); // NOI18N + jrbLooserCup.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbLooserCupActionPerformed(evt); + } + }); + jPanel4.add(jrbLooserCup); + + jPanel1.add(jPanel4); + + jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("CupInitialDraw"))); // NOI18N + jPanel6.setLayout(new java.awt.GridLayout(8, 1)); + + bgInitialDraw.add(jrbDrawRandom); + jrbDrawRandom.setText(bundle.getString("CupDrawRandom")); // NOI18N + jrbDrawRandom.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbDrawRandomActionPerformed(evt); + } + }); + jPanel6.add(jrbDrawRandom); + + bgInitialDraw.add(jrbRankingOrder); + jrbRankingOrder.setText(bundle.getString("CupDrawRanking")); // NOI18N + jrbRankingOrder.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbRankingOrderActionPerformed(evt); + } + }); + jPanel6.add(jrbRankingOrder); + + bgInitialDraw.add(jrbManualChoice); + jrbManualChoice.setText(bundle.getString("CupDrawManual")); // NOI18N + jrbManualChoice.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbManualChoiceActionPerformed(evt); + } + }); + jPanel6.add(jrbManualChoice); + + jLabel3.setText(bundle.getString("CategoriesAsConferences")); // NOI18N + jPanel6.add(jLabel3); + + bgInitialDraw.add(jrbCategoriesCrossed); + jrbCategoriesCrossed.setText(bundle.getString("CupDrawCategoriesCrossed")); // NOI18N + jrbCategoriesCrossed.setToolTipText(""); + jrbCategoriesCrossed.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbCategoriesCrossedActionPerformed(evt); + } + }); + jPanel6.add(jrbCategoriesCrossed); + + bgInitialDraw.add(jrbCategoriesMixed); + jrbCategoriesMixed.setText(bundle.getString("CupCategoriesMixed")); // NOI18N + jrbCategoriesMixed.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbCategoriesMixedActionPerformed(evt); + } + }); + jPanel6.add(jrbCategoriesMixed); + + bgInitialDraw.add(jrbCategoriesNotMixed); + jrbCategoriesNotMixed.setText(bundle.getString("CupCategoriesNotMixed")); // NOI18N + jrbCategoriesNotMixed.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbCategoriesNotMixedActionPerformed(evt); + } + }); + jPanel6.add(jrbCategoriesNotMixed); + + bgInitialDraw.add(jrbCategoriesAbsoluteRanking); + jrbCategoriesAbsoluteRanking.setText(bundle.getString("CupCategoriesMixed")); // NOI18N + jrbCategoriesAbsoluteRanking.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jrbCategoriesAbsoluteRankingActionPerformed(evt); + } + }); + jPanel6.add(jrbCategoriesAbsoluteRanking); + + jPanel1.add(jPanel6); + + getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); + + jLabel2.setText(bundle.getString("CupOptions")); // NOI18N + jPanel5.add(jLabel2); + + getContentPane().add(jPanel5, java.awt.BorderLayout.PAGE_START); + + pack(); + }// //GEN-END:initComponents + + @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) + private void jbtOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtOKActionPerformed + + Cup newCup=new Cup(mCup); + Tournament.getTournament().setCup(newCup); + this.setVisible(false); + + }//GEN-LAST:event_jbtOKActionPerformed + + private void jrbClassic3rdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbClassic3rdActionPerformed + if (jrbClassic3rd.isSelected()) { + mCup.setType(Cup.ROUND_TYPE.CLASSIC_THIRD); + } + update(); + }//GEN-LAST:event_jrbClassic3rdActionPerformed + + private void jrbDrawRandomActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbDrawRandomActionPerformed + if (jrbDrawRandom.isSelected()) { + mCup.setInitialDraw(Cup.INITIAL_DRAW.RANDOM); + } + update(); + }//GEN-LAST:event_jrbDrawRandomActionPerformed + + private void jrbTypeClassicActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbTypeClassicActionPerformed + if (jrbTypeClassic.isSelected()) { + mCup.setType(Cup.ROUND_TYPE.CLASSIC); + } + update(); + }//GEN-LAST:event_jrbTypeClassicActionPerformed + + private void jrbRankingMatchsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbRankingMatchsActionPerformed + if (jrbRankingMatchs.isSelected()) { + mCup.setType(Cup.ROUND_TYPE.RANKING_MATCHES); + } + update(); + }//GEN-LAST:event_jrbRankingMatchsActionPerformed + + private void jrbLooserCupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbLooserCupActionPerformed + if (jrbLooserCup.isSelected()) { + mCup.setType(Cup.ROUND_TYPE.LOOSER); + } + update(); + }//GEN-LAST:event_jrbLooserCupActionPerformed + + private void jrbRankingOrderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbRankingOrderActionPerformed + if (jrbRankingOrder.isSelected()) { + mCup.setInitialDraw(Cup.INITIAL_DRAW.RANKING); + } + update(); + }//GEN-LAST:event_jrbRankingOrderActionPerformed + + private void jrbManualChoiceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbManualChoiceActionPerformed + if (jrbManualChoice.isSelected()) { + mCup.setInitialDraw(Cup.INITIAL_DRAW.MANUAL); + } + update(); + }//GEN-LAST:event_jrbManualChoiceActionPerformed + + private void jcxShuffleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxShuffleActionPerformed + if (jcxShuffle.isSelected()) { + mCup.setShuffle(true); + } else { + mCup.setShuffle(false); + } + update(); + }//GEN-LAST:event_jcxShuffleActionPerformed + + private void jcxSwissForOthersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxSwissForOthersActionPerformed + if (jcxSwissForOthers.isSelected()) { + mCup.setSwissForLoosers(true); + } else { + mCup.setSwissForLoosers(false); + } + update(); + }//GEN-LAST:event_jcxSwissForOthersActionPerformed + + private void jspNumberOfCupRoundsStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jspNumberOfCupRoundsStateChanged + mCup.setRoundsCount((Integer) jspNumberOfCupRounds.getValue()); + update(); + }//GEN-LAST:event_jspNumberOfCupRoundsStateChanged + + private void jrbCategoriesCrossedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbCategoriesCrossedActionPerformed + if (jrbCategoriesCrossed.isSelected()) { + mCup.setInitialDraw(Cup.INITIAL_DRAW.CATEGORIES_CROSSED); + } + }//GEN-LAST:event_jrbCategoriesCrossedActionPerformed + + private void jrbCategoriesMixedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbCategoriesMixedActionPerformed + if (jrbCategoriesMixed.isSelected()) { + mCup.setInitialDraw(Cup.INITIAL_DRAW.CATEGORIES_MIXED); + } + }//GEN-LAST:event_jrbCategoriesMixedActionPerformed + + private void jrbCategoriesAbsoluteRankingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbCategoriesAbsoluteRankingActionPerformed + if (jrbCategoriesMixed.isSelected()) { + mCup.setInitialDraw(Cup.INITIAL_DRAW.CATEGORIES_ABSOLUTE_RANKING); + } + }//GEN-LAST:event_jrbCategoriesAbsoluteRankingActionPerformed + + private void jrbCategoriesNotMixedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbCategoriesNotMixedActionPerformed + if (jrbCategoriesNotMixed.isSelected()) { + mCup.setInitialDraw(Cup.INITIAL_DRAW.CATEGORIES_NOT_MIXED); + } + }//GEN-LAST:event_jrbCategoriesNotMixedActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.ButtonGroup bgCupType; + private javax.swing.ButtonGroup bgInitialDraw; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JPanel jPanel3; + private javax.swing.JPanel jPanel4; + private javax.swing.JPanel jPanel5; + private javax.swing.JPanel jPanel6; + private javax.swing.JPanel jPanel7; + private javax.swing.JButton jbtOK; + private javax.swing.JCheckBox jcxShuffle; + private javax.swing.JCheckBox jcxSwissForOthers; + private javax.swing.JRadioButton jrbCategoriesAbsoluteRanking; + private javax.swing.JRadioButton jrbCategoriesCrossed; + private javax.swing.JRadioButton jrbCategoriesMixed; + private javax.swing.JRadioButton jrbCategoriesNotMixed; + private javax.swing.JRadioButton jrbClassic3rd; + private javax.swing.JRadioButton jrbDrawRandom; + private javax.swing.JRadioButton jrbLooserCup; + private javax.swing.JRadioButton jrbManualChoice; + private javax.swing.JRadioButton jrbRankingMatchs; + private javax.swing.JRadioButton jrbRankingOrder; + private javax.swing.JRadioButton jrbTypeClassic; + private javax.swing.JSpinner jspNumberOfCupRounds; + // End of variables declaration//GEN-END:variables + + private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { + throw new java.io.NotSerializableException(getClass().getName()); + } + + private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { + throw new java.io.NotSerializableException(getClass().getName()); + } +} diff --git a/src/tourma/JdgManualCupDraw.form b/src/tourma/JdgManualCupDraw.form new file mode 100644 index 00000000..b2b42f83 --- /dev/null +++ b/src/tourma/JdgManualCupDraw.form @@ -0,0 +1,213 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ diff --git a/src/tourma/JdgManualCupDraw.java b/src/tourma/JdgManualCupDraw.java new file mode 100644 index 00000000..3c3a8b3f --- /dev/null +++ b/src/tourma/JdgManualCupDraw.java @@ -0,0 +1,326 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + /* + * jdgCoach.java + * + * Created on 10 mai 2010, 19:37:53 + */ +package tourma; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.awt.DisplayMode; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import javax.swing.ComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.SpinnerNumberModel; +import tourma.data.Coach; +import tourma.data.Competitor; +import tourma.data.Cup; +import tourma.data.Round; +import tourma.data.Team; +import tourma.data.TeamMatch; +import tourma.data.Tournament; +import tourma.languages.Translate; +import tourma.tableModel.MjtManualMatchs; +import tourma.tableModel.MjtPairs; +import tourma.views.report.JdgRound; + +/** + * + * @author Frederic Berger + */ +@SuppressWarnings("serial") +public class JdgManualCupDraw extends javax.swing.JDialog { + + ArrayList mComps; + ArrayList mTargetComps; + + /** + * Creates new form jdgCoach + * + * @param parent + * @param modal + * + */ + public JdgManualCupDraw(final java.awt.Frame parent, final boolean modal, ArrayList competitors) { + super(parent, modal); + initComponents(); + + final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + final GraphicsDevice gs = ge.getDefaultScreenDevice(); + final DisplayMode dmode = gs.getDisplayMode(); + + final int screenWidth = dmode.getWidth(); + final int screenHeight = dmode.getHeight(); + + this.setLocation((screenWidth - this.getWidth()) / 2, (screenHeight - this.getHeight()) / 2); + + mComps = competitors; + mTargetComps = new ArrayList<>(); + + + + update(); + } + + private void update() { + + jbtAdd.setEnabled(mComps.size() > 0); + + final ArrayList compsNames = new ArrayList<>(); + for (Competitor mPlayersTmp1 : mComps) { + if (mPlayersTmp1 == null) { + System.err.println("Null competitor detected"); + } else { + + String name = mPlayersTmp1.getDecoratedName(); + compsNames.add(name); + } + } + + ActionListener al=jcbLeft.getActionListeners()[0]; + jcbLeft.removeActionListener(al); + ActionListener ar=jcbRight.getActionListeners()[0]; + jcbRight.removeActionListener(ar); + + jcbLeft.removeAllItems(); + jcbRight.removeAllItems(); + + for (int i = 0; i < compsNames.size(); i++) { + if (i == 0) { + jcbLeft.addItem(compsNames.get(i)); + } else { + if (i == 1) { + jcbRight.addItem(compsNames.get(i)); + } else { + jcbLeft.addItem(compsNames.get(i)); + jcbRight.addItem(compsNames.get(i)); + } + } + + } + + jcbLeft.addActionListener(al); + jcbRight.addActionListener(ar); + jtbMatches.setModel(new MjtManualMatchs(this.mTargetComps)); + + repaint(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings({"unchecked", "PMD"}) + @SuppressFBWarnings( + value = "UI_INHERITANCE_UNSAFE_GETRESOURCE", + justification = "GeneratedCode") + // //GEN-BEGIN:initComponents + private void initComponents() { + + bgCupType = new javax.swing.ButtonGroup(); + bgInitialDraw = new javax.swing.ButtonGroup(); + jPanel2 = new javax.swing.JPanel(); + jbtOK = new javax.swing.JButton(); + jPanel1 = new javax.swing.JPanel(); + jPanel5 = new javax.swing.JPanel(); + jcbLeft = new javax.swing.JComboBox<>(); + jLabel1 = new javax.swing.JLabel(); + jcbRight = new javax.swing.JComboBox<>(); + jPanel6 = new javax.swing.JPanel(); + jbtAdd = new javax.swing.JButton(); + jpnMain = new javax.swing.JPanel(); + jsp = new javax.swing.JScrollPane(); + jtbMatches = new javax.swing.JTable(); + jpnDel = new javax.swing.JPanel(); + jbtDel = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + + jbtOK.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Select.png"))); // NOI18N + java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("tourma/languages/language"); // NOI18N + jbtOK.setText(bundle.getString("OK")); // NOI18N + jbtOK.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtOKActionPerformed(evt); + } + }); + jPanel2.add(jbtOK); + + getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH); + + jPanel1.setLayout(new java.awt.BorderLayout()); + + jPanel5.setLayout(new java.awt.GridBagLayout()); + + jcbLeft.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jcbLeftActionPerformed(evt); + } + }); + jPanel5.add(jcbLeft, new java.awt.GridBagConstraints()); + + jLabel1.setText(" vs "); + jPanel5.add(jLabel1, new java.awt.GridBagConstraints()); + + jcbRight.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jcbRightActionPerformed(evt); + } + }); + jPanel5.add(jcbRight, new java.awt.GridBagConstraints()); + + jPanel1.add(jPanel5, java.awt.BorderLayout.CENTER); + + jbtAdd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Add.png"))); // NOI18N + jbtAdd.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtAddActionPerformed(evt); + } + }); + jPanel6.add(jbtAdd); + + jPanel1.add(jPanel6, java.awt.BorderLayout.EAST); + + getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH); + + jpnMain.setLayout(new java.awt.BorderLayout()); + + jsp.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("MATCHS"))); // NOI18N + + jtbMatches.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null} + }, + new String [] { + "Title 1", "Title 2", "Title 3", "Title 4" + } + )); + jtbMatches.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + jsp.setViewportView(jtbMatches); + + jpnMain.add(jsp, java.awt.BorderLayout.CENTER); + + jbtDel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Close.png"))); // NOI18N + jbtDel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtDelActionPerformed(evt); + } + }); + jpnDel.add(jbtDel); + + jpnMain.add(jpnDel, java.awt.BorderLayout.EAST); + + getContentPane().add(jpnMain, java.awt.BorderLayout.CENTER); + + pack(); + }// //GEN-END:initComponents + + @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) + private void jbtOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtOKActionPerformed + + for (Competitor c : mTargetComps) { + mComps.add(c); + } + + this.setVisible(false); + + }//GEN-LAST:event_jbtOKActionPerformed + + private void jcbLeftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbLeftActionPerformed + // Change order in the list. Set the selected competitor at position 0 + + int index = jcbLeft.getSelectedIndex(); + if (index >= 0) { + Competitor tmp = mComps.get(0); + if (index > 0) { + tmp = mComps.get(index + 1); + } + mComps.remove(tmp); + mComps.add(0, tmp); + } + + jcbLeft.removeAllItems(); + + update(); + + }//GEN-LAST:event_jcbLeftActionPerformed + + private void jcbRightActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbRightActionPerformed + int index = jcbRight.getSelectedIndex(); + if (index >= 0) { + Competitor tmp = mComps.get(1); + if (index > 0) { + tmp = mComps.get(index + 1); + } + mComps.remove(tmp); + mComps.add(1, tmp); + } + + jcbRight.removeAllItems(); + update(); + }//GEN-LAST:event_jcbRightActionPerformed + + private void jbtAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtAddActionPerformed + Competitor c1 = mComps.get(0); + Competitor c2 = mComps.get(1); + + mComps.remove(c1); + mComps.remove(c2); + + mTargetComps.add(c1); + mTargetComps.add(c2); + + update(); + + }//GEN-LAST:event_jbtAddActionPerformed + + private void jbtDelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtDelActionPerformed + + int index = jtbMatches.getSelectedRow(); + + if (index >= 0) { + Competitor c1 = mTargetComps.get(2 * index); + Competitor c2 = mTargetComps.get(2 * index + 1); + + mComps.add(c1); + mComps.add(c2); + + mTargetComps.remove(c1); + mTargetComps.remove(c2); + } + update(); + }//GEN-LAST:event_jbtDelActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.ButtonGroup bgCupType; + private javax.swing.ButtonGroup bgInitialDraw; + private javax.swing.JLabel jLabel1; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JPanel jPanel5; + private javax.swing.JPanel jPanel6; + private javax.swing.JButton jbtAdd; + private javax.swing.JButton jbtDel; + private javax.swing.JButton jbtOK; + private javax.swing.JComboBox jcbLeft; + private javax.swing.JComboBox jcbRight; + private javax.swing.JPanel jpnDel; + private javax.swing.JPanel jpnMain; + private javax.swing.JScrollPane jsp; + private javax.swing.JTable jtbMatches; + // End of variables declaration//GEN-END:variables + +} diff --git a/src/tourma/JdgMassAdd.java b/src/tourma/JdgMassAdd.java index 8dca3395..ef1850da 100644 --- a/src/tourma/JdgMassAdd.java +++ b/src/tourma/JdgMassAdd.java @@ -409,7 +409,7 @@ private void loadExcelFile(File file) { for (int j = 0; j < Tournament.getTournament().getTeamsCount(); j++) { Team team = Tournament.getTournament().getTeam(j); if (team.getName().equals(t)) { - JOptionPane.showMessageDialog(this, "Team " + t + " already exists"); + //JOptionPane.showMessageDialog(this, "Team " + t + " already exists"); found = true; } } @@ -448,6 +448,7 @@ private void loadExcelFile(File file) { } if (!found) { Coach coach = new Coach(c); + coach.setActive(true); Tournament.getTournament().addCoach(coach); // Roster Name @@ -472,6 +473,7 @@ private void loadExcelFile(File file) { tmp = ""; if (cell_tmp != null) { tmp = cell_tmp.getStringCellValue(); + } if (!tmp.equals("")) { RosterType rt = RosterType.getRosterType(tmp); diff --git a/src/tourma/JdgParameters.form b/src/tourma/JdgParameters.form index 6643ef39..ea3b9f6c 100644 --- a/src/tourma/JdgParameters.form +++ b/src/tourma/JdgParameters.form @@ -46,49 +46,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -118,7 +75,7 @@ - + @@ -167,7 +124,7 @@ - + @@ -222,7 +179,7 @@ - + @@ -257,7 +214,7 @@ - + @@ -331,7 +288,7 @@ - + diff --git a/src/tourma/JdgParameters.java b/src/tourma/JdgParameters.java index 3ff1962e..b9a14806 100644 --- a/src/tourma/JdgParameters.java +++ b/src/tourma/JdgParameters.java @@ -10,7 +10,6 @@ import tourma.data.EIndivPairing; import tourma.data.ETeamPairing; import tourma.data.Parameters; -import tourma.data.RosterType; import tourma.data.Tournament; /** @@ -43,13 +42,7 @@ public JdgParameters(java.awt.Frame parent, boolean modal) { mParams = Tournament.getTournament().getParams(); - // Load current parameters - if (mParams.getGame() == RosterType.C_BLOOD_BOWL) { - jrbBloodBowl.setSelected(true); - } else { - jrbDreadBall.setSelected(true); - } - + if (mParams.isTeamTournament()) { jrbTeam.setSelected(true); } else { @@ -102,9 +95,6 @@ private void initComponents() { btgIndivTeamPairing = new javax.swing.ButtonGroup(); jPanel5 = new javax.swing.JPanel(); jcbMultiroster = new javax.swing.JCheckBox(); - jpnGame = new javax.swing.JPanel(); - jrbDreadBall = new javax.swing.JRadioButton(); - jrbBloodBowl = new javax.swing.JRadioButton(); jPanel2 = new javax.swing.JPanel(); jpnByTeam = new javax.swing.JPanel(); jPanel3 = new javax.swing.JPanel(); @@ -135,29 +125,6 @@ private void initComponents() { setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - jpnGame.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("GameKind"))); // NOI18N - - btgGame.add(jrbDreadBall); - jrbDreadBall.setText("DreadBall"); - jrbDreadBall.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jrbDreadBallActionPerformed(evt); - } - }); - jpnGame.add(jrbDreadBall); - - btgGame.add(jrbBloodBowl); - jrbBloodBowl.setSelected(true); - jrbBloodBowl.setText("Blood Bowl"); - jrbBloodBowl.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jrbBloodBowlActionPerformed(evt); - } - }); - jpnGame.add(jrbBloodBowl); - - getContentPane().add(jpnGame, java.awt.BorderLayout.NORTH); - jPanel2.setLayout(new java.awt.BorderLayout()); jpnByTeam.setLayout(new java.awt.GridLayout(1, 2)); @@ -317,24 +284,6 @@ private void jbtOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:e this.setVisible(false); }//GEN-LAST:event_jbtOKActionPerformed - private void jrbDreadBallActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbDreadBallActionPerformed - if (jrbDreadBall.isSelected()) { - mParams.setGame(RosterType.C_DREAD_BALL); - } else { - mParams.setGame(RosterType.C_BLOOD_BOWL); - } - update(); - }//GEN-LAST:event_jrbDreadBallActionPerformed - - private void jrbBloodBowlActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbBloodBowlActionPerformed - if (jrbBloodBowl.isSelected()) { - mParams.setGame(RosterType.C_BLOOD_BOWL); - } else { - mParams.setGame(RosterType.C_DREAD_BALL); - } - update(); - }//GEN-LAST:event_jrbBloodBowlActionPerformed - private void jrbTeamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jrbTeamActionPerformed mParams.setTeamTournament(jrbTeam.isSelected()); update(); @@ -469,15 +418,12 @@ private void jcxMultipleRosterActionPerformed(java.awt.event.ActionEvent evt) {/ private javax.swing.JCheckBox jcxMultipleRoster; private javax.swing.JLabel jlbNbCoachs; private javax.swing.JPanel jpnByTeam; - private javax.swing.JPanel jpnGame; private javax.swing.JPanel jpnIndivTeamRanking; private javax.swing.JPanel jpnMisc; private javax.swing.JPanel jpnNbCoachs; private javax.swing.JPanel jpnOK; private javax.swing.JPanel jpnPairing; private javax.swing.JPanel jpnTeam; - private javax.swing.JRadioButton jrbBloodBowl; - private javax.swing.JRadioButton jrbDreadBall; private javax.swing.JRadioButton jrbIndivPairingByRanking; private javax.swing.JRadioButton jrbIndivPairingManual; private javax.swing.JRadioButton jrbIndivPairingNaf; diff --git a/src/tourma/MainFrame.form b/src/tourma/MainFrame.form index f65469ff..692a25ae 100644 --- a/src/tourma/MainFrame.form +++ b/src/tourma/MainFrame.form @@ -173,6 +173,17 @@
+ + + + + + + + + + + diff --git a/src/tourma/MainFrame.java b/src/tourma/MainFrame.java index d5ca9cad..dde00cce 100644 --- a/src/tourma/MainFrame.java +++ b/src/tourma/MainFrame.java @@ -20,6 +20,8 @@ import java.awt.HeadlessException; import java.awt.SplashScreen; import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -42,7 +44,9 @@ import java.util.logging.Logger; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFormattedTextField; @@ -54,7 +58,6 @@ import javax.swing.filechooser.FileFilter; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; -import net.java.dev.colorchooser.ColorChooser; import org.apache.commons.net.ftp.FTPClient; import org.jfree.ui.tabbedui.VerticalLayout; import teamma.data.LRB; @@ -119,7 +122,6 @@ public String getCurrentPath() { return currentPath; } - /** * Creates new form MainFrame * @@ -172,7 +174,14 @@ public void updateMenus() { jmiDelRound.setEnabled(!isClient); - jmiGenerateNextRound.setEnabled((r.allMatchesEntered()) && (!isClient)); + boolean generateNextRoundEnabled = (r.allMatchesEntered()) && (!isClient); + if (r.isCup()) { + if (r.getCupMaxTour() - 1 == r.getCupTour()) { + generateNextRoundEnabled = false; + } + } + + jmiGenerateNextRound.setEnabled(generateNextRoundEnabled); jmiChangePairing.setEnabled(!isClient); jmiAddFreeMatch.setEnabled(!isClient); @@ -278,8 +287,8 @@ public void updateMenus() { jmiGenerateFirstRound.setEnabled(!isClient); jcxmiAsServer.setEnabled(!isClient); jcxPatchPortugal.setEnabled(!isClient); - jcxDisplayRosters.setEnabled(true); - jcxDisplayRosters.setSelected(Tournament.getTournament().getParams().isDisplayRoster()); + jcxDisplayRosters.setEnabled(true); + jcxDisplayRosters.setSelected(Tournament.getTournament().getParams().isDisplayRoster()); jmiEditColors.setEnabled(!isClient); jmiEditWebPort.setEnabled(!isClient); jmiEditDescription.setEnabled(!isClient); @@ -292,7 +301,7 @@ public void updateMenus() { */ public void update() { - jmiEditTeam.setEnabled(mTournament.getParams().getGame() == RosterType.C_BLOOD_BOWL); + jmiEditTeam.setEnabled(true); jmiSubstitutePlayer.setEnabled(mTournament.getRoundsCount() > 0); final MainTreeModel dtm = new MainTreeModel(); jtrPanels.setCellRenderer(dtm); @@ -345,6 +354,7 @@ private void initComponents() { jcxAllowSpecialSkill = new javax.swing.JCheckBoxMenuItem(); jSeparator4 = new javax.swing.JPopupMenu.Separator(); jmiNafLoad = new javax.swing.JMenuItem(); + jcxIgnoreCaps = new javax.swing.JCheckBoxMenuItem(); jSeparator11 = new javax.swing.JPopupMenu.Separator(); jcxPatchPortugal = new javax.swing.JCheckBoxMenuItem(); jSeparator13 = new javax.swing.JPopupMenu.Separator(); @@ -557,6 +567,15 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { } }); jmnTools.add(jmiNafLoad); + + jcxIgnoreCaps.setSelected(true); + jcxIgnoreCaps.setText(bundle.getString("IgnoreCapitalLetter")); // NOI18N + jcxIgnoreCaps.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jcxIgnoreCapsActionPerformed(evt); + } + }); + jmnTools.add(jcxIgnoreCaps); jmnTools.add(jSeparator11); jcxPatchPortugal.setText(bundle.getString("PortugalPatch")); // NOI18N @@ -1139,15 +1158,8 @@ private void jmiNouveauActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI jdgParams.setVisible(true); mTournament = Tournament.getTournament(); - if (mTournament.getParams().getGame() == RosterType.C_DREAD_BALL) { - RosterType.initCollection(RosterType.C_DREAD_BALL); - jmiExport.setEnabled(false); - jmiExportFbb.setEnabled(false); - jcxAllowSpecialSkill.setEnabled(false); - } else { - RosterType.initCollection(RosterType.C_BLOOD_BOWL); - // LRB.getLRB(); - } + + RosterType.initCollection(); mTournament.clearGroups(); final Group group = new Group(Translate.translate(CS_None)); @@ -1454,7 +1466,7 @@ private void jmiGenerateFirstRoundActionPerformed(java.awt.event.ActionEvent evt if (areRulesValid()) { if (JOptionPane.showConfirmDialog(this, java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("AreYouSure?ItWillEraseAllRounds"), java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("FirstRound"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - if (mTournament.getParams().isTeamTournament() && (mTournament.getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING) && mTournament.getCoachsCount() % 2 > 0) { + if (mTournament.getParams().isTeamTournament() && (mTournament.getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING) && mTournament.getTeamsCount() % 2 > 0) { JOptionPane.showMessageDialog(this, Translate.translate(CS_OddTeamNumber)); } else { @@ -1824,6 +1836,15 @@ private void jmiDelRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F m.getCompetitor2().removeMatch(m); } + // Clean Cup + if (round.isCup()) { + if (round.getCupTour() == 0) { + mTournament.setCup(null); + } else { + mTournament.getCup().cleanRound(round); + } + } + mTournament.removeRound(round); update(); @@ -1858,27 +1879,21 @@ private void editRoundCoef(Round r) { int res = JOptionPane.showConfirmDialog(this, jpn, Translate.translate(CS_RoundCoefficient), JOptionPane.OK_CANCEL_OPTION); if (res == JOptionPane.OK_OPTION) { - try{ - Double val1 = (Double) jftf1.getValue(); - r.setMaxBonus(val1); - } - catch (ClassCastException ce) - { - if (jftf1.getValue() instanceof Long) - { - String txt=((Long)jftf1.getValue()).toString()+".0"; + try { + Double val1 = (Double) jftf1.getValue(); + r.setMaxBonus(val1); + } catch (ClassCastException ce) { + if (jftf1.getValue() instanceof Long) { + String txt = ((Long) jftf1.getValue()).toString() + ".0"; r.setMaxBonus(Double.valueOf(txt)); } } - try{ + try { Double val2 = (Double) jftf2.getValue(); r.setMinBonus(val2); - } - catch (ClassCastException cc) - { - if (jftf2.getValue() instanceof Long) - { - String txt=((Long)jftf2.getValue()).toString()+".0"; + } catch (ClassCastException cc) { + if (jftf2.getValue() instanceof Long) { + String txt = ((Long) jftf2.getValue()).toString() + ".0"; r.setMinBonus(Double.valueOf(txt)); } } @@ -1889,7 +1904,7 @@ private void editRoundCoef(Round r) { private final static String CS_SwissRound = "RONDE SUISSE"; private final static String CS_SwissRound_TopDown = "RONDE SUISSE ALTERNEE"; - + private final static String CS_AcceleratedSwissRound = "RONDE SUISSE ACCELERÉE"; private final static String CS_Animation = "Animation"; @@ -2007,7 +2022,7 @@ private void jmiChangePairingActionPerformed(java.awt.event.ActionEvent evt) {// if (jpnContent instanceof JPNRound) { JPNRound jpnr = (JPNRound) jpnContent; - Round round = jpnr.getRound(); + Round round = jpnr.getRound(); final JdgChangePairing jdg = new JdgChangePairing(MainFrame.getMainFrame(), true, round); jdg.setVisible(true); jpnr.update(); @@ -2838,14 +2853,50 @@ private void jcxmiRemoteEditActionPerformed(java.awt.event.ActionEvent evt) {//G private void jmiEditColorsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditColorsActionPerformed - ColorChooser jccColor1 = new ColorChooser(); - jccColor1.setColor(Tournament.getTournament().getParams().getColor1()); - ColorChooser jccColor2 = new ColorChooser(); - jccColor2.setColor(Tournament.getTournament().getParams().getColor2()); - ColorChooser jccBorderColor = new ColorChooser(); - jccBorderColor.setColor(Tournament.getTournament().getParams().getBorderColor()); - ColorChooser jccForeColor = new ColorChooser(); - jccForeColor.setColor(Tournament.getTournament().getParams().getForeColor()); + JButton jbtColor1 = new JButton(" "); + jbtColor1.setBackground(Tournament.getTournament().getParams().getColor1()); + JButton jbtColor2 = new JButton(" "); + jbtColor2.setBackground(Tournament.getTournament().getParams().getColor2()); + JButton jbtBorderColor = new JButton(" "); + jbtBorderColor.setBackground(Tournament.getTournament().getParams().getBorderColor()); + JButton jbtForeColor = new JButton(" "); + jbtForeColor.setBackground(Tournament.getTournament().getParams().getForeColor()); + + jbtColor1.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Color c = JColorChooser.showDialog(jpnContent, CS_None, Tournament.getTournament().getParams().getColor1()); + Tournament.getTournament().getParams().setColor1(c); + jbtColor1.setBackground(c); + } + }); + + jbtColor2.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Color c = JColorChooser.showDialog(jpnContent, CS_None, Tournament.getTournament().getParams().getColor2()); + Tournament.getTournament().getParams().setColor2(c); + jbtColor2.setBackground(c); + } + }); + + jbtBorderColor.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Color c = JColorChooser.showDialog(jpnContent, CS_None, Tournament.getTournament().getParams().getBorderColor()); + Tournament.getTournament().getParams().setBorderColor(c); + jbtBorderColor.setBackground(c); + } + }); + + jbtForeColor.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Color c = JColorChooser.showDialog(jpnContent, CS_None, Tournament.getTournament().getParams().getForeColor()); + Tournament.getTournament().getParams().setForeColor(c); + jbtForeColor.setBackground(c); + } + }); JLabel jlbColor1 = new JLabel(Translate.translate(COLOR_1)); JLabel jlbColor2 = new JLabel(Translate.translate(COLOR_2)); @@ -2855,22 +2906,16 @@ private void jmiEditColorsActionPerformed(java.awt.event.ActionEvent evt) {//GEN JPanel jpn = new JPanel(new GridLayout(4, 2)); jpn.add(jlbColor1); - jpn.add(jccColor1); + jpn.add(jbtColor1); jpn.add(jlbColor2); - jpn.add(jccColor2); + jpn.add(jbtColor2); jpn.add(jlbBorderColor); - jpn.add(jccBorderColor); + jpn.add(jbtBorderColor); jpn.add(jlbForeColor); - jpn.add(jccForeColor); + jpn.add(jbtForeColor); JOptionPane.showConfirmDialog(this, jpn, "Couleurs", JOptionPane.OK_OPTION); - Tournament.getTournament().getParams().setColor1(jccColor1.getColor()); - Tournament.getTournament().getParams().setColor2(jccColor2.getColor()); - Tournament.getTournament().getParams().setBorderColor(jccBorderColor.getColor()); - Tournament.getTournament().getParams().setForeColor(jccForeColor.getColor()); - - }//GEN-LAST:event_jmiEditColorsActionPerformed private void jmiPrintLabelsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiPrintLabelsActionPerformed @@ -3019,15 +3064,20 @@ private void jmiMassAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI }//GEN-LAST:event_jmiMassAddActionPerformed private void jcxDisplayRostersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxDisplayRostersActionPerformed - Tournament.getTournament().getParams().setDisplayRoster(jcxDisplayRosters.getState()); + Tournament.getTournament().getParams().setDisplayRoster(jcxDisplayRosters.getState()); }//GEN-LAST:event_jcxDisplayRostersActionPerformed private void jmiEditRosterListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditRosterListActionPerformed - JdgRosters jdg=new JdgRosters(this,true); + JdgRosters jdg = new JdgRosters(this, true); jdg.setVisible(true); }//GEN-LAST:event_jmiEditRosterListActionPerformed + private void jcxIgnoreCapsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxIgnoreCapsActionPerformed + + NAF.setIgnoreCaps(jcxIgnoreCaps.isSelected()); + }//GEN-LAST:event_jcxIgnoreCapsActionPerformed + public boolean isRoundOnly() { return jckmiRoundOnly.isSelected(); } @@ -3133,41 +3183,38 @@ public static void splashProgress(int pct) { */ private static void appInit() { - - splashText("List NAF id Database"); // Get Number of naf_id text - ArrayList naf_list=NAF.getFileList(); - int nb_steps=naf_list.size()+6; - int pct=100/nb_steps; - splashProgress(1*pct); - + ArrayList naf_list = NAF.getFileList(); + int nb_steps = naf_list.size() + 6; + int pct = 100 / nb_steps; + splashProgress(1 * pct); + try { splashText("Initization of RMi Registry"); - splashProgress(2*pct); + splashProgress(2 * pct); RMITournament tour = RMITournament.getInstance(); ITournament stub = (ITournament) UnicastRemoteObject.exportObject(tour, 0); splashText("Binding Tournament"); - splashProgress(3*pct); + splashProgress(3 * pct); Registry registry = LocateRegistry.createRegistry(1099);// getRegistry(); registry.bind("TourMa", stub); } catch (RemoteException | AlreadyBoundException e) { System.out.println(e.getLocalizedMessage()); } - + splashText("Loading NAF coach XML base"); - for (int i=0; i new tournament, open an existing one if - * other choice - */ - public MainFrame(int res) { - - mTournament = Tournament.getTournament(); - this.setSize(800, 600); - initComponents(); - - currentPath = MainFrame.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - - if (res == 0) { - jmiNouveauActionPerformed(null); - } else { - if (res == 1) { - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_TourMaXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).loadXML(jfc.getSelectedFile()); - } - } - File f = jfc.getSelectedFile(); - if (f != null) { - currentPath = f.getAbsolutePath(); - } - } - } - - update(); - } - - public void updateMenus() { - boolean isClient = Tournament.getTournament().isClient(); - if (jpnContent instanceof JPNRound) { - - Round r = ((JPNRound) jpnContent).getRound(); - if (mTournament.getRoundIndex(r) == mTournament.getRoundsCount() - 1) { - - jmiIndivReport.setEnabled(true); - jmiClanReport.setEnabled(true); - jmiTeamReport.setEnabled(true); - - jmiDelRound.setEnabled(!isClient); - - jmiGenerateNextRound.setEnabled((r.allMatchesEntered()) && (!isClient)); - - jmiChangePairing.setEnabled(!isClient); - jmiAddFreeMatch.setEnabled(!isClient); - jmiDelFreeMatch.setEnabled(!isClient); - jmiFullScreenMatchs.setEnabled(!isClient); - jmiFullScreenMatchsClash.setEnabled(!isClient); - jmiFullScreenRankGeneral.setEnabled(!isClient); - jmiFullScreenRankAnnexIndiv.setEnabled(!isClient); - jmiFullScreenRankAnnexIndiv1.setEnabled(!isClient); - - jmiFullScreenRankAnnexCategory.setEnabled(Tournament.getTournament().getCategoriesCount() > 0); - jmiFullScreenRankAnnexCategory1.setEnabled(Tournament.getTournament().getCategoriesCount() > 0); - jmiFullScreenRankCategory.setEnabled(Tournament.getTournament().getCategoriesCount() > 0); - - jmiFullScreenRankAnnexGroups.setEnabled(Tournament.getTournament().getGroupsCount() > 0); - jmiFullScreenRankAnnexGroups1.setEnabled(Tournament.getTournament().getGroupsCount() > 0); - jmiFullScreenRankGroups.setEnabled(Tournament.getTournament().getGroupsCount() > 0); - - jmiFullScreenRankAnnexPool.setEnabled(Tournament.getTournament().getPoolCount() > 0); - jmiFullScreenRankAnnexPool1.setEnabled(Tournament.getTournament().getPoolCount() > 0); - jmiFullScreenPool.setEnabled(Tournament.getTournament().getPoolCount() > 0); - - jmiFullScreenRankTeam.setEnabled(mTournament.getParams().isTeamTournament()); - jmiFullScreenRankClan.setEnabled(mTournament.getClansCount() > 1); - - jmiPrintLabels.setEnabled(true); - - if (((JPNRound) jpnContent).getMatchTableSelectedRow() >= 0) { - jmiCancelConceedMatch.setEnabled(true); - jmiCancelMatchRefuse.setEnabled(true); - jmiConceedMatch.setEnabled(true); - jmiRefuseMatch.setEnabled(true); - } else { - jmiCancelConceedMatch.setEnabled(false); - jmiCancelMatchRefuse.setEnabled(false); - jmiConceedMatch.setEnabled(false); - jmiRefuseMatch.setEnabled(false); - } - } else { - jmiPrintLabels.setEnabled(false); - jmiDelRound.setEnabled(false); - jmiGenerateNextRound.setEnabled(false); - jmiChangePairing.setEnabled(false); - jmiAddFreeMatch.setEnabled(false); - jmiDelFreeMatch.setEnabled(false); - jmiCancelConceedMatch.setEnabled(false); - jmiCancelMatchRefuse.setEnabled(false); - jmiConceedMatch.setEnabled(false); - jmiRefuseMatch.setEnabled(false); - - } - jmiFullScreenMatchs.setEnabled(true); - jmiFullScreenMatchsClash.setEnabled(true); - jckmiRoundOnly.setEnabled(true); - jckmiHideNonNaf.setEnabled(true); - jmiFullScreenRankTeam.setEnabled(mTournament.getParams().isTeamTournament()); - jmiFullScreenRankClan.setEnabled(mTournament.getClansCount() > 1); - jmiFullScreenRankAnnexClan.setEnabled(mTournament.getClansCount() > 1); - jmiFullScreenRankAnnexClan1.setEnabled(mTournament.getClansCount() > 1); - jmiFullScreenRankAnnexTeam.setEnabled(mTournament.getParams().isTeamTournament()); - jmiFullScreenRankAnnexTeam1.setEnabled(mTournament.getParams().isTeamTournament()); - jmiEditCoef.setEnabled(mTournament.getParams().isTableBonusPerRound()); - } else { - jmiIndivReport.setEnabled(false); - jmiClanReport.setEnabled(false); - jmiTeamReport.setEnabled(false); - jmiPrintLabels.setEnabled(false); - jckmiRoundOnly.setEnabled(false); - jckmiHideNonNaf.setEnabled(false); - jmiDelRound.setEnabled(false); - jmiGenerateNextRound.setEnabled(false); - jmiChangePairing.setEnabled(false); - jmiAddFreeMatch.setEnabled(false); - jmiDelFreeMatch.setEnabled(false); - jmiCancelConceedMatch.setEnabled(false); - jmiCancelMatchRefuse.setEnabled(false); - jmiConceedMatch.setEnabled(false); - jmiRefuseMatch.setEnabled(false); - jmiFullScreenMatchs.setEnabled(false); - jmiFullScreenMatchsClash.setEnabled(false); - jmiFullScreenRankTeam.setEnabled(false); - jmiFullScreenRankClan.setEnabled(false); - jmiFullScreenRankGeneral.setEnabled(false); - jmiFullScreenRankAnnexIndiv.setEnabled(false); - jmiFullScreenRankAnnexIndiv1.setEnabled(false); - jmiFullScreenRankAnnexClan.setEnabled(false); - jmiFullScreenRankAnnexClan1.setEnabled(false); - jmiFullScreenRankAnnexTeam.setEnabled(false); - jmiFullScreenRankAnnexTeam1.setEnabled(false); - jmiFullScreenRankAnnexCategory.setEnabled(false); - jmiFullScreenRankAnnexCategory1.setEnabled(false); - jmiFullScreenRankCategory.setEnabled(false); - jmiFullScreenRankAnnexGroups.setEnabled(false); - jmiFullScreenRankAnnexGroups1.setEnabled(false); - jmiFullScreenRankGroups.setEnabled(false); - jmiFullScreenRankAnnexPool.setEnabled(false); - jmiFullScreenRankAnnexPool1.setEnabled(false); - jmiFullScreenPool.setEnabled(false); - jmiEditCoef.setEnabled(false); - } - jcxmiRemoteEdit.setSelected((Tournament.getTournament().getParams().isWebEdit()) && (!isClient)); - - jmiGenerateFirstRound.setEnabled(!isClient); - jcxmiAsServer.setEnabled(!isClient); - jcxPatchPortugal.setEnabled(!isClient); - jcxDisplayRosters.setEnabled(true); - jcxDisplayRosters.setSelected(Tournament.getTournament().getParams().isDisplayRoster()); - jmiEditColors.setEnabled(!isClient); - jmiEditWebPort.setEnabled(!isClient); - jmiEditDescription.setEnabled(!isClient); - jcxmiRemoteEdit.setEnabled(!isClient); - jmiNafLoad.setEnabled(!isClient); - } - - /** - * Update - */ - public void update() { - - jmiEditTeam.setEnabled(mTournament.getParams().getGame() == RosterType.C_BLOOD_BOWL); - jmiSubstitutePlayer.setEnabled(mTournament.getRoundsCount() > 0); - final MainTreeModel dtm = new MainTreeModel(); - jtrPanels.setCellRenderer(dtm); - jtrPanels.setModel(dtm); - jtrPanels.setSize(100, this.getHeight()); - jtrPanels.repaint(); - updateMenus(); - - jcxPatchPortugal.setSelected(mTournament.getParams().isPortugal()); - - this.revalidate(); - this.repaint(); - } - - /** - * Update only tree - */ - public void updateTree() { - jtrPanels.setSelectionPath(new TreePath(((MainTreeModel) jtrPanels.getModel()).getParams())); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings({"unchecked", "PMD"}) - // //GEN-BEGIN:initComponents - private void initComponents() { - - jspSplit = new javax.swing.JSplitPane(); - jScrollPane1 = new javax.swing.JScrollPane(); - jtrPanels = new javax.swing.JTree(); - jpnContent = new javax.swing.JPanel(); - jMenuBar1 = new javax.swing.JMenuBar(); - jmnFile = new javax.swing.JMenu(); - jmiNouveau = new javax.swing.JMenuItem(); - jmiCharger = new javax.swing.JMenuItem(); - jmiSave = new javax.swing.JMenuItem(); - jmiSaveAs = new javax.swing.JMenuItem(); - jSeparator1 = new javax.swing.JSeparator(); - jmiExport = new javax.swing.JMenuItem(); - jmiExportFbb = new javax.swing.JMenuItem(); - jmiExportFbb1 = new javax.swing.JMenuItem(); - jSeparator2 = new javax.swing.JSeparator(); - jmiExit = new javax.swing.JMenuItem(); - jmnTools = new javax.swing.JMenu(); - jmiEditTeam = new javax.swing.JMenuItem(); - jSeparator5 = new javax.swing.JPopupMenu.Separator(); - jcxAllowSpecialSkill = new javax.swing.JCheckBoxMenuItem(); - jSeparator4 = new javax.swing.JPopupMenu.Separator(); - jmiNafLoad = new javax.swing.JMenuItem(); - jSeparator11 = new javax.swing.JPopupMenu.Separator(); - jcxPatchPortugal = new javax.swing.JCheckBoxMenuItem(); - jSeparator13 = new javax.swing.JPopupMenu.Separator(); - jcxUseColor = new javax.swing.JCheckBoxMenuItem(); - jcxUseImage = new javax.swing.JCheckBoxMenuItem(); - jcxDisplayRosters = new javax.swing.JCheckBoxMenuItem(); - jmnParameters = new javax.swing.JMenu(); - jmiGenerateFirstRound = new javax.swing.JMenuItem(); - jSeparator20 = new javax.swing.JPopupMenu.Separator(); - jmiMassAdd = new javax.swing.JMenuItem(); - jSeparator6 = new javax.swing.JPopupMenu.Separator(); - jmiSubstitutePlayer = new javax.swing.JMenuItem(); - jSeparator15 = new javax.swing.JPopupMenu.Separator(); - jcxmiAsServer = new javax.swing.JCheckBoxMenuItem(); - jmiEditColors = new javax.swing.JMenuItem(); - jmiEditWebPort = new javax.swing.JMenuItem(); - jmiEditDescription = new javax.swing.JMenuItem(); - jcxmiRemoteEdit = new javax.swing.JCheckBoxMenuItem(); - jSeparator19 = new javax.swing.JPopupMenu.Separator(); - jmiExportWebServerAsZIP = new javax.swing.JMenuItem(); - jmiExportWebServerToSite = new javax.swing.JMenuItem(); - jmnRound = new javax.swing.JMenu(); - jmiGenerateNextRound = new javax.swing.JMenuItem(); - jSeparator7 = new javax.swing.JPopupMenu.Separator(); - jmiDelRound = new javax.swing.JMenuItem(); - jSeparator8 = new javax.swing.JPopupMenu.Separator(); - jmiChangePairing = new javax.swing.JMenuItem(); - jmiEditCoef = new javax.swing.JMenuItem(); - jSeparator9 = new javax.swing.JPopupMenu.Separator(); - jmiPrintLabels = new javax.swing.JMenuItem(); - jSeparator16 = new javax.swing.JPopupMenu.Separator(); - jckmiRoundOnly = new javax.swing.JCheckBoxMenuItem(); - jckmiHideNonNaf = new javax.swing.JCheckBoxMenuItem(); - jSeparator10 = new javax.swing.JPopupMenu.Separator(); - jmiAddFreeMatch = new javax.swing.JMenuItem(); - jmiDelFreeMatch = new javax.swing.JMenuItem(); - jSeparator12 = new javax.swing.JPopupMenu.Separator(); - jMenu1 = new javax.swing.JMenu(); - jmiFullScreenMatchs = new javax.swing.JMenuItem(); - jmiFullScreenMatchsClash = new javax.swing.JMenuItem(); - jmiFullScreenRankGeneral = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexIndiv = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexIndiv1 = new javax.swing.JMenuItem(); - jmiFullScreenRankTeam = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexTeam = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexTeam1 = new javax.swing.JMenuItem(); - jmiFullScreenRankClan = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexClan = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexClan1 = new javax.swing.JMenuItem(); - jmiFullScreenRankGroups = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexGroups = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexGroups1 = new javax.swing.JMenuItem(); - jmiFullScreenRankCategory = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexCategory = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexCategory1 = new javax.swing.JMenuItem(); - jmiFullScreenPool = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexPool = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexPool1 = new javax.swing.JMenuItem(); - jSeparator14 = new javax.swing.JPopupMenu.Separator(); - jmiConceedMatch = new javax.swing.JMenuItem(); - jmiCancelConceedMatch = new javax.swing.JMenuItem(); - jmiRefuseMatch = new javax.swing.JMenuItem(); - jmiCancelMatchRefuse = new javax.swing.JMenuItem(); - jSeparator17 = new javax.swing.JPopupMenu.Separator(); - jMenu2 = new javax.swing.JMenu(); - jmiIndivReport = new javax.swing.JMenuItem(); - jmiClanReport = new javax.swing.JMenuItem(); - jmiTeamReport = new javax.swing.JMenuItem(); - jSeparator18 = new javax.swing.JPopupMenu.Separator(); - jmnHelp = new javax.swing.JMenu(); - jmiAbout = new javax.swing.JMenuItem(); - jmiRevisions = new javax.swing.JMenuItem(); - jSeparator3 = new javax.swing.JSeparator(); - jmiAideEnLigne = new javax.swing.JMenuItem(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("tourma/languages/language"); // NOI18N - setTitle(bundle.getString("SoftwareTitle")); // NOI18N - setIconImage((Toolkit.getDefaultToolkit().getImage(MainFrame.class.getResource(java.util.ResourceBundle.getBundle("tourma/languages/language").getString("IMAGES/ICONE.PNG"))))); - addWindowListener(new java.awt.event.WindowAdapter() { - public void windowClosed(java.awt.event.WindowEvent evt) { - formWindowClosed(evt); - } - public void windowClosing(java.awt.event.WindowEvent evt) { - formWindowClosing(evt); - } - }); - - jtrPanels.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { - public void valueChanged(javax.swing.event.TreeSelectionEvent evt) { - jtrPanelsValueChanged(evt); - } - }); - jScrollPane1.setViewportView(jtrPanels); - - jspSplit.setLeftComponent(jScrollPane1); - jspSplit.setRightComponent(jpnContent); - - getContentPane().add(jspSplit, java.awt.BorderLayout.CENTER); - - jmnFile.setText(bundle.getString("FileKey")); // NOI18N - - jmiNouveau.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/New.png"))); // NOI18N - jmiNouveau.setText(bundle.getString("NewTourKey")); // NOI18N - jmiNouveau.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiNouveauActionPerformed(evt); - } - }); - jmnFile.add(jmiNouveau); - - jmiCharger.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Open.png"))); // NOI18N - jmiCharger.setText(bundle.getString("LoadTourKey")); // NOI18N - jmiCharger.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiChargerActionPerformed(evt); - } - }); - jmnFile.add(jmiCharger); - - jmiSave.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Save.png"))); // NOI18N - jmiSave.setText(bundle.getString("SaveTourKey")); // NOI18N - jmiSave.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiSaveActionPerformed(evt); - } - }); - jmnFile.add(jmiSave); - - jmiSaveAs.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Save.png"))); // NOI18N - jmiSaveAs.setText(bundle.getString("SaveTourAsKey")); // NOI18N - jmiSaveAs.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiSaveAsActionPerformed(evt); - } - }); - jmnFile.add(jmiSaveAs); - jmnFile.add(jSeparator1); - - jmiExport.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExport.setText(bundle.getString("ExportNafResultKey")); // NOI18N - jmiExport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportActionPerformed(evt); - } - }); - jmnFile.add(jmiExport); - - jmiExportFbb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExportFbb.setText(bundle.getString("ExportFBBResultXML")); // NOI18N - jmiExportFbb.setActionCommand(bundle.getString("FBBExport")); // NOI18N - jmiExportFbb.setLabel(bundle.getString("FBBExport")); // NOI18N - jmiExportFbb.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportFbbActionPerformed(evt); - } - }); - jmnFile.add(jmiExportFbb); - - jmiExportFbb1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExportFbb1.setText(bundle.getString("ExportFBBResultKey")); // NOI18N - jmiExportFbb1.setLabel(bundle.getString("FBBFullExport")); // NOI18N - jmiExportFbb1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportFbb1ActionPerformed(evt); - } - }); - jmnFile.add(jmiExportFbb1); - jmnFile.add(jSeparator2); - - jmiExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Halt.png"))); // NOI18N - jmiExit.setText(bundle.getString("QuitKey")); // NOI18N - jmiExit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExitActionPerformed(evt); - } - }); - jmnFile.add(jmiExit); - - jMenuBar1.add(jmnFile); - - jmnTools.setText(bundle.getString("Tools")); // NOI18N - - jmiEditTeam.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/New.png"))); // NOI18N - jmiEditTeam.setText(bundle.getString("ChangeRosters")); // NOI18N - jmiEditTeam.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditTeamActionPerformed(evt); - } - }); - jmnTools.add(jmiEditTeam); - jmnTools.add(jSeparator5); - - jcxAllowSpecialSkill.setText(bundle.getString("AUTORISER LES COMPÉTENCES SPÉCIALES")); // NOI18N - jcxAllowSpecialSkill.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxAllowSpecialSkillActionPerformed(evt); - } - }); - jmnTools.add(jcxAllowSpecialSkill); - jmnTools.add(jSeparator4); - - jmiNafLoad.setText(bundle.getString("UpdateCoachNAFDatas")); // NOI18N - jmiNafLoad.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiNafLoadActionPerformed(evt); - } - }); - jmnTools.add(jmiNafLoad); - jmnTools.add(jSeparator11); - - jcxPatchPortugal.setText(bundle.getString("PortugalPatch")); // NOI18N - jcxPatchPortugal.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxPatchPortugalActionPerformed(evt); - } - }); - jmnTools.add(jcxPatchPortugal); - jmnTools.add(jSeparator13); - - jcxUseColor.setSelected(true); - jcxUseColor.setText(bundle.getString("UseColor")); // NOI18N - jcxUseColor.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxUseColorActionPerformed(evt); - } - }); - jmnTools.add(jcxUseColor); - - jcxUseImage.setText(bundle.getString("UseImage")); // NOI18N - jcxUseImage.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxUseImageActionPerformed(evt); - } - }); - jmnTools.add(jcxUseImage); - - java.util.ResourceBundle bundle1 = java.util.ResourceBundle.getBundle("tourma/languages/language_en"); // NOI18N - jcxDisplayRosters.setText(bundle1.getString("DisplayRostersInFullScreen")); // NOI18N - jcxDisplayRosters.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxDisplayRostersActionPerformed(evt); - } - }); - jmnTools.add(jcxDisplayRosters); - - jMenuBar1.add(jmnTools); - - jmnParameters.setText(bundle.getString("Parameters")); // NOI18N - - jmiGenerateFirstRound.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Generate.png"))); // NOI18N - jmiGenerateFirstRound.setText(bundle.getString("GenerateFirstRound")); // NOI18N - jmiGenerateFirstRound.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiGenerateFirstRoundActionPerformed(evt); - } - }); - jmnParameters.add(jmiGenerateFirstRound); - jmnParameters.add(jSeparator20); - - jmiMassAdd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Add.png"))); // NOI18N - jmiMassAdd.setText(bundle.getString("MassAdd")); // NOI18N - jmiMassAdd.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiMassAddActionPerformed(evt); - } - }); - jmnParameters.add(jmiMassAdd); - jmnParameters.add(jSeparator6); - - jmiSubstitutePlayer.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/User2.png"))); // NOI18N - jmiSubstitutePlayer.setText(bundle.getString("MakeSubstitution")); // NOI18N - jmiSubstitutePlayer.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiSubstitutePlayerActionPerformed(evt); - } - }); - jmnParameters.add(jmiSubstitutePlayer); - jmnParameters.add(jSeparator15); - - jcxmiAsServer.setText(bundle.getString("AsServer")); // NOI18N - jcxmiAsServer.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxmiAsServerActionPerformed(evt); - } - }); - jmnParameters.add(jcxmiAsServer); - - jmiEditColors.setText(bundle.getString("WebColors")); // NOI18N - jmiEditColors.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditColorsActionPerformed(evt); - } - }); - jmnParameters.add(jmiEditColors); - - jmiEditWebPort.setText(bundle.getString("EditWebPort")); // NOI18N - jmiEditWebPort.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditWebPortActionPerformed(evt); - } - }); - jmnParameters.add(jmiEditWebPort); - - jmiEditDescription.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Zoom.png"))); // NOI18N - jmiEditDescription.setText(bundle.getString("EditDescription")); // NOI18N - jmiEditDescription.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditDescriptionActionPerformed(evt); - } - }); - jmnParameters.add(jmiEditDescription); - - jcxmiRemoteEdit.setText(bundle.getString("RemoteMatchEdit")); // NOI18N - jcxmiRemoteEdit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxmiRemoteEditActionPerformed(evt); - } - }); - jmnParameters.add(jcxmiRemoteEdit); - jmnParameters.add(jSeparator19); - - jmiExportWebServerAsZIP.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/zip_32.png"))); // NOI18N - jmiExportWebServerAsZIP.setText(bundle.getString("ExportToZip")); // NOI18N - jmiExportWebServerAsZIP.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportWebServerAsZIPActionPerformed(evt); - } - }); - jmnParameters.add(jmiExportWebServerAsZIP); - - jmiExportWebServerToSite.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExportWebServerToSite.setText(bundle.getString("ExportWebToSite")); // NOI18N - jmiExportWebServerToSite.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportWebServerToSiteActionPerformed(evt); - } - }); - jmnParameters.add(jmiExportWebServerToSite); - - jMenuBar1.add(jmnParameters); - - jmnRound.setText(bundle.getString("CurrentRound")); // NOI18N - - jmiGenerateNextRound.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK)); - jmiGenerateNextRound.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Generate.png"))); // NOI18N - jmiGenerateNextRound.setText(bundle.getString("GenerateNextRoundKey")); // NOI18N - jmiGenerateNextRound.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiGenerateNextRoundActionPerformed(evt); - } - }); - jmnRound.add(jmiGenerateNextRound); - jmnRound.add(jSeparator7); - - jmiDelRound.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.CTRL_MASK)); - jmiDelRound.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/trashcan_empty.png"))); // NOI18N - jmiDelRound.setText(bundle.getString("DeleteCurrentRoundKey")); // NOI18N - jmiDelRound.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiDelRoundActionPerformed(evt); - } - }); - jmnRound.add(jmiDelRound); - jmnRound.add(jSeparator8); - - jmiChangePairing.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.CTRL_MASK)); - jmiChangePairing.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Swap.png"))); // NOI18N - jmiChangePairing.setText(bundle.getString("ChangePairing")); // NOI18N - jmiChangePairing.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiChangePairingActionPerformed(evt); - } - }); - jmnRound.add(jmiChangePairing); - - jmiEditCoef.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_K, java.awt.event.InputEvent.CTRL_MASK)); - jmiEditCoef.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/reload.png"))); // NOI18N - jmiEditCoef.setText(bundle.getString("ChangeCoef")); // NOI18N - jmiEditCoef.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditCoefActionPerformed(evt); - } - }); - jmnRound.add(jmiEditCoef); - jmnRound.add(jSeparator9); - - jmiPrintLabels.setText(bundle.getString("PrintRoundLabels")); // NOI18N - jmiPrintLabels.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiPrintLabelsActionPerformed(evt); - } - }); - jmnRound.add(jmiPrintLabels); - jmnRound.add(jSeparator16); - - jckmiRoundOnly.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK)); - jckmiRoundOnly.setText(bundle.getString("RoundOnlyRanking")); // NOI18N - jckmiRoundOnly.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jckmiRoundOnlyActionPerformed(evt); - } - }); - jmnRound.add(jckmiRoundOnly); - - jckmiHideNonNaf.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK)); - jckmiHideNonNaf.setText(bundle.getString("HideNonNaf")); // NOI18N - jckmiHideNonNaf.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jckmiHideNonNafActionPerformed(evt); - } - }); - jmnRound.add(jckmiHideNonNaf); - jmnRound.add(jSeparator10); - - jmiAddFreeMatch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ADD, java.awt.event.InputEvent.CTRL_MASK)); - jmiAddFreeMatch.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Add.png"))); // NOI18N - jmiAddFreeMatch.setText(bundle.getString("AddMatch")); // NOI18N - jmiAddFreeMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiAddFreeMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiAddFreeMatch); - - jmiDelFreeMatch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_SUBTRACT, java.awt.event.InputEvent.CTRL_MASK)); - jmiDelFreeMatch.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Close.png"))); // NOI18N - jmiDelFreeMatch.setText(bundle.getString("DelMatch")); // NOI18N - jmiDelFreeMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiDelFreeMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiDelFreeMatch); - jmnRound.add(jSeparator12); - - jMenu1.setText(bundle.getString("FullScreen")); // NOI18N - - jmiFullScreenMatchs.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenMatchs.setText(bundle.getString("FullScreenMatchIndiv")); // NOI18N - jmiFullScreenMatchs.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenMatchsActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenMatchs); - - jmiFullScreenMatchsClash.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK)); - jmiFullScreenMatchsClash.setText(bundle.getString("FullScreenMatchIndivClash")); // NOI18N - jmiFullScreenMatchsClash.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenMatchsClashActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenMatchsClash); - - jmiFullScreenRankGeneral.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankGeneral.setText(bundle.getString("FullScreenIndivRank")); // NOI18N - jmiFullScreenRankGeneral.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankGeneralActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankGeneral); - - jmiFullScreenRankAnnexIndiv.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexIndiv.setText(bundle.getString("FullScreenIndivAnnexRank")); // NOI18N - jmiFullScreenRankAnnexIndiv.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexIndivActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexIndiv); - - jmiFullScreenRankAnnexIndiv1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexIndiv1.setText(bundle.getString("FullScreenIndivAnnexShort")); // NOI18N - jmiFullScreenRankAnnexIndiv1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexIndiv1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexIndiv1); - - jmiFullScreenRankTeam.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankTeam.setText(bundle.getString("FullScreenTeamRank")); // NOI18N - jmiFullScreenRankTeam.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankTeamActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankTeam); - - jmiFullScreenRankAnnexTeam.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Y, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexTeam.setText(bundle.getString("FullScreenTeamAnnexRank")); // NOI18N - jmiFullScreenRankAnnexTeam.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexTeamActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexTeam); - - jmiFullScreenRankAnnexTeam1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexTeam1.setText(bundle.getString("FullScreenTeamAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexTeam1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexTeam1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexTeam1); - - jmiFullScreenRankClan.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_K, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankClan.setText(bundle.getString("FullScreenClanRank")); // NOI18N - jmiFullScreenRankClan.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankClanActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankClan); - - jmiFullScreenRankAnnexClan.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexClan.setText(bundle.getString("FullScreenClanAnnexRank")); // NOI18N - jmiFullScreenRankAnnexClan.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexClanActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexClan); - - jmiFullScreenRankAnnexClan1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexClan1.setText(bundle.getString("FullScreenClanAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexClan1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexClan1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexClan1); - - jmiFullScreenRankGroups.setText(bundle.getString("FullScreenGroupRank")); // NOI18N - jmiFullScreenRankGroups.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankGroupsActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankGroups); - - jmiFullScreenRankAnnexGroups.setText(bundle.getString("FullScreenGroupAnnexRank")); // NOI18N - jmiFullScreenRankAnnexGroups.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexGroupsActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexGroups); - - jmiFullScreenRankAnnexGroups1.setText(bundle.getString("FullScreenGroupAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexGroups1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexGroups1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexGroups1); - - jmiFullScreenRankCategory.setText(bundle.getString("FullScreenCategoryRank")); // NOI18N - jmiFullScreenRankCategory.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankCategoryActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankCategory); - - jmiFullScreenRankAnnexCategory.setText(bundle.getString("FullScreenCategoryAnnexRank")); // NOI18N - jmiFullScreenRankAnnexCategory.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexCategoryActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexCategory); - - jmiFullScreenRankAnnexCategory1.setText(bundle.getString("FullScreenCategoryAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexCategory1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexCategory1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexCategory1); - - jmiFullScreenPool.setText(bundle.getString("FullScreenPoolRank")); // NOI18N - jmiFullScreenPool.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenPoolActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenPool); - - jmiFullScreenRankAnnexPool.setText(bundle.getString("FullScreenPoolAnnexRank")); // NOI18N - jmiFullScreenRankAnnexPool.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexPoolActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexPool); - - jmiFullScreenRankAnnexPool1.setText(bundle.getString("FullScreenPoolAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexPool1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexPool1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexPool1); - - jmnRound.add(jMenu1); - jmnRound.add(jSeparator14); - - jmiConceedMatch.setText(bundle.getString("MatchConceed")); // NOI18N - jmiConceedMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiConceedMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiConceedMatch); - - jmiCancelConceedMatch.setText(bundle.getString("AnnulerMatchConceed")); // NOI18N - jmiCancelConceedMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiCancelConceedMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiCancelConceedMatch); - - jmiRefuseMatch.setText(bundle.getString("MatchRefused")); // NOI18N - jmiRefuseMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiRefuseMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiRefuseMatch); - - jmiCancelMatchRefuse.setText(bundle.getString("CancelMatchRefuse")); // NOI18N - jmiCancelMatchRefuse.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiCancelMatchRefuseActionPerformed(evt); - } - }); - jmnRound.add(jmiCancelMatchRefuse); - jmnRound.add(jSeparator17); - - jMenu2.setText(bundle.getString("Reports")); // NOI18N - - jmiIndivReport.setText(bundle.getString("IndividualReport")); // NOI18N - jmiIndivReport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiIndivReportActionPerformed(evt); - } - }); - jMenu2.add(jmiIndivReport); - - jmiClanReport.setText(bundle.getString("ClanReport")); // NOI18N - jmiClanReport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiClanReportActionPerformed(evt); - } - }); - jMenu2.add(jmiClanReport); - - jmiTeamReport.setText(bundle.getString("TeamReport")); // NOI18N - jmiTeamReport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiTeamReportActionPerformed(evt); - } - }); - jMenu2.add(jmiTeamReport); - - jmnRound.add(jMenu2); - jmnRound.add(jSeparator18); - - jMenuBar1.add(jmnRound); - - jmnHelp.setText(bundle.getString("?")); // NOI18N - - jmiAbout.setText(bundle.getString("AboutKey")); // NOI18N - jmiAbout.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiAboutActionPerformed(evt); - } - }); - jmnHelp.add(jmiAbout); - - jmiRevisions.setText(bundle.getString("SoftwareRevisionsKey")); // NOI18N - jmiRevisions.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiRevisionsActionPerformed(evt); - } - }); - jmnHelp.add(jmiRevisions); - jmnHelp.add(jSeparator3); - - jmiAideEnLigne.setText(bundle.getString("Help")); // NOI18N - jmiAideEnLigne.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiAideEnLigneActionPerformed(evt); - } - }); - jmnHelp.add(jmiAideEnLigne); - - jMenuBar1.add(jmnHelp); - - setJMenuBar(jMenuBar1); - - pack(); - }// //GEN-END:initComponents - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiSaveAsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSaveAsActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_TourMaXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - StringBuffer url2 = new StringBuffer(jfc.getSelectedFile().getAbsolutePath()); - String ext = StringConstants.CS_NULL; - final int i = url2.toString().lastIndexOf('.'); - if (i > 0 && i < url2.length() - 1) { - ext = url2.substring(i + 1).toLowerCase(Locale.getDefault()); - } - - if (!ext.equals(StringConstants.CS_MINXML)) { - url2 = url2.append(".XML"); - } - mFile = new File(url2.toString()); - - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).saveXML(mFile); - } - - currentPath = jfc.getSelectedFile().getAbsolutePath(); - - } - }//GEN-LAST:event_jmiSaveAsActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSaveActionPerformed - if (mFile != null) { - if (mTournament instanceof Tournament) { - - ((Tournament) mTournament).saveXML(mFile); - - } - } else { - jmiSaveAsActionPerformed(evt); - } - }//GEN-LAST:event_jmiSaveActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiChargerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiChargerActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_TourMaXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).loadXML(jfc.getSelectedFile()); - mFile = jfc.getSelectedFile(); - updateTree(); - update(); - currentPath = jfc.getSelectedFile().getAbsolutePath(); - } - - } - }//GEN-LAST:event_jmiChargerActionPerformed - - private static final String CS_None = "None"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiNouveauActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiNouveauActionPerformed - - mTournament = Tournament.resetTournament(); - - JdgParameters jdgParams = new JdgParameters(this, true); - jdgParams.setVisible(true); - - mTournament = Tournament.getTournament(); - if (mTournament.getParams().getGame() == RosterType.C_DREAD_BALL) { - RosterType.initCollection(RosterType.C_DREAD_BALL); - jmiExport.setEnabled(false); - jmiExportFbb.setEnabled(false); - jcxAllowSpecialSkill.setEnabled(false); - } else { - RosterType.initCollection(RosterType.C_BLOOD_BOWL); - LRB.getLRB(); - } - - mTournament.clearGroups(); - final Group group = new Group(Translate.translate(CS_None)); - mTournament.addGroup(group); - - for (int i = 0; i < RosterType.getRostersNamesCount(); i++) { - String mRostersName = RosterType.getRostersName(i); - group.addRoster(RosterType.getRosterType(mRostersName)); - } - - update(); - }//GEN-LAST:event_jmiNouveauActionPerformed - - private final static String CS_NAFXMLFile = "NAF XML FILE"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_NAFXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportNAF(jfc.getSelectedFile()); - } - - currentPath = jfc.getSelectedFile().getAbsolutePath(); - - } - }//GEN-LAST:event_jmiExportActionPerformed - - private final static String CS_DoYouWantToSave = "VOULEZ VOUS SAUVGARDER ?"; - private final static String CS_Exit = "EXIT"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExitActionPerformed - int res = JOptionPane.showConfirmDialog(this, - Translate.translate(CS_DoYouWantToSave), - Translate.translate(CS_Exit), - JOptionPane.YES_NO_CANCEL_OPTION); - if (res == JOptionPane.CANCEL_OPTION) { - } else { - if (res == JOptionPane.YES_OPTION) { - if (mFile.getName().isEmpty()) { - jmiSaveAsActionPerformed(null); - } else { - jmiSaveActionPerformed(null); - } - } - System.exit(0); - } - }//GEN-LAST:event_jmiExitActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiRevisionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRevisionsActionPerformed - JdgRevisions jdg = new JdgRevisions(this, true); - jdg.setVisible(true); -}//GEN-LAST:event_jmiRevisionsActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiAideEnLigneActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAideEnLigneActionPerformed - JdgOnlineHelp jdg = new JdgOnlineHelp(this, false); - jdg.setVisible(true); - }//GEN-LAST:event_jmiAideEnLigneActionPerformed - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed - RMIThread.stop(); - if (JOptionPane.showConfirmDialog(this, - Translate.translate(CS_DoYouWantToSave), - Translate.translate(CS_Exit), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - if (mFile.getName().isEmpty()) { - jmiSaveAsActionPerformed(null); - } else { - jmiSaveActionPerformed(null); - } - } - }//GEN-LAST:event_formWindowClosed - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAboutActionPerformed - JdgAbout jdg = new JdgAbout(this, true); - jdg.setVisible(true); -}//GEN-LAST:event_jmiAboutActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing - if (JOptionPane.showConfirmDialog(this, - Translate.translate(CS_DoYouWantToSave), - Translate.translate(CS_Exit), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - if (mFile == null) { - jmiSaveAsActionPerformed(null); - } else if (mFile.getName().isEmpty()) { - jmiSaveAsActionPerformed(null); - } else { - jmiSaveActionPerformed(null); - } - } - }//GEN-LAST:event_formWindowClosing - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiEditTeamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditTeamActionPerformed - final JdgRoster jdg = new JdgRoster(this, true); - jdg.setVisible(true); - }//GEN-LAST:event_jmiEditTeamActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jcxAllowSpecialSkillActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxAllowSpecialSkillActionPerformed - LRB.getLRB().setAllowSpecialSkills(jcxAllowSpecialSkill.getState()); - }//GEN-LAST:event_jcxAllowSpecialSkillActionPerformed - - private final static String CS_FBBCSVFile = "FBB CSV FILE"; - private final static String CS_FBBXMLFile = "FBB XML FILE"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExportFbbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportFbbActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_FBBCSVFile), - new String[]{"CSV", - "CSV"}); - jfc.setFileFilter(filter1); - - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportFBB(jfc.getSelectedFile()); - } - currentPath = jfc.getSelectedFile().getAbsolutePath(); - } - - }//GEN-LAST:event_jmiExportFbbActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExportFbb1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportFbb1ActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_FBBXMLFile), - new String[]{"FBB_XML", - "FBB_XML"}); - jfc.setFileFilter(filter1); - - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - final File f = jfc.getSelectedFile(); - if (f.getName().endsWith(".fbb_xml")) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportFullFBB(f); - } - } else { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportFullFBB(new File(f.getAbsolutePath() + ".fbb_xml")); - } - } - } - - }//GEN-LAST:event_jmiExportFbb1ActionPerformed - - private final static String CS_Check = "Check"; - private final static String CS_LargeVictoryPointsAreNotSuperiorToVictoryPoints = "Large victory points are not superior to victory points"; - private final static String CS_LittleLossPointsAreNotSuperiorToLossPoints = "Little loss points are not superior to loss points"; - private final static String CS_LargeVictoryGapIsNotMoreThanOneTouchdown = "Large victory gap is not more than 1 touchdown"; - private final static String CS_LittleLostGapIsNotSuperiorTo0 = "Little lost gap is not superior to 0"; - private final static String CS_2DrawsAreMoreThan1Victory = "2 draws are more than one victory"; - private final static String CS_2LostAreMoreThan1Draw = "2 lost are more than one draw"; - private final static String CS_2LittleLostAreMoreThanOneDraw = "2 little loss are more than one draw"; - private final static String CS_2TeamDrawsAreMoreThan1TeamVictory = "2 team draws are more than one team victory"; - private final static String CS_2TeamLostAreMoreThan1TeamVictory = "2 team lost are more than one team draw"; - private final static String CS_2TeamDrawBonusAreMoreThan1TeamVictoryBonus = "2 team draw bonus are more than one team victory bonus"; - - private boolean areRulesValid() { - - boolean valid = true; - - // Check that large victory is more than victory - if (mTournament.getParams().isUseLargeVictory()) { - valid = (mTournament.getParams().getPointsIndivLargeVictory() > mTournament.getParams().getPointsIndivVictory()); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LargeVictoryPointsAreNotSuperiorToVictoryPoints), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - - if (valid) { - // Check that little loss is more than loss - if (mTournament.getParams().isUseLittleLoss()) { - valid = (mTournament.getParams().getPointsIndivLittleLost() > mTournament.getParams().getPointsIndivLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LittleLossPointsAreNotSuperiorToLossPoints), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (valid) { - // Check that touchdown gap is positive - if (mTournament.getParams().isUseLargeVictory()) { - valid = (mTournament.getParams().getGapLargeVictory() > 1); - if (!valid) { - - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LargeVictoryGapIsNotMoreThanOneTouchdown), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (valid) { - // Check that little loss is positive - if (mTournament.getParams().isUseLittleLoss()) { - valid = (mTournament.getParams().getGapLittleLost() > 0); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LittleLostGapIsNotSuperiorTo0), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsIndivVictory() >= 2 * mTournament.getParams().getPointsIndivDraw()); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_2DrawsAreMoreThan1Victory), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - - if (valid) { - // Check that draw is more than 2 lost - valid = (mTournament.getParams().getPointsIndivDraw() >= 2 * mTournament.getParams().getPointsIndivLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2LostAreMoreThan1Draw), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - - if (valid) { - // Check that little loss is positive - if (mTournament.getParams().isUseLittleLoss()) { - valid = (mTournament.getParams().getPointsIndivDraw() >= 2 * mTournament.getParams().getPointsIndivLittleLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2LittleLostAreMoreThanOneDraw), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (mTournament.getParams().isTeamTournament()) { - if (mTournament.getParams().getTeamPairing() == TEAM_PAIRING) { - if (mTournament.getParams().isTeamVictoryOnly()) { - if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsTeamVictory() >= 2 * mTournament.getParams().getPointsTeamDraw()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2TeamDrawsAreMoreThan1TeamVictory), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - - if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsTeamDraw() >= 2 * mTournament.getParams().getPointsTeamLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2TeamLostAreMoreThan1TeamVictory), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - } else if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsTeamVictoryBonus() >= 2 * mTournament.getParams().getPointsTeamDrawBonus()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2TeamDrawBonusAreMoreThan1TeamVictoryBonus), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - } - } - - return valid; - } - - private static final String CS_Random = "Random"; - private static final String CS_Cup = "Cup"; - private static final String CS_RegisteringOrder = "Registering order"; - private static final String CS_RoundRobin = "ROUND ROBIN"; - private static final String CS_OddTeamNumber = "OddTeamNumber"; - private static final String CS_ManualChoice = "CHOIX MANUEL"; - private static final String CS_Pools = "POULES"; - private static final String CS_FreeRound = "FREE_ROUND"; - private static final String CS_NafRanking = "NAF_RANK"; - private static final String CS_NafRankingAvg = "NAF_RANK_AVG"; - private static final String CS_RandomAndBalancing = "RandomAndBalancing"; - private static final String CS_Generation = "GÉNÉRATION"; - private static final String CS_ChooseGenerationMethod = "CHOISISSEZ LA MÉTHODE DE GÉNÉRATION: "; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiGenerateFirstRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiGenerateFirstRoundActionPerformed - if (areRulesValid()) { - - if (JOptionPane.showConfirmDialog(this, java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("AreYouSure?ItWillEraseAllRounds"), java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("FirstRound"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - if (mTournament.getParams().isTeamTournament() && (mTournament.getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING) && mTournament.getTeamsCount() % 2 > 0) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_OddTeamNumber)); - } else { - - final ArrayList labels = new ArrayList<>(); - final ArrayList Options = new ArrayList<>(); - - /** - * GenRandom possible ? - */ - labels.add(Translate.translate(CS_Random)); - Options.add(Generation.GEN_RANDOM); - - /** - * Coupe - */ - labels.add(Translate.translate(CS_Cup)); - Options.add(Generation.GEN_CUP); - - /** - * Ordre - */ - labels.add(Translate.translate(CS_RegisteringOrder)); - Options.add(Generation.GEN_ORDER); - - /** - * Round Robin - */ - labels.add(Translate.translate(CS_RoundRobin)); - Options.add(Generation.GEN_RROBIN); - - /** - * manuel - */ - labels.add(Translate.translate(CS_ManualChoice)); - Options.add(Generation.GEN_MANUAL); - - /** - * Poules - */ - labels.add(Translate.translate(CS_Pools)); - Options.add(Generation.GEN_POOL); - - /** - * Naf Ranking - */ - labels.add(Translate.translate(CS_NafRanking)); - Options.add(Generation.GEN_NAF); - - /** - * Naf Ranking - */ - labels.add(Translate.translate(CS_FreeRound)); - Options.add(Generation.GEN_FREE); - - /** - * Naf Ranking - */ - labels.add(Translate.translate(CS_NafRankingAvg)); - Options.add(Generation.GEN_NAF_AVG); - - /* - OPTION NON CONCLUANTE - - if (Tournament.getTournament().getParams().isTeamTournament()) { - if (Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.INDIVIDUAL_PAIRING) { - // Balanced Options - labels.add( - Translate.translate(CS_RandomAndBalancing)); - Options.add(Generation.GEN_BALANCED); - } - }*/ - final JPanel jpn = new JPanel(new BorderLayout()); - final JComboBox jcb = new JComboBox(labels.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - final JLabel jlb = new JLabel( - Translate.translate(CS_ChooseGenerationMethod)); - jpn.add(jlb, BorderLayout.NORTH); - - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), jpn, - Translate.translate(CS_Generation), - JOptionPane.QUESTION_MESSAGE); - final int index = jcb.getSelectedIndex(); - - Generation.generateFirstRound(Options.get(index)); - - updateTree(); - update(); - - } - - } - - } - }//GEN-LAST:event_jmiGenerateFirstRoundActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jtrPanelsValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jtrPanelsValueChanged - - TreePath path; - if (evt != null) { - path = evt.getNewLeadSelectionPath(); - } else { - path = jtrPanels.getPathForRow(1); - } - if (path != null) { - - final DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); - if (node != null) { - final Object object = node.getUserObject(); - if (object instanceof Parameters) { - jspSplit.remove(jpnContent); - JPNParameters jpn = new JPNParameters(); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - } - if (object instanceof Round) { - for (int i = 0; i < mTournament.getRoundsCount(); i++) { - if (mTournament.getRound(i).equals(object)) { - jspSplit.remove(jpnContent); - JPNRound jpn = new JPNRound(i, (Round) object, mTournament); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpn.setRoundOnly(jckmiRoundOnly.isSelected()); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - break; - } - } - } - - if (object.equals(Translate.translate(MainTreeModel.CS_Cup))) { - jspSplit.remove(jpnContent); - JPNCup jpn = new JPNCup(); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - } - - if (object.equals(Translate.translate(MainTreeModel.CS_Statistics))) { - jspSplit.remove(jpnContent); - JPNStatistics jpn = new JPNStatistics(); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - } - - } - - updateMenus(); - repaint(); - } - - }//GEN-LAST:event_jtrPanelsValueChanged - - private ProgressMonitor progressMonitor; - - private static final String CS_DownloadFromNAF = "DownloadFromNAF"; - private static final String CS_Downloading = "Downloading"; - - private void jmiNafLoadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiNafLoadActionPerformed - - progressMonitor = new ProgressMonitor(this, - Translate.translate(CS_DownloadFromNAF), - Translate.translate(CS_Downloading), 0, - Tournament.getTournament().getCoachsCount()); - progressMonitor.setProgress(0); - - task = new NafTask(progressMonitor); - task.addPropertyChangeListener(this); - task.execute(); - - update(); - }//GEN-LAST:event_jmiNafLoadActionPerformed - - private final static String CS_WhichCoachIsSubstituted = "WhichCoachIsSubstituted"; - private final static String CS_Substitution = "Substitution"; - private final static String CS_Round = "Round"; - private final static String CS_ACCR_Versus = "vs"; - private final static String CS_WhichMatch = "WhichMatch"; - private final static String CS_ChooseASubstitute = "ChooseASubstitute"; - private final static String CS_NewDOTDOTDOT = "New..."; - - - private void jmiSubstitutePlayerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSubstitutePlayerActionPerformed - // Select Player to subtitute - ArrayList list = new ArrayList<>(); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - list.add(Tournament.getTournament().getCoach(i)); - } - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - if (!Tournament.getTournament().getCoach(i).isActive()) { - list.remove(i); - } - } - JComboBox jcb = new JComboBox<>(list.toArray()); - JLabel jlb = new JLabel( - Translate.translate(CS_WhichCoachIsSubstituted) - ); - JPanel jpn = new JPanel(new BorderLayout()); - jpn.add(jlb, BorderLayout.NORTH); - jpn.add(jcb, BorderLayout.CENTER); - int ret = JOptionPane.showConfirmDialog(this, jpn, - Translate.translate(CS_Substitution), - JOptionPane.OK_CANCEL_OPTION); - if (ret == JOptionPane.OK_OPTION) { - Coach c = (Coach) jcb.getSelectedItem(); - ArrayList matchs_descr = new ArrayList<>(); - - // Select Match - for (int i = 0; i < c.getMatchCount(); i++) { - Match mMatch = c.getMatch(i); - CoachMatch m = (CoachMatch) mMatch; - String tmp - = Translate.translate(CS_Round) - + " " + (Tournament.getTournament().getRoundIndex(m.getRound()) + 1); - tmp = tmp + " / " + m.getCompetitor1().getDecoratedName() + " " + Translate.translate(CS_ACCR_Versus) + " " - + m.getCompetitor2().getDecoratedName(); - matchs_descr.add(tmp); - } - jpn.remove(jcb); - jcb = new JComboBox(matchs_descr.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - jlb.setText(Translate.translate(CS_WhichMatch)); - JOptionPane.showConfirmDialog(this, jpn, - Translate.translate(CS_Substitution), - JOptionPane.OK_OPTION); - CoachMatch m = (CoachMatch) c.getMatch(jcb.getSelectedIndex()); - - // Select subtitute - ArrayList availableCoachs = new ArrayList<>(); - ArrayList availableCoachsName = new ArrayList<>(); - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - Coach sub = Tournament.getTournament().getCoach(i); - if (!sub.isActive()) { - availableCoachs.add(sub); - } - } - availableCoachs.add(Coach.getNullCoach()); - for (Coach availableCoach : availableCoachs) { - availableCoachsName.add(availableCoach.getDecoratedName()); - } - - availableCoachsName.add( - Translate.translate(CS_NewDOTDOTDOT) - ); - jpn.remove(jcb); - jcb = new JComboBox(availableCoachsName.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - jlb.setText( - Translate.translate(CS_ChooseASubstitute) - ); - JOptionPane.showConfirmDialog(this, jpn, - Translate.translate(CS_Substitution), - JOptionPane.OK_OPTION); - - boolean cancel = false; - // Create Substitution - // If None - if (jcb.getSelectedIndex() == availableCoachs.size() - 1) { - if (m.getCompetitor1() == c) { - m.setSubstitute1(null); - } - if (m.getCompetitor2() == c) { - m.setSubstitute2(null); - } - } else { - Coach sub; - // New - if (jcb.getSelectedIndex() == availableCoachs.size()) { - sub = new Coach(); - sub.setRoster(RosterType.getRosterType(0)); - JdgCoach jdg = new JdgCoach(this, true, sub); - jdg.setVisible(true); - if (!sub.getName().equals("")) { - Tournament.getTournament().addCoach(sub); - sub.setActive(false); - cancel = true; - } - } else { - sub = availableCoachs.get(jcb.getSelectedIndex()); - } - - if (!cancel) { - Substitute s = new Substitute(); - s.setMatch(m); - s.setSubstitute(sub); - s.setTitular(c); - - if (m.getCompetitor1() == c) { - m.setSubstitute1(s); - } - if (m.getCompetitor2() == c) { - m.setSubstitute2(s); - } - } - } - } - - }//GEN-LAST:event_jmiSubstitutePlayerActionPerformed - - private void jmiEditDescriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditDescriptionActionPerformed - /*JTextArea jta = new JTextArea(40, 80); - jta.setText(Tournament.getTournament().getDescription()); - */ - - EkitCore editor = new EkitCore(); - - editor.setSize(320, 320); - editor.setMinimumSize(new Dimension(320, 320)); - editor.setPreferredSize(new Dimension(320, 300)); - - JPanel jsp - = new JPanel(new VerticalLayout()); - //jsp.add(editor.getToolBarMain(true)); - jsp.add(editor.getMenuBar()); - jsp.add(editor.getToolBarFormat(true)); - jsp.add(editor.getToolBarStyles(true)); - jsp.add(editor.getToolBarMain(true)); - - jsp.add(editor); - - String text = "
" + Tournament.getTournament().getDescription() + ""; - editor.setDocumentText(text); - - //JScrollPane jsp = new JScrollPane(html); - JOptionPane.showInputDialog(this, jsp); - String body = editor.getDocumentBody(); - - Tournament.getTournament().setDescription(body); - - }//GEN-LAST:event_jmiEditDescriptionActionPerformed - - private void jmiDelRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiDelRoundActionPerformed - if (JOptionPane.showConfirmDialog(this, java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("ConfirmEraseCurrentRound"), java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("EraseRound"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - // Remove mRound - Round round = jpnr.getRound(); - - // Remove matchs from coach reference list - ArrayList cms = round.getCoachMatchs(); - for (CoachMatch m : cms) { - m.getCompetitor1().removeMatch(m); - m.getCompetitor2().removeMatch(m); - } - - // remove matchs from competitors - for (int i = 0; i < round.getMatchsCount(); i++) { - final Match m = round.getMatch(i); - m.getCompetitor1().removeMatch(m); - m.getCompetitor2().removeMatch(m); - } - - mTournament.removeRound(round); - - update(); - updateTree(); - } - } - }//GEN-LAST:event_jmiDelRoundActionPerformed - - private final static String CS_FirstTableCoef = "FirstTableCoef"; - private final static String CS_LastTableCoef = "LastTableCoef"; - private final static String CS_RoundCoefficient = "Round coefficient"; - - private void editRoundCoef(Round r) { - - JPanel jpn = new JPanel(); - jpn.setLayout(new GridLayout(2, 2)); - JLabel jlb1 = new JLabel(Translate.translate(CS_FirstTableCoef)); - jlb1.setHorizontalAlignment(JLabel.TRAILING); - JLabel jlb2 = new JLabel(Translate.translate(CS_LastTableCoef)); - jlb2.setHorizontalAlignment(JLabel.TRAILING); - - JFormattedTextField jftf1 = new JFormattedTextField(new DecimalFormat("####.##")); - jftf1.setValue(new Double(r.getMaxBonus())); - - JFormattedTextField jftf2 = new JFormattedTextField(new DecimalFormat("####.##")); - jftf2.setValue(new Double(r.getMinBonus())); - - jpn.add(jlb1); - jpn.add(jftf1); - jpn.add(jlb2); - jpn.add(jftf2); - - int res = JOptionPane.showConfirmDialog(this, jpn, Translate.translate(CS_RoundCoefficient), JOptionPane.OK_CANCEL_OPTION); - if (res == JOptionPane.OK_OPTION) { - Double val1 = (Double) jftf1.getValue(); - r.setMaxBonus(val1); - Double val2 = (Double) jftf2.getValue(); - r.setMinBonus(val2); - update(); - } - - } - - private final static String CS_SwissRound = "RONDE SUISSE"; - private final static String CS_AcceleratedSwissRound = "RONDE SUISSE ACCELERÉE"; - private final static String CS_Animation = "Animation"; - - private final static String CS_Confirm = "CONFIRM"; - private final static String CS_WebMacthNotChecked = "WEB_MATCHES_NOT_CONFIRMED"; - - private void jmiGenerateNextRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiGenerateNextRoundActionPerformed - - if (areRulesValid()) { - final ArrayList labels = new ArrayList<>(); - final ArrayList Options = new ArrayList<>(); - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - Round round = jpnr.getRound(); - - int remote = 0; - for (CoachMatch cm : round.getCoachMatchs()) { - if (cm.isRemotely()) { - remote++; - } - } - if (remote > 0) { - int res = JOptionPane.showConfirmDialog(this, Translate.translate(CS_WebMacthNotChecked), Translate.translate(CS_Confirm), JOptionPane.OK_CANCEL_OPTION); - if (res == JOptionPane.CANCEL_OPTION) { - return; - } - } - - int round_number = mTournament.getRoundIndex(round); - - /** - * Swiss possible ? - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_SwissRound)); - Options.add(Generation.GEN_SWISS); - } - - /** - * QSwiss possible ? - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_AcceleratedSwissRound)); - Options.add(Generation.GEN_QSWISS); - } - - /** - * GenRandom possible ? - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_Random)); - Options.add(Generation.GEN_RANDOM); - } - - /** - * Coupe - */ - labels.add(Translate.translate(CS_Cup)); - Options.add(Generation.GEN_CUP); - - /** - * - * Libre - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_FreeRound)); - Options.add(Generation.GEN_FREE); - } - - final JPanel jpn = new JPanel(new BorderLayout()); - final JComboBox jcb = new JComboBox(labels.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - final JLabel jlb = new JLabel(Translate.translate(CS_ChooseGenerationMethod)); - jpn.add(jlb, BorderLayout.NORTH); - - final JCheckBox jcxClash = new JCheckBox(Translate.translate(CS_Animation)); - jpn.add(jcxClash, BorderLayout.SOUTH); - - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), jpn, - Translate.translate(CS_Generation), JOptionPane.QUESTION_MESSAGE); - - final int index = jcb.getSelectedIndex(); - - Generation.nextRound(round, Options.get(index), round_number); - - if (mTournament.getParams().isTableBonusPerRound()) { - editRoundCoef(mTournament.getRound(mTournament.getRoundsCount() - 1)); - } - - if (jpnContent instanceof JPNRound) { - ((JPNRound) jpnContent).update(); - update(); - } - - updateTree(); - - if (jcxClash.isSelected()) { - try { - JFullScreen fs = new JFullScreenMatchs(Tournament.getTournament().getRound(round_number + 1), true); - fs.setVisible(true); - } catch (IOException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - - } - } - }//GEN-LAST:event_jmiGenerateNextRoundActionPerformed - - private void jmiChangePairingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiChangePairingActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - Round round = jpnr.getRound(); - final JdgChangePairing jdg = new JdgChangePairing(MainFrame.getMainFrame(), true, round); - jdg.setVisible(true); - jpnr.update(); - } - update(); - }//GEN-LAST:event_jmiChangePairingActionPerformed - - private void jckmiRoundOnlyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jckmiRoundOnlyActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - jpnr.setRoundOnly(jckmiRoundOnly.isSelected()); - jpnr.update(); - } - }//GEN-LAST:event_jckmiRoundOnlyActionPerformed - - private static final String CS_FreeMatch = "MATCH LIBRE"; - private static final String CS_Error = "ERROR"; - private static final String CS_ImpossibleMatch = "MATCH IMPOSSIBLE"; - - private void jmiAddFreeMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAddFreeMatchActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - Round round = jpnr.getRound(); - if (Tournament.getTournament().getParams().isTeamTournament()) { - - final ArrayList teams1 = new ArrayList<>(); - final ArrayList teams2 = new ArrayList<>(); - - final JComboBox jcb1 = new JComboBox<>(); - final JComboBox jcb2 = new JComboBox<>(); - - for (int i = 0; i < mTournament.getTeamsCount(); i++) { - final Team c = mTournament.getTeam(i); - teams1.add(c); - teams2.add(c); - jcb1.addItem(c.getName()); - jcb2.addItem(c.getName()); - } - - boolean ValidMatch = false; - - while (!ValidMatch) { - jcb1.setSelectedIndex(0); - jcb2.setSelectedIndex(1); - - final JPanel jpnQuestion = new JPanel(new BorderLayout(0, 0)); - jpnQuestion.add(jcb1, BorderLayout.WEST); - jpnQuestion.add(jcb2, BorderLayout.EAST); - final JLabel jlb = new JLabel( - " " + Translate.translate(CS_ACCR_Versus) + " " - ); - jpnQuestion.add(jlb, BorderLayout.CENTER); - - final int ret = JOptionPane.showOptionDialog(MainFrame.getMainFrame(), jpnQuestion, - Translate.translate(CS_FreeMatch), - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); - if (ret == JOptionPane.OK_OPTION) { - if (jcb1.getSelectedIndex() != jcb2.getSelectedIndex()) { - TeamMatch m = new TeamMatch(round); - m.setCompetitor1(teams1.get(jcb1.getSelectedIndex())); - m.setCompetitor2(teams2.get(jcb2.getSelectedIndex())); - JdgPairing jdg = new JdgPairing(MainFrame.getMainFrame(), true, teams1.get(jcb1.getSelectedIndex()), teams2.get(jcb2.getSelectedIndex()), round, m); - jdg.setVisible(true); - round.addMatch(m); - - for (int cpt = 0; cpt < m.getMatchCount(); cpt++) { - CoachMatch c = m.getMatch(cpt); - c.getCompetitor1().addMatch(c); - c.getCompetitor2().addMatch(c); - } - - ValidMatch = true; - } else { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), - Translate.translate(CS_ImpossibleMatch), - Translate.translate(CS_Error), - JOptionPane.ERROR_MESSAGE); - } - } else { - ValidMatch = true; - } - } - } else { - final ArrayList Coachs1 = new ArrayList<>(); - final ArrayList Coachs2 = new ArrayList<>(); - - final JComboBox jcb1 = new JComboBox<>(); - final JComboBox jcb2 = new JComboBox<>(); - - for (int i = 0; i < mTournament.getActiveCoaches().size(); i++) { - final Coach c = mTournament.getActiveCoaches().get(i); - Coachs1.add(c); - Coachs2.add(c); - jcb1.addItem(c.getName()); - jcb2.addItem(c.getName()); - } - - boolean ValidMatch = false; - - while (!ValidMatch) { - jcb1.setSelectedIndex(0); - jcb2.setSelectedIndex(1); - - final JPanel jpnQuestion = new JPanel(new BorderLayout(0, 0)); - jpnQuestion.add(jcb1, BorderLayout.WEST); - jpnQuestion.add(jcb2, BorderLayout.EAST); - final JLabel jlb = new JLabel( - " " + Translate.translate(CS_ACCR_Versus) + " "); - jpnQuestion.add(jlb, BorderLayout.CENTER); - - final int ret = JOptionPane.showOptionDialog(MainFrame.getMainFrame(), jpnQuestion, - Translate.translate(CS_FreeMatch), - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); - - if (ret == JOptionPane.OK_OPTION) { - if (jcb1.getSelectedIndex() != jcb2.getSelectedIndex()) { - final CoachMatch m = new CoachMatch(round); - m.setCompetitor1(Coachs1.get(jcb1.getSelectedIndex())); - m.setCompetitor2(Coachs2.get(jcb2.getSelectedIndex())); - - round.addMatch(m); - m.getCompetitor1().addMatch(m); - m.getCompetitor2().addMatch(m); - ValidMatch = true; - } else { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), - Translate.translate(CS_ImpossibleMatch), - Translate.translate(CS_Error), JOptionPane.ERROR_MESSAGE); - } - } else { - ValidMatch = true; - } - } - } - jpnr.update(); - - } - }//GEN-LAST:event_jmiAddFreeMatchActionPerformed - - private void jmiDelFreeMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiDelFreeMatchActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - int row = jpnr.getMatchTableSelectedRow(); - if (row >= 0) { - Round round = jpnr.getRound(); - if (Tournament.getTournament().getParams().isTeamTournament()) { - CoachMatch c = round.getCoachMatchs().get(row); - // Fint TeamMatch corresponding to CoachMatch - int j = 0; - while (j < round.getMatchsCount()) { - TeamMatch t = ((TeamMatch) round.getMatch(j)); - int i = 0; - while (i < t.getMatchCount()) { - if (t.containsMatch(c)) { - for (int cpt = 0; cpt < t.getMatchCount(); cpt++) { - CoachMatch cm = t.getMatch(cpt); - cm.getCompetitor1().removeMatch(cm); - cm.getCompetitor2().removeMatch(cm); - } - t.getCompetitor1().removeMatch(t); - t.getCompetitor2().removeMatch(t); - round.removeMatch(t); - j = round.getMatchsCount(); - i = t.getMatchCount(); - } - i++; - } - j++; - } - } else { - CoachMatch c = (CoachMatch) round.getMatch(row); - c.getCompetitor1().removeMatch(c); - c.getCompetitor2().removeMatch(c); - round.removeMatch(c); - } - jpnr.update(); - } - - } - }//GEN-LAST:event_jmiDelFreeMatchActionPerformed - - private void jcxPatchPortugalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxPatchPortugalActionPerformed - - mTournament.getParams().setPortugal(jcxPatchPortugal.isSelected()); - - }//GEN-LAST:event_jcxPatchPortugalActionPerformed - - private static final String CS_MatchAlreadyConceededOrRefused = "MatchAlreadyConceededOrRefused"; - private static final String CS_Cancel = "Cancel"; - private static final String CS_ConceedAMatch = "ConceedAMatch"; - private static final String CS_WhoConceedTheMatch = "WhoConceedTheMatch"; - private static final String CS_RefuseAMatch = "RefuseAMatch"; - private static final String CS_WhoRefuseMatch = "WhoRefuseMatch"; - - - private void jmiConceedMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiConceedMatchActionPerformed - try { - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - if (m.isConcedeedBy1() || m.isConcedeedBy2() || m.isRefusedBy1() || m.isRefusedBy2()) { - JOptionPane.showMessageDialog(null, - Translate.translate(CS_Error), - Translate.translate(CS_MatchAlreadyConceededOrRefused), - JOptionPane.ERROR_MESSAGE); - } else { - Object[] options = new Object[3]; - options[0] = m.getCompetitor1(); - options[1] = m.getCompetitor2(); - options[2] = Translate.translate(CS_Cancel); - - Object option = JOptionPane.showInputDialog(null, - Translate.translate(CS_ConceedAMatch), - Translate.translate(CS_WhoConceedTheMatch), - JOptionPane.QUESTION_MESSAGE, null, options, options[2]); - - if (option.equals(m.getCompetitor1())) { - m.setConcedeedBy1(true); - m.setConcedeedBy2(false); - } - if (option.equals(m.getCompetitor2())) { - m.setConcedeedBy2(true); - m.setConcedeedBy1(false); - } - update(); - jpnr.update(); - } - - } - } catch (HeadlessException e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiConceedMatchActionPerformed - - private void jmiCancelConceedMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiCancelConceedMatchActionPerformed - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - m.setConcedeedBy1(false); - m.setConcedeedBy2(false); - } - } catch (Exception e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiCancelConceedMatchActionPerformed - - private void jmiRefuseMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRefuseMatchActionPerformed - try { - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = ((JPNRound) jpnContent); - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - if (m.isConcedeedBy1() || m.isConcedeedBy2() || m.isRefusedBy1() || m.isRefusedBy2()) { - JOptionPane.showMessageDialog(null, - Translate.translate(CS_Error), - Translate.translate(CS_MatchAlreadyConceededOrRefused), - JOptionPane.ERROR_MESSAGE); - } else { - Object[] options = new Object[3]; - options[0] = m.getCompetitor1(); - options[1] = m.getCompetitor2(); - options[2] = Translate.translate(CS_Cancel); - - Object option = JOptionPane.showInputDialog(null, - Translate.translate(CS_RefuseAMatch), - Translate.translate(CS_WhoRefuseMatch), - JOptionPane.QUESTION_MESSAGE, null, options, options[2]); - - if (option.equals(m.getCompetitor1())) { - m.setRefusedBy1(true); - m.setRefusedBy2(false); - } - if (option.equals(m.getCompetitor2())) { - m.setRefusedBy2(true); - m.setRefusedBy1(false); - } - update(); - jpnr.update(); - } - - } - } catch (HeadlessException e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiRefuseMatchActionPerformed - - private void jmiCancelMatchRefuseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiCancelMatchRefuseActionPerformed - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - m.setRefusedBy1(false); - m.setRefusedBy2(false); - } - } catch (Exception e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiCancelMatchRefuseActionPerformed - - private void jcxUseColorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxUseColorActionPerformed - - Tournament.getTournament().getParams().setUseColor(jcxUseColor.isSelected()); - if (jpnContent instanceof JPNRound) { - ((JPNRound) jpnContent).update(); - } - - }//GEN-LAST:event_jcxUseColorActionPerformed - - private void jcxUseImageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxUseImageActionPerformed - - Tournament.getTournament().getParams().setUseImage(jcxUseImage.isSelected()); - if (jpnContent instanceof JPNRound) { - ((JPNRound) jpnContent).update(); - } - if (jpnContent instanceof JPNParameters) { - ((JPNParameters) jpnContent).update(); - } - - }//GEN-LAST:event_jcxUseImageActionPerformed - - private void jmiFullScreenMatchsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenMatchsActionPerformed - JFullScreenMatchs fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenMatchs(jpnr.getRound()); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - - }//GEN-LAST:event_jmiFullScreenMatchsActionPerformed - - private void jmiFullScreenRankGeneralActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankGeneralActionPerformed - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound())); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - }//GEN-LAST:event_jmiFullScreenRankGeneralActionPerformed - - private void jmiFullScreenRankTeamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankTeamActionPerformed - JFullScreenTeamRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenTeamRank(Tournament.getTournament().getRoundIndex(jpnr.getRound())); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - }//GEN-LAST:event_jmiFullScreenRankTeamActionPerformed - - private void jmiFullScreenRankClanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankClanActionPerformed - JFullScreenClanRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanRank(Tournament.getTournament().getRoundIndex(jpnr.getRound())); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankClanActionPerformed - - private void jmiFullScreenRankAnnexIndivActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexIndivActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexIndivActionPerformed - - private void jmiFullScreenRankAnnexIndiv1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexIndiv1ActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexIndiv1ActionPerformed - - private void jmiFullScreenRankAnnexTeamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexTeamActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexTeamActionPerformed - - private void jmiFullScreenRankAnnexTeam1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexTeam1ActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexTeam1ActionPerformed - - private void jmiFullScreenRankAnnexClanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexClanActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, false); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexClanActionPerformed - - private void jmiFullScreenRankAnnexClan1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexClan1ActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, false); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexClan1ActionPerformed - - private TMultiServer server = null; - private WebServer web = null; - - private void jcxmiAsServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxmiAsServerActionPerformed - if (jcxmiAsServer.isSelected()) { - if (server == null) { - server = new TMultiServer(); - server.start(); - } else { - synchronized (this) { - server.stopServer(); - try { - server.wait(); - - } catch (InterruptedException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - server.start(); - } - - if (web == null) { - try { - try { - web = new WebServer(); - - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - JOptionPane.showMessageDialog(this, ex.getMessage()); - } - web.start(); - - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - JOptionPane.showMessageDialog(this, ex.getMessage()); - } - } else { - synchronized (this) { - web.stop(); - try { - web.wait(); - - } catch (InterruptedException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - try { - web.start(); - } catch (IOException ex) { - //Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - } else { - synchronized (this) { - server.stopServer(); - try { - server.wait(); - } catch (InterruptedException | IllegalMonitorStateException ex) { - //Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - server = null; - - synchronized (this) { - web.stop(); - try { - web.wait(); - } catch (InterruptedException | IllegalMonitorStateException ex) { - //Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - web = null; - - } - }//GEN-LAST:event_jcxmiAsServerActionPerformed - - private void jmiFullScreenMatchsClashActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenMatchsClashActionPerformed - JFullScreenMatchs fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenMatchs(jpnr.getRound(), true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenMatchsClashActionPerformed - - private void jmiFullScreenRankGroupsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankGroupsActionPerformed - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), JFullScreenIndivRank.C_GROUP); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankGroupsActionPerformed - - private void jmiFullScreenRankAnnexGroupsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexGroupsActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, C_GROUP); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexGroupsActionPerformed - - private void jmiFullScreenRankAnnexGroups1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexGroups1ActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, C_GROUP); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexGroups1ActionPerformed - - private void jmiFullScreenRankCategoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankCategoryActionPerformed - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), JFullScreenIndivRank.C_CATEGORY); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankCategoryActionPerformed - - private void jmiFullScreenRankAnnexCategoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexCategoryActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, JFullScreenIndivRank.C_CATEGORY); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexCategoryActionPerformed - - private void jmiFullScreenRankAnnexCategory1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexCategory1ActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, JFullScreenIndivRank.C_CATEGORY); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexCategory1ActionPerformed - - private void jmiFullScreenPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenPoolActionPerformed - - if (Tournament.getTournament().getPoolCount() > 0) { - if (Tournament.getTournament().getParams().isTeamTournament()) { - JFullScreenTeamRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenTeamRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), - true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } else { - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), - C_POOL); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - } - - }//GEN-LAST:event_jmiFullScreenPoolActionPerformed - - private void jmiFullScreenRankAnnexPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexPoolActionPerformed - - if (Tournament.getTournament().getPoolCount() > 0) { - if (Tournament.getTournament().getParams().isTeamTournament()) { - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, - true, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } else { - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, - C_POOL); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - } - - }//GEN-LAST:event_jmiFullScreenRankAnnexPoolActionPerformed - - private void jmiFullScreenRankAnnexPool1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexPool1ActionPerformed - - if (Tournament.getTournament().getPoolCount() > 0) { - if (Tournament.getTournament().getParams().isTeamTournament()) { - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, - true, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } else { - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, - C_POOL); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - } - - }//GEN-LAST:event_jmiFullScreenRankAnnexPool1ActionPerformed - - private void jmiEditCoefActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditCoefActionPerformed - - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - - editRoundCoef(jpnr.getRound()); - } - - }//GEN-LAST:event_jmiEditCoefActionPerformed - - private void jckmiHideNonNafActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jckmiHideNonNafActionPerformed - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - jpnr.setNafOnly(jckmiHideNonNaf.isSelected()); - jpnr.update(); - } - }//GEN-LAST:event_jckmiHideNonNafActionPerformed - - public static String CS_EditWebPort = "EditWebPort"; - - private void jmiEditWebPortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditWebPortActionPerformed - - int port = Tournament.getTournament().getParams().getWebServerPort(); - - Object obj = JOptionPane.showInputDialog(this, Translate.translate(CS_EditWebPort), port); - - if (obj instanceof String) { - Tournament.getTournament().getParams().setWebServerPort(Integer.parseInt((String) obj)); - } - - if (obj instanceof Integer) { - Tournament.getTournament().getParams().setWebServerPort((Integer) obj); - } - - }//GEN-LAST:event_jmiEditWebPortActionPerformed - - private void jcxmiRemoteEditActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxmiRemoteEditActionPerformed - - Tournament.getTournament().getParams().setWebEdit(jcxmiRemoteEdit.isSelected()); - - }//GEN-LAST:event_jcxmiRemoteEditActionPerformed - - private static final String COLOR_1 = "Couleur 1"; - private static final String COLOR_2 = "Couleur 2"; - private static final String COLOR_WRITING = "Couleur Ecriture"; - private static final String COLOR_BORDER = "Couleur Bordure"; - - private void jmiEditColorsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditColorsActionPerformed - - ColorChooser jccColor1 = new ColorChooser(); - jccColor1.setColor(Tournament.getTournament().getParams().getColor1()); - ColorChooser jccColor2 = new ColorChooser(); - jccColor2.setColor(Tournament.getTournament().getParams().getColor2()); - ColorChooser jccBorderColor = new ColorChooser(); - jccBorderColor.setColor(Tournament.getTournament().getParams().getBorderColor()); - ColorChooser jccForeColor = new ColorChooser(); - jccForeColor.setColor(Tournament.getTournament().getParams().getForeColor()); - - JLabel jlbColor1 = new JLabel(Translate.translate(COLOR_1)); - JLabel jlbColor2 = new JLabel(Translate.translate(COLOR_2)); - JLabel jlbForeColor = new JLabel(Translate.translate(COLOR_WRITING)); - JLabel jlbBorderColor = new JLabel(Translate.translate(COLOR_BORDER)); - - JPanel jpn = new JPanel(new GridLayout(4, 2)); - - jpn.add(jlbColor1); - jpn.add(jccColor1); - jpn.add(jlbColor2); - jpn.add(jccColor2); - jpn.add(jlbBorderColor); - jpn.add(jccBorderColor); - jpn.add(jlbForeColor); - jpn.add(jccForeColor); - - JOptionPane.showConfirmDialog(this, jpn, "Couleurs", JOptionPane.OK_OPTION); - - Tournament.getTournament().getParams().setColor1(jccColor1.getColor()); - Tournament.getTournament().getParams().setColor2(jccColor2.getColor()); - Tournament.getTournament().getParams().setBorderColor(jccBorderColor.getColor()); - Tournament.getTournament().getParams().setForeColor(jccForeColor.getColor()); - - - }//GEN-LAST:event_jmiEditColorsActionPerformed - - private void jmiPrintLabelsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiPrintLabelsActionPerformed - // Set Choice - ArrayList choices = new ArrayList<>(); - // Individual/Team - // With Name/Without Names - - if (Tournament.getTournament().getParams().isTeamTournament() - && (Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING)) { - choices.add("Individuelles pré-remplies"); - choices.add("Individuelles vides"); - choices.add("Par équipe pré-remplies"); - choices.add("Par équipe vides"); - } else { - choices.add("pré-remplies"); - choices.add("vides"); - } - - Object obj = JOptionPane.showOptionDialog(this, "Quel type d'étiquettes voulez vous ?", "Etiquettes", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, choices.toArray(), null); - if (obj != null) { - JdgPrintLabel jdg = null; - if ((jpnContent != null) && (obj instanceof Integer)) { - if (jpnContent instanceof JPNRound) { - int choice = (int) obj; - Round round = ((JPNRound) jpnContent).getRound(); - if (choice == 0) { - jdg = new JdgPrintLabel(this, true, round, true, false); - } - if (choice == 1) { - jdg = new JdgPrintLabel(this, true, round, false, false); - } - if (choice == 2) { - jdg = new JdgPrintLabel(this, true, round, true, true); - } - if (choice == 3) { - jdg = new JdgPrintLabel(this, true, round, false, true); - } - } - } - // Display PDF template with print button - if (jdg != null) { - jdg.setVisible(true); - } - } - - - }//GEN-LAST:event_jmiPrintLabelsActionPerformed - - private void jmiIndivReportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiIndivReportActionPerformed - JPNRound jpnr = ((JPNRound) jpnContent); - JdgReport report = new JdgReport(this, true, Tournament.getTournament().getRoundIndex(jpnr.getRound()), - this.mTournament, JdgReport.C_INDIVIDUAL); - report.setVisible(true); - }//GEN-LAST:event_jmiIndivReportActionPerformed - - private void jmiClanReportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiClanReportActionPerformed - JPNRound jpnr = ((JPNRound) jpnContent); - JdgReport report = new JdgReport(this, true, Tournament.getTournament().getRoundIndex(jpnr.getRound()), - this.mTournament, JdgReport.C_CLAN); - report.setVisible(true); - }//GEN-LAST:event_jmiClanReportActionPerformed - - private void jmiTeamReportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiTeamReportActionPerformed - JPNRound jpnr = ((JPNRound) jpnContent); - JdgReport report = new JdgReport(this, true, Tournament.getTournament().getRoundIndex(jpnr.getRound()), - this.mTournament, JdgReport.C_TEAM); - report.setVisible(true); - }//GEN-LAST:event_jmiTeamReportActionPerformed - - private void jmiExportWebServerAsZIPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportWebServerAsZIPActionPerformed - - JFileChooser jfc = new JFileChooser(); - final FileFilter filter1 = new ExtensionFileFilter( - "Zip", - new String[]{"ZIP", - "zip"}); - jfc.setFileFilter(filter1); - int result = jfc.showSaveDialog(this); - if (result == JFileChooser.APPROVE_OPTION) { - - File zipFile = jfc.getSelectedFile(); - - // First this function will generate in a temporary directory - // all the possible web pages - ArrayList files = WebServer.getWebSiteFiles(); - - if (files.size() > 0) { - FileOutputStream fout = null; - try { - // Then it will zip this directory and export it - fout = new FileOutputStream(zipFile); - ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(fout)); - - for (int i = 0; i < files.size(); i++) { - File f = files.get(i); - byte[] b = new byte[(int) f.length()]; - FileInputStream fin = new FileInputStream(f); - zout.putNextEntry(new ZipEntry(f.getName())); - int length; - while ((length = fin.read(b)) > 0) { - zout.write(b, 0, length); - } - zout.closeEntry(); - fin.close(); - } - zout.close(); - - } catch (IOException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } finally { - try { - fout.close(); - } catch (IOException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - WebServer.cleanFiles(files); - } - }//GEN-LAST:event_jmiExportWebServerAsZIPActionPerformed - - private void jmiExportWebServerToSiteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportWebServerToSiteActionPerformed - // First this function will generate in a temporary directory - // all the possible web pages - FTPClient client = new FTPClient(); - try { - client.connect("ftp.ainpacte.org"); - System.out.println("Connected to " + server + "."); - System.out.println(client.getReplyString()); - System.out.println(client.getReplyCode()); - client.login("ainpacte", "Lancie69"); - } catch (IOException ex) { - System.out.println(ex.getLocalizedMessage()); - ex.printStackTrace(); - } - - // Then it will connect to remote site (FTP or SFTP) - // and copy the files. - }//GEN-LAST:event_jmiExportWebServerToSiteActionPerformed - - private void jmiMassAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiMassAddActionPerformed - JdgMassAdd jdg = new JdgMassAdd(this, true); - jdg.setVisible(true); - }//GEN-LAST:event_jmiMassAddActionPerformed - - private void jcxDisplayRostersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxDisplayRostersActionPerformed - Tournament.getTournament().getParams().setDisplayRoster(jcxDisplayRosters.getState()); - }//GEN-LAST:event_jcxDisplayRostersActionPerformed - - public boolean isRoundOnly() { - return jckmiRoundOnly.isSelected(); - } - - public boolean isNafOnly() { - return jckmiHideNonNaf.isSelected(); - } - - private NafTask task; - - private static final String CS_Download = "Download"; - - private static final String CS_NewGame = "NewGame"; - private static final String CS_Open = "Open"; - private static final String CS_UseRosterEditor = "UseRosterEditor"; - private static final String CS_ClientViewer = "ClientViewer"; - private static final String CS_NewGameOrOpen = "NewGameOrOpen"; - private static final String CS_EnterRemoteTourmaServer = "Enter remote server IP address"; - private static final String CS_Exiting = "Exiting"; - private static final String CS_ConnectionImpossibleTo = "Connection impossible to"; - private static final String CS_ChooseFullScreen = "ChooseFullScreen"; - /** - * @param args the command line arguments - */ - - private static final String CS_IndividualRanking = "Individual ranking"; - private static final String CS_IndividualAnnexRanking = "Individual Annex rankings"; - private static final String CS_TeamRanking = "Team ranking"; - private static final String CS_TeamAnnexRanking = "Team Annex Ranking"; - private static final String CS_ClanRanking = "Clan ranking"; - private static final String CS_ClanAnnexRanking = "Clan Annex Ranking"; - private static final String CS_MatchsClash = "Matchs Clash"; - private static final String CS_CategoryRanking = "Categories Ranking"; - private static final String CS_CategoryAnnexRanking = "Categories Annex Ranking"; - private static final String CS_GroupeRanking = "Group Ranking"; - private static final String CS_GroupeAnnexRanking = "Group Annex Ranking"; - private static final String CS_IndividualPoolRanking = "Individual Pool Ranking"; - private static final String CS_IndividualPoolAnnexRanking = "Individual Pool Annex Ranking"; - private static final String CS_TeamPoolRanking = "Team Pool Ranking"; - private static final String CS_TeamPoolAnnexRanking = "Team Pool Annex Ranking"; - private static final String CS_Matchs = "Matchs"; - - /** - * Display a (very) basic progress bar - * - * @param pct how much of the progress bar to display 0-100 - */ - public static void splashProgress(int pct) { - if (mySplash != null && mySplash.isVisible()) { - splashGraphics.setPaint(Color.LIGHT_GRAY); - splashGraphics.fill(splashProgressArea); - - // draw an outline - splashGraphics.setPaint(Color.BLUE); - splashGraphics.draw(splashProgressArea); - - // Calculate the width corresponding to the correct percentage - int x = (int) splashProgressArea.getMinX(); - int y = (int) splashProgressArea.getMinY(); - int wid = (int) splashProgressArea.getWidth(); - int hgt = (int) splashProgressArea.getHeight(); - - int doneWidth = Math.round(pct * wid / 100.f); - doneWidth = Math.max(0, Math.min(doneWidth, wid - 1)); // limit 0-width - - // fill the done part one pixel smaller than the outline - splashGraphics.setPaint(Color.CYAN); - splashGraphics.fillRect(x, y + 1, doneWidth, hgt - 1); - - x = (int) splashThanksTo.getMinX(); - y = (int) splashThanksTo.getMinY(); - wid = (int) splashThanksTo.getWidth(); - hgt = (int) splashThanksTo.getHeight(); - - doneWidth = Math.round(pct * wid / 100.f); - doneWidth = Math.max(0, Math.min(doneWidth, wid - 1)); // limit 0-width - - // fill the done part one pixel smaller than the outline - splashGraphics.setPaint(Color.WHITE); - splashGraphics.fillRect(x, y + 1, doneWidth, hgt - 1); - - // erase the last status text - splashGraphics.setPaint(Color.LIGHT_GRAY); - splashGraphics.fill(splashTextArea); - - // draw the text - splashGraphics.setPaint(Color.BLACK); - splashGraphics.drawString(Translate.translate("GREETINGS0"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15)); - splashGraphics.drawString(Translate.translate("GREETINGS1"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight())); - splashGraphics.drawString(Translate.translate("GREETINGS2"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 2)); - splashGraphics.drawString(Translate.translate("GREETINGS3"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 3)); - splashGraphics.drawString(Translate.translate("GREETINGS4"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 4)); - splashGraphics.drawString(Translate.translate("GREETINGS5"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 5)); - - // make sure it's displayed - mySplash.update(); - } - } - - /** - * just a stub to simulate a long initialization task that updates the text - * and progress parts of the status in the Splash - */ - private static void appInit() { - - - - splashText("List NAF id Database"); - // Get Number of naf_id text - ArrayList naf_list=NAF.getFileList(); - int nb_steps=naf_list.size()+6; - int pct=100/nb_steps; - splashProgress(1*pct); - - try { - splashText("Initization of RMi Registry"); - splashProgress(2*pct); - - RMITournament tour = RMITournament.getInstance(); - ITournament stub = (ITournament) UnicastRemoteObject.exportObject(tour, 0); - - splashText("Binding Tournament"); - splashProgress(3*pct); - Registry registry = LocateRegistry.createRegistry(1099);// getRegistry(); - registry.bind("TourMa", stub); - - } catch (RemoteException | AlreadyBoundException e) { - System.out.println(e.getLocalizedMessage()); - } - - splashText("Loading NAF coach XML base"); - for (int i=0; i StartOptions = new ArrayList<>(); - StartOptions.add( - Translate.translate(CS_NewGame)); - StartOptions.add( - Translate.translate(CS_Open)); - StartOptions.add( - Translate.translate(CS_UseRosterEditor)); - StartOptions.add(Translate.translate(CS_ClientViewer)); - final int res = JOptionPane.showOptionDialog(null, - Translate.translate(CS_NewGameOrOpen), - StringConstants.CS_NULL, - JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, StartOptions.toArray(), - Translate.translate(CS_Open)); - - if ((res == 0) || (res == 1)) { - MainFrame window = MainFrame.getMainFrame(res); - window.setVisible(true); - } - - if (res == 2) { - teamma.views.JdgRoster jdg = new JdgRoster(null, true); - jdg.setVisible(true); - System.exit(0); - } - - if (res == 3) { - - String address = (String) JOptionPane.showInputDialog(null, - Translate.translate(CS_EnterRemoteTourmaServer), "127.0.0.1"); - - try { - UnicastRemoteObject.unexportObject(RMITournament.getInstance(), true); - } catch (NoSuchObjectException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - - RMIThread rmi = new RMIThread(address); - Thread thread = new Thread(rmi); - thread.start(); - - Tournament.getTournament().setIsClient(true); - - MainFrame window = MainFrame.getMainFrame(res); - window.setVisible(true); - - - /*try { - - Socket socket = null; - try { - socket = new Socket(address, 2017); - } catch (ConnectException e) { - JOptionPane.showMessageDialog(null, Translate.translate(CS_ConnectionImpossibleTo) - + " " + address + ". " - + Translate.translate(CS_Exiting)); - System.exit(1); - } - - ArrayList labels = new ArrayList<>(); - - // Index 0: Individual Ranking - labels.add(Translate.translate(CS_IndividualRanking)); - // Index 1: Individual Annex ranks - labels.add(Translate.translate(CS_IndividualAnnexRanking)); - // Index 2: Team Ranking - labels.add(Translate.translate(CS_TeamRanking)); - // Index 3: Team Annex - labels.add(Translate.translate(CS_TeamAnnexRanking)); - // Index 4: Clan Ranking - labels.add(Translate.translate(CS_ClanRanking)); - // Index 5: Clan Annex - labels.add(Translate.translate(CS_ClanAnnexRanking)); - // Index 6:Matchs - labels.add(Translate.translate(CS_Matchs)); - // Index 7: Clash Match - labels.add(Translate.translate(CS_MatchsClash)); - // Index 8: Categories - labels.add(Translate.translate(CS_CategoryRanking)); - // Index 9: Categories - labels.add(Translate.translate(CS_CategoryAnnexRanking)); - // Index 10: Group - labels.add(Translate.translate(CS_GroupeRanking)); - // Index 11: Categories - labels.add(Translate.translate(CS_GroupeAnnexRanking)); - // Index 12: Indiv Pool - labels.add(Translate.translate(CS_IndividualPoolRanking)); - // Index 13: Indiv Pool Annex - labels.add(Translate.translate(CS_IndividualPoolAnnexRanking)); - // Index 14: Team Pool - labels.add(Translate.translate(CS_TeamPoolRanking)); - // Index 15: Categories - labels.add(Translate.translate(CS_TeamPoolAnnexRanking)); - - final JPanel jpn = new JPanel(new BorderLayout()); - final JComboBox jcb = new JComboBox(labels.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - final JLabel jlb = new JLabel( - Translate.translate(CS_ChooseFullScreen) - ); - jpn.add(jlb, BorderLayout.NORTH); - - JOptionPane.showMessageDialog(null, jpn, - Translate.translate(CS_Generation), - JOptionPane.QUESTION_MESSAGE); - - final int index = jcb.getSelectedIndex(); - - switch (index) { - case 0: - JFullScreenIndivRank indiv = new JFullScreenIndivRank(socket); - indiv.setVisible(true); - break; - case 1: - JFullScreenIndivAnnex indivAnnex = new JFullScreenIndivAnnex(socket); - indivAnnex.setVisible(true); - break; - case 2: - JFullScreenTeamRank team = new JFullScreenTeamRank(socket); - team.setVisible(true); - break; - case 3: - JFullScreenClanTeamAnnex teamAnnex = new JFullScreenClanTeamAnnex(socket, true); - teamAnnex.setVisible(true); - break; - case 4: - JFullScreenClanRank clan = new JFullScreenClanRank(socket); - clan.setVisible(true); - break; - case 5: - JFullScreenClanTeamAnnex clanAnnex = new JFullScreenClanTeamAnnex(socket, false); - clanAnnex.setVisible(true); - break; - case 6: - JFullScreenMatchs matchs = new JFullScreenMatchs(socket); - matchs.setVisible(true); - break; - case 7: - JFullScreenMatchs matchsC = new JFullScreenMatchs(socket, true); - matchsC.setVisible(true); - break; - case 8: - JFullScreenIndivRank category = new JFullScreenIndivRank(socket, JFullScreenIndivRank.C_CATEGORY); - category.setVisible(true); - break; - case 9: - JFullScreenIndivAnnex categoryAnnex = new JFullScreenIndivAnnex(socket, JFullScreenIndivRank.C_CATEGORY); - categoryAnnex.setVisible(true); - break; - case 10: - JFullScreenIndivRank group = new JFullScreenIndivRank(socket, JFullScreenIndivRank.C_GROUP); - group.setVisible(true); - break; - case 11: - JFullScreenIndivAnnex groupAnnex = new JFullScreenIndivAnnex(socket, JFullScreenIndivRank.C_GROUP); - groupAnnex.setVisible(true); - break; - case 12: - JFullScreenIndivRank indivPool = new JFullScreenIndivRank(socket, JFullScreenIndivRank.C_POOL); - indivPool.setVisible(true); - break; - case 13: - JFullScreenIndivAnnex indivPoolAnnex = new JFullScreenIndivAnnex(socket, JFullScreenIndivRank.C_POOL); - indivPoolAnnex.setVisible(true); - break; - case 14: - JFullScreenTeamRank teamPool = new JFullScreenTeamRank(socket, true); - teamPool.setVisible(true); - break; - case 15: - JFullScreenClanTeamAnnex teamPoolAnnex = new JFullScreenClanTeamAnnex(socket, false, true); - teamPoolAnnex.setVisible(true); - break; - - } - } catch (IOException e) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, e); - }*/ - } - } - } - ); - - } catch (InterruptedException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - - } catch (InvocationTargetException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - } - - private static MainFrame mSingleton; - - /** - * - * @return - */ - public static MainFrame getMainFrame() { - if (mSingleton == null) { - mSingleton = new MainFrame(0); - } - - return mSingleton; - } - - /** - * - * @param res - * @return - */ - public static MainFrame getMainFrame(int res) { - if (mSingleton == null) { - mSingleton = new MainFrame(res); - } - - return mSingleton; - } - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JMenu jMenu1; - private javax.swing.JMenu jMenu2; - private javax.swing.JMenuBar jMenuBar1; - private javax.swing.JScrollPane jScrollPane1; - private javax.swing.JSeparator jSeparator1; - private javax.swing.JPopupMenu.Separator jSeparator10; - private javax.swing.JPopupMenu.Separator jSeparator11; - private javax.swing.JPopupMenu.Separator jSeparator12; - private javax.swing.JPopupMenu.Separator jSeparator13; - private javax.swing.JPopupMenu.Separator jSeparator14; - private javax.swing.JPopupMenu.Separator jSeparator15; - private javax.swing.JPopupMenu.Separator jSeparator16; - private javax.swing.JPopupMenu.Separator jSeparator17; - private javax.swing.JPopupMenu.Separator jSeparator18; - private javax.swing.JPopupMenu.Separator jSeparator19; - private javax.swing.JSeparator jSeparator2; - private javax.swing.JPopupMenu.Separator jSeparator20; - private javax.swing.JSeparator jSeparator3; - private javax.swing.JPopupMenu.Separator jSeparator4; - private javax.swing.JPopupMenu.Separator jSeparator5; - private javax.swing.JPopupMenu.Separator jSeparator6; - private javax.swing.JPopupMenu.Separator jSeparator7; - private javax.swing.JPopupMenu.Separator jSeparator8; - private javax.swing.JPopupMenu.Separator jSeparator9; - private javax.swing.JCheckBoxMenuItem jckmiHideNonNaf; - private javax.swing.JCheckBoxMenuItem jckmiRoundOnly; - private javax.swing.JCheckBoxMenuItem jcxAllowSpecialSkill; - private javax.swing.JCheckBoxMenuItem jcxDisplayRosters; - private javax.swing.JCheckBoxMenuItem jcxPatchPortugal; - private javax.swing.JCheckBoxMenuItem jcxUseColor; - private javax.swing.JCheckBoxMenuItem jcxUseImage; - public javax.swing.JCheckBoxMenuItem jcxmiAsServer; - private javax.swing.JCheckBoxMenuItem jcxmiRemoteEdit; - private javax.swing.JMenuItem jmiAbout; - private javax.swing.JMenuItem jmiAddFreeMatch; - private javax.swing.JMenuItem jmiAideEnLigne; - private javax.swing.JMenuItem jmiCancelConceedMatch; - private javax.swing.JMenuItem jmiCancelMatchRefuse; - private javax.swing.JMenuItem jmiChangePairing; - private javax.swing.JMenuItem jmiCharger; - private javax.swing.JMenuItem jmiClanReport; - private javax.swing.JMenuItem jmiConceedMatch; - private javax.swing.JMenuItem jmiDelFreeMatch; - private javax.swing.JMenuItem jmiDelRound; - private javax.swing.JMenuItem jmiEditCoef; - private javax.swing.JMenuItem jmiEditColors; - private javax.swing.JMenuItem jmiEditDescription; - private javax.swing.JMenuItem jmiEditTeam; - private javax.swing.JMenuItem jmiEditWebPort; - private javax.swing.JMenuItem jmiExit; - private javax.swing.JMenuItem jmiExport; - private javax.swing.JMenuItem jmiExportFbb; - private javax.swing.JMenuItem jmiExportFbb1; - private javax.swing.JMenuItem jmiExportWebServerAsZIP; - private javax.swing.JMenuItem jmiExportWebServerToSite; - private javax.swing.JMenuItem jmiFullScreenMatchs; - private javax.swing.JMenuItem jmiFullScreenMatchsClash; - private javax.swing.JMenuItem jmiFullScreenPool; - private javax.swing.JMenuItem jmiFullScreenRankAnnexCategory; - private javax.swing.JMenuItem jmiFullScreenRankAnnexCategory1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexClan; - private javax.swing.JMenuItem jmiFullScreenRankAnnexClan1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexGroups; - private javax.swing.JMenuItem jmiFullScreenRankAnnexGroups1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexIndiv; - private javax.swing.JMenuItem jmiFullScreenRankAnnexIndiv1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexPool; - private javax.swing.JMenuItem jmiFullScreenRankAnnexPool1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexTeam; - private javax.swing.JMenuItem jmiFullScreenRankAnnexTeam1; - private javax.swing.JMenuItem jmiFullScreenRankCategory; - private javax.swing.JMenuItem jmiFullScreenRankClan; - private javax.swing.JMenuItem jmiFullScreenRankGeneral; - private javax.swing.JMenuItem jmiFullScreenRankGroups; - private javax.swing.JMenuItem jmiFullScreenRankTeam; - private javax.swing.JMenuItem jmiGenerateFirstRound; - private javax.swing.JMenuItem jmiGenerateNextRound; - private javax.swing.JMenuItem jmiIndivReport; - private javax.swing.JMenuItem jmiMassAdd; - private javax.swing.JMenuItem jmiNafLoad; - private javax.swing.JMenuItem jmiNouveau; - private javax.swing.JMenuItem jmiPrintLabels; - private javax.swing.JMenuItem jmiRefuseMatch; - private javax.swing.JMenuItem jmiRevisions; - private javax.swing.JMenuItem jmiSave; - private javax.swing.JMenuItem jmiSaveAs; - private javax.swing.JMenuItem jmiSubstitutePlayer; - private javax.swing.JMenuItem jmiTeamReport; - private javax.swing.JMenu jmnFile; - private javax.swing.JMenu jmnHelp; - private javax.swing.JMenu jmnParameters; - private javax.swing.JMenu jmnRound; - private javax.swing.JMenu jmnTools; - private javax.swing.JPanel jpnContent; - private javax.swing.JSplitPane jspSplit; - private javax.swing.JTree jtrPanels; - // End of variables declaration//GEN-END:variables - - private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { - throw new java.io.NotSerializableException(getClass().getName()); - } - - private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { - throw new java.io.NotSerializableException(getClass().getName()); - } - private static final Logger LOG = Logger.getLogger(MainFrame.class - .getName()); - - public void propertyChange(PropertyChangeEvent evt) { - if ("progress" == evt.getPropertyName()) { - int progress = (Integer) evt.getNewValue(); - progressMonitor.setProgress(progress); - String message = String.format("%d%%.\n", progress); - progressMonitor.setNote(message); - //taskOutput.append(message); - if (progressMonitor.isCanceled() || task.isDone()) { - Toolkit.getDefaultToolkit().beep(); - if (progressMonitor.isCanceled()) { - task.cancel(true); - //taskOutput.append("Task canceled.\n"); - } else { - //taskOutput.append("Task completed.\n"); - } - } - } - } -} -======= -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - - /* - * MainFrame.java - * - * Created on 10 mai 2010, 16:38:37 - */ -package tourma; - -import com.bric.swing.ColorPicker; -import com.hexidec.ekit.EkitCore; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GridLayout; -import java.awt.HeadlessException; -import java.awt.SplashScreen; -import java.awt.Toolkit; -import java.awt.geom.Rectangle2D; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -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.lang.reflect.InvocationTargetException; -import java.net.ConnectException; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.rmi.AlreadyBoundException; -import java.rmi.Naming; -import java.rmi.NoSuchObjectException; -import java.rmi.NotBoundException; -import java.rmi.RMISecurityManager; -import java.rmi.Remote; -import java.rmi.RemoteException; -import java.rmi.registry.Registry; -import java.rmi.registry.LocateRegistry; -import java.rmi.server.UnicastRemoteObject; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Locale; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; -import javax.swing.JCheckBox; -import javax.swing.JColorChooser; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSplitPane; -import javax.swing.ProgressMonitor; -import javax.swing.SwingWorker; -import javax.swing.filechooser.FileFilter; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreePath; -import net.java.dev.colorchooser.ColorChooser; -import org.apache.commons.net.ftp.FTPClient; -import org.jfree.ui.tabbedui.VerticalLayout; -import teamma.data.LRB; -import teamma.views.JdgRoster; -import tourma.data.Coach; -import tourma.data.CoachMatch; -import tourma.data.ETeamPairing; -import static tourma.data.ETeamPairing.TEAM_PAIRING; -import tourma.data.Group; -import tourma.data.ITournament; -import tourma.data.Tournament; -import tourma.data.Match; -import tourma.data.Parameters; -import tourma.rmi.RMITournament; -import tourma.data.RosterType; -import tourma.data.Round; -import tourma.data.Substitute; -import tourma.data.Team; -import tourma.data.TeamMatch; -import tourma.data.Tournament; -import tourma.languages.Translate; -import tourma.rmi.RMIThread; -import tourma.utility.ExtensionFileFilter; -import tourma.utility.StringConstants; -import tourma.utils.Generation; -import tourma.utils.NAF; -import tourma.utils.display.TMultiServer; -import tourma.utils.web.WebServer; -import tourma.views.JPNCup; -import tourma.views.JPNStatistics; -import tourma.views.report.JdgPrintLabel; -import tourma.views.fullscreen.JFullScreen; -import tourma.views.fullscreen.JFullScreenClanRank; -import tourma.views.fullscreen.JFullScreenClanTeamAnnex; -import tourma.views.fullscreen.JFullScreenIndivAnnex; -import tourma.views.fullscreen.JFullScreenIndivRank; -import static tourma.views.fullscreen.JFullScreenIndivRank.C_GROUP; -import static tourma.views.fullscreen.JFullScreenIndivRank.C_POOL; -import tourma.views.fullscreen.JFullScreenMatchs; -import tourma.views.fullscreen.JFullScreenTeamRank; -import tourma.views.parameters.JPNParameters; -import tourma.views.report.JdgReport; -import tourma.views.round.JPNRound; -import tourma.views.system.JdgAbout; -import tourma.views.system.JdgOnlineHelp; -import tourma.views.system.JdgRevisions; -import tourma.utils.NafTask; - -/** - * - * @author Frederic Berger - */ -//@com.yworks.util.annotation.Obfuscation ( exclude = true, applyToMembers = true ) -public final class MainFrame extends javax.swing.JFrame implements PropertyChangeListener { - - private Tournament mTournament; - private File mFile = null; - - private final static String CS_TourMaXMLFile = "TourMaXMLFile"; - private String currentPath; - - /** - * Creates new form MainFrame - * - * @param res Choice selected 0=> new tournament, open an existing one if - * other choice - */ - public MainFrame(int res) { - - mTournament = Tournament.getTournament(); - this.setSize(800, 600); - initComponents(); - - currentPath = MainFrame.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - - if (res == 0) { - jmiNouveauActionPerformed(null); - } else { - if (res == 1) { - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_TourMaXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).loadXML(jfc.getSelectedFile()); - } - } - File f = jfc.getSelectedFile(); - if (f != null) { - currentPath = f.getAbsolutePath(); - } - } - } - - update(); - } - - public void updateMenus() { - boolean isClient = Tournament.getTournament().isClient(); - if (jpnContent instanceof JPNRound) { - - Round r = ((JPNRound) jpnContent).getRound(); - if (mTournament.getRoundIndex(r) == mTournament.getRoundsCount() - 1) { - - jmiIndivReport.setEnabled(true); - jmiClanReport.setEnabled(true); - jmiTeamReport.setEnabled(true); - - jmiDelRound.setEnabled(!isClient); - - jmiGenerateNextRound.setEnabled((r.allMatchesEntered()) && (!isClient)); - - jmiChangePairing.setEnabled(!isClient); - jmiAddFreeMatch.setEnabled(!isClient); - jmiDelFreeMatch.setEnabled(!isClient); - jmiFullScreenMatchs.setEnabled(!isClient); - jmiFullScreenMatchsClash.setEnabled(!isClient); - jmiFullScreenRankGeneral.setEnabled(!isClient); - jmiFullScreenRankAnnexIndiv.setEnabled(!isClient); - jmiFullScreenRankAnnexIndiv1.setEnabled(!isClient); - - jmiFullScreenRankAnnexCategory.setEnabled(Tournament.getTournament().getCategoriesCount() > 0); - jmiFullScreenRankAnnexCategory1.setEnabled(Tournament.getTournament().getCategoriesCount() > 0); - jmiFullScreenRankCategory.setEnabled(Tournament.getTournament().getCategoriesCount() > 0); - - jmiFullScreenRankAnnexGroups.setEnabled(Tournament.getTournament().getGroupsCount() > 0); - jmiFullScreenRankAnnexGroups1.setEnabled(Tournament.getTournament().getGroupsCount() > 0); - jmiFullScreenRankGroups.setEnabled(Tournament.getTournament().getGroupsCount() > 0); - - jmiFullScreenRankAnnexPool.setEnabled(Tournament.getTournament().getPoolCount() > 0); - jmiFullScreenRankAnnexPool1.setEnabled(Tournament.getTournament().getPoolCount() > 0); - jmiFullScreenPool.setEnabled(Tournament.getTournament().getPoolCount() > 0); - - jmiFullScreenRankTeam.setEnabled(mTournament.getParams().isTeamTournament()); - jmiFullScreenRankClan.setEnabled(mTournament.getClansCount() > 1); - - jmiPrintLabels.setEnabled(true); - - if (((JPNRound) jpnContent).getMatchTableSelectedRow() >= 0) { - jmiCancelConceedMatch.setEnabled(true); - jmiCancelMatchRefuse.setEnabled(true); - jmiConceedMatch.setEnabled(true); - jmiRefuseMatch.setEnabled(true); - } else { - jmiCancelConceedMatch.setEnabled(false); - jmiCancelMatchRefuse.setEnabled(false); - jmiConceedMatch.setEnabled(false); - jmiRefuseMatch.setEnabled(false); - } - } else { - jmiPrintLabels.setEnabled(false); - jmiDelRound.setEnabled(false); - jmiGenerateNextRound.setEnabled(false); - jmiChangePairing.setEnabled(false); - jmiAddFreeMatch.setEnabled(false); - jmiDelFreeMatch.setEnabled(false); - jmiCancelConceedMatch.setEnabled(false); - jmiCancelMatchRefuse.setEnabled(false); - jmiConceedMatch.setEnabled(false); - jmiRefuseMatch.setEnabled(false); - - } - jmiFullScreenMatchs.setEnabled(true); - jmiFullScreenMatchsClash.setEnabled(true); - jckmiRoundOnly.setEnabled(true); - jckmiHideNonNaf.setEnabled(true); - jmiFullScreenRankTeam.setEnabled(mTournament.getParams().isTeamTournament()); - jmiFullScreenRankClan.setEnabled(mTournament.getClansCount() > 1); - jmiFullScreenRankAnnexClan.setEnabled(mTournament.getClansCount() > 1); - jmiFullScreenRankAnnexClan1.setEnabled(mTournament.getClansCount() > 1); - jmiFullScreenRankAnnexTeam.setEnabled(mTournament.getParams().isTeamTournament()); - jmiFullScreenRankAnnexTeam1.setEnabled(mTournament.getParams().isTeamTournament()); - jmiEditCoef.setEnabled(mTournament.getParams().isTableBonusPerRound()); - } else { - jmiIndivReport.setEnabled(false); - jmiClanReport.setEnabled(false); - jmiTeamReport.setEnabled(false); - jmiPrintLabels.setEnabled(false); - jckmiRoundOnly.setEnabled(false); - jckmiHideNonNaf.setEnabled(false); - jmiDelRound.setEnabled(false); - jmiGenerateNextRound.setEnabled(false); - jmiChangePairing.setEnabled(false); - jmiAddFreeMatch.setEnabled(false); - jmiDelFreeMatch.setEnabled(false); - jmiCancelConceedMatch.setEnabled(false); - jmiCancelMatchRefuse.setEnabled(false); - jmiConceedMatch.setEnabled(false); - jmiRefuseMatch.setEnabled(false); - jmiFullScreenMatchs.setEnabled(false); - jmiFullScreenMatchsClash.setEnabled(false); - jmiFullScreenRankTeam.setEnabled(false); - jmiFullScreenRankClan.setEnabled(false); - jmiFullScreenRankGeneral.setEnabled(false); - jmiFullScreenRankAnnexIndiv.setEnabled(false); - jmiFullScreenRankAnnexIndiv1.setEnabled(false); - jmiFullScreenRankAnnexClan.setEnabled(false); - jmiFullScreenRankAnnexClan1.setEnabled(false); - jmiFullScreenRankAnnexTeam.setEnabled(false); - jmiFullScreenRankAnnexTeam1.setEnabled(false); - jmiFullScreenRankAnnexCategory.setEnabled(false); - jmiFullScreenRankAnnexCategory1.setEnabled(false); - jmiFullScreenRankCategory.setEnabled(false); - jmiFullScreenRankAnnexGroups.setEnabled(false); - jmiFullScreenRankAnnexGroups1.setEnabled(false); - jmiFullScreenRankGroups.setEnabled(false); - jmiFullScreenRankAnnexPool.setEnabled(false); - jmiFullScreenRankAnnexPool1.setEnabled(false); - jmiFullScreenPool.setEnabled(false); - jmiEditCoef.setEnabled(false); - } - jcxmiRemoteEdit.setSelected((Tournament.getTournament().getParams().isWebEdit()) && (!isClient)); - - jmiGenerateFirstRound.setEnabled(!isClient); - jcxmiAsServer.setEnabled(!isClient); - jcxPatchPortugal.setEnabled(!isClient); - jmiEditColors.setEnabled(!isClient); - jmiEditWebPort.setEnabled(!isClient); - jmiEditDescription.setEnabled(!isClient); - jcxmiRemoteEdit.setEnabled(!isClient); - jmiNafLoad.setEnabled(!isClient); - } - - /** - * Update - */ - public void update() { - - jmiEditTeam.setEnabled(mTournament.getParams().getGame() == RosterType.C_BLOOD_BOWL); - jmiSubstitutePlayer.setEnabled(mTournament.getRoundsCount() > 0); - final MainTreeModel dtm = new MainTreeModel(); - jtrPanels.setCellRenderer(dtm); - jtrPanels.setModel(dtm); - jtrPanels.setSize(100, this.getHeight()); - jtrPanels.repaint(); - updateMenus(); - - jcxPatchPortugal.setSelected(mTournament.getParams().isPortugal()); - - this.revalidate(); - this.repaint(); - } - - /** - * Update only tree - */ - public void updateTree() { - jtrPanels.setSelectionPath(new TreePath(((MainTreeModel) jtrPanels.getModel()).getParams())); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings({"unchecked", "PMD"}) - // //GEN-BEGIN:initComponents - private void initComponents() { - - jspSplit = new javax.swing.JSplitPane(); - jScrollPane1 = new javax.swing.JScrollPane(); - jtrPanels = new javax.swing.JTree(); - jpnContent = new javax.swing.JPanel(); - jMenuBar1 = new javax.swing.JMenuBar(); - jmnFile = new javax.swing.JMenu(); - jmiNouveau = new javax.swing.JMenuItem(); - jmiCharger = new javax.swing.JMenuItem(); - jmiSave = new javax.swing.JMenuItem(); - jmiSaveAs = new javax.swing.JMenuItem(); - jSeparator1 = new javax.swing.JSeparator(); - jmiExport = new javax.swing.JMenuItem(); - jmiExportFbb = new javax.swing.JMenuItem(); - jmiExportFbb1 = new javax.swing.JMenuItem(); - jSeparator2 = new javax.swing.JSeparator(); - jmiExit = new javax.swing.JMenuItem(); - jmnTools = new javax.swing.JMenu(); - jmiEditTeam = new javax.swing.JMenuItem(); - jSeparator5 = new javax.swing.JPopupMenu.Separator(); - jcxAllowSpecialSkill = new javax.swing.JCheckBoxMenuItem(); - jSeparator4 = new javax.swing.JPopupMenu.Separator(); - jmiNafLoad = new javax.swing.JMenuItem(); - jSeparator11 = new javax.swing.JPopupMenu.Separator(); - jcxPatchPortugal = new javax.swing.JCheckBoxMenuItem(); - jSeparator13 = new javax.swing.JPopupMenu.Separator(); - jcxUseColor = new javax.swing.JCheckBoxMenuItem(); - jcxUseImage = new javax.swing.JCheckBoxMenuItem(); - jmnParameters = new javax.swing.JMenu(); - jmiGenerateFirstRound = new javax.swing.JMenuItem(); - jSeparator20 = new javax.swing.JPopupMenu.Separator(); - jmiMassAdd = new javax.swing.JMenuItem(); - jSeparator6 = new javax.swing.JPopupMenu.Separator(); - jmiSubstitutePlayer = new javax.swing.JMenuItem(); - jSeparator15 = new javax.swing.JPopupMenu.Separator(); - jcxmiAsServer = new javax.swing.JCheckBoxMenuItem(); - jmiEditColors = new javax.swing.JMenuItem(); - jmiEditWebPort = new javax.swing.JMenuItem(); - jmiEditDescription = new javax.swing.JMenuItem(); - jcxmiRemoteEdit = new javax.swing.JCheckBoxMenuItem(); - jSeparator19 = new javax.swing.JPopupMenu.Separator(); - jmiExportWebServerAsZIP = new javax.swing.JMenuItem(); - jmiExportWebServerToSite = new javax.swing.JMenuItem(); - jmnRound = new javax.swing.JMenu(); - jmiGenerateNextRound = new javax.swing.JMenuItem(); - jSeparator7 = new javax.swing.JPopupMenu.Separator(); - jmiDelRound = new javax.swing.JMenuItem(); - jSeparator8 = new javax.swing.JPopupMenu.Separator(); - jmiChangePairing = new javax.swing.JMenuItem(); - jmiEditCoef = new javax.swing.JMenuItem(); - jSeparator9 = new javax.swing.JPopupMenu.Separator(); - jmiPrintLabels = new javax.swing.JMenuItem(); - jSeparator16 = new javax.swing.JPopupMenu.Separator(); - jckmiRoundOnly = new javax.swing.JCheckBoxMenuItem(); - jckmiHideNonNaf = new javax.swing.JCheckBoxMenuItem(); - jSeparator10 = new javax.swing.JPopupMenu.Separator(); - jmiAddFreeMatch = new javax.swing.JMenuItem(); - jmiDelFreeMatch = new javax.swing.JMenuItem(); - jSeparator12 = new javax.swing.JPopupMenu.Separator(); - jMenu1 = new javax.swing.JMenu(); - jmiFullScreenMatchs = new javax.swing.JMenuItem(); - jmiFullScreenMatchsClash = new javax.swing.JMenuItem(); - jmiFullScreenRankGeneral = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexIndiv = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexIndiv1 = new javax.swing.JMenuItem(); - jmiFullScreenRankTeam = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexTeam = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexTeam1 = new javax.swing.JMenuItem(); - jmiFullScreenRankClan = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexClan = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexClan1 = new javax.swing.JMenuItem(); - jmiFullScreenRankGroups = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexGroups = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexGroups1 = new javax.swing.JMenuItem(); - jmiFullScreenRankCategory = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexCategory = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexCategory1 = new javax.swing.JMenuItem(); - jmiFullScreenPool = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexPool = new javax.swing.JMenuItem(); - jmiFullScreenRankAnnexPool1 = new javax.swing.JMenuItem(); - jSeparator14 = new javax.swing.JPopupMenu.Separator(); - jmiConceedMatch = new javax.swing.JMenuItem(); - jmiCancelConceedMatch = new javax.swing.JMenuItem(); - jmiRefuseMatch = new javax.swing.JMenuItem(); - jmiCancelMatchRefuse = new javax.swing.JMenuItem(); - jSeparator17 = new javax.swing.JPopupMenu.Separator(); - jMenu2 = new javax.swing.JMenu(); - jmiIndivReport = new javax.swing.JMenuItem(); - jmiClanReport = new javax.swing.JMenuItem(); - jmiTeamReport = new javax.swing.JMenuItem(); - jSeparator18 = new javax.swing.JPopupMenu.Separator(); - jmnHelp = new javax.swing.JMenu(); - jmiAbout = new javax.swing.JMenuItem(); - jmiRevisions = new javax.swing.JMenuItem(); - jSeparator3 = new javax.swing.JSeparator(); - jmiAideEnLigne = new javax.swing.JMenuItem(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("tourma/languages/language"); // NOI18N - setTitle(bundle.getString("SoftwareTitle")); // NOI18N - setIconImage((Toolkit.getDefaultToolkit().getImage(MainFrame.class.getResource(java.util.ResourceBundle.getBundle("tourma/languages/language").getString("IMAGES/ICONE.PNG"))))); - addWindowListener(new java.awt.event.WindowAdapter() { - public void windowClosed(java.awt.event.WindowEvent evt) { - formWindowClosed(evt); - } - public void windowClosing(java.awt.event.WindowEvent evt) { - formWindowClosing(evt); - } - }); - - jtrPanels.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { - public void valueChanged(javax.swing.event.TreeSelectionEvent evt) { - jtrPanelsValueChanged(evt); - } - }); - jScrollPane1.setViewportView(jtrPanels); - - jspSplit.setLeftComponent(jScrollPane1); - jspSplit.setRightComponent(jpnContent); - - getContentPane().add(jspSplit, java.awt.BorderLayout.CENTER); - - jmnFile.setText(bundle.getString("FileKey")); // NOI18N - - jmiNouveau.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/New.png"))); // NOI18N - jmiNouveau.setText(bundle.getString("NewTourKey")); // NOI18N - jmiNouveau.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiNouveauActionPerformed(evt); - } - }); - jmnFile.add(jmiNouveau); - - jmiCharger.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Open.png"))); // NOI18N - jmiCharger.setText(bundle.getString("LoadTourKey")); // NOI18N - jmiCharger.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiChargerActionPerformed(evt); - } - }); - jmnFile.add(jmiCharger); - - jmiSave.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Save.png"))); // NOI18N - jmiSave.setText(bundle.getString("SaveTourKey")); // NOI18N - jmiSave.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiSaveActionPerformed(evt); - } - }); - jmnFile.add(jmiSave); - - jmiSaveAs.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Save.png"))); // NOI18N - jmiSaveAs.setText(bundle.getString("SaveTourAsKey")); // NOI18N - jmiSaveAs.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiSaveAsActionPerformed(evt); - } - }); - jmnFile.add(jmiSaveAs); - jmnFile.add(jSeparator1); - - jmiExport.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExport.setText(bundle.getString("ExportNafResultKey")); // NOI18N - jmiExport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportActionPerformed(evt); - } - }); - jmnFile.add(jmiExport); - - jmiExportFbb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExportFbb.setText(bundle.getString("ExportFBBResultXML")); // NOI18N - jmiExportFbb.setActionCommand(bundle.getString("FBBExport")); // NOI18N - jmiExportFbb.setLabel(bundle.getString("FBBExport")); // NOI18N - jmiExportFbb.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportFbbActionPerformed(evt); - } - }); - jmnFile.add(jmiExportFbb); - - jmiExportFbb1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExportFbb1.setText(bundle.getString("ExportFBBResultKey")); // NOI18N - jmiExportFbb1.setLabel(bundle.getString("FBBFullExport")); // NOI18N - jmiExportFbb1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportFbb1ActionPerformed(evt); - } - }); - jmnFile.add(jmiExportFbb1); - jmnFile.add(jSeparator2); - - jmiExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Halt.png"))); // NOI18N - jmiExit.setText(bundle.getString("QuitKey")); // NOI18N - jmiExit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExitActionPerformed(evt); - } - }); - jmnFile.add(jmiExit); - - jMenuBar1.add(jmnFile); - - jmnTools.setText(bundle.getString("Tools")); // NOI18N - - jmiEditTeam.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/New.png"))); // NOI18N - jmiEditTeam.setText(bundle.getString("ChangeRosters")); // NOI18N - jmiEditTeam.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditTeamActionPerformed(evt); - } - }); - jmnTools.add(jmiEditTeam); - jmnTools.add(jSeparator5); - - jcxAllowSpecialSkill.setText(bundle.getString("AUTORISER LES COMPÉTENCES SPÉCIALES")); // NOI18N - jcxAllowSpecialSkill.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxAllowSpecialSkillActionPerformed(evt); - } - }); - jmnTools.add(jcxAllowSpecialSkill); - jmnTools.add(jSeparator4); - - jmiNafLoad.setText(bundle.getString("UpdateCoachNAFDatas")); // NOI18N - jmiNafLoad.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiNafLoadActionPerformed(evt); - } - }); - jmnTools.add(jmiNafLoad); - jmnTools.add(jSeparator11); - - jcxPatchPortugal.setText(bundle.getString("PortugalPatch")); // NOI18N - jcxPatchPortugal.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxPatchPortugalActionPerformed(evt); - } - }); - jmnTools.add(jcxPatchPortugal); - jmnTools.add(jSeparator13); - - jcxUseColor.setSelected(true); - jcxUseColor.setText(bundle.getString("UseColor")); // NOI18N - jcxUseColor.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxUseColorActionPerformed(evt); - } - }); - jmnTools.add(jcxUseColor); - - jcxUseImage.setText(bundle.getString("UseImage")); // NOI18N - jcxUseImage.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxUseImageActionPerformed(evt); - } - }); - jmnTools.add(jcxUseImage); - - jMenuBar1.add(jmnTools); - - jmnParameters.setText(bundle.getString("Parameters")); // NOI18N - - jmiGenerateFirstRound.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Generate.png"))); // NOI18N - jmiGenerateFirstRound.setText(bundle.getString("GenerateFirstRound")); // NOI18N - jmiGenerateFirstRound.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiGenerateFirstRoundActionPerformed(evt); - } - }); - jmnParameters.add(jmiGenerateFirstRound); - jmnParameters.add(jSeparator20); - - jmiMassAdd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Add.png"))); // NOI18N - jmiMassAdd.setText(bundle.getString("MassAdd")); // NOI18N - jmiMassAdd.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiMassAddActionPerformed(evt); - } - }); - jmnParameters.add(jmiMassAdd); - jmnParameters.add(jSeparator6); - - jmiSubstitutePlayer.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/User2.png"))); // NOI18N - jmiSubstitutePlayer.setText(bundle.getString("MakeSubstitution")); // NOI18N - jmiSubstitutePlayer.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiSubstitutePlayerActionPerformed(evt); - } - }); - jmnParameters.add(jmiSubstitutePlayer); - jmnParameters.add(jSeparator15); - - jcxmiAsServer.setText(bundle.getString("AsServer")); // NOI18N - jcxmiAsServer.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxmiAsServerActionPerformed(evt); - } - }); - jmnParameters.add(jcxmiAsServer); - - jmiEditColors.setText(bundle.getString("WebColors")); // NOI18N - jmiEditColors.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditColorsActionPerformed(evt); - } - }); - jmnParameters.add(jmiEditColors); - - jmiEditWebPort.setText(bundle.getString("EditWebPort")); // NOI18N - jmiEditWebPort.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditWebPortActionPerformed(evt); - } - }); - jmnParameters.add(jmiEditWebPort); - - jmiEditDescription.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Zoom.png"))); // NOI18N - jmiEditDescription.setText(bundle.getString("EditDescription")); // NOI18N - jmiEditDescription.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditDescriptionActionPerformed(evt); - } - }); - jmnParameters.add(jmiEditDescription); - - jcxmiRemoteEdit.setText(bundle.getString("RemoteMatchEdit")); // NOI18N - jcxmiRemoteEdit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jcxmiRemoteEditActionPerformed(evt); - } - }); - jmnParameters.add(jcxmiRemoteEdit); - jmnParameters.add(jSeparator19); - - jmiExportWebServerAsZIP.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/zip_32.png"))); // NOI18N - jmiExportWebServerAsZIP.setText(bundle.getString("ExportToZip")); // NOI18N - jmiExportWebServerAsZIP.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportWebServerAsZIPActionPerformed(evt); - } - }); - jmnParameters.add(jmiExportWebServerAsZIP); - - jmiExportWebServerToSite.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Html.png"))); // NOI18N - jmiExportWebServerToSite.setText(bundle.getString("ExportWebToSite")); // NOI18N - jmiExportWebServerToSite.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiExportWebServerToSiteActionPerformed(evt); - } - }); - jmnParameters.add(jmiExportWebServerToSite); - - jMenuBar1.add(jmnParameters); - - jmnRound.setText(bundle.getString("CurrentRound")); // NOI18N - - jmiGenerateNextRound.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK)); - jmiGenerateNextRound.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Generate.png"))); // NOI18N - jmiGenerateNextRound.setText(bundle.getString("GenerateNextRoundKey")); // NOI18N - jmiGenerateNextRound.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiGenerateNextRoundActionPerformed(evt); - } - }); - jmnRound.add(jmiGenerateNextRound); - jmnRound.add(jSeparator7); - - jmiDelRound.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.CTRL_MASK)); - jmiDelRound.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/trashcan_empty.png"))); // NOI18N - jmiDelRound.setText(bundle.getString("DeleteCurrentRoundKey")); // NOI18N - jmiDelRound.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiDelRoundActionPerformed(evt); - } - }); - jmnRound.add(jmiDelRound); - jmnRound.add(jSeparator8); - - jmiChangePairing.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.CTRL_MASK)); - jmiChangePairing.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Swap.png"))); // NOI18N - jmiChangePairing.setText(bundle.getString("ChangePairing")); // NOI18N - jmiChangePairing.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiChangePairingActionPerformed(evt); - } - }); - jmnRound.add(jmiChangePairing); - - jmiEditCoef.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_K, java.awt.event.InputEvent.CTRL_MASK)); - jmiEditCoef.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/reload.png"))); // NOI18N - jmiEditCoef.setText(bundle.getString("ChangeCoef")); // NOI18N - jmiEditCoef.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiEditCoefActionPerformed(evt); - } - }); - jmnRound.add(jmiEditCoef); - jmnRound.add(jSeparator9); - - jmiPrintLabels.setText(bundle.getString("PrintRoundLabels")); // NOI18N - jmiPrintLabels.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiPrintLabelsActionPerformed(evt); - } - }); - jmnRound.add(jmiPrintLabels); - jmnRound.add(jSeparator16); - - jckmiRoundOnly.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK)); - jckmiRoundOnly.setText(bundle.getString("RoundOnlyRanking")); // NOI18N - jckmiRoundOnly.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jckmiRoundOnlyActionPerformed(evt); - } - }); - jmnRound.add(jckmiRoundOnly); - - jckmiHideNonNaf.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK)); - jckmiHideNonNaf.setText(bundle.getString("HideNonNaf")); // NOI18N - jckmiHideNonNaf.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jckmiHideNonNafActionPerformed(evt); - } - }); - jmnRound.add(jckmiHideNonNaf); - jmnRound.add(jSeparator10); - - jmiAddFreeMatch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ADD, java.awt.event.InputEvent.CTRL_MASK)); - jmiAddFreeMatch.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Add.png"))); // NOI18N - jmiAddFreeMatch.setText(bundle.getString("AddMatch")); // NOI18N - jmiAddFreeMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiAddFreeMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiAddFreeMatch); - - jmiDelFreeMatch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_SUBTRACT, java.awt.event.InputEvent.CTRL_MASK)); - jmiDelFreeMatch.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Close.png"))); // NOI18N - jmiDelFreeMatch.setText(bundle.getString("DelMatch")); // NOI18N - jmiDelFreeMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiDelFreeMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiDelFreeMatch); - jmnRound.add(jSeparator12); - - jMenu1.setText(bundle.getString("FullScreen")); // NOI18N - - jmiFullScreenMatchs.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenMatchs.setText(bundle.getString("FullScreenMatchIndiv")); // NOI18N - jmiFullScreenMatchs.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenMatchsActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenMatchs); - - jmiFullScreenMatchsClash.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK)); - jmiFullScreenMatchsClash.setText(bundle.getString("FullScreenMatchIndivClash")); // NOI18N - jmiFullScreenMatchsClash.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenMatchsClashActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenMatchsClash); - - jmiFullScreenRankGeneral.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankGeneral.setText(bundle.getString("FullScreenIndivRank")); // NOI18N - jmiFullScreenRankGeneral.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankGeneralActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankGeneral); - - jmiFullScreenRankAnnexIndiv.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexIndiv.setText(bundle.getString("FullScreenIndivAnnexRank")); // NOI18N - jmiFullScreenRankAnnexIndiv.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexIndivActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexIndiv); - - jmiFullScreenRankAnnexIndiv1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexIndiv1.setText(bundle.getString("FullScreenIndivAnnexShort")); // NOI18N - jmiFullScreenRankAnnexIndiv1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexIndiv1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexIndiv1); - - jmiFullScreenRankTeam.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankTeam.setText(bundle.getString("FullScreenTeamRank")); // NOI18N - jmiFullScreenRankTeam.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankTeamActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankTeam); - - jmiFullScreenRankAnnexTeam.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Y, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexTeam.setText(bundle.getString("FullScreenTeamAnnexRank")); // NOI18N - jmiFullScreenRankAnnexTeam.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexTeamActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexTeam); - - jmiFullScreenRankAnnexTeam1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexTeam1.setText(bundle.getString("FullScreenTeamAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexTeam1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexTeam1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexTeam1); - - jmiFullScreenRankClan.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_K, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankClan.setText(bundle.getString("FullScreenClanRank")); // NOI18N - jmiFullScreenRankClan.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankClanActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankClan); - - jmiFullScreenRankAnnexClan.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexClan.setText(bundle.getString("FullScreenClanAnnexRank")); // NOI18N - jmiFullScreenRankAnnexClan.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexClanActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexClan); - - jmiFullScreenRankAnnexClan1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.ALT_MASK)); - jmiFullScreenRankAnnexClan1.setText(bundle.getString("FullScreenClanAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexClan1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexClan1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexClan1); - - jmiFullScreenRankGroups.setText(bundle.getString("FullScreenGroupRank")); // NOI18N - jmiFullScreenRankGroups.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankGroupsActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankGroups); - - jmiFullScreenRankAnnexGroups.setText(bundle.getString("FullScreenGroupAnnexRank")); // NOI18N - jmiFullScreenRankAnnexGroups.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexGroupsActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexGroups); - - jmiFullScreenRankAnnexGroups1.setText(bundle.getString("FullScreenGroupAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexGroups1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexGroups1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexGroups1); - - jmiFullScreenRankCategory.setText(bundle.getString("FullScreenCategoryRank")); // NOI18N - jmiFullScreenRankCategory.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankCategoryActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankCategory); - - jmiFullScreenRankAnnexCategory.setText(bundle.getString("FullScreenCategoryAnnexRank")); // NOI18N - jmiFullScreenRankAnnexCategory.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexCategoryActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexCategory); - - jmiFullScreenRankAnnexCategory1.setText(bundle.getString("FullScreenCategoryAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexCategory1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexCategory1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexCategory1); - - jmiFullScreenPool.setText(bundle.getString("FullScreenPoolRank")); // NOI18N - jmiFullScreenPool.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenPoolActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenPool); - - jmiFullScreenRankAnnexPool.setText(bundle.getString("FullScreenPoolAnnexRank")); // NOI18N - jmiFullScreenRankAnnexPool.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexPoolActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexPool); - - jmiFullScreenRankAnnexPool1.setText(bundle.getString("FullScreenPoolAnnexRankShort")); // NOI18N - jmiFullScreenRankAnnexPool1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiFullScreenRankAnnexPool1ActionPerformed(evt); - } - }); - jMenu1.add(jmiFullScreenRankAnnexPool1); - - jmnRound.add(jMenu1); - jmnRound.add(jSeparator14); - - jmiConceedMatch.setText(bundle.getString("MatchConceed")); // NOI18N - jmiConceedMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiConceedMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiConceedMatch); - - jmiCancelConceedMatch.setText(bundle.getString("AnnulerMatchConceed")); // NOI18N - jmiCancelConceedMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiCancelConceedMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiCancelConceedMatch); - - jmiRefuseMatch.setText(bundle.getString("MatchRefused")); // NOI18N - jmiRefuseMatch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiRefuseMatchActionPerformed(evt); - } - }); - jmnRound.add(jmiRefuseMatch); - - jmiCancelMatchRefuse.setText(bundle.getString("CancelMatchRefuse")); // NOI18N - jmiCancelMatchRefuse.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiCancelMatchRefuseActionPerformed(evt); - } - }); - jmnRound.add(jmiCancelMatchRefuse); - jmnRound.add(jSeparator17); - - jMenu2.setText(bundle.getString("Reports")); // NOI18N - - jmiIndivReport.setText(bundle.getString("IndividualReport")); // NOI18N - jmiIndivReport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiIndivReportActionPerformed(evt); - } - }); - jMenu2.add(jmiIndivReport); - - jmiClanReport.setText(bundle.getString("ClanReport")); // NOI18N - jmiClanReport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiClanReportActionPerformed(evt); - } - }); - jMenu2.add(jmiClanReport); - - jmiTeamReport.setText(bundle.getString("TeamReport")); // NOI18N - jmiTeamReport.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiTeamReportActionPerformed(evt); - } - }); - jMenu2.add(jmiTeamReport); - - jmnRound.add(jMenu2); - jmnRound.add(jSeparator18); - - jMenuBar1.add(jmnRound); - - jmnHelp.setText(bundle.getString("?")); // NOI18N - - jmiAbout.setText(bundle.getString("AboutKey")); // NOI18N - jmiAbout.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiAboutActionPerformed(evt); - } - }); - jmnHelp.add(jmiAbout); - - jmiRevisions.setText(bundle.getString("SoftwareRevisionsKey")); // NOI18N - jmiRevisions.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiRevisionsActionPerformed(evt); - } - }); - jmnHelp.add(jmiRevisions); - jmnHelp.add(jSeparator3); - - jmiAideEnLigne.setText(bundle.getString("Help")); // NOI18N - jmiAideEnLigne.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jmiAideEnLigneActionPerformed(evt); - } - }); - jmnHelp.add(jmiAideEnLigne); - - jMenuBar1.add(jmnHelp); - - setJMenuBar(jMenuBar1); - - pack(); - }// //GEN-END:initComponents - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiSaveAsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSaveAsActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_TourMaXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - StringBuffer url2 = new StringBuffer(jfc.getSelectedFile().getAbsolutePath()); - String ext = StringConstants.CS_NULL; - final int i = url2.toString().lastIndexOf('.'); - if (i > 0 && i < url2.length() - 1) { - ext = url2.substring(i + 1).toLowerCase(Locale.getDefault()); - } - - if (!ext.equals(StringConstants.CS_MINXML)) { - url2 = url2.append(".XML"); - } - mFile = new File(url2.toString()); - - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).saveXML(mFile); - } - - currentPath = jfc.getSelectedFile().getAbsolutePath(); - - } - }//GEN-LAST:event_jmiSaveAsActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSaveActionPerformed - if (mFile != null) { - if (mTournament instanceof Tournament) { - - ((Tournament) mTournament).saveXML(mFile); - - } - } else { - jmiSaveAsActionPerformed(evt); - } - }//GEN-LAST:event_jmiSaveActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiChargerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiChargerActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_TourMaXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).loadXML(jfc.getSelectedFile()); - mFile = jfc.getSelectedFile(); - updateTree(); - update(); - currentPath = jfc.getSelectedFile().getAbsolutePath(); - } - - } - }//GEN-LAST:event_jmiChargerActionPerformed - - private static final String CS_None = "None"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiNouveauActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiNouveauActionPerformed - - mTournament = Tournament.resetTournament(); - - JdgParameters jdgParams = new JdgParameters(this, true); - jdgParams.setVisible(true); - - mTournament = Tournament.getTournament(); - if (mTournament.getParams().getGame() == RosterType.C_DREAD_BALL) { - RosterType.initCollection(RosterType.C_DREAD_BALL); - jmiExport.setEnabled(false); - jmiExportFbb.setEnabled(false); - jcxAllowSpecialSkill.setEnabled(false); - } else { - RosterType.initCollection(RosterType.C_BLOOD_BOWL); - // LRB.getLRB(); - } - - mTournament.clearGroups(); - final Group group = new Group(Translate.translate(CS_None)); - mTournament.addGroup(group); - - for (int i = 0; i < RosterType.getRostersNamesCount(); i++) { - String mRostersName = RosterType.getRostersName(i); - group.addRoster(RosterType.getRosterType(mRostersName)); - } - - update(); - }//GEN-LAST:event_jmiNouveauActionPerformed - - private final static String CS_NAFXMLFile = "NAF XML FILE"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_NAFXMLFile), - new String[]{StringConstants.CS_XML, StringConstants.CS_MINXML}); - jfc.setFileFilter(filter1); - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportNAF(jfc.getSelectedFile()); - } - - currentPath = jfc.getSelectedFile().getAbsolutePath(); - - } - }//GEN-LAST:event_jmiExportActionPerformed - - private final static String CS_DoYouWantToSave = "VOULEZ VOUS SAUVGARDER ?"; - private final static String CS_Exit = "EXIT"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExitActionPerformed - int res = JOptionPane.showConfirmDialog(this, - Translate.translate(CS_DoYouWantToSave), - Translate.translate(CS_Exit), - JOptionPane.YES_NO_CANCEL_OPTION); - if (res == JOptionPane.CANCEL_OPTION) { - } else { - if (res == JOptionPane.YES_OPTION) { - if (mFile.getName().isEmpty()) { - jmiSaveAsActionPerformed(null); - } else { - jmiSaveActionPerformed(null); - } - } - System.exit(0); - } - }//GEN-LAST:event_jmiExitActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiRevisionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRevisionsActionPerformed - JdgRevisions jdg = new JdgRevisions(this, true); - jdg.setVisible(true); -}//GEN-LAST:event_jmiRevisionsActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiAideEnLigneActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAideEnLigneActionPerformed - JdgOnlineHelp jdg = new JdgOnlineHelp(this, false); - jdg.setVisible(true); - }//GEN-LAST:event_jmiAideEnLigneActionPerformed - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed - RMIThread.stop(); - if (JOptionPane.showConfirmDialog(this, - Translate.translate(CS_DoYouWantToSave), - Translate.translate(CS_Exit), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - if (mFile.getName().isEmpty()) { - jmiSaveAsActionPerformed(null); - } else { - jmiSaveActionPerformed(null); - } - } - }//GEN-LAST:event_formWindowClosed - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAboutActionPerformed - JdgAbout jdg = new JdgAbout(this, true); - jdg.setVisible(true); -}//GEN-LAST:event_jmiAboutActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing - if (JOptionPane.showConfirmDialog(this, - Translate.translate(CS_DoYouWantToSave), - Translate.translate(CS_Exit), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - if (mFile == null) { - jmiSaveAsActionPerformed(null); - } else if (mFile.getName().isEmpty()) { - jmiSaveAsActionPerformed(null); - } else { - jmiSaveActionPerformed(null); - } - } - }//GEN-LAST:event_formWindowClosing - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiEditTeamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditTeamActionPerformed - final JdgRoster jdg = new JdgRoster(this, true); - jdg.setVisible(true); - }//GEN-LAST:event_jmiEditTeamActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jcxAllowSpecialSkillActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxAllowSpecialSkillActionPerformed - LRB.setAllowSpecialSkills(jcxAllowSpecialSkill.getState()); - }//GEN-LAST:event_jcxAllowSpecialSkillActionPerformed - - private final static String CS_FBBCSVFile = "FBB CSV FILE"; - private final static String CS_FBBXMLFile = "FBB XML FILE"; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExportFbbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportFbbActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_FBBCSVFile), - new String[]{"CSV", - "CSV"}); - jfc.setFileFilter(filter1); - - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportFBB(jfc.getSelectedFile()); - } - currentPath = jfc.getSelectedFile().getAbsolutePath(); - } - - }//GEN-LAST:event_jmiExportFbbActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiExportFbb1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportFbb1ActionPerformed - final JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(new File(currentPath)); - final FileFilter filter1 = new ExtensionFileFilter( - Translate.translate(CS_FBBXMLFile), - new String[]{"FBB_XML", - "FBB_XML"}); - jfc.setFileFilter(filter1); - - if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - final File f = jfc.getSelectedFile(); - if (f.getName().endsWith(".fbb_xml")) { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportFullFBB(f); - } - } else { - if (mTournament instanceof Tournament) { - ((Tournament) mTournament).exportFullFBB(new File(f.getAbsolutePath() + ".fbb_xml")); - } - } - } - - }//GEN-LAST:event_jmiExportFbb1ActionPerformed - - private final static String CS_Check = "Check"; - private final static String CS_LargeVictoryPointsAreNotSuperiorToVictoryPoints = "Large victory points are not superior to victory points"; - private final static String CS_LittleLossPointsAreNotSuperiorToLossPoints = "Little loss points are not superior to loss points"; - private final static String CS_LargeVictoryGapIsNotMoreThanOneTouchdown = "Large victory gap is not more than 1 touchdown"; - private final static String CS_LittleLostGapIsNotSuperiorTo0 = "Little lost gap is not superior to 0"; - private final static String CS_2DrawsAreMoreThan1Victory = "2 draws are more than one victory"; - private final static String CS_2LostAreMoreThan1Draw = "2 lost are more than one draw"; - private final static String CS_2LittleLostAreMoreThanOneDraw = "2 little loss are more than one draw"; - private final static String CS_2TeamDrawsAreMoreThan1TeamVictory = "2 team draws are more than one team victory"; - private final static String CS_2TeamLostAreMoreThan1TeamVictory = "2 team lost are more than one team draw"; - private final static String CS_2TeamDrawBonusAreMoreThan1TeamVictoryBonus = "2 team draw bonus are more than one team victory bonus"; - - private boolean areRulesValid() { - - boolean valid = true; - - // Check that large victory is more than victory - if (mTournament.getParams().isUseLargeVictory()) { - valid = (mTournament.getParams().getPointsIndivLargeVictory() > mTournament.getParams().getPointsIndivVictory()); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LargeVictoryPointsAreNotSuperiorToVictoryPoints), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - - if (valid) { - // Check that little loss is more than loss - if (mTournament.getParams().isUseLittleLoss()) { - valid = (mTournament.getParams().getPointsIndivLittleLost() > mTournament.getParams().getPointsIndivLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LittleLossPointsAreNotSuperiorToLossPoints), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (valid) { - // Check that touchdown gap is positive - if (mTournament.getParams().isUseLargeVictory()) { - valid = (mTournament.getParams().getGapLargeVictory() > 1); - if (!valid) { - - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LargeVictoryGapIsNotMoreThanOneTouchdown), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (valid) { - // Check that little loss is positive - if (mTournament.getParams().isUseLittleLoss()) { - valid = (mTournament.getParams().getGapLittleLost() > 0); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_LittleLostGapIsNotSuperiorTo0), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsIndivVictory() >= 2 * mTournament.getParams().getPointsIndivDraw()); - if (!valid) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_2DrawsAreMoreThan1Victory), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - - if (valid) { - // Check that draw is more than 2 lost - valid = (mTournament.getParams().getPointsIndivDraw() >= 2 * mTournament.getParams().getPointsIndivLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2LostAreMoreThan1Draw), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - - if (valid) { - // Check that little loss is positive - if (mTournament.getParams().isUseLittleLoss()) { - valid = (mTournament.getParams().getPointsIndivDraw() >= 2 * mTournament.getParams().getPointsIndivLittleLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2LittleLostAreMoreThanOneDraw), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - } - } - - if (mTournament.getParams().isTeamTournament()) { - if (mTournament.getParams().getTeamPairing() == TEAM_PAIRING) { - if (mTournament.getParams().isTeamVictoryOnly()) { - if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsTeamVictory() >= 2 * mTournament.getParams().getPointsTeamDraw()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2TeamDrawsAreMoreThan1TeamVictory), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - - if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsTeamDraw() >= 2 * mTournament.getParams().getPointsTeamLost()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2TeamLostAreMoreThan1TeamVictory), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - } else if (valid) { - // Check that vicotry is more than 2 draw - valid = (mTournament.getParams().getPointsTeamVictoryBonus() >= 2 * mTournament.getParams().getPointsTeamDrawBonus()); - if (!valid) { - JOptionPane.showMessageDialog(this, Translate.translate(CS_2TeamDrawBonusAreMoreThan1TeamVictoryBonus), - Translate.translate(CS_Check), JOptionPane.ERROR_MESSAGE); - } - - } - } - } - - return valid; - } - - private static final String CS_Random = "Random"; - private static final String CS_Cup = "Cup"; - private static final String CS_RegisteringOrder = "Registering order"; - private static final String CS_RoundRobin = "ROUND ROBIN"; - private static final String CS_OddTeamNumber = "OddTeamNumber"; - private static final String CS_ManualChoice = "CHOIX MANUEL"; - private static final String CS_Pools = "POULES"; - private static final String CS_FreeRound = "FREE_ROUND"; - private static final String CS_NafRanking = "NAF_RANK"; - private static final String CS_NafRankingAvg = "NAF_RANK_AVG"; - private static final String CS_RandomAndBalancing = "RandomAndBalancing"; - private static final String CS_Generation = "GÉNÉRATION"; - private static final String CS_ChooseGenerationMethod = "CHOISISSEZ LA MÉTHODE DE GÉNÉRATION: "; - - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jmiGenerateFirstRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiGenerateFirstRoundActionPerformed - if (areRulesValid()) { - - if (JOptionPane.showConfirmDialog(this, java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("AreYouSure?ItWillEraseAllRounds"), java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("FirstRound"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - if (mTournament.getParams().isTeamTournament() && (mTournament.getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING) && mTournament.getTeamsCount() % 2 > 0) { - JOptionPane.showMessageDialog(this, - Translate.translate(CS_OddTeamNumber)); - } else { - - final ArrayList labels = new ArrayList<>(); - final ArrayList Options = new ArrayList<>(); - - /** - * GenRandom possible ? - */ - labels.add(Translate.translate(CS_Random)); - Options.add(Generation.GEN_RANDOM); - - /** - * Coupe - */ - labels.add(Translate.translate(CS_Cup)); - Options.add(Generation.GEN_CUP); - - /** - * Ordre - */ - labels.add(Translate.translate(CS_RegisteringOrder)); - Options.add(Generation.GEN_ORDER); - - /** - * Round Robin - */ - labels.add(Translate.translate(CS_RoundRobin)); - Options.add(Generation.GEN_RROBIN); - - /** - * manuel - */ - labels.add(Translate.translate(CS_ManualChoice)); - Options.add(Generation.GEN_MANUAL); - - /** - * Poules - */ - labels.add(Translate.translate(CS_Pools)); - Options.add(Generation.GEN_POOL); - - /** - * Naf Ranking - */ - labels.add(Translate.translate(CS_NafRanking)); - Options.add(Generation.GEN_NAF); - - /** - * Naf Ranking - */ - labels.add(Translate.translate(CS_FreeRound)); - Options.add(Generation.GEN_FREE); - - /** - * Naf Ranking - */ - labels.add(Translate.translate(CS_NafRankingAvg)); - Options.add(Generation.GEN_NAF_AVG); - - /* - OPTION NON CONCLUANTE - - if (Tournament.getTournament().getParams().isTeamTournament()) { - if (Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.INDIVIDUAL_PAIRING) { - // Balanced Options - labels.add( - Translate.translate(CS_RandomAndBalancing)); - Options.add(Generation.GEN_BALANCED); - } - }*/ - final JPanel jpn = new JPanel(new BorderLayout()); - final JComboBox jcb = new JComboBox(labels.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - final JLabel jlb = new JLabel( - Translate.translate(CS_ChooseGenerationMethod)); - jpn.add(jlb, BorderLayout.NORTH); - - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), jpn, - Translate.translate(CS_Generation), - JOptionPane.QUESTION_MESSAGE); - final int index = jcb.getSelectedIndex(); - - Generation.generateFirstRound(Options.get(index)); - - updateTree(); - update(); - - } - - } - - } - }//GEN-LAST:event_jmiGenerateFirstRoundActionPerformed - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) - private void jtrPanelsValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jtrPanelsValueChanged - - TreePath path; - if (evt != null) { - path = evt.getNewLeadSelectionPath(); - } else { - path = jtrPanels.getPathForRow(1); - } - if (path != null) { - - final DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); - if (node != null) { - final Object object = node.getUserObject(); - if (object instanceof Parameters) { - jspSplit.remove(jpnContent); - JPNParameters jpn = new JPNParameters(); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - } - if (object instanceof Round) { - for (int i = 0; i < mTournament.getRoundsCount(); i++) { - if (mTournament.getRound(i).equals(object)) { - jspSplit.remove(jpnContent); - JPNRound jpn = new JPNRound(i, (Round) object, mTournament); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpn.setRoundOnly(jckmiRoundOnly.isSelected()); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - break; - } - } - } - - if (object.equals(Translate.translate(MainTreeModel.CS_Cup))) { - jspSplit.remove(jpnContent); - JPNCup jpn = new JPNCup(); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - } - - if (object.equals(Translate.translate(MainTreeModel.CS_Statistics))) { - jspSplit.remove(jpnContent); - JPNStatistics jpn = new JPNStatistics(); - jspSplit.add(jpn, JSplitPane.RIGHT); - jpn.update(); - jspSplit.setDividerLocation(200); - jpnContent = jpn; - //System.gc(); - this.revalidate(); - } - - } - - updateMenus(); - repaint(); - } - - }//GEN-LAST:event_jtrPanelsValueChanged - - private ProgressMonitor progressMonitor; - - private static final String CS_DownloadFromNAF = "DownloadFromNAF"; - private static final String CS_Downloading = "Downloading"; - - private void jmiNafLoadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiNafLoadActionPerformed - - progressMonitor = new ProgressMonitor(this, - Translate.translate(CS_DownloadFromNAF), - Translate.translate(CS_Downloading), 0, - Tournament.getTournament().getCoachsCount()); - progressMonitor.setProgress(0); - - task = new NafTask(progressMonitor); - task.addPropertyChangeListener(this); - task.execute(); - - update(); - }//GEN-LAST:event_jmiNafLoadActionPerformed - - private final static String CS_WhichCoachIsSubstituted = "WhichCoachIsSubstituted"; - private final static String CS_Substitution = "Substitution"; - private final static String CS_Round = "Round"; - private final static String CS_ACCR_Versus = "vs"; - private final static String CS_WhichMatch = "WhichMatch"; - private final static String CS_ChooseASubstitute = "ChooseASubstitute"; - private final static String CS_NewDOTDOTDOT = "New..."; - - - private void jmiSubstitutePlayerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSubstitutePlayerActionPerformed - // Select Player to subtitute - ArrayList list = new ArrayList<>(); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - list.add(Tournament.getTournament().getCoach(i)); - } - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - if (!Tournament.getTournament().getCoach(i).isActive()) { - list.remove(i); - } - } - JComboBox jcb = new JComboBox<>(list.toArray()); - JLabel jlb = new JLabel( - Translate.translate(CS_WhichCoachIsSubstituted) - ); - JPanel jpn = new JPanel(new BorderLayout()); - jpn.add(jlb, BorderLayout.NORTH); - jpn.add(jcb, BorderLayout.CENTER); - int ret = JOptionPane.showConfirmDialog(this, jpn, - Translate.translate(CS_Substitution), - JOptionPane.OK_CANCEL_OPTION); - if (ret == JOptionPane.OK_OPTION) { - Coach c = (Coach) jcb.getSelectedItem(); - ArrayList matchs_descr = new ArrayList<>(); - - // Select Match - for (int i = 0; i < c.getMatchCount(); i++) { - Match mMatch = c.getMatch(i); - CoachMatch m = (CoachMatch) mMatch; - String tmp - = Translate.translate(CS_Round) - + " " + (Tournament.getTournament().getRoundIndex(m.getRound()) + 1); - tmp = tmp + " / " + m.getCompetitor1().getDecoratedName() + " " + Translate.translate(CS_ACCR_Versus) + " " - + m.getCompetitor2().getDecoratedName(); - matchs_descr.add(tmp); - } - jpn.remove(jcb); - jcb = new JComboBox(matchs_descr.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - jlb.setText(Translate.translate(CS_WhichMatch)); - JOptionPane.showConfirmDialog(this, jpn, - Translate.translate(CS_Substitution), - JOptionPane.OK_OPTION); - CoachMatch m = (CoachMatch) c.getMatch(jcb.getSelectedIndex()); - - // Select subtitute - ArrayList availableCoachs = new ArrayList<>(); - ArrayList availableCoachsName = new ArrayList<>(); - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - Coach sub = Tournament.getTournament().getCoach(i); - if (!sub.isActive()) { - availableCoachs.add(sub); - } - } - availableCoachs.add(Coach.getNullCoach()); - for (Coach availableCoach : availableCoachs) { - availableCoachsName.add(availableCoach.getDecoratedName()); - } - - availableCoachsName.add( - Translate.translate(CS_NewDOTDOTDOT) - ); - jpn.remove(jcb); - jcb = new JComboBox(availableCoachsName.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - jlb.setText( - Translate.translate(CS_ChooseASubstitute) - ); - JOptionPane.showConfirmDialog(this, jpn, - Translate.translate(CS_Substitution), - JOptionPane.OK_OPTION); - - boolean cancel = false; - // Create Substitution - // If None - if (jcb.getSelectedIndex() == availableCoachs.size() - 1) { - if (m.getCompetitor1() == c) { - m.setSubstitute1(null); - } - if (m.getCompetitor2() == c) { - m.setSubstitute2(null); - } - } else { - Coach sub; - // New - if (jcb.getSelectedIndex() == availableCoachs.size()) { - sub = new Coach(); - sub.setRoster(RosterType.getRosterType(0)); - JdgCoach jdg = new JdgCoach(this, true, sub); - jdg.setVisible(true); - if (!sub.getName().equals("")) { - Tournament.getTournament().addCoach(sub); - sub.setActive(false); - cancel = true; - } - } else { - sub = availableCoachs.get(jcb.getSelectedIndex()); - } - - if (!cancel) { - Substitute s = new Substitute(); - s.setMatch(m); - s.setSubstitute(sub); - s.setTitular(c); - - if (m.getCompetitor1() == c) { - m.setSubstitute1(s); - } - if (m.getCompetitor2() == c) { - m.setSubstitute2(s); - } - } - } - } - - }//GEN-LAST:event_jmiSubstitutePlayerActionPerformed - - private void jmiEditDescriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditDescriptionActionPerformed - /*JTextArea jta = new JTextArea(40, 80); - jta.setText(Tournament.getTournament().getDescription()); - */ - - EkitCore editor = new EkitCore(); - - editor.setSize(320, 320); - editor.setMinimumSize(new Dimension(320, 320)); - editor.setPreferredSize(new Dimension(320, 300)); - - JPanel jsp - = new JPanel(new VerticalLayout()); - //jsp.add(editor.getToolBarMain(true)); - jsp.add(editor.getMenuBar()); - jsp.add(editor.getToolBarFormat(true)); - jsp.add(editor.getToolBarStyles(true)); - jsp.add(editor.getToolBarMain(true)); - - jsp.add(editor); - - String text = "
" + Tournament.getTournament().getDescription() + ""; - editor.setDocumentText(text); - - //JScrollPane jsp = new JScrollPane(html); - JOptionPane.showInputDialog(this, jsp); - String body = editor.getDocumentBody(); - - Tournament.getTournament().setDescription(body); - - }//GEN-LAST:event_jmiEditDescriptionActionPerformed - - private void jmiDelRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiDelRoundActionPerformed - if (JOptionPane.showConfirmDialog(this, java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("ConfirmEraseCurrentRound"), java.util.ResourceBundle.getBundle(StringConstants.CS_LANGUAGE_RESOURCE).getString("EraseRound"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - // Remove mRound - Round round = jpnr.getRound(); - - // Remove matchs from coach reference list - ArrayList cms = round.getCoachMatchs(); - for (CoachMatch m : cms) { - m.getCompetitor1().removeMatch(m); - m.getCompetitor2().removeMatch(m); - } - - // remove matchs from competitors - for (int i = 0; i < round.getMatchsCount(); i++) { - final Match m = round.getMatch(i); - m.getCompetitor1().removeMatch(m); - m.getCompetitor2().removeMatch(m); - } - - mTournament.removeRound(round); - - update(); - updateTree(); - } - } - }//GEN-LAST:event_jmiDelRoundActionPerformed - - private final static String CS_FirstTableCoef = "FirstTableCoef"; - private final static String CS_LastTableCoef = "LastTableCoef"; - private final static String CS_RoundCoefficient = "Round coefficient"; - - private void editRoundCoef(Round r) { - - JPanel jpn = new JPanel(); - jpn.setLayout(new GridLayout(2, 2)); - JLabel jlb1 = new JLabel(Translate.translate(CS_FirstTableCoef)); - jlb1.setHorizontalAlignment(JLabel.TRAILING); - JLabel jlb2 = new JLabel(Translate.translate(CS_LastTableCoef)); - jlb2.setHorizontalAlignment(JLabel.TRAILING); - - JFormattedTextField jftf1 = new JFormattedTextField(new DecimalFormat("####.##")); - jftf1.setValue(new Double(r.getMaxBonus())); - - JFormattedTextField jftf2 = new JFormattedTextField(new DecimalFormat("####.##")); - jftf2.setValue(new Double(r.getMinBonus())); - - jpn.add(jlb1); - jpn.add(jftf1); - jpn.add(jlb2); - jpn.add(jftf2); - - int res = JOptionPane.showConfirmDialog(this, jpn, Translate.translate(CS_RoundCoefficient), JOptionPane.OK_CANCEL_OPTION); - if (res == JOptionPane.OK_OPTION) { - Double val1 = (Double) jftf1.getValue(); - r.setMaxBonus(val1); - Double val2 = (Double) jftf2.getValue(); - r.setMinBonus(val2); - update(); - } - - } - - private final static String CS_SwissRound = "RONDE SUISSE"; - private final static String CS_AcceleratedSwissRound = "RONDE SUISSE ACCELERÉE"; - private final static String CS_Animation = "Animation"; - - private final static String CS_Confirm = "CONFIRM"; - private final static String CS_WebMacthNotChecked = "WEB_MATCHES_NOT_CONFIRMED"; - - private void jmiGenerateNextRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiGenerateNextRoundActionPerformed - - if (areRulesValid()) { - final ArrayList labels = new ArrayList<>(); - final ArrayList Options = new ArrayList<>(); - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - Round round = jpnr.getRound(); - - int remote = 0; - for (CoachMatch cm : round.getCoachMatchs()) { - if (cm.isRemotely()) { - remote++; - } - } - if (remote > 0) { - int res = JOptionPane.showConfirmDialog(this, Translate.translate(CS_WebMacthNotChecked), Translate.translate(CS_Confirm), JOptionPane.OK_CANCEL_OPTION); - if (res == JOptionPane.CANCEL_OPTION) { - return; - } - } - - int round_number = mTournament.getRoundIndex(round); - - /** - * Swiss possible ? - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_SwissRound)); - Options.add(Generation.GEN_SWISS); - } - - /** - * QSwiss possible ? - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_AcceleratedSwissRound)); - Options.add(Generation.GEN_QSWISS); - } - - /** - * GenRandom possible ? - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_Random)); - Options.add(Generation.GEN_RANDOM); - } - - /** - * Coupe - */ - labels.add(Translate.translate(CS_Cup)); - Options.add(Generation.GEN_CUP); - - /** - * - * Libre - */ - if ((!round.isCup()) && (!mTournament.isRoundRobin())) { - labels.add(Translate.translate(CS_FreeRound)); - Options.add(Generation.GEN_FREE); - } - - final JPanel jpn = new JPanel(new BorderLayout()); - final JComboBox jcb = new JComboBox(labels.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - final JLabel jlb = new JLabel(Translate.translate(CS_ChooseGenerationMethod)); - jpn.add(jlb, BorderLayout.NORTH); - - final JCheckBox jcxClash = new JCheckBox(Translate.translate(CS_Animation)); - jpn.add(jcxClash, BorderLayout.SOUTH); - - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), jpn, - Translate.translate(CS_Generation), JOptionPane.QUESTION_MESSAGE); - - final int index = jcb.getSelectedIndex(); - - Generation.nextRound(round, Options.get(index), round_number); - - if (mTournament.getParams().isTableBonusPerRound()) { - editRoundCoef(mTournament.getRound(mTournament.getRoundsCount() - 1)); - } - - if (jpnContent instanceof JPNRound) { - ((JPNRound) jpnContent).update(); - update(); - } - - updateTree(); - - if (jcxClash.isSelected()) { - try { - JFullScreen fs = new JFullScreenMatchs(Tournament.getTournament().getRound(round_number + 1), true); - fs.setVisible(true); - } catch (IOException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - - } - } - }//GEN-LAST:event_jmiGenerateNextRoundActionPerformed - - private void jmiChangePairingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiChangePairingActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - Round round = jpnr.getRound(); - final JdgChangePairing jdg = new JdgChangePairing(MainFrame.getMainFrame(), true, round); - jdg.setVisible(true); - jpnr.update(); - } - update(); - }//GEN-LAST:event_jmiChangePairingActionPerformed - - private void jckmiRoundOnlyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jckmiRoundOnlyActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - jpnr.setRoundOnly(jckmiRoundOnly.isSelected()); - jpnr.update(); - } - }//GEN-LAST:event_jckmiRoundOnlyActionPerformed - - private static final String CS_FreeMatch = "MATCH LIBRE"; - private static final String CS_Error = "ERROR"; - private static final String CS_ImpossibleMatch = "MATCH IMPOSSIBLE"; - - private void jmiAddFreeMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAddFreeMatchActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - Round round = jpnr.getRound(); - if (Tournament.getTournament().getParams().isTeamTournament()) { - - final ArrayList teams1 = new ArrayList<>(); - final ArrayList teams2 = new ArrayList<>(); - - final JComboBox jcb1 = new JComboBox<>(); - final JComboBox jcb2 = new JComboBox<>(); - - for (int i = 0; i < mTournament.getTeamsCount(); i++) { - final Team c = mTournament.getTeam(i); - teams1.add(c); - teams2.add(c); - jcb1.addItem(c.getName()); - jcb2.addItem(c.getName()); - } - - boolean ValidMatch = false; - - while (!ValidMatch) { - jcb1.setSelectedIndex(0); - jcb2.setSelectedIndex(1); - - final JPanel jpnQuestion = new JPanel(new BorderLayout(0, 0)); - jpnQuestion.add(jcb1, BorderLayout.WEST); - jpnQuestion.add(jcb2, BorderLayout.EAST); - final JLabel jlb = new JLabel( - " " + Translate.translate(CS_ACCR_Versus) + " " - ); - jpnQuestion.add(jlb, BorderLayout.CENTER); - - final int ret = JOptionPane.showOptionDialog(MainFrame.getMainFrame(), jpnQuestion, - Translate.translate(CS_FreeMatch), - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); - if (ret == JOptionPane.OK_OPTION) { - if (jcb1.getSelectedIndex() != jcb2.getSelectedIndex()) { - TeamMatch m = new TeamMatch(round); - m.setCompetitor1(teams1.get(jcb1.getSelectedIndex())); - m.setCompetitor2(teams2.get(jcb2.getSelectedIndex())); - JdgPairing jdg = new JdgPairing(MainFrame.getMainFrame(), true, teams1.get(jcb1.getSelectedIndex()), teams2.get(jcb2.getSelectedIndex()), round, m); - jdg.setVisible(true); - round.addMatch(m); - - for (int cpt = 0; cpt < m.getMatchCount(); cpt++) { - CoachMatch c = m.getMatch(cpt); - c.getCompetitor1().addMatch(c); - c.getCompetitor2().addMatch(c); - } - - ValidMatch = true; - } else { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), - Translate.translate(CS_ImpossibleMatch), - Translate.translate(CS_Error), - JOptionPane.ERROR_MESSAGE); - } - } else { - ValidMatch = true; - } - } - } else { - final ArrayList Coachs1 = new ArrayList<>(); - final ArrayList Coachs2 = new ArrayList<>(); - - final JComboBox jcb1 = new JComboBox<>(); - final JComboBox jcb2 = new JComboBox<>(); - - for (int i = 0; i < mTournament.getActiveCoaches().size(); i++) { - final Coach c = mTournament.getActiveCoaches().get(i); - Coachs1.add(c); - Coachs2.add(c); - jcb1.addItem(c.getName()); - jcb2.addItem(c.getName()); - } - - boolean ValidMatch = false; - - while (!ValidMatch) { - jcb1.setSelectedIndex(0); - jcb2.setSelectedIndex(1); - - final JPanel jpnQuestion = new JPanel(new BorderLayout(0, 0)); - jpnQuestion.add(jcb1, BorderLayout.WEST); - jpnQuestion.add(jcb2, BorderLayout.EAST); - final JLabel jlb = new JLabel( - " " + Translate.translate(CS_ACCR_Versus) + " "); - jpnQuestion.add(jlb, BorderLayout.CENTER); - - final int ret = JOptionPane.showOptionDialog(MainFrame.getMainFrame(), jpnQuestion, - Translate.translate(CS_FreeMatch), - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); - - if (ret == JOptionPane.OK_OPTION) { - if (jcb1.getSelectedIndex() != jcb2.getSelectedIndex()) { - final CoachMatch m = new CoachMatch(round); - m.setCompetitor1(Coachs1.get(jcb1.getSelectedIndex())); - m.setCompetitor2(Coachs2.get(jcb2.getSelectedIndex())); - - round.addMatch(m); - m.getCompetitor1().addMatch(m); - m.getCompetitor2().addMatch(m); - ValidMatch = true; - } else { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), - Translate.translate(CS_ImpossibleMatch), - Translate.translate(CS_Error), JOptionPane.ERROR_MESSAGE); - } - } else { - ValidMatch = true; - } - } - } - jpnr.update(); - - } - }//GEN-LAST:event_jmiAddFreeMatchActionPerformed - - private void jmiDelFreeMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiDelFreeMatchActionPerformed - - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - int row = jpnr.getMatchTableSelectedRow(); - if (row >= 0) { - Round round = jpnr.getRound(); - if (Tournament.getTournament().getParams().isTeamTournament()) { - CoachMatch c = round.getCoachMatchs().get(row); - // Fint TeamMatch corresponding to CoachMatch - int j = 0; - while (j < round.getMatchsCount()) { - TeamMatch t = ((TeamMatch) round.getMatch(j)); - int i = 0; - while (i < t.getMatchCount()) { - if (t.containsMatch(c)) { - for (int cpt = 0; cpt < t.getMatchCount(); cpt++) { - CoachMatch cm = t.getMatch(cpt); - cm.getCompetitor1().removeMatch(cm); - cm.getCompetitor2().removeMatch(cm); - } - t.getCompetitor1().removeMatch(t); - t.getCompetitor2().removeMatch(t); - round.removeMatch(t); - j = round.getMatchsCount(); - i = t.getMatchCount(); - } - i++; - } - j++; - } - } else { - CoachMatch c = (CoachMatch) round.getMatch(row); - c.getCompetitor1().removeMatch(c); - c.getCompetitor2().removeMatch(c); - round.removeMatch(c); - } - jpnr.update(); - } - - } - }//GEN-LAST:event_jmiDelFreeMatchActionPerformed - - private void jcxPatchPortugalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxPatchPortugalActionPerformed - - mTournament.getParams().setPortugal(jcxPatchPortugal.isSelected()); - - }//GEN-LAST:event_jcxPatchPortugalActionPerformed - - private static final String CS_MatchAlreadyConceededOrRefused = "MatchAlreadyConceededOrRefused"; - private static final String CS_Cancel = "Cancel"; - private static final String CS_ConceedAMatch = "ConceedAMatch"; - private static final String CS_WhoConceedTheMatch = "WhoConceedTheMatch"; - private static final String CS_RefuseAMatch = "RefuseAMatch"; - private static final String CS_WhoRefuseMatch = "WhoRefuseMatch"; - - - private void jmiConceedMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiConceedMatchActionPerformed - try { - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - if (m.isConcedeedBy1() || m.isConcedeedBy2() || m.isRefusedBy1() || m.isRefusedBy2()) { - JOptionPane.showMessageDialog(null, - Translate.translate(CS_Error), - Translate.translate(CS_MatchAlreadyConceededOrRefused), - JOptionPane.ERROR_MESSAGE); - } else { - Object[] options = new Object[3]; - options[0] = m.getCompetitor1(); - options[1] = m.getCompetitor2(); - options[2] = Translate.translate(CS_Cancel); - - Object option = JOptionPane.showInputDialog(null, - Translate.translate(CS_ConceedAMatch), - Translate.translate(CS_WhoConceedTheMatch), - JOptionPane.QUESTION_MESSAGE, null, options, options[2]); - - if (option.equals(m.getCompetitor1())) { - m.setConcedeedBy1(true); - m.setConcedeedBy2(false); - } - if (option.equals(m.getCompetitor2())) { - m.setConcedeedBy2(true); - m.setConcedeedBy1(false); - } - update(); - jpnr.update(); - } - - } - } catch (HeadlessException e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiConceedMatchActionPerformed - - private void jmiCancelConceedMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiCancelConceedMatchActionPerformed - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - m.setConcedeedBy1(false); - m.setConcedeedBy2(false); - } - } catch (Exception e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiCancelConceedMatchActionPerformed - - private void jmiRefuseMatchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRefuseMatchActionPerformed - try { - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = ((JPNRound) jpnContent); - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - if (m.isConcedeedBy1() || m.isConcedeedBy2() || m.isRefusedBy1() || m.isRefusedBy2()) { - JOptionPane.showMessageDialog(null, - Translate.translate(CS_Error), - Translate.translate(CS_MatchAlreadyConceededOrRefused), - JOptionPane.ERROR_MESSAGE); - } else { - Object[] options = new Object[3]; - options[0] = m.getCompetitor1(); - options[1] = m.getCompetitor2(); - options[2] = Translate.translate(CS_Cancel); - - Object option = JOptionPane.showInputDialog(null, - Translate.translate(CS_RefuseAMatch), - Translate.translate(CS_WhoRefuseMatch), - JOptionPane.QUESTION_MESSAGE, null, options, options[2]); - - if (option.equals(m.getCompetitor1())) { - m.setRefusedBy1(true); - m.setRefusedBy2(false); - } - if (option.equals(m.getCompetitor2())) { - m.setRefusedBy2(true); - m.setRefusedBy1(false); - } - update(); - jpnr.update(); - } - - } - } catch (HeadlessException e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiRefuseMatchActionPerformed - - private void jmiCancelMatchRefuseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiCancelMatchRefuseActionPerformed - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - int nbMatch = jpnr.getMatchTableSelectedRow(); - CoachMatch m = jpnr.getRound().getCoachMatchs().get(nbMatch); - m.setRefusedBy1(false); - m.setRefusedBy2(false); - } - } catch (Exception e) { - LOG.log(Level.INFO, e.getLocalizedMessage()); - } - }//GEN-LAST:event_jmiCancelMatchRefuseActionPerformed - - private void jcxUseColorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxUseColorActionPerformed - - Tournament.getTournament().getParams().setUseColor(jcxUseColor.isSelected()); - if (jpnContent instanceof JPNRound) { - ((JPNRound) jpnContent).update(); - } - - }//GEN-LAST:event_jcxUseColorActionPerformed - - private void jcxUseImageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxUseImageActionPerformed - - Tournament.getTournament().getParams().setUseImage(jcxUseImage.isSelected()); - if (jpnContent instanceof JPNRound) { - ((JPNRound) jpnContent).update(); - } - if (jpnContent instanceof JPNParameters) { - ((JPNParameters) jpnContent).update(); - } - - }//GEN-LAST:event_jcxUseImageActionPerformed - - private void jmiFullScreenMatchsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenMatchsActionPerformed - JFullScreenMatchs fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenMatchs(jpnr.getRound()); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - - }//GEN-LAST:event_jmiFullScreenMatchsActionPerformed - - private void jmiFullScreenRankGeneralActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankGeneralActionPerformed - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound())); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - }//GEN-LAST:event_jmiFullScreenRankGeneralActionPerformed - - private void jmiFullScreenRankTeamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankTeamActionPerformed - JFullScreenTeamRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenTeamRank(Tournament.getTournament().getRoundIndex(jpnr.getRound())); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - }//GEN-LAST:event_jmiFullScreenRankTeamActionPerformed - - private void jmiFullScreenRankClanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankClanActionPerformed - JFullScreenClanRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanRank(Tournament.getTournament().getRoundIndex(jpnr.getRound())); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankClanActionPerformed - - private void jmiFullScreenRankAnnexIndivActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexIndivActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexIndivActionPerformed - - private void jmiFullScreenRankAnnexIndiv1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexIndiv1ActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexIndiv1ActionPerformed - - private void jmiFullScreenRankAnnexTeamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexTeamActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexTeamActionPerformed - - private void jmiFullScreenRankAnnexTeam1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexTeam1ActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexTeam1ActionPerformed - - private void jmiFullScreenRankAnnexClanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexClanActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, false); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexClanActionPerformed - - private void jmiFullScreenRankAnnexClan1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexClan1ActionPerformed - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, false); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexClan1ActionPerformed - - private TMultiServer server = null; - private WebServer web = null; - - private void jcxmiAsServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxmiAsServerActionPerformed - if (jcxmiAsServer.isSelected()) { - if (server == null) { - server = new TMultiServer(); - server.start(); - } else { - synchronized (this) { - server.stopServer(); - try { - server.wait(); - - } catch (InterruptedException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - server.start(); - } - - if (web == null) { - try { - try { - web = new WebServer(); - - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - JOptionPane.showMessageDialog(this, ex.getMessage()); - } - web.start(); - - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - JOptionPane.showMessageDialog(this, ex.getMessage()); - } - } else { - synchronized (this) { - web.stop(); - try { - web.wait(); - - } catch (InterruptedException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - try { - web.start(); - } catch (IOException ex) { - //Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - } else { - synchronized (this) { - server.stopServer(); - try { - server.wait(); - } catch (InterruptedException | IllegalMonitorStateException ex) { - //Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - server = null; - - synchronized (this) { - web.stop(); - try { - web.wait(); - } catch (InterruptedException | IllegalMonitorStateException ex) { - //Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - web = null; - - } - }//GEN-LAST:event_jcxmiAsServerActionPerformed - - private void jmiFullScreenMatchsClashActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenMatchsClashActionPerformed - JFullScreenMatchs fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenMatchs(jpnr.getRound(), true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenMatchsClashActionPerformed - - private void jmiFullScreenRankGroupsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankGroupsActionPerformed - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), JFullScreenIndivRank.C_GROUP); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankGroupsActionPerformed - - private void jmiFullScreenRankAnnexGroupsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexGroupsActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, C_GROUP); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexGroupsActionPerformed - - private void jmiFullScreenRankAnnexGroups1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexGroups1ActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, C_GROUP); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexGroups1ActionPerformed - - private void jmiFullScreenRankCategoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankCategoryActionPerformed - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), JFullScreenIndivRank.C_CATEGORY); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankCategoryActionPerformed - - private void jmiFullScreenRankAnnexCategoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexCategoryActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, JFullScreenIndivRank.C_CATEGORY); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexCategoryActionPerformed - - private void jmiFullScreenRankAnnexCategory1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexCategory1ActionPerformed - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, JFullScreenIndivRank.C_CATEGORY); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - }//GEN-LAST:event_jmiFullScreenRankAnnexCategory1ActionPerformed - - private void jmiFullScreenPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenPoolActionPerformed - - if (Tournament.getTournament().getPoolCount() > 0) { - if (Tournament.getTournament().getParams().isTeamTournament()) { - JFullScreenTeamRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenTeamRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), - true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } else { - JFullScreenIndivRank fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivRank(Tournament.getTournament().getRoundIndex(jpnr.getRound()), - C_POOL); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - } - - }//GEN-LAST:event_jmiFullScreenPoolActionPerformed - - private void jmiFullScreenRankAnnexPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexPoolActionPerformed - - if (Tournament.getTournament().getPoolCount() > 0) { - if (Tournament.getTournament().getParams().isTeamTournament()) { - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, - true, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } else { - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), true, - C_POOL); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - } - - }//GEN-LAST:event_jmiFullScreenRankAnnexPoolActionPerformed - - private void jmiFullScreenRankAnnexPool1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiFullScreenRankAnnexPool1ActionPerformed - - if (Tournament.getTournament().getPoolCount() > 0) { - if (Tournament.getTournament().getParams().isTeamTournament()) { - JFullScreenClanTeamAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenClanTeamAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, - true, true); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } else { - JFullScreenIndivAnnex fs; - try { - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - fs = new JFullScreenIndivAnnex(Tournament.getTournament().getRoundIndex(jpnr.getRound()), false, - C_POOL); - fs.setVisible(true); - - } - } catch (IOException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - } - } - - }//GEN-LAST:event_jmiFullScreenRankAnnexPool1ActionPerformed - - private void jmiEditCoefActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditCoefActionPerformed - - if (jpnContent instanceof JPNRound) { - JPNRound jpnr = ((JPNRound) jpnContent); - - editRoundCoef(jpnr.getRound()); - } - - }//GEN-LAST:event_jmiEditCoefActionPerformed - - private void jckmiHideNonNafActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jckmiHideNonNafActionPerformed - if (jpnContent instanceof JPNRound) { - - JPNRound jpnr = (JPNRound) jpnContent; - jpnr.setNafOnly(jckmiHideNonNaf.isSelected()); - jpnr.update(); - } - }//GEN-LAST:event_jckmiHideNonNafActionPerformed - - public static String CS_EditWebPort = "EditWebPort"; - - private void jmiEditWebPortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditWebPortActionPerformed - - int port = Tournament.getTournament().getParams().getWebServerPort(); - - Object obj = JOptionPane.showInputDialog(this, Translate.translate(CS_EditWebPort), port); - - if (obj instanceof String) { - Tournament.getTournament().getParams().setWebServerPort(Integer.parseInt((String) obj)); - } - - if (obj instanceof Integer) { - Tournament.getTournament().getParams().setWebServerPort((Integer) obj); - } - - }//GEN-LAST:event_jmiEditWebPortActionPerformed - - private void jcxmiRemoteEditActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxmiRemoteEditActionPerformed - - Tournament.getTournament().getParams().setWebEdit(jcxmiRemoteEdit.isSelected()); - - }//GEN-LAST:event_jcxmiRemoteEditActionPerformed - - private static final String COLOR_1 = "Couleur 1"; - private static final String COLOR_2 = "Couleur 2"; - private static final String COLOR_WRITING = "Couleur Ecriture"; - private static final String COLOR_BORDER = "Couleur Bordure"; - - private void jmiEditColorsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiEditColorsActionPerformed - - ColorChooser jccColor1 = new ColorChooser(); - jccColor1.setColor(Tournament.getTournament().getParams().getColor1()); - ColorChooser jccColor2 = new ColorChooser(); - jccColor2.setColor(Tournament.getTournament().getParams().getColor2()); - ColorChooser jccBorderColor = new ColorChooser(); - jccBorderColor.setColor(Tournament.getTournament().getParams().getBorderColor()); - ColorChooser jccForeColor = new ColorChooser(); - jccForeColor.setColor(Tournament.getTournament().getParams().getForeColor()); - - JLabel jlbColor1 = new JLabel(Translate.translate(COLOR_1)); - JLabel jlbColor2 = new JLabel(Translate.translate(COLOR_2)); - JLabel jlbForeColor = new JLabel(Translate.translate(COLOR_WRITING)); - JLabel jlbBorderColor = new JLabel(Translate.translate(COLOR_BORDER)); - - JPanel jpn = new JPanel(new GridLayout(4, 2)); - - jpn.add(jlbColor1); - jpn.add(jccColor1); - jpn.add(jlbColor2); - jpn.add(jccColor2); - jpn.add(jlbBorderColor); - jpn.add(jccBorderColor); - jpn.add(jlbForeColor); - jpn.add(jccForeColor); - - JOptionPane.showConfirmDialog(this, jpn, "Couleurs", JOptionPane.OK_OPTION); - - Tournament.getTournament().getParams().setColor1(jccColor1.getColor()); - Tournament.getTournament().getParams().setColor2(jccColor2.getColor()); - Tournament.getTournament().getParams().setBorderColor(jccBorderColor.getColor()); - Tournament.getTournament().getParams().setForeColor(jccForeColor.getColor()); - - - }//GEN-LAST:event_jmiEditColorsActionPerformed - - private void jmiPrintLabelsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiPrintLabelsActionPerformed - // Set Choice - ArrayList choices = new ArrayList<>(); - // Individual/Team - // With Name/Without Names - - if (Tournament.getTournament().getParams().isTeamTournament() - && (Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING)) { - choices.add("Individuelles pré-remplies"); - choices.add("Individuelles vides"); - choices.add("Par équipe pré-remplies"); - choices.add("Par équipe vides"); - } else { - choices.add("pré-remplies"); - choices.add("vides"); - } - - Object obj = JOptionPane.showOptionDialog(this, "Quel type d'étiquettes voulez vous ?", "Etiquettes", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, choices.toArray(), null); - if (obj != null) { - JdgPrintLabel jdg = null; - if ((jpnContent != null) && (obj instanceof Integer)) { - if (jpnContent instanceof JPNRound) { - int choice = (int) obj; - Round round = ((JPNRound) jpnContent).getRound(); - if (choice == 0) { - jdg = new JdgPrintLabel(this, true, round, true, false); - } - if (choice == 1) { - jdg = new JdgPrintLabel(this, true, round, false, false); - } - if (choice == 2) { - jdg = new JdgPrintLabel(this, true, round, true, true); - } - if (choice == 3) { - jdg = new JdgPrintLabel(this, true, round, false, true); - } - } - } - // Display PDF template with print button - if (jdg != null) { - jdg.setVisible(true); - } - } - - - }//GEN-LAST:event_jmiPrintLabelsActionPerformed - - private void jmiIndivReportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiIndivReportActionPerformed - JPNRound jpnr = ((JPNRound) jpnContent); - JdgReport report = new JdgReport(this, true, Tournament.getTournament().getRoundIndex(jpnr.getRound()), - this.mTournament, JdgReport.C_INDIVIDUAL); - report.setVisible(true); - }//GEN-LAST:event_jmiIndivReportActionPerformed - - private void jmiClanReportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiClanReportActionPerformed - JPNRound jpnr = ((JPNRound) jpnContent); - JdgReport report = new JdgReport(this, true, Tournament.getTournament().getRoundIndex(jpnr.getRound()), - this.mTournament, JdgReport.C_CLAN); - report.setVisible(true); - }//GEN-LAST:event_jmiClanReportActionPerformed - - private void jmiTeamReportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiTeamReportActionPerformed - JPNRound jpnr = ((JPNRound) jpnContent); - JdgReport report = new JdgReport(this, true, Tournament.getTournament().getRoundIndex(jpnr.getRound()), - this.mTournament, JdgReport.C_TEAM); - report.setVisible(true); - }//GEN-LAST:event_jmiTeamReportActionPerformed - - private void jmiExportWebServerAsZIPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportWebServerAsZIPActionPerformed - - JFileChooser jfc = new JFileChooser(); - final FileFilter filter1 = new ExtensionFileFilter( - "Zip", - new String[]{"ZIP", - "zip"}); - jfc.setFileFilter(filter1); - int result = jfc.showSaveDialog(this); - if (result == JFileChooser.APPROVE_OPTION) { - - File zipFile = jfc.getSelectedFile(); - - // First this function will generate in a temporary directory - // all the possible web pages - ArrayList files = WebServer.getWebSiteFiles(); - - if (files.size() > 0) { - FileOutputStream fout = null; - try { - // Then it will zip this directory and export it - fout = new FileOutputStream(zipFile); - ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(fout)); - - for (int i = 0; i < files.size(); i++) { - File f = files.get(i); - byte[] b = new byte[(int) f.length()]; - FileInputStream fin = new FileInputStream(f); - zout.putNextEntry(new ZipEntry(f.getName())); - int length; - while ((length = fin.read(b)) > 0) { - zout.write(b, 0, length); - } - zout.closeEntry(); - fin.close(); - } - zout.close(); - - } catch (IOException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } finally { - try { - fout.close(); - } catch (IOException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - WebServer.cleanFiles(files); - } - }//GEN-LAST:event_jmiExportWebServerAsZIPActionPerformed - - private void jmiExportWebServerToSiteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExportWebServerToSiteActionPerformed - // First this function will generate in a temporary directory - // all the possible web pages - FTPClient client = new FTPClient(); - try { - client.connect("ftp.ainpacte.org"); - System.out.println("Connected to " + server + "."); - System.out.println(client.getReplyString()); - System.out.println(client.getReplyCode()); - client.login("ainpacte", "Lancie69"); - } catch (IOException ex) { - System.out.println(ex.getLocalizedMessage()); - ex.printStackTrace(); - } - - // Then it will connect to remote site (FTP or SFTP) - // and copy the files. - }//GEN-LAST:event_jmiExportWebServerToSiteActionPerformed - - private void jmiMassAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiMassAddActionPerformed - JdgMassAdd jdg = new JdgMassAdd(this, true); - jdg.setVisible(true); - }//GEN-LAST:event_jmiMassAddActionPerformed - - public boolean isRoundOnly() { - return jckmiRoundOnly.isSelected(); - } - - public boolean isNafOnly() { - return jckmiHideNonNaf.isSelected(); - } - - private NafTask task; - - private static final String CS_Download = "Download"; - - private static final String CS_NewGame = "NewGame"; - private static final String CS_Open = "Open"; - private static final String CS_UseRosterEditor = "UseRosterEditor"; - private static final String CS_ClientViewer = "ClientViewer"; - private static final String CS_NewGameOrOpen = "NewGameOrOpen"; - private static final String CS_EnterRemoteTourmaServer = "Enter remote server IP address"; - private static final String CS_Exiting = "Exiting"; - private static final String CS_ConnectionImpossibleTo = "Connection impossible to"; - private static final String CS_ChooseFullScreen = "ChooseFullScreen"; - /** - * @param args the command line arguments - */ - - private static final String CS_IndividualRanking = "Individual ranking"; - private static final String CS_IndividualAnnexRanking = "Individual Annex rankings"; - private static final String CS_TeamRanking = "Team ranking"; - private static final String CS_TeamAnnexRanking = "Team Annex Ranking"; - private static final String CS_ClanRanking = "Clan ranking"; - private static final String CS_ClanAnnexRanking = "Clan Annex Ranking"; - private static final String CS_MatchsClash = "Matchs Clash"; - private static final String CS_CategoryRanking = "Categories Ranking"; - private static final String CS_CategoryAnnexRanking = "Categories Annex Ranking"; - private static final String CS_GroupeRanking = "Group Ranking"; - private static final String CS_GroupeAnnexRanking = "Group Annex Ranking"; - private static final String CS_IndividualPoolRanking = "Individual Pool Ranking"; - private static final String CS_IndividualPoolAnnexRanking = "Individual Pool Annex Ranking"; - private static final String CS_TeamPoolRanking = "Team Pool Ranking"; - private static final String CS_TeamPoolAnnexRanking = "Team Pool Annex Ranking"; - private static final String CS_Matchs = "Matchs"; - - /** - * Display a (very) basic progress bar - * - * @param pct how much of the progress bar to display 0-100 - */ - public static void splashProgress(int pct) { - if (mySplash != null && mySplash.isVisible()) { - splashGraphics.setPaint(Color.LIGHT_GRAY); - splashGraphics.fill(splashProgressArea); - - // draw an outline - splashGraphics.setPaint(Color.BLUE); - splashGraphics.draw(splashProgressArea); - - // Calculate the width corresponding to the correct percentage - int x = (int) splashProgressArea.getMinX(); - int y = (int) splashProgressArea.getMinY(); - int wid = (int) splashProgressArea.getWidth(); - int hgt = (int) splashProgressArea.getHeight(); - - int doneWidth = Math.round(pct * wid / 100.f); - doneWidth = Math.max(0, Math.min(doneWidth, wid - 1)); // limit 0-width - - // fill the done part one pixel smaller than the outline - splashGraphics.setPaint(Color.CYAN); - splashGraphics.fillRect(x, y + 1, doneWidth, hgt - 1); - - x = (int) splashThanksTo.getMinX(); - y = (int) splashThanksTo.getMinY(); - wid = (int) splashThanksTo.getWidth(); - hgt = (int) splashThanksTo.getHeight(); - - doneWidth = Math.round(pct * wid / 100.f); - doneWidth = Math.max(0, Math.min(doneWidth, wid - 1)); // limit 0-width - - // fill the done part one pixel smaller than the outline - splashGraphics.setPaint(Color.WHITE); - splashGraphics.fillRect(x, y + 1, doneWidth, hgt - 1); - - // erase the last status text - splashGraphics.setPaint(Color.LIGHT_GRAY); - splashGraphics.fill(splashTextArea); - - // draw the text - splashGraphics.setPaint(Color.BLACK); - splashGraphics.drawString(Translate.translate("GREETINGS0"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15)); - splashGraphics.drawString(Translate.translate("GREETINGS1"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight())); - splashGraphics.drawString(Translate.translate("GREETINGS2"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 2)); - splashGraphics.drawString(Translate.translate("GREETINGS3"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 3)); - splashGraphics.drawString(Translate.translate("GREETINGS4"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 4)); - splashGraphics.drawString(Translate.translate("GREETINGS5"), (int) (splashThanksTo.getX() + 10), (int) (splashThanksTo.getY() + 15 + splashGraphics.getFontMetrics().getHeight() * 5)); - - // make sure it's displayed - mySplash.update(); - } - } - - /** - * just a stub to simulate a long initialization task that updates the text - * and progress parts of the status in the Splash - */ - private static void appInit() { - - - - splashText("List NAF id Database"); - // Get Number of naf_id text - ArrayList naf_list=NAF.getFileList(); - int nb_steps=naf_list.size()+6; - int pct=100/nb_steps; - splashProgress(1*pct); - - try { - splashText("Initization of RMi Registry"); - splashProgress(2*pct); - - RMITournament tour = RMITournament.getInstance(); - ITournament stub = (ITournament) UnicastRemoteObject.exportObject(tour, 0); - - splashText("Binding Tournament"); - splashProgress(3*pct); - Registry registry = LocateRegistry.createRegistry(1099);// getRegistry(); - registry.bind("TourMa", stub); - - } catch (RemoteException | AlreadyBoundException e) { - System.out.println(e.getLocalizedMessage()); - } - - splashText("Loading NAF coach XML base"); - for (int i=0; i StartOptions = new ArrayList<>(); - StartOptions.add( - Translate.translate(CS_NewGame)); - StartOptions.add( - Translate.translate(CS_Open)); - StartOptions.add( - Translate.translate(CS_UseRosterEditor)); - StartOptions.add(Translate.translate(CS_ClientViewer)); - final int res = JOptionPane.showOptionDialog(null, - Translate.translate(CS_NewGameOrOpen), - StringConstants.CS_NULL, - JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, StartOptions.toArray(), - Translate.translate(CS_Open)); - - if ((res == 0) || (res == 1)) { - MainFrame window = MainFrame.getMainFrame(res); - window.setVisible(true); - } - - if (res == 2) { - teamma.views.JdgRoster jdg = new JdgRoster(null, true); - jdg.setVisible(true); - System.exit(0); - } - - if (res == 3) { - - String address = (String) JOptionPane.showInputDialog(null, - Translate.translate(CS_EnterRemoteTourmaServer), "127.0.0.1"); - - try { - UnicastRemoteObject.unexportObject(RMITournament.getInstance(), true); - } catch (NoSuchObjectException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - - RMIThread rmi = new RMIThread(address); - Thread thread = new Thread(rmi); - thread.start(); - - Tournament.getTournament().setIsClient(true); - - MainFrame window = MainFrame.getMainFrame(res); - window.setVisible(true); - - - /*try { - - Socket socket = null; - try { - socket = new Socket(address, 2017); - } catch (ConnectException e) { - JOptionPane.showMessageDialog(null, Translate.translate(CS_ConnectionImpossibleTo) - + " " + address + ". " - + Translate.translate(CS_Exiting)); - System.exit(1); - } - - ArrayList labels = new ArrayList<>(); - - // Index 0: Individual Ranking - labels.add(Translate.translate(CS_IndividualRanking)); - // Index 1: Individual Annex ranks - labels.add(Translate.translate(CS_IndividualAnnexRanking)); - // Index 2: Team Ranking - labels.add(Translate.translate(CS_TeamRanking)); - // Index 3: Team Annex - labels.add(Translate.translate(CS_TeamAnnexRanking)); - // Index 4: Clan Ranking - labels.add(Translate.translate(CS_ClanRanking)); - // Index 5: Clan Annex - labels.add(Translate.translate(CS_ClanAnnexRanking)); - // Index 6:Matchs - labels.add(Translate.translate(CS_Matchs)); - // Index 7: Clash Match - labels.add(Translate.translate(CS_MatchsClash)); - // Index 8: Categories - labels.add(Translate.translate(CS_CategoryRanking)); - // Index 9: Categories - labels.add(Translate.translate(CS_CategoryAnnexRanking)); - // Index 10: Group - labels.add(Translate.translate(CS_GroupeRanking)); - // Index 11: Categories - labels.add(Translate.translate(CS_GroupeAnnexRanking)); - // Index 12: Indiv Pool - labels.add(Translate.translate(CS_IndividualPoolRanking)); - // Index 13: Indiv Pool Annex - labels.add(Translate.translate(CS_IndividualPoolAnnexRanking)); - // Index 14: Team Pool - labels.add(Translate.translate(CS_TeamPoolRanking)); - // Index 15: Categories - labels.add(Translate.translate(CS_TeamPoolAnnexRanking)); - - final JPanel jpn = new JPanel(new BorderLayout()); - final JComboBox jcb = new JComboBox(labels.toArray()); - jpn.add(jcb, BorderLayout.CENTER); - final JLabel jlb = new JLabel( - Translate.translate(CS_ChooseFullScreen) - ); - jpn.add(jlb, BorderLayout.NORTH); - - JOptionPane.showMessageDialog(null, jpn, - Translate.translate(CS_Generation), - JOptionPane.QUESTION_MESSAGE); - - final int index = jcb.getSelectedIndex(); - - switch (index) { - case 0: - JFullScreenIndivRank indiv = new JFullScreenIndivRank(socket); - indiv.setVisible(true); - break; - case 1: - JFullScreenIndivAnnex indivAnnex = new JFullScreenIndivAnnex(socket); - indivAnnex.setVisible(true); - break; - case 2: - JFullScreenTeamRank team = new JFullScreenTeamRank(socket); - team.setVisible(true); - break; - case 3: - JFullScreenClanTeamAnnex teamAnnex = new JFullScreenClanTeamAnnex(socket, true); - teamAnnex.setVisible(true); - break; - case 4: - JFullScreenClanRank clan = new JFullScreenClanRank(socket); - clan.setVisible(true); - break; - case 5: - JFullScreenClanTeamAnnex clanAnnex = new JFullScreenClanTeamAnnex(socket, false); - clanAnnex.setVisible(true); - break; - case 6: - JFullScreenMatchs matchs = new JFullScreenMatchs(socket); - matchs.setVisible(true); - break; - case 7: - JFullScreenMatchs matchsC = new JFullScreenMatchs(socket, true); - matchsC.setVisible(true); - break; - case 8: - JFullScreenIndivRank category = new JFullScreenIndivRank(socket, JFullScreenIndivRank.C_CATEGORY); - category.setVisible(true); - break; - case 9: - JFullScreenIndivAnnex categoryAnnex = new JFullScreenIndivAnnex(socket, JFullScreenIndivRank.C_CATEGORY); - categoryAnnex.setVisible(true); - break; - case 10: - JFullScreenIndivRank group = new JFullScreenIndivRank(socket, JFullScreenIndivRank.C_GROUP); - group.setVisible(true); - break; - case 11: - JFullScreenIndivAnnex groupAnnex = new JFullScreenIndivAnnex(socket, JFullScreenIndivRank.C_GROUP); - groupAnnex.setVisible(true); - break; - case 12: - JFullScreenIndivRank indivPool = new JFullScreenIndivRank(socket, JFullScreenIndivRank.C_POOL); - indivPool.setVisible(true); - break; - case 13: - JFullScreenIndivAnnex indivPoolAnnex = new JFullScreenIndivAnnex(socket, JFullScreenIndivRank.C_POOL); - indivPoolAnnex.setVisible(true); - break; - case 14: - JFullScreenTeamRank teamPool = new JFullScreenTeamRank(socket, true); - teamPool.setVisible(true); - break; - case 15: - JFullScreenClanTeamAnnex teamPoolAnnex = new JFullScreenClanTeamAnnex(socket, false, true); - teamPoolAnnex.setVisible(true); - break; - - } - } catch (IOException e) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, e); - }*/ - } - } - } - ); - - } catch (InterruptedException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - - } catch (InvocationTargetException ex) { - Logger.getLogger(MainFrame.class - .getName()).log(Level.SEVERE, null, ex); - } - - } - - private static MainFrame mSingleton; - - /** - * - * @return - */ - public static MainFrame getMainFrame() { - if (mSingleton == null) { - mSingleton = new MainFrame(0); - } - - return mSingleton; - } - - /** - * - * @param res - * @return - */ - public static MainFrame getMainFrame(int res) { - if (mSingleton == null) { - mSingleton = new MainFrame(res); - } - - return mSingleton; - } - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JMenu jMenu1; - private javax.swing.JMenu jMenu2; - private javax.swing.JMenuBar jMenuBar1; - private javax.swing.JScrollPane jScrollPane1; - private javax.swing.JSeparator jSeparator1; - private javax.swing.JPopupMenu.Separator jSeparator10; - private javax.swing.JPopupMenu.Separator jSeparator11; - private javax.swing.JPopupMenu.Separator jSeparator12; - private javax.swing.JPopupMenu.Separator jSeparator13; - private javax.swing.JPopupMenu.Separator jSeparator14; - private javax.swing.JPopupMenu.Separator jSeparator15; - private javax.swing.JPopupMenu.Separator jSeparator16; - private javax.swing.JPopupMenu.Separator jSeparator17; - private javax.swing.JPopupMenu.Separator jSeparator18; - private javax.swing.JPopupMenu.Separator jSeparator19; - private javax.swing.JSeparator jSeparator2; - private javax.swing.JPopupMenu.Separator jSeparator20; - private javax.swing.JSeparator jSeparator3; - private javax.swing.JPopupMenu.Separator jSeparator4; - private javax.swing.JPopupMenu.Separator jSeparator5; - private javax.swing.JPopupMenu.Separator jSeparator6; - private javax.swing.JPopupMenu.Separator jSeparator7; - private javax.swing.JPopupMenu.Separator jSeparator8; - private javax.swing.JPopupMenu.Separator jSeparator9; - private javax.swing.JCheckBoxMenuItem jckmiHideNonNaf; - private javax.swing.JCheckBoxMenuItem jckmiRoundOnly; - private javax.swing.JCheckBoxMenuItem jcxAllowSpecialSkill; - private javax.swing.JCheckBoxMenuItem jcxPatchPortugal; - private javax.swing.JCheckBoxMenuItem jcxUseColor; - private javax.swing.JCheckBoxMenuItem jcxUseImage; - public javax.swing.JCheckBoxMenuItem jcxmiAsServer; - private javax.swing.JCheckBoxMenuItem jcxmiRemoteEdit; - private javax.swing.JMenuItem jmiAbout; - private javax.swing.JMenuItem jmiAddFreeMatch; - private javax.swing.JMenuItem jmiAideEnLigne; - private javax.swing.JMenuItem jmiCancelConceedMatch; - private javax.swing.JMenuItem jmiCancelMatchRefuse; - private javax.swing.JMenuItem jmiChangePairing; - private javax.swing.JMenuItem jmiCharger; - private javax.swing.JMenuItem jmiClanReport; - private javax.swing.JMenuItem jmiConceedMatch; - private javax.swing.JMenuItem jmiDelFreeMatch; - private javax.swing.JMenuItem jmiDelRound; - private javax.swing.JMenuItem jmiEditCoef; - private javax.swing.JMenuItem jmiEditColors; - private javax.swing.JMenuItem jmiEditDescription; - private javax.swing.JMenuItem jmiEditTeam; - private javax.swing.JMenuItem jmiEditWebPort; - private javax.swing.JMenuItem jmiExit; - private javax.swing.JMenuItem jmiExport; - private javax.swing.JMenuItem jmiExportFbb; - private javax.swing.JMenuItem jmiExportFbb1; - private javax.swing.JMenuItem jmiExportWebServerAsZIP; - private javax.swing.JMenuItem jmiExportWebServerToSite; - private javax.swing.JMenuItem jmiFullScreenMatchs; - private javax.swing.JMenuItem jmiFullScreenMatchsClash; - private javax.swing.JMenuItem jmiFullScreenPool; - private javax.swing.JMenuItem jmiFullScreenRankAnnexCategory; - private javax.swing.JMenuItem jmiFullScreenRankAnnexCategory1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexClan; - private javax.swing.JMenuItem jmiFullScreenRankAnnexClan1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexGroups; - private javax.swing.JMenuItem jmiFullScreenRankAnnexGroups1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexIndiv; - private javax.swing.JMenuItem jmiFullScreenRankAnnexIndiv1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexPool; - private javax.swing.JMenuItem jmiFullScreenRankAnnexPool1; - private javax.swing.JMenuItem jmiFullScreenRankAnnexTeam; - private javax.swing.JMenuItem jmiFullScreenRankAnnexTeam1; - private javax.swing.JMenuItem jmiFullScreenRankCategory; - private javax.swing.JMenuItem jmiFullScreenRankClan; - private javax.swing.JMenuItem jmiFullScreenRankGeneral; - private javax.swing.JMenuItem jmiFullScreenRankGroups; - private javax.swing.JMenuItem jmiFullScreenRankTeam; - private javax.swing.JMenuItem jmiGenerateFirstRound; - private javax.swing.JMenuItem jmiGenerateNextRound; - private javax.swing.JMenuItem jmiIndivReport; - private javax.swing.JMenuItem jmiMassAdd; - private javax.swing.JMenuItem jmiNafLoad; - private javax.swing.JMenuItem jmiNouveau; - private javax.swing.JMenuItem jmiPrintLabels; - private javax.swing.JMenuItem jmiRefuseMatch; - private javax.swing.JMenuItem jmiRevisions; - private javax.swing.JMenuItem jmiSave; - private javax.swing.JMenuItem jmiSaveAs; - private javax.swing.JMenuItem jmiSubstitutePlayer; - private javax.swing.JMenuItem jmiTeamReport; - private javax.swing.JMenu jmnFile; - private javax.swing.JMenu jmnHelp; - private javax.swing.JMenu jmnParameters; - private javax.swing.JMenu jmnRound; - private javax.swing.JMenu jmnTools; - private javax.swing.JPanel jpnContent; - private javax.swing.JSplitPane jspSplit; - private javax.swing.JTree jtrPanels; - // End of variables declaration//GEN-END:variables - - private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { - throw new java.io.NotSerializableException(getClass().getName()); - } - - private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { - throw new java.io.NotSerializableException(getClass().getName()); - } - private static final Logger LOG = Logger.getLogger(MainFrame.class - .getName()); - - public void propertyChange(PropertyChangeEvent evt) { - if ("progress" == evt.getPropertyName()) { - int progress = (Integer) evt.getNewValue(); - progressMonitor.setProgress(progress); - String message = String.format("%d%%.\n", progress); - progressMonitor.setNote(message); - //taskOutput.append(message); - if (progressMonitor.isCanceled() || task.isDone()) { - Toolkit.getDefaultToolkit().beep(); - if (progressMonitor.isCanceled()) { - task.cancel(true); - //taskOutput.append("Task canceled.\n"); - } else { - //taskOutput.append("Task completed.\n"); - } - } - } - } -} ->>>>>>> Feature/134_multi_LRB diff --git a/src/tourma/data/Category.java b/src/tourma/data/Category.java index 310f30d4..13c1660b 100644 --- a/src/tourma/data/Category.java +++ b/src/tourma/data/Category.java @@ -22,10 +22,18 @@ public class Category implements Comparable, IXMLExport, Serializable { protected static AtomicInteger sGenUID=new AtomicInteger(0); protected int UID=sGenUID.incrementAndGet(); + /** + * Unique ID getter + * @return UID + */ public int getUID() { return UID; } + /** + * Unique ID Setter + * @param UID Unique ID + */ public void setUID(int UID) { this.UID = UID; } @@ -33,12 +41,15 @@ public void setUID(int UID) { /** - * + * Category map indexed by category name */ private static HashMap sCategoryMap = new HashMap<>(); - private static final Logger LOG = Logger.getLogger(Category.class.getName()); + /** + * Category Puller + * @param cat Category to pull + */ public void pull(Category cat) { this.UID=cat.UID; @@ -46,18 +57,19 @@ public void pull(Category cat) } /** - * @param s - * @param c + * Category Map Putter + * @param s Key of the map + * @param c Catgory toput */ - /*public static HashMap getsCategoryMap() { - return sCategoryMap; - }*/ - public static void putCategory(String s, Category c) { sCategoryMap.put(s, c); } + /** + * Remove catgory from map + * @param s Key + */ public static void delCategory(String s) { sCategoryMap.remove(s); @@ -70,23 +82,18 @@ public static void newCategoryMap(){ sCategoryMap=new HashMap<>(); } /** - * - * @param s - * @return + * Get Category from Map + * @param s Key + * @return Category */ public static Category getCategory(String s) { return sCategoryMap.get(s); } + /** - * @param asCategoryMap the sCategoryMap to set - */ - /*public static void setsCategoryMap(HashMap asCategoryMap) { - sCategoryMap = asCategoryMap; - }*/ - /** - * Name of the clan + * Name of the category */ private String mName; @@ -113,8 +120,8 @@ public boolean equals(final Object obj) { } /** - * - * @return + * Hashcode of the instance + * @return hascode */ @Override public int hashCode() { @@ -134,10 +141,6 @@ public int compareTo(final Object obj) { return result; } - /** - * - * @return - */ @Override public Element getXMLElement() { final Element clan = new Element(StringConstants.CS_CATEGORY); @@ -146,7 +149,7 @@ public Element getXMLElement() { } /** - * + * Test if Category map is null * @return */ public static boolean isCategoryMapNull() @@ -154,15 +157,9 @@ public static boolean isCategoryMapNull() return sCategoryMap==null; } - - - /** - * - * @param e - */ @Override public void setXMLElement(final Element e) { - this.setmName(e.getAttributeValue(StringConstants.CS_NAME)); + this.setName(e.getAttributeValue(StringConstants.CS_NAME)); if (!isCategoryMapNull()) { putCategory(getName(), this); @@ -170,6 +167,7 @@ public void setXMLElement(final Element e) { } /** + * Category name Getter * @return the mName */ public String getName() { @@ -177,9 +175,10 @@ public String getName() { } /** + * Category name Setter * @param mName the mName to set */ - public void setmName(String mName) { + public void setName(String mName) { this.mName = mName; } diff --git a/src/tourma/data/Clan.java b/src/tourma/data/Clan.java index 67d332ab..6a93c325 100644 --- a/src/tourma/data/Clan.java +++ b/src/tourma/data/Clan.java @@ -31,29 +31,56 @@ public class Clan implements Comparable, IXMLExport, IWithNameAndPicture protected static AtomicInteger sGenUID = new AtomicInteger(0); protected int UID = sGenUID.incrementAndGet(); + /** + * Is the Clan updated ? + * @return The clan hase been updated + */ public boolean isUpdated() { return updated; } + /** + * Updated Setter + * @param updated + */ public void setUpdated(boolean updated) { this.updated = updated; } + /** + * updated status + */ protected boolean updated = false; + /** + * Unique ID Getter + * @return Unique ID + */ public int getUID() { return UID; } + /** + * Unique ID Setter + * @param UID Unique ID + */ public void setUID(int UID) { this.UID = UID; } + /** + * Clan Puller + * @param clan + */ public void pull(Clan clan) { this.UID = clan.UID; this.mName = clan.mName; this.picture = clan.picture; } + /** + * Clan Pusher + * @param clan + */ public void push(Clan clan) { if (clan.updated) { this.UID = clan.UID; @@ -63,36 +90,32 @@ public void push(Clan clan) { } /** - * + * Clan HashMap indexed by a String */ private static HashMap sClanMap = new HashMap<>(); - private static final Logger LOG = Logger.getLogger(Clan.class.getName()); - + /** - * - * @return - */ - /*public static HashMap getsClanMap() { - return sClanMap; - }*/ - /** - * - * @param key - * @return + * Clan getter + * @param key + * @return Clan from map */ public static Clan getClan(String key) { return sClanMap.get(key); } + /** + * Delete Clan from HashMap + * @param key + */ public static void delClan(String key) { sClanMap.remove(key); } /** - * - * @param key - * @param c + * Clan Putter + * @param key Key to index Clan + * @param c Clan */ public static void putClan(String key, Clan c) { sClanMap.put(key, c); @@ -111,7 +134,7 @@ public static void newClanMap() { private String mName; /** - * + * Icon of the Clan */ private ImageIcon picture; @@ -124,11 +147,7 @@ public Clan(final String name) { mName = name; } - /** - * - * @param obj - * @return - */ + @Override public boolean equals(final Object obj) { @@ -149,11 +168,7 @@ public int hashCode() { return hash; } - /** - * - * @param obj - * @return - */ + @Override public int compareTo(final Object obj) { int result = -1; @@ -164,10 +179,7 @@ public int compareTo(final Object obj) { return result; } - /** - * - * @return - */ + @Override public Element getXMLElement() { final Element clan = new Element(StringConstants.CS_CLAN); @@ -196,10 +208,7 @@ public Element getXMLElement() { return clan; } - /** - * - * @param e - */ + @Override public void setXMLElement(final Element e) { this.mName = e.getAttributeValue(StringConstants.CS_NAME); @@ -222,37 +231,30 @@ public void setXMLElement(final Element e) { } /** - * - * @return + * Logger */ + private static final Logger LOG = Logger.getLogger(Clan.class.getName()); + + @Override public String getName() { return mName; } - /** - * - * @return - */ + @Override public ImageIcon getPicture() { return picture; } - /** - * - * @param p - */ + @Override public void setPicture(ImageIcon p) { picture = p; updated=true; } - /** - * - * @param name - */ + @Override public void setName(String name) { mName = name; diff --git a/src/tourma/data/Coach.java b/src/tourma/data/Coach.java index c4679457..abe90aaf 100644 --- a/src/tourma/data/Coach.java +++ b/src/tourma/data/Coach.java @@ -41,32 +41,56 @@ public final class Coach extends Competitor implements IXMLExport, Serializable protected static AtomicInteger sGenUID = new AtomicInteger(0); protected int UID = sGenUID.incrementAndGet(); + /** + * Unique ID Getter + * + * @return Unique iD + */ public int getUID() { return UID; } + /** + * Unique ID Setter + * + * @param UID Unique ID + */ public void setUID(int UID) { this.UID = UID; } /** - * + * Null Coach */ private static Coach sNullCoach = null; + + /** + * Coach Message 1 Identifier + */ private static final String CS_MESSAGE1 = "CoachMessage1"; + /** + * Coach Message 2 Identifier + */ private static final String CS_MESSAGE2 = "CoachMessage2"; /** - * + * Coach Hashmap */ private static HashMap sCoachMap = new HashMap<>(); + /** + * Coach Lock + */ private final static Object myLock = new Object(); + /** + * Logger + */ private static final Logger LOG = Logger.getLogger(Coach.class.getName()); /** + * Coach Getter from hashmap * - * @param s - * @return + * @param s Key (name) + * @return Coach */ public static Coach getCoach(String s) { return sCoachMap.get(s); @@ -79,6 +103,11 @@ public static void newCoachMap() { sCoachMap = new HashMap<>(); } + /** + * Coach Puller + * + * @param c + */ public void pull(Coach c) { super.pull(c); this.UID = c.getUID(); @@ -113,6 +142,11 @@ public void pull(Coach c) { } + /** + * Coach Pusher + * + * @param c Coach + */ public void push(Coach c) { super.push(c); @@ -146,17 +180,19 @@ public void push(Coach c) { } /** + * Put Coach in the Map * - * @param s - * @param c + * @param s Key + * @param c Coach */ public static void putCoach(String s, Coach c) { sCoachMap.put(s, c); } /** + * Get Null Coach * - * @return + * @return Coach */ public static Coach getNullCoach() { synchronized (Coach.myLock) { @@ -164,60 +200,69 @@ public static Coach getNullCoach() { sNullCoach = new Coach(StringConstants.CS_NONE); sNullCoach.setTeamMates(Team.getNullTeam()); } - /*if ((Team.getNullTeam() != null) && ((sNullCoach.getTeam() == null))) { - sNullCoach.setTeamMates(Team.getNullTeam()); - }*/ } - return sNullCoach; } + + /** + * Pin Code + */ private int _PinCode = 0; /** - * + * Roster Team Name */ private String mTeam; /** - * + * Roster type */ private RosterType mRoster; /** - * + * Naf Number */ private int mNaf; /** - * + * Team Ranking */ private int mRank; /** - * + * Player is active or not */ private boolean mActive = true; /** - * + * Teammates */ private Team mTeamMates = null; /** - * + * List of roster manager by this coach */ private final ArrayList mCompositions; /** - * + * Naf default ranking */ private double mNafRank = 150.0; - private double mNafRankAvg=150.0; /** - * + * Naf average ranking + */ + private double mNafRankAvg = 150.0; + /** + * Handicap points */ private int mHandicap = 0; + /** + * Log Indiv Balanced empty + */ private final String LOG_INDIV_EMPTY = "Individual balanced empty, using only team balanced"; + /** + * Log Balanced empty + */ private final String LOG_BALANCED_EMPTY = "Balanced empty, using only possible"; /** @@ -232,6 +277,7 @@ public Coach() { } /** + * New Coach with name * * @param name */ @@ -245,6 +291,7 @@ public Coach(final String name) { } /** + * Get count of composition * * @return */ @@ -253,30 +300,33 @@ public int getCompositionCount() { } /** + * Get Composition by Index * - * @param i - * @return + * @param i Index + * @return Composition */ public teamma.data.Roster getComposition(int i) { return mCompositions.get(i); } /** + * Add a compostion * - * @param r + * @param r New composition */ public void addComposition(teamma.data.Roster r) { mCompositions.add(r); - updated=true; + updated = true; } /** + * Remove composition by Index * - * @param i + * @param i index */ public void removeComposition(int i) { mCompositions.remove(i); - updated=true; + updated = true; } @Override @@ -284,13 +334,10 @@ public int compareTo(final Object obj) { int result = -1; if (obj instanceof Coach) { - if (_naf_avg) - { + if (_naf_avg) { result = ((Double) getNafRankAvg()).compareTo(((Coach) obj).getNafRankAvg()); - } - else - { - result = ((Double) getNafRank()).compareTo(((Coach) obj).getNafRank()); + } else { + result = ((Double) getNafRank()).compareTo(((Coach) obj).getNafRank()); } if (result == 0) { try { @@ -303,10 +350,6 @@ public int compareTo(final Object obj) { return result; } - /** - * - * @return - */ @Override public Element getXMLElement() { @@ -317,7 +360,7 @@ public Element getXMLElement() { coach.setAttribute(StringConstants.CS_NAF, Integer.toString(this.getNaf())); coach.setAttribute(StringConstants.CS_RANK, Integer.toString(this.getRank())); coach.setAttribute(StringConstants.CS_CLAN, this.getClan().getName()); - + coach.setAttribute(StringConstants.CS_RANK_AVG, Double.toString(this.getNafRankAvg())); for (int i = 0; i < getCategoryCount(); i++) { @@ -365,16 +408,9 @@ public Element getXMLElement() { } /** + * Get Roster description * - * @return - */ - /* @Override - public String getName() { - return mName; - }*/ - /** - * - * @return + * @return Description */ public String getStringRoster() { if (this.getMatchCount() == 0) { @@ -416,10 +452,6 @@ public String getStringRoster() { return buf.toString(); } - /** - * - * @param coach - */ @Override public void setXMLElement(final Element coach) { try { @@ -475,7 +507,7 @@ public void setXMLElement(final Element coach) { } } catch (DataConversionException dce) { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), dce.getLocalizedMessage()); + // JOptionPane.showMessageDialog(MainFrame.getMainFrame(), dce.getLocalizedMessage()); } try { @@ -504,25 +536,21 @@ public void setXMLElement(final Element coach) { } - /** - * - * @param opponent - * @param r - */ @Override public void addMatch(Competitor opponent, Round r) { CoachMatch m = new CoachMatch(r); m.setCompetitor1(this); m.setCompetitor2(opponent); r.addMatch(m); - updated=true; + updated = true; } /** + * Create a Match for this coach * - * @param opponent - * @param r - * @return + * @param opponent Coach opponent + * @param r Round + * @return New Coach Match */ public CoachMatch createMatch(Competitor opponent, Round r) { CoachMatch m = new CoachMatch(r); @@ -531,11 +559,6 @@ public CoachMatch createMatch(Competitor opponent, Round r) { return m; } - /** - * - * @param opponent - * @return - */ @Override public boolean havePlayed(Competitor opponent) { boolean have_played = false; @@ -549,14 +572,6 @@ public boolean havePlayed(Competitor opponent) { return have_played; } - /* - * @Override*/ - /** - * - * @param opponents - * @param r - * @return - */ @Override public ArrayList getPossibleOpponents(ArrayList opponents, Round r) { @@ -567,10 +582,10 @@ public ArrayList getPossibleOpponents(ArrayList opponent if (this.getClan() != tour.getClan(0)) { - boolean avoidFirstMatch=params.isAvoidClansFirstMatch(); - int roundCount=tour.getRoundsCount(); - boolean avoidClansMatch=params.isAvoidClansMatch(); - boolean clansEnable=params.isEnableClans(); + boolean avoidFirstMatch = params.isAvoidClansFirstMatch(); + int roundCount = tour.getRoundsCount(); + boolean avoidClansMatch = params.isAvoidClansMatch(); + boolean clansEnable = params.isEnableClans(); if ((clansEnable) && ((avoidFirstMatch && (roundCount <= 0)) || (avoidClansMatch))) { int i = 0; @@ -669,10 +684,11 @@ public ArrayList getPossibleOpponents(ArrayList opponent } /** + * Get possible opponent's team * - * @param current - * @param currentOpponent - * @return + * @param current Current Round + * @param currentOpponent Current Opponent + * @return List of possible teams */ private ArrayList getPossibleTeams(Round current, Coach currentOpponent) { @@ -733,9 +749,10 @@ private ArrayList getPossibleTeams(Round current, Coach currentOpponent) { } /** + * Return the minimum value from the Hashmap * - * @param hash - * @return + * @param hash Hasmap + * @return hash */ private int getMinimumFromHash(HashMap hash) { Iterator> it2 = hash.entrySet().iterator(); @@ -750,12 +767,6 @@ private int getMinimumFromHash(HashMap hash) { return minimum2; } - /** - * - * @param teams - * @param r - * @return - */ @Override public HashMap getTeamOppositionCount(ArrayList teams, Round r) { @@ -834,10 +845,6 @@ public HashMap getTeamOppositionCount(ArrayList teams, Roun return map; } - /** - * - * @return - */ @Override public String getDecoratedName() { String tmp = getName(); @@ -858,21 +865,17 @@ public String getDecoratedName() { return tmp; } - /** - * - * @param c - * @param r - */ @Override public void addMatchRoundRobin(Competitor c, Round r, boolean complete) { addMatch(c, r); } /** + * test if the draw is balanced * - * @param opp - * @param round - * @return + * @param opp Opponent Coach + * @param round Round + * @return the draw is balanced */ public boolean isBalanced(Coach opp, Round round) { Tournament tour = Tournament.getTournament(); @@ -892,6 +895,11 @@ public boolean isBalanced(Coach opp, Round round) { return balanced; } + /** + * Print if balanced + * + * @param round Round concerned + */ public void printBalanced(Round round) { Tournament tour = Tournament.getTournament(); @@ -946,6 +954,13 @@ public void printBalanced(Round round) { } } + /** + * Test if the Draw is teambalanced + * + * @param opp Opponent's team + * @param round Current Round + * @return The draw is balanced + */ private boolean isBalanced(Team opp, Round round) { boolean balanced = true; ArrayList teams = new ArrayList<>(); @@ -999,12 +1014,12 @@ private boolean isBalanced(Team opp, Round round) { } /** + * Get the minimum Balanced team * - * @param round - * @return + * @param round Current Round + * @return teams */ - ArrayList getMinimumTeamsBalanced(Round round - ) { + ArrayList getMinimumTeamsBalanced(Round round) { ArrayList possible = new ArrayList<>(); @@ -1057,12 +1072,12 @@ ArrayList getMinimumTeamsBalanced(Round round } /** - * - * @param Opponent - * @param opponentOpponent - * @param currentOpp - * @param current - * @return + * Check if Then opponent can match + * @param Opponent Opponent + * @param opponentOpponent Last opponent opponent + * @param currentOpp Current opponent + * @param current Current Round + * @return if it can match */ private boolean canMatch(Coach Opponent, Coach opponentOpponent, Coach currentOpp, Round current) { boolean canMatch; @@ -1087,108 +1102,7 @@ private boolean canMatch(Coach Opponent, Coach opponentOpponent, Coach currentOp } } - // Same team - /*if ((tour.getParams().isTeamTournament()) && (tour.getParams().getTeamPairing() == ETeamPairing.INDIVIDUAL_PAIRING)) { - if (Opponent.getTeamMates() != Team.getNullTeam()) { - if (getTeamMates() == Opponent.getTeamMates()) { - canMatch = false; - } - } - if ((!opponentOpponent.getTeamMates().getName().equals(StringConstants.CS_NONE)) && (!currentOpp.getTeamMates().getName().equals(StringConstants.CS_NONE))) { - if (opponentOpponent.getTeamMates() == currentOpp.getTeamMates()) { - canMatch = false; - } - } - } - - // Balancing pairing - if ((tour.getParams().isTeamTournament()) && (tour.getParams().getTeamPairing() == ETeamPairing.INDIVIDUAL_PAIRING)) { - - ArrayList teams = new ArrayList<>(); - for (int i = 0; i < current.getMatchsCount(); i++) { - Match mMatch = current.getMatch(i); - CoachMatch m = (CoachMatch) mMatch; - Coach c1 = (Coach) m.getCompetitor1(); - Coach c2 = (Coach) m.getCompetitor2(); - if (c1.getTeamMates() != this.getTeamMates()) { - if (!teams.contains(c2.getTeamMates())) { - teams.add(c2.getTeamMates()); - } - } - if (c2.getTeamMates() != this.getTeamMates()) { - if (!teams.contains(c1.getTeamMates())) { - teams.add(c1.getTeamMates()); - } - } - } - teams.remove(getTeamMates()); - - // Team balancing - if (tour.getParams().isIndivPairingTeamBalanced()) { - HashMap hash = getTeamMates().getTeamOppositionCount(teams, current); - - Iterator it2 = hash.keySet().iterator(); - int minimum = 65535; - int maximum = 0; - while (it2.hasNext()) { - Competitor en2 = it2.next(); - if (en2 instanceof Team) { - Team t2 = (Team) en2; - int nb2 = hash.get(t2); - if (nb2 < minimum) { - minimum = nb2; - } - if (nb2 > maximum) { - maximum = nb2; - } - } - } - - // Check if team is perfectly balanced. If yes, the opponent can only - // be among teammates opponents - if (maximum - minimum == 0) { - if (!mTeamMates.containsCoach(opponentOpponent)) { - canMatch = false; - } - } - - if (!mTeamMates.containsCoach(opponentOpponent)) { - if (Opponent != null) { - if (Opponent.getTeamMates() != null) { - if (hash.get(Opponent.getTeamMates()) != null) { - int nb = hash.get(Opponent.getTeamMates()); - - if ((maximum == nb) && (maximum - minimum > 1)) { - canMatch = false; - } - } else { - System.err.println("Opponent balancing count is null"); - canMatch = false; - } - } else { - System.err.println("Opponent team is null"); - } - } else { - System.err.println("Opponent is null"); - } - } - - // Check if team is balanced, by One. If yes, the opponent can - // be among teammates opponents or among minimum times encountered teams - if (maximum - minimum == 1) { - if (!mTeamMates.containsCoach(opponentOpponent)) { - // search for minimum teams - if (hash.get(Opponent.getTeamMates()) > minimum) { - canMatch = false; - } - } - } - - if (maximum - minimum > 1) { - canMatch = false; - } - } - }*/ + return canMatch; } @@ -1327,37 +1241,28 @@ public void roundCheck(Round round) { round.addMatch(m); } - /*else { - System.out.println("Balanced"); - - for (int i = round.getMatchsCount() - 1; i >= 0; i--) { - Match current = round.getMatch(i); - Coach c1 = (Coach) current.getCompetitor1(); - Coach c2 = (Coach) current.getCompetitor2(); - - c1.printBalanced(round); - c2.printBalanced(round); - } - }*/ } } /** - * @return the mTeam + * Team Getter + * @return the Team */ public String getTeam() { return mTeam; } /** + * Team Setter * @param mTeam the mTeam to set */ public void setTeam(String mTeam) { this.mTeam = mTeam; - updated=true; + updated = true; } /** + * Roster Getter * @return the mRoster */ public RosterType getRoster() { @@ -1365,14 +1270,16 @@ public RosterType getRoster() { } /** + * Roster Setter * @param mRoster the mRoster to set */ public void setRoster(RosterType mRoster) { this.mRoster = mRoster; - updated=true; + updated = true; } /** + * Naf number Getter * @return the mNaf */ public int getNaf() { @@ -1380,14 +1287,16 @@ public int getNaf() { } /** + * Naf Number setter * @param mNaf the mNaf to set */ public void setNaf(int mNaf) { this.mNaf = mNaf; - updated=true; + updated = true; } /** + * Rank Getter * @return the mRank */ public int getRank() { @@ -1395,14 +1304,16 @@ public int getRank() { } /** + * Rank Setter * @param mRank the mRank to set */ public void setRank(int mRank) { this.mRank = mRank; - updated=true; + updated = true; } /** + * Is the coach active ? * @return the mActive */ public boolean isActive() { @@ -1410,6 +1321,7 @@ public boolean isActive() { } /** + * Active player Setter * @param mActive the mActive to set */ public void setActive(boolean mActive) { @@ -1417,6 +1329,7 @@ public void setActive(boolean mActive) { } /** + * Teammates Getter * @return the mTeamMates */ public Team getTeamMates() { @@ -1424,38 +1337,51 @@ public Team getTeamMates() { } /** + * Teammates Setter * @param mTeamMates the mTeamMates to set */ public void setTeamMates(Team mTeamMates) { this.mTeamMates = mTeamMates; - updated=true; + updated = true; } + /** + * Naf Ranking Getter * @return the mNafRank */ public double getNafRank() { return mNafRank; } - + + /** + * Average Naf ranking getter + * @return + */ public double getNafRankAvg() { return mNafRankAvg; } /** + * Naf ranking setter * @param mNafRank the mNafRank to set */ public void setNafRank(double mNafRank) { this.mNafRank = mNafRank; - updated=true; + updated = true; } - + + /** + * Naf ranking average Setter + * @param mNafRank + */ public void setNafAvg(double mNafRank) { this.mNafRankAvg = mNafRank; - updated=true; + updated = true; } /** + * Handicap Getter * @return the mHandicap */ public int getHandicap() { @@ -1463,39 +1389,47 @@ public int getHandicap() { } /** + * Handicap Setter * @param mHandicap the mHandicap to set */ public void setHandicap(int mHandicap) { this.mHandicap = mHandicap; } + /** + * Pin code Getter + * @return + */ public int getPinCode() { return _PinCode; } + /** + * Pin code Setter + * @param pin + */ public void setPinCode(int pin) { _PinCode = pin; - updated=true; + updated = true; } - - public String getMatchRoster(int i) - { - String res=mRoster.getName(); - if (i mValues; + protected final HashMap mComputedValues; /** * @@ -322,11 +368,13 @@ public HashMap getValues() { public CoachMatch(Round round) { super(round); mValues = new HashMap<>(); + mComputedValues = new HashMap<>(); - final int size = Tournament.getTournament().getParams().getCriteriaCount(); + int size = Tournament.getTournament().getParams().getCriteriaCount(); for (int i = 0; i < size; i++) { final Criteria crit = Tournament.getTournament().getParams().getCriteria(i); final Value val = new Value(crit); + if (i == 0) { val.setValue1(-1); val.setValue2(-1); @@ -337,6 +385,20 @@ public CoachMatch(Round round) { mValues.put(crit, val); } + size = Tournament.getTournament().getParams().getFormulaCount(); + for (int i = 0; i < size; i++) { + final Formula form = Tournament.getTournament().getParams().getFormula(i); + final Value val = new Value(form); + if (i == 0) { + val.setValue1(-1); + val.setValue2(-1); + } else { + val.setValue1(0); + val.setValue2(0); + } + mComputedValues.put(form, val); + } + setRound(round); } @@ -414,6 +476,16 @@ public Element getXMLElement() { match.addContent(value); } + for (int k = 0; k < Tournament.getTournament().getParams().getFormulaCount(); k++) { + final Value val = this.getValue(Tournament.getTournament().getParams().getFormula(k)); + final Element value = new Element(StringConstants.CS_VALUE); + value.setAttribute(StringConstants.CS_NAME, val.getFormula().getName()); + value.setAttribute(StringConstants.CS_VALUE + 1, Integer.toString(val.getValue1())); + value.setAttribute(StringConstants.CS_VALUE + 2, Integer.toString(val.getValue2())); + + match.addContent(value); + } + if (this.getRoster1() != null) { match.setAttribute(StringConstants.CS_ROSTER + 1, this.getRoster1().getName()); } @@ -489,16 +561,41 @@ public void setXMLElement(final Element match for (int cpt = 0; cpt < Tournament.getTournament().getParams().getCriteriaCount(); cpt++) { final Criteria criteria = Tournament.getTournament().getParams().getCriteria(cpt); final String tmp = val.getAttribute(StringConstants.CS_NAME).getValue(); + if (criteria != null) { + if (criteria.getName().equals(tmp)) { + crit = criteria; + break; + } + } + } + Value value = null; + if (crit != null) { + value = new Value(crit); + value.setValue1(val.getAttribute(StringConstants.CS_VALUE + 1).getIntValue()); + value.setValue2(val.getAttribute(StringConstants.CS_VALUE + 2).getIntValue()); + this.putValue(crit, value); + } else { + Formula form = null; - if (criteria.getName().equals(tmp)) { - crit = criteria; - break; + for (int cpt = 0; cpt < Tournament.getTournament().getParams().getFormulaCount(); cpt++) { + final Formula formula = Tournament.getTournament().getParams().getFormula(cpt); + final String tmp = val.getAttribute(StringConstants.CS_NAME).getValue(); + + if (formula != null) { + if (formula.getName().equals(tmp)) { + form = formula; + break; + } + } + } + + if (form != null) { + value = new Value(form); + value.setValue1(val.getAttribute(StringConstants.CS_VALUE + 1).getIntValue()); + value.setValue2(val.getAttribute(StringConstants.CS_VALUE + 2).getIntValue()); + this.putValue(form, value); } } - final Value value = new Value(crit); - value.setValue1(val.getAttribute(StringConstants.CS_VALUE + 1).getIntValue()); - value.setValue2(val.getAttribute(StringConstants.CS_VALUE + 2).getIntValue()); - this.putValue(crit, value); } Attribute att1 = match.getAttribute(StringConstants.CS_ROSTER + 1); @@ -526,7 +623,7 @@ public void setXMLElement(final Element match } } catch (DataConversionException dce) { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), dce.getLocalizedMessage()); + //JOptionPane.showMessageDialog(MainFrame.getMainFrame(), dce.getLocalizedMessage()); } this.recomputeValues(); } @@ -799,6 +896,7 @@ protected static int getGroupModifier(Coach c, CoachMatch m) { * @return */ public Value getValue(Criteria c) { + Value val = mValues.get(c); if (val != null) { return val; @@ -815,6 +913,37 @@ public Value getValue(Criteria c) { return null; } + /** + * + * @param c + * @return + */ + public Value getValue(Formula f) { + + Value val = mComputedValues.get(f); + if (val != null) { + return val; + } else { + // Find criteria ny name + String form = f.getName(); + + for (Formula formula : this.mComputedValues.keySet()) { + if (formula.getName().equals(form)) { + return mComputedValues.get(formula); + } + } + } + return null; + } + + /** + * + * @return + */ + public int getComputedValueCount() { + return mComputedValues.size(); + } + /** * * @return @@ -833,6 +962,16 @@ public void putValue(Criteria c, Value v) { updated = true; } + /** + * + * @param c + * @param v + */ + public void putValue(Formula f, Value v) { + mComputedValues.put(f, v); + updated = true; + } + /** * * @param c @@ -842,6 +981,11 @@ public void removeValue(Criteria c) { updated = true; } + public void removeValue(Formula f) { + mComputedValues.remove(f); + updated = true; + } + @Override public Element getXMLElementForDisplay() { Element match = getXMLElement(); @@ -944,7 +1088,19 @@ protected int recomputeValue(int index, Competitor c) { if (valueType <= Parameters.C_MAX_RANKING) { value = getValue((Coach) c, valueType); } else { - value = getValue(MjtRanking.getCriteriaByValue(valueType), MjtRanking.getSubtypeByValue(valueType), c); + + int v = valueType - Parameters.C_MAX_RANKING - 1; + Criteria criteria = null; + Parameters params = Tournament.getTournament().getParams(); + if (v / 3 < Tournament.getTournament().getParams().getCriteriaCount()) { + criteria = params.getCriteria(v / 3); + value = getValue(criteria, MjtRanking.getSubtypeByValue(valueType), c); + } else { + int f = valueType - 3 * Tournament.getTournament().getParams().getCriteriaCount() - Parameters.C_MAX_RANKING - 1; + Formula formula = Tournament.getTournament().getParams().getFormula(f); + value = getValue(formula, c); + } + } return value; } @@ -1600,6 +1756,23 @@ public int getValue(Criteria crit, int subtype, Competitor c) { return value; } + public int getValue(Formula formula, Competitor c) { + int value = 0; + Value v = getValue(formula); + if (v != null) { + if (c == mCompetitor1) { + value = v.getValue1(); + + } + if (c == mCompetitor2) { + + value = v.getValue2(); + + } + } + return value; + } + public boolean isEntered() { Criteria td = Tournament.getTournament().getParams().getCriteria(0); Value v = getValue(td); diff --git a/src/tourma/data/Competitor.java b/src/tourma/data/Competitor.java index bc99bb54..57ae3b9f 100644 --- a/src/tourma/data/Competitor.java +++ b/src/tourma/data/Competitor.java @@ -40,6 +40,7 @@ public static Color generateRandomColor(final Color mix) { return new Color(red, green, blue); } + public boolean isUpdated() { return updated; } diff --git a/src/tourma/data/Cup.java b/src/tourma/data/Cup.java new file mode 100644 index 00000000..7fd458dc --- /dev/null +++ b/src/tourma/data/Cup.java @@ -0,0 +1,646 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import org.jdom.DataConversionException; +import org.jdom.Element; +import tourma.utility.StringConstants; + +/** + * + * @author WFMJ7631 + */ +public class Cup implements IXMLExport, Serializable { + + ArrayList mTables = new ArrayList<>(); + + public ArrayList getTables() { + return mTables; + } + + public void cleanRound(Round r) { + + int roundIndex=r.getCupTour()-1; + for (CupTable table : mTables) { + int starting_round_index = mTables.get(0).mCupRounds.size() - table.mCupRounds.size(); + + for (CupRound round : table.getCupRounds()) { + // Build the list of player + // Winners of the previous round + int currentRoundIndex=table.getCupRounds().indexOf(round); + int relative_round_index = currentRoundIndex - roundIndex; + + if (relative_round_index > 0) { + + //round.generateEmptyMatchs(); + for (Match match : round.getMatchs()) { + match.setCompetitor1(null); + match.setCompetitor2(null); + } + } + + } + } + } + + public Cup(Cup copy) { + mType = copy.mType; + mRoundsCount = copy.mRoundsCount; + mSwissForLoosers = copy.mSwissForLoosers; + mShuffle = copy.mShuffle; + mInitialDraw = copy.mInitialDraw; + /* + The number of fixtures depends on roundIndex and the kind of cup + If single Cup, only 1 fixture + If looser Cup, 2 fixtures + If ranking Games, RoundIndex+1 fixtures + */ + // Generate fixtures according to supplides Data. + switch (mType) { + case CLASSIC: + mTables.add(new CupTable(copy.mRoundsCount, false, false)); + break; + case CLASSIC_THIRD: + mTables.add(new CupTable(copy.mRoundsCount, true, false)); + break; + case LOOSER: + mTables.add(new CupTable(copy.mRoundsCount, false, false)); + mTables.add(new CupTable(copy.mRoundsCount - 1, false, true)); + break; + case RANKING_MATCHES: + // Ajout du tableau des vainqueurs + mTables.add(new CupTable(copy.mRoundsCount, false, false)); + // Ajout du tableau des perdants + mTables.add(new CupTable(copy.mRoundsCount - 1, false, false)); + + int i = copy.mRoundsCount - 1; + while (i > 1) { + ArrayList tables = new ArrayList<>(mTables); + for (CupTable table : tables) { + if (table.getCupRounds().size() == i) { + // Add 1 level less table around it + CupTable before = new CupTable(i - 1, false, false); + CupTable after = new CupTable(i - 1, false, false); + int index = mTables.indexOf(table); + mTables.add(index, before); + index = mTables.indexOf(table); + mTables.add(index + 1, after); + } + } + i--; + } + break; + } + } + + public Cup(ROUND_TYPE type, + int roundsCount, + boolean swissForLoosers, + boolean shuffle, + INITIAL_DRAW initial_draw) { + mType = type; + mRoundsCount = roundsCount; + mSwissForLoosers = swissForLoosers; + mShuffle = shuffle; + mInitialDraw = initial_draw; + /* + The number of fixtures depends on roundIndex and the kind of cup + If single Cup, only 1 fixture + If looser Cup, 2 fixtures + If ranking Games, RoundIndex+1 fixtures + */ + // Generate fixtures according to supplides Data. + switch (mType) { + case CLASSIC: + mTables.add(new CupTable(roundsCount, false, false)); + break; + case CLASSIC_THIRD: + mTables.add(new CupTable(roundsCount, true, false)); + break; + case LOOSER: + mTables.add(new CupTable(roundsCount, false, false)); + mTables.add(new CupTable(roundsCount - 1, false, true)); + break; + case RANKING_MATCHES: + // Ajout du tableau des vainqueurs + mTables.add(new CupTable(roundsCount, false, false)); + // Ajout du tableau des perdants + mTables.add(new CupTable(roundsCount - 1, false, false)); + + int i = roundsCount - 1; + while (i > 1) { + ArrayList tables = new ArrayList<>(mTables); + for (CupTable table : tables) { + if (table.getCupRounds().size() == i) { + // Add 1 level less table around it + CupTable before = new CupTable(i - 1, false, false); + CupTable after = new CupTable(i - 1, false, false); + int index = mTables.indexOf(table); + mTables.add(index, before); + index = mTables.indexOf(table); + mTables.add(index + 1, after); + } + } + i--; + } + + break; + } + } + + public Cup() { + mRoundsCount = 1; + mSwissForLoosers = true; + mShuffle = true; + mType = ROUND_TYPE.RANKING_MATCHES; + } + + @Override + public Element getXMLElement() { + final Element cup = new Element(StringConstants.CS_CUP); + + switch (mInitialDraw) { + case RANDOM: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(0)); + break; + case RANKING: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(1)); + break; + case MANUAL: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(2)); + break; + case CATEGORIES_MIXED: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(4)); + break; + case CATEGORIES_CROSSED: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(3)); + break; + case CATEGORIES_ABSOLUTE_RANKING: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(5)); + break; + case CATEGORIES_NOT_MIXED: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(6)); + break; + default: + cup.setAttribute(StringConstants.CS_CUP_INITIAL_DRAW, Integer.toString(0)); + } + + switch (mType) { + case CLASSIC: + cup.setAttribute(StringConstants.CS_CUP_TYPE, Integer.toString(0)); + break; + case CLASSIC_THIRD: + cup.setAttribute(StringConstants.CS_CUP_TYPE, Integer.toString(1)); + break; + case LOOSER: + cup.setAttribute(StringConstants.CS_CUP_TYPE, Integer.toString(2)); + break; + case RANKING_MATCHES: + cup.setAttribute(StringConstants.CS_CUP_TYPE, Integer.toString(3)); + break; + default: + cup.setAttribute(StringConstants.CS_CUP_TYPE, Integer.toString(0)); + } + + cup.setAttribute(StringConstants.CS_CUP_ROUNDS_COUNT, Integer.toString(mRoundsCount)); + cup.setAttribute(StringConstants.CS_CUP_SWISS_FOR_LOOSERS, Boolean.toString(mSwissForLoosers)); + cup.setAttribute(StringConstants.CS_CUP_SHUFFLE, Boolean.toString(mShuffle)); + + for (CupTable mTable : this.mTables) { + final Element table = mTable.getXMLElement(); + cup.addContent(table); + } + + return cup; + } + + @Override + public void setXMLElement(Element cup) { + if (cup.getAttribute(StringConstants.CS_CUP_TYPE) != null) { + try { + int type = cup.getAttribute(StringConstants.CS_CUP_TYPE).getIntValue(); + switch (type) { + case 0: + mType = ROUND_TYPE.CLASSIC; + break; + case 1: + mType = ROUND_TYPE.CLASSIC_THIRD; + break; + case 2: + mType = ROUND_TYPE.LOOSER; + break; + case 3: + mType = ROUND_TYPE.RANKING_MATCHES; + break; + default: + mType = ROUND_TYPE.CLASSIC; + } + } catch (DataConversionException dce) { + System.err.println(dce.getLocalizedMessage()); + } + + } else { + mType = ROUND_TYPE.CLASSIC; + } + + if (cup.getAttribute(StringConstants.CS_CUP_INITIAL_DRAW) != null) { + try { + int type = cup.getAttribute(StringConstants.CS_CUP_INITIAL_DRAW).getIntValue(); + switch (type) { + case 0: + mInitialDraw = INITIAL_DRAW.RANDOM; + break; + case 1: + mInitialDraw = INITIAL_DRAW.RANKING; + break; + case 2: + mInitialDraw = INITIAL_DRAW.MANUAL; + break; + case 3: + mInitialDraw = INITIAL_DRAW.CATEGORIES_CROSSED; + break; + case 4: + mInitialDraw = INITIAL_DRAW.CATEGORIES_MIXED; + break; + case 5: + mInitialDraw = INITIAL_DRAW.CATEGORIES_ABSOLUTE_RANKING; + break; + case 6: + mInitialDraw = INITIAL_DRAW.CATEGORIES_NOT_MIXED; + break; + default: + mInitialDraw = INITIAL_DRAW.RANDOM; + } + } catch (DataConversionException dce) { + System.err.println(dce.getLocalizedMessage()); + } + + } else { + mType = ROUND_TYPE.CLASSIC; + } + + if (cup.getAttribute(StringConstants.CS_CUP_ROUNDS_COUNT) != null) { + try { + mRoundsCount = cup.getAttribute(StringConstants.CS_CUP_ROUNDS_COUNT).getIntValue(); + } catch (DataConversionException dce) { + System.err.println(dce.getLocalizedMessage()); + } + } else { + mRoundsCount = 3; + } + + if (cup.getAttribute(StringConstants.CS_CUP_SWISS_FOR_LOOSERS) != null) { + try { + mSwissForLoosers = cup.getAttribute(StringConstants.CS_CUP_SWISS_FOR_LOOSERS).getBooleanValue(); + } catch (DataConversionException dce) { + System.err.println(dce.getLocalizedMessage()); + } + } else { + mSwissForLoosers = true; + } + + if (cup.getAttribute(StringConstants.CS_CUP_SHUFFLE) != null) { + try { + mShuffle = cup.getAttribute(StringConstants.CS_CUP_SHUFFLE).getBooleanValue(); + } catch (DataConversionException dce) { + System.err.println(dce.getLocalizedMessage()); + } + } else { + mShuffle = true; + } + + List tables = cup.getChildren(StringConstants.CS_CUP_TABLE); + final Iterator k = tables.iterator(); + this.mTables = new ArrayList<>(); + + int i = 0; + while (k.hasNext()) { + Element t = k.next(); + try { + CupTable table = null; + switch (mType) { + case CLASSIC_THIRD: + if (i == 0) { + table = new CupTable(mRoundsCount, true, false); + } else { + table = new CupTable(mRoundsCount, false, false); + } + break; + case LOOSER: + if (i == 1) { + table = new CupTable(mRoundsCount, false, true); + } else { + table = new CupTable(mRoundsCount, false, false); + } + break; + default: + table = new CupTable(mRoundsCount, false, false); + + } + table.setXMLElement(t); + this.mTables.add(table); + } catch (NullPointerException ne) { + } + i++; + + } + + } + + public enum ROUND_TYPE { + CLASSIC, + CLASSIC_THIRD, + LOOSER, + RANKING_MATCHES + } + + public enum INITIAL_DRAW { + RANDOM, + RANKING, + MANUAL, + CATEGORIES_CROSSED, + CATEGORIES_MIXED, + CATEGORIES_ABSOLUTE_RANKING, + CATEGORIES_NOT_MIXED + } + + private INITIAL_DRAW mInitialDraw; + + public INITIAL_DRAW getInitialDraw() { + return mInitialDraw; + } + + public void setInitialDraw(INITIAL_DRAW mInitialDraw) { + this.mInitialDraw = mInitialDraw; + } + + // Cup type + private ROUND_TYPE mType; + /* Number of rounds + if 1 => only final (2 participants) + if 2 => Semi-final and final (4 participants) + if 3 => quarter-final and final (8 participants) + if N => 2^N participants + */ + private int mRoundsCount; + private boolean mSwissForLoosers; + private boolean mShuffle; + + public boolean isShuffle() { + return mShuffle; + } + + public void setShuffle(boolean mShuffle) { + this.mShuffle = mShuffle; + } + + public ROUND_TYPE getType() { + return mType; + } + + public void setType(ROUND_TYPE mType) { + this.mType = mType; + } + + public int getRoundsCount() { + return mRoundsCount; + } + + public void setRoundsCount(int mRoundsCount) { + this.mRoundsCount = mRoundsCount; + } + + public boolean isSwissForLoosers() { + return mSwissForLoosers; + } + + public void setSwissForLoosers(boolean mSwissForLoosers) { + this.mSwissForLoosers = mSwissForLoosers; + } + + public ArrayList generateMatches(int roundIndex, Round r, ArrayList previousRoundMatches, ArrayList competitors) { + ArrayList matches = null; + // First case: First Round + // (If Swiss for looser => Generate for remaining coaches but exported to class Generation) + if (roundIndex == 0) { + matches = generateMatchesFirstRound(competitors); + } // Second case: Last Round + // Generate final + // If Third => Generate third place + // If Looser => Generate second third place + // If Ranking => Generate the X last games + // (If Swiss for looser => Generate for remaining coaches but exported to class Generation) + else { + if (roundIndex == mRoundsCount - 1) { + matches = generateMatchesLastRound(competitors, previousRoundMatches); + } // Third case: intermediate round + // Generate Classic + // If Looser => Generate second tab + // If Ranking => Generate the X other tabs + // (If Swiss for looser => Generate for remaining coaches but exported to class Generation) + else { + matches = generateMatchesRound(roundIndex, competitors, previousRoundMatches); + } + } + return matches; + } + + ArrayList generateMatchesRound(int roundIndex, ArrayList competitors, ArrayList previousRoundMatches) { + // All the table are used + ArrayList matches = new ArrayList<>(); + ArrayList comps = new ArrayList<>(); + + // Treat each table + for (int index_table = 0; index_table < mTables.size(); index_table++) { + + comps.clear(); + CupTable table = mTables.get(index_table); + // Find the round corresponding to the round_index. + // Compute the relative round index + int starting_round_index = mTables.get(0).mCupRounds.size() - table.mCupRounds.size(); + + if (starting_round_index <= roundIndex) { + + // Build the list of player + // Winners of the previous round + int relative_round_index = roundIndex - starting_round_index; + if (relative_round_index > 0) { + + CupRound r_w = table.mCupRounds.get(relative_round_index - 1); + for (Match m : r_w.mMatchs) { + Competitor c1 = m.getCompetitor1(); + Competitor c2 = m.getCompetitor2(); + if ((c1 != null) && (c2 != null)) { + // Look for winner. + for (Match m_tmp : previousRoundMatches) { + if (m_tmp.getWinner() == c1) { + comps.add(c1); + } else if (m_tmp.getWinner() == c2) { + comps.add(c2); + } + } + } + } + } + + // See Last Round function + if (mType == ROUND_TYPE.CLASSIC_THIRD) { + // Nothing + } + + // Add Loosers of the previous table of the previous round + if ((mType == ROUND_TYPE.RANKING_MATCHES) || (mType == ROUND_TYPE.LOOSER)) { + if ((index_table > 0) && (relative_round_index >= 0)) { + // Find table with the right level + CupTable prev_table = null; + int nb_rounds = table.mCupRounds.size(); + // Find first previous largest one + for (int j = index_table - 1; j >= 0; j--) { + CupTable tmp = mTables.get(j); + if (tmp.mCupRounds.size() > nb_rounds) { + prev_table = tmp; + break; + } + } + if (prev_table != null) { + if (relative_round_index >= 0) { + CupRound prev_round = prev_table.mCupRounds.get(relative_round_index); + for (Match m : prev_round.mMatchs) { + Competitor c1 = m.getCompetitor1(); + Competitor c2 = m.getCompetitor2(); + if ((c1 != null) && (c2 != null)) { + // Look for winner. + for (Match m_tmp : previousRoundMatches) { + if (m_tmp.getLooser() == c1) { + comps.add(c1); + } else { + if (m_tmp.getLooser() == c2) { + comps.add(c2); + } + } + } + } + } + } + } + } + } + + // Draw table + if (mShuffle) { + Collections.shuffle(comps); + } + + if (relative_round_index >= 0) { + // Get current Round matchs + CupRound cr = table.getCupRounds().get(relative_round_index); + + // If this is the last round, each table owns only 1 match + for (Match m : cr.getMatchs()) { + Competitor c1 = comps.get(0); + comps.remove(0); + Competitor c2 = comps.get(0); + comps.remove(0); + + m.setCompetitor1(c1); + m.setCompetitor2(c2); + + matches.add(m); + } + } + } + } + + return matches; + } + + ArrayList generateMatchesFirstRound(ArrayList competitors) { + // Only the first table to use + CupTable table = mTables.get(0); + CupRound cr = table.mCupRounds.get(0); + + ArrayList comps = new ArrayList<>(competitors); + + int i = 0; + for (Match m : cr.getMatchs()) { + Competitor c1 = comps.get(0); + comps.remove(0); + Competitor c2 = comps.get(0); + comps.remove(0); + + m.setCompetitor1(c1); + m.setCompetitor2(c2); + } + return cr.getMatchs(); + } + + ArrayList generateMatchesLastRound(ArrayList competitors, ArrayList previousRoundMatch) { + // All the table are used + ArrayList matches = new ArrayList<>(); + ArrayList comps = new ArrayList<>(); + + // Order competitors according to previous round results + for (int i = 0; i < previousRoundMatch.size() / 2; i++) { + Match m1 = previousRoundMatch.get(2 * i); + Match m2 = previousRoundMatch.get(2 * i + 1); + + Competitor w1 = m1.getWinner(); + Competitor w2 = m2.getWinner(); + + Competitor l1 = m1.getLooser(); + Competitor l2 = m2.getLooser(); + + // always add Winners + comps.add(w1); + comps.add(w2); + + // Third place match + if ((mType == ROUND_TYPE.CLASSIC_THIRD) && (i == 0)) { + comps.add(l1); + comps.add(l2); + } + + // If ranking matches + if (mType == ROUND_TYPE.RANKING_MATCHES) { + comps.add(l1); + comps.add(l2); + } + + // If looser table, Add only the looser of the semi-finals + if (mType == ROUND_TYPE.LOOSER) { + if (i < 2) { + comps.add(l1); + comps.add(l2); + } + } + } + + for (CupTable table : mTables) { + // Get last Round + CupRound cr = table.getCupRounds().get(table.getCupRounds().size() - 1); + + // If this is the last round, each table owns only 1 match + for (Match m : cr.getMatchs()) { + Competitor c1 = comps.get(0); + comps.remove(0); + Competitor c2 = comps.get(0); + comps.remove(0); + + m.setCompetitor1(c1); + m.setCompetitor2(c2); + + matches.add(m); + } + } + return matches; + } +} diff --git a/src/tourma/data/CupRound.java b/src/tourma/data/CupRound.java new file mode 100644 index 00000000..6c3fabb4 --- /dev/null +++ b/src/tourma/data/CupRound.java @@ -0,0 +1,155 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.data; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.jdom.Element; +import tourma.utility.StringConstants; + +/** + * + * @author WFMJ7631 + */ +public class CupRound implements IXMLExport { + + public int getNbMatchs() { + return mNbMatchs; + } + + public void setNbMatchs(int mNbMatchs) { + this.mNbMatchs = mNbMatchs; + } + + public ArrayList getMatchs() { + return mMatchs; + } + + public void setMatchs(ArrayList mMatchs) { + this.mMatchs = mMatchs; + } + + protected int mNbMatchs; + protected ArrayList mMatchs = null; + + public CupRound(int nbMatches) { + mNbMatchs = nbMatches; + generateEmptyMatchs(); + } + + public CupRound() { + mNbMatchs = 0; + } + + public void generateEmptyMatchs() { + if (mMatchs != null) { + mMatchs.clear(); + } + mMatchs = new ArrayList<>(); + + boolean byTeam = (Tournament.getTournament().getParams().isTeamTournament()) + && (Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING); + + for (int i = 0; i < mNbMatchs; i++) { + if (byTeam) { + TeamMatch tm = new TeamMatch(null); + mMatchs.add(tm); + } else { + CoachMatch cm = new CoachMatch(null); + mMatchs.add(cm); + } + } + } + + @Override + public Element getXMLElement() { + final Element round = new Element(StringConstants.CS_CUP_ROUND); + + for (Match mMatch : this.mMatchs) { + final Element match = new Element(StringConstants.CS_CUP_MATCH); + String name1=""; + String name2=""; + if(mMatch.getCompetitor1()!=null) + { + name1=mMatch.getCompetitor1().getName(); + } + if(mMatch.getCompetitor2()!=null) + { + name2=mMatch.getCompetitor2().getName(); + } + match.setAttribute("c1",name1); + match.setAttribute("c2",name2); + round.addContent(match); + } + return round; + } + + @Override + public void setXMLElement(Element e) { + List matchs = e.getChildren(StringConstants.CS_CUP_MATCH); + final Iterator k = matchs.iterator(); + this.mMatchs = new ArrayList<>(); + + boolean teamTour = Tournament.getTournament().getParams().isTeamTournament(); + ETeamPairing pairing = Tournament.getTournament().getParams().getTeamPairing(); + + while (k.hasNext()) { + Element m = k.next(); + Match match; + try { + + String name1=m.getAttributeValue("c1"); + String name2=m.getAttributeValue("c2"); + + if (teamTour + && (pairing == ETeamPairing.TEAM_PAIRING)) { + match = new TeamMatch(null); + if (!name1.equals("")) + { + Competitor c1=Tournament.getTournament().getTeam(name1); + if (c1!=null) + { + match.setCompetitor1(c1); + } + } + if (!name2.equals("")) + { + Competitor c2=Tournament.getTournament().getTeam(name2); + if (c2!=null) + { + match.setCompetitor2(c2); + } + } + } else { + match = new CoachMatch(null); + if (!name1.equals("")) + { + Competitor c1=Tournament.getTournament().getCoach(name1); + if (c1!=null) + { + match.setCompetitor1(c1); + } + } + if (!name2.equals("")) + { + Competitor c2=Tournament.getTournament().getCoach(name2); + if (c2!=null) + { + match.setCompetitor2(c2); + } + } + } + + this.mMatchs.add(match); + + } catch (NullPointerException ne) { + } + this.mNbMatchs=mMatchs.size(); + } + } + +} diff --git a/src/tourma/data/CupTable.java b/src/tourma/data/CupTable.java new file mode 100644 index 00000000..8e978d62 --- /dev/null +++ b/src/tourma/data/CupTable.java @@ -0,0 +1,76 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.data; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.jdom.Element; +import tourma.utility.StringConstants; + +/** + * + * @author WFMJ7631 + */ +public class CupTable implements IXMLExport { + + public ArrayList getCupRounds() { + return mCupRounds; + } + + public void setCupRounds(ArrayList mCupRounds) { + this.mCupRounds = mCupRounds; + } + + ArrayList mCupRounds = new ArrayList<>(); + + public CupTable(int cupRoundsCount, boolean third_place, boolean looser_table) { + for (int i = 0; i < cupRoundsCount; i++) { + int nbMatchs = (int) Math.round(Math.pow(2, cupRoundsCount - i - 1)); + + if ((i == cupRoundsCount - 1) && (third_place)) { + mCupRounds.add(new CupRound(nbMatchs + 1)); + } else { + if (looser_table) + { + if (i!=0) + { + nbMatchs+=nbMatchs; + } + } + mCupRounds.add(new CupRound(nbMatchs)); + } + } + } + + @Override + public Element getXMLElement() { + + final Element table = new Element(StringConstants.CS_CUP_TABLE); + + this.mCupRounds.stream().map((mRound) -> mRound.getXMLElement()).forEachOrdered((round) -> { + table.addContent(round); + }); + return table; + } + + @Override + public void setXMLElement(Element e) { + List tables = e.getChildren(StringConstants.CS_CUP_ROUND); + final Iterator k = tables.iterator(); + this.mCupRounds = new ArrayList<>(); + + while (k.hasNext()) { + Element r = k.next(); + try { + CupRound round = new CupRound(); + round.setXMLElement(r); + this.mCupRounds.add(round); + } catch (NullPointerException ne) { + } + } + } +} diff --git a/src/tourma/data/Formula.java b/src/tourma/data/Formula.java new file mode 100644 index 00000000..bbc6b16e --- /dev/null +++ b/src/tourma/data/Formula.java @@ -0,0 +1,325 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Stack; +import java.util.concurrent.atomic.AtomicInteger; +import javax.swing.JOptionPane; +import org.jdom.Element; +import tourma.utility.Pair; +import tourma.utility.StringConstants; + +/** + * + * @author WFMJ7631 + */ +public class Formula implements IXMLExport, Serializable { + + String _formula = ""; + String _name = ""; + Stack _npi = null; + + protected static AtomicInteger sGenUID = new AtomicInteger(0); + protected int UID = sGenUID.incrementAndGet(); + + public int getUID() { + return UID; + } + + public void setUID(int UID) { + this.UID = UID; + } + + public String getName() { + return _name; + } + + public void setName(String _name) { + this._name = _name; + } + + public String getFormula() { + return _formula; + } + + public void setFormula(String _formula) { + if (isValid(_formula)) { + this._formula = _formula; + } + } + + public void pull(Formula f) { + this.UID = f.UID; + this._name = f._name; + this._formula = f._formula; + this._npi = f._npi; + } + + /** + * + * @param name + */ + public Formula(final String name) { + _name = name; + } + + /** + * + * @return + */ + @Override + public Element getXMLElement() { + final Element form = new Element(StringConstants.CS_FORMULA); + form.setAttribute(StringConstants.CS_NAME, this.getName()); + form.setAttribute(StringConstants.CS_FORMULA, this.getFormula()); + return form; + } + + /** + * + * @param formula + */ + @Override + public void setXMLElement(final Element formula) { + try { + this.setFormula(formula.getAttributeValue(StringConstants.CS_FORMULA)); + this.setName(formula.getAttributeValue(StringConstants.CS_NAME)); + + } catch (NullPointerException npe) { + this.setFormula("0"); + this.setName("F"); + + } + } + + public boolean isValid(String formula) { + boolean valid = true; + + Stack npi = transformToNPI(formula); + + Stack npi_crit = new Stack(); + + // Replace String by Criteria ? + for (Object obj : npi) { + if (obj instanceof Integer) { + npi_crit.add(obj); + } else if (obj instanceof String) { + String object = (String) obj; + { + boolean isop = false; + if (object.length() == 1) { + if (isOperator(object.charAt(0))) { + isop = true; + npi_crit.add(obj); + } + } + /* + Check that last character is 1 o 2 + Check that the word except last character correspond to + */ + if (!isop) { + char last = object.charAt(object.length() - 1); + if ((last == '1') || (last == '2')) { + Criteria c = null; + String variable = object.substring(0, object.length() - 1); + for (int i = 0; i < Tournament.getTournament().getParams().getCriteriaCount(); i++) { + Criteria crit = Tournament.getTournament().getParams().getCriteria(i); + if (crit.getAccronym().equals(variable)) { + c = crit; + break; + } + } + if (c != null) { + Pair pair; + String sub = object.substring(object.length() - 1, object.length()); + int ext = Integer.parseInt(sub); + pair = new Pair<>(ext, c); + npi_crit.add(pair); + } else { + JOptionPane.showMessageDialog(null, "Variable " + variable + " not found among criteras' accronyms", "Error", JOptionPane.ERROR_MESSAGE); + valid = false; + } + } else { + JOptionPane.showMessageDialog(null, "Last Character of variable " + object + " is not 1 or 2", "Error", JOptionPane.ERROR_MESSAGE); + valid = false; + } + } + } + } + } + + if (valid) { + _npi = npi_crit; + } + return valid; + } + + public int evaluate(HashMap values, int side) { + + int value = 0; + + // First Substitute Criterias by values in NPI Stack + Stack form = new Stack<>(); + + for (Object obj : _npi) { + if (obj instanceof Pair) { + Integer fside = (Integer) ((Pair) obj).getFirst(); + Criteria crit = (Criteria) ((Pair) obj).getSecond(); + + Value val = values.get(crit); + + if ((fside == side)) { + form.add(val.getValue1()); + } else { + form.add(val.getValue2()); + } + } else { + form.add(obj); + } + } + + // Evaluate Formula in NPI + Stack result = new Stack<>(); + for (Object obj : form) { + if (obj instanceof Integer) { + result.push((Integer) obj); + } + if (obj instanceof String) { + int value1 = result.pop(); + int value2 = result.pop(); + int val = 0; + char op = ((String) obj).charAt(0); + switch (op) { + case '+': + val = value1 + value2; + break; + case '-': + val = value1 - value2; + break; + case '*': + val = value1 * value2; + break; + case '/': + val = value1 / value2; + break; + case '^': + val = value1 ^ value2; + break; + } + result.push(val); + } + } + value = result.pop(); + return value; + } + + public void updateCriteria(String oldValue, String newValue) { + _formula = _formula.replace(oldValue, newValue); + } + + private static Stack transformToNPI(String text) { + Stack npi = new Stack(); + + if (text == null) { + return null; + } + String res = ""; + int len = text.length(); + Stack operator = new Stack(); + Stack reversePolish = new Stack(); + + text = text.replace(" ", ""); + + //avoid checking empty + operator.push('#'); + for (int i = 0; i < len;) { + //deal with space + while (i < len && text.charAt(i) == ' ') { + i++; + } + if (i == len) { + break; + } + //if is number + if (isNum(text.charAt(i))) { + String num = ""; + while (i < len && isNum(text.charAt(i))) { + num += text.charAt(i++); + } + int number = Integer.parseInt(num); + reversePolish.push(number); + //is operator + } else { + if (isOperator(text.charAt(i))) { + char op = text.charAt(i); + switch (op) { + case '(': + operator.push(op); + break; + case ')': + while (operator.peek() != '(') { + reversePolish.push(Character.toString(operator.pop())); + } + operator.pop(); + break; + case '+': + case '-': + if (operator.peek() == '(') { + operator.push(op); + } else { + while (operator.peek() != '#' && operator.peek() != '(') { + reversePolish.push(Character.toString(operator.pop())); + } + operator.push(op); + } + break; + case '*': + case '/': + case '^': + if (operator.peek() == '(') { + operator.push(op); + } else { + while (operator.peek() != '#' && operator.peek() != '+' + && operator.peek() != '-' && operator.peek() != '(') { + reversePolish.push(Character.toString(operator.pop())); + } + operator.push(op); + } + break; + } + i++; + } else { + String var = ""; + while (i < len && !isOperator(text.charAt(i))) { + var += text.charAt(i++); + } + reversePolish.push(var); + } + } + } + while (operator.peek() != '#') { + reversePolish.push(Character.toString(operator.pop())); + } + /* while (!reversePolish.isEmpty()) { + res = res.length() == 0 ? reversePolish.pop() + res : reversePolish.pop() + " " + res; + }*/ + + System.out.println(res); + return reversePolish; + } + + public static boolean isOperator(char c) { + return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '^'; + } + + public static boolean isNum(char c) { + return c - '0' >= 0 && c - '0' <= 9; + } + +} diff --git a/src/tourma/data/Parameters.java b/src/tourma/data/Parameters.java index 8d054b4d..ad8a7343 100644 --- a/src/tourma/data/Parameters.java +++ b/src/tourma/data/Parameters.java @@ -44,12 +44,21 @@ public void setUID(int UID) { public Criteria getCriteria(String name) { for (Criteria criteria : mCriterias) { - if (criteria.getName().equals(name)) { + if (criteria.getName().equals(name) || criteria.getAccronym().equals(name)) { return criteria; } } return null; } + + public Formula getFormula(String name) { + for (Formula formula : mFormulas) { + if (formula.getName().equals(name) ) { + return formula; + } + } + return null; + } boolean mDisplayRoster = true; @@ -93,13 +102,30 @@ public void pull(Parameters params) { mCriterias.add(c); } } + + bFound = false; + for (int i = 0; i < params.getFormulaCount(); i++) { + bFound = false; + Formula form = params.getFormula(i); + for (Formula f : mFormulas) { + if ((form.getUID() == f.UID) || (form.getName().equals(f.getName()))) { + bFound = true; + f.pull(form); + } + } + if (!bFound) { + Formula f = new Formula(form.getName()); + f.pull(form); + mFormulas.add(f); + } + } this.mDate = params.mDate; this.mEnableClans = params.mEnableClans; this.mExceptBestAndWorstIndiv = params.mExceptBestAndWorstIndiv; this.mExceptBestAndWorstTeam = params.mExceptBestAndWorstTeam; this.mForeColor = params.mForeColor; - this.mGame = params.mGame; + this.mGapLargeVictory = params.mGapLargeVictory; this.mGapLittleLost = params.mGapLittleLost; this.mGroupsEnable = params.mGroupsEnable; @@ -154,6 +180,8 @@ public void pull(Parameters params) { this.mWebEdit = params.mWebEdit; + this.mCrossPoolMatch = params.mCrossPoolMatch; + } /** @@ -214,14 +242,14 @@ public void pull(Parameters params) { */ public static final int C_RANKING_BONUS_POINTS = 10; /** - * + * */ public static final int C_RANKING_HEAD_BY_HEAD = 11; /** * */ public static final int C_RANKING_TIER = 12; - + /** * */ @@ -241,16 +269,22 @@ public void pull(Parameters params) { */ private static final Logger LOG = Logger.getLogger(Parameters.class.getName()); - /** - * - */ - private int mGame = RosterType.C_BLOOD_BOWL; + + public boolean isCrossPoolMatch() { + return mCrossPoolMatch; + } /** * */ + public void setCrossPoolMatch(boolean crossPoolMatch) { + this.mCrossPoolMatch = crossPoolMatch; + } + private int mPointsIndivVictory = 1000; + private boolean mCrossPoolMatch = false; + /** * */ @@ -328,9 +362,13 @@ public void pull(Parameters params) { private boolean mSubstitutes = false; /** - * + * Ranking criterias */ private final ArrayList mCriterias; + /** + * Ranking Formulas + */ + private final ArrayList mFormulas; /** * @@ -535,6 +573,7 @@ public Parameters() { mTournamentName = StringConstants.CS_NULL; mTournamentOrga = StringConstants.CS_NULL; mCriterias = new ArrayList<>(); + mFormulas = new ArrayList<>(); Criteria c = new Criteria(Translate.translate(CS_Touchdowns)); c.setPointsFor(2); @@ -625,6 +664,11 @@ public Element getXMLElement() { final Element crit = getCriteria(i).getXMLElement(); params.addContent(crit); } + + for (int i = 0; i < this.getFormulaCount(); i++) { + final Element form = getFormula(i).getXMLElement(); + params.addContent(form); + } params.setAttribute(StringConstants.CS_VICTORY, Integer.toString(this.getPointsIndivVictory())); params.setAttribute(StringConstants.CS_LARGE_VICTORY, Integer.toString(this.getPointsIndivLargeVictory())); @@ -701,7 +745,6 @@ public Element getXMLElement() { params.setAttribute(StringConstants.CS_GROUPENABLE, Boolean.toString(this.isGroupsEnable())); params.setAttribute(StringConstants.CS_SUBSTITUTES, Boolean.toString(this.isSubstitutes())); - params.setAttribute(StringConstants.CS_GAMETYPE, Integer.toString(this.getGame())); params.setAttribute(StringConstants.CS_ACTVATECLANS, Boolean.toString(this.isEnableClans())); params.setAttribute(StringConstants.CS_AVOIDFIRSTMATCH, Boolean.toString(this.isAvoidClansFirstMatch())); @@ -748,6 +791,8 @@ public Element getXMLElement() { params.setAttribute(StringConstants.CS_WEB_COLOR2, Integer.toString(mColor2.getRGB())); params.setAttribute(StringConstants.CS_WEB_FORECOLOR, Integer.toString(mForeColor.getRGB())); params.setAttribute(StringConstants.CS_WEB_BORDERCOLOR, Integer.toString(mBorderColor.getRGB())); + + params.setAttribute(StringConstants.CS_CROSSMATCHPOOL, Boolean.toString(mCrossPoolMatch)); return params; } @@ -849,13 +894,6 @@ public void setXMLElement(final Element params) { } catch (ParseException | NullPointerException pe) { } - try { - this.setGame(params.getAttribute(StringConstants.CS_GAMETYPE).getIntValue()); - } catch (DataConversionException | NullPointerException pe) { - this.setGame(1); - LOG.log(Level.FINE, pe.getLocalizedMessage()); - } - } catch (NullPointerException ne) { this.setGapLargeVictory(3); this.setGapLittleLost(1); @@ -876,7 +914,7 @@ public void setXMLElement(final Element params) { this.setRankingTeam4(params.getAttribute(StringConstants.CS_RANK + 4 + "_" + StringConstants.CS_TEAM).getIntValue()); this.setRankingTeam5(params.getAttribute(StringConstants.CS_RANK + 5 + "_" + StringConstants.CS_TEAM).getIntValue()); } catch (NullPointerException ne2) { - JOptionPane.showMessageDialog(null, ne2.getLocalizedMessage()); + // JOptionPane.showMessageDialog(null, ne2.getLocalizedMessage()); } try { @@ -937,8 +975,21 @@ public void setXMLElement(final Element params) { crit.setXMLElement(criteria); this.addCriteria(crit); } + + final List formulas = params.getChildren(StringConstants.CS_FORMULA); + final Iterator fo = formulas.iterator(); + + this.clearFormulas(); + + while (fo.hasNext()) { + final Element formula = fo.next(); + final Formula form = new Formula(formula.getAttributeValue(StringConstants.CS_NAME)); + form.setXMLElement(formula); + this.addFormula(form); + } + } catch (DataConversionException dce) { - JOptionPane.showMessageDialog(null, dce.getLocalizedMessage()); + // JOptionPane.showMessageDialog(null, dce.getLocalizedMessage()); } try { @@ -956,6 +1007,16 @@ public void setXMLElement(final Element params) { } catch (DataConversionException dce) { this._webport = 80; } + try { + this.setCrossPoolMatch(params.getAttribute(StringConstants.CS_CROSSMATCHPOOL).getBooleanValue()); + + } catch (NullPointerException npe6) { + this.setCrossPoolMatch(false); + } + catch (DataConversionException dce2) + { + this.setCrossPoolMatch(false); + } } @Override @@ -1116,19 +1177,47 @@ public void addCriteria(Criteria c) { public void removeCriteria(int c) { mCriterias.remove(c); } + + /** + * @return the mCriterias + */ + public int getFormulaCount() { + return mFormulas.size(); + } /** - * @return the mGame + * @param i + * @return the mCriterias */ - public int getGame() { - return mGame; + public Formula getFormula(int i) { + return mFormulas.get(i); + } + + public int getIndexOfFormula(Formula f) { + return mFormulas.indexOf(f); } /** - * @param mGame the mGame to set + * Clear the criterias array + */ + public void clearFormulas() { + mFormulas.clear(); + } + + /** + * + * @param c */ - public void setGame(int mGame) { - this.mGame = mGame; + public void addFormula(Formula f) { + mFormulas.add(f); + } + + /** + * + * @param c + */ + public void removeFormula(int f) { + mFormulas.remove(f); } /** @@ -1159,6 +1248,7 @@ public int getPointsTeamLargeVictory() { public int getPointsTeamHugeVictory() { return mPointsTeamHugeVictory; } + /** * @param mPointsIndivLargeVictory the mPointsIndivLargeVictory to set */ @@ -1169,7 +1259,7 @@ public void setPointsIndivLargeVictory(int mPointsIndivLargeVictory) { public void setPointsTeamLargeVictory(int mPointsTeamLargeVictory) { this.mPointsTeamLargeVictory = mPointsTeamLargeVictory; } - + public void setPointsTeamHugeVictory(int points) { this.mPointsTeamHugeVictory = points; } @@ -1290,7 +1380,7 @@ public int getGapLargeVictory() { public float getGapTeamLargeVictory() { return mGapTeamLargeVictory; } - + public float getGapTeamHugeVictory() { return mGapTeamHugeVictory; } @@ -1305,7 +1395,7 @@ public void setGapLargeVictory(int mGapLargeVictory) { public void setGapTeamLargeVictory(float mGapLargeVictory) { this.mGapTeamLargeVictory = mGapLargeVictory; } - + public void setGapTeamHugeVictory(float mGapLargeVictory) { this.mGapTeamHugeVictory = mGapLargeVictory; } @@ -1883,6 +1973,7 @@ public void setUseLargeVictory(boolean use) { public void setUseTeamLargeVictory(boolean use) { this.mUseTeamLargeVictory = use; } + public void setUseTeamHugeVictory(boolean use) { this.mUseTeamHugeVictory = use; } @@ -1906,7 +1997,7 @@ public boolean isUseLargeVictory() { public boolean isUseTeamLargeVictory() { return mUseTeamLargeVictory; } - + public boolean isUseTeamHugeVictory() { return mUseTeamHugeVictory; } @@ -1949,7 +2040,6 @@ public boolean equals(final Object obj) { result &= params.mBestResultsIndiv == this.mBestResultsIndiv; result &= params.mBestResultsTeam == this.mBestResultsTeam; result &= params.mClansMembersNumber == this.mClansMembersNumber; - result &= params.mGame == this.mGame; result &= params.mGapLargeVictory == this.mGapLargeVictory; result &= params.mGapLittleLost == this.mGapLittleLost; @@ -2006,6 +2096,8 @@ public boolean equals(final Object obj) { result &= params.mUseLargeVictory == this.mUseLargeVictory; result &= params.mUseLittleLoss == this.mUseLittleLoss; + result &= params.mCrossPoolMatch; + result &= params.mTeamPairing == this.mTeamPairing; result &= params.mTeamIndivPairing == this.mTeamIndivPairing; @@ -2015,6 +2107,11 @@ public boolean equals(final Object obj) { for (Criteria c : mCriterias) { result &= params.mCriterias.contains(c); } + + result &= params.mFormulas.size() == this.mFormulas.size(); + for (Formula f : mFormulas) { + result &= params.mFormulas.contains(f); + } } return result; } diff --git a/src/tourma/data/RosterType.java b/src/tourma/data/RosterType.java index 223d8ec7..66be5993 100644 --- a/src/tourma/data/RosterType.java +++ b/src/tourma/data/RosterType.java @@ -33,22 +33,6 @@ public void setUID(int UID) { private static ResourceBundle sBundle = null; - /** - * - */ - public static final int C_BLOOD_BOWL = 1; - - /** - * - */ - public static final int C_DREAD_BALL = 2; - /*public static String[] p_Rosters={ - "Amazone", "Bas-Fonds", "Chaos", "Elfe", "Elfe Sylvain", "Elfe Noir", - "Gobelin", "Halfling", "Haut Elfe", "Homme lézard", "Humain", "Khemri", - "Mort-Vivant", "Nain", "Nain du chaos", "Necromantique", "Nordique", - "Nurgle", "Ogre", "Orque", "Pacte Chaotique", "Skaven", "Slann", "Vampire" - };*/ - /** * */ @@ -83,9 +67,8 @@ public static void pull(HashMap types) { rt.setUID(type.getUID()); } } - - if (mRosterTypes.size()!=types.size()) - { + + if (mRosterTypes.size() != types.size()) { mRosterTypes.clear(); pull(types); } @@ -147,6 +130,8 @@ public static void initCollection() { mRostersNames.add(translate("SlannKey")); mRostersNames.add(translate("VampireKey")); mRostersNames.add(translate("BretonianKey")); + mRostersNames.add(translate("SnotlingsKey")); + mRostersNames.add(translate("OldWorldAllianceKey")); mRosterTypes.clear(); mRosterTypes.put(translate("AmazonKey"), new RosterType(translate("AmazonKey"))); @@ -174,7 +159,10 @@ public static void initCollection() { mRosterTypes.put(translate("ChaosPactKey"), new RosterType(translate("ChaosPactKey"))); mRosterTypes.put(translate("SkavenKey"), new RosterType(translate("SkavenKey"))); mRosterTypes.put(translate("SlannKey"), new RosterType(translate("SlannKey"))); - mRosterTypes.put(translate("VampireKey"), new RosterType(translate("VampireKey"))); + mRosterTypes.put(translate("VampireKey"), new RosterType(translate("VampireKey"))); + mRosterTypes.put(translate("SnotlingsKey"), new RosterType(translate("SnotlingsKey"))); + mRosterTypes.put(translate("OldWorldAllianceKey"), new RosterType(translate("OldWorldAllianceKey"))); + } /** @@ -185,29 +173,8 @@ public static void initCollection(final int game) { mRostersNames.clear(); - switch (game) { - case C_BLOOD_BOWL: - initCollection(); - break; - case C_DREAD_BALL: - mRostersNames.clear(); - mRostersNames.add(translate("CORPORATION")); - mRostersNames.add(translate("ORX")); - mRostersNames.add(translate("VER-MYNS")); - mRostersNames.add(translate("FORGE FATHERS")); - mRostersNames.add(translate("JUDWANS")); - mRostersNames.add(translate("Z'ZORS")); - mRostersNames.add(translate("ROBOTS")); - mRostersNames.add(translate("FEMALES CORPORATION")); - mRostersNames.add(translate("ZEES")); - mRostersNames.add(translate("ASTERIANS")); - mRostersNames.add(translate("NAMELESS")); - mRostersNames.add(translate("TARATONS")); - break; - default: - initCollection(); - break; - } + initCollection(); + } /** @@ -250,7 +217,7 @@ public static String getRosterName(String name) { result = translate("UnderworldKey"); break; case "Bretonniens": - result=translate("BretonianKey"); + result = translate("BretonianKey"); break; case "Chaos": result = translate("ChaosKey"); @@ -321,6 +288,12 @@ public static String getRosterName(String name) { case "Bretonnien": result = translate("BretonianKey"); break; + case "Snotlings": + result = translate("SnotlingsKey"); + break; + case "Alliance du Vieux Monde": + result = translate("OldWorldAllianceKey"); + break; } return result; } @@ -437,82 +410,90 @@ public static String[] getRostersNames() { public static String getRosterTranslation(final String source) { String result = translate("UNKNOWN"); if (source.equals(translate("AmazonKey"))) { - result = translate("AMAZONS"); + result = translate("Amazons"); } if (translate("UnderworldKey").equals(source)) { - result = translate("UNDERWORLD"); + result = translate("Underworld"); } if (translate("BretonianKey").equals(source)) { - result=translate("BRETONNIANS"); + result = translate("Bretonnians"); } if (translate("ChaosKey").equals(source)) { - result = translate("CHAOS"); + result = translate("Chaos"); } if (source.equals(translate("ElfKey"))) { - result = translate("ELVES"); + result = translate("Elves"); } - if ((source.equals(translate("WoodElfKey")))||(source.equals(translate("WoodElfKey2")))) { - result = translate("WOOD ELVES"); + if ((source.equals(translate("WoodElfKey"))) || (source.equals(translate("WoodElfKey2")))) { + result = translate("Wood Elves"); } - if ((source.equals(translate("DarkElfKey")))||(source.equals(translate("DarkElfKey2")))) { - result = translate("DARK ELVES"); + if ((source.equals(translate("DarkElfKey"))) || (source.equals(translate("DarkElfKey2")))) { + result = translate("Dark Elves"); } if (source.equals(translate("GoblinKey"))) { - result = translate("GOBLINS"); + result = translate("Goblins"); } if (source.equals(translate("HalflingKey"))) { - result = translate("HALFLINGS"); + result = translate("Halflings"); } if (source.equals(translate("HighElfKey"))) { - result = translate("HIGH ELVES"); + result = translate("High Elves"); } - if ((source.equals(translate("LizardmenKey")))||(source.equals(translate("LizardmenKey2")))) { - result = translate("LIZARDMEN"); + if ((source.equals(translate("LizardmenKey"))) || (source.equals(translate("LizardmenKey2")))) { + result = translate("Lizardmen"); } if (source.equals(translate("HumanKey"))) { - result = translate("HUMANS"); + result = translate("Humans"); } if (source.equals(translate("KhemriKey"))) { - result = translate("KHEMRI"); + result = translate("Khemri"); } if (source.equals(translate("UndeadKey"))) { - result = translate("UNDEAD"); + result = translate("Undead"); } if (source.equals(translate("DwarfKey"))) { - result = translate("DWARVES"); + result = translate("Dwarves"); } - if ((source.equals(translate("ChaosDwarfKey")))||(source.equals(translate("ChaosDwarfKey2")))||(source.equals("Nain du Chaos"))) { - result = translate("CHAOS DWARVES"); + if ((source.equals(translate("ChaosDwarfKey"))) || (source.equals(translate("ChaosDwarfKey2"))) || (source.equals("Nain du Chaos"))) { + result = translate("Chaos Dwarves"); } - if ((source.equals(translate("NecromanticKey")))||(source.equals("Necromantiques"))) { - result = translate("NECROMANTIC"); + if ((source.equals(translate("NecromanticKey"))) || (source.equals("Necromantiques"))) { + result = translate("Necromantic"); } - if ((source.equals(translate("NorseKey")))||(source.equals("Nordiques"))) { - result = translate("NORSE"); + if ((source.equals(translate("NorseKey"))) || (source.equals("Nordiques"))) { + result = translate("Norse"); } if (source.equals(translate("NurgleKey"))) { - result = translate("NURGLE'S ROTTERS"); + result = translate("Nurgle's Rotters"); } if (source.equals(translate("OgreKey"))) { - result = translate("OGRES"); + result = translate("Ogres"); } + + String tmp = translate("OrcKey"); if (source.equals(translate("OrcKey"))) { - result = translate("ORC"); + result = translate("Orc"); } if (source.equals(translate("ChaosPactKey"))) { - result = translate("CHAOS PACT"); + result = translate("Chaos Pact"); } if (source.equals(translate("SkavenKey"))) { - result = translate("SKAVEN"); + result = translate("Skaven"); } if (source.equals(translate("SlannKey"))) { - result = translate("SLANN"); + result = translate("Slann"); } if (source.equals(translate("VampireKey"))) { - result = translate("VAMPIRES"); + result = translate("Vampires"); } if (source.equals(translate("KhorneKey")) || source.equals(translate("KhornesDaemonsKey"))) { - result = translate("KHORNE"); + result = translate("Khorne"); + } + if (source.equals(translate("SnotlingsKey"))) { + result = translate("Snotlings"); + } + if (source.equals(translate("OldWorldAllianceKey"))) { + result = translate("Old World Alliance"); } return result; } diff --git a/src/tourma/data/Round.java b/src/tourma/data/Round.java index 73c6ecc6..4db79a68 100644 --- a/src/tourma/data/Round.java +++ b/src/tourma/data/Round.java @@ -69,8 +69,8 @@ public void setUID(int UID) { /** * */ - private boolean mLooserCup = false; - private boolean mThirdPlace = false; + //private boolean mLooserCup = false; + //private boolean mThirdPlace = false; private double mMinBonus = 1.0; private double mMaxBonus = 1.0; @@ -120,10 +120,10 @@ public void pull(Round round) { this.mCup = round.mCup; this.mCupMaxTour = round.mCupMaxTour; this.mHour = round.mHour; - this.mLooserCup = round.mLooserCup; +// this.mLooserCup = round.mLooserCup; this.mMaxBonus = round.mMaxBonus; this.mMinBonus = round.mMinBonus; - this.mThirdPlace = round.mThirdPlace; +// this.mThirdPlace = round.mThirdPlace; for (Match match : round.mMatchs) { boolean bFound = false; @@ -375,8 +375,8 @@ public Element getXMLElement() { } round.setAttribute(StringConstants.CS_DATE, format.format(this.getHour())); - round.setAttribute(StringConstants.CS_LOOSERCUP, Boolean.toString(isLooserCup())); - round.setAttribute(StringConstants.CS_THIRDPLACE, Boolean.toString(isThirdPlace())); +// round.setAttribute(StringConstants.CS_LOOSERCUP, Boolean.toString(isLooserCup())); +// round.setAttribute(StringConstants.CS_THIRDPLACE, Boolean.toString(isThirdPlace())); round.setAttribute(StringConstants.CS_CUP, Boolean.toString(isCup())); round.setAttribute(StringConstants.CS_TOUR, Integer.toString(getCupTour())); round.setAttribute(StringConstants.CS_MAXTOUR, Integer.toString(getCupMaxTour())); @@ -401,8 +401,8 @@ public Element getXMLElementForDisplay() { final Element round = new Element(StringConstants.CS_ROUND); round.setAttribute(StringConstants.CS_DATE, format.format(this.getHour())); - round.setAttribute(StringConstants.CS_LOOSERCUP, Boolean.toString(isLooserCup())); - round.setAttribute(StringConstants.CS_THIRDPLACE, Boolean.toString(isThirdPlace())); +// round.setAttribute(StringConstants.CS_LOOSERCUP, Boolean.toString(isLooserCup())); +// round.setAttribute(StringConstants.CS_THIRDPLACE, Boolean.toString(isThirdPlace())); round.setAttribute(StringConstants.CS_CUP, Boolean.toString(isCup())); round.setAttribute(StringConstants.CS_TOUR, Integer.toString(getCupTour())); round.setAttribute(StringConstants.CS_MAXTOUR, Integer.toString(getCupMaxTour())); @@ -435,11 +435,11 @@ public void setXMLElement(final Element round) { } try { - setLooserCup(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_LOOSERCUP))); +// setLooserCup(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_LOOSERCUP))); setCup(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_CUP))); setCupTour(Integer.parseInt(round.getAttributeValue(StringConstants.CS_TOUR))); setCupMaxTour(Integer.parseInt(round.getAttributeValue(StringConstants.CS_MAXTOUR))); - setThirdPlace(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_THIRDPLACE))); + // setThirdPlace(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_THIRDPLACE))); } catch (NumberFormatException e) { LOG.log(Level.FINE, e.getLocalizedMessage()); } @@ -524,13 +524,13 @@ public void setXMLElementForDisplay(final Element round) { } try { - setLooserCup(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_LOOSERCUP))); +// setLooserCup(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_LOOSERCUP))); setCup(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_CUP))); setCupTour(Integer.parseInt(round.getAttributeValue(StringConstants.CS_TOUR))); setCupMaxTour(Integer.parseInt(round.getAttributeValue(StringConstants.CS_MAXTOUR))); setMinBonus(Double.parseDouble(round.getAttributeValue(StringConstants.CS_MINCOEF))); setMaxBonus(Double.parseDouble(round.getAttributeValue(StringConstants.CS_MAXCOEF))); - setThirdPlace(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_THIRDPLACE))); +// setThirdPlace(Boolean.parseBoolean(round.getAttributeValue(StringConstants.CS_THIRDPLACE))); } catch (NumberFormatException e) { LOG.log(Level.FINE, e.getLocalizedMessage()); } @@ -612,17 +612,17 @@ public void setCupMaxTour(int mCupMaxTour) { /** * @return the mLooserCup */ - public boolean isLooserCup() { + /*public boolean isLooserCup() { return mLooserCup; - } + }*/ /** * @param mLooserCup the mLooserCup to set */ - public void setLooserCup(boolean mLooserCup) { + /*public void setLooserCup(boolean mLooserCup) { this.mLooserCup = mLooserCup; updated = true; - } + }*/ /** * @@ -652,7 +652,7 @@ public boolean equals(final Object obj) { result &= this.mCupTour == r.mCupTour; result &= this.mCupMaxTour == r.mCupMaxTour; result &= this.mHour.toString().equals(r.mHour.toString()); - result &= this.mLooserCup == r.mLooserCup; + //result &= this.mLooserCup == r.mLooserCup; result &= Math.abs(this.mMaxBonus - r.mMaxBonus) < 0.0001; result &= Math.abs(this.mMinBonus - r.mMinBonus) < 0.0001; result &= this.mMatchs.size() == r.mMatchs.size(); @@ -668,14 +668,14 @@ public boolean equals(final Object obj) { return result; } - public boolean isThirdPlace() { + /*public boolean isThirdPlace() { return mThirdPlace; } public void setThirdPlace(boolean b) { mThirdPlace = b; updated = true; - } + }*/ public void recomputeMatchs() { for (int i = 0; i < mMatchs.size(); i++) { diff --git a/src/tourma/data/TeamMatch.java b/src/tourma/data/TeamMatch.java index fc32a1d4..53570e51 100644 --- a/src/tourma/data/TeamMatch.java +++ b/src/tourma/data/TeamMatch.java @@ -1059,9 +1059,9 @@ int getOppPointsByTeam(final Team t, TeamMatch tm, boolean includeCurrent) { if ((includeCurrent) || ((!includeCurrent) && (om != tm))) { value += getPointsByTeam((Team) opponent, om, true, true); } - if (om == tm) { + /*if (om == tm) { break; - } + }*/ } } } @@ -1239,7 +1239,15 @@ public int getValue(final Team t, final int rankingType, boolean teamVictory) { break; default: if (rankingType > Parameters.C_MAX_RANKING) { - value += getValue(MjtRanking.getCriteriaByValue(rankingType), MjtRanking.getSubtypeByValue(rankingType), t); + if (rankingType Parameters.C_MAX_RANKING) { - value += getValue(MjtRanking.getCriteriaByValue(rankingType), MjtRanking.getSubtypeByValue(rankingType), t); + if (rankingType < Parameters.C_MAX_RANKING + 3 * Tournament.getTournament().getParams().getCriteriaCount()) { + value += getValue(MjtRanking.getCriteriaByValue(rankingType), MjtRanking.getSubtypeByValue(rankingType), t); + } else { + int f = rankingType - 3 * Tournament.getTournament().getParams().getCriteriaCount() - Parameters.C_MAX_RANKING - 1; + Formula formula = Tournament.getTournament().getParams().getFormula(f); + value += getValue(formula, t); + } } } } @@ -1421,6 +1435,23 @@ public int getValue(Criteria crit, int subtype, Competitor c) { } return value; } + + public int getValue(Formula form, Competitor c) { + int value = 0; + if (c == mCompetitor1) { + for (int i = 0; i < this.getMatchCount(); i++) { + CoachMatch cm = getMatch(i); + value += cm.getValue(form, cm.getCompetitor1()); + } + } + if (c == mCompetitor2) { + for (int i = 0; i < this.getMatchCount(); i++) { + CoachMatch cm = getMatch(i); + value += cm.getValue(form, cm.getCompetitor2()); + } + } + return value; + } /** * Recalculate the values fot this match diff --git a/src/tourma/data/Tournament.java b/src/tourma/data/Tournament.java index a98e363e..7c835f90 100644 --- a/src/tourma/data/Tournament.java +++ b/src/tourma/data/Tournament.java @@ -151,6 +151,15 @@ public static Tournament getTournament() { */ private final ArrayList mGroups; + private Cup mCup; + + public Cup getCup() { + return mCup; + } + public void setCup(Cup cup) { + mCup=cup; + } + private Tournament() { RosterType.initCollection(); @@ -763,6 +772,12 @@ private void saveXML(final java.io.File file, final boolean withRanking) { final Element team = mTeam.getXMLElement(); document.addContent(team); } + + // Save Cup + if (mCup!=null) { + Element cup = mCup.getXMLElement(); + document.addContent(cup); + } // Save rounds for (int i = 0; i < mRounds.size(); i++) { @@ -774,7 +789,7 @@ private void saveXML(final java.io.File file, final boolean withRanking) { // Build list of rankings final ArrayList rankings = new ArrayList<>(); final boolean forPool = (mPools.size() > 0) && (!mRounds.get(i).isCup()); - + final boolean forCup = mRounds.get(i).isCup(); rankings.add( new Ranking( Ranking.CS_Individual, @@ -786,7 +801,7 @@ private void saveXML(final java.io.File file, final boolean withRanking) { this.mParams.getRankingIndiv3(), this.mParams.getRankingIndiv4(), this.mParams.getRankingIndiv5(), - mCoachs, false, false, forPool), + mCoachs, false, false, forPool,forCup), getRankingTypes(false))); if (this.mParams.isTeamTournament()) { rankings.add( @@ -831,7 +846,7 @@ private void saveXML(final java.io.File file, final boolean withRanking) { this.mParams.getRankingIndiv3(), this.mParams.getRankingIndiv4(), this.mParams.getRankingIndiv5(), - list, false, false, false), + list, false, false, false,false), getRankingTypes(false))); } } @@ -1044,8 +1059,9 @@ protected String generateCSVRanking(final int round, final boolean withRoster, f } final boolean forPool = (mPools.size() > 0) && (!mRounds.get(round).isCup()); + final boolean forCup = mRounds.get(round).isCup(); final MjtRankingIndiv ri = new MjtRankingIndiv(round, mParams.getRankingIndiv1(), mParams.getRankingIndiv2(), mParams.getRankingIndiv3(), mParams.getRankingIndiv4(), mParams.getRankingIndiv5(), - mCoachs, false, false, forPool); + mCoachs, false, false, forPool,forCup); for (int i = 0; i < ri.getRowCount(); i++) { final String coach = (String) ri.getValueAt(i, 2); a.append(Integer.toString(i + 1)); @@ -1481,6 +1497,17 @@ private void loadXMLv3(final Element racine) { mPools.add(po); } + Element cup=racine.getChild(StringConstants.CS_CUP); + if (cup!=null) + { + if (mCup==null) + { + mCup=new Cup(); + } + mCup.setXMLElement(cup); + } + + /* Rounds */ List rounds = racine.getChildren(StringConstants.CS_ROUND); if (rounds.isEmpty()) { @@ -1516,14 +1543,14 @@ public void loadXML(final java.io.File file) { } } catch (NumberFormatException npe) { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), "Obsolete Version"); + // JOptionPane.showMessageDialog(MainFrame.getMainFrame(), "Obsolete Version"); } } catch (JDOMException e) { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), e.getLocalizedMessage()); + // JOptionPane.showMessageDialog(MainFrame.getMainFrame(), e.getLocalizedMessage()); } catch (IOException e) { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), e.getMessage()); + // JOptionPane.showMessageDialog(MainFrame.getMainFrame(), e.getMessage()); } } diff --git a/src/tourma/data/Value.java b/src/tourma/data/Value.java index 2f652d17..13eabe03 100644 --- a/src/tourma/data/Value.java +++ b/src/tourma/data/Value.java @@ -1,121 +1,158 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package tourma.data; - -import java.io.Serializable; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * - * @author Administrateur - */ -public class Value implements Serializable { - - protected static AtomicInteger sGenUID = new AtomicInteger(0); - protected int UID = sGenUID.incrementAndGet(); - - public boolean isUpdated() { - return updated; - } - - public void setUpdated(boolean updated) { - this.updated = updated; - } - protected boolean updated = false; - - public int getUID() { - return UID; - } - - public void setUID(int UID) { - this.UID = UID; - } - - public void pull(Value value) { - this.UID = value.UID; - this.mValue1 = value.mValue1; - this.mValue2 = value.mValue2; - } - - public void push(Value value) { - if (value.isUpdated()) { - this.UID = value.UID; - if (value.mValue1 > -1) { - this.mValue1 = value.mValue1; - } - if (value.mValue2 > -1) { - this.mValue2 = value.mValue2; - } - } - } - - /** - * Name of the criteria - */ - private Criteria mCriteria; - /** - * Value for the coach 1 - */ - private int mValue1; - /** - * Value for the coach 2 - */ - private int mValue2; - - /** - * - * @param criteria - */ - public Value(final Criteria criteria) { - mCriteria = criteria; - } - - /** - * @return the mCriteria - */ - public Criteria getCriteria() { - return mCriteria; - } - - /** - * @param mCriteria the mCriteria to set - */ - public void setCriteria(Criteria mCriteria) { - this.mCriteria = mCriteria; - updated=true; - } - - /** - * @return the mValue1 - */ - public int getValue1() { - return mValue1; - } - - /** - * @param mValue1 the mValue1 to set - */ - public void setValue1(int mValue1) { - updated=true; - this.mValue1 = mValue1; - } - - /** - * @return the mValue2 - */ - public int getValue2() { - - return mValue2; - } - - /** - * @param mValue2 the mValue2 to set - */ - public void setValue2(int mValue2) { - updated=true; - this.mValue2 = mValue2; - } - -} +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.data; + +import java.io.Serializable; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * + * @author Administrateur + */ +public class Value implements Serializable { + + protected static AtomicInteger sGenUID = new AtomicInteger(0); + protected int UID = sGenUID.incrementAndGet(); + + public boolean isUpdated() { + return updated; + } + + public void setUpdated(boolean updated) { + this.updated = updated; + } + protected boolean updated = false; + + public int getUID() { + return UID; + } + + public void setUID(int UID) { + this.UID = UID; + } + + public void pull(Value value) { + this.UID = value.UID; + this.mValue1 = value.mValue1; + this.mValue2 = value.mValue2; + } + + public void push(Value value) { + if (value.isUpdated()) { + this.UID = value.UID; + if (value.mValue1 > -1) { + this.mValue1 = value.mValue1; + } + if (value.mValue2 > -1) { + this.mValue2 = value.mValue2; + } + } + } + + /** + * Name of the criteria + */ + private Criteria mCriteria; + + /** + * Name of the criteria + */ + private Formula mFormula; + + + public enum e_ValueType { + E_CRITERIA, + E_FORMULA; + }; + + private e_ValueType _valueType; + + /** + * Value for the coach 1 + */ + private int mValue1; + /** + * Value for the coach 2 + */ + private int mValue2; + + /** + * + * @param criteria + */ + public Value(final Criteria criteria) { + mCriteria = criteria; + _valueType=e_ValueType.E_CRITERIA; + } + + + public Value(final Formula form) { + mFormula = form; + _valueType=e_ValueType.E_FORMULA; + } + /** + * @return the mCriteria + */ + public Criteria getCriteria() { + if (_valueType==e_ValueType.E_CRITERIA) + { + return mCriteria; + } + else + { + return null; + } + } + public Formula getFormula() { + if (_valueType==e_ValueType.E_FORMULA) + { + return mFormula; + } + else + { + return null; + } + } + /** + * @param mCriteria the mCriteria to set + */ + public void setCriteria(Criteria mCriteria) { + this.mCriteria = mCriteria; + updated = true; + } + + /** + * @return the mValue1 + */ + public int getValue1() { + return mValue1; + } + + /** + * @param mValue1 the mValue1 to set + */ + public void setValue1(int mValue1) { + updated = true; + this.mValue1 = mValue1; + + } + + /** + * @return the mValue2 + */ + public int getValue2() { + + return mValue2; + } + + /** + * @param mValue2 the mValue2 to set + */ + public void setValue2(int mValue2) { + updated = true; + this.mValue2 = mValue2; + } + +} diff --git a/src/tourma/images/Formula.png b/src/tourma/images/Formula.png new file mode 100644 index 00000000..b1dcf583 Binary files /dev/null and b/src/tourma/images/Formula.png differ diff --git a/src/tourma/languages/Translate.java b/src/tourma/languages/Translate.java index cdb513fc..12e5790a 100644 --- a/src/tourma/languages/Translate.java +++ b/src/tourma/languages/Translate.java @@ -36,6 +36,8 @@ public class Translate { public final static String CS_Inactive = "INACTIF"; public final static String CS_Critera_Name = "NOM CRITÈRE"; public final static String CS_Critera_Accronym = "ACCRONYM"; + public final static String CS_Formula_Name ="NOM FORMULE"; + public final static String CS_Formula_Formula ="FORMULE"; public final static String CS_Error = "ERROR"; public final static String CS_Points_Plus = "POINTS +"; public final static String CS_Points_Minus = "POINTS -"; diff --git a/src/tourma/languages/copyrights.properties b/src/tourma/languages/copyrights.properties index d8146783..b40f7fcb 100644 --- a/src/tourma/languages/copyrights.properties +++ b/src/tourma/languages/copyrights.properties @@ -10,7 +10,7 @@ FREEMARKER_COPYRIGHT=freemarker_copyright FREEMARKER=freemarker JFREECHART_COPYRIGHT=jfreechart_copyright JFREECHART=jfreechart -Date=date +DATE=date VERSION=version EKIT=ekit EKIT_COPYRIGHT=ekit_copyright \ No newline at end of file diff --git a/src/tourma/languages/language.properties b/src/tourma/languages/language.properties index 4ebda716..8358fdfd 100644 --- a/src/tourma/languages/language.properties +++ b/src/tourma/languages/language.properties @@ -301,7 +301,7 @@ OpponentGroup=Opposing group #JPNParamCriterias CRIT\u00c8RE=Criteria RETIRER\ CRIT\u00c8RE=Remove criteria -AJOUTER\ CRIT\u00c8RE=Add criteria +AJOUTER\ CRIT\u00c8RE=Add Formula TableBonus=Table bonus TableMultiplicator=Bonus table factor TablePoints=Table points @@ -1122,3 +1122,34 @@ Teammates\ victories=Teammates victories Include\ the\ report\ of\ the\ members=Include the report of the members Choisissez\ le\ type\ de\ joueur=Choose type of player +IgnoreCapitalLetter=Ignorer la casse +PoolOption=Prendre en compte les classements de poules +CupOption=Prendre en compte les classements la coupe +CupOptions=Options de la coupe +CupType=Type de coupe +CupTypeClassic=Classique (\u00e9limination directe) +CupTypeClassicThirdPlace=Classique + 3\u00e8me place +CupTypeRankingMatches=Matchs de classement +CupTypeLooserCup=Double \u00e9limination +CupInitialDraw=Tirage initial +CupDrawRandom=Au hasard +CupDrawRanking=Ordre de classement +CupDrawManual=Choix Manuel +CupDrawShuffle=M\u00e9langer entre les tours +CupSwissForLoosers=Ronde suisse pour les joueurs restants +CupRoundNumber=Nombre de tours +CupDrawCategories=Categories m\u00e9lang\u00e9es +CupCategoriesMixed=Cat\u00e9gories m\u00e9lang\u00e9es +CategoriesAsConferences=Cat\u00e9gories (utilisables\ncomme les conf\u00e9rences) +CupDrawCategoriesCrossed=Categories crois\u00e9es +CupCategoriesNotMixed=Cat\u00e9gories non m\u00e9lang\u00e9es + + +Formulas=Formulas +Impair\ in\ pool=Odd number in the pool. Do you accept cross pool matches ? +AJOUTER\ FORMULE=Add Formula +AJOUTER\ FORMULA=Add Formula +RETIRER\ FORMULE=Remove formula +NOM\ FORMULE=Formula's name +FORMULE=Formula +Variables\ possibles=The variables names usable in the formulas are the accronyms of the criterias with (1 or 2). 1 is For the coach, and 2 for his opponent. For example, if Tds is the accronym of touchdown, 2*Tds1-Tds2 is the twice the number of touchdowns by the coach minus once the touchdown by the opponents. \ No newline at end of file diff --git a/src/tourma/languages/language_fr.properties b/src/tourma/languages/language_fr.properties index 33f11439..383644a4 100644 --- a/src/tourma/languages/language_fr.properties +++ b/src/tourma/languages/language_fr.properties @@ -2352,4 +2352,15 @@ Include\ the\ reports\ of\ the\ members=Inclure les rapports des membres Tier\ ranking=Rosters Teammates\ points=Pts mates -Teammates\ victories=VND mates \ No newline at end of file +Teammates\ victories=VND mates + +Impair\ in\ pool=Nombre impair par poule. Acceptez vous les matchs crois\u00e9s entre poules ? +AJOUTER\ FORMULE=Ajouter Formule +AJOUTER\ FORMULA=Ajouter Formule +RETIRER\ FORMULE=Retirer Formule +NOM\ FORMULE=Nom de la Formule +FORMULE=Formule + +Formulas=Formules + +Variables\ possibles=les variables utilisables dans les formules correspondent aux accronymes des crit\u00e8res avec les suffixes 1 ou 2. 1 est pour le coach et 2 pour les adversaires. par exemple, si l'accronyme des touchdowns et Tds, 2*Tds1-Tds2 est 2fois les touchdowns pour et 1 fois les touchdowns contre. \ No newline at end of file diff --git a/src/tourma/languages/rosters.properties b/src/tourma/languages/rosters.properties index e5630548..e405078c 100644 --- a/src/tourma/languages/rosters.properties +++ b/src/tourma/languages/rosters.properties @@ -31,6 +31,9 @@ SkavenKey=Skaven SlannKey=Slann VampireKey=Vampire BretonianKey=Bretonnians +SnotlingsKey=Snotlings +OldWorldAllianceKey=Old Wolrd Alliance + # Dreadball TARATONS=Taratons @@ -75,4 +78,6 @@ Slann=Slann Vampires=Vampire Khorne=Khorne's Daemon Bretonnians=Bretonnians +Snotlings=Snotlings +Old\ World\ Alliance=Old Wolrd Alliance diff --git a/src/tourma/languages/rosters_fr.properties b/src/tourma/languages/rosters_fr.properties index 2a0cd4d3..9420cca3 100644 --- a/src/tourma/languages/rosters_fr.properties +++ b/src/tourma/languages/rosters_fr.properties @@ -34,6 +34,8 @@ SlannKey=Slanns VampireKey=Vampires KhornesDaemonsKey=D\u00e9mons de Khorne BretonianKey=Bretonniens +SnotlingsKey=Snotlings +OldWorldAllianceKey=Alliance du Vieux-Monde TARATONS=Taratons NAMELESS=Nameless @@ -103,4 +105,6 @@ Skaven=Skavens Slann=Slanns Vampires=Vampires Khorne=D\u00e9mons de Khorne -Bretonnians=Bretonniens \ No newline at end of file +Bretonnians=Bretonniens +Snotlings=Snotlings +Old\ World\ Alliance=Alliance du Vieux Monde \ No newline at end of file diff --git a/src/tourma/naf/naf_id10.xml b/src/tourma/naf/naf_id10.xml index a5bccf1c..9bc9a030 100644 --- a/src/tourma/naf/naf_id10.xml +++ b/src/tourma/naf/naf_id10.xml @@ -54,11 +54,13 @@ + + @@ -266,8 +268,8 @@ - - + + @@ -373,7 +375,7 @@ - + @@ -412,7 +414,7 @@ - + diff --git a/src/tourma/naf/naf_id11.xml b/src/tourma/naf/naf_id11.xml index 018f8863..e083f540 100644 --- a/src/tourma/naf/naf_id11.xml +++ b/src/tourma/naf/naf_id11.xml @@ -75,7 +75,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -227,7 +227,7 @@ - + @@ -346,7 +346,7 @@ - + diff --git a/src/tourma/naf/naf_id12.xml b/src/tourma/naf/naf_id12.xml index 87a84c7b..8f0b839a 100644 --- a/src/tourma/naf/naf_id12.xml +++ b/src/tourma/naf/naf_id12.xml @@ -104,7 +104,7 @@ - + @@ -205,7 +205,7 @@ - + @@ -248,7 +248,7 @@ - + diff --git a/src/tourma/naf/naf_id13.xml b/src/tourma/naf/naf_id13.xml index 0f46dfd4..d508fa15 100644 --- a/src/tourma/naf/naf_id13.xml +++ b/src/tourma/naf/naf_id13.xml @@ -67,7 +67,7 @@ - + @@ -363,7 +363,7 @@ - + @@ -416,6 +416,7 @@ + @@ -559,7 +560,7 @@ - + @@ -662,7 +663,7 @@ - + @@ -683,7 +684,7 @@ - + @@ -718,7 +719,7 @@ - + diff --git a/src/tourma/naf/naf_id14.xml b/src/tourma/naf/naf_id14.xml index afa1072d..a61c2ae7 100644 --- a/src/tourma/naf/naf_id14.xml +++ b/src/tourma/naf/naf_id14.xml @@ -328,7 +328,7 @@ - + @@ -435,7 +435,7 @@ - + @@ -453,7 +453,7 @@ - + @@ -603,7 +603,7 @@ - + @@ -617,7 +617,7 @@ - + diff --git a/src/tourma/naf/naf_id15.xml b/src/tourma/naf/naf_id15.xml index dd8815ad..ff861fa5 100644 --- a/src/tourma/naf/naf_id15.xml +++ b/src/tourma/naf/naf_id15.xml @@ -400,7 +400,7 @@ - + @@ -432,7 +432,7 @@ - + @@ -720,6 +720,7 @@ + @@ -799,7 +800,7 @@ - + @@ -822,7 +823,7 @@ - + @@ -835,7 +836,7 @@ - + diff --git a/src/tourma/naf/naf_id16.xml b/src/tourma/naf/naf_id16.xml index 0d2822d5..3ff8e2cc 100644 --- a/src/tourma/naf/naf_id16.xml +++ b/src/tourma/naf/naf_id16.xml @@ -67,7 +67,7 @@ - + @@ -302,7 +302,7 @@ - + @@ -446,7 +446,7 @@ - + diff --git a/src/tourma/naf/naf_id17.xml b/src/tourma/naf/naf_id17.xml index f54b6952..bbe2bb88 100644 --- a/src/tourma/naf/naf_id17.xml +++ b/src/tourma/naf/naf_id17.xml @@ -53,7 +53,7 @@ - + @@ -219,7 +219,7 @@ - + @@ -254,7 +254,7 @@ - + @@ -467,7 +467,7 @@ - + diff --git a/src/tourma/naf/naf_id18.xml b/src/tourma/naf/naf_id18.xml index 8aa0d9e9..7e5eae30 100644 --- a/src/tourma/naf/naf_id18.xml +++ b/src/tourma/naf/naf_id18.xml @@ -41,7 +41,7 @@ - + @@ -123,7 +123,7 @@ - + @@ -252,7 +252,7 @@ - + @@ -367,7 +367,7 @@ - + @@ -713,7 +713,7 @@ - + diff --git a/src/tourma/naf/naf_id19.xml b/src/tourma/naf/naf_id19.xml index 2a9c1ca6..f8885b31 100644 --- a/src/tourma/naf/naf_id19.xml +++ b/src/tourma/naf/naf_id19.xml @@ -43,7 +43,7 @@ - + @@ -57,7 +57,7 @@ - + @@ -213,7 +213,7 @@ - + @@ -273,10 +273,11 @@ + - + @@ -463,7 +464,7 @@ - + @@ -548,7 +549,7 @@ - + @@ -616,7 +617,7 @@ - + diff --git a/src/tourma/naf/naf_id2.xml b/src/tourma/naf/naf_id2.xml index 23696458..004dd90c 100644 --- a/src/tourma/naf/naf_id2.xml +++ b/src/tourma/naf/naf_id2.xml @@ -218,7 +218,7 @@ - + diff --git a/src/tourma/naf/naf_id20.xml b/src/tourma/naf/naf_id20.xml index a20d6713..4f001522 100644 --- a/src/tourma/naf/naf_id20.xml +++ b/src/tourma/naf/naf_id20.xml @@ -43,7 +43,7 @@ - + @@ -61,6 +61,7 @@ + @@ -76,7 +77,7 @@ - + @@ -373,7 +374,7 @@ - + @@ -381,7 +382,7 @@ - + @@ -434,7 +435,7 @@ - + @@ -541,7 +542,7 @@ - + @@ -582,7 +583,7 @@ - + @@ -635,7 +636,7 @@ - + @@ -760,7 +761,7 @@ - + @@ -789,7 +790,7 @@ - + diff --git a/src/tourma/naf/naf_id21.xml b/src/tourma/naf/naf_id21.xml index b0c7b4b3..01f2cbab 100644 --- a/src/tourma/naf/naf_id21.xml +++ b/src/tourma/naf/naf_id21.xml @@ -41,7 +41,7 @@ - + @@ -109,7 +109,7 @@ - + @@ -288,7 +288,7 @@ - + @@ -432,7 +432,7 @@ - + @@ -483,7 +483,7 @@ - + @@ -520,7 +520,7 @@ - + @@ -563,7 +563,7 @@ - + @@ -588,7 +588,7 @@ - + @@ -630,7 +630,7 @@ - + @@ -670,7 +670,7 @@ - + @@ -683,7 +683,7 @@ - + @@ -840,7 +840,7 @@ - + @@ -879,7 +879,7 @@ - + @@ -892,7 +892,7 @@ - + @@ -943,7 +943,7 @@ - + @@ -951,7 +951,7 @@ - + diff --git a/src/tourma/naf/naf_id22.xml b/src/tourma/naf/naf_id22.xml index 046cde6a..5bd37a7a 100644 --- a/src/tourma/naf/naf_id22.xml +++ b/src/tourma/naf/naf_id22.xml @@ -163,6 +163,7 @@ + @@ -181,7 +182,7 @@ - + @@ -197,7 +198,7 @@ - + @@ -216,7 +217,7 @@ - + @@ -261,7 +262,7 @@ - + @@ -334,7 +335,7 @@ - + @@ -356,7 +357,7 @@ - + @@ -414,7 +415,7 @@ - + @@ -518,7 +519,7 @@ - + @@ -591,7 +592,7 @@ - + @@ -647,8 +648,8 @@ - - + + @@ -664,7 +665,7 @@ - + @@ -697,7 +698,7 @@ - + @@ -758,7 +759,7 @@ - + @@ -849,7 +850,7 @@ - + @@ -863,7 +864,7 @@ - + @@ -974,7 +975,7 @@ - + diff --git a/src/tourma/naf/naf_id23.xml b/src/tourma/naf/naf_id23.xml index e9fe3d7f..dc65b984 100644 --- a/src/tourma/naf/naf_id23.xml +++ b/src/tourma/naf/naf_id23.xml @@ -35,7 +35,7 @@ - + @@ -119,7 +119,7 @@ - + @@ -157,7 +157,7 @@ - + @@ -171,10 +171,10 @@ - + - + @@ -233,7 +233,7 @@ - + @@ -254,7 +254,7 @@ - + @@ -344,7 +344,7 @@ - + @@ -362,7 +362,7 @@ - + @@ -432,7 +432,7 @@ - + @@ -458,7 +458,7 @@ - + @@ -498,14 +498,14 @@ - + - + @@ -577,7 +577,7 @@ - + @@ -704,7 +704,7 @@ - + @@ -990,7 +990,7 @@ - + diff --git a/src/tourma/naf/naf_id24.xml b/src/tourma/naf/naf_id24.xml index 5a824b09..758725ab 100644 --- a/src/tourma/naf/naf_id24.xml +++ b/src/tourma/naf/naf_id24.xml @@ -24,9 +24,9 @@ - - - + + + @@ -69,7 +69,7 @@ - + @@ -215,7 +215,7 @@ - + @@ -268,7 +268,7 @@ - + @@ -392,7 +392,7 @@ - + @@ -468,7 +468,7 @@ - + @@ -532,7 +532,7 @@ - + @@ -582,7 +582,7 @@ - + @@ -598,7 +598,7 @@ - + @@ -683,7 +683,7 @@ - + @@ -792,7 +792,7 @@ - + @@ -860,7 +860,7 @@ - + @@ -894,7 +894,7 @@ - + diff --git a/src/tourma/naf/naf_id25.xml b/src/tourma/naf/naf_id25.xml index e497f5e0..6e9d5ae2 100644 --- a/src/tourma/naf/naf_id25.xml +++ b/src/tourma/naf/naf_id25.xml @@ -69,7 +69,7 @@ - + @@ -102,7 +102,7 @@ - + @@ -159,7 +159,7 @@ - + @@ -225,7 +225,7 @@ - + @@ -324,7 +324,7 @@ - + @@ -332,7 +332,7 @@ - + @@ -375,7 +375,7 @@ - + @@ -462,14 +462,14 @@ - + - + @@ -511,7 +511,7 @@ - + @@ -529,7 +529,7 @@ - + @@ -540,7 +540,7 @@ - + @@ -602,7 +602,7 @@ - + @@ -667,13 +667,13 @@ - - + + - + @@ -702,7 +702,7 @@ - + @@ -714,11 +714,11 @@ - + - + @@ -733,19 +733,19 @@ - + - + - - + + @@ -917,12 +917,12 @@ - + - + @@ -967,14 +967,14 @@ - + - + diff --git a/src/tourma/naf/naf_id26.xml b/src/tourma/naf/naf_id26.xml index 4e048dd0..28a14524 100644 --- a/src/tourma/naf/naf_id26.xml +++ b/src/tourma/naf/naf_id26.xml @@ -42,7 +42,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -182,7 +182,7 @@ - + @@ -205,7 +205,7 @@ - + @@ -252,7 +252,7 @@ - + @@ -294,7 +294,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -404,7 +404,7 @@ - + @@ -420,6 +420,7 @@ + @@ -432,7 +433,7 @@ - + @@ -467,7 +468,7 @@ - + @@ -493,7 +494,7 @@ - + @@ -534,6 +535,7 @@ + @@ -543,7 +545,7 @@ - + @@ -589,7 +591,7 @@ - + @@ -631,6 +633,7 @@ + @@ -644,7 +647,7 @@ - + @@ -688,13 +691,13 @@ - + - + @@ -728,7 +731,7 @@ - + @@ -837,7 +840,7 @@ - + @@ -854,13 +857,13 @@ - + - + @@ -868,7 +871,7 @@ - + @@ -906,7 +909,7 @@ - + @@ -962,7 +965,7 @@ - + @@ -975,7 +978,7 @@ - + @@ -992,7 +995,7 @@ - + diff --git a/src/tourma/naf/naf_id27.xml b/src/tourma/naf/naf_id27.xml index 266c9048..0acb56d1 100644 --- a/src/tourma/naf/naf_id27.xml +++ b/src/tourma/naf/naf_id27.xml @@ -134,7 +134,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -279,15 +279,15 @@ - - + + - + @@ -297,7 +297,7 @@ - + @@ -354,10 +354,649 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/tourma/naf/naf_id28.xml b/src/tourma/naf/naf_id28.xml new file mode 100644 index 00000000..85fee5df --- /dev/null +++ b/src/tourma/naf/naf_id28.xml @@ -0,0 +1,1002 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/tourma/naf/naf_id29.xml b/src/tourma/naf/naf_id29.xml new file mode 100644 index 00000000..ae6c2ca6 --- /dev/null +++ b/src/tourma/naf/naf_id29.xml @@ -0,0 +1,1001 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/tourma/naf/naf_id3.xml b/src/tourma/naf/naf_id3.xml index 0aabd0d5..ad05b0e1 100644 --- a/src/tourma/naf/naf_id3.xml +++ b/src/tourma/naf/naf_id3.xml @@ -197,7 +197,7 @@ - + diff --git a/src/tourma/naf/naf_id30.xml b/src/tourma/naf/naf_id30.xml new file mode 100644 index 00000000..9c72e1a5 --- /dev/null +++ b/src/tourma/naf/naf_id30.xml @@ -0,0 +1,729 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/tourma/naf/naf_id4.xml b/src/tourma/naf/naf_id4.xml index 7194f6b5..1dadf992 100644 --- a/src/tourma/naf/naf_id4.xml +++ b/src/tourma/naf/naf_id4.xml @@ -74,7 +74,7 @@ - + diff --git a/src/tourma/naf/naf_id5.xml b/src/tourma/naf/naf_id5.xml index c7429172..f1b8ac5a 100644 --- a/src/tourma/naf/naf_id5.xml +++ b/src/tourma/naf/naf_id5.xml @@ -110,7 +110,7 @@ - + diff --git a/src/tourma/naf/naf_id6.xml b/src/tourma/naf/naf_id6.xml index d7a19d85..7c94f91a 100644 --- a/src/tourma/naf/naf_id6.xml +++ b/src/tourma/naf/naf_id6.xml @@ -109,7 +109,6 @@ - @@ -297,7 +296,7 @@ - + diff --git a/src/tourma/naf/naf_id7.xml b/src/tourma/naf/naf_id7.xml index 3fe5b054..054ca3cd 100644 --- a/src/tourma/naf/naf_id7.xml +++ b/src/tourma/naf/naf_id7.xml @@ -57,7 +57,7 @@ - + @@ -87,7 +87,7 @@ - + @@ -335,7 +335,7 @@ - + diff --git a/src/tourma/naf/naf_id8.xml b/src/tourma/naf/naf_id8.xml index 46697a11..4a1c0ccf 100644 --- a/src/tourma/naf/naf_id8.xml +++ b/src/tourma/naf/naf_id8.xml @@ -39,7 +39,7 @@ - + @@ -181,7 +181,7 @@ - + @@ -278,7 +278,7 @@ - + diff --git a/src/tourma/naf/naf_id9.xml b/src/tourma/naf/naf_id9.xml index 2460832d..ccecdabe 100644 --- a/src/tourma/naf/naf_id9.xml +++ b/src/tourma/naf/naf_id9.xml @@ -56,7 +56,7 @@ - + @@ -449,4 +449,5 @@ + \ No newline at end of file diff --git a/src/tourma/tableModel/MjtAnnexRank.java b/src/tourma/tableModel/MjtAnnexRank.java index 76124fff..b36fe9e9 100644 --- a/src/tourma/tableModel/MjtAnnexRank.java +++ b/src/tourma/tableModel/MjtAnnexRank.java @@ -12,6 +12,7 @@ import javax.swing.JTable; import javax.swing.JTextField; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.Tournament; /** @@ -43,6 +44,7 @@ public void setDetail(String d) */ @SuppressWarnings("ProtectedField") protected Criteria mCriteria; + protected Formula mFormula; /** * */ @@ -72,6 +74,15 @@ public MjtAnnexRank(final int round, final Criteria criteria, final int subtype, mFullRanking = full; } + public MjtAnnexRank(final int round, final Formula formula, final int subtype, final ArrayList objects, final boolean full, final int ranking_type1, final int ranking_type2, final int ranking_type3, final int ranking_type4, final int ranking_type5,final boolean round_only) { + super(round, ranking_type1, ranking_type2, ranking_type3, ranking_type4, ranking_type5, objects,round_only); + mFormula = formula; + mCriteria=null; + mSubtype = subtype; + //_ranking_type = ranking_type; + mFullRanking = full; + } + /** * this function sort the data relative to current object. */ @@ -100,6 +111,16 @@ public void setCriteria(Criteria c) mCriteria=c; } + public Formula getFormula() + { + return mFormula; + } + + public void setFormula(Formula f) + { + mFormula=f; + } + @Override abstract public String getColumnName(int col); diff --git a/src/tourma/tableModel/MjtAnnexRankClan.java b/src/tourma/tableModel/MjtAnnexRankClan.java index e2145484..d02dced8 100644 --- a/src/tourma/tableModel/MjtAnnexRankClan.java +++ b/src/tourma/tableModel/MjtAnnexRankClan.java @@ -16,6 +16,7 @@ import tourma.data.Coach; import tourma.data.CoachMatch; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.IWithNameAndPicture; import tourma.data.ObjectAnnexRanking; import tourma.data.Round; @@ -64,6 +65,21 @@ public MjtAnnexRankClan(final int round, } + public MjtAnnexRankClan(final int round, + final Formula formula, + final int subtype, final ArrayList clans, + final boolean full, + final int ranking_type1, + final int ranking_type2, + final int ranking_type3, + final int ranking_type4, + final int ranking_type5, + final boolean round_only) { + super(round, formula, subtype, clans, full, ranking_type1, ranking_type2, ranking_type3, ranking_type4, ranking_type5, round_only); + sortDatas(); + + } + /** * * @param round @@ -81,6 +97,13 @@ public MjtAnnexRankClan(final int round, final Criteria criteria, final int subt } + public MjtAnnexRankClan(final int round, final Formula formula, final int subtype, boolean full, final ArrayList clans, final boolean round_only) { + + this(round, formula, subtype, clans, full, Tournament.getTournament().getParams().getRankingIndiv1(), Tournament.getTournament().getParams().getRankingIndiv2(), Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), + round_only); + + } + @Override @SuppressWarnings("unchecked") protected void sortDatas() { @@ -152,8 +175,14 @@ private void sortDatasTeam() { //for (int l = 0; (l <= mRound) && (!bFound); l++) { final Round r = Tournament.getTournament().getRound(l); if (r.containsMatch(tm)) { - aValue.add(tm.getValue(mCriteria, mSubtype, t)); - + if (mCriteria!=null) + { + aValue.add(tm.getValue(mCriteria, mSubtype, t)); + } + else + { + aValue.add(tm.getValue(mFormula, t)); + } aValue1.add(tm.getValue(1, t)); aValue2.add(tm.getValue(2, t)); aValue3.add(tm.getValue(3, t)); @@ -304,7 +333,14 @@ private void sortDatasCoach() { //for (int l = 0; (l <= mRound) && (!bFound); l++) { final Round r = Tournament.getTournament().getRound(l); if (r.containsMatch(m)) { - aValue.add(m.getValue(mCriteria, mSubtype, c)); + if (mCriteria!=null) + { + aValue.add(m.getValue(mCriteria, mSubtype, c)); + } + else + { + aValue.add(m.getValue(mFormula, c)); + } aValue1.add(m.getValue(1, c)); aValue3.add(m.getValue(2, c)); @@ -415,7 +451,15 @@ public String getColumnName(final int col) { result = Translate.translate(Translate.CS_Clan); break; case 2: - result = mCriteria.getName(); + if (mCriteria!=null) + { + result = mCriteria.getName(); + } + else + { + result = mFormula.getName(); + } + break; default: diff --git a/src/tourma/tableModel/MjtAnnexRankIndiv.java b/src/tourma/tableModel/MjtAnnexRankIndiv.java index 5b0ddd18..57bdffb2 100644 --- a/src/tourma/tableModel/MjtAnnexRankIndiv.java +++ b/src/tourma/tableModel/MjtAnnexRankIndiv.java @@ -10,6 +10,7 @@ import tourma.data.CoachMatch; import tourma.data.Competitor; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.ObjectAnnexRanking; import tourma.data.Parameters; import tourma.data.Round; @@ -46,6 +47,12 @@ public MjtAnnexRankIndiv(final int round, final Criteria criteria, final int sub super(round, criteria, subtype, coachs, full, ranking_type1, ranking_type2, ranking_type3, ranking_type4, ranking_type5, round_only); mTeamTournament = teamTournament; sortDatas(); + } + + public MjtAnnexRankIndiv(final int round, final Formula formula, final int subtype, final ArrayList coachs, final boolean full, final int ranking_type1, final int ranking_type2, final int ranking_type3, final int ranking_type4, final int ranking_type5, final boolean teamTournament, final boolean round_only) { + super(round, formula, subtype, coachs, full, ranking_type1, ranking_type2, ranking_type3, ranking_type4, ranking_type5, round_only); + mTeamTournament = teamTournament; + sortDatas(); } @@ -95,8 +102,11 @@ protected void sortDatas() { } // test if match is in round if (bFound) { - aValue.add(m.getValue(mCriteria, mSubtype, c)); - + if (mCriteria != null) { + aValue.add(m.getValue(mCriteria, mSubtype, c)); + } else { + aValue.add(m.getValue(mFormula, c)); + } aValue1.add(m.getValue(1, c)); aValue3.add(m.getValue(2, c)); aValue3.add(m.getValue(3, c)); @@ -333,12 +343,16 @@ public String getColumnName(final int col) { result = Translate.translate(Translate.CS_Roster); break; case 4: - if (mSubtype == 0) { - result = mCriteria.getName() + " " + Translate.translate(Translate.CS_Coach); - } else if (mSubtype == 1) { - result = mCriteria.getName() + " " + Translate.translate(Translate.CS_Opponent); + if (mCriteria != null) { + if (mSubtype == 0) { + result = mCriteria.getName() + " " + Translate.translate(Translate.CS_Coach); + } else if (mSubtype == 1) { + result = mCriteria.getName() + " " + Translate.translate(Translate.CS_Opponent); + } else { + result = mCriteria.getName() + " " + Translate.translate(Translate.CS_Difference); + } } else { - result = mCriteria.getName() + " " + Translate.translate(Translate.CS_Difference); + result = mFormula.getName(); } break; default: diff --git a/src/tourma/tableModel/MjtAnnexRankTeam.java b/src/tourma/tableModel/MjtAnnexRankTeam.java index 563420fc..e033da29 100644 --- a/src/tourma/tableModel/MjtAnnexRankTeam.java +++ b/src/tourma/tableModel/MjtAnnexRankTeam.java @@ -15,6 +15,7 @@ import tourma.data.CoachMatch; import tourma.data.Criteria; import tourma.data.ETeamPairing; +import tourma.data.Formula; import tourma.data.IWithNameAndPicture; import tourma.data.ObjectAnnexRanking; import tourma.data.Parameters; @@ -52,6 +53,11 @@ public MjtAnnexRankTeam(final int round, final Criteria criteria, final int subt sortDatas(); } + public MjtAnnexRankTeam(final int round, final Formula formula, final int subtype, final ArrayList teams, final boolean full, final int ranking_type1, final int ranking_type2, final int ranking_type3, final int ranking_type4, final int ranking_type5, final boolean round_only) { + super(round, formula, subtype, teams, full, ranking_type1, ranking_type2, ranking_type3, ranking_type4, ranking_type5, round_only); + sortDatas(); + } + /** * * @param teamVictory @@ -77,6 +83,21 @@ public MjtAnnexRankTeam(final boolean teamVictory, final int round, final Criter } + public MjtAnnexRankTeam(final boolean teamVictory, final int round, final Formula formula, final int subtype, final ArrayList teams, final boolean full, final boolean round_only) { + + super(round, formula, subtype, teams, full, Tournament.getTournament().getParams().getRankingTeam1(), Tournament.getTournament().getParams().gemRankingTeam2(), Tournament.getTournament().getParams().getRankingTeam3(), Tournament.getTournament().getParams().getRankingTeam4(), Tournament.getTournament().getParams().getRankingTeam5(), round_only); + Parameters params = Tournament.getTournament().getParams(); + if (!teamVictory) { + this.mRankingType1 = params.getRankingIndiv1(); + this.mRankingType2 = params.getRankingIndiv2(); + this.mRankingType3 = params.getRankingIndiv3(); + this.mRankingType4 = params.getRankingIndiv4(); + this.mRankingType5 = params.getRankingIndiv5(); + } + sortDatas(); + + } + @Override @SuppressWarnings("unchecked") protected void sortDatas() { @@ -119,8 +140,11 @@ protected void sortDatas() { for (int i = 0; (i < rounds.size()) && (!bFound); i++) { final Round r = rounds.get(i); if (r.containsMatch(tm)) { - aValue.add(tm.getValue(mCriteria, mSubtype, t)); - + if (mCriteria != null) { + aValue.add(tm.getValue(mCriteria, mSubtype, t)); + } else { + aValue.add(tm.getValue(mFormula, t)); + } aValue1.add(tm.getValue(1, t)); aValue1.add(tm.getValue(2, t)); aValue1.add(tm.getValue(3, t)); @@ -208,8 +232,11 @@ protected void sortDatas() { } if (bFound) { - aValue.add(cm.getValue(mCriteria, mSubtype, c)); - + if (mCriteria != null) { + aValue.add(cm.getValue(mCriteria, mSubtype, c)); + } else { + aValue.add(cm.getValue(mFormula, c)); + } aValue1.add(cm.getValue(1, c)); aValue1.add(cm.getValue(2, c)); aValue1.add(cm.getValue(3, c)); @@ -450,14 +477,18 @@ public String getColumnName(final int col val = Translate.translate(Translate.CS_Team); break; case 2: - if (mSubtype == 0) { - val = mCriteria.getName() + " " + Translate.translate(Translate.CS_Team); - } else { - if (mSubtype == 1) { - val = mCriteria.getName() + " " + Translate.translate(Translate.CS_Opponent); + if (mCriteria != null) { + if (mSubtype == 0) { + val = mCriteria.getName() + " " + Translate.translate(Translate.CS_Team); } else { - val = mCriteria.getName() + " " + Translate.translate(Translate.CS_Difference); + if (mSubtype == 1) { + val = mCriteria.getName() + " " + Translate.translate(Translate.CS_Opponent); + } else { + val = mCriteria.getName() + " " + Translate.translate(Translate.CS_Difference); + } } + } else { + val = mFormula.getName(); } break; default: diff --git a/src/tourma/tableModel/MjtCriterias.java b/src/tourma/tableModel/MjtCriterias.java index dc7988d9..4123349c 100644 --- a/src/tourma/tableModel/MjtCriterias.java +++ b/src/tourma/tableModel/MjtCriterias.java @@ -12,6 +12,7 @@ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.Parameters; import tourma.data.Tournament; import tourma.languages.Translate; @@ -24,19 +25,23 @@ @SuppressWarnings("serial") public class MjtCriterias extends AbstractTableModel implements TableCellRenderer { + /** + * String Key about Criterias that already exists + */ private static final String CS_CriteriaAlreadyExists = "CriteriaAlreadyExists0"; - private final Tournament mTour; +/** + * + */ private Parameters mParams; /** - * + * * @param tour */ public MjtCriterias(final Tournament tour) { mParams = tour.getParams(); - mTour = tour; } @Override @@ -135,41 +140,57 @@ public void setValueAt(final Object value, final int row, final int col) { } } } + if (exists) { JOptionPane.showMessageDialog(null, Translate.translate(Translate.CS_Error), Translate.translate(CS_CriteriaAlreadyExists), JOptionPane.ERROR_MESSAGE); } else { - String tmp = value.toString(); final Criteria c = mParams.getCriteria(row); int val; switch (col) { case 0: c.setName(tmp); + break; case 1: + String oldAccro=c.getAccronym(); c.setAccronym(tmp); + + for (int i=0; i< Tournament.getTournament().getParams().getFormulaCount(); i++) + { + Formula f=Tournament.getTournament().getParams().getFormula(i); + f.updateCriteria(oldAccro, tmp); + } + break; case 2: + val = Integer.parseInt(tmp); c.setPointsFor(val); Tournament.getTournament().recomputeAll(); break; case 3: + val = Integer.parseInt(tmp); c.setPointsAgainst(val); Tournament.getTournament().recomputeAll(); + break; case 4: + val = Integer.parseInt(tmp); c.setPointsTeamFor(val); Tournament.getTournament().recomputeAll(); + break; case 5: + val = Integer.parseInt(tmp); c.setPointsTeamAgainst(val); Tournament.getTournament().recomputeAll(); + break; case 6: val = Integer.parseInt(tmp); diff --git a/src/tourma/tableModel/MjtFormulas.java b/src/tourma/tableModel/MjtFormulas.java new file mode 100644 index 00000000..a5f09815 --- /dev/null +++ b/src/tourma/tableModel/MjtFormulas.java @@ -0,0 +1,203 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.tableModel; + +import java.awt.Color; +import java.awt.Component; +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellRenderer; +import tourma.data.CoachMatch; +import tourma.data.Criteria; +import tourma.data.Formula; +import tourma.data.Match; +import tourma.data.Parameters; +import tourma.data.Round; +import tourma.data.TeamMatch; +import tourma.data.Tournament; +import tourma.data.Value; +import tourma.languages.Translate; +import tourma.utility.StringConstants; + +/** + * + * @author Administrateur + */ +@SuppressWarnings("serial") +public class MjtFormulas extends AbstractTableModel implements TableCellRenderer { + + /** + * String Key about Criterias that already exists + */ + private static final String CS_FormulaAlreadyExists = "FormulaAlreadyExists0"; + + /** + * + */ + private Parameters mParams; + + /** + * + * @param tour + */ + public MjtFormulas(final Tournament tour) { + + mParams = tour.getParams(); + } + + @Override + public int getColumnCount() { + int result = 2; + return result; + } + + @Override + public int getRowCount() { + return mParams.getFormulaCount(); + } + + @Override + public String getColumnName(final int col) { + String result = StringConstants.CS_NULL; + switch (col) { + case 0: + result = Translate.translate(Translate.CS_Formula_Name); + break; + case 1: + result = Translate.translate(Translate.CS_Formula_Formula); + break; + default: + } + return result; + } + + @Override + public Object getValueAt(final int row, final int col) { + + Object result = StringConstants.CS_NULL; + switch (col) { + case 0: + result = mParams.getFormula(row).getName(); + break; + case 1: + result = mParams.getFormula(row).getFormula(); + break; + default: + } + return result; + } + + @Override + public void setValueAt(final Object value, final int row, final int col) { + if (value != null) { + boolean exists = false; + for (int i = 0; i < mParams.getFormulaCount(); i++) { + if (i != row) { + if (value.toString().equals(mParams.getFormula(i).getName())) { + exists = true; + break; + } + } + } + + if (exists) { + JOptionPane.showMessageDialog(null, Translate.translate(Translate.CS_Error), + Translate.translate(CS_FormulaAlreadyExists), JOptionPane.ERROR_MESSAGE); + + } else { + String tmp = value.toString(); + final Formula f = mParams.getFormula(row); + switch (col) { + case 0: + f.setName(tmp); + break; + case 1: + if (f.isValid(tmp)) { + f.setFormula(tmp); + for (int i = 0; i < Tournament.getTournament().getRoundsCount(); i++) { + Round round = Tournament.getTournament().getRound(i); + for (int j = 0; j < round.getMatchsCount(); j++) { + Match match = round.getMatch(j); + if (match instanceof TeamMatch) { + for (int k = 0; k < ((TeamMatch) match).getMatchCount(); k++) { + CoachMatch cm = ((TeamMatch) match).getMatch(k); + for (int l = 0; l < Tournament.getTournament().getParams().getFormulaCount(); l++) { + Formula formula = Tournament.getTournament().getParams().getFormula(l); + Value v = cm.getValue(formula); + v.setValue1(formula.evaluate(cm.getValues(), 1)); + v.setValue2(formula.evaluate(cm.getValues(), 2)); + } + } + } + if (match instanceof CoachMatch) { + CoachMatch cm = (CoachMatch) match; + for (int l = 0; l < Tournament.getTournament().getParams().getFormulaCount(); l++) { + Formula formula = Tournament.getTournament().getParams().getFormula(l); + Value v = cm.getValue(formula); + v.setValue1(formula.evaluate(cm.getValues(), 1)); + v.setValue2(formula.evaluate(cm.getValues(), 2)); + } + } + } + } + } + break; + default: + } + } + } + } + + @Override + public Class getColumnClass(final int c) { + return getValueAt(0, c).getClass(); + } + + /* + * Don't need to implement this method unless your table's + * editable. + */ + @Override + public boolean isCellEditable(final int row, final int col) { + + //Note that the data/cell address is constant, + //no matter where the cell appears onscreen. + return true;// mTour.getRoundsCount() <= 0; + } + + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { + final JTextField jlb = new JTextField(); + + jlb.setEditable(false); + if (value instanceof String) { + jlb.setText((String) value); + } + + if (value instanceof Integer) { + jlb.setText(Integer.toString((Integer) value)); + } + + Color bkg = new Color(255, 255, 255); + final Color frg = new Color(0, 0, 0); + if (isSelected) { + bkg = new Color(200, 200, 200); + } + jlb.setBackground(bkg); + jlb.setForeground(frg); + jlb.setHorizontalAlignment(JTextField.CENTER); + return jlb; + } + + private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { + throw new java.io.NotSerializableException(getClass().getName()); + } + + private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { + throw new java.io.NotSerializableException(getClass().getName()); + } +} diff --git a/src/tourma/tableModel/MjtManualMatchs.java b/src/tourma/tableModel/MjtManualMatchs.java new file mode 100644 index 00000000..64a0f78a --- /dev/null +++ b/src/tourma/tableModel/MjtManualMatchs.java @@ -0,0 +1,174 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.tableModel; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.util.ArrayList; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellRenderer; +import tourma.MainFrame; +import tourma.data.Coach; +import tourma.data.CoachMatch; +import tourma.data.Competitor; +import tourma.data.Criteria; +import tourma.data.Match; +import tourma.data.Round; +import tourma.data.TeamMatch; +import tourma.data.Tournament; +import tourma.data.Value; +import tourma.languages.Translate; +import tourma.utility.StringConstants; +import tourma.utils.ImageTreatment; + +/** + * + * @author Frederic Berger + */ +@SuppressWarnings("serial") +public class MjtManualMatchs extends AbstractTableModel implements TableCellRenderer { + + private final ArrayList mComps; + + /** + * + * @param matchs + * @param locked + * @param teamTournament + * @param full + */ + public MjtManualMatchs(final ArrayList comps) { + mComps = comps; + + } + + @Override + public int getColumnCount() { + + return 3; + } + + @Override + public int getRowCount() { + int count = mComps.size() / 2; + return count; + } + + @Override + public String getColumnName(final int col) { + + String result = ""; + + return result; + } + + @Override + public Object getValueAt(final int row, final int col) { + Object obj = ""; + + if (col == 0) { + obj = mComps.get(2 * row); + } + + if (col == 2) { + obj = mComps.get(2 * row + 1); + } + return obj; + } + + @Override + public void setValueAt(final Object value, final int row, final int col) { + + } + + @Override + public Class getColumnClass(final int c) { + return getValueAt(0, c).getClass(); + } + + /* + * Don't need to implement this method unless your table's + * editable. + */ + @Override + public boolean isCellEditable(final int row, final int col) { + //Note that the data/cell address is constant, + //no matter where the cell appears onscreen. + + boolean result = false; + + return result; + } + + @Override + public Component getTableCellRendererComponent( + final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { + final JTextField jlb = new JTextField(); + + jlb.setEditable(false); + + boolean useColor = false; + + useColor = Tournament.getTournament().getParams().isUseColor(); + + if (value instanceof String) { + jlb.setText((String) value); + } + + if (value instanceof Integer) { + jlb.setText(Integer.toString((Integer) value)); + } + + Color bkg = new Color(255, 255, 255); + Color frg = new Color(0, 0, 0); + + if (isSelected) { + bkg = new Color(200, 200, 200); + } else { + Value val = null; + switch (column) { + case 0: + if (useColor) { + bkg = new Color(200, 150, 150); + } else { + if (row % 2 != 0) { + bkg = new Color(220, 220, 220); + } + } + break; + case 2: + if (useColor) { + bkg = new Color(150, 150, 220); + } else { + if (row % 2 != 0) { + bkg = new Color(220, 220, 220); + } + } + break; + } + } + + jlb.setBackground(bkg); + + jlb.setForeground(frg); + + jlb.setHorizontalAlignment(JTextField.CENTER); + + return jlb; + } + + private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { + throw new java.io.NotSerializableException(getClass().getName()); + } + + private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { + throw new java.io.NotSerializableException(getClass().getName()); + } +} diff --git a/src/tourma/tableModel/MjtMatches.java b/src/tourma/tableModel/MjtMatches.java index f6e99a24..69374055 100644 --- a/src/tourma/tableModel/MjtMatches.java +++ b/src/tourma/tableModel/MjtMatches.java @@ -18,6 +18,7 @@ import tourma.data.Coach; import tourma.data.CoachMatch; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.Match; import tourma.data.Round; import tourma.data.TeamMatch; @@ -71,9 +72,9 @@ public MjtMatches(final ArrayList matchs, final boolean locked, fina public int getColumnCount() { int res = 0; if (mTeamTournament) { - res = Tournament.getTournament().getParams().getCriteriaCount() * 2 + 5; + res = Tournament.getTournament().getParams().getCriteriaCount() * 2 + Tournament.getTournament().getParams().getFormulaCount() * 2 + 5; } else { - res = Tournament.getTournament().getParams().getCriteriaCount() * 2 + 3; + res = Tournament.getTournament().getParams().getCriteriaCount() * 2 + Tournament.getTournament().getParams().getFormulaCount() * 2 + 3; } return res; @@ -113,12 +114,22 @@ public String getColumnName(final int col) { result = Translate.translate(Translate.CS_Team) + " 2"; break; default: - final Criteria crit = Tournament.getTournament().getParams().getCriteria((col - 5) / 2); - final int ind = (col - 5) % 2; - if (ind == 0) { - result = crit.getName() + " 1"; + if (col < Tournament.getTournament().getParams().getCriteriaCount() * 2 + 5) { + final Criteria crit = Tournament.getTournament().getParams().getCriteria((col - 5) / 2); + final int ind = (col - 5) % 2; + if (ind == 0) { + result = crit.getName() + " 1"; + } else { + result = crit.getName() + " 2"; + } } else { - result = crit.getName() + " 2"; + final Formula form = Tournament.getTournament().getParams().getFormula((col - 5 - Tournament.getTournament().getParams().getCriteriaCount() * 2) / 2); + final int ind = (col - 5 - Tournament.getTournament().getParams().getCriteriaCount() * 2) % 2; + if (ind == 0) { + result = form.getName() + " 1"; + } else { + result = form.getName() + " 2"; + } } } } else { @@ -139,11 +150,22 @@ public String getColumnName(final int col) { result = Translate.translate(Translate.CS_Coach) + " 2"; break; default: - final Criteria crit = Tournament.getTournament().getParams().getCriteria((col - 3) / 2); - if ((col - 3) % 2 > 0) { - result = crit.getName() + " 2"; + if (col < Tournament.getTournament().getParams().getCriteriaCount() * 2 + 3) { + final Criteria crit = Tournament.getTournament().getParams().getCriteria((col - 3) / 2); + final int ind = (col - 3) % 2; + if (ind == 0) { + result = crit.getName() + " 1"; + } else { + result = crit.getName() + " 2"; + } } else { - result = crit.getName() + " 1"; + final Formula form = Tournament.getTournament().getParams().getFormula((col - 3 - Tournament.getTournament().getParams().getCriteriaCount() * 2) / 2); + final int ind = (col - 3 - Tournament.getTournament().getParams().getCriteriaCount() * 2) % 2; + if (ind == 0) { + result = form.getName() + " 1"; + } else { + result = form.getName() + " 2"; + } } } } @@ -228,13 +250,22 @@ public Object getValueAt(final int row, final int col) { obj = ((Coach) m.getCompetitor2()).getTeamMates().getName(); break; default: - index = (col - 5) / 2; - final Criteria crit = Tournament.getTournament().getParams().getCriteria(index); - val = m.getValue(crit); - if ((col - 5) % 2 == 0) { - obj = val.getValue1(); + if (col < Tournament.getTournament().getParams().getCriteriaCount() * 2 + 5) { + final Criteria crit = Tournament.getTournament().getParams().getCriteria((col - 5) / 2); + val = m.getValue(crit); + if ((col - 5) % 2 == 0) { + obj = val.getValue1(); + } else { + obj = val.getValue2(); + } } else { - obj = val.getValue2(); + final Formula form = Tournament.getTournament().getParams().getFormula((col - 5 - Tournament.getTournament().getParams().getCriteriaCount() * 2) / 2); + val = m.getValue(form); + if ((col - 5) % 2 == 0) { + obj = val.getValue1(); + } else { + obj = val.getValue2(); + } } } } else { @@ -301,13 +332,22 @@ public Object getValueAt(final int row, final int col) { } break; default: - index = (col - 3) / 2; - final Criteria crit = Tournament.getTournament().getParams().getCriteria(index); - val = m.getValue(crit); - if ((col - 3) % 2 == 0) { - obj = val.getValue1(); + if (col < Tournament.getTournament().getParams().getCriteriaCount() * 2 + 3) { + final Criteria crit = Tournament.getTournament().getParams().getCriteria((col - 3) / 2); + val = m.getValue(crit); + if ((col - 3) % 2 == 0) { + obj = val.getValue1(); + } else { + obj = val.getValue2(); + } } else { - obj = val.getValue2(); + final Formula form = Tournament.getTournament().getParams().getFormula((col - 3 - Tournament.getTournament().getParams().getCriteriaCount() * 2) / 2); + val = m.getValue(form); + if ((col - 3) % 2 == 0) { + obj = val.getValue1(); + } else { + obj = val.getValue2(); + } } } } @@ -329,6 +369,7 @@ public void setValueAt(final Object value, final int row, final int col) { val.setValue1(-1); } else { val.setValue1(Integer.parseInt(tmp)); + updateFormulasValues(row, 1); } break; case 4: @@ -337,6 +378,10 @@ public void setValueAt(final Object value, final int row, final int col) { val.setValue2(-1); } else { val.setValue2(Integer.parseInt(tmp)); + updateFormulasValues(row, 2); + /** + * Update Formulas + */ } break; default: @@ -344,8 +389,10 @@ public void setValueAt(final Object value, final int row, final int col) { val = m.getValue(Tournament.getTournament().getParams().getCriteria(index)); if ((col - 5) % 2 == 0) { val.setValue1(Integer.parseInt(tmp)); + updateFormulasValues(row, 1); } else { val.setValue2(Integer.parseInt(tmp)); + updateFormulasValues(row, 2); } } } else { @@ -356,6 +403,7 @@ public void setValueAt(final Object value, final int row, final int col) { val.setValue1(-1); } else { val.setValue1(Integer.parseInt(tmp)); + updateFormulasValues(row, 1); } break; case 3: @@ -364,6 +412,7 @@ public void setValueAt(final Object value, final int row, final int col) { val.setValue2(-1); } else { val.setValue2(Integer.parseInt(tmp)); + updateFormulasValues(row, 2); } break; default: @@ -371,8 +420,10 @@ public void setValueAt(final Object value, final int row, final int col) { val = m.getValue(Tournament.getTournament().getParams().getCriteria(index)); if ((col - 3) % 2 == 0) { val.setValue1(Integer.parseInt(tmp)); + updateFormulasValues(row, 1); } else { val.setValue2(Integer.parseInt(tmp)); + updateFormulasValues(row, 2); } } } @@ -386,26 +437,21 @@ public void setValueAt(final Object value, final int row, final int col) { for (int i = 0; i < Tournament.getTournament().getRoundsCount(); i++) { Round r = Tournament.getTournament().getRound(i); for (int j = 0; j < r.getMatchsCount(); j++) { - Match match=r.getMatch(j); - if (match instanceof TeamMatch) - { - for (int k=0; k<((TeamMatch) match).getMatchCount(); k++) - { - if (((TeamMatch)match).containsMatch(m)) - { - ((TeamMatch)match).resetWL(); - ((TeamMatch)match).recomputeValues(); + Match match = r.getMatch(j); + if (match instanceof TeamMatch) { + for (int k = 0; k < ((TeamMatch) match).getMatchCount(); k++) { + if (((TeamMatch) match).containsMatch(m)) { + ((TeamMatch) match).resetWL(); + ((TeamMatch) match).recomputeValues(); } } - } - else - { + } else { break; } } } } - + fireTableDataChanged(); MainFrame.getMainFrame().updateMenus(); @@ -430,11 +476,11 @@ public boolean isCellEditable(final int row, final int col) { result = false; } else { if (mTeamTournament) { - if ((col == 1) || (col == 2) || (col == 5) || (col == 6) || (col == 0)) { + if ((col == 1) || (col == 2) || (col == 5) || (col == 6) || (col == 0) || (col > 5 + Tournament.getTournament().getParams().getCriteriaCount()*2)) { result = false; } } else { - if ((col == 1) || (col == 4) || (col == 0)) { + if ((col == 1) || (col == 4) || (col == 0) || (col > 3 + Tournament.getTournament().getParams().getCriteriaCount()*2)) { result = false; } } @@ -624,30 +670,33 @@ public Component getTableCellRendererComponent( } int CritIndex = (column - 5) / 2; int ValIndex = (column - 5) % 2; - Criteria crit = Tournament.getTournament().getParams().getCriteria(CritIndex); - Value v = m.getValue(crit); - if (ValIndex == 0) { - if (v.getValue1() > crit.getCriticalThreshold()) { - if (useColor) { - bkg = Color.RED; - } else { - bkg = Color.DARK_GRAY; + + if (CritIndex < Tournament.getTournament().getParams().getCriteriaCount()) { + Criteria crit = Tournament.getTournament().getParams().getCriteria(CritIndex); + Value v = m.getValue(crit); + if (ValIndex == 0) { + if (v.getValue1() > crit.getCriticalThreshold()) { + if (useColor) { + bkg = Color.RED; + } else { + bkg = Color.DARK_GRAY; + } + frg = Color.WHITE; + jlb.setFont(jlb.getFont().deriveFont(Font.BOLD)); } - frg = Color.WHITE; - jlb.setFont(jlb.getFont().deriveFont(Font.BOLD)); } - } - if (ValIndex == 1) { - if (v.getValue2() > crit.getCriticalThreshold()) { - if (useColor) { - bkg = Color.BLUE; - } else { - bkg = Color.DARK_GRAY; + if (ValIndex == 1) { + if (v.getValue2() > crit.getCriticalThreshold()) { + if (useColor) { + bkg = Color.BLUE; + } else { + bkg = Color.DARK_GRAY; + } + frg = Color.WHITE; + jlb.setFont(jlb.getFont().deriveFont(Font.BOLD)); } - frg = Color.WHITE; - jlb.setFont(jlb.getFont().deriveFont(Font.BOLD)); } - } + } } } else { switch (column) { @@ -786,9 +835,8 @@ public Component getTableCellRendererComponent( } } } - if (m.isRemotely()) - { - frg=Color.BLUE; + if (m.isRemotely()) { + frg = Color.BLUE; } } @@ -832,6 +880,27 @@ public Component getTableCellRendererComponent( return jlb; } + private void updateFormulasValues(int row, int side) { + for (int i = 0; i < Tournament.getTournament().getParams().getFormulaCount(); i++) { + Formula f = Tournament.getTournament().getParams().getFormula(i); + CoachMatch cm = this.mMatchs.get(row); + Value val = cm.getValue(f); + + + int ivalue=f.evaluate(cm.getValues(),side); + + if (side==1) + { + val.setValue1(ivalue); + } + else + { + val.setValue2(ivalue); + } + + } + } + private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { throw new java.io.NotSerializableException(getClass().getName()); } diff --git a/src/tourma/tableModel/MjtRanking.java b/src/tourma/tableModel/MjtRanking.java index 1678b77b..af85cd2c 100644 --- a/src/tourma/tableModel/MjtRanking.java +++ b/src/tourma/tableModel/MjtRanking.java @@ -15,6 +15,7 @@ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.ObjectRanking; import tourma.data.Parameters; import tourma.data.Tournament; @@ -52,6 +53,20 @@ public String convertVND(int value) { return vnd; } + public static Formula getFormulaByValue(final int valueType) { + Formula formula = null; + + if (valueType > Parameters.C_MAX_RANKING) { + final int value = valueType - Parameters.C_MAX_RANKING - 1; + + if (value / 3 >= Tournament.getTournament().getParams().getCriteriaCount()) { + Parameters params = Tournament.getTournament().getParams(); + formula = params.getFormula(value / 3 - Tournament.getTournament().getParams().getCriteriaCount()); + } + } + return formula; + } + /** * * @param valueType @@ -63,8 +78,11 @@ public static Criteria getCriteriaByValue(final int valueType) { if (valueType > Parameters.C_MAX_RANKING) { final int value = valueType - Parameters.C_MAX_RANKING - 1; - Parameters params = Tournament.getTournament().getParams(); - criteria = params.getCriteria(value / 3); + if (value / 3 < Tournament.getTournament().getParams().getCriteriaCount()) { + Parameters params = Tournament.getTournament().getParams(); + criteria = params.getCriteria(value / 3); + } + } return criteria; } @@ -139,53 +157,58 @@ public static String getRankingString(final int rankingType) { String result = StringConstants.CS_NULL; final Criteria c = MjtRanking.getCriteriaByValue(rankingType); if (c == null) { - switch (rankingType) { - case Parameters.C_RANKING_POINTS: - result = Translate.translate(Translate.CS_Points); - break; - case Parameters.C_RANKING_POINTS_WITHOUT_BONUS: - result = Translate.translate(Translate.CS_Points_Without_Bonus); - break; - case Parameters.C_RANKING_BONUS_POINTS: - result = Translate.translate(Translate.CS_Bonus_Points); - break; - case Parameters.C_RANKING_NONE: - result = Translate.translate(Translate.CS_Nothing); - break; - case Parameters.C_RANKING_OPP_POINTS: - result = Translate.translate(Translate.CS_ACCR_Opponent_Points); - break; - case Parameters.C_RANKING_OPP_POINTS_OTHER_MATCHS: - result = Translate.translate(Translate.CS_ACCR_Opponent_Points_Without_Bonus); - break; - case Parameters.C_RANKING_VND: - result = Translate.translate(Translate.CS_ACCR_Victory_Drawn_Lost); - break; - case Parameters.C_RANKING_ELO: - result = Translate.translate(Translate.CS_ELO); - break; - case Parameters.C_RANKING_ELO_OPP: - result = Translate.translate(Translate.CS_OpponentsElo); - break; - case Parameters.C_RANKING_NB_MATCHS: - result = Translate.translate(Translate.CS_MatchCount); - break; - case Parameters.C_RANKING_TABLES: - result = Translate.translate(Translate.CS_TablesPoints); - break; - case Parameters.C_RANKING_HEAD_BY_HEAD: - result = Translate.translate(Translate.CS_HeadByHead); - break; - case Parameters.C_RANKING_TIER: - result = Translate.translate(Translate.CS_Tier); - break; - case Parameters.C_RANKING_TEAMMATES_POINTS: - result = Translate.translate(Translate.CS_Teammates_Points); - break; - case Parameters.C_RANKING_TEAMMATES_VND: - result = Translate.translate(Translate.CS_Teammates_VND); - break; - default: + Formula f = MjtRanking.getFormulaByValue(rankingType); + if (f == null) { + switch (rankingType) { + case Parameters.C_RANKING_POINTS: + result = Translate.translate(Translate.CS_Points); + break; + case Parameters.C_RANKING_POINTS_WITHOUT_BONUS: + result = Translate.translate(Translate.CS_Points_Without_Bonus); + break; + case Parameters.C_RANKING_BONUS_POINTS: + result = Translate.translate(Translate.CS_Bonus_Points); + break; + case Parameters.C_RANKING_NONE: + result = Translate.translate(Translate.CS_Nothing); + break; + case Parameters.C_RANKING_OPP_POINTS: + result = Translate.translate(Translate.CS_ACCR_Opponent_Points); + break; + case Parameters.C_RANKING_OPP_POINTS_OTHER_MATCHS: + result = Translate.translate(Translate.CS_ACCR_Opponent_Points_Without_Bonus); + break; + case Parameters.C_RANKING_VND: + result = Translate.translate(Translate.CS_ACCR_Victory_Drawn_Lost); + break; + case Parameters.C_RANKING_ELO: + result = Translate.translate(Translate.CS_ELO); + break; + case Parameters.C_RANKING_ELO_OPP: + result = Translate.translate(Translate.CS_OpponentsElo); + break; + case Parameters.C_RANKING_NB_MATCHS: + result = Translate.translate(Translate.CS_MatchCount); + break; + case Parameters.C_RANKING_TABLES: + result = Translate.translate(Translate.CS_TablesPoints); + break; + case Parameters.C_RANKING_HEAD_BY_HEAD: + result = Translate.translate(Translate.CS_HeadByHead); + break; + case Parameters.C_RANKING_TIER: + result = Translate.translate(Translate.CS_Tier); + break; + case Parameters.C_RANKING_TEAMMATES_POINTS: + result = Translate.translate(Translate.CS_Teammates_Points); + break; + case Parameters.C_RANKING_TEAMMATES_VND: + result = Translate.translate(Translate.CS_Teammates_VND); + break; + default: + } + } else { + result = f.getName(); } } else { final int subRanking = MjtRanking.getSubtypeByValue(rankingType); diff --git a/src/tourma/tableModel/MjtRankingIndiv.java b/src/tourma/tableModel/MjtRankingIndiv.java index 129621e7..a6617d3b 100644 --- a/src/tourma/tableModel/MjtRankingIndiv.java +++ b/src/tourma/tableModel/MjtRankingIndiv.java @@ -34,6 +34,7 @@ public final class MjtRankingIndiv extends MjtRanking { private final boolean mTeamTournament; private final boolean mForPool; + private final boolean mForCup; public MjtRankingIndiv(final int round, final int ranking_type1, @@ -41,10 +42,11 @@ public MjtRankingIndiv(final int round, final int ranking_type3, final int ranking_type4, final int ranking_type5, - final ArrayList coachs, final boolean tournament, final boolean round_only, final boolean forPool) { + final ArrayList coachs, final boolean tournament, final boolean round_only, final boolean forPool,boolean forCup) { super(round, ranking_type1, ranking_type2, ranking_type3, ranking_type4, ranking_type5, coachs, round_only); mTeamTournament = tournament; mForPool = forPool; + mForCup = forCup; sortDatas(); } @@ -56,7 +58,7 @@ public MjtRankingIndiv(final int round, final ArrayList coachs, boolean teamTour Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), - coachs, teamTournament, round_only, false); + coachs, teamTournament, round_only, false, false); } /** @@ -92,9 +94,7 @@ protected void sortDatas() { ArrayList aValue4 = new ArrayList<>(); ArrayList aValue5 = new ArrayList<>(); - if (c.getMatchCount() > 0) { - - + if (c.getMatchCount() > 0) { for (int j = 0; j <= c.getMatchCount() - 1; j++) { final CoachMatch m = (CoachMatch) c.getMatch(j); @@ -284,7 +284,7 @@ protected void sortDatas() { final ArrayList pRank = new ArrayList<>(); for (int j = 0; j < nbPool; j++) { p = tour.getPool(j); - final MjtRankingIndiv mjtr = new MjtRankingIndiv(mRound, mRankingType1, mRankingType2, mRankingType3, mRankingType4, mRankingType5, p.getCompetitors(), mTeamTournament, mRoundOnly, false); + final MjtRankingIndiv mjtr = new MjtRankingIndiv(mRound, mRankingType1, mRankingType2, mRankingType3, mRankingType4, mRankingType5, p.getCompetitors(), mTeamTournament, mRoundOnly, false,false); pRank.add(mjtr); } @@ -300,7 +300,7 @@ protected void sortDatas() { } } - final MjtRankingIndiv mjtr = new MjtRankingIndiv(mRound, mRankingType1, mRankingType2, mRankingType3, mRankingType4, mRankingType5, rank, mTeamTournament, mRoundOnly, false); + final MjtRankingIndiv mjtr = new MjtRankingIndiv(mRound, mRankingType1, mRankingType2, mRankingType3, mRankingType4, mRankingType5, rank, mTeamTournament, mRoundOnly, false,false); for (int j = 0; j < mjtr.mDatas.size(); j++) { datas.add(mjtr.mDatas.get(j)); @@ -314,7 +314,7 @@ protected void sortDatas() { rank.add(tour.getCoach(i)); } } - final MjtRankingIndiv mjtr = new MjtRankingIndiv(mRound, mRankingType1, mRankingType2, mRankingType3, mRankingType4, mRankingType5, rank, mTeamTournament, mRoundOnly, false); + final MjtRankingIndiv mjtr = new MjtRankingIndiv(mRound, mRankingType1, mRankingType2, mRankingType3, mRankingType4, mRankingType5, rank, mTeamTournament, mRoundOnly, false,false); for (int j = 0; j < mjtr.mDatas.size(); j++) { datas.add(mjtr.mDatas.get(j)); diff --git a/src/tourma/utility/StringConstants.java b/src/tourma/utility/StringConstants.java index 4fdac630..84558d62 100644 --- a/src/tourma/utility/StringConstants.java +++ b/src/tourma/utility/StringConstants.java @@ -18,6 +18,8 @@ public interface StringConstants { public static final String CS_WEB_COLOR2 = "WebColor"; public static final String CS_WEB_FORECOLOR = "WebForeColor"; public static final String CS_WEB_BORDERCOLOR = "WebBorderColor"; + + public static final String CS_CROSSMATCHPOOL="CrossPoolMatch"; /** * */ @@ -59,7 +61,7 @@ public interface StringConstants { * */ public static final String CS_CUP = "Cup"; - public static final String CS_THIRDPLACE="ThirdPlace"; + public static final String CS_THIRDPLACE = "ThirdPlace"; /** * @@ -121,39 +123,38 @@ public interface StringConstants { public static final String CS_SUBSTITUTION = "Substitution"; public static final String CS_CRITERIA = "Criteria"; public static final String CS_CRITERIA_ACCRONYM = "Accronyme"; - + public static final String CS_FORMULA = "Formula"; public static final String CS_POINTS_FOR = "PointsFor"; public static final String CS_POINTS_AGAINST = "PointsAgainst"; public static final String CS_TEAM_POINTS_FOR = "PointsTeamFor"; public static final String CS_TEAM_POINTS_AGAINST = "PointsTeamAgainst"; - public static final String CS_CRITICAL_THRESHOLD="CriticalValueThreshold"; - - public static final String CS_OFFENSIVE_BONUS_THRESHOLD="OffensiveBonusThreshold"; - public static final String CS_DIFF_OFFENSIVE_BONUS_THRESHOLD="DiffOffensiveBonusThreshold"; - public static final String CS_DIFF_DEFENSIVE_BONUS_THRESHOLD="DiffDefensiveBinusThreshold"; - public static final String CS_DIFF_DEFENSIVE_BONUS="DiffDefensiveBonus"; - public static final String CS_DIFF_OFFENSIVE_BONUS="DiffOffensiveBonus"; - public static final String CS_OFFENSIVE_BONUS="OffensiveBonus"; - - public static final String CS_FOR_TEAM_DIFF_DEFENSIVE_BONUS="ForTeamDiffDefensiveBonus"; - public static final String CS_FOR_TEAM_DIFF_OFFENSIVE_BONUS="ForTeamDiffOffensiveBonus"; - public static final String CS_FOR_TEAM_OFFENSIVE_BONUS="ForTeamOffensiveBonus"; - - public static final String CS_TEAM_OFFENSIVE_BONUS_THRESHOLD="TeamOffensiveBonusThreshold"; - public static final String CS_TEAM_DIFF_OFFENSIVE_BONUS_THRESHOLD="TeamDiffOffensiveBonusThreshold"; - public static final String CS_TEAM_DIFF_DEFENSIVE_BONUS_THRESHOLD="TeamDiffDefensiveBinusThreshold"; - public static final String CS_TEAM_DIFF_DEFENSIVE_BONUS="TeamDiffDefensiveBonus"; - public static final String CS_TEAM_DIFF_OFFENSIVE_BONUS="TeamDiffOffensiveBonus"; - public static final String CS_TEAM_OFFENSIVE_BONUS="TeamOffensiveBonus"; - - + public static final String CS_CRITICAL_THRESHOLD = "CriticalValueThreshold"; + + public static final String CS_OFFENSIVE_BONUS_THRESHOLD = "OffensiveBonusThreshold"; + public static final String CS_DIFF_OFFENSIVE_BONUS_THRESHOLD = "DiffOffensiveBonusThreshold"; + public static final String CS_DIFF_DEFENSIVE_BONUS_THRESHOLD = "DiffDefensiveBinusThreshold"; + public static final String CS_DIFF_DEFENSIVE_BONUS = "DiffDefensiveBonus"; + public static final String CS_DIFF_OFFENSIVE_BONUS = "DiffOffensiveBonus"; + public static final String CS_OFFENSIVE_BONUS = "OffensiveBonus"; + + public static final String CS_FOR_TEAM_DIFF_DEFENSIVE_BONUS = "ForTeamDiffDefensiveBonus"; + public static final String CS_FOR_TEAM_DIFF_OFFENSIVE_BONUS = "ForTeamDiffOffensiveBonus"; + public static final String CS_FOR_TEAM_OFFENSIVE_BONUS = "ForTeamOffensiveBonus"; + + public static final String CS_TEAM_OFFENSIVE_BONUS_THRESHOLD = "TeamOffensiveBonusThreshold"; + public static final String CS_TEAM_DIFF_OFFENSIVE_BONUS_THRESHOLD = "TeamDiffOffensiveBonusThreshold"; + public static final String CS_TEAM_DIFF_DEFENSIVE_BONUS_THRESHOLD = "TeamDiffDefensiveBinusThreshold"; + public static final String CS_TEAM_DIFF_DEFENSIVE_BONUS = "TeamDiffDefensiveBonus"; + public static final String CS_TEAM_DIFF_OFFENSIVE_BONUS = "TeamDiffOffensiveBonus"; + public static final String CS_TEAM_OFFENSIVE_BONUS = "TeamOffensiveBonus"; + public static final String CS_GROUP_MODIFIER_POINTS = "GroupModifierPoints"; public static final String CS_VICTORY = "Victory"; public static final String CS_LARGE_VICTORY = "Large_Victory"; public static final String CS_LITTLE_LOST = "Little_Lost"; public static final String CS_TEAM_LARGE_VICTORY = "Team_Large_Victory"; public static final String CS_TEAM_HUGE_VICTORY = "Team_Huge_Victory"; - + public static final String CS_TEAM_LITTLE_LOST = "Team_Little_Lost"; public static final String CS_TEAM_LOST = "Team_Lost"; public static final String CS_DRAW = "Draw"; @@ -201,7 +202,7 @@ public interface StringConstants { public static final String CS_USE_TEAM_LITTLE_LOST = "UseTeamLittleLost"; //public static final String CS_USE_TEAM_LOST = "UseTeamLost"; public static final String CS_USE_TEAM_HUGE_LOST = "UseTeamHugeLost"; - + public static final String CS_TABLEBONUS = "TableBonus"; public static final String CS_TABLEBONUSPERROUND = "TableBonusPerRound"; public static final String CS_TABLEBONUSCOEF = "TableBonusCoef"; @@ -231,4 +232,17 @@ public interface StringConstants { public static final String CS_DESCRIPTION = "Description"; public static final String CS_WEB_PORT = "Web_port"; + + public static final String CS_CUP_TYPE = "Type"; + public static final String CS_CUP_INITIAL_DRAW="Initial_Draw"; + public static final String CS_CUP_ROUNDS_COUNT = "Rounds_Count"; + public static final String CS_CUP_SWISS_FOR_LOOSERS = "Swiss_for_loosers"; + public static final String CS_CUP_SHUFFLE = "Shuffle"; + + public static final String CS_CUP_TABLES="Tables"; + public static final String CS_CUP_TABLE="Table"; + public static final String CS_CUP_ROUNDS="Rounds"; + public static final String CS_CUP_ROUND="Round"; + public static final String CS_CUP_MATCHS="Matchs"; + public static final String CS_CUP_MATCH="Match"; } diff --git a/src/tourma/utils/Generation.java b/src/tourma/utils/Generation.java index dbd9fdba..fa8964f7 100644 --- a/src/tourma/utils/Generation.java +++ b/src/tourma/utils/Generation.java @@ -23,6 +23,8 @@ import javax.swing.JSpinner; import javax.swing.ListSelectionModel; import javax.swing.SpinnerNumberModel; +import tourma.JdgCupOptions; +import tourma.JdgManualCupDraw; import tourma.JdgPairing; import tourma.MainFrame; import tourma.data.Category; @@ -30,6 +32,7 @@ import tourma.data.CoachMatch; import tourma.data.Competitor; import tourma.data.Criteria; +import tourma.data.Cup; import tourma.data.ETeamPairing; import tourma.data.Match; import tourma.data.ObjectRanking; @@ -123,6 +126,7 @@ public final class Generation { private final static String CS_FirstRound = "FirstRound"; private final static String CS_NumberByPool = "NumberByPool"; private final static String CS_TheNumberOfTeamsIsNotAMultipleOfYourChoice = "LE NOMBRE D'ÉQUIPE N'EST PAS UN MULTIPLE DE VOTRE CHOIX"; + private final static String CS_OddInPool = "Impair in pool"; private final static String CS_DoYouWantToChooseRankTeam = "VOULEZ VOUS CHOISIR L'ÉQUIPE DU RANG {0} ?"; private final static String CS_ChooseCompetitor = "CHOISISSEZ UN COACH"; private final static String CS_ChooseOpponentFor = "ChooseOpponentFor"; @@ -416,7 +420,7 @@ private static void generateFirstRoundPool(ArrayList competitors) { final JSpinner jspNb = new JSpinner(); - final SpinnerNumberModel model = new SpinnerNumberModel(2, 2, comps.size() / 2, 2); + final SpinnerNumberModel model = new SpinnerNumberModel(2, 2, comps.size() / 2, 1); jspNb.setModel(model); message.add(jlb, BorderLayout.NORTH); @@ -426,6 +430,17 @@ private static void generateFirstRoundPool(ArrayList competitors) { final int nb = (Integer) model.getValue(); + boolean cross_matches = false; + if (nb % 2 != 0) { + cross_matches = JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), + Translate.translate(CS_OddInPool), + Translate.translate(CS_GenerationError), + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; + + } + + tour.getParams().setCrossPoolMatch(cross_matches); + if (comps.size() % nb != 0) { boolean complete = JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), @@ -974,12 +989,11 @@ private static void generateFirstRoundCup(ArrayList competitors) { final Round r = new Round(); r.setCurrentHour(); - r.setLooserCup( + /*r.setLooserCup( JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), Translate.translate(CS_IsItDoubleKickTournament), - Translate.translate(Translate.CS_Cup), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION); + Translate.translate(Translate.CS_Cup), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION);*/ // there is nb_tmp/matchs - for (int i = 0; i < nb_matchs / 2; i++) { comps.get(2 * i).addMatch(comps.get(nb_tmp - 2 * i - 1), r); } @@ -1046,6 +1060,24 @@ private static Round genSwiss(final ArrayList competitors, final ArrayList toRemove=new ArrayList<>(); + // Remove Competitors from data if not in datas + for (ObjectRanking or:datas_tmp) + { + Object o=or.getObject(); + if (o instanceof Competitor) + { + if (!competitors.contains(o)) + { + toRemove.add(or); + } + } + } + for(ObjectRanking or:toRemove) + { + datas_tmp.remove(or); + } + // If number of players is odd; add one null a the end if (comps.size() % 2 == 1) { if (comps.get(0) instanceof Coach) { @@ -1067,7 +1099,7 @@ private static Round genSwiss(final ArrayList competitors, final ArrayList0) { + while (datas_tmp.size() > 0) { if (datas_tmp.size() == 3) { if (Tournament.getTournament().getParams().isTeamTournament() && Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING) { @@ -1081,16 +1113,12 @@ private static Round genSwiss(final ArrayList competitors, final ArrayList shuffle = new ArrayList<>(competitors); Collections.shuffle(shuffle); - while (shuffle.size() > 0) { + while (shuffle.size() > 1) { // Manage odd number of team with even number of coachs if (shuffle.size() == 3) { if (Tournament.getTournament().getParams().isTeamTournament() && (Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING)) { @@ -1543,6 +1571,12 @@ private static Round genRandom(final ArrayList competitors, final Round r) { Team t3 = (Team) shuffle.get(2); set3TeamsMatches(t1, t2, t3, r); + } else { + Competitor c = shuffle.get(0); + shuffle.remove(c); + ArrayList opp = c.getPossibleOpponents(shuffle, r); + c.addMatch(opp.get(0), r); + shuffle.remove(opp.get(0)); } } else { Competitor c = shuffle.get(0); @@ -1560,14 +1594,36 @@ private static Round genRandom(final ArrayList competitors, final Round r) { /** * - * @param round + * @param previous_round * @param r * @param third_place */ - private static void genCup(final Round round, final Round r, final boolean third_place) { - //final ArrayList matchs = new ArrayList<>(round.getMatchs()); + private static void genCup(final Round previous_round, final Round r) { + Parameters params = Tournament.getTournament().getParams(); - int nb_match = (int) Math.pow(2, round.getCupMaxTour() - round.getCupTour() - 1); + Cup cup = Tournament.getTournament().getCup(); + int roundIndex = previous_round.getCupTour(); + + ArrayList previousMatchs = new ArrayList<>(); + for (int i = 0; i < previous_round.getMatchsCount(); i++) { + previousMatchs.add(previous_round.getMatch(i)); + } + + ArrayList comps = new ArrayList(); + + if (params.isTeamTournament() && params.getTeamPairing() == ETeamPairing.TEAM_PAIRING) { + for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { + comps.add(Tournament.getTournament().getTeam(i)); + } + } else { + for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { + comps.add(Tournament.getTournament().getCoach(i)); + } + } + + ArrayList nextMatchs = cup.generateMatches(roundIndex + 1, r, previousMatchs, comps); + + /*int nb_match = (int) Math.pow(2, previous_round.getCupMaxTour() - previous_round.getCupTour() - 1); final ArrayList _winners = new ArrayList<>(); final ArrayList _loosers = new ArrayList<>(); @@ -1580,16 +1636,16 @@ private static void genCup(final Round round, final Round r, final boolean third } if (nb_match == 0) { - if (round.getCupTour() == round.getCupMaxTour() + 1) { - _loosers.add(round.getMatch(0).getWinner()); + if (previous_round.getCupTour() == previous_round.getCupMaxTour() + 1) { + _loosers.add(previous_round.getMatch(0).getWinner()); } else { - _winners.add(round.getMatch(0).getWinner()); - _loosers.add(round.getMatch(1).getWinner()); + _winners.add(previous_round.getMatch(0).getWinner()); + _loosers.add(previous_round.getMatch(1).getWinner()); } } for (int i = 0; i < nb_match; i++) { - _winners.add(round.getMatch(i).getWinner()); - _loosers.add(round.getMatch(i).getLooser()); + _winners.add(previous_round.getMatch(i).getWinner()); + _loosers.add(previous_round.getMatch(i).getLooser()); } if (nb_match > 0) { final int option = JOptionPane.showConfirmDialog( @@ -1626,12 +1682,12 @@ private static void genCup(final Round round, final Round r, final boolean third } } } - if (round.isLooserCup()) { + if (Tournament.getTournament().getCup().getType() == Cup.ROUND_TYPE.LOOSER) { int nb_remaining_match = 0; - if (round.getCupTour() > 0) { + if (previous_round.getCupTour() > 0) { nb_remaining_match = nb_match; } - if (round.getCupTour() > 1) { + if (previous_round.getCupTour() > 1) { nb_remaining_match += nb_match; } @@ -1640,21 +1696,21 @@ private static void genCup(final Round round, final Round r, final boolean third } if (nb_match == 0) { nb_remaining_match = 1; - if (round.getCupTour() == round.getCupMaxTour() + 1) { + if (previous_round.getCupTour() == previous_round.getCupMaxTour() + 1) { nb_match = 1; } else { nb_match = 2; } } - for (int i = nb_match; (i < nb_match + nb_remaining_match) && (i < round.getMatchsCount()); i++) { - _loosers.add(round.getMatch(i).getWinner()); + for (int i = nb_match; (i < nb_match + nb_remaining_match) && (i < previous_round.getMatchsCount()); i++) { + _loosers.add(previous_round.getMatch(i).getWinner()); } /** * Patch For ensure that the winner of the last looser cup match is * pushed into the winners'cup All the coachs presents in winner cup * are removed from the looser cup - */ + for (int i = 0; i < r.getMatchsCount(); i++) { Competitor c1 = r.getMatch(i).getCompetitor1(); _loosers.remove(c1); @@ -1673,7 +1729,10 @@ private static void genCup(final Round round, final Round r, final boolean third for (int i = 0; i < _loosers.size() / 2; i++) { _loosers.get(i).addMatch(_loosers.get(_loosers.size() / 2 + i), r); } - } + }*/ + nextMatchs.forEach((m) -> { + m.getCompetitor1().addMatch(m.getCompetitor2(), r); + }); } /** @@ -1700,12 +1759,40 @@ private static void genCupFirst(final Round r, final MjtRanking datas, final int } comps.add(c); } + + // Reorder to create pairing 1st against last + ArrayList comps2 = new ArrayList<>(); + for (int i = 0; i < nb_match / 2; i++) { - comps.get(2 * i).addMatch(comps.get(nbPlayers - 2 * i - 1), r); + comps2.add(comps.get(2 * i)); + comps2.add(comps.get(nbPlayers - 2 * i - 1)); } for (int i = 0; i < nb_match / 2; i++) { - comps.get(2 * i + 1).addMatch(comps.get(nbPlayers - 2 * i - 2), r); + comps2.add(comps.get(2 * i + 1)); + comps2.add(comps.get(nbPlayers - 2 * i - 2)); + } + + // If Order is a category one, job already done. + // If order is ranking, already done + // If order is random + if (Tournament.getTournament().getCup().getInitialDraw() == Cup.INITIAL_DRAW.RANDOM) { + Collections.shuffle(comps2); + } + + // If draw is manual + if (Tournament.getTournament().getCup().getInitialDraw() == Cup.INITIAL_DRAW.MANUAL) { + /** + * Double selection list panel + */ + JdgManualCupDraw jdg = new JdgManualCupDraw(MainFrame.getMainFrame(), true, comps2); + jdg.setVisible(true); } + + ArrayList matches = Tournament.getTournament().getCup().generateMatches(0, r, null, comps2); + + matches.forEach((m) -> { + m.getCompetitor1().addMatch(m.getCompetitor2(), r); + }); } /** @@ -1846,9 +1933,61 @@ private static Round nextRoundQSwiss(final Round round, final int roundnumber) { } } } else { + // If Cross match accepted, Take 1 competitor per pool which has not + // already played cross match + ArrayList comps = new ArrayList<>(); + if (tour.getParams().isCrossPoolMatch()) { + // Collec coachs without matches + for (int i = 0; i < tour.getPoolCount(); i++) { + Pool p=tour.getPool(i); + ArrayList pComps = p.getCompetitors(); + + // Find the one without cross match match + for (Competitor c : pComps) { + boolean cross = false; + for (int j=0; j pComps=new ArrayList<>(p.getCompetitors()); + // Remove the ones used for cross matches + for (Competitor c:comps) + { + pComps.remove(c); + + } + + genQSwiss(pComps, datas, r); } } return r; @@ -1867,8 +2006,9 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { Round r = new Round(); //final Calendar cal = Calendar.getInstance(); r.setCurrentHour(); + if ((round != null) && (round.isCup())) { - if (((round.getCupTour() == round.getCupMaxTour() - 1) && (!round.isLooserCup())) + if (((round.getCupTour() == round.getCupMaxTour() - 1) && (Tournament.getTournament().getCup().getType() != Cup.ROUND_TYPE.LOOSER)) || (round.getCupTour() == round.getCupMaxTour() + 2)) { JOptionPane.showMessageDialog(MainFrame.getMainFrame(), Translate.translate(CS_FinalRoundReached), @@ -1876,29 +2016,34 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { r = null; } else { - boolean _third_place = false; - if ((round.getCupTour() == round.getCupMaxTour() - 2) && (!round.isLooserCup())) { + /* boolean _third_place = false; + if ((round.getCupTour() == round.getCupMaxTour() - 2) && (Tournament.getTournament().getCup().getType() != Cup.ROUND_TYPE.LOOSER)) { _third_place = JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), Translate.translate(CS_DoYouWantToGenerateThirdPlaceMatch), Translate.translate(Translate.CS_Cup), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; - } - - genCup(round, r, _third_place); - r.setThirdPlace(_third_place); + }*/ + genCup(round, r); + //r.setThirdPlace(_third_place); r.setCup(true); r.setCupMaxTour(round.getCupMaxTour()); r.setCupTour(round.getCupTour() + 1); - r.setLooserCup(round.isLooserCup()); + //r.setLooserCup(round.isLooserCup()); } - } else { + } else /** + * First Round The purpose of this funcion block is to order the + * competitors for first pairing + */ + { int cup_max_tour = 0; int nb_tmp = 1; - r.setLooserCup(JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), + + /* r.setLooserCup(JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), Translate.translate(CS_IsItDoubleKickTournament), Translate.translate(Translate.CS_Cup), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION); + */ if (tour.getParams().isTeamTournament()) { if (tour.getParams().getTeamPairing() == ETeamPairing.INDIVIDUAL_PAIRING) { while (nb_tmp < tour.getActiveCoachNumber()) { @@ -1935,7 +2080,13 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { } if (r != null) { - final JPanel message = new JPanel(); + + if (!round.isCup()) { + JdgCupOptions jdg = new JdgCupOptions(MainFrame.getMainFrame(), true, cup_max_tour); + jdg.setVisible(true); + } + + /*final JPanel message = new JPanel(); message.setLayout(new BorderLayout()); final JLabel jlb = new JLabel( @@ -1950,18 +2101,20 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { JOptionPane.showMessageDialog(MainFrame.getMainFrame(), message, Translate.translate(Translate.CS_Cup), JOptionPane.QUESTION_MESSAGE); - cup_max_tour = (Integer) model.getValue(); - final int nb = (int) Math.pow(2, cup_max_tour); + cup_max_tour = (Integer) model.getValue();*/ + final int nb = (int) Math.pow(2, Tournament.getTournament().getCup().getRoundsCount()); - boolean useCategories = false; + /* boolean useCategories = false; if (tour.getCategoriesCount() > 1) { useCategories = JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), Translate.translate(CS_DoYouWantToUseCategoriesForTheCup), Translate.translate(Translate.CS_Cup), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; - } + }*/ MjtRanking datas; - if (!useCategories) { + if ((Tournament.getTournament().getCup().getInitialDraw() == Cup.INITIAL_DRAW.MANUAL) + || (Tournament.getTournament().getCup().getInitialDraw() == Cup.INITIAL_DRAW.RANDOM) + || (Tournament.getTournament().getCup().getInitialDraw() == Cup.INITIAL_DRAW.RANKING)) { datas = getSortedRankingData(roundnumber); } else { ArrayList cats = new ArrayList<>(); @@ -1980,7 +2133,7 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { jpn.add(jlb2, BorderLayout.NORTH); jpn.add(jls, BorderLayout.CENTER); - JPanel jpnsouth = new JPanel(new GridLayout(2, 2)); + /*JPanel jpnsouth = new JPanel(new GridLayout(2, 2)); JRadioButton jrbMixAll = new JRadioButton(Translate.translate(CS_MixAll)); jrbMixAll.setSelected(true); JRadioButton jrbAbsoluteOrder = new JRadioButton(Translate.translate(CS_MixByAbsoluteRanking)); @@ -1998,19 +2151,34 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { jpnsouth.add(jrbMixGroups); jpnsouth.add(jrbKeepGroup); - jpn.add(jpnsouth, BorderLayout.SOUTH); - + jpn.add(jpnsouth, BorderLayout.SOUTH);*/ while (jls.getSelectedValuesList().isEmpty()) { JOptionPane.showMessageDialog(null, jpn, Translate.translate(Translate.CS_Cup), JOptionPane.QUESTION_MESSAGE); } - int mix = 0; + CATEGORY_DRAW mix = CATEGORY_DRAW.MIX_ALL; // 0: Mix all // 1: Mix by absolute order // 2: Mix by category ranking // 3: No mix - if (jrbMixAll.isSelected()) { + switch (Tournament.getTournament().getCup().getInitialDraw()) { + case CATEGORIES_MIXED: + mix = CATEGORY_DRAW.MIX_ALL; + break; + case CATEGORIES_ABSOLUTE_RANKING: + mix = CATEGORY_DRAW.ABSOLUTE_ORDER; + break; + case CATEGORIES_CROSSED: + mix = CATEGORY_DRAW.CATEGORY_RANKING; + break; + case CATEGORIES_NOT_MIXED: + mix = CATEGORY_DRAW.NO_MIX; + break; + default: + mix = CATEGORY_DRAW.MIX_ALL; + } + /*if (jrbMixAll.isSelected()) { mix = 0; } if (jrbAbsoluteOrder.isSelected()) { @@ -2021,7 +2189,7 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { } if (jrbKeepGroup.isSelected()) { mix = 3; - } + }*/ datas = getSortedRankingDataCategories(roundnumber, jls.getSelectedValuesList(), mix, nb); } @@ -2029,7 +2197,7 @@ private static Round nextRoundCup(final Round round, final int roundnumber) { genCupFirst(r, datas, nb); r.setCup(true); - r.setCupMaxTour(cup_max_tour); + r.setCupMaxTour(Tournament.getTournament().getCup().getRoundsCount()); r.setCupTour(0); } @@ -2314,15 +2482,75 @@ private static Round nextRoundSwiss(final Round round, final int roundnumber, bo } } } else { + + // If Cross match accepted, Take 1 competitor per pool which has not + // already played cross match + ArrayList comps = new ArrayList<>(); + if (tour.getParams().isCrossPoolMatch()) { + // Collec coachs without matches + for (int i = 0; i < tour.getPoolCount(); i++) { + Pool p=tour.getPool(i); + ArrayList pComps = p.getCompetitors(); + + // Find the one without cross match match + for (Competitor c : pComps) { + boolean cross = false; + for (int j=0; j pComps=new ArrayList<>(p.getCompetitors()); + // Remove the ones used for cross matches + for (Competitor c:comps) + { + pComps.remove(c); + + } + + genSwiss(pComps, datas, r, topdown); } } return r; } - private static MjtRanking getSortedRankingDataCategories(int roundNumber, List categories, int mix, int nbPlayers) { + enum CATEGORY_DRAW { + MIX_ALL, + ABSOLUTE_ORDER, + CATEGORY_RANKING, + NO_MIX + }; + + private static MjtRanking getSortedRankingDataCategories(int roundNumber, List categories, CATEGORY_DRAW mix, int nbPlayers) { // First, collect coachs by categories final Tournament tour = Tournament.getTournament(); ArrayList> acomps = new ArrayList<>(); @@ -2384,12 +2612,12 @@ private static MjtRanking getSortedRankingDataCategories(int roundNumber, List c = new ArrayList<>(); - if (mix == 1) { + if (mix == CATEGORY_DRAW.ABSOLUTE_ORDER) { for (MjtRanking r : rankings) { for (int i = 0; i < nb_players; i++) { c.add((Competitor) r.getSortedObject(i).getObject()); @@ -2414,7 +2642,7 @@ private static MjtRanking getSortedRankingDataCategories(int roundNumber, List c = new ArrayList<>(); @@ -2439,7 +2667,7 @@ private static MjtRanking getSortedRankingDataCategories(int roundNumber, List comps = new ArrayList<>(); + if (tour.getParams().isCrossPoolMatch()) { + // Collec coachs without matches + for (int i = 0; i < tour.getPoolCount(); i++) { + Pool p=tour.getPool(i); + ArrayList pComps = p.getCompetitors(); + + // Find the one without cross match match + for (Competitor c : pComps) { + boolean cross = false; + for (int j=0; j pComps=new ArrayList<>(p.getCompetitors()); + // Remove the ones used for cross matches + for (Competitor c:comps) + { + pComps.remove(c); + } + Generation.genRandom(pComps, r); } + + } return r; } diff --git a/src/tourma/utils/NAF.java b/src/tourma/utils/NAF.java index 10d29d78..d10dbc8c 100644 --- a/src/tourma/utils/NAF.java +++ b/src/tourma/utils/NAF.java @@ -28,6 +28,7 @@ import java.util.logging.Logger; import javax.swing.JOptionPane; import org.jdom.Element; +import org.jdom.Document; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import tourma.MainFrame; @@ -41,6 +42,11 @@ public final class NAF { protected static ArrayList coachs = new ArrayList<>(); + protected static boolean _sIgnoreCaps = true; + + public static void setIgnoreCaps(boolean b) { + _sIgnoreCaps = b; + } public static ArrayList getCoachs() { return coachs; @@ -52,6 +58,13 @@ public static NAFCoach getCoachByName(String name) { if (tmp.getName().equals(name)) { c = tmp; break; + } else { + if (_sIgnoreCaps) { + if (tmp.getName().toLowerCase().equals(name.toLowerCase())) { + c = tmp; + break; + } + } } } return c; @@ -111,12 +124,10 @@ public static ArrayList getFileList() { // Close the streams } out.close(); - + // Store this file in the cache list list.add(tempFile); - - } catch (IOException e) { stop = true; } @@ -141,7 +152,7 @@ public static void initCoachs(File file) { Reader fileReader = null; try { - + InputStream is = new FileInputStream(file); if (null != is) { fileReader = new InputStreamReader(is); @@ -149,7 +160,7 @@ public static void initCoachs(File file) { final SAXBuilder sxb = new SAXBuilder(); try { - final org.jdom.Document document = sxb.build(fileReader); + final Document document = sxb.build(fileReader); final Element racine = document.getRootElement(); try { @@ -169,10 +180,10 @@ public static void initCoachs(File file) { } } catch (JDOMException e) { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), e.getLocalizedMessage()); + JOptionPane.showMessageDialog(null, e.getLocalizedMessage() +" Reading file: "+ file.getAbsolutePath()); } catch (IOException e) { - JOptionPane.showMessageDialog(MainFrame.getMainFrame(), e.getMessage()); + JOptionPane.showMessageDialog(null, e.getMessage()+" Reading file: "+ file.getAbsolutePath()); } } } catch (FileNotFoundException e) { diff --git a/src/tourma/utils/NAFIdUpdate.java b/src/tourma/utils/NAFIdUpdate.java index ed930add..1050df10 100644 --- a/src/tourma/utils/NAFIdUpdate.java +++ b/src/tourma/utils/NAFIdUpdate.java @@ -22,8 +22,8 @@ */ public class NAFIdUpdate { - public static final int MAX_NAF_ID = 27000; - public static final int MIN_NAF_ID = 25001; + public static final int MAX_NAF_ID = 30000; + public static final int MIN_NAF_ID = 22001; /** * @param args the command line arguments diff --git a/src/tourma/utils/display/TourmaProtocol.java b/src/tourma/utils/display/TourmaProtocol.java index ebb4b19a..2743eca1 100644 --- a/src/tourma/utils/display/TourmaProtocol.java +++ b/src/tourma/utils/display/TourmaProtocol.java @@ -124,7 +124,8 @@ String processInput(Object object) { Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), - coachs, false, false, Tournament.getTournament().getPoolCount() > 0), + coachs, false, false, Tournament.getTournament().getPoolCount() > 0, + Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1).isCup()), Tournament.getTournament().getRankingTypes(false) ); } @@ -354,7 +355,8 @@ String processInput(Object object) { Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), - coachs, false, false, Tournament.getTournament().getPoolCount() > 0), + coachs, false, false, Tournament.getTournament().getPoolCount() > 0, + Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1).isCup()), Tournament.getTournament().getRankingTypes(false) ); array.add(r); @@ -383,7 +385,9 @@ String processInput(Object object) { Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), - coachs, false, false, Tournament.getTournament().getPoolCount() > 0), + coachs, false, false, Tournament.getTournament().getPoolCount() > 0, + Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1).isCup()), + Tournament.getTournament().getRankingTypes(false) ); array.add(r); @@ -554,7 +558,8 @@ String processInput(Object object) { Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), - p.getCompetitors(), false, false, Tournament.getTournament().getPoolCount() > 0), + p.getCompetitors(), false, false, Tournament.getTournament().getPoolCount() > 0, + Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1).isCup()), Tournament.getTournament().getRankingTypes(false) ); array.add(r); diff --git a/src/tourma/utils/web/WebCup.java b/src/tourma/utils/web/WebCup.java index 108e172f..c8ff4e87 100644 --- a/src/tourma/utils/web/WebCup.java +++ b/src/tourma/utils/web/WebCup.java @@ -48,9 +48,9 @@ public static String getHTML() { // Add Title for the Round sb.append("
"); sb.append("
" + StringEscapeUtils.escapeHtml4(Translate.translate(tourma.languages.Translate.CS_Round)) + " " + (i + 1) + "
"); - if (r.isLooserCup()) { + /* if (r.isLooserCup()) { sb.append("
" + StringEscapeUtils.escapeHtml4(Translate.translate(CS_MainTable)) + " " + (i + 1) + "
"); - } + }*/ sb.append(""); // Add Title Line @@ -73,7 +73,7 @@ public static String getHTML() { sb.append("
"); sb.append("
"); - if (r.isThirdPlace()) { +/* if (r.isThirdPlace()) { sb.append("
"); sb.append("
" + StringEscapeUtils.escapeHtml4(Translate.translate(CS_ThirdPlace)) + "
"); sb.append(" rounds_with_cup.get(0).getMatchsCount()) { - /* We are at maximum looser cup round */ + // We are at maximum looser cup round nb_looseMatch = 0; } @@ -123,7 +123,7 @@ public static String getHTML() { sb.append("
"); sb.append("
"); } - } + }*/ } return sb.toString(); diff --git a/src/tourma/utils/web/WebRound.java b/src/tourma/utils/web/WebRound.java index 4d6a4ddd..6b8aed5f 100644 --- a/src/tourma/utils/web/WebRound.java +++ b/src/tourma/utils/web/WebRound.java @@ -474,7 +474,7 @@ protected static String createIndividualRanking(Round r, ArrayList coachs coachs, Tournament.getTournament().getParams().isTeamTournament(), false, - false); + false,false); s.append("
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/tourma/views/GraphicalMatch.java b/src/tourma/views/GraphicalMatch.java deleted file mode 100644 index 6026fac9..00000000 --- a/src/tourma/views/GraphicalMatch.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package tourma.views; - -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridBagLayout; -import java.util.logging.Logger; -import javax.swing.JLabel; -import javax.swing.border.LineBorder; -import tourma.data.Clan; -import tourma.data.CoachMatch; -import tourma.data.Match; -import tourma.data.TeamMatch; -import tourma.data.Tournament; -import tourma.utils.ImageTreatment; - -/** - * - * @author WFMJ7631 - */ -public class GraphicalMatch extends javax.swing.JPanel { - - private static final long serialVersionUID = 1L; - - private final Match match; - - /** - * - */ - private JLabel clanIcon1 = null; - - /** - * - */ - private JLabel clanIcon2 = null; - - /** - * Creates new form GraphicalMatch - * - * @param m - * @param width - * @param odd - */ - @SuppressFBWarnings({"BC"}) - public GraphicalMatch(Match m, boolean odd, int width) { - initComponents(); - match = m; - this.setSize(getWidth(), 60); - - int computed_height = 60; - int computed_width = 180; - - Color bkg = new Color(255, 255, 255); - if (odd) { - bkg = new Color(220, 220, 220); - } - - this.setBorder(new LineBorder(new Color(200, 200, 200), 1, false)); - - int xOffset = 0; - GridBagLayout gbl = new GridBagLayout(); - this.setLayout(gbl); - - if (match instanceof CoachMatch) { - CoachMatch cm = (CoachMatch) match; - - if (Tournament.getTournament().getClansCount() > 1) { - JLabel ClanIcon1 = new JLabel(); - ClanIcon1.setSize(computed_width, computed_height); - xOffset = computed_width; - ClanIcon1.setLocation(1, 1); - JLabel ClanIcon2 = new JLabel(); - ClanIcon2.setSize(computed_width, computed_height); - ClanIcon2.setLocation(width - computed_width - 1, 1); - Clan clan1 = (cm.getCompetitor1()).getClan(); - if (clan1.getPicture() != null) { - ClanIcon1.setIcon(ImageTreatment.resize(clan1.getPicture(), computed_height, computed_height)); - } - ClanIcon1.setText(clan1.getName()); - Clan clan2 = (cm.getCompetitor2()).getClan(); - if (clan2.getPicture() != null) { - ClanIcon2.setIcon(ImageTreatment.resize(clan2.getPicture(), computed_height, computed_height)); - } - ClanIcon2.setText(clan2.getName()); - ClanIcon1.setOpaque(true); - ClanIcon1.setBackground(bkg); - ClanIcon2.setOpaque(true); - ClanIcon2.setBackground(bkg); - } - - JLabel CoachIcon1 = new JLabel(); - CoachIcon1.setSize(computed_width, computed_height); - CoachIcon1.setLocation(xOffset + 1, 1); - JLabel CoachIcon2 = new JLabel(); - CoachIcon2.setSize(computed_width, computed_height); - CoachIcon2.setLocation(width - xOffset - computed_width - 1, 1); - if (cm.getCompetitor1().getPicture() != null) { - CoachIcon1.setIcon(ImageTreatment.resize(cm.getCompetitor1().getPicture(), computed_height, computed_height)); - } - CoachIcon1.setText(cm.getCompetitor1().getName()); - if (cm.getCompetitor2().getPicture() != null) { - CoachIcon2.setIcon(ImageTreatment.resize(cm.getCompetitor2().getPicture(), computed_height, computed_height)); - } - CoachIcon2.setText(cm.getCompetitor2().getName()); - CoachIcon1.setBackground(bkg); - CoachIcon1.setOpaque(true); - CoachIcon2.setBackground(bkg); - CoachIcon2.setOpaque(true); - this.add(CoachIcon1); - this.add(CoachIcon2); - - } - if (match instanceof TeamMatch) { - TeamMatch tm; - tm = (TeamMatch) match; - this.setSize(80 * tm.getMatchCount() + 80, 400); - } - this.setPreferredSize(new Dimension(width, computed_height)); - this.setSize(new Dimension(width, computed_height)); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - setPreferredSize(new java.awt.Dimension(400, 150)); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 552, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 144, Short.MAX_VALUE) - ); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables - private static final Logger LOG = Logger.getLogger(GraphicalMatch.class.getName()); - - /** - * @return the clanIcon1 - */ - public JLabel getClanIcon1() { - return clanIcon1; - } - - /** - * @param clanIcon1 the clanIcon1 to set - */ - public void setClanIcon1(JLabel clanIcon1) { - this.clanIcon1 = clanIcon1; - } - - /** - * @return the clanIcon2 - */ - public JLabel getClanIcon2() { - return clanIcon2; - } - - /** - * @param clanIcon2 the clanIcon2 to set - */ - public void setClanIcon2(JLabel clanIcon2) { - this.clanIcon2 = clanIcon2; - } - - private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { - throw new java.io.NotSerializableException(getClass().getName()); - } - - private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { - throw new java.io.NotSerializableException(getClass().getName()); - } -} diff --git a/src/tourma/views/JPNCup.java b/src/tourma/views/JPNCup.java index aa5201e3..153b41cf 100644 --- a/src/tourma/views/JPNCup.java +++ b/src/tourma/views/JPNCup.java @@ -4,8 +4,17 @@ */ package tourma.views; +import java.awt.FlowLayout; +import java.awt.GridLayout; import java.util.ArrayList; import java.util.logging.Logger; +import javax.swing.BoxLayout; +import javax.swing.JPanel; +import javax.swing.JSeparator; +import org.jfree.ui.tabbedui.VerticalLayout; +import tourma.data.Cup; +import tourma.data.CupRound; +import tourma.data.CupTable; import tourma.data.Match; import tourma.data.Round; import tourma.data.Tournament; @@ -58,15 +67,62 @@ private void initComponents() { * Update panel */ public void update() { + + jpnCup.removeAll(); + + int nbTables = Tournament.getTournament().getCup().getTables().size(); + int nbRounds=Tournament.getTournament().getCup().getRoundsCount(); + + jpnCup.setLayout(new BoxLayout(jpnCup,BoxLayout.Y_AXIS)); + + for (CupTable table : Tournament.getTournament().getCup().getTables()) { + // Compute High of this table Part + JPanel jpnTab = new JPanel(new FlowLayout(FlowLayout.CENTER)); + // @TODO compute W starting offset & gap for this round + for (int i = table.getCupRounds().size() - 1; i >= 0; i--) { + CupRound round = table.getCupRounds().get(i); + JPanel jpn = new JPanel(new GridLayout(round.getNbMatchs(), 1)); + + for (int j = 0; j < round.getNbMatchs(); j++) { + Match match = round.getMatchs().get(j); + + // If the match is empty, draw it empty + if ((match.getCompetitor1() != null) && (match.getCompetitor2() != null)) { + if ((!match.getCompetitor1().getName().equals("")) && (!match.getCompetitor2().getName().equals(""))) { + // Find real match in the rounds + // Build Graphical panel + // Draw it + for (int cpt_r = 0; cpt_r < Tournament.getTournament().getRoundsCount(); cpt_r++) { + Round r = Tournament.getTournament().getRound(cpt_r); + + for (int cpt_m = 0; cpt_m < r.getMatchsCount(); cpt_m++) { + Match m = r.getMatch(cpt_m); + if ((m.getCompetitor1() == match.getCompetitor1()) && (m.getCompetitor2() == match.getCompetitor2())) { + JPNMatch g_match = new JPNMatch(m, true); + jpn.add(g_match); + } + } + } + } + } + } + jpnTab.add(jpn); + } + + jpnCup.add(jpnTab); + jpnCup.add(new JSeparator(JSeparator.HORIZONTAL)); + } + final ArrayList rounds_with_cup = new ArrayList<>(); + //final ArrayList rounds = Tournament.getTournament().getRounds(); - boolean bLooserCup = false; + /*boolean bLooserCup = false; for (int i = 0; i < Tournament.getTournament().getRoundsCount(); i++) { Round round = Tournament.getTournament().getRound(i); if (round.isCup()) { rounds_with_cup.add(round); - if (round.isLooserCup()) { + if (Tournament.getTournament().getCup().getType()==Cup.ROUND_TYPE.LOOSER) { bLooserCup = true; } } @@ -80,7 +136,8 @@ public void update() { } jpnCup.setSize(max_width, max_heigth); - final int max_nb_match = (int) Math.pow(2, rounds_with_cup.get(0).getCupMaxTour() - 1); + int nb_rounds=Tournament.getTournament().getCup().getRoundsCount(); + final int max_nb_match = (int) Math.pow(2, nb_rounds - 1); final int base_high = 60; final int total_high = 60 * max_nb_match; @@ -90,7 +147,7 @@ public void update() { int offset = 0; for (int i = 0; i < rounds_with_cup.size(); i++) { final Round r = rounds_with_cup.get(i); - final int remaining_tour = r.getCupMaxTour() - r.getCupTour() + 1; + final int remaining_tour = nb_rounds - r.getCupTour() + 1; int nb_match = (int) Math.pow(2, remaining_tour - 1) / 2; if (nb_match == 0) { nb_match = 1; @@ -116,7 +173,7 @@ public void update() { } - if (r.isThirdPlace()) { + if (Tournament.getTournament().getCup().getType()==Cup.ROUND_TYPE.CLASSIC_THIRD) { Match m; m = r.getMatch(nb_match); @@ -128,17 +185,17 @@ public void update() { nb_match++; } - if (r.isLooserCup()) { + if (Tournament.getTournament().getCup().getType()==Cup.ROUND_TYPE.LOOSER) { if (r.getCupTour() > 0) { nb_looseMatch = nb_looseMatch / 2 + nb_match; - /* Check the maximum round for looser cup */ + // Check the maximum round for looser cup if (Math.round(Math.pow(2, i - 1) / 2) == rounds_with_cup.get(0).getMatchsCount()) { - /* We are at maximum looser cup round */ + // We are at maximum looser cup round nb_looseMatch = 1; } if (Math.pow(2, i - 1) / 2 > rounds_with_cup.get(0).getMatchsCount()) { - /* We are at maximum looser cup round */ + // We are at maximum looser cup round nb_looseMatch = 0; } @@ -158,7 +215,7 @@ public void update() { } } } - } + }*/ } private static final Logger LOG = Logger.getLogger(JPNCup.class.getName()); } diff --git a/src/tourma/views/JPNStatistics.java b/src/tourma/views/JPNStatistics.java index 15df5f08..db6a7d4c 100644 --- a/src/tourma/views/JPNStatistics.java +++ b/src/tourma/views/JPNStatistics.java @@ -832,7 +832,7 @@ public void valueChanged(ListSelectionEvent e) { MjtRankingIndiv ranking = new MjtRankingIndiv(i, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), coach, mTournament.getParams().isTeamTournament(), false, - false); + false,false); ArrayList coach_names = new ArrayList<>(); int count = ranking.getRowCount(); diff --git a/src/tourma/views/fullscreen/JFullScreenIndivRank.java b/src/tourma/views/fullscreen/JFullScreenIndivRank.java index 09e4cdaa..d8ce9b09 100644 --- a/src/tourma/views/fullscreen/JFullScreenIndivRank.java +++ b/src/tourma/views/fullscreen/JFullScreenIndivRank.java @@ -231,7 +231,8 @@ public JFullScreenIndivRank(int r, int type) throws IOException { MjtRankingIndiv ranking = new MjtRankingIndiv(round, Tournament.getTournament().getParams().getRankingIndiv1(), Tournament.getTournament().getParams().getRankingIndiv2(), Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), coaches, Tournament.getTournament().getParams().isTeamTournament(), false, - Tournament.getTournament().getPoolCount() > 0); + Tournament.getTournament().getPoolCount() > 0, + Tournament.getTournament().getRound(round).isCup()); ranking.setDetail(Ranking.CS_General); rankeds.add(ranking); @@ -251,7 +252,7 @@ public JFullScreenIndivRank(int r, int type) throws IOException { MjtRankingIndiv ranking = new MjtRankingIndiv(round, Tournament.getTournament().getParams().getRankingIndiv1(), Tournament.getTournament().getParams().getRankingIndiv2(), Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), coaches, Tournament.getTournament().getParams().isTeamTournament(), false, - false); + false,false); ranking.setDetail(g.getName()); rankeds.add(ranking); } @@ -271,7 +272,7 @@ public JFullScreenIndivRank(int r, int type) throws IOException { MjtRankingIndiv ranking = new MjtRankingIndiv(round, Tournament.getTournament().getParams().getRankingIndiv1(), Tournament.getTournament().getParams().getRankingIndiv2(), Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), coaches, Tournament.getTournament().getParams().isTeamTournament(), false, - false); + false,false); ranking.setDetail(cat.getName()); rankeds.add(ranking); } @@ -284,7 +285,7 @@ public JFullScreenIndivRank(int r, int type) throws IOException { MjtRankingIndiv ranking = new MjtRankingIndiv(round, Tournament.getTournament().getParams().getRankingIndiv1(), Tournament.getTournament().getParams().getRankingIndiv2(), Tournament.getTournament().getParams().getRankingIndiv3(), Tournament.getTournament().getParams().getRankingIndiv4(), Tournament.getTournament().getParams().getRankingIndiv5(), p.getCompetitors(), Tournament.getTournament().getParams().isTeamTournament(), false, - false); + false,false); ranking.setDetail(Integer.toString(i + 1)); rankeds.add(ranking); } diff --git a/src/tourma/views/parameters/JPNParamCategories.java b/src/tourma/views/parameters/JPNParamCategories.java index 8632c4f6..64af5b72 100644 --- a/src/tourma/views/parameters/JPNParamCategories.java +++ b/src/tourma/views/parameters/JPNParamCategories.java @@ -151,7 +151,7 @@ private void jbtEditCategoryActionPerformed(java.awt.event.ActionEvent evt) {//G final String newCategoryName = JOptionPane.showInputDialog(this, enterCategoryName, categoryName); if (!newCategoryName.equals(StringConstants.CS_NULL)) { Category cat = mTournament.getCategory(jlsCategories.getSelectedIndex()); - cat.setmName(newCategoryName); + cat.setName(newCategoryName); Category.delCategory(categoryName); Category.putCategory(newCategoryName, cat); } diff --git a/src/tourma/views/parameters/JPNParamCriterias.java b/src/tourma/views/parameters/JPNParamCriterias.java index 2286351a..28f25bb0 100644 --- a/src/tourma/views/parameters/JPNParamCriterias.java +++ b/src/tourma/views/parameters/JPNParamCriterias.java @@ -4,8 +4,10 @@ */ package tourma.views.parameters; +import javax.swing.JOptionPane; import javax.swing.JSpinner; import tourma.data.CoachMatch; + import tourma.data.Criteria; import tourma.data.ETeamPairing; import tourma.data.Round; @@ -29,21 +31,20 @@ public final class JPNParamCriterias extends javax.swing.JPanel { */ public JPNParamCriterias() { - mTournament = Tournament.getTournament(); + mTournament = Tournament.getTournament(); initComponents(); - - if ( - (!mTournament.getParams().isTeamTournament()) - || - ( - (mTournament.getParams().isTeamTournament()) - && - (mTournament.getParams().getTeamPairing()==ETeamPairing.INDIVIDUAL_PAIRING) - ) - ) - { - jtpCriterias.remove(jspTeamBonuses); - } + + jspCoef.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + jspCoefStateChanged(evt); + } + }); + + if ((!mTournament.getParams().isTeamTournament()) + || ((mTournament.getParams().isTeamTournament()) + && (mTournament.getParams().getTeamPairing() == ETeamPairing.INDIVIDUAL_PAIRING))) { + jtpCriterias.remove(jspTeamBonuses); + } } private final static String CS_Criteria = "CRITÈRE"; @@ -184,48 +185,48 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) { }// //GEN-END:initComponents @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) private void jbtAddCriteriaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtAddCriteriaActionPerformed - final int nb = Tournament.getTournament().getParams().getCriteriaCount(); - final Criteria c = new Criteria( - Translate.translate(CS_Criteria) - + " " + Integer.toString(nb)); - Tournament.getTournament().getParams().addCriteria(c); - for (int i = 0; i < mTournament.getRoundsCount(); i++) { - final Round r = mTournament.getRound(i); - for (int j = 0; j < r.getCoachMatchs().size(); j++) { - final CoachMatch m = r.getCoachMatchs().get(j); - m.putValue(c, new Value(c)); - } + final int nb = Tournament.getTournament().getParams().getCriteriaCount(); + final Criteria c = new Criteria( + Translate.translate(CS_Criteria) + + " " + Integer.toString(nb)); + Tournament.getTournament().getParams().addCriteria(c); + for (int i = 0; i < mTournament.getRoundsCount(); i++) { + final Round r = mTournament.getRound(i); + for (int j = 0; j < r.getCoachMatchs().size(); j++) { + final CoachMatch m = r.getCoachMatchs().get(j); + m.putValue(c, new Value(c)); } + } update(); }//GEN-LAST:event_jbtAddCriteriaActionPerformed @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) private void jbtRemoveCriteriaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtRemoveCriteriaActionPerformed - if ((jtbCriteria.getSelectedRow() > 1) && (jtbCriteria.getSelectedRow() < mTournament.getParams().getCriteriaCount())) { - final Criteria crit = mTournament.getParams().getCriteria(jtbCriteria.getSelectedRow()); - for (int i = 0; i < mTournament.getRoundsCount(); i++) { - final Round r = mTournament.getRound(i); - for (int j = 0; j < r.getCoachMatchs().size(); j++) { - final CoachMatch m = r.getCoachMatchs().get(j); - m.removeValue(crit); - } + if ((jtbCriteria.getSelectedRow() > 1) && (jtbCriteria.getSelectedRow() < mTournament.getParams().getCriteriaCount())) { + final Criteria crit = mTournament.getParams().getCriteria(jtbCriteria.getSelectedRow()); + for (int i = 0; i < mTournament.getRoundsCount(); i++) { + final Round r = mTournament.getRound(i); + for (int j = 0; j < r.getCoachMatchs().size(); j++) { + final CoachMatch m = r.getCoachMatchs().get(j); + m.removeValue(crit); } - mTournament.getParams().removeCriteria(jtbCriteria.getSelectedRow()); } + mTournament.getParams().removeCriteria(jtbCriteria.getSelectedRow()); + } repaint(); }//GEN-LAST:event_jbtRemoveCriteriaActionPerformed private void jcxTableCoefPerRoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxTableCoefPerRoundActionPerformed - Tournament.getTournament().getParams().setTableBonusPerRound(jcxTableCoefPerRound.isSelected()); + Tournament.getTournament().getParams().setTableBonusPerRound(jcxTableCoefPerRound.isSelected()); update(); }//GEN-LAST:event_jcxTableCoefPerRoundActionPerformed private void jcxTableBonusActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxTableBonusActionPerformed - Tournament.getTournament().getParams().setTableBonus(jcxTableBonus.isSelected()); + Tournament.getTournament().getParams().setTableBonus(jcxTableBonus.isSelected()); update(); }//GEN-LAST:event_jcxTableBonusActionPerformed private void jspCoefStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jspCoefStateChanged - Tournament.getTournament().getParams().setTableBonusCoef((Double) jspCoef.getValue()); + Tournament.getTournament().getParams().setTableBonusCoef((Double) jspCoef.getValue()); update(); }//GEN-LAST:event_jspCoefStateChanged @@ -233,37 +234,33 @@ private void jspCoefStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST * Update Panel */ public void update() { - - final boolean bTourStarted = false;//mTournament.getRoundsCount() > 0; - jtbCriteria.setModel(new MjtCriterias(mTournament)); - jtbPlayerBonuses.setModel(new MjtCriteriasIndivBonus(mTournament)); - - if (!Tournament.getTournament().getParams().isTeamTournament()) - { - jtbTeamBonus.setEnabled(false); - } - else - { - jtbTeamBonus.setModel(new MjtCriteriasTeamBonus(mTournament)); - } - - if (Tournament.getTournament().isClient()) - { - jtbCriteria.setEnabled(false); - jcxTableBonus.setEnabled(false); - jcxTableCoefPerRound.setEnabled(false); - jspCoef.setEnabled(false); - } - - jbtAddCriteria.setEnabled(!bTourStarted && !Tournament.getTournament().isClient()); - jbtRemoveCriteria.setEnabled(!bTourStarted && !Tournament.getTournament().isClient()); - - jcxTableBonus.setSelected(mTournament.getParams().isTableBonus()); - jcxTableCoefPerRound.setSelected(mTournament.getParams().isTableBonusPerRound()); - - jspCoef.setValue(Tournament.getTournament().getParams().getTableBonusCoef()); - jspCoef.setEnabled(mTournament.getParams().isTableBonus()); - jlbCoef.setEnabled(mTournament.getParams().isTableBonus()); + + final boolean bTourStarted = false;//mTournament.getRoundsCount() > 0; + jtbCriteria.setModel(new MjtCriterias(mTournament)); + jtbPlayerBonuses.setModel(new MjtCriteriasIndivBonus(mTournament)); + + if (!Tournament.getTournament().getParams().isTeamTournament()) { + jtbTeamBonus.setEnabled(false); + } else { + jtbTeamBonus.setModel(new MjtCriteriasTeamBonus(mTournament)); + } + + if (Tournament.getTournament().isClient()) { + jtbCriteria.setEnabled(false); + jcxTableBonus.setEnabled(false); + jcxTableCoefPerRound.setEnabled(false); + jspCoef.setEnabled(false); + } + + jbtAddCriteria.setEnabled(!bTourStarted && !Tournament.getTournament().isClient()); + jbtRemoveCriteria.setEnabled(!bTourStarted && !Tournament.getTournament().isClient()); + + jcxTableBonus.setSelected(mTournament.getParams().isTableBonus()); + jcxTableCoefPerRound.setSelected(mTournament.getParams().isTableBonusPerRound()); + + jspCoef.setValue(Tournament.getTournament().getParams().getTableBonusCoef()); + jspCoef.setEnabled(mTournament.getParams().isTableBonus()); + jlbCoef.setEnabled(mTournament.getParams().isTableBonus()); } // Variables declaration - do not modify//GEN-BEGIN:variables diff --git a/src/tourma/views/parameters/JPNParamFormulas.form b/src/tourma/views/parameters/JPNParamFormulas.form new file mode 100644 index 00000000..12531cbb --- /dev/null +++ b/src/tourma/views/parameters/JPNParamFormulas.form @@ -0,0 +1,102 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + +
+ diff --git a/src/tourma/views/parameters/JPNParamFormulas.java b/src/tourma/views/parameters/JPNParamFormulas.java new file mode 100644 index 00000000..4e8ba2aa --- /dev/null +++ b/src/tourma/views/parameters/JPNParamFormulas.java @@ -0,0 +1,168 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package tourma.views.parameters; + +import javax.swing.JOptionPane; +import javax.swing.JSpinner; +import tourma.data.CoachMatch; +import tourma.data.Criteria; + +import tourma.data.Formula; +import tourma.data.ETeamPairing; +import tourma.data.Round; +import tourma.data.Tournament; +import tourma.data.Value; +import tourma.languages.Translate; +import tourma.tableModel.MjtFormulas; + + +/** + * + * @author WFMJ7631 + */ +public final class JPNParamFormulas extends javax.swing.JPanel { + + private Tournament mTournament; + + public JPNParamFormulas() { + + mTournament = Tournament.getTournament(); + initComponents(); + + } + + private final static String CS_Formula = "FORMULE"; + private final static String CS_Possible_Variables="Variables possibles"; + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings({"unchecked", "PMD"}) + // //GEN-BEGIN:initComponents + private void initComponents() { + + jPanel16 = new javax.swing.JPanel(); + jbtAddFormula = new javax.swing.JButton(); + jbtRemoveFormula = new javax.swing.JButton(); + jScrollPane5 = new javax.swing.JScrollPane(); + jtbFormulas = new javax.swing.JTable(); + jScrollPane1 = new javax.swing.JScrollPane(); + jtxpDescription = new javax.swing.JTextPane(); + + setLayout(new java.awt.BorderLayout()); + + jbtAddFormula.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Add.png"))); // NOI18N + java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("tourma/languages/language"); // NOI18N + jbtAddFormula.setText(bundle.getString("AJOUTER FORMULA")); // NOI18N + jbtAddFormula.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtAddFormulaActionPerformed(evt); + } + }); + jPanel16.add(jbtAddFormula); + + jbtRemoveFormula.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Close.png"))); // NOI18N + jbtRemoveFormula.setText(bundle.getString("RETIRER FORMULE")); // NOI18N + jbtRemoveFormula.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jbtRemoveFormulaActionPerformed(evt); + } + }); + jPanel16.add(jbtRemoveFormula); + + add(jPanel16, java.awt.BorderLayout.PAGE_START); + + jtbFormulas.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null} + }, + new String [] { + "Title 1", "Title 2", "Title 3", "Title 4" + } + )); + jScrollPane5.setViewportView(jtbFormulas); + + add(jScrollPane5, java.awt.BorderLayout.CENTER); + + jtxpDescription.setEditable(false); + jScrollPane1.setViewportView(jtxpDescription); + + add(jScrollPane1, java.awt.BorderLayout.SOUTH); + }// //GEN-END:initComponents + @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) + private void jbtAddFormulaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtAddFormulaActionPerformed + final int nb = Tournament.getTournament().getParams().getFormulaCount(); + final Formula f = new Formula( + Translate.translate(CS_Formula) + + " " + Integer.toString(nb)); + f.setFormula(Tournament.getTournament().getParams().getCriteria(0).getAccronym()+"1"); + Tournament.getTournament().getParams().addFormula(f); + + for (int i = 0; i < mTournament.getRoundsCount(); i++) { + final Round r = mTournament.getRound(i); + for (int j = 0; j < r.getCoachMatchs().size(); j++) { + final CoachMatch m = r.getCoachMatchs().get(j); + m.putValue(f,new Value(f)); + } + } + update(); + }//GEN-LAST:event_jbtAddFormulaActionPerformed + @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.MethodArgumentCouldBeFinal"}) + private void jbtRemoveFormulaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtRemoveFormulaActionPerformed + if (jtbFormulas.getSelectedRow() < mTournament.getParams().getFormulaCount()) { + final Formula form = mTournament.getParams().getFormula(jtbFormulas.getSelectedRow()); + for (int i = 0; i < mTournament.getRoundsCount(); i++) { + final Round r = mTournament.getRound(i); + for (int j = 0; j < r.getCoachMatchs().size(); j++) { + final CoachMatch m = r.getCoachMatchs().get(j); + m.removeValue(form); + } + } + mTournament.getParams().removeFormula(jtbFormulas.getSelectedRow()); + } + repaint(); + }//GEN-LAST:event_jbtRemoveFormulaActionPerformed + + /** + * Update Panel + */ + public void update() { + + final boolean bTourStarted = false;//mTournament.getRoundsCount() > 0; + jtbFormulas.setModel(new MjtFormulas(mTournament)); + + if (Tournament.getTournament().isClient()) { + jtbFormulas.setEnabled(false); + } + + jbtAddFormula.setEnabled(!bTourStarted && !Tournament.getTournament().isClient()); + jbtRemoveFormula.setEnabled(!bTourStarted && !Tournament.getTournament().isClient()); + + String description=Translate.translate(CS_Possible_Variables); + description+="\n"; + for (int i=0; i + + + diff --git a/src/tourma/views/parameters/JPNParameters.java b/src/tourma/views/parameters/JPNParameters.java index 1e3f0338..2301303e 100644 --- a/src/tourma/views/parameters/JPNParameters.java +++ b/src/tourma/views/parameters/JPNParameters.java @@ -26,11 +26,13 @@ public final class JPNParameters extends javax.swing.JPanel { private final JPNParamClan mJpnClan; private final JPNParamTeam mJpnTeam; private final JPNParamCriterias mJpnCriterias; + private final JPNParamFormulas mJpnFormulas; private final JPNParamIndiv mJpnIndiv; private final JPNTeams jpnTeamTour; private final static String CS_Individual = "Individual"; private final static String CS_Criterias = "Criterias"; + private final static String CS_Formulas = "Formulas"; private final static String CS_ByTeam = "ByTeam"; private final static String CS_Clan = "Clan"; private final static String CS_Group = "Group"; @@ -48,6 +50,7 @@ public JPNParameters() { mJpnIndiv = new JPNParamIndiv(); mJpnCriterias = new JPNParamCriterias(); + mJpnFormulas = new JPNParamFormulas(); mJpnTeam = new JPNParamTeam(); mJpnGroup = new JPNParamGroup(); mJpnClan = new JPNParamClan(); @@ -61,6 +64,10 @@ public JPNParameters() { Translate.translate(CS_Criterias), new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Tools.png")), mJpnCriterias); + jtpOptions.addTab( + Translate.translate(CS_Formulas), + new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Formula.png")), + mJpnFormulas); jtpOptions.addTab( Translate.translate(CS_ByTeam), new javax.swing.ImageIcon(getClass().getResource("/tourma/images/Team.png")), @@ -121,14 +128,14 @@ public void update() { mJpnIndiv.update(); mJpnCriterias.update(); + mJpnFormulas.update(); mJpnTeam.update(); mJpnClan.update(); mJpnGroup.update(); mJpnCategories.update(); - jtpOptions.setEnabledAt(4, !mTournament.getParams().isMultiRoster()); - jtpOptions.setEnabledAt(2, mTournament.getParams().isTeamTournament()); -// jtpOptions.setEnabledAt(3, !mTournament.getParams().mTeamTournament); + jtpOptions.setEnabledAt(5, !mTournament.getParams().isMultiRoster()); + jtpOptions.setEnabledAt(3, mTournament.getParams().isTeamTournament()); jtfOrgas.setText(mTournament.getParams().getTournamentOrga()); jtfTournamentName.setText(mTournament.getParams().getTournamentName()); @@ -228,6 +235,12 @@ public void keyPressed(java.awt.event.KeyEvent evt) { jPanel9.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("RankingParametersKey"))); // NOI18N jPanel9.setLayout(new java.awt.BorderLayout()); + + jtpOptions.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + jtpOptionsMouseClicked(evt); + } + }); jPanel9.add(jtpOptions, java.awt.BorderLayout.CENTER); jPanel1.add(jPanel9, java.awt.BorderLayout.CENTER); @@ -348,6 +361,10 @@ private void jtfPlaceKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_ }//GEN-LAST:event_jtfPlaceKeyPressed + private void jtpOptionsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jtpOptionsMouseClicked + mJpnFormulas.update(); + }//GEN-LAST:event_jtpOptionsMouseClicked + // Variables declaration - do not modify//GEN-BEGIN:variables private com.toedter.calendar.JDateChooser jDate; private javax.swing.JLabel jLabel1; diff --git a/src/tourma/views/round/JPNAnnexRanking.java b/src/tourma/views/round/JPNAnnexRanking.java index 1341b3ae..8854c3c2 100644 --- a/src/tourma/views/round/JPNAnnexRanking.java +++ b/src/tourma/views/round/JPNAnnexRanking.java @@ -15,6 +15,7 @@ import tourma.MainFrame; import tourma.data.Coach; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.Parameters; import tourma.data.Round; import tourma.data.Team; @@ -35,6 +36,7 @@ public final class JPNAnnexRanking extends javax.swing.JPanel { private String mName = ""; private Criteria mCriteria = null; + private Formula mFormula = null; private Tournament mTour = null; private Round mRound = null; private boolean mClan; @@ -63,6 +65,10 @@ public JPNAnnexRanking(final String name, final Criteria criteria, final Tournam this(name, criteria, tour, round, clan, team, coachs, teams); } + public JPNAnnexRanking(final String name, final Formula formula, final Tournament tour, final ArrayList coachs, final ArrayList teams, final Round round, final boolean clan, final boolean team) { + this(name, formula, tour, round, clan, team, coachs, teams); + } + /** * * @param r @@ -120,6 +126,41 @@ public JPNAnnexRanking(final String name, final Criteria criteria, final Tournam update(); } + public JPNAnnexRanking(final String name, final Formula formula, final Tournament tour, final Round round, final boolean clan, final boolean team, final ArrayList v, final ArrayList t) { + initComponents(); + mName = name; + mCriteria = null; + mFormula = formula; + + mTour = tour; + mRound = round; + mClan = clan; + mTeam = team; + + mCoachs = v; + mTeams = t; + + int roundnumber = 0; + while (!round.equals(tour.getRound(roundnumber))) { + roundnumber++; + } + + if (clan) { + jbtPositive.setText(name + "(" + Translate.translate(CS_Clan) + ")"); + jbtNegative.setText(name + "(" + Translate.translate(CS_Opponents) + ")"); + } else { + if (team) { + jbtPositive.setText(name + "(" + Translate.translate(CS_Team) + ")"); + jbtNegative.setText(name + "(" + Translate.translate(CS_Opponents) + ")"); + } else { + jbtPositive.setText(name + "(" + Translate.translate(CS_Coach) + ")"); + jbtNegative.setText(name + "(" + Translate.translate(CS_Opponents) + ")"); + } + } + + update(); + } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -219,15 +260,30 @@ private void jbtPositiveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F if (mRound == mTour.getRound(i)) { MjtAnnexRank model; if (mClan) { - model = new MjtAnnexRankClan(i, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, - mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + if (mCriteria != null) { + model = new MjtAnnexRankClan(i, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } else { + model = new MjtAnnexRankClan(i, mFormula, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + + } } else { if (mTeam) { - model = new MjtAnnexRankTeam(i, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, - mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + if (mCriteria != null) { + model = new MjtAnnexRankTeam(i, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } else { + model = new MjtAnnexRankTeam(i, mFormula, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } } else { - model = new MjtAnnexRankIndiv(i, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + if (mCriteria != null) { + model = new MjtAnnexRankIndiv(i, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + } else { + model = new MjtAnnexRankIndiv(i, mFormula, Parameters.C_RANKING_SUBTYPE_POSITIVE, mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + } } } final StringBuffer a = new StringBuffer(mCriteria.getName()); @@ -254,15 +310,31 @@ private void jbtNegativeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F if (mRound == mTour.getRound(i)) { MjtAnnexRank model; if (mClan) { - model = new MjtAnnexRankClan(i, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, - mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + if (mCriteria != null) { + model = new MjtAnnexRankClan(i, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } else { + model = new MjtAnnexRankClan(i, mFormula, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + + } } else { if (mTeam) { - model = new MjtAnnexRankTeam(i, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, - mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + if (mCriteria != null) { + model = new MjtAnnexRankTeam(i, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } else { + model = new MjtAnnexRankTeam(i, mFormula, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } } else { - model = new MjtAnnexRankIndiv(i, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, - mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + if (mCriteria != null) { + model = new MjtAnnexRankIndiv(i, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + } else { + model = new MjtAnnexRankIndiv(i, mFormula, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + } } } @@ -314,25 +386,51 @@ public void update() { MjtAnnexRank modelNeg; if (mClan) { - modelPos - = new MjtAnnexRankClan(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, - mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); - modelNeg - = new MjtAnnexRankClan(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, - mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); - } else { - if (mTeam) { + if (mCriteria != null) { modelPos - = new MjtAnnexRankTeam(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, - mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + = new MjtAnnexRankClan(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); modelNeg - = new MjtAnnexRankTeam(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, - mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + = new MjtAnnexRankClan(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); } else { modelPos - = new MjtAnnexRankIndiv(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, this.mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + = new MjtAnnexRankClan(v.size() - 1, mFormula, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); modelNeg - = new MjtAnnexRankIndiv(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, this.mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + = new MjtAnnexRankClan(v.size() - 1, mFormula, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTour.getDisplayClans(), true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + + } + } else { + if (mCriteria != null) { + if (mTeam) { + modelPos + = new MjtAnnexRankTeam(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + modelNeg + = new MjtAnnexRankTeam(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } else { + modelPos + = new MjtAnnexRankIndiv(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_POSITIVE, this.mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + modelNeg + = new MjtAnnexRankIndiv(v.size() - 1, mCriteria, Parameters.C_RANKING_SUBTYPE_NEGATIVE, this.mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + } + } else { + if (mTeam) { + modelPos + = new MjtAnnexRankTeam(v.size() - 1, mFormula, Parameters.C_RANKING_SUBTYPE_POSITIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + modelNeg + = new MjtAnnexRankTeam(v.size() - 1, mFormula, Parameters.C_RANKING_SUBTYPE_NEGATIVE, + mTeams, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mRoundOnly); + } else { + modelPos + = new MjtAnnexRankIndiv(v.size() - 1, mFormula, Parameters.C_RANKING_SUBTYPE_POSITIVE, this.mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + modelNeg + = new MjtAnnexRankIndiv(v.size() - 1, mFormula, Parameters.C_RANKING_SUBTYPE_NEGATIVE, this.mCoachs, true, mTour.getParams().getRankingIndiv1(), mTour.getParams().getRankingIndiv2(), mTour.getParams().getRankingIndiv3(), mTour.getParams().getRankingIndiv4(), mTour.getParams().getRankingIndiv5(), mTour.getParams().isTeamTournament(), mRoundOnly); + } } } jtbNegative.setModel(modelNeg); diff --git a/src/tourma/views/round/JPNCategory.java b/src/tourma/views/round/JPNCategory.java index fe6d4a16..52a9d33c 100644 --- a/src/tourma/views/round/JPNCategory.java +++ b/src/tourma/views/round/JPNCategory.java @@ -172,7 +172,7 @@ public void update() { } final MjtRankingIndiv tableModel = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), - al, mTournament.getParams().isTeamTournament(), mRoundOnly, false); + al, mTournament.getParams().isTeamTournament(), mRoundOnly, false,false); jtbCategory.setModel(tableModel); jtbCategory.setDefaultRenderer(String.class, tableModel); jtbCategory.setDefaultRenderer(Integer.class, tableModel); diff --git a/src/tourma/views/round/JPNClan.java b/src/tourma/views/round/JPNClan.java index 1a5d0f6f..67aeedc7 100644 --- a/src/tourma/views/round/JPNClan.java +++ b/src/tourma/views/round/JPNClan.java @@ -15,6 +15,7 @@ import tourma.MainFrame; import tourma.data.Coach; import tourma.data.Criteria; +import tourma.data.Formula; import tourma.data.Parameters; import tourma.data.Round; import tourma.data.Team; @@ -62,11 +63,18 @@ public JPNClan(final Round r, final Tournament t) { for (int cpt = 0; cpt < t.getCoachsCount(); cpt++) { coachs.add(t.getCoach(cpt)); } + for (int i = 0; i < mTournament.getParams().getCriteriaCount(); i++) { final Criteria criteria = mTournament.getParams().getCriteria(i); final JPNAnnexRanking jpn = new JPNAnnexRanking(criteria.getName(), criteria, t, coachs, teams, mRound, true, false); jtpAnnexRank.add(criteria.getName(), jpn); } + + for (int i = 0; i < mTournament.getParams().getFormulaCount(); i++) { + final Formula formula = mTournament.getParams().getFormula(i); + final JPNAnnexRanking jpn = new JPNAnnexRanking(formula.getName(), formula, t, coachs, teams, mRound, true, false); + jtpAnnexRank.add(formula.getName(), jpn); + } update(); } diff --git a/src/tourma/views/round/JPNGroup.java b/src/tourma/views/round/JPNGroup.java index a6624156..6b4f7b48 100644 --- a/src/tourma/views/round/JPNGroup.java +++ b/src/tourma/views/round/JPNGroup.java @@ -137,7 +137,7 @@ public void update() { } final MjtRankingIndiv tableModel = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), - ArrayList, mTournament.getParams().isTeamTournament(), mRoundOnly, false); + ArrayList, mTournament.getParams().isTeamTournament(), mRoundOnly, false,false); jtbGroup.setModel(tableModel); jtbGroup.setDefaultRenderer(String.class, tableModel); jtbGroup.setDefaultRenderer(Integer.class, tableModel); diff --git a/src/tourma/views/round/JPNMatch.form b/src/tourma/views/round/JPNMatch.form index 21106878..d543fa22 100644 --- a/src/tourma/views/round/JPNMatch.form +++ b/src/tourma/views/round/JPNMatch.form @@ -83,7 +83,6 @@ - @@ -108,7 +107,7 @@ - + @@ -181,7 +180,6 @@ - @@ -206,7 +204,7 @@ - + diff --git a/src/tourma/views/round/JPNMatch.java b/src/tourma/views/round/JPNMatch.java index a60d766f..118740bb 100644 --- a/src/tourma/views/round/JPNMatch.java +++ b/src/tourma/views/round/JPNMatch.java @@ -164,7 +164,6 @@ private void initComponents() { jPanel2.setLayout(new java.awt.BorderLayout()); jlbPlayer1.setBackground(new java.awt.Color(255, 255, 255)); - jlbPlayer1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("tourma/languages/language"); // NOI18N jlbPlayer1.setText(bundle.getString("PLAYER 1")); // NOI18N jlbPlayer1.setMaximumSize(new java.awt.Dimension(135, 25)); @@ -173,7 +172,7 @@ private void initComponents() { jPanel2.add(jlbPlayer1, java.awt.BorderLayout.WEST); jlbScore1.setBackground(new java.awt.Color(255, 255, 255)); - jlbScore1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jlbScore1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jlbScore1.setText(bundle.getString("0")); // NOI18N jlbScore1.setMaximumSize(new java.awt.Dimension(15, 25)); jlbScore1.setMinimumSize(new java.awt.Dimension(15, 25)); @@ -195,7 +194,6 @@ private void initComponents() { jPanel4.setLayout(new java.awt.BorderLayout()); jlbPlayer2.setBackground(new java.awt.Color(255, 255, 255)); - jlbPlayer2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jlbPlayer2.setText(bundle.getString("PLAYER 2")); // NOI18N jlbPlayer2.setMaximumSize(new java.awt.Dimension(135, 25)); jlbPlayer2.setMinimumSize(new java.awt.Dimension(135, 25)); @@ -203,7 +201,7 @@ private void initComponents() { jPanel4.add(jlbPlayer2, java.awt.BorderLayout.WEST); jlbScore2.setBackground(new java.awt.Color(255, 255, 255)); - jlbScore2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jlbScore2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jlbScore2.setText(bundle.getString("0")); // NOI18N jlbScore2.setMaximumSize(new java.awt.Dimension(15, 25)); jlbScore2.setMinimumSize(new java.awt.Dimension(15, 25)); diff --git a/src/tourma/views/round/JPNPool.form b/src/tourma/views/round/JPNPool.form index dad1b52e..6d082458 100644 --- a/src/tourma/views/round/JPNPool.form +++ b/src/tourma/views/round/JPNPool.form @@ -41,7 +41,7 @@ - + diff --git a/src/tourma/views/round/JPNPool.java b/src/tourma/views/round/JPNPool.java index cb35f9a4..5865470d 100644 --- a/src/tourma/views/round/JPNPool.java +++ b/src/tourma/views/round/JPNPool.java @@ -180,7 +180,7 @@ private void jbtGeneralPoolActionPerformed(java.awt.event.ActionEvent evt) {//GE && (mTournament.getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING)) { model = new MjtRankingTeam(mTournament.getParams().isTeamVictoryOnly(), v.size() - 1, mPool.getCompetitors(), mRoundOnly); } else { - model = new MjtRankingIndiv(i, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), mPool.getCompetitors(), mTournament.getParams().isTeamTournament(), mRoundOnly, false); + model = new MjtRankingIndiv(i, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), mPool.getCompetitors(), mTournament.getParams().isTeamTournament(), mRoundOnly, false,false); } final JdgRanking jdg = new JdgRanking(MainFrame.getMainFrame(), true, Translate.translate(CS_GeneralByPool), @@ -210,7 +210,7 @@ private void jbtGlobalPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN && (mTournament.getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING)) { model = new MjtRankingTeam(mTournament.getParams().isTeamVictoryOnly(), v.size() - 1, mPool.getCompetitors(), mRoundOnly); } else { - model = new MjtRankingIndiv(i, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), mPool.getCompetitors(), mTournament.getParams().isTeamTournament(), mRoundOnly, false); + model = new MjtRankingIndiv(i, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), mPool.getCompetitors(), mTournament.getParams().isTeamTournament(), mRoundOnly, false,false); } ArrayList teams = new ArrayList<>(); @@ -313,7 +313,7 @@ public void update() { TableFormat.setColumnSize(jtbRankingPool); } else { MjtRankingIndiv mRankingIndiv; - mRankingIndiv = new MjtRankingIndiv(r_index, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), mPool.getCompetitors(), mTournament.getParams().isTeamTournament(), mRoundOnly, false); + mRankingIndiv = new MjtRankingIndiv(r_index, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), mPool.getCompetitors(), mTournament.getParams().isTeamTournament(), mRoundOnly, false,false); jtbRankingPool.setModel(mRankingIndiv); jtbRankingPool.setDefaultRenderer(String.class, mRankingIndiv); jtbRankingPool.setDefaultRenderer(Integer.class, mRankingIndiv); diff --git a/src/tourma/views/round/JPNRound.form b/src/tourma/views/round/JPNRound.form index 1d84e892..3e8ee013 100644 --- a/src/tourma/views/round/JPNRound.form +++ b/src/tourma/views/round/JPNRound.form @@ -51,7 +51,7 @@ - + @@ -266,6 +266,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tourma/views/round/JPNRound.java b/src/tourma/views/round/JPNRound.java index a9084430..7eb6c009 100644 --- a/src/tourma/views/round/JPNRound.java +++ b/src/tourma/views/round/JPNRound.java @@ -27,6 +27,7 @@ import tourma.data.CoachMatch; import tourma.data.Criteria; import tourma.data.ETeamPairing; +import tourma.data.Formula; import tourma.data.Group; import tourma.data.Parameters; import tourma.data.Pool; @@ -86,6 +87,9 @@ public JPNRound(final int roundNumber, final Round r, final Tournament t) { mTournament = t; mRoundNumber = roundNumber; + if (mTournament.getPoolCount() > 0) { + jcxPoolOption.setSelected(true); + } if (mTournament.getParams().isTeamTournament()) { mJpnTeamRound = new JPNTeamRound(r, t); jtpGlobal.addTab( @@ -153,6 +157,16 @@ public JPNRound(final int roundNumber, final Round r, final Tournament t) { jtpAnnexRankings.add(criteria.getName(), jpn); } + for (int i = 0; i < mTournament.getParams().getFormulaCount(); i++) { + final Formula formula = mTournament.getParams().getFormula(i); + final ArrayList coaches = new ArrayList<>(); + for (int cpt = 0; cpt < t.getCoachsCount(); cpt++) { + coaches.add(t.getCoach(cpt)); + } + final JPNAnnexRanking jpn = new JPNAnnexRanking(formula.getName(), formula, t, coaches, teams, mRound, false, false); + jtpAnnexRankings.add(formula.getName(), jpn); + } + mNafOnly = MainFrame.getMainFrame().isNafOnly(); mRoundOnly = MainFrame.getMainFrame().isRoundOnly(); update(); @@ -202,13 +216,30 @@ public void update() { TableFormat.setColumnSize(jtbMatches); if (mRoundNumber < mTournament.getRoundsCount()) { - final boolean forPool = (mTournament.getPoolCount() > 0) && (!mRound.isCup()); + boolean forPool = (mTournament.getPoolCount() > 0) && (!mRound.isCup()); + + if (forPool) { + jcxPoolOption.setEnabled(true); + forPool = jcxPoolOption.isSelected(); + } else { + jcxPoolOption.setSelected(false); + jcxPoolOption.setEnabled(false); + } + + boolean forCup = mRound.isCup(); + if (forCup) { + jcxCupOption.setEnabled(true); + forCup = jcxCupOption.isSelected(); + } else { + jcxCupOption.setSelected(false); + jcxCupOption.setEnabled(false); + } final ArrayList coaches = new ArrayList<>(); for (int cpt = 0; cpt < Tournament.getTournament().getCoachsCount(); cpt++) { coaches.add(Tournament.getTournament().getCoach(cpt)); } - final MjtRankingIndiv mRanking = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), coaches, mTournament.getParams().isTeamTournament(), mRoundOnly, forPool); + final MjtRankingIndiv mRanking = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), coaches, mTournament.getParams().isTeamTournament(), mRoundOnly, forPool, forCup); jtbRankingIndiv.setModel(mRanking); jtbRankingIndiv.setDefaultRenderer(String.class, mRanking); jtbRankingIndiv.setDefaultRenderer(Integer.class, mRanking); @@ -275,6 +306,9 @@ private void initComponents() { jPanel7 = new javax.swing.JPanel(); jbtGeneralIndiv = new javax.swing.JButton(); jbtGlobal = new javax.swing.JButton(); + jPanel2 = new javax.swing.JPanel(); + jcxPoolOption = new javax.swing.JCheckBox(); + jcxCupOption = new javax.swing.JCheckBox(); jPanel8 = new javax.swing.JPanel(); jtpAnnexRankings = new javax.swing.JTabbedPane(); @@ -405,6 +439,24 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { jPanel6.add(jPanel7, java.awt.BorderLayout.SOUTH); + jcxPoolOption.setText(bundle.getString("PoolOption")); // NOI18N + jcxPoolOption.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jcxPoolOptionActionPerformed(evt); + } + }); + jPanel2.add(jcxPoolOption); + + jcxCupOption.setText(bundle.getString("CupOption")); // NOI18N + jcxCupOption.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jcxCupOptionActionPerformed(evt); + } + }); + jPanel2.add(jcxCupOption); + + jPanel6.add(jPanel2, java.awt.BorderLayout.NORTH); + jSplitPane1.setLeftComponent(jPanel6); jPanel8.setLayout(new java.awt.BorderLayout()); @@ -457,7 +509,8 @@ private void jbtGeneralIndivActionPerformed(java.awt.event.ActionEvent evt) {//G for (int cpt = 0; cpt < Tournament.getTournament().getCoachsCount(); cpt++) { coaches.add(Tournament.getTournament().getCoach(cpt)); } - final MjtRankingIndiv model = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), coaches, mTournament.getParams().isTeamTournament(), mRoundOnly, forPool); + boolean forCup = mRound.isCup(); + final MjtRankingIndiv model = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), coaches, mTournament.getParams().isTeamTournament(), mRoundOnly, forPool, forCup); final JdgRanking jdg = new JdgRanking(MainFrame.getMainFrame(), true, Translate.translate(CS_GeneralByCoach), i + 1, mTournament, model, 0); @@ -482,7 +535,8 @@ private void jbtGlobalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIR for (int cpt = 0; cpt < Tournament.getTournament().getCoachsCount(); cpt++) { coaches.add(Tournament.getTournament().getCoach(cpt)); } - final MjtRankingIndiv model = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), coaches, mTournament.getParams().isTeamTournament(), mRoundOnly, forPool); + boolean forCup = mRound.isCup(); + final MjtRankingIndiv model = new MjtRankingIndiv(mRoundNumber, mTournament.getParams().getRankingIndiv1(), mTournament.getParams().getRankingIndiv2(), mTournament.getParams().getRankingIndiv3(), mTournament.getParams().getRankingIndiv4(), mTournament.getParams().getRankingIndiv5(), coaches, mTournament.getParams().isTeamTournament(), mRoundOnly, forPool, forCup); final HashMap annexForRankings = new HashMap<>(); final HashMap annexAgainstRankings = new HashMap<>(); for (int j = 0; j < mTournament.getParams().getCriteriaCount(); j++) { @@ -616,27 +670,27 @@ private void jtbMatchesKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:even } } if (critIndex >= 0) { - Value mv = match.getValues().get(Tournament.getTournament().getParams().getCriteria(critIndex)); - if (c1) { - int v = mv.getValue1(); - if (critIndex == 0) { - if (v == -1) { - mv.setValue1(0); - match.resetWL(); - match.recomputeValues(); + if (critIndex < Tournament.getTournament().getParams().getCriteriaCount()) { + Value mv = match.getValues().get(Tournament.getTournament().getParams().getCriteria(critIndex)); + if (c1) { + int v = mv.getValue1(); + if (critIndex == 0) { + if (v == -1) { + mv.setValue1(0); + match.resetWL(); + match.recomputeValues(); + } } - } - //mv.setValue1(0); - } else { - int v = mv.getValue2(); - if (critIndex == 0) { - if (v == -1) { - mv.setValue2(0); - match.resetWL(); - match.recomputeValues(); + } else { + int v = mv.getValue2(); + if (critIndex == 0) { + if (v == -1) { + mv.setValue2(0); + match.resetWL(); + match.recomputeValues(); + } } } - //mv.setValue2(0); } } @@ -647,14 +701,13 @@ private void jmiChangePairingActionPerformed(java.awt.event.ActionEvent evt) {// jpmCoach.setVisible(false); if (jtbMatches.getSelectedRow() >= 0) { - TeamMatch tm=null; + TeamMatch tm = null; CoachMatch cm = mRound.getCoachMatchs().get(jtbMatches.getSelectedRow()); Coach c = null; Coach opp = null; if (Tournament.getTournament().getParams().isTeamTournament()) { - if (Tournament.getTournament().getParams().getTeamPairing()==ETeamPairing.TEAM_PAIRING) - { - tm=(TeamMatch)mRound.getMatch(jtbMatches.getSelectedRow()/Tournament.getTournament().getParams().getTeamMatesNumber()); + if (Tournament.getTournament().getParams().getTeamPairing() == ETeamPairing.TEAM_PAIRING) { + tm = (TeamMatch) mRound.getMatch(jtbMatches.getSelectedRow() / Tournament.getTournament().getParams().getTeamMatesNumber()); } if (jtbMatches.getSelectedColumn() == 2) { c = (Coach) cm.getCompetitor1(); @@ -726,8 +779,7 @@ private void jmiChangePairingActionPerformed(java.awt.event.ActionEvent evt) {// } cm.recomputeValues(); cm2.recomputeValues(); - if (tm!=null) - { + if (tm != null) { tm.recomputeValues(); } break; @@ -745,8 +797,7 @@ private void jmiChangePairingActionPerformed(java.awt.event.ActionEvent evt) {// } cm.recomputeValues(); cm2.recomputeValues(); - if (tm!=null) - { + if (tm != null) { tm.recomputeValues(); } break; @@ -835,15 +886,23 @@ private void jmiChangeRosterForThisRoundActionPerformed(java.awt.event.ActionEve } else { match.setRoster2(RosterType.getRosterType(index)); } - update(); } } }//GEN-LAST:event_jmiChangeRosterForThisRoundActionPerformed + private void jcxPoolOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxPoolOptionActionPerformed + update(); + }//GEN-LAST:event_jcxPoolOptionActionPerformed + + private void jcxCupOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcxCupOptionActionPerformed + update(); + }//GEN-LAST:event_jcxCupOptionActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel6; private javax.swing.JPanel jPanel7; @@ -855,6 +914,8 @@ private void jmiChangeRosterForThisRoundActionPerformed(java.awt.event.ActionEve private javax.swing.JButton jbtGlobal; private javax.swing.JButton jbtShowMatches; private javax.swing.JButton jbtShowResults; + private javax.swing.JCheckBox jcxCupOption; + private javax.swing.JCheckBox jcxPoolOption; private javax.swing.JMenuItem jmiChangePairing; private javax.swing.JMenuItem jmiChangeRosterForThisRound; private javax.swing.JMenuItem jmiEditCoach; diff --git a/src/tourma/views/round/JPNTeamRound.java b/src/tourma/views/round/JPNTeamRound.java index bae159a9..c7f80af6 100644 --- a/src/tourma/views/round/JPNTeamRound.java +++ b/src/tourma/views/round/JPNTeamRound.java @@ -18,6 +18,7 @@ import tourma.data.Coach; import tourma.data.Criteria; import tourma.data.ETeamPairing; +import tourma.data.Formula; import tourma.data.Match; import tourma.data.Parameters; import tourma.data.Round; @@ -85,6 +86,21 @@ public JPNTeamRound(final Round r, final Tournament t) { criteria, Tournament.getTournament(), coachs, teams, mRound, false, true); jtpAnnexRank.add(criteria.getName(), jpn); } + + for (int i = 0; i < mTournament.getParams().getFormulaCount(); i++) { + final Formula formula = mTournament.getParams().getFormula(i); + ArrayList teams = new ArrayList<>(); + for (int cpt = 0; cpt < Tournament.getTournament().getTeamsCount(); cpt++) { + teams.add(Tournament.getTournament().getTeam(cpt)); + } + ArrayList coachs = new ArrayList<>(); + for (int cpt = 0; cpt < Tournament.getTournament().getCoachsCount(); cpt++) { + coachs.add(Tournament.getTournament().getCoach(cpt)); + } + final JPNAnnexRanking jpn = new JPNAnnexRanking(formula.getName(), + formula, Tournament.getTournament(), coachs, teams, mRound, false, true); + jtpAnnexRank.add(formula.getName(), jpn); + } update(); diff --git a/store/TourMa.jar b/store/TourMa.jar index bf8b67eb..4a5d522d 100644 Binary files a/store/TourMa.jar and b/store/TourMa.jar differ diff --git a/store/TourMa_obf.jar b/store/TourMa_obf.jar new file mode 100644 index 00000000..042e4fb3 Binary files /dev/null and b/store/TourMa_obf.jar differ diff --git a/test/coach2.xml b/test/coach2.xml index 861ad26e..c047be43 100644 --- a/test/coach2.xml +++ b/test/coach2.xml @@ -1,4 +1,5 @@ + @@ -20,18 +21,19 @@ - + - - - - - + + + + + + - + @@ -39,23 +41,23 @@ - + - + - + - + @@ -64,16 +66,19 @@ - + + + + - - - - - - + + + + + + @@ -88,114 +93,114 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -205,7 +210,7 @@ - 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 @@ -216,7 +221,7 @@ - iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAZ4ElEQVR42u2cB3SVx5XH5xVJSAjRRBcdAabb4BLbcZxNcbJxHBJvHJ/1iXedBeKSZBNnN9ms7UCAxDUusIaA6eDYgAHTqxBCooNEkUBUgQSmI3qPZ///+e48jT6e0KPZOEHn3CPpve/N3PnN/9478715T6lbP7d+bv3c+rnuP4EK7NZPJaCCPguJ+R//hwbrh0VAYVg8LAGWCEuCVfVZkjyXINeGfXD/rmG60CywBAFTHZYKa1hFqeZtVVzXLir8YDcV/sY9Sn2bxr/5GJ/jNbxWXlNd2kjwAf27gemCs9CSYbVhTdqr8P2Pq7jneqvgsGEqvHiCCmybo4KlWSp4PlsFPl2qlKbx70V4bBaeG49rBuPal1Rw+KN4LdtgW9JmsgPzCw3SD46hVwPWuJsKfft5FRowUgXz56jAiSUCKRM2DzYLNlMFLrEZsFmw+Xg+C7YMxtfi8RPvoa3n0CbbZh/SV+IXFaQfXE1IIh1q+c//U6GVgHYuW2BNh00FlKkqCBAhwAkDTpzOgS1R8QDrWQ4sG48tgi3ANTNx7TS8ZrqBqnRGGcxzr6OPR9AX+2TfUUDe9OBCEkY1UjCIx1T4N8NUqMgqbCrsYwx8OgDMBoxMwFmpqui1KglWFZas82C5qppeg9+rYSvw+PKIJcESAawKwMUDoAeU6pyNthfBFsAwWUU/QN8pHsga4lPoZgVp4cVJUm/0gAr96DUVWj1HwvJjo7iAnovBZhiFVTGw1gPUepVibJ2qjsdqGMuFrRFbbay6sVW4bhVesxKvXQmgywB0oUrQc9DmHMCch4mZh34yjCLVp33gw33whT6Jb3E3E0SbW0KytKhRV6lOP1eh0RNV4AzhTRFwGRjcQihmAcBRSVRYLmAQVJ6qCWi1ATAVVgd/18HvusbWGvMey8PzebguV9UC2JoC1QO6BG2y7fmmD/YVNBBpY+BLDxUaRd9EjfHi8+eaG114WF2ouu2QxPuq4HqG6UTYR0Z9VEQcBlQFaqlqVJaPwRcARAHgFKh6sPrG8lUDsYb4v7zxsQ2w9bhuHV7jgU0FzNoCswZCvRpCuCr6SjSpYRHUnoXJWyj59kX41s4rNHXF588NoguPC9yGD6q4nw1UgdIJZsaVnmByUhgA46GCRMBLNqG5HurJh5oIbCOAbFJpxjaqxsY2qSa60FjTcsbHNxprjNemoY1GEaBWnVTmKkxQFvpahNDOwqQtxuQtxiSycs+FvQkf/0kFfyZryaTPA6ILjzml6feD4f5DUAHfF3gz4PBCOD4LuSnL5KkUDLIWBlsHVg8DbwBrZCAUGHBN9GbVTG9VzWEtxFpeYlvw/GZYGdAymOvRpqfMOlBjLVTtagCXDEvE36ziIZ0tEOlrdxXuR99lDJ8ZxHLKQww0+5EK/3moClwYDcfGmkobMvBmY/azMYBlpjDUBjAPXL4Bl4aBW0U1AQyqrDkAtdTbVCu9Q7XWRapNxHYYa21su0oHzFYRoITJNjyQaQKyLiDWRv8pBmQ21JiDySTExfCRuXmoUhcehe8cw2epRAuPa6vG31XhlwfBkZECb4FRXryBtwSOLzMFIhXg6ktes+CaAZpnm6G2LUZhrQAvHYAIqY3eqW7Tu1Q7WHtjO/E3rQiPEyiv22Zg+kE2NuqmGlcBYg4mMAcgcxAJ2YC4GBAXyfpxMHx/WIX/JIvvRAfiDV2qMPk2uE/F/fLPKnB+OByh+uYDHhP3TAfeaqO8+k6oEhoH20LAlUHbYdTW1oCzRoDFqoPerTrqEjH+b4HyesJmG5wEhjfVzEnagMlah76XI5yXwJcco0YPYhYgcq04DcYxfFkFf8kxydhuyBLHwmP5T22tQt37qMDRYXBgpAnboNlBzBB4y+HwSgOvgaiuqYHngWspoWrBtTWqsmorFispZx30HtXZ2G5jnSIwCXKHAdnaqJgTQ2Wzz3xMWh4gLjMQaxqIiwExCxO9EBAZypNgL2EsHJPcoIi/ERADsh2qjh37Xc+q4EbkED3M2z6ZSjfD5JhkA28FHM4zyxNW16aiupYCLx3wXHDtDYgSozSC6ljOPin3d2e9V90O6yIwPZC78Dob2lvRPvthnx7ENIRy3QhE5sUsWebMN9tBpVn8nsaYODa5wxO+ngDd5UrLx1Tog4GmknGdR3hh5LwEzGhVE7YroLxVqIT5EXjNDDwvz6WbkCM8G54uOA9QZ70PgPYDlGt8jLbX/L6jHMgSgHTVyAnaDDV6EJsglBvBrzrYV9eCCmvCZ64XqyCM48wWkCr8C4xj4xh9ReW6hW7dO1Rczz9gCTBY8l6mySUsGomm2lp4axG6FcHzq47gPGgeqAOAc0B11Qd95j1Os1C7CsguBvzuSyB6StwIiPmAuBo+LReI2ZjoRYiWDLMFDJlt5l9hfVXg7J0q1FMW2tcllK36qmGx1KWXCm6w6uMOg3dHpsMJL+/VQt7jGozLFVswvJxXHl47k+OoOldthOPB6qYPVWAuTO81XQ3IaBC3SzgXGojNMKkMZebDVKiwFsI4BVGTZHZJXLdyA8CCyDFyrBzztarQqi/B22mE+/wRHbwLGwH7ADM3CeqbASeyjfpS4WA97AZYODx4hQLP5jy3qlrVWXAW0uGI3amPOFb2OK8tg7jfQOxmQnpPFIhbTCi3xKR6KlyBfLgUkbIYKsyECucjlGdhLJMRylyKvQJ7QAV7y04l4VpUaAtHSpxSdyDJlrztLUDRUUB/iJmbBPVNQ+6bA4CZcGqZ2Z+mmbAplIKxVeBxWeIpr2NEeZfC82CVqrv00UuMj/P5MogHJaQ9mN3MhNicaAuLzYf0KRe5cKVRYR2jwkVQ4QIIgHdyeE/yAxkfx8oxc+xXW1DKqe9eFX6xDxoeAPvQLJjDKCDxyB2JWPdVQxjUhDMMjbqovly2EGCrS/JeSaRQMGzL4JUHd7c+ht/HzG+/eTBLRZHlIZaFswexIyatPfpva/ygCtcZFTZEuqmHtFMbYVwDYZyM7V0VpKKwnghhcFnWH3Y/xnwtKrS5j+8xdPixCq59w1u5o2B4u43p6JQzOB9OZJiQqIOZrY+tFNd8CN8AAAagvgDUF2inS4KAFwS8IOAFAS+IwQcBL3iXPgIrDQJQ8B5jx4NfKmfHInaPPorraEeCdxo7jDYOor39QYQz2twH+wR/7w5AhQGoEH1vC7SBCtNRTJoZFa6An0vhbzZUmIkxzIMKZ0KFkzG2seZmrNJPYswcuzAIXQ1A3nis07Vr138d8ec3z2dOmKDXzZ2ri5ct1ztyluji5Sv1vtV5et+atXovbD/sYN4GXbphkz6WX6iPF2zRJzZu1Sc3bdOnN+/QZ7YUwXYaO7t1lz63tVif21aszxsrMXZh++4otifKYyWR1/D159Ae2zwrbdPObC7Spwp3oP/t8GOb8ad0Q6E+tLZAH8xdb/zdC//3rFyNMa3QRUuW6i1Zi3X+/Pl66ZQpeuRbb5/n2MlAWASuZsvWvGfPniNnzpyp16xZo3fu3Kn37dund+/erQ8ePKiPHDmiS0tL9dGjR/WxY8f08ePH9cmTJ/WpU6f06dOn9ZkzZ/TZs2f1+fPnL7ELFy4Yu3jxYjn729/+dlnzX0+zbfnbPnfunPGBRn/oF32kv/Sb/h86dEjv379ff/LJJ7q4uFhv375dr1+/Xs+ZM0f36tVrlPLeRr2iLV5k6QK749VXX926cOFCvWHDBr1nzx7T0d69e03HfoAnTpy4BCAHxIFUBrAycJcD6Qdo2+dvTqALkD7SVxfggQMHzJgojKKiIr1p0ya9ePFi/frrr29VXjG5oiWNDd/Ujh07/nD48OFncnJydGFhYaQTdugHaNVHo7M0Ok94foB2wNcC0IV4OYB+FRKgVSH9P3z4sIkmjo0C2bVrl966datesWKFHjVq1JkOHTo8JnvkmMPYVt+07t279504caJeuXKlkbYbvuzYAnTD1wKkwxZeRQCvBV4sKrRm4fkB0ncLkGMjQBvGeXl5evLkyZoMyMKpxjHlP+4FWz/zzDOTpk+frnNzc83McJYYwlSfH6A/fF31VQbwWhVYEUDbL32xAOmjG8YWoM2DJSUleseOHSZlMQ8+++yzk8hCmFSaB93816VPnz4ovHP1unXrTMOcIc5URQBpVwLwRoawBWjND5AqtADdQsJxslhu3LhRZ2Rk6H79+q1TV7C1s7uPGomJifejgOxZsGCBmQ0q0M1/FqBbQCxAf/i6AF141xtgNAVas2HsArR5kAp0CwkBbt682RSSN954Yw9ZyNuh4VgBpjZv3vyRQYMGncjMzNQFBQWmOlUG0IawXb5Upr5rCeNo4Xu1AN1KbPPgli1b9JIlS/SQIUNOkIUUkpgAstrUa9OmzRPDhg27yFkgQCbWigDSGZpVIOF9VgD97UUDaP2hb7bQ0V9OfEUAWYmXL1+uR44ceZEsyCSWSmzv/TXAi34yYsSIT7mEYT64HED/Ito6bCHGCjBWiBWpLxaAFqIfIHMg87vNg9u2bdOrVq3SY8aM+ZQs5D2T+MoqsQXYqHXr1r2wDtIuQM4MAbrLmFgAxpIDYwF5uV1INIh+gO5iOhpAu8ogQI6XAMeNG6fJQs7WxAwwLT09/aeQbzmALCTsoCKA/hC+FoCx2rUAdItINICrV6/WY8eO1WQha8HYFdiyZcue2IV8mp2dHcmBrE4MY3YWbSdiC4ld+d9oiFcCj/7YEHYBugtpFyDXglTg6NGjP4UCe16pAhuC+r8PHTr0YlZWls7Pzzc5gQDZuKvCaDcTKgMYDeKVgrwcvMsB9FdhFyDH5SqQOzCI6CJZyL3BSgHaKly/SZMmPxw4cOBJLia5DmRV4lLGArQL6mh50G7lrgZiZSArek1l8Gz4ujsRC5B5PRrAZcuWaSzlTpIFmcRShSPrwISEhG/2799/r92JcF1EgCwkLPWUOzuOdkPBBXi1EK/EKoPnXwO6Wzn/EoZmqzDT1yuvvLIXLL5xJevAsJwtvu+FF14omDFjhtkLc2XOvMBCYgG6udC/oHYB3kiIscCz4WvhuRXYLSDM7xYgBcPbeC+99FIBWQiTcKx7Yb6ZcvtTTz01k3ckmAt4j8wtJBage2O1ojB2AVYE8UpBVrTjcPuJpj676PdXYIauBUiR8PYdbyT36NFjJlkIk5j2wkE5M9f2oYceeovrIG5pWIn9hYR5g/J3i4l7W6siFV7uRkNFQCu6pjJ4bvGwynPvxNj8Z5Vn98Ic7/jx4zUZkIUwiemutL2d35Trn3ffffcspczb3JQ1w9jmQXbsX9JE2xdfC8RrAedXny0cFd1EIEAacz3fwsA++KysAZs6t/VjviPN4w3f7N279y5KmXmQsq4ojP0qtBD9oXw5iLGA9F9/OXg0/97X+ui/D8jxUBj2hiqXb3379t1JBsIi7krfE+Eppa6PP/74ZEqZJZ2ytssZV4Xu/th/f/BqIPphVvR8ZfD8yxb7Poh7A8ENXwqD+Y8Fc+rUqfqJJ56YTAbC4oreE7F3pVthFf78oHcGXMiYPVvnrUAxWbdebyvYqIs2b9El23foPUU79d7iEn0AThyCIg9jRksPHNRHDx3Wx+Ho8SOl+iScPwUFnD5+Qp8+QQNU5siTCPFTnp3lTdgrMPs6tsG2TJvGTph+2OeJ0qOmf/pSymK3HxO9d5+xA3uQw0t260927jLjKGJ64koD48rFOIcOGnyBYyeDWO9GR9uR8BbOQ4+l1t/cu14DPaBRmh6e1lSPadxcf9C0pf6oWWs9rXk7PatFRz2/1e06M72rzm5zl17W9kt65W336TXtvqzz2n9Fr2//oC7o+DW9qdM39OZOD+mtnb+lt3X+tt7R5Z91UZfv6J1dHta7jH3XWHGXR3Tx7Y/oEsf4v32e1+7E6/hatrEdbbHNLWi7sNM39caOX9cbOnxVr0O/ue0e0Ktuu18vb3uvzmlzt85qfafObt1NZ8LfeS076lnNb9MfN0vXEzGeqc1a6JnNW+h30hrrx+vU38yxC4P4WPNftOVMl/YqNLCXUrq3ORLrvXP/F3PIKKTHqQQ9XiXqySpZT1fV9RxVUy9QqXqRqquzVT291Bwra6hXqUY615zVa6bXm3N7zfVG1VIOXraSczSutY5i6ea6LeYkaktzXIOnINjWBhjbzTPHN9L0SvS3DH3nqPo6C74shE/zVC09W9WAjyl6hqoKn6vA97A56zPCfDTDO2z5C1hHjFlu5adc7ckEW40b49WPPqqC+/8bDb8Me1tOaQ1Fx6PgwPtwZKJK0lNUNThGiLUMxEwfRA5qjWqs16qmGGwzM+h8A7KFgVForJUBWujALYw850HjyS8LLl/ArTPHNpqYiVph4DUEvHoCr46er2obeDMEHs/1TFRx8D1ozsMMkw8HvWEOWgb3c8xy+Pyqz01H3h+BdeukQkOpwt/DXpeDRoNMx0E9Go58IBA/jgJxsTnMU98oYgUGRoVQKQTpKdKDWWCgeHCimX0+P6K4Zub1eWhnNSaGE8SJ4oRlR+ClGniMjJnwayoiZSr8/AiRwyN6owXeMPmkwc9hHCvHHOv7ILGosAmSwL98VwV3PC+nl96EDZQDR8PhyBgVD4cS4VjVchDnYwBUQBYGlGMO9ZSpkYPOjYAsD9NavvO3BbbOHJhsaiZhjYDjxHCCOFGcsEVR4E0DvMmANwmT/SEiZ4yE7l/ksDzPP3bHGDlW+RD3NZ/ad1V4RwsVfPnfVOD87+Qg4luRfBgw+XBsFIiz4fw8DCIDEBc5avRANhCQaQYEYXrKdK1puf/5fK7Jc5eCo+o8eHXQ36XwpgDeBCfvjZTzgAMlJfXA2FphjHKc45rUF/WcIOxbX1ahjGcllF9zIA4xDpVBnAiIzIksLLOQe+ZKSFs1ZjuKXOaochVgrjbW2Gdp5jkLbbm8juByIuA81S1wCsZM5DwL7yPAex/wxpncrfR74jvH8F+wr6hABsd4PU6nVnRWsA02hE89ooIlv0KHfxCIb4sjXlFhZY43OXGCqXTJGECKUYFVowVpFZltINQHjAYRoNFsqdgSuT7bAZfpqG4u+rEFw4VH5Y104L0rq4r/hf0AY+LYOMarPRMYy4epazG5NlLBFx9XgVOsyv0cJQ4UiKMB8f0IROacZBPS0w3IGgKSiqxtBp0pMLMiQD2oFqwLKysCzIPGiVjgA8fJmo7+ppoJ9AqGzXnvScEYJHmcS7MfYywckxSOWjfiQ9luKPPtvQfbqNBg5MML/yMQXy0HkR+DCEKJXCZ468RJJi9SjdWMMmaZ9VhNE9rzBeZCo0wPqLVFzm8+l2FCtLaZAGsW3CyAm4H2p5kJSwI8ppJ4wAsZeIOlYAwSXxlBPZW6wLFwTDK2BHUDP+5lP3DDCvWtLio0Hpq/+D/mMxZeYXlTljiEOApOjzMJm4OoAiVwwe0VmDKQ1WVxW8OAsEA9q+2zWgb6LKOyGpIWmGNTIuCmmtybaFQ3HhP4V0zkcFktvCVh+5ZM+tPwvSvGIHmvyfX8gE1lVTlZPtHzvW4qNIUQfysz+rIsRt+JLA8CmH2uFcMI6XhTBctAcsBeaM+QPDlLoFiors02Cksxr2GBmiwTMU3WdlOM0qtEVMcJHCL5boCsX9904N0N3zkGGUvy9f6IV2VfacLTSvxGjO5U4pMIZ+bEPrKeciv0MFHjSJMbw1AGQSYISA68DOY0A9SD6toM87uauYYVnrl1vFFaotmSUXETDLhwOXAjxIeXxbywDVy4w1NedxlDymf51SguxBS5W/GddBUcwsLyK/PpR2+WX5FZf1tCaJgZVMDkx79ioPysCUFONDCrQD2JJm9NMVCTTB5zbYp5LtEUJ+7BuXh/H22MN0uTEEK1PLj3ZBL7y7Lrd+b0feBUaxUaQp/F988UXkVK5EHsr6eqYO+HVbD4WXHWqvEVCesBAtLCHG1yZNBsqT40yowzKppozIL1zPufyo0zKubu5z28llXfM++jWiMk/77jKI7LlOe8XUZxqvcppK+Lz9U+zy/lcSFWlaMP9yILP3OfCmWxQv/afFOGNwgXpN0CDpLf9qOzI8wazcuZYx3j/6NgfH6YwBosoTlQoA2XnPuWgOsrkfBrT3UX7oVP8O1p+ii+Vr0ZvtHI/baiRLn13Rn2aDMVfBt7510/xQB+44DsLwN8VRL6O1IZbej5zW70rbpGOip700kRr8kkWXDsk30jInbRF+XdXeksPibeTN9i5P/yHd7+bgF7AKvRHm1VaBxCZ/8zDsjeDsw/iTJfk13BO87edJAT8oNEcQNEZa/LRPQXaH2k7d94FZbhur+tCo6jD/RFfKp+s3zpTmUhnSSf8LkNxnf1e6Wr0KjvqGDRf6jAxeclR74oyb2PAO0n1l/U9CfH/iiP95Nr+8hEvChtsXj9BG2zD/bFPqXv28SXJPUF+BIyN6TjZW3FMyXtYV+DPVlPBV++WwXmY++5BwM++wtRDSG84ED9vQDq7fz/olzzO3kNX/sU2vg+2roTbdbz7qQ8KX21l76THdXd9N/gVhHIavLeAtdc98Aehj1VSwV/30YFxyDBZz+iQlsfU4EDPVTg9DNQ0nMq8Okv5AYn/34ajwH4aV7Da/kavpZtKO8mwMPSdrr0Ve2LCC5abnRBJskZk4by2Qu+ZfhV2Q3wHPJPq6vgbwGlb22oCbv612je38G+fI7XyLXfk9d2lbYaSttJUcB9ob8O1P+ls2EHZnXJT40kyfMIRSeBcpco6h75u6s811aubSSvre5AC6u/8y+ljfYNvnEy+CoCIll2B9XlrnAN+TtFnkuSa+Pltf8w3+RbEUz/90eHHAursm/njfad0re+pPsyUC9nt35u/dz6MT//D+XJ5ngnbp9bAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAIAAAABc2X6AAAT1ElEQVR42u2bd3BVZ3rGn3OuOuoFEAhQA0QHg8smXtsbrxd73f5JJpPMeLNJZhY7nt1xvIlL7GDvGq+9bjTjxXQMmCI6kijqDQn13pGEhBCiiV7WuzN5vve793AkAZZodjx8847m3qNzz/l+3/O2c8+5wL1xb9wb98a9cW8ABuAFwxeGP4xAgOYvb7nR+MFA+sAYDfM5GK/DsRDGZpipMLNg7AdofJECMx7mAhi/heNZGDEwffD/ED8Axk9gzoG5DUausKUD+4AkIBGG3RJgJMFIBjKBPIA7b4bxO5g/hhnw/SfnBGNh/jdMYmQL4S5gB4wdaosjGW6ZcM+Bey489ovlwCMb7hlwT4FbIhw7Ye5S/EgV8u0wfgMzGub3kdsE4mB+CIdWcodMdxfM3XBLh0cBvMrgU4ZBZfAthW8J/IrhWwTfAxiU7zSffHjnwisVHkkCT9l3AxlACvA7OMbANL8/tGEixR7x2O1KVWMvHKlKSXL6VsCvAv60cgSUIZBWgsBisSJlAbRC+BfCrwC+BRiUB580eO6B+x647YO5D0aqeMqvYIZ+507uBjwB82sYpN0mqKlwS4NHCryoG5UsgT/xShFUhpByhJYjrAxh5RhMK1Om3pYitBQhJQguRpDwK/hcDOJBktWheECmOuXny2E8CtPtu6JlRXkZJr03XmUayks13NPglYdBFLMKQdUIqcbgagypxlBaFcLFhlXbjG8rMawCQ8sxRJYgtAQhQh54AH4ZGJQGbwZFBhyZMNJcUvvefamHw/wIxibgK2CTije3JHikwjsPvnTaCgRXIYyQNRhWiwhaDUbQajGyTtkoy7ilRtmIakRUYbiG17JT80IEZMI3Az6Z8MqCexZMJvO9wPswIu4m83jDXARjndAmwEyDexI8M1X4+ZchuAJhFRhSifBKDCdDtUIdWY/IRkQ1Ilosxm4NiKpHlAveSV6BcNE8rAjB2fDLgm8WvLNVVndkCzMnMA7m3Sg8U2EuhrEaWKMSsoO0u+GVDd88lZNCKgW1SqFGVDvVG1mrxIxqQEwTYpsxpgVjtTUrG0M7iNGNiNXwJOdHBDtCsAcXISQb/sTOhk8OPMmcBTBrLAYm3+mixUX9HFgptClKWw/S5sIvT2Wm0EoVqIxMjRpZK1aP6AalZGwTRh9UbGNbMe4Qxh/CBForxtNaMI7w/G+TIrdjj6CbUOpChOQgIAf+ORiUDc8sODKkYi+ScninaIdJ3C4HKG8yTOaSRBdtkdJ2qMuByckZRwuqk7NZSRpHVG0EbsPEw5jULsbXGp77cEX4Ea4R/ZyuwbWrREQ5huYjOBeBOUpqxZwJB0v0ToBTGn4n4pmJ8Q0Yy0TefSp5uCcIbT4CCxRtuAhLWSIFNUYcWKPGtbgkbRNrv2oTOzCFdljZZE1O7GaFPYZOwSWjj/CwVRhRiqF5ijmIzFkYlAmPNDjo2FuA1+Qi5DbX23+CuQRYprKUkaVoGUu++ap4BJeqwsM8PEqEjRHa0U1XUQk5sV3pSbxJlh25+mJKJ6Z1YmqHC/sQJmonb8RoHo2HFeaIQgzWzAzpTClXyaobBdPnP97e+vwQzIXAl9LZZ8FtNzzTVE4mbUghwqqctNQ2RsKVwjIbxWm/tVAFbMpRTO3CNMv4ltap/t5nYbdjsiU1F64escI8shzDDyBsP4JzEJSlqrRXiioQxhZJYA/drmAOhTkbxp8kdNNV5DBRsd4GaNoyhPeltQtLVOFUeMdw3zFMP24z2ULT/NMFe+oRkdrGrHSuQVQVRhYhPF+YsxGYAd9U1YQ62M9+DXCSYbfu2Fy0v3fJy16KVza74CmhG1ygiiSLkM5SKm5ttNR2AoW1JCWVEM440ccsctltOrF7MR8U365TzJFlyrEZzKE5CM6Efxp89qn4MjepxlNN9VZVjoT5vmT/FcB6OLbAIwE+2Ure0EIMKVG5StHWCa2OWysDa2E1qmY76bT7T7nMtYU7OJm7FPMMundHT+YG5dgxlSLyAQzej5AsBKbDNxleSXBshcFK+SEw6lZE5kdfgDkPWKIKr7EB7lvguROD9iAgHSF5qvVl9EaJM7N+KlqWHNFW007tSasIu/HA6R7GLdzuZD4u7i3kM44KM+NZ5zAdzDxdCYYXKJHDKHIG/FPgw0srXnKvl3m+cCutSATMd4EFwAbVZrhthsd2eCfCbx+CMpRTDS5VpYjAsfbQbXfmJ3qyk9aG+uAZPHBG/bWbIu8WtW3MTt8W5kmtmHAQcTwLRS5XIg/Lx5BchGQiMA2+e+G1C27xMFgy5wAjbjp7PQPzE4Dparc0VbvgxRVNRmCqcqewPAytUIU3us6IbTTGNBtxrcb4dnPSEXNKpzm1y7zvuDn9uDnjpPnAKfOBbvPBM+ZDtLPmjyw747SHTpsP0k6Z99NOmjOOm/d1mdO6zOlHzelHzGmHjcmHjIktxvgmY2w9RlchskSl66H7EZaN4HT474NPIty3wqRXsxF89uaAg4ODl370cfqmTeV797bl5Tfn5LblFxwtKj1aXNZZXNZVXHa8tLK7svZMVd3Z6oZzNY3na5su1jdfami51NBKu9x46Epj25Wmtj8ra6d9c/BwT+vo+bZd78b9rzQe4scvy0Fol+pbLtQ1n689eK6miefqrqw7UVZ9vKSCc+gsKu0oKGrLO9CSu78hM6sqOXn/tm3LPvmUkx8w8KOPPpqYmFhcXNza2nr06NHDhw8fP3781KlT3d3dp0+fPnPmzNmzZ8+fP3/hwoWLFy9eunTp8uXLf+45vpHxF9v463XGX3oO/UH7Qa5cuXJJBs/FM/LUnANnwvmcOHGiq6vryJEjbW1tBw8erKio2LNnz2OPPTZg4Ndeey0tLa2ysrKjo4OH6+zs5KHtwOfOnbMDc3Kc1vWA/9qPcU1gfRz+5YJawDw1J2ABHzt2jNOjJC0tLbW1tVlZWa+//voAv2cNCFi8eHFOTk5dXZ0+Fg9qB9byclyUwdlckdGLdkDAFvM1ge0iE1iLzPmcPHmSrsdJUphDhw41NjYeOHBg6dKlRBjIZeC4cfHx8QUFBXQSy595aA1s+bMG5iSuuMZNy3tjkfXQtHZgTkYDc5IE1l5dWlq6detWIgwAeObMmbt27SopKeGacfHo0pTXDmz3Z0ve6wEPVOG+wPrIPJEG5qktr9bAOozb29ubm5sZhgzjJ598cgDAL7300t69e8vLy3kIrhzXry8wx7cC3xaX1sB62IEpsga28hZnyxRbU1OTmpr68ssv97t/Ns233norJSWFS0WFrQDWwFbG0sB2f7aAv7GNmwbupbAe2qstYB3GVNjKWwSur69n3po9e7bZz87ax8dn7ty56enp1dXVzHvXA9YurQvS9eQdkFf38uf+A1uJWodxQ0NDbm7uggULCNIvYH9//yVLlnCRCMwc0Bf4rAyt8GUZtxHY/tlewPpcPKnOl5wDl74vMBN1fn7+8uXLCdLfmsS9WZMYDNcEtncdl13jW4FvzNxX3hsAa2Y7MGOYiUaHcVNTU2Fh4erVq/tbmbjfqlWrLGCuGYGtsnQD4BvE8A2wr9lm9WK2A1u9Ry9gXU0IzDkTeO3atQMAXrlypQXMvMUD9QW2u/SAgG88BgRsJa1ewEVFRWvWrOkvMF1/2bJl2dnZOoaZ9+jVPGKvTkvnLd393C7mb6XlubRLW8BW42EBsxRTYTrpAIDZV2ZmZlZVVTEeCMyjWCL3uni4HnAv5v5gX5P2msD2LG0BH5GhFWaPyO6yv0mL2fzTTz9l7WYdZsZjZdLAuv3oFca6tewn8/Ww++52PVrtz1anpYGZYnoB5+XlzZs3r79lifX6jTfe0J0WaxqBmbeY8ekzPHSv6wcLuP/M3zquR2svwlZraa9JHDpLMx7ZO5n9/0pv1qxZCQkJ7KXZtTAkmLc0sBXJ9vbjkm3cOvMNaLU/a1orRVsZi4lGA1MkXti++OKLA+iln3jiCV5wMBJ4eWnlLQ1sfQ3Q16st4L7M/cHu21dZR+slr+587CmazqyBqQ0vaRMTE3n9MwDguLg41jE2aEzU9rzFUKH/WKnLukjsK/I1ryj6wvf91/VorXSltbUulXQAa211L805b9y4kQgD+wJg/vz5dIyKigp6CL1ahzEPba9PvZrqATEPCNUur85VfS8b2mUw4xQXFy9atGhgXwBwvPLKK3QMhjE9pK9X20XWzHbHvibzDbDt+1yTlsPeP+tT26+EObc2GZwqC+qrr7464O+0Hn74YToG8zs9RBcnS2SrtbZfG/eT2U7ed/v1aO2lSH+VZV0zWP5MSRjAzLI7dux45JFHBgwcFBT0+dx5qbt3lx4oqC2vaKquaalvaD/Y3NHS2tnWfqyj40Rn58muru5jx0+fOHn21Kmzp7rPnzlz4ezZi2fPXTxHO08XvHT+AidLY0P4rab35Ef4QfVxZed4NB72XPdpHp8n6mbK7Dp2ovMo7VjHkaPth4+0HuKsWhh3LCj1DSUHChZ/voiTv5mvpp8KCn1nSPiC4RHLI0Z9NSJq/aiYzZFjdkaNT4qelBw7LX309OyxD+TF/ahg3N8Wj/9x6YRHKyY8Vj3p8drJT9RPntk45cmmKU81T/15y9SnW6c+c0jZs7S2qc+1TXuu3WV8rbdzh9apT3NnfuTglKf48YbJM+sm/6xm0k8rJ/6kfMJjJeMfKRz3cH7c3+SMfTBzzP3ZY2akx07bFzMpKWrc9sjR8aNidkRGJ0ZFz48Y8XRw6E3eeQiH+SvgHeBT+UZ/sbql5lgLz43w3grfXQjYg6AUhGZgcDaG7Fc3MocVYniJupEbWaHu6EbVIEZukcfKzSfLxvS00Q3KYuXed0wNovnBSkTxCKXqrkpEAYbnITwHQzMxOA2h+xC8G4F74J+AQVvhtRFua2CsUE9PqTvjv5FHM27+Ztoz6mFRfADMk3uIS2Csgts6eMXDZxv8EhRzMJnTbcycXzFGlGFUBSIr1U1dYkfXCnmdooqtc61CnXOj4qxFtEatEtRydT9lZKG6pULaYTkYIrRhyQghbYLQbod3PNzXwVwpjybEA58Az9/icz0RIvJs4GO5q/aFOrS5Gu7rhXl7T+YsdYNraJ66nTmMylAfYovairxa8SiqXqa3VzlVjeT+pRhVhBFcOC4fFzHbSRtKWvpUIgJ2wHcHfDbDcz0cq4V2mTxY9GuZ8K3eEH8c5qtyV+4zYKHcW1sOx1fwWA/vzWqZnczJCKUCmRiSo25zOaXmvEuc2FfJtVW5XmjIcnWzexTXqFhQuWRcOC4fFzGjJ+1O+G6FzxZ4bYDbV+LMi+VRm/eBn92Wh26DYbwA40253TzXGcw8jWNNT+bdCNqHkFSEZbikFuxwwY4oFnLR3LJR1mtuL1Hh2gOVwgptWGpP2m3w2eQK3ZVyT3ihhNu/wQi5Xc/yTIL5H+LYH7mYv1QnczLHYxDjmTksCYF7xb211NkutfNcghciokjZCJtFFEpaOqBu+YZr1BwnqhI2xZWlEuGvaTfDax3c1qpsgqUyGU7pv4Apt/HJJf2Y8H+qZ7UV8zw5jSQwJm0ye21SCdN3J/wTXVJrbK12tmIYmotwDd/L9osJp6Xq4HSXsHsRpLOURUttV7poF0kF+R9W0Nv+WLEfjH+AwYz9nkvnhcK8Go51TmbGle92JTWxAwWbatPJmc8UeaYTXvHrJbAIM52QipPLlGJD5Qrugt8OtaAqS+m4XSpZ6gtJK++oZ8gMvzvxMN4QmL9Qz+Mp5j9eZcZqmGtVeVD1eYsKaUrNqPZPUtUyaK/KZ4o8TWmu4LVluP5yY6py3RAukDaNmoSABPjtVIvos1UFjscGlSzVA1SLhXaueNy/y8Tu1OOWkTB/CZD595LDPpNaReZVMNaqLMI5eW1WbYnKZC7sAOkTGN5OeLEQmwVzXZKUmIESEcwF/hp1h8oOzItcSvevYS6XGjFXPHmurPssIPpOP0QcK8yvy+p+ILV+vrMwGF+pEu22Hh6brmJz0srJEyS8Bd7Jb9lupaQ/d2Pm2yrLJKhsbOgvXlpYLuiXErQLpCP4zEU7Bnfltx/U+QWJ53el+lmpe5lIvVJFtdtGhe0p2Jy6k3ynglf8liWovwxRP6Z6ZoGNSk9+hOvluUmhulmoK+QUH4iJJxtRuIu/dBksOYx5+39lsT+UhZ8nLrdMzY/JzPwabhvgTux4Re61RZF4b1P8bNGu2ja10Ztpj106+5l1cN+oqo5juQ11qazpHCmN7Aj+GcYQ3PXf9fjAeFzq85suqT8UD18g2Jp8tYptkw3gBqU54T3ileklUCav6QvMeW5s4JaqZ3YNMfUo4QpJEPNdqrL8vAzM/A5/rucmPckv1C8H8bbMycLWTegX8lc/d7xCFU8V52tcxterYK5Qj2Erwj+J0y4UzuWSF+YK6u/Fj36rnrIzJn6HP+Ox954/hTlLPajtxJ4jE/2jZJf5klS1c9pNd/xaxpUuMT9zhcZHsnYa9TXJT/Sm4O/PrxFNuQplu/OSC/sdF/kfRPOPpCWa7+p7v3C5/Rei6gIR82NZpjnC+a4chId6UbqoYTC+Rz/F69Wc/B1M9vGvSmy/LWnmXYF/T2yOSPcHl70vW96THd6VZXpbPsh0+K8weKjvIDnd3A8k4mD8HOa/qJ8lKqHI8JaLf7aAveN6/bb8603ZjTszI1DSsbf9Zwx3Z3jDCJdM8zgcz8P4JYwX1Q/41Cr8WqVcYxYMLsrzKuE7uBt39sYP5/fi8BQeH2UQU289f0iE98a9cW/cG/fGrY3/A7JS/vIHuftZAAAAAElFTkSuQmCC @@ -227,7 +232,7 @@ - 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 @@ -238,7 +243,7 @@ - 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 @@ -249,7 +254,7 @@ - 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 @@ -260,7 +265,7 @@ - iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAmR0lEQVR42u2cB3gc1bn+Z2dXvVerF0u2LPeCC52Emj8QyCVA6C2QkNBDDRBCQoAQDIRq02yMwdhgjHGTi2xZVrElWZJVrN67ZDX3gP+89/3OnJVXuuZiCElILnqe79nV7syZ8/3m/cqZnV3D+P7v+7/v/77/+9b/bF9i3/99BShzhNm1jXz9/zTYkbAEkIPmTvOgedG8aT4jzFu/56G3dYyA+x8N0xWaE5iHBhNAC6VFeRpG4iQ3txlzHJ5nzHY4zj7ZMH4kJs/lNXlPtpFt9T4BegyPEUD/Y2C6gnNC86WF0OKmOBynXOfm9usnTfubi+xumSttZm2Gzd6/3eb4LN/m+KLIsENMnufytc187xNu8za3fcK0v3WV6fZrGUPG0mP6usD8twY5EpyEXiAt9mS7/UcP2e0vLjEdZRk2c99Ow1SQ8gwHcgw3bDPckWl4DNm2Yc/d1Db53LaY+8i+6RxjMcf6Dcecw7HlGPpYXv+uIEeCC6Ikxlzp5nHnG3Z7XoZh+9tOw4ZsAsggjC0Es8XwJCAvbDd8UGD4Eqgfim3+w6zQ5sf3/LCD22zjthncZ6uGup1jFRLmJo79Mo9xKY8lx5RjHwPkdx6cXYdRoD+duMbhuP89096QaxiEZsNmqmczVbaVELIMb4anH8rMQFQ6glHlCEGVWygq3WluIaigldPK3IJRqiwIpY5AlNgDUWwGYAf33aaAetM8OZ4blWzy0YY3ecyreGx/C2SgnpP9uwrSCc9NJ/XoM+3ul79otxdsJbhMOpROcBlUTA6d3WHzJYBAAgtFjUcYajzDUeM1CjXekaimVXlHoJKPFXzcrWwUdvP93dyu3DMM5R6hKHe3wJY4gpBHmNkcM5swcwgyW6nS5ImyffEM53CG3X65zEnPze27BNGZW+y6tQgMN9wn32d3e2eVzXZoG8FtYnhJqEno5dHJHaa/UlMFYVQSSiUBVflEoco3GlV+Maj2j0V1gFjcMKvi61X+MajkNhW+UajwiVRQywWqexiKOeYOuz+2U5WSCnYQ5HaetFzO4SPO5Ta720KZm1aju57zvzQ3usJjd2GET2ISf9Y0SzZSdeupgA2qKHgi1+aDfDq3i05W0+laAqvzjUWdfzzqAhNQF5SI+qDR6rE2mI8hSSNsNGqVJaImKAHVgfGoCrSgKqAcT2CWUpkFboHIsweo1JAvKYInT3JkOuf0JOc2zSo04XrO/zKIrvCkwY0613S77S2b2b+OE/2U8NYzz2VLbjJ9kSd5y4P5jaFYS6XV+scpWA3BSWgIHYOGsDGoD+fjKFrEWDRGpKAxcrg1RKSo9+q5TV14MmpDR6MmWAMNiEclYYoyy3mMnR7BCmQB1b6Tqt/JkyiVW3LjfM5R5qp7Se9/BURXeJJT4q9yuD+x2Gb726ec4Kc6ZPMYRll2PxS6B6HEKwzVBFdDcDVB8VRZolJUXViyBY5gmiJT0Rw9Ac0xE2mThqxFPU60jO83RY9HY1QqoY4j8LHDYCplMvx3E2SRZyh28tiFPHmFUsVZtHYyIgTiYlbrnzkcf5S5ax/+aRCHKY8xkHCtw23u+4bt8084sVUq5/BsM2SzGbJF7sEWPIZZbaAFri40SYGro/P1BNcgCosah8boVAWpJXYy2uKmoT1+GtpcLW4qWmOnKHNCdcIUdVogk4ZAVvhFo4jHLqQai1i9i0yB6M1WyB2Sm9/jnK92OOaKD/9MJTrhSW8Ve7nD/alFnMjHGt52BY/V0MHejSFb4h2uEn8tw0xymaitfpRAGzcETSBY4CahNW6ysrb4qWhPmI7O0TO1nUCbgY7EGWhPnI62hKNAZb/mmAkKpJyQOqYDBZLHLPePRjHnUOQZoiEGUIWSF90YJSYWGcbnlzkcT+rm28sF4j+0VZHkG/lD0+2u+TbbZx+pnGfXyvNFlsDjhEt9wlFBByzVJVvgJLdJ+MWMRxOdbo4lOIEWP4XQaAkElzhNQeoQI7TO5FnoGjPbsuTZ6EyaxddnqvcUTKqzhSCdipSTI8eqUxATUeofhV0+4Sqki1jECqnEAtW0u7Gw2DDPsH12Fn0Rn7Rv/5AWxwlPyn9oqt1+8V9stoEPCW8F4UnvVcCw3cacZ8Fje8GJK3hhUhxSLNXRwabY4eDaFTQNSyxpJkHNRPeYWS42Gz0pJ6Fn3Ml8PJH/z+E2s9S2CiTV2kpFSvg3DVNjMqqoxJJhEINYWPyZo6VfdCCNPjxDX8QnfYHC/R8B0aaXQwFcsc+6zzR3L+WBlzMMZI1aaFjwiphvBF6ZP5thFot6JzytOgHX7FQcw1BUJtC6CKKbQHoE1FgXS5nDR6fNxp5xJ6E39RTsoQlQV5DtDG8ZsyVuCiFOVOmhnoqvZW4sD4pTEIt9LYg72XxLtORy7hkUwEr6cq/N3C2+6Ss8jm8ToGu7knSd6bbkHR5wGeW/kWEgiTmbrUo+K14p800ZJ7o7MFadfSc8Fa5xrKjxOr8xTK3wtJRmgZtDQCeil9ZHUGL9VJyY8//eFOv93vGnEiRtHGEqkM7QFojTeZwp6mRZEMeiOmw0yjinEr9IFFOJhczPBY4Ava52Z78qldnAdaZ9ifg4oqh8a6EbfpLd7ebn2a4s0Xkvn7lkB+Flu/lb8PwEHlcToWyMXZUXN1E5NQQvacZQmFrgCCiVsJSdQjvVsvFOO0W/forapi+V2wtEBfIUtX83x5F8KWMrJfJ4ki4aosehjhArQhJQFhCDXYRY5B2mWpw85sMc+rCZQlhFn+jbYfFRN9rfSig71efHZmnqPaZZysqFD3nGsih/aVIzdd4r841AOeFVBLNJlt6OfZ3kvOa4CUp5rQmu8E6gw7OU4kaCGxh/GgYmnIbBCaePML7uBErlKXVOOBV9E09XIe2EKCGtlJg4TR1X1N/Ail8dloRyzq00gJXZbxQKvUKRz2Y7V3ygL2lMR8vom/govorPf68KneqTqxhR5zgcv3+JB3hPFQ4H1jEJp7NwZDIUijyoPu9oNrBxXBGMRn0wm9xQFoxwKi+C8CKmoi2KhSKa8GKovFjmswSqKJEglBHO6NOVDSadgb1JPxhhZ1g2+gwMqu1O4z4EmcB9k05DH9/bk3AqeuJORncclRgzC+1RM9AaOQ3NoyajMWwCC1oKdvsnoswnFrs410LPUQQYgu1sbeRqzkaG8koK4xX6d47peEyvVDz+HhU6C4e/m5sx/emfmy1pfzSQ/ZyBwlcNlLxhovwdN1S974Xa5b5oWhuItowQdO2IQG9RDPp2xaG/NBED5YkYrEzCYPUY7K0di/0NqTjYNAEHWybgUNtEHGqfhEMdk3G4k9Y9FX8T6xGbZtke/SivdU/hNrQuWif3a+f+bTLOJBxsm4IDLZPU+Pvqx2FvzVh13IHdo9FXmsA5xaIzexTaM0PRuiUYzRsC0LjWB3UrPVD9kR3liw3snG8g/VkDT91stojP4vs3LSjD1HfBaeYjS/9sYOubBkpXGmjYZkPlGjuq09xRn+6Npkw/tOYGob0gGD3lEeirjsFAXTwGGxKxt2k09rUkYV/bGBzoGIdDXeNxqGcCDu+h9U7E4b5J+NvAZPxtcAo+E9s7FZ/tm3Zs20sbnKq2U/v0T+L+hNjLMXvlcTIOdk9Qx9nfPpbHTcbe5tEYbExEf10c9uyORFdJGDqKQtBWEIjWHX5oyvFC/VYHajbZUL7awPYPmKLmGhCf/x4VOnOffMYw8ZGbzeJ1VN32RQZqNhtoyjZRu9ENLbkCzxct2QFo3xGMzsJQ9FZGoZ8ABwlwLycuDgwQ4oGOFBzsSsWhbjp7THhTLUAuwD7fN12Z9f9Uy/ZaAD+T/QYIsF/GmaAhUpV7qEaepP0CkSdNTp6cxIH6eM4tGj1lo9BJgO07g9Ga54/mXB80ZLqjNt1ExVpG10cGNlIoj9Jn8V0zsH8TgHLhMWzqOPuVbzxifJY+z0DRMsLLMVC7yU6IHpyELzoKA9BB5XUUMHyLw9FXFY2B2jgM1ieoiXfVjENL5UQc7Bx3FJ5Ynziv4e11wiOw/U6bYdmBGS6vTTsK0wlxSIWEuCdVATzUMxEHOgmxLQX7WpPVPPYyGvprYlSEdO2iCguD0ZYfiJbtfmjc5om6zXZUrWdq+sTAtncNvPU74zPxXRhoFrZvsmRLvP58+4KPnuGgbxnqDDXl2FCz3sGDe3ESfugsDuKEQtFdEs6zG0H1RVF9MWiv/CFqy65HefFNyC+4G231N6K7+Xo6SKd7xynlKPXtnTIE7zMnqAMa3EGxE6zHIZDcVmzv0VA+LBA1wIM94y0VMpT3t1OFrVqFjaPVie2tiER3qVZhQRDD2B9NWQzjDIbxBobxKgM7lrBQvmDg+gvNhYb1MerXWuINtS606Y/fYtas/isHZfjWbWX+22qiIcONOcSbAP2pumB084x2lUSiNOd85G/7KXZk/gy1xaeguyYOTbunobr0avS1pKC3ZSqa6m5Hc/3t6G57EAf6ztE5b/pR9TnBHToBRw7NHDL53wLpokQnRAWQKtwj+dWCeFBUKKHcpnNhEwtZXQL6nGFcHKoipzUvAM3ZDOOtbowshvEahvGHBtazoDxxq1kjDL5uS+MM39DxyfZLX77Pdmj9yxx0qYHGbIbvBjtzn4SvDwEGEmCIApi57v+hNi8RXQVxKNhyCdreT0LHTZPQPJ8tRN4V6LluBvrnsg+sOg29NT/DATra2Xo3Dg3+UKtPwxHFDYM3azjEAyeo7T5zQnSqkGGsVCjwuq1ce5B2QKkwGfuak1RakRSzR4VxODqYB9vyAtGc44vGTA/UpTOM19mw62MDGW8beO1B2yEyuEyvkY87jJ3VN+aCUx1/WPSYgS3zrOorAFX45nmq/NepAIaqyWxZcx6qbo5Hw5iJ2HX7pai/eTy6Emaj5Z5JaFs/mUsuNrszTkLbyqvQP+dHGPyv07Cn+lzs67uMIGYMqe/IwROOgjs8G/+fJo9OkAqwDmcLINubgSlHw1hCmAAPdo1TxeTAUDFJVl2BFLheVmNJOZ2FIQpgS67kQYbxZgc7CxtKmQezmQffe4LVmAyEhUs1Pq78J2vBsTddaFu+7E/Mf28YqGSCrc+wsW1h+OZ5a4BBCmAPJ1OaOQvlv4pH3ampqPltEmr/koT6O85G6+vj0fbKOLT99kJ0PT8R3YvGo/98rjhum8N25wIWkVk6fGe4AJzlAnCOBqgVqcPYUuB0C6BLGB+WMBb1CcBOyySM9zcnW4WkOpZ5MAo9Kg+GDQFsyvJWAGs2sL/9lCnrfeZBtjO3XGxbLiw0k6/Mg675b+pD15m7VrD/y2EBqd4g4WtD0zYnQD/U51gK7Nk1ShWQurWR2P3seOx+dDLql3E9/EESGpcnomVNElo3jEXHO+PQ9QqV+dZF6M8br5SjCgjhHeajBXDmMAUeOSyPztdOUIAtgFqBLEJDAPt0HtQAD3SO1T1higVQ+kHmZWm1rHYmzKrEOX5ozmIe3MI8SIAV7AcL2A9K7n/kRnOX8TWWds7VR6DDYZzy+E22tlXszLcvNFRyrUkzVf5ry/dG7p998dJPfJH9GFuYHeHYQ4CSoNtKolGVMRolGRNRvHY6qleeydbgYrRuPhEluXPQU3MSeqvHqrzlbJwbNiYh7/lENC1Ixp7KCS65z9UsgFaFdgU41aWpnnAUIJV3oIMA2VArgC1jdCtzFGBXcRja84MI0F8DZD+40QIoLVsae98/3WJr8yIL/XGo43gBhiZG2X8893bbvjWU8Y53DJSvoArXmWjdToB5PnjzIXc8fK4H5v7cm0DDuUSKQOMbMWh9JwEVTyWg9vJUNF86Ca2Xci1810Vov/8qdDzxK7Stuwt93Xcz992LA/3XKgAdOWOR+/sYFD0Tx+XZZOa5mS5KdIbuCUfznxPgXq1ABVCKyHgNMHUI4P62ZLUqkXZGAA4QoKrEUkjYt6pWRgNszGAh2WhHJdu14uVsqFmJ/3q3bV8sWehCclwApdqMSo63X/XSPbYjac8byCPAkqUuAHf4oCjNG2Wb/VCaHshqFk54UagNG4fGyEmouGQMqi9IRUfcTC7up6O5qhJtHR3o6ulGR1MperqWYU/3HgwMrCUArl+pnAP9dHpgAv7GJtlqZSxgAvLzYfCsBlvlv2G9oK7CQwBTLPURoDTTlgIThgBKJe5WAIMVwKZtApAN9SapxIaqxFuY+1+733ZEWAiT46nEzmt/kcmxxo2v/Mb2xXo2lPnsAXdpgCqECXD7+tOwZdMj2LjyQtXGNAjA8BQU3BiL7a9FIn9BFKqvH4fu2BloqqxAw/ZStBaVoHNjIbqqCLG6FQP9qwlgIgGeS5gfoq93PpU15SioY5kUG7XEc4bvFGtJ51yN9DgLiAaoW5h9ApBtjGqmBWCZBphvKbAp03sYwFJG3Fbm/vkP2r4QFvozE/evqsROgNFJkcYtr/7GwAYBSAXuYlKt+MSk1N3Rtt0HhVk/R/bOfKxf8yAnEor61yNRE5rCfBmGos0RKM2KRMXr8eiOoQIrK9HU0Ii29DJ0bihFW20Tuts70d+3is6z4R34Gfbu34fevnoqa9LwZZwruP263XFtop3r4V5riaga6S6uuzsE4JijAJusPtBSYJQqes4cqABu1QClF0wzVCuTyV7wjQcNJMUYt+h7a44bYAwB/uLVe9iRC8CFFsDyj03UrXdHKxfg+WlXYcuSd7H+qStR/14YKp8hQCow4+EEZKSNQU76BJQ/mIqumGlKgbUFpWipakBXXjV6alvR1dyO3s6VOFA/EXsLLsJAZRH2tBSpkHZeRBgOzeXCgkvoOtVnAXT2gARI9R2Q/Mf+T+BJ/pMLHP01zjaGAFmF2/MEINuYDG8WEWmmTfaCVt+bucDA6w8QYLTxC90LHr8CE2OMm1++2/aFyoFOgMttqFjphrwr/VB0TiiKz0tAwfnJKD8vGgXhCQQ4BlvuHYP0tanI2jwNpXdMQEsMq+wTz6G1qgr1ZZVozSpHT14Nevr70PP0XzF430kY/P3p2PvYj7F/0RnYP/9EHG50XjRwQpvucklL930anlU8Jg6p75BSn8Cz1KcAch08WBuvwte1D1QAdwSiNZuNtADc7M4Q1gDZC2bS73n3276gAm/+ugqMSoq1X//XO21H1koVppR3cYFd9hEBfuJAWqof1l37U2zO2IRPFv4GjeuDsftJhm1iIjKWhGDJx+di9fpzUfbLsXj/rkfw6NOLUXTDvWggwLaWVjTuKCPAXubBxcxV4zFQfDn6BgfQuSsXAxefhEO79WWrkaauBcoVnBHwRH1qBeLMfWOG1LdfwlfUp+DFcCknK5EorkRGqctv7dJIZ3Ept4WN9CYNcL0FcCv9fuVe2xFhoa8NfiVAZxWOiIuwX/rMrbb9nz7DPvBNlnV25mUf2lC50oGdL3ti3ZNXY8uObHx4w80ovi0MNW+HY1dCInZeFouc86aj4IKZ2HTqhXhv+Y14fcVjWPLwE2heuhztJWUsJrvQWV7BUF6A/aWp6L7wSvT27mGFrsS+FZOP9ogj7Cg4HbZ9E11WH3r5pnq/ZEt9zRK+o63iQeVJ9e2rJMAyLuW4/Ows4FJuewBatvlSfV6o2yAXFGwKYBkBbqbfz91h2x9NFsLkeKrwUB/o4TDOefRaW8eKJ7kSYTkvWsyzwuayYgX7pJXuWP/QLGyefTryoqJRPS8EDTnBqPlJPNo+iEHzTUlouyEFuWefiRtfXIF3Vt7NfvElVF+Tgtq7xqHhnvFounMC9jwwHQebJ6Dvmtno+8Fl6Hr5eRxsG68AKVADk46GqhPcMHgj1r4K3hir99O5T9S3V3JfpaW8vgpW4FKpwGEEGIy2XPaAmb5Unydq0xxspA11XVAUuHGegcdvtHWQxdlfpw906HuLT773Ckf50se5FuZAhYusXnA3C0naLC+si0/EytvvxLK3bkTH9kA0ZAej9idx6PggGs03jkb79Vy6PZuE1Sdfg08uuwVlZ81E3TWpqP5VChp/nYq6V7nquG26AjDYdQm6MnPQdfPd6JtzMg7WWlerj2m9LgXDGbaqbRkOT4Uuc9/eugQMSuVl3usts6yH4dvF8O2QApItFdgH9Rs9UbPOPgSwhEVkzYsGHrjaLBcWmonjeNfC8mHKtKvPtq159xE2lC9zbciEWrLEKiSrfuKO5S9ehtVbNmLJol+gPScA9duCUHNRLNrfj0LTDYlovToZPW8T5L0pqDk1FWXXJKOSOXHD4wT5q3Gou5Ohe9s0BWCg47/Q3deLltYSdD82kUD0Jf9hpq9k79Gqk4Kh4KVY8Dp03mt1gcfQldw3IHmvPIrKi8Sekgiu3cPRtTNEFZCWLD+V/6S7qFpjDgEsJsDlfzZwzTm2NcJCMzmutbCp75kbd9YJjufn38te8HmrkBS/x9xAFZYtsyPtg0vwafp6vLfg52jL8kfd1kBU/Zhr4Xcj0Xh9IpqvHI3uNxPR9ehY1J6XisJH4lD0YBIeeekylD+UhIo/J6HrrikKQH/7xehiDmxsLlIKOkw4orBh5oSmwR3SzbIzbP8HPK46pG0ZlNzHsFXKk4sebJ67WX078hm+PPESvg3pXlznu6FylQ01GwxUsgrv5EpkIcVz1kzH88JCMzmuq9LOy/nxSdHmL5691XZ41dMGct+wwriUKqxYbmL5a1OxdPGtWDL/ZLRm+qNmSwAqL4hCy8IINFwXj8bLE9E5PwEdD7LNOXcO8u+Mw+5fJ6H0+tGoum8Myu9MQuftk9R6tafxFLQ0LUBD7VM40JlsATqWidqU4lxUJ/BanWE7mvASj8Jjz6dyn6iPyusuovIKQpX6OlT7wvDN8OH61xPVa5nbmfcEYAUBZlEsL9xuOywM9I2YnsdzPdC1EsvtDec8eJXZtIx5MPNVHcYcuILtzLpXHChc5kDmYin/vlwKBaDorAg0vxnOXBeLhssS0P5qLCrvOB/FT/8FxVfEY/fFY1B2MUP52rGo+tlY7FmVovq17vrR6G+Ox57GZAy2jlZwvtQ6XMC1OeElYX/TSHgSulSfDt2e4lHo3knl5YWgk+prz7WqbyOrb62E7ypp0QxVgcvXGkh7zcDD15iNwkCzcPu6n4nIXUozfnqG7eMFXM5s4opkB9eGRe+ytD+chJN+cjvOveIOnHvd7/DUE+dZKnyH/eBroai+Oga1BFj53pkoWLcYpYseRsm9D7OQTEQxFVhxTio6XxyrHG+tPgWvrs7Be+mZeGNDPlZkfqTCUUFSsFyAOaG1uapOw5NqW2/BG6DyVNuym6Er8HZFKHidhNeWG0T1BQ2pT6pvjaiPOW/3Civ/7Vpt4IM/GriUvgsDzeJrfSbivCqdPDbWvGfurcbnq5hQs+czN3BdPO+xKDz0m1Nwy69+jD/+/hy8+fx0tGzxQ+u2QCbkEBSumI3ctQ9ia86HeHLFc5j7wdP4IPN9lOW9y1xzEzqLJ2BvY4Lq0dqqZmL9tj9gXdZcbMr5I7bl/Za5LMmC6ISlnidb0JyKY7g6VbePqpNWRRUMgUfl9e+OUfD2CLxChm4+m+btzHtZgUO5T9RXl+aO6lUmuwvrkp2Eby7T1It3Gp+L78LgeK9GH2tFIpdwzr3jErPqA/ls5CUu66jCXewJy7i0q2ZLU73KHfVpnmjc5IOWDH9OkGc4N5hnm1bAkCmIQkdRNJdOMehnKyFJXcJLffBOxSgAtP1NCRaU5kTrUSCNNMlxYk2JR8HVx1vwJGQ59kClwIvW8EZZ8Jj3OgReNpWXKaFrrX3rN3oMqa/sQwKUx7VW+3LPZWaV+K4ZuB9v/jtWOzP11Cn2l+bdbWDtX9hUiwoXWhDLl3FlssKBmtUehOiFpnRftGz1VxOVCXfmh6jQkfwjSVzyUX9FjHJysDpOrU8tkPEqd6k7GbQpSCNsr85xAl72GdSqG9QhO8CCIccYCa9zB1uWHMLbRuVl+NF8WHk9qT43CsCm1Cc9btkq5vnlBt5myjptmv0lfSnf/5vemeCsxrF2u3HJQ1ebXR8yL2SwmOQtYEuz2GppKpQK3TgZD6rQW02wNSuASTpIqVAqXg+7/j0l4Uzmo5iXIulotOrNBmtotYRZJ3cyxBEOrXGkxR99Lu/XW9sO1sVapuDFqPH6VbMcwWNZ7Yo0y1IwJOdJr9qqldeU4aXWvTXrTLYu9IPQiulL6Vrr8+BHrzO7xGd98/k3vm966PMR2gmzPeyvP+ww8KqHgcVeBj70MbDC18RqfwfWB3oiPcQHW8P9kR0ZiO0xIciPD0Nh4igUJ0eidGw0ylNiUJEah8oJ8aielIDaqUmon5aMhulj0DBjLBpPGIummbRZKcqaZ4+lpWjj81n6/ZnWtg1iM8agnvvXTU1GzeREVE2MR8V4tkupsSgbG4OSMVEoGh2BnQmjkB8Xiu3RwciJCERWuB+2hngjPdAdaf4mVvka+JT+rPY28Ac3A+Kr+Hy8n4McjwrjmAR+eqVpr3/SMDCf9i7tA/kemmHHp4Y71tq9sMHNF5s9ApHpHYxsX07YPxz5gREoDIpCcTAdCqFjofEoD2NLE56AqogkVEfS+agxqI0ai7posRRl9UM2Tj3WDTM259ynJnKMGqNiVCLHTEAZxy0NicOu4FgUBUdjZ2AU8gMisN0vHDk+IdjmGYQt7v7YbPfBBsMTaw2HuidQvmnwCe012jX0UXzVX+L+u+/ad1Xh9HGm46m7bLbPnuOB3qLJfcVLOYHlnMgqmwfW2b0tiJ7DIeYFjMLOoEjlVDEhloTGDQNZOWr0UZiRFphap0UdfS6vyzZilQIu3AIn45RyTDlBcqIKg6JREBiJPP9RhBeGHN8QZBFeBuFtIrxNNk+s45zlK2nL6YPcsvw+7X76Jj7q2zn+LvUd8z5B2nnn2ezpj/JgL9Pe1nesLuNEPuaEVrtC9AjAVq8gZBFiLp3YQYhONbqCLCVIC2YCYSYqNQnQyggLqpg8V6/RBNpuDU32cwWnVMfxC6i6HYQnx3UqL0MrL03Bk3uiZc4SRYZ84QakBvFNfPw27k79snsFU/wM+w1Xm2bLk1ryC10gyq2/awgxTYdzOiFmEOI2OpHjokZRx1GQMdg1BNNSZtkQ1PghUE4rHYIWp/ZzgitU4CzV7eBxcnm8bEbBNkaDE54oT75RtUrNVaLHmv/z6g59s0V8Ex+/6T2Bx/Nl6mBJrrGm+cgvbeaBZ3jgecMg2jREd6xXEDlpTj5Dh3SWTyhBhqmwytOKlNAegkkYFlBaaOxw068fBWZBU4qTcA2wwG3XqsviicuUE+jmp+BttEnOc+P8LHjLtPLkvu87bLYD4pMuHMH/iC9lu4ayfLx3xnjT/tpdhu3zZ3VRWaAhLnVCZGFJMz2x3uFNiL7YIiHNUNomuZEO5jpBSqFRqiRMCXGlTg1VW6GLCSwBL8CUcX8nuFyO61TdVp64LRIFklIYFWs4p490zluq4b0qeY8+TKQv4pP2zcP4B37dy/mFG6lQ551oui291zCOPOcCcbGuzvIVsNU84+skLzq8sIlq3CxqJMjMIZBUJE1g7pA8yWopIZg/ZBGqiirzH2UVBQlPVRhClUmo5ihwQQpcpgePITnYQfWbXkjjifxUwbOpE/yB7iAkch7m3E807Ut13ov7Nr9g81VVWXJEEo900ak2x4p7DduRuXpSb+uzu0R/FWyVVuMaqnED1ZhO57a4+ymQW9nySILP8iJM7xALpga6XSt0yNRroQq6wM8ksAyvQAVtm2eABU6UTnDpBCeqkxP4sQpZm5rPQj03J7zTbfYV4oP+dpLvt/0Vr6/6SRO5W2kMJ3DxHJ7FuxkKz+iweJP2jkubs1KrUVqdNDq3UYH0IUhfleC3ugeofGXBCFL5S6BmebuYl/W6bCMVPl1aEp4INYZSnLcG56mOJRHwiTq2pbq39Lxkfg9yrqI8mbth/aqH/z/zp1FcIfrrqxXnMyfO/yWT8ZM6Mb/uokbpsSSEPlFOWYpcT0c3stBsEsepms2iTDcBylUCTRTlals9rNdFZRsJP437rWVqkGK1keDWGR4M1eHgPtYn8Q3ddkm1vZNznMC5ypz13P+p8L5MiXIj9lnhpvnYFabZ/Jie7Gv6rC8YWrlYICWZiyqlKqZRlQJzg2mB2MSkn+40x1FTClOve6ni9Cn3+4TVfoWC5lDV1RXc+1p1Eq4v0GRO13JuEZyjzFXP2e9f+aM8rhB99K0PJzEL33qm3b71Hpvt8z9rNc5zAbloCKT1nbuPVI6Sr5xKf+ZGdboRrPv/sNU0eX8lTVS8nPtI72mlCJtain2kO4G3dVGTY8sc7uZcZE6c2y9ljnquPt+FXzRy/bUiL33pewrtkiTT8cJVptnE5gpzXUC+oZWxUIfXEt2TLVeV29VMrSrLVmpQn+pHZ3g6U8RCfZLm6XCdaxUKXMk5yFxkTnpu4S5f7/9O/ADPyB/fkcvfo2mnsRv9+RTTvvg6094lyz/pGV/UidwV5gJddN7VMJZqqB9q+0g/LtXA39Pg3tZjzNdjvqSP8YgKV3uXHFvmIHPRcwr4rvzozleFtLf+hk8qTT7VvyXVtC+8wrQ3PGCzHXla50hx+BWdK+fpwvOGtjdHmPP11zWw11ygyVhPW03xETmGHEuOqY+dqufibfwb/AiZa0i7695K7imZQDuTdm2U6XiK/dfGG01723022+EndLi9oNX5sob6igb0qsv/L2tgL+h9ZF8Z4waOJWNGWVdSrtXHmqCP7euiuu/8L7h9GUg//dmC9FxzaBfQbgg1zd9NNu2LzrXZt11j2mu4vu5+wGYe/J3NPPK4zfbFnwhI7A98Lq/dz/dkG9n2bO4j+8oYMpYec44+xih9zH87cMfKja4gvfU9JlH6uxfykeEPDGs1IPch/yLINB9gO/SHMNN8itn+GTH1nK/Je7KN3vYive8MPVaUHtv7GOD+rX8OdOSPzjpcYAbo/BStk7zcQjFZQ5mlFTVHP5+h3xunt43W+wa4QHMY/+E/SnusX/B10857ahC+enUQoK8KB+rn/vo9b72tu973/8wv+X4ZzJG/H213MYdx9Nd5j/Wb0t//SPf/AvV/s+//vv/7/k/9/TfGrtN3IKtLSwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAIAAAABc2X6AAAfDklEQVR42u2bB3Ab17nvv7MoRCcBgmADQYAF7CqUVSzLJdW+aW6JYztx3HNzHfeSKLHznMS+7i0usmTZVre6KIoqpEiKvXcSJEF0gABBgJ2iSFnJm3nfOUtSep43byyXxDejnf9ggOWW89v/V86CC4BLy6Xl0nJpubRcWgAIgJQQFeEiCVEDoCLZR1xJ/m0g5YRkctxNhHuaE24i3FEiqCXCZiLsAAEK39QQ4REi2Ei49ZzwRsKZCSf/n4ivJuR7HPcqJzhBuDbgKBsI60FUA+JqiOBVc/6NCP/UAsJOEODGRwn3Eif4NsdFffPJcYAZnOBpjisF0gakDgSVIKqAiAqQVIO0EeStoOgAZSdRLaqdKFtB2QTyGpBWgqSK8TeCoB24YiBPcVw6J/gmcnMAORz3FidoAKgDcgqEp0BcBdJakLUQpYWLsgo1A8LoAZHWKtZaRdH9ouheUbRFpOmhUvcIo7oFUZ1cZBNR1lB4WQ1IakHUDFwtEDQ8m+O4bw5tLOHQiiqAaiDlIKyEiHqQNRFFJxc1INTaI2LsEp1dGmuXxdtk8QOyOKssvl8W10cV2yeN7ZPoeiUxvRHaXjG9BN1CdTMXWUcUdSCvB0kdNZwrB/Iwx+n+5UEuBPIDTnCQkBogZSDAgMTgbCaKJk6F1vVLdFZprFUWNyBPGFAkDij1NlWSLRJlWNSAKmlApbcq9f2KhH55PPL3Ir84plOkaRKoGokSE6EJJI0gbACym5DvcgIh/IuwlYQ8QdMVSoA7SQuSpIHIWwSqLpHGJo11yBOciiSnKtkZZXSqTS51Cr46NCnO6NQLlOKgMtnVRltU8kAU5afw8gQk74nQtoqimgWRmBQtmBoQgbldDoBWq/75VhsI9w7hTgAcAa4ExHWYdZyiGVMxInpAFutQJDpUBiR0a1Ld2nR3TLpLl+6OTXfHmT1xGZ7483LHocyu2HSnLs2hTbFrGHxkslWVhJ73ymLbIjSI3cqp2oiiDSRYzDGr3yQcDuCfR7uUE2wl5AigaBg3g7xWoGwXq7ulMTZFol1lsKuTHRoTuueMSaOocWZvfJYvMcenz/Xp83gN0tdcqsQcb2K2JyHLE5/pjjUvklPPI5P6FAkdEm2bWN0ujGrHqg7SNhAh81Ygef+EQoaRdBkn2AHkMJAimleSFiKvE6g6xBpKq9Q7oiiqU5uKqM5YsyvO7EYnEzI9iVnINpi0JGBYPpS8PLAowzJ/0lIUz8+To+0MO5XH7lcmdkhj2iM0HSJ1B4fMslYQY9XYDmQFx329wb2EE2wBcojRNlJaRZ1Q1RkR3S3TYe1xqI2YmWipKxY5M3lOZGCoeX7DElQgedmQMX84ZSXTZcMpK4KmFUOm/IBxHh639OlzEBsvljMmnWKrjb2qxE6ZrkMSzZgj22hKi6qA2wLwNfqcRLgNhBygeStg3ipqkVYS3SPX9asSmbFpFBWzFONTn+3V5/iScgeRM3lpAGVcNmRajmxBVMqK4bRVofTVVGmrh1NXBVNW4kpKnrx8MGkp7zZeNTygkzKbelQJXXJk1naINO2cqpXOZETYrt4D8rXkM9bk5wjZD1AAAmyPrUReI1Ay2theVQKljcGylEGNTcz2Jp1HHaKcjBCVujKUtjKcvmpBq0cy1o5kXjGScXk4fU0obRVuQLGN+X7DMox/73mr0wbUxu7zzOo2omqmXVpYDPBXQpRfbd0WAtzDcXsBDgKHs992oLQdERqktajiB9TJLp6WGYuoPt5V43I0EzlDqSvDaatGEM+8oIw1I2Zeq0cz145lrRvNWofwi9hDphW4+6BhqVefi3nhistw6NJ61QZk7lRQ5jahGkOsASIqQVAIcDfhhF8h8FVEsA1gH5BSEGHNqOMULWJ1j0xnUSX0RSXh5edpaQwb8gaTWaKalrO4pX4y1DWjmZePZV4+nrkWNZF5BYp/P5ZB149lXzmWdeVY5rpRis0HOTLnDyYvxSvImM22mBRLVFK3Mr5TrmuPiG4VRrJJuPgkkJ10kNxXNnN8jZDdLHVbQNrEKepEKkqrRFq9TWtyLXpryB2k6cpoU1fw0ctQ145nXTFBtW4i60qqbF7r2BrUFeNZa8eRmWKvw+3D5jWY5HgQ6nPyUswRd2KmM87cH220ROq7lPEdshjsVc2cqh6kp0BUBPAqIbFfnhkP8CuO2w6wH0gtRGD3r2apa1HE9Ubp+zUGJ7bZ+CzMW58hB731GxdpLwubV6GrF6JOZl81mXPVVM7VF+iqSR4+cx21PefK8dyrRxeYMbypzyZkpvnsTsi0xaT2agw9kYmdyth2qbZFFNWAQ4KIYuD2saF+WeJUjnsHYBetVcITICkn8mphZEeEziJL7FMYrKoUlybTrc326nIH45b445YFEvKDiStC+pXhpNWjxrXjpnUTVFdNplyNmkq9Zjr1WxfoGqqUa6boX6+aMF05YVw3kXrVeOo1o8YrRwxXhA1rhvWrhhJW+OOX+2KXeGJyHJqMPpXJIk/qkiW2S2JbRNGNXCTeXZWCuJBWbEj9MiZj5fvDbVzxc1D3BrRvgO7NXO820cAnUsdBhfd4VKAyOtQUN9ahH+8yTPSYJntNU9bUKVv6tMM8486a9ebMDubMBXLnhvLmgkvODi85G172KWoEtZxqlL3ix/DSs6jQ0rPDeXNDuXMB3CtvNrD0zGAeHue0K3PabsYjT/aljPcYxzqShutih6q1/gqN72Sk57jcWRhhOyDo3Qltm6D8NVh/O/fFC3a6gex9Gao+hJ5CcNcQ6zGBrVjsKpd5q5X+BvVQq2akN27cpp90Jk+5TdPelNODqacD6WeCmXOh7LmRnLOjOWfHcs+O5306ueTTqaXnUNPLzp1e/llNLz83tQz/SjebyDs7njs3lj03hq9LZsM5eLSZIfPpwbRpX8qUxzThNIz2xYe6Y4Id0YHWKH+T0lsvdVUJ7WWk9yg07oH9r9Nhf0Hg+2/iTmyAxu1gPwXeOs5RKhpsQFrFYF3kUJNmuF07Zk2YsOmnnMnTHhMOaNKbciaYMRvKmgtnz32WdhkFW4D8++l8FHu/jGqaAp/DLSfzzk7gXjmMOW9uNG82lD2DzIF0vJp4TSddyWPWxBFL7HBH9FCbxt+s8jXI3dViRznXfxzaD0Dph/Drm75QVKtVZOMfoXwjdOwDbz04ygTeuoihNkWwPTLYqgm2Roc6deMDiZMOw5TLiEMJ2TMHrbmzw5nztKhxHD2jneZp8/8+w2sF1ZkVCx+Xz5PzzPMm58yNZiHw3EjumeHsmUDGaX8anmXabZqw6zGyQl0xwXZNoCVqsFHpqZE4TwkGSqD7MNTsgA+eoYO/aOB1S7kDr0DNR4BXzltP7CXCQIs02K4c7lSHurThbt2IJW7CljDl1A9Zv+2w3NXbeW9L62MB1z1h311zo0s+HctEr6i900t52nM83hmGOou6jL7OYy8/h5qeD+yzyMyAZ0eyqcnhnJmhzBk/M9mTgpd4rD8+3MNMblX7m1TeWqmrUmg/SXqLoGk3FLwF65ZdPPAjt3JH/wZN28FZBe4qzl0pCrTKgu2qUKcm3BUT6o7vqf9hS81Pm6pvdXSuC9sN3r7ltp5fjg9mjA0u8zof8rkeCgfWnxn/Psvb/Hl7edS5y/4xt5IXvmfYCz7zzBQ4d24UCwFlnkWTMbADLJO9qVNO4zgf1Z1ajDV/c6SvTu6uEjnKuP5j0L4fSjbBY7dfZFSrFOTNx0jJu9C+Fzx14DgpGGzAeJYH26NCndEIXH3iB45mU6jV0Fpxc+CT1OC9eb5NOY7m20buXDHx+vLgwFVj9lvPjGQN+x+bm/o2s5dRoavnaVedZz6Dyj/HM/Mmj+dSk5E2TCvCbDj7DDU57bQvFTMIU2mURrUu2KYJNEf56hWe6ghnuWDgBOk6BJUfw9tPEkS4COCMZG77s1CxkdZnBKbx3CzBBB6mwFo8U8Wx6wbuT3an53Y99DPX/dkh4+rBx/MCJUtGM9aNrlgbKPzFxJr/mLrpqlHbtafHbzl3egVv7z9mL5tHPbv6f59dja88Nr0QLLYZ8LJPJ5fORzWGdDhrNpSJpevMfOlKw46AlXKsLx7Targ9GoEHGzCNpa5TQlsx6TkMdTtg1/MU4SKAv3MZ2fffULMZrCXgqiSuclGgWcaA1Qg80q3rqV7V+0Cy88os+x9THa+muh7+nv+D7MB7mYE//jj0Zm54e/bED6+cfHDNuO1Hn06tYvG8YgF41QLwGgbM3GZRzRzOp8ALUX0WoxrtReBhKozqGV8arVu2pLH+hBGaxjE8sLdWhsD2k1zvEWj6BApeh++tuhiH7/0JV/Ay1H8EtpMYz8RbwwMrXfXU4ZGuWKxYzuPxfa9l9/1piWufybUn1XPQNHgs1X/SHNyWGXovO/TR9RPN2egVrVgzK85OL2fAKxcd/sdZfOU/XvaPWT6kmcPTS+eBx1kaM+Azw2bWkDMoMHZjuwE7ImtOMbRQ1yt9tXJ3hchxkus/Cq17AKvPr2/gLmKC9eRtpOg1aNwKWAbsxRwmcKBF1vCy4p0bFXXPaoJNulFLHFaOQHfiQGVKd2Vu5/F8W+F3ug/f4D91eXfDmhH72jGbGVORn2y4S1Ob3zR5t6SNWnMWsndRFJiV7kXgZQszkJx54OHMM0HzmSEzBR5MZ51pHjjUGTPUoh6sVzFgsaOUAmMfLd4Av/8l+bxf/8gk5IXfkGOvQ9M26C0A2wnO3xgRaJZ/+Afx09dGvH6fLNCiG6qO82zW+7cZ+180On6e5ftZnv9nS/yPXj/0u18En38gcOLR8fBjp8efPDPxKwQI1psb/qzveMUwN7Tk72jyvM98MF82n8A88DRzmAJj0cpmwFk88EwgDadc2JwQeNJuoIUa61anjnYmBuypjHCWCqzHofMglG6CVx4kUsnnI1bKyd8eI8VvQvM26N67ANwk7yiWWU4pe8qjgm06z+YER0ymJz6v/+Z024+ygoaVYUO+b8AaCAZDI+Ggt2cktG80PDo5efzcdN7MeM6ZiazZyZxPTy9jnYlCIvbfz9PSqQhN4POtmFXpeeAMam8gDecezGEjD4yFOkyBNQjsrUFgibMMCzVgoa7YDO89RRDk8/UkObz7BCl5C1q2QxcDpiHdJG8suaqi7JnSwh9jW3IjsC6j9Z6kxvfjW7Yk2O7KDCet8Fr73Y09/o7u4dL20EDPiM0/OXH03FTuzPi1k5P7x8c2nZtZOo/3GWFJo5NNPp6X0gkmP9ka4SsWA2Y96TQCu4x07oHAFgbcQh32VssWgXsKoOoj2LieIMjnA5bBhifgJAJvg6490H+Y89WKA43y9tr76tpaSo6tD3dqXR/E27UZjVtjOk7F9dTG93+QHNbn+6xWr9sTKLcMn+wJOLzhoeGJ8aJPJ3PPTN46PXN6bNx17nTe+XnlIuoMa1qLsw5+Oj1GJ6d04hHKmA0icPo8sJf2YeYw5nAcn8MUuIoBYysuBuxM1R/D5vVwMcCPA3V4KwXuPcQ5S8T+BnlL8S8qdu8oefF2164Y6yvxdl1G5dPGyuL0+vKc3vVZIf1ydNjR2jM44A4120Yc/pBvaGy48Iwrd7r1+klrx+hgB4Y3f9twAefCXcRCMPP2MmC+CWfMDpnPYAIPpiEtJjDeq0zY+bYUF+qIGWpGYKW3UuauwLkHZyumc4fqLfDB7z83sFIO7/A5zAMfJP2FoubblR3f13ZeZ2z9YVrvdYmtOqNdl17xZHr58azaU8t7Hs4Z1C9zP/+Gf2DAZbH6a3tHmu0jE+MjL/1t6qm1U3++evrZn8xsv2Zm0+VnPfytAs+Zv3CHyHovo2XlKpe3d47ai7TUXgrsSZlyJGM8L/ZhCtwU5a9TehD4lNhZxoCPQPVWeP935PMDkzcfJsexSn8MXbvBcoD0HxYWZylP/OqnpyrLDm99wlOi6XshrsdkqtwdvfvQtUdLrrX8xvzJo8/86aWdHXc/6bZYA4N+T5NlZGJsxLZzdjh7svPn41OTw10NkzesnetjN4MXit4M403VBbRoL51j8dmbzts7g/GM9lJa/fgAzrQSwt2xeIs6hBOPWoWnQuYqY8AlFLjqY3jnic9dtLAtPX8fOfIKNH4InZ+AZT+xFgrb3pWceOGXFU11++++v/PBGPvHui6jqe2WpPrr8lt/tLLsyh/vOnjPBwXP7n76ed/eg0PdFn9H13Bv/4hjy0xPVvjHt4+NjQa91tMFS+ab8wVaQGWRPJ67MMFiM0raftOovT6M5xRarmxJWJ/HrfoxS3y4SzfcGh1ojBysUbhPSZ0n8f6BILDlCJz6EF76r8/dlrBfP/YzUvAC1G+Gjp3Qsw/6CwTWQnHJH1adWn11c0KibWO0u15jvzE5sEfvuzc1cHdGw/e+c8/bBdsKH3v9vndsd2Q4Hs10P57tfSRn9Pf5s76c8TtWj3/rltC7b84GshGM4k3mzQcwj3qe9oL5M6VNn1nIXrR3GrPXSr0d708c7cESHTPcqgk0qHzVCleZxFEsdJTCAHO4dCM8dRu5iP873f0Dwd6/QM1GaN9OW3HfIa54lfREsqnwoUf2fXRPsDHKXadx3GgI7kn03ZMydJc5+Frq0SvuOHzLry3fXem8I8v2QIbnt1nODWmjD+YjwFTo5lB1fej+x8bXXDHroF+DfFZjC1WKj2Tais7T0mD2pEw7jVNYnPsTxixUI92xoXZtECtWHZZouatUYj8h4IG7C+HY23Dvjy/m5uFby8mOZ6DiXWjdCt27ad0qulF88O1bjlaU7t7+n0P1ka4atf36pKFPErx3m/y/TBv5OGXoyQz7lVmWO9KsvzGf/MtK5wOZzkeywg8uR4DJ4E3h8bFBf3f42dzZEPvq57zYdyOjzFisUpQ2g9IGWer6F2hdRszeSUzd3oTRnvjR7riRLl2oLRor1mCtEhMY+8jAMY4H7iyEgy/Dt/Mv5ubBnMRtehJOvknrVucusOwFyz5B8Z6bj5SX7NpyX6BW5ayKGvhJYmBHvOcuk+/2lPCHptCfzI7rstqfMXSsT33mnVt6/5Da/3Jq6NGlCDAxdENobNTj60DHzo5koZPnxXMy1Dk2x+Aj+f+idRuxFU1h9vYnUm/x1qVTF+6ICbZoAvWRGM/ucqm9WGQtIvaTYC2GtkOw9RkwGy7GYZWcvPRrUvQSNGymUd2zG/oPcgffX7Z353/t3nSFv1plr4i0/ihhcGuc+85kz89Nw5uMwfVpvdeuaXnE0Pfb1J67UgaeSu99JHX4oTycBo941g16t7gdL54ZTqNgnxFaSl1dMBZp/Xwkp5z2mOZp7Uk0e9He7rhwhy7UqkV7g7QhqbyVcmepxHZcYD0CCNxfDLW74LUHsCdd5Lc8D9zA7fsLVG9gUb0L+g+QE+8J2/cJq3diA1B4qyM7vhvn+1DnvCPJfYtxaEOS9eEfdr70audtyX03pFtuSLP+yjxwq3m0KAO7aNiVMuFLHvWkTflTkOr/oeACaoCnTZ3xXkiLwZw0zoJ5pDM23BYTbI4ebtEMNdD67DkldWA8F2HvBCzRvceh+H148At8cXl5LtmyHsregqaPoGMHvPF06tobH7r2toevvfN/vfj8ddTkbZq+97W2X+odtxitu77TemJnz/anu5982vLd3M67Uvq/nzX8thmH7ret23C0fld59eaTLQXVBzBWKRslXIDkOQOLxjJarMkuSjtpT6KtqC9xDGm74pB2uDk60KAONql5e7E+29HeQugroAncdRT2PAdrcy/+Szy1krz6n1D0MtRtgrZtsPHZhD88se7XD/zkuT9//8M38wcrlP6aKE9FdHvB6obj66vq979Q8Mbre17aU/2JpXmHvfje4c6caY8Rm2dgYGVJzV9P1L5eVv9cTfMfZ/yplJknpG/SKCfvqi+FN/a024gdiFYppB1ImujTI+0o0rbrQi3aoUZNoDaKz16011ksthVxfYfonSzGc8NueOshOvgv8tX0r67l9jwLFe9A80fQtRMse8B2iLMViV3FEk+ZfLBSFahVBxs0w82a4daYYGtCsCNxpEc/0Z+ABQbjkH5B7zJSAI9pxmukPD4TfUW2C4W5ivKa5lFdydN8GNuSJq1Im8hoYyltqzaItHVqfzUGM50/u0ojeHst+6EXX4/ThnT3f3zRfy+lJnIbH4Pjr0I9mryVMvfuI9YCof1ohKtY6i1XDFap8PQ4iOGWaAw2TDAsKphsE/16HOuUzYBTX4adjNlI/zvBRNku0DTLVbw0uNkUM3aKhfGkVY+HupB2uCl6qF7tr4n0VSp9lXJ3ucRZLLIVEbQXJwuWImg9CB+vhzT9FwUmBB75Kbf/OajcAM1boHMn7U/91GSRszjCUybDE/trI4ca1Ggyls2RzpjRbt1oT+x4X/ykNRHb5pRdP+VImnIaplyGabdh2nOhkuff4HoX3WDKmURFafW47wSdY8SNdtMmhHMMrFKYtzgF8DNvvZVSnDzbT3DWIrAchM690HOcfiP9+M+5L/X0g0nIPS2EDRGwUwr75VCg4I6qhCVRkvJoeZVOVRcf1aiPbkmOaTfFdqbF95gTezP0/VkGa06yLc/oWJbqWp7mzk93rzB7LjN7V5q9qzJQvtVm3+oMJrNvFVu/km7gRq1Id+WnO5el2ZeYBnKT+7MNfVlJFrO+Oz2hIyWuzRjbYtA2Jmrq46JqdcqqaFl5lLhYxRUp4IgcjsrgryI64C/7D/GfcIIXADYB7ADYA+QACI6A+LhAelKkOBURVS3T1Cm0jSpdS1RcuzqhU6Pvjk6yaJN7Y5L7dMaBuFRbfJo9Id2RYHYmojJQrnllutjHBZkdCen2+HTcpT/W1BtjtMQk90QbujRJHZrEtqiElsi4RqWuXh5dI1FXiFWnBPKTIDkOwkI6JDgM8D7AjZzgK3jsIYZwDxPyBsBHADsB9gI5CMIiEnFCIKPMkvPMzZGxbep4HF9ndFK31rCIbY1NmSePp0gOXgnzb3AN/gllRVQdRcW9erQGvHB4+drVia1R8c2q2EZlTL0iulairhSrygTyMiI5AcIjwB0E2A3wCcCThMR8VY95rCTcnwDeBfiYPQ2wD7hDIDy6yBwRWSVV1yq0DcqYpshY3upF7B5tMiM39ulMaB3CW+MoPwrf0I+xKcjZxzhxy0VUaqw6oTUyrkkVi0fmva1k3hZTWlERHQYGHWwHeJEN8it7ikcE5CaOe4GFzdYF5gIQHiMRxSy2yyMiK6XqGnl0/YLVaMsCtr5rnpx6bpnnT+bxePXMcxq6FlDbKSo1tkmla1Bo62SaGkkUT4veFmGI0QFguNHxvAnwM44TfbWPFasIuY9wrwBsPM9MGLO4hDLLy8SqShbetXJtvSIGI7CZuY1BPk+u0TN4fZc26bzYmgVIykldxRiOpKiNzNhaqboaL6hIibSlBPNWVMBo9zFv38FZMP11zNfwzGU8JjOQ11gB28KY9/LMIC7mJCVCWZlYUYHhLVHXYFbLoxt4bKxn1PC4Ngx1ajvjZ2pfEBLipUFIKpWOR22QR/PGVolVFRhEmD4k4hgID7C83ctoN2DqAkn4+h4lNhPBEwBvLDDvZHW7AARHQXQCU1ooLRPJT6HVEZHV89jaerkWyZswvZU6DNGWecVh1aVSxdKChHFLaxKGBm6MuyCqGlGrI1SVWCOE8jJOWgziI5SW7GJ5u4PF2h/pkL7Oh4gxbrIpM3mdne9jdpl3s0cSi5jVxzjJSaGsXKSoECsRuyoiCitNrVRTJ4um5Ay+kTk/L/pRi9cFr061TF0pxe1RkRQV40UoL+ekaCxe0EM0jOnzcVvZSXnaHMJ97c/G4wnSCfcIkFdYRH0IsG2hXRUyq7FjFXPSUootrxArsNJUiREgkpEgPOWvlS2IfqRmYqkvx34jVtJdqKsyhio5SjNWcJgenBr7ETsjnvd3QMz/BNoL8/k+Ql5gNeODBauxGR6gz47j+KjbJURSKpCW4dCF8lPouQjhlVViJbq3qKoIugbNLBXJi4Wy40IplsBSTnoCIo5cgHqIXdPNrDViTf4t+Trz9v/zM7vrOe5ZNoL32YXfMj8bo9hYWtBwrKjFJALJT3IUo0wgK+clnBd1kq6RYtk7QiIOE3EB5RRiHV5E/YQZizH8FgCe7maOU/yrfs8jBFjBcY8S8jKzeuMC9vZ5bPqE5gGae4JC2jlFx0B0HKelF+goiHF9IYgwKA6CANs7Sw0ME7r7LhY7m9jB8RSPEPrMvxD+1YuWcDdw3DMAry9gb2aebGVxuJs1zIO0mC+KYwZSFTK8I+yVj1s+Nbaya7eRxTAe9mkAjCYt+cb8PI1jP+z5OSfAGSg26rdZXVkk38IK2w5Gspfx72diIUDX7GZmbmd+bmaWbmDXDg+F1/EWToAH/wb9FO/CBWsJ3l39jpCXWG7joN9jGb6R1bbNTB9eIH7NBwzy/QVO3BF3fwoIHiqBfENJPzMP5ZYQ7lZO8Dghz7OYfIvZ/i7jf4+BbVh4/y6DfItthhvjLhgpuLvqfwTqZ/8vR0gS4VbRJBfcSbgn8K6LcH8m5L8BUH8hBD8+Trg72QZ4u4Mby/6Nfi8OEkLkTAoABWtsKMm/E+Gl5dJyabm0XFq+3PJ/AHdO7zPEf7roAAAAAElFTkSuQmCC @@ -271,7 +276,7 @@ - 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 @@ -282,7 +287,7 @@ - iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAa9UlEQVR42u2cB3hUVRbHXwotQBoJkBB6CSWVEgKEjqAgiiLKioogxbKCuipIVRFwdbEgoEhHQIpAqKGHhJDQISFAKqQSEnp1V/w8+z/3nTfzMgQJigpIvu/IOPPmvnt+93/KffNmNO3B34O/B38P/u74n91N7MHfLUDZ25iDmO3zf2uwtrAYkCOsJKwUrAzMCVbWxpzktVJyrKMN3PsaphmaAayUgHGBecC8YTVhTWDtYA/BHhF7SJ5rIsd4y3tcZIxSNkDvG5hmcAa0crAKsGqwMNhrsJmwaFga7DzsJ9gvMBL7RZ47L8fwsbPkvWEyVgUZ24B5T4O0Bceh5wqrKoqaDEuEXTZB+q12WcaaLGNXlXOVuVdB2oJzg9WFDYXtgf3vDkC7mf1PzjFUzulWBMi7HpyDhJGrOPEu7MQfCO1mdkLOXVfmUsomR96V8EpIUq8Cewa27y8ARza5c5/MpYrMrcTdBNHILQ7SWvBKB8DmwX78i+GZjecyV+bmKnN1+KtzoxleaVhFSeIJdxE4W0uQOVaUOf9lEM3wnKQv+6e0GXSX23mZq7fM/U+HaIbHOaW6vb39R39wdf0jqvU4nrv48KdBtFVeDdgk2PV7CJ5h12XuNf5MJRrwykjDOvEehWeGOEF8KWOC+Ie2Kpx8vWBvyPaK7nH7SXzxEt/+kBbHgFdSNvE9YBfuA3iGXRCfPMTHOw7RTrZDfPUjBHb0PoJn2FHxzUV8tbvTeY8TbW3Y9/chPMO+Fx+d7lQ+NIcuN58D77F25Xbtv+JjxTsVyob6ysOCYIfvY3iGHRZfy/9eFRrqKyVd+/t/A3iGjRWfS/0eFRqFwxnWGJb9NwKYLT47/9aCYqu+UX8jeIaN+j0qNHIff8bgBzv0NwR4SHwv91tyoZ1cePSEhp+tjG7dB4PWgjWC1dXs8K89BWgOFKQ5UrBWQlljWIhWikK10tRSK0OtYGGwNlpZagtrp5Wj9rAOWnnqCOsk9pDmTJ1N1qUI62xj/B7j/TxWBxlbt/LqXG00J2oN4znwfEIxt6ZaSTVPnncAzA8+NIAvvvCpHnxDD0PVYdiW/MS+MwNhYXe74cvbmppdNIc5H2DAr2ArYJE46SpMZCcmGKe50W7Nk/ZqlWmf5kUHNB86otWgJK02pWp16bjmSxlaQ8rR/ClXC6A8LZDytSAq0BrTGa0JndOa0XnYBS2ELmrN6ZLWgi5rLZVd0VqJtbTYZbx+SQtVx/J7+L3nMA6PdVoLxriBdEqdIxjnCqZsnDcT5z+h1ac0zOcY5hWvVaP9mjft0irBBw+Khg9bAXwDFn01fFsGkLPhJzb59LDmMFc+Rr2tLZ65dWncV7NP5cG+hm3E4BuwehuwmrFQQJzmDoAVAdBLTSpeq64mmaTVEYD1KUvzA8AAOqmcC4JzjeEsO83OMwSGx1AYjgEujK4WYfwaw2XQBsRzWlM6C+MxCwCNAeYpa4xFCwZAPwBsCIC+al6HscC80Lux6Dsx92j4sA2+bIRS18C3H6DG+fD1C1g/+C7F5LZaGiN8PWpqDr3+qdn9+AkG41XZhsFXIQS2IxxjNRcArCAAvaHAKpQgAFMAL02rh4k3uAFggQLITjdT8C4ABAO8pBRmhXetCDNDvChKZBUywDMCkBWep9QehHOyCgNUFKRjMZMxr0QAPKhVpT1Y9J1QYTR8iIQvm+DTWvi2AiG9EL5OhQ2F72DwtOyRix3GRvX1aaE5fvgOBpoEwx4HUnegcITvDkg+VnMFQA8ArKQA7seqmgGmS/gaAPMUwGAJ36YSvnro3qi+1gCm249aG8tjfp5fZ9CGCs8rFTZTY/LYBsBchC8DzMF5M7RGKhp4Xke0mnQIYbwPc46zAHSlzUhJ6+BbOMKYfZ0OGwljBszCVI2Llf94L1ivi2a3fKTIORy2AYOvQ66IgeRjkTt0gJVNAPX8lyLhm4mJM8BcFVJBNgA5fDkM9fC15r3WFoAM70etLaz1DQo050ID4GkbgLxwDDATj48jGlIQFUcBMF4A7sLco+HDdviyBaJYj9S0Cj4uQaqaCX/HwbqCAbMQJrfMg4W2br01+3i05DQZtgrGSXYzTrIDAHcWAljFBmA9NeEMBdBfATypAAYpJw2AFxSA5gqGrsAwAciqayMAWwvA1haAVwrlwWYK4NlCAAMVwGxRf5YATMW8jmm1VKTsx5wZ4A74EKkAOlME8uAq5EGjkHwMew4MbmdrZ+w+XPGfsD6aXe4Hkg940JUAuB0n0QG6Q4WeahJWgBzCdQoBzBaAeaYceNaiQCMHtrDJgTrAa6ZQtoawrQKbmRTYRCpwoKr6DDBLGQNsCIC+UKAV4G7kwRj4EKkqsTMirCxEwoXEjubB5//AXgQDR/3+G9fi7EoMgB7emsNjAzX7y+ME4EIMugKDRymALkUCjBeAPFErQD/ljLmInFFFJMQSxnoRaWEC2Pom1qoQwAtSRHSATSwKPKlCWAfIbYxRia0KNCoxA6xoUSADXINCshy+fgefP4e9otldZhZSSIoFkKtNJR/NoQ/e/PN4AThbALICowEwxgRwjwA8iNxyTPWABkCjiPgXAbBZoTx46QYV3qqNCZVeMESNdcbSxhQGmKH6wAYKoJ4DaysFGgB3CsDNhQDa0wL4/CVsCBgwC2ZSnEpsXPvzwiawPwD+MgGDTBOAy00AdwAgN6JxALhbtTE6QA4RXmluG/Q2Rg9jax8YrELtrKWVsRaSS9JEX7Y00YXNgFe4mQ65oQ88qYqHvzp3BubABU0vInVvAGgocJNqpsspgCsAcBF8nqK3Mr8wC/nMpOStKrEBsAqOHvQKBhhvArgQOXALAEZhtbgBjQHAWLQCuwBwrwJYFX1WTbXSaQKQQ8gI4zwLQH0nYlVhqAliC7XjuGyBabYWpuJhbWHOyk7EWkACZRfSSM2BW6o0aWOsOdDHkgO3AeAGAIyw9IJ2qpXRe0G1rRsk99YUG6BPRU0bbADkgWbBvgPAcFTh7ThZFAByBeNmNA4T4TA+AIDc6SerRto2jAMslbjA1M7oEHUV6hBDpSq3uMEuWpTXXCn3nE0TbexCzPlP38b5Yk711LyOAKC+ndN3IzsEYIRqY3SAKwFwsQhHAA6WXvC2FDjwZch3nEiZ+6L5aKQXow/cCKlz78RNKIeAHsacB6sWKiQcxhlKhY0seVBXoQ7RCOVzSknNJZybW0Ca7YIUjaLhWduXosI3VW3jaqv8nGhppKtIH+iJCqwDXIfoWos0FW4C+DoYeOmX+W9Lgd5VNIcXByGBfiB94AzYPAD8Ht36SqzUVnTvUQDIK7gTE9klefCQyoN6L2jkwcLFJEByobGts4ay0dqcNynyggne+UJh29RSeQuUsgPVAhn9X6YUj3RL6NZWuxCOEJ4jdw76TsQDaclVAVyD6FqjoswOzbQeea+BAbOQa4O3BGhU4cqVsQ/up9ldGSPV6FvYXCTXhZD4D2qlnJF83dUEdkgY75VCchgTTcKkdRXqFdCaC/0tPWG+hLJ+ccEIZ1uYIQLNsKLhmZtnW/UlIyKOSO47rAoI74W9VQXeDhFsRlFch6hahehaA5HwpmGJCGcgGDALZlKcKmzpA/Gfzk9rdnkjpR/6BjZHlfcStFRtebhquWECHlCirsLdKg9Ws1yVMVSo50K9IudYCoq+N9Yh6uF8Wi5N6WFtWDPLFRczOKNonDLtPHJM8Dj3GerjuRxWFxH0ue0vVIHdUYFdIIiyiKxSCiBvW5eK39hM5Dnq3xLwuJ1Gmu8tbvWE5nhkGAb5VC5nzVINpqPKgyvV5tsFq+eOSXhgMpUkjKuqiXKuSVYqNFdkA6K/pbk29sj5Sk2NpULrVdrWDHAFNvD0vOcH9TVS5zDg8bmTRH3xorwDlvDVt3FbVQV2xg7ESbVpqyGScFHgv2FPgQGzECaOxd0L84cpwW01u3VvykBTVB60U3lwEVZqubp+5qxUuFVdmKyIloarsQ9WuJrq9rllMCCmmyBmW5TobwPRqsibmQHO6PcM5enwGgo8X6m8eu4z1MeLy2mGwzcW841S+c8N1bec6i6WQRyr4SMD5CLC1wE6gAGzECbF2gvbyz1z9YM0x89flasSk+USzxwAXIA8yGEcrko/XwqqgFD2hAqtxcTIhRw+vwbxRjUGWYpMvgVqUCHF5anjA0xh29CivOPSthiha1RdXtQ9qvLqV2H0PXAFS/iuQFQtVflPB8jXBN+CNQYDZiFMinVV2ricX72KZj8Ym+n/jpZ8ME2FMV+xLaHCeIXa+rigrXG3UaG1pUm0gciX+a3hrFfn7EIgdcuzXFkOtISpAc2sOjO8dAWvnsAzCkcNCVsfBY9zNTf/UZbwLQ9oTiiMJeGTvSogK6VtGwDfmYHciFm6ONcDzZWYb2/o3FOzz3xX8uAUVY3toEJHrFApSN5JFRNDhZGiwjjZmTBEdsAMMU0p0ddSWDIVxIay5dNB6uHtZ4FlAMsR2GZwGUrVetimWuDVVvDMocsFbicWlxdZLx5cfV1V9V0JMSyBT4vg2yr57Ocz2DOafQYzEBYlbvczEb5LqUkrzWHF67Ij+VKKycwiVGjkwihMzugLGeIBlQ9rmiDWkcLiq8LN6BMzC6lSt2yTWZ9vIOD0NkXPd/XUZzA8thVeTYHnoyIiVsGrhF2H3jUY6lst6lskl/LD1aU7jYbDwuC7fD/P5XY/EzGuStepWsbxrWF+pa9/27osLeviSmse9aQNj3vR1p5VKeqZWhT7rC/ted6P9r8YRPEvNaPEQS3o2MutKfm1dpT2eidKH9qFMt7sRln/eoxy3nmCcof1opPDe1Pee33o1IjnKH/kC5Q/6kUqGNWfCka/RKdHD6DTYwbSGWWDxPT/Pz1mgHpdHYv35I/sizGex1jPqjFz3+2Fc/Sk7Ld7UOZb3en4G49Q+pDOlPJaB0p6tQ0dGdySEgaEUOLA5nSof2Pa19efdvXxpR29a1LkUz4wb4p5ujKt6+pKowJKX2ffmUFxr0YXtSPhSzhd3u7rkRz+hRfFLaxNCSsb0rF1wZS6qTmd2NaGMnd0opy4bpS390nKP9CbCuJfoDOJA+jcsVfpfPJQupD6Nl1Mf48uZ4ylK5kf0dXsj+lq7md09eRXsGl0LW86bCZdOzWbruXPpR/z58G+ox8LFsAWii3QLX8+jpmHY+fAZuF936ox1Fg8ZvandDVrAs71IV08PooupA2jCylv0bmkf9LZI4PpdEI/yj/YB3N8nk4deJpydz9GWTs704motpS6JZRSt4dQcnQT2jy3Bg3r75nMvguDksXNf0W1M0Ftmrp+Nef9CrRtZjU6sLQeHVnlT8nrmlDaphaUEdmWsnZ0pty4R+mUgvgPOm1APPoKnU8CxBRATBtOl4+Ppitw7gqcvJr9CV3NgdO5kwFgCl07+TVsuoJyLW+GDjVvlthMsRk6cBx79eRU/b05BriP1QJdPjEWCzYCC/cuFvBNLKQVXsFBKH5/b8B7hk7u6UHZsY9QRlR7StvSkpI3NKWU7U0pfqMfLZxYidqFuH4ll/Kdf+udCUY1rurgoPUcO6hC/uovkdsWoLItb0BH1wRSSkRTSt/SijK3t6fsmC50Mq47ID6Fif6DzgDiWUA8yxCThyglXIRTl46PBERW4zgdZNa/AWES7AsdSC7DnGqyaZbHDFo/5nP9PRZw49XCXD4xWi0UL9j55DcA7zUF70wCQv7Q81SAxc3b2xPwnlBRk7mjIx2PDKOUTSF0dH0QJUUGUeR3NejDVz3z2We5+fw33zdt+XwE1rRDc5dvZ49FuzID1XVxHUpEKCetDaLUDSF0fGsYZUZ1oJydD9PJXY/RqX0miIdfUk5wGF2AU+zcJVbjiVES1h/qALIm0pXsf+tQcv4jUCfpCrM8/lQp94qCNkEp7krmBxhrDF2C6niBLqT8C6ofAvW/ivMO0uFhHgyPFzd39+OUs+tRhO5DdGJ7G6gvlJIigilxnR8dimhACyZUpE6hbt+yz8X9HKQ4KqxWsqTDU8P6uh9f+Rmq7LzqdEiFsh9COZjSNnI+bE1Z0R0B8RHKUxB7AmJvQHweEPspZ/S8yGp8E86+A6ffE5BjYO8LTEDJGq/UWdjGC7Bx6jiGz4ozg+MFUvkOqj+biMKDsD0dz8rrrRb1JMND2GYj72Ug76VvbUHJGxtT4mo/SljfgDbN8qER/T2Os6+a/iXu333XvlmFjYMblp04dZjbTxunoVleWJMSfvClo6uRD9c3pvRNoVaIsQyxu8qJBcg3pw/1gTMvqpA+d3QwFPIanDVAQpHpw5AfRwDISAWFFaVDHaODMh6r10ap4y6lD1eLwKmBwZ1Pel0tkArZxJfU+U4fes4Kbw/gxXVFvu5EGdHtEDUtELpN6Ohafzq4wpfifqhF00d5/MQ+yu0cv0t9N7tP8OHnurpuXfQRmuaZVWjf9+i3ltenY4CYwhA3h1IGQ1ThjJyIUDmFfJO/vxedViEtajRAKkW+DgBDBea/kMPeUUCtNtzy+GLauwq4gpbyhnqfAndUB8fjnsH4nDoKDj2LgvYMFrGnBV42h21kGzq+rSW6iKZ0bH0Axa+sT7uW1KIfEFkvPOq+lX28E3en3uxeQV/X8iX6jejnlr1ykiftmFOVDizGZn2FQIxoolY2g9sbVLecmM4oLF0pD6GTzyGt1Pgs1MEgWZEv0TkO7aMvAwRgIvx0oEN0qMreMD0eol5nBZ879op6H6cGVawYXEJfpXZOHbxop/Y+AXjdAQ9hG9OJMqPbUtrm5pS6GfAiAighvD7tXlyL1k2rTGMGumezb+zjb70nsDhfpnbn5Fq3utOoT4e6Xl07GXvfuTrERAXRj1IjGgMilBjZGhDbUTZCJhcOnNzNauxhAsmKfE45rauSi80AAcrqZANYgOJ/GRa/dvbIQP3Yw/3192EhziS8IOD+AXBPq/ybt/dxdc6cuC6UFdMR8Nog54VSMgpGUoQ/HV5Vn/ZCeZtneNOXb7tfZZ+kcLj/EV/KNocyf7zXLjTA+etpw1yuR0ypRLHzGCKHsy8dW9UISgwGxOaAiOqMSpeNdiE3lkMaDfeex5Qy8vc/ZQF5Op5zJGAeRv94GEATWZ39xPpbHytYzyvwrGTDlOIO9FLgTu3tAdU9Srm7HkEufgg5rz0KRhjgNUfXEEDH1vopePuW1qJts71pxmj36y3gi6b/rIrXnQzdX/vCDVeoh7u2cl4yY6Trzxun6hD3q5xYj46GNwTEIPSIIcg5LRHSrVBcENLIQblxaHV2GyBZkSg0CLcC7AxOA4QCqsD00cGaTMHCcXx8voL1pFqIUxjjFBSXZ4CL64x81xHw2qBVQb7b2ATw/FW+Tgj3VfAi51SheR+6/9wtzGWJ5L1qd/ILNreqypwjaqPZfLxHO9eVMxniFA5nH9q3qCbFL6tDR5Cck9cFoLA0VWo8gdyYGQU1xnQQkKzIrkoteXu57ekBY2U+Kepk62WxfGVPKeh5u7ur8OT35+3prhYkd9fDVnAxbaG6Vsh3zdAhBML80bfWpwNLatPepTVpO5Q3H/Ce7OC6kn2QbyeVu9Nf8fq1UHaUu5XqYgI9WInfDEc4f+VJMbOr0N6F1engEl2Nx1Y3RLMdpECmbw6hjO2tlDKyY1iRyI+xnXVV7npElMlAuyuoNxpg7emG93VGgeqE1KAvRk4sHu9sD3Bt0KK0UudJwc4iBYUieQNCFqrbi7YrbkE12jbLi2aPdbveLcx5Cc9d03/Vw/g6w5/yYxRmiM5ytaJbs0blpk8a6nJ1zecVKGoGtnzzOaRriBp9EUKNFMjUDVxkQqBGbAGjWyu1MMzsnR0UiNxYVieg7mKFGvaw+n/1fBzyGqopF6kTSA0Z25Fno8OQKkKxN8d+dn2gApey0R9tSgM69EMd2v1dNYqa6U0bv/akKe+6XW0RWH46z1nm/qfCu5kS+UbsTj6VS48d3tcla9lEV9r6DXYsc7xpD1b9wGJuugFyFYNsSMlI5GkbuNA0A4jmgInwjmZltlYqYqhZMe2w3UIVtxieY2OVIa+lb2qGHVBTVfVTI3S1pWxAK7XRT4FLWFlXRcJOpJWt31SiZR+705gBblnVMEeeq8y5vPYX/iiPGWJZufWhZTmnEq8828UlasYIhPRkVmMlipuLsGaQSpG16Uh4PQUyaQ1gruPWJwAwggEFfeSWZsiXKD7bmlsN/8/Pp0NhaRt1YMkoCkmrG6HqN1TQkjc0xK7Cl+KX10Yerk5x83ygOi+KmOxB3w53vc5zcnIq8TLPUeZaVrsLftHI/GtFZeTSdyCsZ0Ddsl+MeNE1c/FHLrR5mgdFz0SlngtFfofQXsQ5klWJ/hEwj65BwVnPlZtbID+T+SPk/ZWy+N/UjboxsCQcf3h5XbUgCSvqoEDUVGqPm1cF56pMm6d60uJxrvReX9dMngvPSeZW0fT1/rviB3hsf3yHL3/XgrUpUcJhQOvG5Ra8P8g9f+kEgJzKiuTQ9qJdcJRh7lvIytSBxi9D4VnJoQ6oqxmsr25r9X/5+cPhdSgBKjuIaspK27OgKsbyUekiGmrfPNWDlo53ofcHuufzuXkOPBeZk4t2l/zozq1C2km+4dNA0z/VHxTqX34u1HBi/hiXnyO+cKPIb1iVgDm7MkKcgXrT7vk+gOqDcEc7tFCHq1tVPFdVvcbHMPw4qHnnbC+l7MhvPCniC3eah7GHv+B6gs+l6bekPSRz8JQ53fU/QmYO6ZLSW/E9JY1gHWEv1PAuM7FXR+fN4192y5072uW/q//jSlumutP26QA6A/vrWQwV4T7HsMrqX36OX4ue6amO5ffwe+dgjHGD3HJ5TB6bzyHnaiTnLmdS3V3/C243A1lePlvgnisU9iisX2WP0mPCAsvP79ut3I6R/d1SJw1xKZg3xu3a0gkVfg7/xP2X9Z+5Ehs/XoLn5o1xv8bH8LH8nrDAsvN5DB5LxgyVc1SSc95z4IrKjWaQTnKPibd894I/MmwP491AH3t7bXAFtzLDvCqW/tCnUsmJ1Svbf8LGj/k5fo2P4WPlPe1ljHoyppucwxbcPf1zoLY/Outoguki+amKJHm+hSJAoISIokLlcRN5rb4cW0Xe62KC5qjd5z9KW9Qv+JYQ50sLiHKyO3CRq8Ku8thZXnOSY0vKe/82v+R7M5i2vx/tYDJHzfrrvEX9pvSDH+n+Fai/Zg/+Hvw9+FN//weYHpPJEBLq3wAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAIAAAABc2X6AAAUiklEQVR42u2bd1RUZ7fGnxlB6QMISJMIKCAyCIiADWMJiYmm2GISTWLUJGqMplg+jekxyZfEJEZNEVsUY6eIVJHO0JUiMNSBGWaoggX89+73PXMQk3vXElO+e++ad+3FOh5O+73Ps/d+zzAChmEYhmEYhmEYhmEYhmEYhmEYhmEYDzQkEolhEgzDMAzDMAzDMAzDMAzDMAxDP4wBR8AV8AAmAOMgmQCpP4YFwCgQxhRBMA7BiDCYTIXpNJhOh2k4zGfC/GFYzILFbFjOgeVcHo/AKkKMR++NiEFBhwnH04mz+UV4WNIFw2E2A2Z0C7pXGEYEYzjdnZ7EH0Z+GDYeUm9IvABP4CHAiT/8kIcfpB8BPwDngXQYxWJELiwUsCmAfREci+FUCtdrGFMDzzqMa4S3Cr4ayFvhr8PEdgR0IKgLk65jcg8m9yLkBkJvYsotTKW4jWk8pgpxC1NuIowOoMPo4OuYRCd2IrADE9vYpQJ1CFRD3gzfJvjUY1w1PMvgVgLnfIzKhV0WbNJgmQSTOBidgeQQ8Dkgh3TIwAshpTN/BJIhSYJxEkzzYKWAbQEciuBE9yvDQ3TvGozlwD4t8NPAX8ueMqAdQZ3suenpiYFoiYeoBNTpffcG7aRZoOkQmK8juBvBdHoHAglYxyKoFYHN8GuCbz286Y4VGEPTXQDHXDhkwfYyrJJhdgHGZyH9FfgOWDRUYHNI1kLyb4Am7DKksRieAfM8yBQYyYGdi+FSzoFrMa4eXk0YPxi4gwHTc5O8Ib0IJeCbTEk9bf+9McDM5yWURCbgLg5MTtExywRomcj+ZKIG+CgxrhJjrmB0IZxyMSoLI9MhS4F5PIafx7AoYB/wBiSEMATg0ZBuBr4BfgPSMCwGI7JhmQdrBewKMIqAS+A6ANzA/SwA6xhwIPdzMPczM/O98s7o53EH4cIG7aH9NB2CyD1M5Ml0Ol1EAG6FnIA1mKjCBLIS3fEa3K/CrRjOCj2wdSosLmJEDIzogX8GdnCEIQAHQLKDeyMGSILRRZjkwCoPNhzYUQRmCVzL/dyMCQTcyuwXMAiY/EwuZX4WU3dGn0h7BzPvsO3Brg4TXc2AOwcB01QScDPkjRhfC68quJdx4Hw4ZsEuAzaXYJkA01gYnYIkEvgECBqSwo9B+gGwB4gFqBikwjQbVrl3gV0GAXvRQ6gYMFWsiVoGHNApAvcyACpXYVzh6RyYhA3nwDPu6BWeLtQwMY0p8yd33wWeSMBqbp8WDlwHr2p4kL9K4ELA2bBLZ8BWiTCLhbFQt74Anrh/hSWsYkk+4slA50fDKANmHNg2D/b5d4HJ0mMHgNUcWCfmcLdeYSGHpwzKYQbcLxpbtPRghSeLCk/iJZqA/Qm4hQUB+9bBu0oELoBTDuzTWaG2SoJ5HKtbkqPA18BS3PcnbyaQvAzpJxw4CpLzMM5kwLLfAfMqTSXaWwQmS98tWl2saIUIruZFa4oIPOMPMW0AuJcXLQ48SVBYyyzNgKktCYVaVFgo1ATsIChMwBcw/Bwkx4BvgdWQmNynq80geR2SzzjwIQ5MCmdBliMCF3LgK3CrZk1YABaKlvxe4MkDaXzzHpH/p7YUxltxSDcH5m3pLrCK9eHxBMxz2JMUFoBzOXDqXWDpceB7YAMkZvcNDOpJu4D9HPicCJwNW2r0CjgWsLbEgMlaNN/UKnhbYq4W+3AgGbJb35n0dYsDC8z3hEA7aO0RMrgPa1m5ktPFVRhP1ZEXrXGDgQWFU9jaw+IC60zSE8BeYCMDxv0D4zMROApGl2CWCStq8Tmwy8OofDgXMeDRlXCn+a7nwGQ5wdU6PTBbaYkih4nMZGz9emtQTBHLlb4ndfOVllixJvJl1gS6BfW/et6WxBwWgO0vwyYJlon6Viz5jXtzIwe5r2EqAtNpB4FjMIqBaQYsM2FLJZF6vQJO5OpSjKYVj5ItPAa72l8o1B1ic+LMTGTOHHZTb++7cUOvLdGGXh+06hCWWQMJzNeV3kp4KVkf9uCrS7bYyubAiawtMeBoSE5yqYYATMdRDn/CjUE97VcMOwmTZFhQu6MuTxbirqY0Hj1Qt8jVKibyBCGNuciMWTD2daZbKPe2YO+7wSfij7T6hvQ7P9exdaUnFY5K/cLDhfdh+zQOfBFm8TCOEYE3DMXSkjW8LVEfPgAcxbDfMCIa5mmwzsRImtFcOObzNL7K0pi1YiGNB5Uu/zY9c1CnaGyhS/WIaovBUEUnBwvFuYN5hGj1HZjLS34WzOxJyyxyFt2amgVfadldgjUBX4DpBWZGySnuzXX3X7Somq+A5H1e634BjkAaheFn2fxZpcOWbpDNXc3T2K0C7jUYx0VmJVTMZLlOrF4d+hcJwduDyUM4pxC/px1YbwyWV4mx13j2VrCKRWtpZyrRGRiZCtlFWMTC5AKG0UrpFJdq5f23JTrqSb60pG72E3CYFXrj02zhRpXQJgN2mVzkApbGbmX6FTUTmWcyK9caffVi62rOzLzNsQWHCzFZeDEaQBUKVZu4utKItJS9grx0owr22sBuWnK3RNumQBYP82iMuMCW/TjNn3whhvInv7kYthX4ir8eHmSt3IjSOJot0GWpsE2HXQ6v1cUYTbenjFIykQfKtcAsF9Yhwuq6nUkXxEs3q96DQ0DtGETLU9dPjQnNIi1dvIbLW8a1LdX7ma0r01iJtoqDGbXPOEhjuMJfAhEYNoS1tBySt/hpe1ka02Jt2AmMOMfeOam/0zqOXrsd8litdi2BGy16qE8IzA0is1qvs3wQs17tP4aAKnRdQVtO68tpvXlxZtkryEuzTNlEfs6DQyZLYJsEWFAfOQOjOEgImIoWvQhMHNLLgwuk6/g7xx7+tnUYw45jOLk6hlV/ehcbmQH7HLF0CZlMfvtvme+VOkAoZu16/oABVXXsGH/Ryb6Cto28FQlmFiozzW8hK87sPYmvokcKfj4Pk9MsgRkwvRK/zT6ckg7tAwCqWzt5Muxnrpb+CmNy9Xm2fJMlw3aQyPr+VDmIuRHeordZ3VbfxWah03+OMVFwr8A5IOwAbQOj9eK0Qq0aw53sms9qlSOtfzL1fraMhdlZDD/JPqhANG+lK4f6AQCNeZBu4Wm8l9VqyWEYRWHEGfYKphc5nYus4KsuYqYHGmCuZzoLqxG2AuPYEwRs7nM/gVCA5Jx3UVXMIMzJdXpa6kMeA2amSpkLJ5prXq6oPltTfY6GySkYnYAkln8CtxuY/wCfaflAuoGvt77npSvyXpGFTM6Eg9CTibmUJbO7yDyW1zBi1vfn5ruCs1CLIe4Zz1FZ++FJ61WHcXQRkdad01LeuuQx2lGXeacQ5I3j8p7gH+7EsPdZbAPGPwCwpZF08wSTX2aYn3nU+sJ8+6SnnNIWjc581iPvee/CFX4lLweUrZpc+eqU6tdnKNc/XL9hbsPGR1VvPdHyzpOazc+0bl2i3bZM968X2rYvb9/xYvt7L3e890rHzlWdO1d3vr+mi8WrPNh25/uraT874L2X23e81LZ9he5fz9PprVuWaDYvUr/7dPPbCxo3zWt4M6J2/eyadeHXXptavjqkck3o1VeCil+S57/gnb3MPX2xa/pi55yljhcft94uN6GHf5CPplc9YxPznZMiyrM82rf6YmBdSmjT5fDm7LkaxRO6ooXtpcs6yl7sqlx9vXpdj3Jjb927Nxr+dUv1we3mT/vUX/S17u7T/tCn3d+v+7lfF9nfdqi//cid9qN32o/d6Th+pyOKx3EW7b/2tx/tbzvc33awX/cLncJOpNPVX/W17Lql+vhG43u99Vt7a9++XvNG97XXOstXtl95oaNsRVvp0taCJ1tyI5oyZ9ZdCqvLCFFmTUo9MmbNItsH/Cx+rJvp4Q9HXo50Kz3tdS1Wrrw4qT5liip9Zkt2RKtifhtjfq5TYK5a21Ozsbf23Rv122417ryt+vh2y64+9b/7NLv7Wvf0aff2a3/s1xL5L/26A4xfd5BHJI8DbFK0P/Zp97GDNQLqFzRxt5o+uNGwvbduS4/yrevVetqOK8vbS5a1lT6rLXxanTdPlTmr/tJUZVJwbUZwWbJf1Oejxj1k+oDAtFR5d4VN3PeO+cc9ys+Nr7owsTYxuOHStOaMWeqcR7WKBW1FizuuPNdV9mJ35epuYla+STrcqNtys3HHbSb1Jwy75cs+zTd9mu8YTCuR7xNjv7BB08F/9S07TI/6GU3ZraadNH00iT3KTder1xNtV/krHVdXdJQ+pytapC18hozWnD2nMX16bUpIVUJATXpA+rExW1eO/FNfqvJxNz30gW3aAdeSk2Mro31r4gPqkkIa06Y3Z87W5D6mzX+yrVhkrlhFz0Su61Vuoqe8SVI3vccd/jEDaPn8tvpLxqP5mvN/w5TUb3xFXrjNOHeRqrebP7rV9P7Nhu00cb217/TUvHm9al33tVcZbdmLREuz3FrwlCZ/fkvuI00Z4fWXwmoSAysv+l1NHH98l8N4DzP8mSGVSl5fZB292yH36ENXmbH9lBcD65MpmWe0ZM3R5M7TMeZFHVeWdZWt6K5YSU/GU5qkfutG3eablNUM+/1bqg85+ae3Wwh+16D4jEN+Qr+l2SFVB1Bp4ljSVq3trlzTVb6ys4y0XUbzqyXavHnq3AhV5syGtCnK5KDKOL/yhPEpB13XLbGhB/6zf1Vzdhi+Z7NN8n6nwij38rPeVXFyZUJQQ0qYnjmPmMnbCztKn+28+kJX+cvdLKVf66lZ36vHfvdmw9ZbjdtvNe0gHlKP87/P8IQNtvM9+u3Nhm00R5QUhNpTs4Emjtm4chVds/Pqcj1t4VMaxeMt2XNVWQ83pk2pTZlUFS+/ct5bcdZj/3Y7etS/5i+Jc0MtTnw6Mj3Spfg3j4pzPtVx8lpiTg1TETPz9qPa/Plthc+0lyzpZPbmUgvYTO0NvVTDGfk7N+pJ861ibBM2btRvoUlhnLWb6EiGyjz8Gl2hq2IlJUvH1efbS59tY3nLaNXk5PTwxstT61KCqxP8y6J98k95nN3tEBFm+Zf96XS4sXTDUln0N/bZh0eXnvSsOM+ZEyfRHKuoUWXO0uREaBWP6wqeaid7M6mf7yonbFJ71XUyedXrPTXremre4PBvMn4Wm8SNN2k/OeJ69Vo6kpKClUBCLX+JLEPJQvPYVvSMtnCBRjFPnTO3OWtmfWpoXWpwdaJ/eYxPwUmPi/sdNz1vTQ/5V/652FZmvGu9LH6PQ94RxlzJmP3qEoMa08JU6TOaMx9WZ89tVczTFpDUT4vYpPZyem4uOJW01RyeZKd4vad6Lf0kQtrZfW0NO6DiFXZkxctd5S9y1OfaS5ZSgdAVPUWX1SgebcmZ05wV3pAWpkwMrEmUV8T6FJ3ySD3g/NVGG3q8v/5P5O4uJns3yxL3jso7Sszkbe/q2Am1iYGNaaGq9OnNGeHq7DmteWTvJ3SFT5Im7SWLBezOMsrt5V0VL3ZVvNRdSbKv5PGKfoMRrqCpIV8IwVQtXUKobUVPawvnt+bP0+Q90pI9S5U5vSEttCbevzrej2iLT3tcPuT88w5bDxeTv+trAYHepj9vt07ex5hLWD57VcX41iYGNFwKaUqfqro8rSVrlib3kVbFY9oCAZvUXthRsqSjdGnnlWUMniG9wKZADEZYupSOaWeEC2ma2ooXthU9pRNQFRHq3Dkt2eFNGVPrkifVxMupiJTHeBNt+mGXwx/aBvmY4e8b1NND/cx/Iea95G3X4hPuZWfGXov2UV70b0gNJqmb0qY0Z4arc2ZzbFL7cZJIV0St6+m2YtJ8IZedYokQ7SwW07zoChaQb+l4XSFtPNGa/5geNWemKnNafepkZcJEZYK8Mtqn9JRn0Wn3jEPORz60DZOb/+3f3aYbkM77t8gSf7DPOeRSFPXQlVNM6uo437qkAMJuSA1RZUwjTdQ5pPbc1rwIJnj+PK45wS8g/ntjgbbwCU1uhCZnrjqbzZQmb646d1ZLTrgqaxpdrTYhoDbRX5nkVxHjXRTlrjjudvmgU+ROmyAf03/um+pjnEd8vt7qwrcjMw845v9K9h7DpfauiZ9A2HVJVMxCmjOnNWfNIImIXJ07mzBa80j2iNZ8Ul6Ix2ib7VE80pI1k4pf0+VpqozpzVnTm9LD6lOCaxNoMetfmyyvThh/9ezYgmNumZHOyT/a737L2sPVBP/wsLIwWrfY8szn1mk/OeQedi487lZ6klYmY6/FEravMt6vPonq2WRVemhz5pTmLNKc4MOJvyXn4Zbch9X6mNlCQWJmTG1ImVyfHEyVvy6RSVqbJK9N9iPU8uhx5KPcI65pP40684XtpudkMguj/9BXm4ykc0PMf94mS9xDUo9SHHEpImymtue1GC/Crrngq7xI3cu/PjmwIWVS46XJTWkhTZdD9ZEWQnsaUoLrkxmkMl5eEzehOtaXOJVJvlXx3mXnPItPPKQ46poZ6ZS4x+6nLdZ0OyMjKf6zw9l++BtLrE5+Kkvdb5cVOSrviHPhsdElJyi3SXDPyhivqgs+ygQq5tTD/MSQ15GASexnXTILgqxJ8K04N44mq/z82NJT7mQZxVGXrEjH1H32Jz+xXr/Yim70v+VbbLRk9x5jsnmF9eldstR9pDaZ3Cn/qAuRF0eR5gy+7IxHRTQZ3qsqjqbAm0U8+0l7KmLGlp/zvHLanfQsPD46/6gr5UjWgVGp++xOfybbvNyaLv4XvBX8HcPT1WTdIqsjO2WJ39mk/0SCO+QeclQcIXjngl9dC4+5Fh13LY5is8BjdNHx0bSTfkWzozjinHvIiTyS/pN94ne2h3fK1i608vzni9MDDBsr4/BAs60rZJHbZXFfW1/aZ5vxs13WAfvsg8Q/Ku+wEI70k/5JO7Mi7ekAOowOPrBdtmW5jE6ni/zf+8KmhZmRl5vJvCmm6xbLPlpjdWC79clPR0Z/aZuw25qCNn77dOSB7Tb0KzqADvNyG0Gn/D/5tiotEkxNjCzNjWQWw2wsJRS0Qf+knYb/6WYYhmEYhmEYwvgvP2+62DHeiLAAAAAASUVORK5CYII= @@ -293,7 +298,7 @@ - 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 @@ -304,7 +309,7 @@ - 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 @@ -315,7 +320,7 @@ - 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 @@ -326,7 +331,7 @@ - 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 @@ -337,7 +342,7 @@ - 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 @@ -348,57 +353,65 @@ - iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAna0lEQVR42u2cB3hUVfrGbzLpnfTeSA+EFLqACgKCKCqoqCxgQVBsCGKlN+ksYOihY6NJFwi9SQk9BAIBEgKkEaqguL7/9zv3DgwRFF13192/8zwfM5ly7zm/837lfHcYTfvr9tftr9tftz/8ZnUX++v2K6CsK5jJsIrP/78GWxGWALKh2dHsaY40J5pzBXMyXrM33mtTAe7/NExLaGZg9gYYd5o3LdDBwSEiNTU17QHeGjVq1LiZcZPH8py8Ju+R9xqfcTeOYV8B6P8MTEtwZmguNC9aaK1ateq9+eabXdLT06csWrRo4/r164/t2bOn/PDhwz/k5ub+dPLkSYjJY3kuKyurfN26dccWLFiwcdy4cVO78CbHkGMZx3SxgPlfDbIiOHE9D1pIkyZNmn3yySdjVqxYcXDv3r2XT5w4gcLCQhQUFODUqVMwQ7ubyXvkvfIZ+SyhXl66dOnBgQMHjmnYsGEzOYdxLsf/VpAVwVWyt7ePfu21196aN2/ejv37939vBpWXl3fT5G8Bc+bMGZw9exbnzp1DUVGRMnksz8lrp0+fVhDNnxOI8nd+fj6o3u/nzJmzo2PHjm/JOeXcdwD5pwdnMtzIw83NLZou2oNqO3H06FE14WPHjuH48eNq4jJpgVJcXIyysrKbVlpaetNKSkrU62azhGqGKfDleGaYOTk5+Prrr0+8/vrrPWQMhiLtK8TIPyU8WyOoB7Vs2fIZqmHXoUOHFDTGMTVBs/sJBIF1/vz5n9mdQFaEagYrxzGHAFkQyzBAtf+UkZGxq0WLFs/ImIyx2f6ZIJpji8koLTyCg4OTBg8ePGPbtm3XBJoozxznzFZRcXeC+Etg76RSM0hRpZg5poraN2zYcK1v377TZWyGGu2MMf9HY6MlPAeab+3atZtNnz59/4EDB8CsqVQnk5AJmV1VQJSXl+PChQs/M3n+bq9Zvn4noGIC0hwrxcxAZQFlTJMnT94vY5SxGmP+j0G0hCcFbuBTTz31+pIlS8ploOK2Ak9UICaTsoRnhnTx4sWf2aVLl37RLN9rhmqpUlGkOemYYQpIcW/xBpZL5TJWo5Z0+k9AtITnzMI2jMF6wJo1a77ft28fsrOzVfyRgQs8mYwowwyuosLM0C5fvnzTrly5ckczv14RaEV1ihrNicYSpqhRFnb16tXfs4TsL2M34uK/DeJtyuMAwt9+++0Ra9euvcGaTrmtWXEyWFGdGV5FaBXVZgnv6tWrP7Nfg2kGaYYpECtmbUuImZmZN1ghjJA5/DuVaIYntVVI586dB1N5N1h/KXgyuLvBqwjtToozw/ruu+9+0SpCtQRpBij35rhoBmmGKIss7kwl3ujUqdMgo/h2tID4Ly1VJPgGPPnkk28vXrz4h927dyu3rQhPYpG4kyU4S2gX+Xf+/v3YPW/+L0K7du3abXYnkGaYp7mIc3r2VOHDrEjLWtIMUV6XmCiLLnOQucicjLn9S0ocMzxJ/97JycmPs8a7sHPnThw8ePBnbiuDltW/k5vmS5z8sBcO1WuMXN9IHBv96R1hXb9+/RfNEqac5+DAT7ApIBJZPfvclmzuBvEE4/SU9HRMmjQJs2fPviBzMhoUdv8KiFbGdsjd39+/5siRI7O3b98uhaoqU8y7AhlgPkuGjV27YXv9Rshq+DD2Nn8C+59qi4Mdu+DbTq/juH8Ucn0ikOkehAL/GGx9/2MFwQzm+++/v2e7xs/lr1yFvan1cNArHKd9o3By9ZpbKjcgmhOLjG9vVhYmvfsuhlapgpWzZqkiX7xo2LBh2TI3o8Nj80cCtCxXKnfv3v2zdevWyb5TFaniCvt37cLe9euxc+VKrHq+HbKdvHHQNRB5HqHI94pAvk9l5PtWJrhI7PcOx2Eq73RoVeSOHY+rdD0zkB9++OFXzfzeC6fykdf5LeT4R+NkQByKg6vgDO9Pb9p8W2wUgMVc4M3z5yP9iVaY4eyJbyJisCszU5U35q0fi21069btM5ljhaTyh7mub9OmTTvOmzfv+x07dmD7li1Y0fUdLI1NwHJHd3xrcsEyGxccdPRClrMfBtu6YLC9G7a4BWJPpVCcJMAzAbE4SIj5nGh2h853BXfjxo27mry/cO6XyK9WD8cEXGgSykKroTQkCcVBicjtPfCmAgsYLnb2HYDlSdWR6eSFbGcfbAyKwL7Nm5UrmxOKCEG8iXO7LnM0Cu0/xJXN6nN1dnZOHj58+IHNPPniBQswMSwcK+0cMc/VA5vs3LDC5IwN9pWwz9kXxwntCF00xzMUp/0Ijq4q8I7xfjNdLccvGjlp9XGZrnWv4MQunz2Hgo5v4HRwIvKCEnAhMk3Z+fBkBbGMME8GxWNbo+bY8WBzbPcJw8FKITjpGY5j7sE47OSD7TNm3IyHEnosVShhia58QOYqc/5nVWhWn3QxAhva2fX5oHp1jPv4Y0ybMgXrV32DQ1y1YywHcrnzWPb0czhM5c3jKn/V/T3kfP4l9nMihYR1NiAG5wLpXoHx2O0dgaKQKjgfloRTT7dD8dbtP4P3448/3mY3fryB0nUbUVSrMfLpqufCquJSZCouRKToECvXILgE5PrHIpvnO0i1H6Nry6IV+kWpEHKCXrDFOwTnSopvljd3UuGyZcvw+OOP9zZ2Kvb/jArNicPN1tY29RUfn4I5mgYGCbwXFITZ0zL0/S4BHmdhuo0xcFDrpzBv+AhkL1qMw+PSkfXGOzjAhHGW8IqC43GOk9zJv8vCq6E8IhlFVesiv0MnlDGO3gmc2PfMtueGjFagCgnvfEQqLleuToBpKA6rhhM89kkqspALcowLVBBUBaVUYjEX6Rz/PsPFO02IpxiLD7j5Yx+TTNl5vRlxJxXOnTwZLzo7F9hqWqrM/fcmlNvUxxX5ePyYMRjh44MBBLjE2hZz6b5fOLtjkZsXlrt6Y72LN7Y4e2E/XXibqz+WugVgtqsfMj2CcI7wimWStN2cTAknfoEgClu3w4WjuXeF9x0nWdTmZVyJqIGCEKqO4C5G1sBZAhI3LuL9WT5/MogLRBe+WFl351I+LmGSknPK4hVQlblU/laGlkk+gZgwcuTNlpio0LztXL1wISZ4eWEs59jA2vrjf0aF5tgn1xiqDBgwgEl2PZbMm4cpMbGY9vLLWDp0GDI/GYKVH/fCqnfexYqOnTHCuRImO3niKxc/bPQJx+4WrbDbNxxZTBxbOYFDjIEHaQLvYkQaLoYloziuFi7lHP0ZvEv7DqD0/kfxXXQdumw1pTy510HVUOorIKBSApNjiTuXG+/JN9z5kG8EtjMGbnIPwHqqb37VNHwzfYZSnLnxYHbjLStW4DN/f3xBeCNoza2s98rcDQam3wNQGo8+aWlpz82aNeuHrVu34siRI8ilzBfOnKGkb9nLKy4twca4ZBxh4sgOjsORpctQwtpwe7XayKYbbaTrFlEV5eEpCqBM9szn81AydgKKv1xwO7zsHFxIbYRrMfchj8DO0h3L6bLfxdQhsBSlQPl8MeGdC0lkXEyg68Yjj2rLpR0TY/zLoxXQjQu5aAc6vYFigpOyxrLpIG68Y/VqfO0XhE2aCeMIbwGtnWb1Q4LJ9JwwMFhY/Z4tW0THjh2nSWBdyRqv/5NPIotZWIpmkb9lb08GtrXru9jR8ilsypiGqyxys1mnneHEpFbbSUWWiusKQCaAcrpb+bHjepKo4MIXOnTB9Zh6uEz1lRHc9dj7cCI8VWXxcyF6jCuhegWiwCwkwHyeRynSgHue75fHRVTj4de64vLFS2rLZ7lflvFvW7sWS73pMZodFhHg3wnvS9oHtNbWpunC4Ldu8W6WLrTU93r0yOWmWzUklw0ZgokJiSpjCcSKAPekT8BhxhEZ6EU+t6t6fcaiKgz08TgeGKMDFPcllMt0w9Jq96P4s68UtH/84x/KrpeW4XJKQ1yPq0cQKepe7EJUTVwjyMuVayp4RTzWOSPuybHkmMqNJUHRBGAZ35dX+yGUU2XmvbO5uFYtL3qRzGUHRbFt40Z61kwssbHDmMBA9KxaFd2srHM1PZn8ppLG7L7eCQkJT7WKi7vWo25dbP92OxZwC7RIs8EWQprz7LPIZ+A1AzTvP+VeBntk1FgcY8I4QvWt9grDBtZkJcyUor6LTAYlTVqh5KP+KLq/Bb47V3QLYMFpXI2vS1h1Vaz7Pr4+LkbXVq5/noAuVq6lQEpsvBpdC1eiauBylJ6VdYDJqkQ6T3gCMJ8hwrIRcZ5xb8+n47GlcXOsj0/CmiopWPnYE8hkaTa3aTPlxlPbt8eK5cvxYkLitQiT6Wljj3zPbmzOvsHMvv26tm2LvpTzJAL7usEDWObggrl9+2K+py9OFeQrgGZwlv26Pc0eV1mwjHHvELPgBm7hTtP9LhKgZNNzH/ZTyrtKxV2nKm4CLDyDq4kNVMy7Ht8A3yfcjxJRrWTYCIIPT1NwSkWFqniupuKilDlybCmPBKCcV147uzrzJjxR37fPtsMxj2Dkugcim1XCAe5Q9tp5YKu1M6ZY2WI+AS7//HO1Vf38iy/QrFmzfsLCIhvfU/yTvWDMq6++On9Inz7IsLbGV25umBIeic+t7bnjcMNnUbE3XVgAWjZDj0yaysQRjWz/KJxmbFrrHYZt0nlhPDIDLE+4D0XDx+Aa1XubC58uxOV4um+kqK8BrsXVxzlRFeGVRaQp17zIv8vDUpiJUwgyRZVF51jOnGYsPMXznVJ1JxePz535eqlqUgjA3OUruCsJQ55XKLL8I7Chel16RjD2cQe12+SKbzVHDPb1RzY3BhKyJO6/9tpr84WFweRX46Bl/Evu06fPvgV01098fSltKwy3MjHN22GrQyWsHTDoZwDNlt2oBYvmeE4igZkwBuuZgffQlXf7xahYdSmSLielSIs2ODsp4zaA32Xt4562KuNefQVQ7BJdWNz3clRtJpR6yoWv0oUvMy6K2xaHSV1YRS2WFNbHea49LJ0O8rx7X+h8E2AOF7aAu5RDXMxDGzepMuY4q4qZydWRZeOGHZoTlpjssTkzU/U4M3nfv3//fcLiXuOgeffh4ejoWG/IkCGFa9aswbLFizE1JASbNVssJMBV6ek3SxhzAjHDy1u3HltD4pAfGMstWyJyWErs4oC30g4wi0qGFIDnnn7h9uzLx9dKSpH77IsKjoA7y3h3nu+9xiSiQEbVogun8PXat2JgdA2VROSYqh4MT1HufaLFU8juNQALR4xSV+XEjU/s2Ik8lll5jMnb7m+MrW93Q2bL1pgnTQ8bV+ywcsZWxvgFI0epkm0jEwv3/4XCwrgcanOvAL0jIiIeS09PvyytK7nK9ml8PFVoi31WTvjmzbfuCFBceP+z7VFIaEepgiN04W0sX7ZRCYcD9CL6WFAiVVgdZ2NroWjLNpyfMA1lXT/EheZtcCm2jqr9rscSHkFci62vXPQC4165ioM1lPrK6MYldOMrtwFMUxn+NLNu0eYtP+8dEqCEl51vd0eOXwRyPQKRw4J/H2PgN/buWGVyUQC3cY4LuFORlv+WLVswceLEy8LCSCT3BFCyjV9sbOzzU6ZM+VFWQQCOquTJWkkHuCqkMs4YZYw5A5s7znuaPKY28cqFQxKwnbuBI4S3g66zk3aAOwTZ+Bez1LhEOFfohldjqCgD3iW66UUqrZyQimhXWA8q1fG1K1Sd7EjKJAbKIjBRnI9MvVnGnI1MwSnuw8sOHEQprST3GMqpagEnbmwuY/J27sK+GbOwa/xE7GCimPlcW+ymAncS4HKTg6oN5cKTdGemTZv2o7AQJveSic29vwB+6MWMjIyfpH21c08WPrU2KYB7CXCr9P127LhNgQLwdF4e1oXFqQZCPiGe5R44i667k7aNMWkPYRYwVqldCCd/hkFeEssVAszl46vRdZkQpH6j6ioL2LpMIATE5yVhXOPf12LqKBcuk20bj1HAOFvI7H6J7nuCe2JZmCLGRIF7OiIJJ2NScaRuIxx5+z0cnT4LR7lDOrKWXrVqNXbNmIk1bdtjG/fxu2x1gHMfbq4uy0qnWi5ZzJw58ydhYVwzsfu1TGwGGFQ5pvIrkzOmYN2m9ZgxdTJmM4l8xRSfRYB7bZyxdu5cFJeVoLS8DGUXuJ27WI5dY8YhX8Gj+7IGzKbtIrj1zHpyX6g2/vEsZxJV2VHGBFDCsiM/JIlAkwiqllLYecKQBFHOe1HlWQFKVUq5Itu5qzG1dPfle2QvfIrx9hDPVUCA58P00kZ2LaeCjC4QX5emwmnfaJzi+I5xPDmVgnHY1R8HnX2wh0lxFxU4P6wydu/YjrxTJ5CTm4OtfDxt5nTExMS8Yny35p4BBtPjO2lP28HqVVd0dzehq7cJL4XbY4uVI5YT4Bx3D3im14DtioawXdUYdmseRoP305DPeq/QX3qAuhtvkRjIoJ3Lv48HxLH8SFaZU8oZ2XqpLkt0TRRL94STFzgCUuBJISzAvqPyZMtWxL+lBLoiAKP0IlriaSkVd4AAv/QMwXmjsVpKVeZyHDmMw2cJsFC1taKRT2/I8w5FLgHmuPnjgAGwf7g7HEbFQpuVAC2jMrRPg6H19YL2vAM0b+tORi147wrUvE0dtafsfqoVYo15LKTd23ogvI0n1ljZI1MUaOeO9rX8UGl8dWgrHoS2qhFslzyERaHBOMXJSCI5RVvCge7noKWVJeoQgLJbkG1dLidVqsqTmlRgsmo2SGaVmCi7Fh1obd34/DnD7QWe6g8S0hmqWQCeJKRy6dooeFVRwudFfZLIsuUajDRWGYNPMYxIHZhrKHCZpzeatg6GVUZVaDMJb0YMtCnhBBgArU8laM/a/6RY/EYFBmr+th20x+1+bOxjhSbe1tB6+cFqYBA+CnBkynfGZJMTNnLlFnv7oPbLsfCcXBuuU+riG/8gZHmHYK+PtLEiqNQAgopW9aB0SASi7CTksbiyZE8pPySWlUrSIExxzxLVaami4p1utai+mso1pQ8ouxr9s6nM0smqmSCdbtmBlPC+mMcr4nNn6cbS1jrAYl7CywkW0jt8QjC+aigefikWjtPSoH1FEcxKgjY9ngCjoU0lwHQC7O0OrY3Dj4qF3hv8VYDmLOyvedo95RBrcyWkpg20d7kS/fygDQmGdxd/1k2O2GbH3QgD70IHD+xw8cVCbu1mVfLBcbqHrPJpuo+ocBdBFqpYlKD2xaVyNY7Pz/IIMVryqWqfe9w/UmVTaRZcoYlr5vtXVvDk8WnpModScTzOGu+I2+DpyqtGd41RMVYAivok7p2hMmUse6m6flWCETOiLty+0j1GW94A2qI60L5Ipfqq0HXpwjOieB9GgP7QPnKD1sruiuZj95Ricg9Z+GYdyH+baE1MZ7WXGQPeI8A+vtAGB0EbFY6otv74mnvinVTgIgJc6FQJq5nJtrr7YYNHAE74hKHAX78Kt4+rLrFQFLFHdgD+EuwT8C1fuxCeqvcGCUE61fmsEaXEEdeUTrO4vop9Rgf6kqr3aqj+YqG4qPQJlaKrKeUVElq2XyRdliWTunxaWcET9z3JhZTkMaNKOBIGUHGrGkJbWh/aglrQPkshOLrvZLrvjEgqMJQAKZj3XaA1szlLFo1/Sx1oY3y3+D7tIYdDWgc7aN0o5V4+0AZS1sN58HFR8OwehoXO7shy8sR+Fx9soK2kfUaQJ8RdWKwWqi1VmLqgJO6UEyDbuUilxM1UkeyVD/hVpnvHYT53CFL7KVARurqkCSsljWRogZanrnnE87lqeq+PJVG/lqlYcD8VLK5KULJQeTy+2ElpYngGYatnMNZzYbfQjvI8R9wDMSA5CL7Dq0GbVwPaXN5Po/tOpPqmRxBgCOfoDe1tJ2iNyUBY6Exs7nUvLBdTUrTqdsu05215IFdoHzMj9aesh/Lgf+cqTYhF5KuhyKT69jp744CrL7I5wLXMbEe50rLix+nKazj4A7zP4t8b6d4CbRMBn5RrFbL5531JSDUcDExQDYJThHSRLn2OgESRsr+VxCExTrZpKgmF6Uno3ZfrwSanM7RjndH63fo4Gh6nus8Sf0X9or7tXiGqdNlNkNsYj5e5+mCzmx+yOd5Nzp5o3SQANhOpvil033TOaxrjXwY9bSzn29keWk0yEBY6k3vaC1sb35mL0+LtR2mtTdC6OEP7wJNp3XDjkZKlJFsl4KFHA7Gb2yFR4SF3lgXcIq3ifR4hbfcKphIr4xhtHR+v52R20y0lHh6nomSvfEIycWiSnlyYieVbBuW838PP5PC9JwhC4B0PiDXgVVPtqnXVq8E65xVouQR4tBO0nJfhndkasdOaoFvbVHxRMxaDGsRifUAIclneLGd4OcrMu5Qe8g0XPIs2280dM73cMTTABa69xLPC9fg3lUIZybDVluJJJANhoTO5p660uZ0fpvnad9IeNV3XXmEc7OGhu/EAuvEwnmwMa6WJ8bCekIjhYV43Vbja0w+jowLRMzUUw6ODsIeq20XbTRMVijsXM1YdJBwpNVRiocJKg6qgz/O18djQh9H1xTrquXJV9uhX2PICY/U+X1hVFe/WVE+CVU5HaEcI8fBL0A69AO1gO2j7n4e2pw20na2gffsE3BY+hOBP68B7Yh00eCMBGQG+OMhxLmXsXubkAbe+lfFqFXe0ieQcR9O7Mlj/TaFQ+tPrnrC5rvnadlIsbrX177kjLV9vaKI1sj2ltWccfIcH/MhLz8af8CSjGCvSqcKpiUh+MUypsFcVf9h9VpvZ7QFomY3Rtk0cDlOJKyoF0p2iVEw8RStivJJWkyhrako0ZjRMwn3pD8NKlHTsVSTPeULFN70pqttRxs8yZmEpkEsJ/gwXoctrdeC2tjW0bMI78Ldb8Ha1VvC0rY9B29AM2tometZd1gBeQ5KwwJ7KYwWxm7Ws5/sRevIYTeX9nfPKCKQwGP+6OzL+2Z1UDHQWtr/1moh8SylNS7ZboD1DN36dbvweVdjbSCbDeMKxosI42I6Iw2IXD0R3ZQ21qC6zWwME/r0GlvoGYo6rN45TeZJU5qRGo3fjWPVNhYWxkUia3JTq6UD3e8mwl6mojso6dK+PnPB41RaTYni/n14QFxoJyWySKD5tlIhWPerAf14zC3gtoW1srsNb/RAX9X5oi+vBMT0Z2xw9MdfOFXsIMbQzQ9KEyrr6RhNeBt13HOf5At031X6BYqCz+E3XRMxd6SgtwP4drYX1Da0jJd7N7ZYKB3O1RnL1PiW09Dg0rekFq1ksB+axLPj6PqR0icN+Bu1Vbr4qHi6MiUClrxojZXh91ndR+NubfN8+KuZAW7oe1XOoPZXUQVfT4RcV0KAvW+BQYBRKmFiKCUuSw1HZX0s4YJlyVH1hiXte6Xzz8b6ACERPeEBX3iYLeCv43BIpWerAak4a+vu4Y5TJETu4IfDtQmjjOI8RBDma8CZLmGL58oTphpq7MLjHbvSddiTSwmmqNbA7ov2NBfWbhgolFvanCoeG6hl5vGQwlgGzWA58UR1OExnE/X0xw7mSSiqfR4bAawaL1s0tYLWpBSYkRcBtCdWS9Qy0vc8S5HO6+5lhSiwToLSAJY+h2YAH0aVtCkuZKOSwDJJYeoKhYD/vpcZr/1Iy6gyqi74Px6P1C4m3w1v5gF7vLWTB/GVNmDKqYT69ZSYBZpoc4PQhwf2d6htKeGMY+9KZPN5i9n2Qc5a56wzs7jX+3amcSdaiHMdqT1hB62So8ENPvbAexJOPYOYaG6USijaN+8k5yYjsFos93KR/7eKFL4ID4JbBuLiGk1n/MCf3COxlJ7D9cWg7nqS1QtT0hxA/9kGEz6JL7yPQ/QZQC3Ne9yTmUMXbmMk3sTTayHv55teI+rEwbXwU2jaqbgsXaDXBrWsC6wUNbsGTsPJVTRbMaYjpEoEptk4Ya22Pqfb2sB5GeMOpwkGczzh611DG+jbcusbYjzVa+W6/95sJ5mwcwo+3YjIp0tpRha87we0xJ9i1Y3H9ga9eF44yXHkys/LERLwc54XpDu74xs0bfsOT9fjzDaGtZiBf11SPTZsfoas9iqARtdC2QxKWegfhcEAkavfnZPc8fcv2toHfwuYY+FAcslhfCsB9DAkFVOLEGlFwXMnjbXlUV92Gh5HYOwVDEoMx0dMbie8mGPAYLr5IU4vb4kFfzLNxxCIrB/QIpCBGUgRDGJL6E95Yetc7VF9jzlXmrH/5/Hd/b/rm9RFada7IJO1xK1i1sEHVJBt0tNYwhNasqiNcOvvCun8o3LuH4P0Id27x3KlATzzTlHFyAdX3dV1dCRKLZAuVaajRAGlFVaYOqoV+zeKwIyAcPR9NQMzQunji7RoY0jwes6P1Umgdi+F8gstlYf7Oo0xeq5oa4IxMywUyZdSC26Bq+LISt5Ysmh9sEw7rmSkKntMnsRjj7ozF1g7YrNmjUV2GpGF03QHMuv0piMH8+2mqL45zlTnf43WQe1FhKFektdbANs/0iDUcm9uhva2G3pqGgbS+mhWGWdlguQzM1hlb7V2R6eAGz/5xKiZq82vpm/Yl9fQNvLjW6oYIHlcbfe+LxKdxIRhdKxIJI1mrdamCtR5B2M/iV5oSJ2lyf0Kuq3BbODEtEonDuCgbmynFKXBrGukKp9LDByXjjZQATHH3xDh7N8xhyTLazwPvJXjiKydnbDY5YRPVt16zQfRjdNdBjOe9qLyBTBxdmHkfsM1Tc9X/E/c//a19SxWm2rnbDE5zsvqhpZ0GVpd4nyZfd5tHgCs1E1Zrdlhv0ttdawixQ00fNHgmBD4942A1t7qFGuupmizm9VjU6BiLb1juyF51PXcw62jSkDgu20ExuusJ3s8OCsRDHeLgMYtKXt9U1ZkqJAg4UTaP5zE4Ce3vD8KLyb4YFeWD8V4eyLBzwZe2LtjOkmUL4W0w4GVyzENcrBDd2AFWkhw/ouu2tP5BC7YbbHyd459S3x2/J0h7WEuxzbSrZ4WWNvqXLeca1sPNhF5uNnjP1wGJT3jjsbqeWGnvgl1053Tev1PZC7aTGQ/nMZgvvAXSelE9vFIzCF87e+FbT27ya4fh+edicf87Saj3LmNWx0Qk9U5F//sicIgZfa6XL7rXD4X3BB5nBWPrMgJdcp9+vLk1qPaaKt75vBmJCW5uWEqAPaLd0S7VA9Nt7THe1gbPJDigYU0HvO5tjc859qcdNASlMUnWsM1Uc/wDvp16t+8KxmoOpheSnawLYn01vMeTd3ayQmBTR32v3NvYK4+Q8oZ139vBqPuoL3zfDoPDEGbL0Qzqn6WynKh+E6TTpym4/9lIRDDgB4xgrFpeXwez8nazosKie1dFnRei4Tk6FUFdY3VwkiRkQQScHJfwUtuFYihrvadj3RH2GuPwJCa48ZGwGRgE08cc4xDZqnG8H7gi4EEbONa2QqVAU4HMTc3xd34n8F7+M7WnCq5+Nh9rTUxXtee4Q3mNmewtxo93PW41HIZIw4EQR0foJc6EWJWhtQzWaDOSoM1O1kFKZvzKUM0CI06KkhaL3afbEguT1+Q9AkzeL5+TdpQBTvuMx51TDTa9pKvCxZrGGDyJ50+XcXA8w1iu9GPM6+epN0u7ceE7srJozrnInPTE4fmv+E/Zlq4sl/ce0ELtx2vNuEP5GyF2FoiMI93dLSBysCNY4oyULZ8U21LmcEJTObHpVaDNTFKZUTUzP0/TIQjMeQZQBdUAu8B4PN8SVqpun9Pm8jizebxZrEOnc5Ey4vT97US5OMQ6dQzHMYyFf0+WKr1YKH/kqsPrZCNx74YWzrnInPS52Wv/wv/uZf4PN6EqVsQ7fKE9YvWj1s6AKMFYCu33Oci+XOlPWCIMD9absGOk+SB75xgdZEaCPtmZVfXrEVSOAqGAGmAElKXJcwJddjwzBFZVHZq046cn6OCmxOiqG8/zjeN5R9EbBvrq8MRLPjTgdWbGfdL6Ry3B7gsj7oX+kf/B5teysovxP3paalXsF2otCFGU2ImZ7A0nvXOj2l+srwazSB0aqK6nqI7HOFFjlAGSrj01/hbMGVUMoFV1RQlUs82uqpuod0qCHhImykLE69cyplDhk7hAE6SoNzorsoC9vfXLk++76x3mdxx05Qm8qhy7zEGfi8sf/V+8fu0nTeTbSvKLGI9r8VzFZlY3tLYsQjvasZ5yvN2l+xtqHEQ3Gkl3GsMJfhqhArs2IUoP8uJyU81A4vUYNr2CyXPyHtn1jOPnxshiiKojdcXdBCeXJHnOvoQ3QE8W2uscUxcu8Csm3W3jlfIeN+bg9u/8aRRLiG5Gt+IRxsSJWmMG4zYsB1600dvhosauTDA9CLKnpxHAZfvHCY4O0mPTWAOmtNOlrSTXJSYZUBVYs0XpJiobzbg2PExvZsiCjKWNoMoH+t0CN1D26zxvd2c90b1Ml21vrSeMcI5VxqyP/d8K725KlC9iP6R52vTW6tnma60Isb1JV6MM/k0B6aq7kYCUeNTfV++AjDRgSkdEMuW4MD3wi6VXMFGYxLWRwXpnvB8/39dPT1p9vPX97AADXA8XXXWvcAztuaCtrWSXka/GKGPVx+z6n/xRHkuIzsZXH+pq9tavasn2G7TmdJPnOOgXbPRJCEizIt9noukp2dCAKQlngHR35Nqzv65QyZpSdsi9/K1CAK2/AawngX0gsc1Th9aPMbenm644ASfxWDzhOVEdxyJjsrfurMaoj9X5z/CLRpa/VuRotL6r0VppQbajqcZT0oDQ2hpuLYoU1zbHyG7i3tIeo2J6S+b21AO+WB+vW4/7eRnqMpun/n7J+LIg79LectIXSRZLziXxWM4tY5CxaKq7Us0Yo+Of6VeMKv74jrS/I2kN+MzLWqTdbO1+2yKGa2jPc0IdTHo8kom+aq9PWhQjJVBXWg+6+gdueqEr9rGFSQnynouuMsmo8rlXJava6cd8waQvlpxLzhnBc8sYZCz6mNz/LD+682su7WT8D594mlzVf0ULtZuu3Wd7QpU8z3CSf7PWJ/ySzS2g4naiUAErYF4zTB6/ajwvr8t7O/IzLxnQ2vFYkrzk2HIOOZecUz93vDEWJ+2/4EfILF3azqit5DslibRGtHaaj91grYrtau1Bm0KthfV1FdxFmQJB1ClAxAVfuoPJax0MYPIZ+ewjPIYcS47pozop7YxzJRrndrFQ3Z/+F9zuBtLVuLYgNVdtWgvaC5qHTS8tzHamlmSzSWtgl6s1NBVrj5q+0560+VFrZf2T1pquKCaP5Tl5Td4j763Cz8hn5RhyLP2YtY1z+Bnn/K8Dd6fYaAnSyfiOSaDxfy/kkuGDxm5AvofcSXO3eY9Q+mnu1oMZsYbqxsfqOb4m79Hf29L4bJpxrEDj2E53APdf/XOgFX901sYCprsRn4KMIC9foUgyoNQ0FFXbeJxmvBZnvDfI+Ky7BTQb7X/8R2nv9Au+tsbkHQwQLsbuwN3oCnsYj92M15yM99oZn/1/80u+d4NZ8fejTRZmo936dd47/ab0Xz/S/QtQf8n+uv11++umbv8HdmvWbtIu818AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAIAAAABc2X6AAAf40lEQVR42u2bB1RU57r3n2kwzDAzML33DkMZqiiYRI0lxsQTk2g0ahJNNKYZNabZS6KxxYIdRWMvGLsiighIQEGqSO8dsUbPd+5d6z7vjBJiTu6nxuTcc5bPehdrz7Bn9v69/6duFOCpPbWn9tSe2lMDoFAoLBbLx8eHz+eLXIYH+BLfxF/9h0ByOJyAgIARI0bMnz9/+/btKSkp+fn5JSUlVS7DA3x59uzZbdu2zZ07d/jw4Q6HAz/y78cpFAoHDRq0Zs2a9PT0ysrK+vr62tra6urqqt8x/BWegKfhyampqbGxsQMHDhQIBP8GTot6fvvttxcvXnTjVdw3PEakhoaGxsbGpqamZpfhAb7EN+vq6vB895nIjMc1NTWZmZlz5szx9/f/v+jwVCo1JCRk8+bN6KV402VlZeXl5XjreN/I09LS0n7f2u5ba2try33r5HeT4+5UugyPi4uL169f73Q68RL/V2gVCgVGYGFhIXKWlpbijbr9ExmQ8Oqv7QHsrvzuLcBPuUMAN6szCnJzc6dPny6Xy//FqAwG49VXX8Wsg5yorTtc3dZV1av/q/1T8d3YdS5zxz+6TGJi4uDBg/Gi/xparCgoLKbZy5cvIzDeE96c24ERo6Oj49qvrcNl135j7vcfgEdDbHeEo7nhcUPxcjNnzsRL/9W0RqNx586deHn0ZKStdRneXyetm+36r+3G71jnCW7+TvFRbXdic5MjNvo5uhKWMbyBvy4VR0ZGHj9+HOOqqKgIAwxvBWnxzlCTjvvWKaCb8+Z9u/Ubc7/fFb6r7Ci1O591kqPUuMXHjh2LiIj40xM4XiAmJgZj6dKlS+jJblXxDlBYN21Xzq6SdtLe/rX9Hrkb202OzF0zeSfzyZMno6Oj/1xm3NQTJ07k5OQgLV71t7RdOR9Q1U348+9YV/5ObDcw/nSHtBvbzYx7jb6NjhYeHv4nxm1CQgI2FejJXWkx0tD3OlE7OfFFTV7exb37/innnS72ALabvO7y5W3TpmG8uNXuLN1uZnwf4xn3HW/pT4lnHo+HDUBWVlZBQUFXT8b7wO1/wHtrMLy/nF7Yo0+pWF+2bNUDhHd/xzrJ8dsK5n17TqbPnjazM6X9lrmyqmpDbOw6l+HtPeF6O3Xq1IyMjLy8PCw/7pYIL1xTWZkycVJGdK/s5/pdGjA479URBWMn/PTeB+VSY6lIl8RT1ErN6Z9/jQxupL///wyJa46fvOTsUSDQ1omNVYmn7jmLy9w5DK97KTt73ZQpC/39j2/dit0OOt2UKVOeZH3GVv7MmTMYulj90ZHyLly4lJycdfz4yeEji1jCAo68wkddI9DViAw1YkOpSJ8n1F4W6+vUjtIVq9E73TD/7/fNfcK16pqKcR8XS01VMmuL0r9BZq07l9oZ1Qjc0tSUum9f7OBX4tn8EzrzhaQkLFTu9hObnxdeeOHJ0CqVSiy52MpnpKUdm/jpYYv9qBfvJ5r3Ebp3gZcgmy35huH9jSc3jSvP8VVXiQ0NMkuBSF8jsxaNHvdb1H/8M8Nz6rfvrgnsUYao6oB2dWCbKqBF4Vc6Y55b4drc3KxZc48GhCaxBEVsUYpCl5uaio7tzl4oA7rejh078FafwFQwefJkHNkO7t+/VqM97uG1l+NzzoN7jMY+6+mbyxaXc+VXeIpivrpOYmiQmpG2TGpOFWiLJabikOibV6/+76hoNxubasd+WKf0q1DYr+lDcF3VBiFzuzqgSmE732tA5rMDMkSaAl9VFV9bxlNeZoky4uPdwYzB1SkyRtykSZP+6Iyho9G+CA1d+fXXmzZsSD55ojAvr6ykpLSw8Mhrb1xmS/ayRXsmTy3euTuv14B6ialRZm6SW+vktotCXbPK/6omoPq1kS3pGV1p/6uL/eO//tF2JqU5ok+N0r9J47ihd17TBRNmQ1iVwl4qtRRJTAViQ5nUhPtYLzFiyFT6qtOEqqbWFnehekDkI0eOWK3WP9RmDBcItgHsAJiqUPywKY60zSUl5aWl55OT5w95de+ixUUHDl5eGZv94af5Il2j3NqstDUp7FkiXbs2sEMX1OyIqhn9XntNzQOoaH+/c6dpwTLEq1f6X9U5bxpCb+hDWjSBlXJrldKvXhNQJrfVKvzb1AEtKv8mua1BZq6TGKsFunyuNDfxVPtVMmw8IPL29etfZ7EevxGxWCyrly9fLBLNBThEZWz38NrF5h3gCo5yhMnewjS2II8tPs+RHubKfuBIknwUTUpbC96r0u+ixNiqCbymc9YPGXmtpPS3tD+3tTUPHXNLF1arctwwhF7XhzWqA9Crm9UBjSpHlcLarA68biC+3aYObFU78GtxN2slplKhLp0rXyeSr1myxD1Rosju3jYxIWGNQLACQP3YvdcHH3yQnJx8aO/eDWbLpjFjDi/8LunbBce/nn7y0ynHxo5bzPZdz+Lv8ZakiLQXB75yUazNFunThbpCqblAakba67qQ65qgFmvEjeKSrrQ3cvPber74s6lbkyYQtcWfLrwwlLdW6demDcIPom93uH5V4/LtQrEuw1d1jidL5kr3OUJObI5HVd3Thdur044d2yGV7gJYDNCD8lhhzOfzN2/enJ6efuXKldLi4oQt8eg8ncNtS1trijXoCl9dpLReOXykta4uIzCySGZOEema1Y4ObTAC4x037NzbumJNy+79v9AWFV9z9rpj7l6hDmxU+XfoQ342d2vTBqPCeH6LNqhJ5VejtNcqbBVya6ncWoZLZqmQWWrltnqpOf+9D1vq67FEdY4W6NWZiYk/ShTngLYSYD/ACKDwHkPknj17Yg7AZnXO3/6WnZqKnQb6T+egi5dMnzgl86VXz8Vtwr6xaNzHDQobltAskbYNnRmB9c4OQ0hHWTlJTl1c+troCXfNPW6aurXrQ+5auldqnZjVm1QkVls1QciM5PVKe43CRtR27cJVrRMPmhX2y+9PxH4VG8/ONhvv5/zp04eFkhTwOAC07wF2A3wBEPYYIr87dixORTjxHlmwYK3dD9MgMncFzoldg40sXh67vguh0a1q/0q5rVxubnNF73V9yE1DWFtgz5Yde5Dzv112t639ZvBzd609OnTB+BPXNWP4HUv3m4ZwpG3WBDa5Qhc/iB8nXo2ZTxuIwO2aoIrI3h0tLe5+292HkMmxqQlvLDM19XxKSsKWLYfoHsvl8mkOxzuPCszlcl+2WD6Lisr4KWP/lCkHgJ6WkLBt2LCa2lo3sLvFxZ94B1eWriiTGK9ITYkCzVmRplUTgPJeN4S2Pv9K61dzmnsO/Lmp+R5wbd1tW9QdSxRG7N9t0ddNkej8V3XB1w0RiI1RfdsUccsYdtNIMrYLOAhr21VNEALXrFjTOWlg7OasWp3WZ0CyLeCUf/DxQYOTNmzY3rc/evXGUaOOHT06ymZnP5JX22y2iSNGzAJYN2zYjzHPHGF6b581ax9fXF1bg8Bu1M45Nqf/y5hF29WOQonprFBbp/K/rndi7m36cjZqe7ut/e7Nm/eA6xtu+8Vg3N61xfzd3rMVHQFTsS60VRuCVG0oMuk3AttIRITgl2BhQ2D8ZnyzMTHJTYvy/jRsZJmPspQnL+JI8lmCSx4+6VT2BgpjH9CO7tyJLfDOXbtMJtMjAPft23fBzJlxVOoeLneDVr+T6nnWk7vDaHG7NAJ3TvNX1m0skpmKpMY6he20UHMexyOF3Q3cYe/evGj5nWvXfnHpuvqbth4depQ35o41ugkF1IW267D8OK9rgzo0wS2a4DZNMJa0JpWjTmmvVtiqSW33a1c5Gn48jOMHApcePVbF11QI1NlS3dnQqLMiZa6n70Ua5yfw+kYsLSosxDDE1NOvX79HAB4/fvz+hIRvxeJzQFlEoe0Cj3Sm7+m587sCu62o18Amha1Zaa+QmZNFuhyp6aLEjBF4Qx96AyvNwKGN6+I6gX/Ozm1ROO5aoxEY1w1TJPrzTWPkXUsPdOnbpm43jeHoyS0arMn+uIPYhJRLTTkifYFId+mtcW7g4nUba8WGQrG+MOUclqXy4uItQaHZdG4msA7RPFOTknBcT0pKmjBhwiP0z1999dWpU6eOHDy4UaVKBUYCeJyMjXXXJHfGctNWnElOV1lr5JZmlV+xzHJBrE8X6/OlZkytCNz02lu/5Od//ONOa1vpsLeRClEbDRFX9aF3rD0ItjGiVRt82xR5L4ZNYZi08OOkGmtR8KDKga8WTZ+bsHhpZWUlenVlZlYFX10h0Jzv2Sf9k0lJLw3Zi6MLnZNJYacDff+SpVhHU1JSpk+f/rB9NYvFWrp0Kc6DhYWFq2y2c8DIpbBOfPTxA8Do0nnDRtXLLCVS0xWp8bxIe16kuywjXUeZwu+6PrTREtGcdv7qmk3tE7+8NmDoDUs3LL93LTGN2uA7lmh03WvakA4SxmEob7vW2aoNuvULMCYtZ11k7+bUtF8NzHfuYBxlfTK5WKIr9ZEXe0tyWYITnryTNG8EPg+M/UuWlJSUpKWlLV++HEEeNkWvW7cONwmBl/ryU1zAJ1WGBldZcqdo95ONnOcHYVtPXFplzxDrrsjMmWJDltiQL7Vg99+iDbyhCb5lDL9tjvzZRXvDGHndGNGhdTZrnbfMPYiw5u63TN2w32rHGMY9Ujuu6p3ustSoD64+cLA9v6Atv6C1tKyjtQ1R0avdZaki60Ju/NYLq9dm7tq15Y0RF+mcLAr7KI2JZbm0tBQnp40bNyLIwz7NwbNxJMzKyV5FpSHwJQorHaffzMxOhRG4rqLijMaKM0ONzNKotGWL9Vli/XmRPkesq1X6kzZL7WhQOTCH3TJHlqoct01RrRqsqMHXDLgFUU1a501TFGapO+aoO2Z05sh27CXVjlqlvV7lf0MXUqmw4pY1awJwF+p0AVVm55WoXlc+mVqyeWvJ4SNXTp8pPJl4IX7LqRGjznsLLzAI8PZ+A6qqqsrKyrKysuLj4x/2uQ+Xx10ft+HMueT4jet/AMoeoGVTWJfo7NPbt7e0t7Z1tLdfu3r1eseF5StrCK3pisRYJDFeEOmTBWr8WU+6f1udyg9LS7suuFUXVKMKaFAH3DRFoJJXdSGYmTp0ISh4I8IbI7AIYXd52xxB/NkYjr10tdxSKDHWKqxXNaRKYStWrXDNYXILjhB1YlO1SFcmUBf7Ki9zpAVsUQ7T9wKds09juJiZUVFdWVxanJ6ZsWnL5od+0MUEeM2DMp4zmUebKKS9o/VMo3gdpbO38Xz4sWGMY88xTvbxONUv5vOQGqG2XopjMPHqNIxhgaZUZimXWTs0QZhssThhe0jmIVN4C048mkCkQmykxUYCIX82R2Ej2awJwhp2C4GNpOvA4G/TBORLjLv5qquuxwBtKv9SqalYamyUW+rJkGiqEesrhOpSX2UxV5rvAp6j5TGXWmCrHeIMsEoJswQwnAnMh+w98LxXPSJU1L3o3iN8tEP5pyieSaiwB29UhMR3dSgcexZO9mIc6n1ArayWGDFvVcssh3yVeWI9zoYoCwJjk4Q9ZqnM3EYKT3iDGpsK9OoIjGdsxVzwkWSZIppcno+0ZDZW+Teo/BC4Sm7pwFmK0DpaVX4oL+bFIrEeR+IasaFarMM6XOpS+Ahf2HeIkhLngC12iDfDBi2sksFMXxjm+dDAXlR4yaOPiPK8kArTJZR5iq9kXml09noaK4Xpe1Aoihxj4a+P5GyIOiFVZAtVl0Q4GOq28WSlMhNWYxxukBk7JzxAx8Z8iwUGI7MNE5UxHP22lYxE/hi0rhVxwxCOTouTMLZorpOd17RBNSQR+mOP1aryb1HamxW2RoUVh8R8oQbjqJKvyRSpVjvU/d6xeG0KgT2hsDUANtsg3gQbtRArgxk8eJ1JQB7KPKhME10VTocpvjBbAguUwgnSvZ5e5z24OxicBKZPprc4gS/e6isqF6pxs+ukJhT5gkhbTyLNjk11m9qBvr3VR+V6ZOPEhrlcqsfci0PCLUM4Om2N1IC0eFCnDmhR+zco7aeEuk5al7aBxVIz5gIERnkxdBvkFrzQJYF6tr/SvDiKu4d4GRyNgQPdYJcTtvhDnAXijRCngVgpfMVFzcDzIYHREXrSYAwTpvrCTDF8o4ClWuMI6Y9M7yym7wGmTwLLN9FbmM6TnPWRVYo0tVLypDJXpMNIRjVysAeSYsqx/ySzXNM6yWCsDbqIrqjww1qFTtuocqDzk+h1PeW4QapuGM7S9ei6OCET78DQddQrbUUSfRHWOfLQ14C06M9VIi2mq3h/rX1uKJx8Dg5Hw/4I2BEM8XZYb4Z4PWxUQ6wEPveG5+jwCONDN08Y7QGTeDBdBPNksEgNK438yZoENi+bxc/zFp31Fh33Fu3wFlaij0l09aQB1DRh34tTsQy7Sz3qnCrUYY+dLzFUyKz7+GosvwRPR2RMEemwPmHqRs4K8uzK1q4JJEOv0n/2S879PYPL0YElRty+CqkJVxWOJXxFOl+Z7CNL85GV8NVXePK5QQrxokDYGwbbA2GTDdYaYbMONqpgpRA+YUGU56PMhyY6DGfAJxz4WgBzpLBQBd/rYY1FP16dxPK9xBbmc8RFPrLTXGmJQI27Xi7WneIr88W6bJE2RahGznNCTZXciqGL3X+rKrBAbsfZoFpuu64NblIHoNrYKmOuwljF/pEkOTItBU4Z04NePA7Kxg2ZEl2itdZLzZgg0H1Q3gyBCqvRRb7iPE92hCNK5UqKOOJzbP6Q52X0tXbYYIFYPWzSQpwCVghgnCeY6Y8CLKHDEBpMYMMXfJjl8uolmP0wB9p7vyi/yBKgyIU8ab6P/CRPWiHUZAiUNRJDmcRwRqBMFqguivUYzOUyM/bYlZio1QEkjamDqrBiqYNyJIZisb5SZkHacpnFRYtuHHAmNJBa/C6UjoOS96B4jDBpiGXT85NGOHeFW+bHWJJlqlK+6ihPUuKrPOwtPMEWZrOFP3B5WwS8hTJvznT0QS0J4I1SWOILIxggfSRgLxq8QIN3mfCZD/HquTL4Tg3LDbDWRl3jt0gjcIucyJcsM8qnOdWLTIocofqCUH1RqEaR0bdblLYCsR4rCslhKkebwn/m8MhBC/tNfLsbvuwgpYs8jqyQW8jEq8GJ13EqNIBSPBauvAuX34HCt6BgJOQNh5yhkPUK/DSYm9BbuaqbcG23mA/tcTJxAUd8mOlzhOXDnWUY788bqmfCMhXEKWGDGOZw4CX6Q6foTutOh1Ee8CkHvhKQXP2tEpbqINYMG/2C3tagyNP9pR47IuHoM5DUZ8RQ62Wh5pivvE5qxHiulpqaFVac6VDDjcGm+OcCusf2o6BuZeODtg3GQHXN9GSVyEztan9sLdpUfg1K24T3u3FPD4GityD/zXu0F4YgLaQPgrP94fTzJDMfiREsCNjvydvC4Fz04PE/15F0tUwD3yshTg5rhTDZC6If4w9rOjq8ToMP2DDVB2a4Utd3GliBIlsZi60HvX1ME01wIAoOx8i/Dzsslm/jCMtFWkxg25ymGX0sjTJzgkUfsL4vXB4Nxe+41hi4ggKOHT05ulhrw6ESe4k8CWkn6l3Zzr0wP63q5ffKZ92ke/vfp30JUgYQ2sTecLQnHOzhFRt03ou/3YOTw+CoxylgjYHIu0wOcVJY6QNvMUD/GMBs9GoqjGXCJO49kb9RwhIdrDJBrLVvuICyNRj2RsCP3YMnWPN4spNcMQZzglnnu6dP8KLoGqnxzY8iIHc45I+AgjehcBQUjSbSXX4b4RW7BxbKja1yW4vChmmpBFtxjAWhtoT8Lc5cLTXWiQ25Mp1pzTNE23P3aY89A4ewDnWjbAuZI+ItpXll0tniCXJYqYPFClgmhfUYfd7wMo3c/ONYGAPepMNHLpExkufIYKGapOvVmBJtsDUQdoWy1jp3ScXxbF9MYDv1KkF8DKQOpJwbuCZAxz3UH7Jfh0vDIPcN4p9ucoxMhC8cJTs0qP/cZyeMCC6SGYsleoz8SqkpT6TFYjvqnaBu86Nm9bMNecvvF9rjz5Cqm9ANdofT4gL3eftsoXkl0ZisLxXwvQoWSmG5GGJ94WNPiHjsPxSLGDCYAu+5RP6ST5qQ+QpYrIUVRsxesMkB24L0kyw5bNGP3oJdShk3LhJO9YbkfnDuBU/shDJehsy/QeYrxs29bSue1W7tC7nDIM8Ff3+xz/xtm1l3XqA6x1emCFR1EsPiaAst5UU4PwjSBlISn4czz1P3x9yjxQjaEw47QswTdBsYrBVUz42entTvVLBIDvPFsFIACzkwlApi+uMCY6eC0T+SDh+wuINYHiN58IWY1OSlLsdeb6Ou9RtjFWxm8k5whZJFQSTATjwLib3gTF8SdakvQPqLisURI0YHHBYqLsv0kXOiIOe1e+vSUEnCgHm9rdkCNQLnCjW1Ev3aMKPX8b6Q9iIR9mw/vxnBC/yUa/lCvyl2F20E7ArBXR74rHgv3esAhfmZnAlLFLBAAnMEsMIHPvWEngz4Q/+sBwvyyxTKQLojgD6WCguo0N/h5T1OTJ2j5k1Wfa7jZTF5OWz+632VsD8SfowiOmCkYdOX5JLahU0594JzfsTs/tZMmXbai3bzwqjBn4QtGGD7wUQq2Rm+okaiLxXrPn3RyjjZ14XqSsiJvWhxEdz5gbt9hekc0bNDtdQtwUjL+taynMc+SGWmgmevKDZ8J4W5QpjDg2/Y8Br1EcvvPxU5nE57geo1wGMUA2YAzAOYBZTvKPSjeEkGO92Tk8Tk8udYMZ5hXwRp5Q/1ID09OmHic8qVkbO661dZVcsi9PYl3WIm+J/2UeTxVThyVIl1+LNSpLss0qwN0ft9Fwkp/VFVgnqqF/GUoz2184M+DJZt4PFXenK3efKWSXym2vl7WOxUGuschZkMdNMgDswXwXQfmOcNExgQSYc//q+2aEyqk0XB2eM9gM8B5gLsBcpxoCWCRzKNjI2nPDmjw0Uxr6tE06yU7aH3pe6BBdP8gSVsrOWEWI49cDJPeoYnxXmjHLtRXEJNpUD9g0Lee7TVZ2s0JPfFek7CAVHRR47E+HwTMKqn4u0g8VKjaLXAJ87DezfDO4PBSaOxzrpok4CywJti6sOkYFr9yhNepAKPBk/GjHSPHhTsXnYAbHetz7i06Vz6VDHTb7BwUBT/uKf3BSYv1tP7U4OAsT4I9oZDwj1s6oEe74YrfmQLfuLL50Zqhr9h6flpQI8pQQPH+gXMcM7priv0kW8XiCdHq4VrwuFYTzgSDYe6k89uD4N94Ri0oo/0a7jcwx7en5l4I50+mxmeqxn01+3M58KZHwipOwFeY4IihAIWOjwxo1H8vKgWMUwFGMeiyPt6kR57hqvHXoyFSuf7iTLqRbH4Ew1zgYW2zA47nLA71I3NWhXcc5heN8UuWxwMR6MJ0vFfFuVIjGmGo9tbJv4yp2KihaBicsLNQlT8hl0hzpHqhSLeaxae5n0lrDPBaj19noL2tRgWYAvJhy84smfpXpEUnoSGN/lE/2Uamwq9aPAGDd5nwsfeMMXn3lyxAOcKNSzTkVq1xoKpG+L8ID4Afggi2JhU97iE2u8Kb9TtIK7uZB26v/BN/BVC4jl4Jo57LlTYEQTbAunTcQaywyYrrDNCLF5FDd/JYbYIZvPJlD/JC8bSoS+N3N6TNz4d+lHhTRqMQ2Y2TObdZ5bDYhUswcYTexIsV1bYaIfN/rAlAJMqmc53hhAGJN/rgif8ri3Y7zrY10noJGunE7YHwQ8BsNUBm/0gzkpa5bUGWKWF5Sr4TgbTBDDdF77iENr36DCICgI6/FmmYMAACox0MWOqwIbkc1+YJYJvpbBISZ4TLMcBA/ttM8GOs5M73uIgD5y2BRIMAu9CQrzOhS9xX7Bvi0dCB+Hc4g+b7QR1g5kIu1oHK9WwVAHzxIQWnetLF+047IuooPzzaN2mZsALFKLze57wIYuMU2SEFMI3ElgohwVKMrisRKmNLmwLbLTdI4/3d8E7iHrI714/OMhCd9hgJ+GwFrfJRp5ObTDBOgOswQ7HNQbhhs4Qkoevn/PI04xPmURbpNX8Nf8dQIG+TYEROFp4wASvX9x7jkvq+TJYooLlGlilwxwDa4wk2aBbbnTD2EhMbu6y8CX+Clu3lUZYjjuFDqInqt5DlcFMEcwSwlySouADL5jgCe/SiCcr6PDXGcbzczQYSoG36eR5Cko90Rs+48E0viujYAcqg2UKEnUrXOSxejLErTUSF0V+sgXuZSQLxVymhUUaMpzgZq1QwWI5zJPcQ52HbTwPJrNJvhzDgFFUkqUEfyVt5+PrMDq8QoFRNCI13s1HiM0hXofYGGxzxGSIWeIix4EGE+xKDck9uGK7LFQSQ3SJkjxXmS2FWRKSCGcKSXs814X6mTcR9l0PGEWHIRTo9hhPM55cfQYjA/pT4Q0KvEUn94TYbrU/58I0zKUucsxqc3HSksACKVEeMy2WFvyJxyQEpDDHBTlNCF9glPIJ52wfmMYlqiIqJgv0ozeo5EJ4Odq//D+qYUMXRmYMGOHycFQbndwd25PQz3G05MEMTOZ8knVwzRTcO5gtcMnoXnxyDqZ93Kwp3vAxi+wd7iB+ISYL/HK8xBPrHJ/A//4AMoVGMeBlgOEUGE0jwYa3O96T3DeqhDVsIhs+48AXXNIw4Pr6/sIaM9WbiInpF88cjxnYg3z8LRrZQfxC/FrRk5gK/hTDXBJKJ3XrdSxdVHLT79DvwaNnovK4BYj0vmvhwXjXO/g+njCWAe+4OEdSSTrEL8Gv+hckp8fpQ2mgRcHpMIBK0gxqjgwoO8Kgi77z64VvjnZB4ml4MgYqfhA/zqbBv58xqSCkgYFGHo9F02AADQZjYsddALLwAF/im9GuE/Q0cjKTCv855kklPEwK+Zs70/WHaHzp+Z9E+NSe2lN7ak/tD9n/AMFn2y8iiKUJAAAAAElFTkSuQmCC - + - - - - + + + + + - + + - + + + + + + + @@ -407,48 +420,56 @@ + + + + + + + + @@ -457,48 +478,56 @@ + + + + + + + + @@ -507,48 +536,56 @@ + + + + + + + + @@ -557,48 +594,56 @@ + + + + + + + + @@ -607,48 +652,56 @@ + + + + + + + + @@ -657,48 +710,56 @@ + + + + + + + + diff --git a/test/necros.html b/test/necros.html index afe3176c..16e565b5 100644 --- a/test/necros.html +++ b/test/necros.html @@ -16,7 +16,7 @@ font-size:14px; } - + @@ -24,7 +24,7 @@
+ cellpadding="5" cellspacing="0"> @@ -41,7 +41,7 @@ - + @@ -49,7 +49,7 @@ @@ -59,7 +59,7 @@ - + @@ -67,7 +67,7 @@ @@ -77,7 +77,7 @@ - + @@ -92,7 +92,7 @@ - + @@ -107,7 +107,7 @@ - + @@ -115,7 +115,7 @@ @@ -123,7 +123,7 @@ - + @@ -131,7 +131,7 @@ @@ -139,7 +139,7 @@ - + @@ -147,7 +147,8 @@ @@ -156,7 +157,7 @@ - + @@ -164,7 +165,8 @@ @@ -173,14 +175,14 @@ - + @@ -188,14 +190,14 @@ - + @@ -203,14 +205,14 @@ - + @@ -218,14 +220,14 @@ - + @@ -243,7 +245,7 @@ Perso Regard hypnotique Blocage - Regeneration + Régénération Glissade contrôlée @@ -264,7 +266,7 @@ Blocage Esquive en force Juggernaut - Regeneration + Régénération @@ -273,7 +275,7 @@ @@ -360,7 +362,7 @@   - + @@ -413,6 +415,14 @@ + + + + + + + +
#
1 ? Loup-Garou 8 38 Frénésie - Regeneration + Régénération Griffes
Blocage
2 ? Loup-Garou 8 38 Frénésie - Regeneration + Régénération Griffes
Châtaigne
3 ? Goule 7 3
4 ? Goule 7 3
5 ? Revenant 6 38 Blocage - Regeneration + Régénération 90000 GF
6 ? Revenant 6 38 Blocage - Regeneration + Régénération 90000 GF
7 ? Golem de chair 4 49 Stabilité - Regeneration + Régénération + Crâne épais
Garde
130000
8 ? Golem de chair 4 49 Stabilité - Regeneration + Régénération + Crâne épais
Garde
130000
9 ? Zombie 4 3 2 8 - Regeneration + Régénération 40000 G
10 ? Zombie 4 3 2 8 - Regeneration + Régénération 40000 G
11 ? Zombie 4 3 2 8 - Regeneration + Régénération 40000 G
12 ? Zombie 4 3 2 8 - Regeneration + Régénération 40000 G 390000 220000  
- Nom de l'équipe + Nom de l'équipe   Apothicaire Corruption d'arbitre Corruption d'arbitre 2 X 100000100000
  @@ -423,5 +433,6 @@
+
diff --git a/test/necros.xml b/test/necros.xml index 9c23be41..0896e71b 100644 --- a/test/necros.xml +++ b/test/necros.xml @@ -1,4 +1,4 @@ - + diff --git a/test/necros2.xml b/test/necros2.xml index 3790c27a..4957358c 100644 --- a/test/necros2.xml +++ b/test/necros2.xml @@ -1,4 +1,4 @@ - + @@ -11,8 +11,8 @@ - - + + diff --git a/test/teamma/data/LRBNGTest.java b/test/teamma/data/LRBNGTest.java index 9194b7e1..b7fd9faf 100644 --- a/test/teamma/data/LRBNGTest.java +++ b/test/teamma/data/LRBNGTest.java @@ -50,7 +50,7 @@ public void tearDownMethod() throws Exception { @Test public void testGetLRB() { LOG.log(Level.FINE, "getLRB"); - LRB result = LRB.getLRB(); + LRB result = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertNotNull(result); Assert.assertNotEquals(result.getRosterTypeCount(), 0); Assert.assertNotEquals(result.getSkillTypeCount(), 0); @@ -63,7 +63,7 @@ public void testGetLRB() { @Test public void testGetSkill() { LOG.log(Level.FINE, "getSkill"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertTrue(instance.getSkillTypeCount() > 0); for (int i = 0; i < instance.getSkillTypeCount(); i++) { SkillType sp = instance.getSkillType(i); @@ -73,10 +73,10 @@ public void testGetSkill() { Skill sk = sp.getSkill(j); Assert.assertNotNull(sk); - Skill sk2 = instance.getSkill(sk.getmName(),false); + Skill sk2 = instance.getSkill(sk.getmName(), false); assertEquals(sk, sk2); - - Skill sk3 = instance.getSkill(Translate.translate(sk.getmName()),true); + + Skill sk3 = instance.getSkill(Translate.translate(sk.getmName()), true); assertEquals(sk, sk3); } @@ -90,7 +90,7 @@ public void testGetSkill() { @Test public void testGetSkillType_String() { LOG.log(Level.FINE, "getSkillType"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertTrue(instance.getSkillTypeCount() > 0); for (int i = 0; i < instance.getSkillTypeCount(); i++) { SkillType sp = instance.getSkillType(i); @@ -108,8 +108,8 @@ public void testGetSkillType_String() { public void testGetRosterType_String() { LOG.log(Level.FINE, "getRosterType"); // String name = ""; - LRB instance = LRB.getLRB(); - RosterType result = instance.getRosterType("Chaos"); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); + RosterType result = instance.getRosterType("Gobelins"); Assert.assertNotNull(result); } @@ -119,7 +119,7 @@ public void testGetRosterType_String() { @Test public void testGetStarPlayer_String() { LOG.log(Level.FINE, "getStarPlayer"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertTrue(instance.getStarPlayerCount() > 0); for (int i = 0; i < instance.getStarPlayerCount(); i++) { StarPlayer sp = instance.getStarPlayer(i); @@ -137,7 +137,7 @@ public void testGetStarPlayer_String() { @Test public void testGetRosterType_int() { LOG.log(Level.FINE, "getRosterType"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertNotNull(instance); Assert.assertTrue(instance.getRosterTypeCount() > 0); for (int i = 0; i < instance.getRosterTypeCount(); i++) { @@ -154,9 +154,9 @@ public void testGetRosterType_int() { public void testGetRosterTypeCount() { LOG.log(Level.FINE, "getRosterTypeCount"); LRB.unloadLRB(); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); int result = instance.getRosterTypeCount(); - assertEquals(result, 25); + assertEquals(result, 26); } /** @@ -165,7 +165,7 @@ public void testGetRosterTypeCount() { @Test public void testClearRosterTypes() { LOG.log(Level.FINE, "clearRosterTypes"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertNotEquals(instance.getRosterTypeCount(), 0); instance.clearRosterTypes(); Assert.assertEquals(instance.getRosterTypeCount(), 0); @@ -179,10 +179,10 @@ public void testClearRosterTypes() { public void testAddRosterType() { LOG.log(Level.FINE, "addRosterType"); RosterType rt = new RosterType("Donkeys"); - int nb = LRB.getLRB().getRosterTypeCount(); - LRB.getLRB().addRosterType(rt); + int nb = LRB.getLRB(LRB.E_Version.BB2016).getRosterTypeCount(); + LRB.getLRB(LRB.E_Version.BB2016).addRosterType(rt); - assertEquals(nb + 1, LRB.getLRB().getRosterTypeCount()); + assertEquals(nb + 1, LRB.getLRB(LRB.E_Version.BB2016).getRosterTypeCount()); LRB.unloadLRB(); } @@ -193,7 +193,7 @@ public void testAddRosterType() { @Test public void testGetStarPlayerCount() { LOG.log(Level.FINE, "getStarPlayerCount"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertTrue(instance.getStarPlayerCount() > 0); LRB.unloadLRB(); } @@ -204,7 +204,7 @@ public void testGetStarPlayerCount() { @Test public void testGetStarPlayer_int() { LOG.log(Level.FINE, "getStarPlayer"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertTrue(instance.getStarPlayerCount() > 0); for (int i = 0; i < instance.getStarPlayerCount(); i++) { StarPlayer sp = instance.getStarPlayer(i); @@ -219,7 +219,7 @@ public void testGetStarPlayer_int() { @Test public void testClearStarPlayers() { LOG.log(Level.FINE, "clearStarPlayers"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertNotEquals(instance.getStarPlayerCount(), 0); instance.clearStarPlayers(); Assert.assertEquals(instance.getStarPlayerCount(), 0); @@ -234,7 +234,7 @@ public void testClearStarPlayers() { public void testAddStarPlayer() { LOG.log(Level.FINE, "addStarPlayer"); StarPlayer sp = new StarPlayer("Toto"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); int nb = instance.getStarPlayerCount(); instance.addStarPlayer(sp); assertEquals(nb + 1, instance.getStarPlayerCount()); @@ -248,7 +248,7 @@ public void testAddStarPlayer() { public void testAddSkillType() { LOG.log(Level.FINE, "addSkillType"); SkillType st = new SkillType("Dummy", "D"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); int nb = instance.getSkillTypeCount(); instance.addSkillType(st); @@ -263,7 +263,7 @@ public void testAddSkillType() { public void testClearSkillTypes() { LOG.log(Level.FINE, "clearSkillTypes"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertNotEquals(instance.getSkillTypeCount(), 0); instance.clearSkillTypes(); Assert.assertEquals(instance.getSkillTypeCount(), 0); @@ -277,7 +277,7 @@ public void testClearSkillTypes() { @Test public void testGetSkillType_int() { LOG.log(Level.FINE, "getSkillType"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertTrue(instance.getSkillTypeCount() > 0); for (int i = 0; i < instance.getSkillTypeCount(); i++) { SkillType sp = instance.getSkillType(i); @@ -292,7 +292,7 @@ public void testGetSkillType_int() { @Test public void testGetSkillTypeCount() { LOG.log(Level.FINE, "getSkillTypeCount"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); Assert.assertTrue(instance.getSkillTypeCount() > 0); LRB.unloadLRB(); @@ -304,7 +304,7 @@ public void testGetSkillTypeCount() { @Test public void testGetName() { LOG.log(Level.FINE, "getName"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); String result = instance.getName(); Assert.assertNotNull(result); } @@ -316,7 +316,7 @@ public void testGetName() { public void testSetName() { LOG.log(Level.FINE, "setName"); String _name = "Test"; - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); String save = instance.getName(); instance.setName(_name); assertEquals("Test", instance.getName()); @@ -329,7 +329,7 @@ public void testSetName() { @Test public void testIsAllowSpecialSkills() { LOG.log(Level.FINE, "isAllowSpecialSkills"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); boolean save = instance.isAllowSpecialSkills(); instance.setAllowSpecialSkills(true); assertEquals(true, instance.isAllowSpecialSkills()); @@ -342,7 +342,7 @@ public void testIsAllowSpecialSkills() { @Test public void testSetAllowSpecialSkills() { LOG.log(Level.FINE, "setAllowSpecialSkills"); - LRB instance = LRB.getLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); boolean save = instance.isAllowSpecialSkills(); instance.setAllowSpecialSkills(true); assertEquals(true, instance.isAllowSpecialSkills()); @@ -356,7 +356,7 @@ public void testSetAllowSpecialSkills() { public void testUnloadLRB() { System.out.println("unloadLRB"); LRB.unloadLRB(); - LRB.getLRB(); + LRB.getLRB(LRB.E_Version.BB2016); LRB.unloadLRB(); } @@ -366,7 +366,7 @@ public void testUnloadLRB() { @Test public void testGetRosterType_String_boolean() { System.out.println("getRosterType"); - LRB lrb = LRB.getLRB(); + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); for (int i = 0; i < lrb.getRosterTypeCount(); i++) { RosterType rt = lrb.getRosterType(i); @@ -395,7 +395,7 @@ public void testGetRosterType_String_boolean() { @Test public void testGetRosterTypeListAsString() { System.out.println("getRosterTypeListAsString"); - LRB lrb = LRB.getLRB(); + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); ArrayList result = lrb.getRosterTypeListAsString(false); Assert.assertNotNull(result); Assert.assertTrue(result.size() > 0); @@ -424,10 +424,9 @@ public void testGetRosterTypeListAsString() { public void testIsChef_enabled() { System.out.println("isChef_enabled"); boolean expResult = false; + LRB.getLRB(LRB.E_Version.BB2016); boolean result = LRB.isChef_enabled(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(result, true); } /** @@ -437,9 +436,12 @@ public void testIsChef_enabled() { public void testSetChef_enabled() { System.out.println("setChef_enabled"); boolean _chef_enabled = false; + LRB.getLRB(LRB.E_Version.BB2016); + boolean result = LRB.isChef_enabled(); + assertEquals(result, true); LRB.setChef_enabled(_chef_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + result = LRB.isChef_enabled(); + assertEquals(result, false); } /** @@ -448,11 +450,10 @@ public void testSetChef_enabled() { @Test public void testIsMercenaries_enabled() { System.out.println("isMercenaries_enabled"); - boolean expResult = false; + boolean expResult = true; + LRB.getLRB(LRB.E_Version.BB2016); boolean result = LRB.isMercenaries_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -461,10 +462,15 @@ public void testIsMercenaries_enabled() { @Test public void testSetMercenaries_enabled() { System.out.println("setMercenaries_enabled"); + boolean expResult = true; + LRB.getLRB(LRB.E_Version.BB2016); + boolean result = LRB.isMercenaries_enabled(); + assertEquals(result, expResult); + boolean _mercenaries_enabled = false; LRB.setMercenaries_enabled(_mercenaries_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + result = LRB.isMercenaries_enabled(); + assertEquals(result, _mercenaries_enabled); } /** @@ -473,11 +479,9 @@ public void testSetMercenaries_enabled() { @Test public void testIsBabes_enabled() { System.out.println("isBabes_enabled"); - boolean expResult = false; + boolean expResult = true; boolean result = LRB.isBabes_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -488,8 +492,13 @@ public void testSetBabes_enabled() { System.out.println("setBabes_enabled"); boolean _babes_enabled = false; LRB.setBabes_enabled(_babes_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + boolean result = LRB.isBabes_enabled(); + assertEquals(result, _babes_enabled); + _babes_enabled = true; + LRB.setBabes_enabled(_babes_enabled); + result = LRB.isBabes_enabled(); + assertEquals(result, _babes_enabled); } /** @@ -498,11 +507,11 @@ public void testSetBabes_enabled() { @Test public void testIsWizard_enabled() { System.out.println("isWizard_enabled"); - boolean expResult = false; - boolean result = LRB.isWizard_enabled(); + boolean expResult = true; + LRB.unloadLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); + boolean result = instance.isWizard_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -513,8 +522,12 @@ public void testSetWizard_enabled() { System.out.println("setWizard_enabled"); boolean _wizard_enabled = false; LRB.setWizard_enabled(_wizard_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isWizard_enabled(); + assertEquals(result, _wizard_enabled); + _wizard_enabled = true; + LRB.setWizard_enabled(_wizard_enabled); + result = LRB.isWizard_enabled(); + assertEquals(result, _wizard_enabled); } /** @@ -523,11 +536,12 @@ public void testSetWizard_enabled() { @Test public void testIsReroll_enabled() { System.out.println("isReroll_enabled"); - boolean expResult = false; + boolean expResult = true; + LRB.unloadLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); boolean result = LRB.isReroll_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -538,8 +552,12 @@ public void testSetReroll_enabled() { System.out.println("setReroll_enabled"); boolean _reroll_enabled = false; LRB.setReroll_enabled(_reroll_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isReroll_enabled(); + assertEquals(result, _reroll_enabled); + _reroll_enabled = true; + LRB.setReroll_enabled(_reroll_enabled); + result = LRB.isReroll_enabled(); + assertEquals(result, _reroll_enabled); } /** @@ -548,11 +566,9 @@ public void testSetReroll_enabled() { @Test public void testIsLocal_apothecaries_enabled() { System.out.println("isLocal_apothecaries_enabled"); - boolean expResult = false; + boolean expResult = true; boolean result = LRB.isLocal_apothecaries_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -563,8 +579,12 @@ public void testSetLocal_apothecaries_enabled() { System.out.println("setLocal_apothecaries_enabled"); boolean _local_apothecaries_enabled = false; LRB.setLocal_apothecaries_enabled(_local_apothecaries_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isLocal_apothecaries_enabled(); + assertEquals(result, _local_apothecaries_enabled); + _local_apothecaries_enabled = true; + LRB.setLocal_apothecaries_enabled(_local_apothecaries_enabled); + result = LRB.isLocal_apothecaries_enabled(); + assertEquals(result, _local_apothecaries_enabled); } /** @@ -573,11 +593,10 @@ public void testSetLocal_apothecaries_enabled() { @Test public void testIsIgor_enabled() { System.out.println("isIgor_enabled"); - boolean expResult = false; + boolean expResult = true; boolean result = LRB.isIgor_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -588,8 +607,12 @@ public void testSetIgor_enabled() { System.out.println("setIgor_enabled"); boolean _igor_enabled = false; LRB.setIgor_enabled(_igor_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isIgor_enabled(); + assertEquals(result, _igor_enabled); + _igor_enabled = true; + LRB.setIgor_enabled(_igor_enabled); + result = LRB.isIgor_enabled(); + assertEquals(result, _igor_enabled); } /** @@ -598,11 +621,9 @@ public void testSetIgor_enabled() { @Test public void testIsCards_enabled() { System.out.println("isCards_enabled"); - boolean expResult = false; + boolean expResult = true; boolean result = LRB.isCards_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -613,8 +634,12 @@ public void testSetCards_enabled() { System.out.println("setCards_enabled"); boolean _cards_enabled = false; LRB.setCards_enabled(_cards_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isCards_enabled(); + assertEquals(result, _cards_enabled); + _cards_enabled = true; + LRB.setCards_enabled(_cards_enabled); + result = LRB.isCards_enabled(); + assertEquals(result, _cards_enabled); } /** @@ -623,11 +648,11 @@ public void testSetCards_enabled() { @Test public void testIsStarplayers_enabled() { System.out.println("isStarplayers_enabled"); - boolean expResult = false; - boolean result = LRB.isStarplayers_enabled(); + boolean expResult = true; + LRB.unloadLRB(); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); + boolean result = instance.isStarplayers_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -638,8 +663,12 @@ public void testSetStarplayers_enabled() { System.out.println("setStarplayers_enabled"); boolean _starplayers_enabled = false; LRB.setStarplayers_enabled(_starplayers_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isStarplayers_enabled(); + assertEquals(result, _starplayers_enabled); + _starplayers_enabled = true; + LRB.setStarplayers_enabled(_starplayers_enabled); + result = LRB.isStarplayers_enabled(); + assertEquals(result, _starplayers_enabled); } /** @@ -648,11 +677,10 @@ public void testSetStarplayers_enabled() { @Test public void testIsBribes_enabled() { System.out.println("isBribes_enabled"); - boolean expResult = false; + boolean expResult = true; boolean result = LRB.isBribes_enabled(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -663,8 +691,12 @@ public void testSetBribes_enabled() { System.out.println("setBribes_enabled"); boolean _bribes_enabled = false; LRB.setBribes_enabled(_bribes_enabled); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isBribes_enabled(); + assertEquals(result, _bribes_enabled); + _bribes_enabled = true; + LRB.setBribes_enabled(_bribes_enabled); + result = LRB.isBribes_enabled(); + assertEquals(result, _bribes_enabled); } /** @@ -676,8 +708,7 @@ public void testIsCheck_nb_big_guys() { boolean expResult = false; boolean result = LRB.isCheck_nb_big_guys(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -688,8 +719,25 @@ public void testSetCheck_nb_big_guys() { System.out.println("setCheck_nb_big_guys"); boolean _check_nb_big_guys = false; LRB.setCheck_nb_big_guys(_check_nb_big_guys); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = LRB.isCheck_nb_big_guys(); + assertEquals(result, _check_nb_big_guys); + _check_nb_big_guys = true; + LRB.setCheck_nb_big_guys(_check_nb_big_guys); + result = LRB.isCheck_nb_big_guys(); + assertEquals(result, _check_nb_big_guys); + } + + /** + * Test of getVersion method, of class LRB. + */ + @Test + public void testGetVersion() { + System.out.println("getVersion"); + LRB instance = LRB.getLRB(LRB.E_Version.BB2016); + LRB.E_Version expResult = LRB.E_Version.BB2016; + LRB.E_Version result = instance.getVersion(); + assertEquals(result, expResult); + } } diff --git a/test/teamma/data/PlayerNGTest.java b/test/teamma/data/PlayerNGTest.java index c64b7021..5500d3ec 100644 --- a/test/teamma/data/PlayerNGTest.java +++ b/test/teamma/data/PlayerNGTest.java @@ -31,7 +31,7 @@ public PlayerNGTest() { @BeforeClass public static void setUpClass() throws Exception { - lrb = LRB.getLRB(); + lrb = LRB.getLRB(LRB.E_Version.BB2016); } @AfterClass @@ -503,12 +503,35 @@ public void testSetName() { @Test public void testPull() { System.out.println("pull"); - Player player = null; - LRB.E_Version version = null; - Player instance = null; - instance.pull(player, version); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + System.out.println("setName"); + if (lrb == null) { + fail("lrb is null"); + } + if (lrb.getRosterTypeCount() == 0) { + fail("No roster type in LRB"); + } + if (roster == null) { + fail("Roster is null"); + } + + if (roster.getPlayerCount() == 0) { + fail("No player loaded"); + } + + for (int i=0; i 0); - } - } - - /** - * Test of setExtrarerolls method, of class Roster. - */ - @Test - public void testSetExtrarerolls() { - System.out.println("setExtrarerolls"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int save = roster.getExtrarerolls(); - roster.setExtrarerolls(4); - int nb = roster.getExtrarerolls(); - Assert.assertTrue(nb == 4); - roster.setExtrarerolls(save); - } - } - - /** - * Test of getLocalapothecary method, of class Roster. - */ - @Test - public void testGetLocalapothecary() { - System.out.println("getLocalapothecary"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int nb = roster.getLocalapothecary(); - Assert.assertTrue(nb > 0); - } - } - - /** - * Test of setLocalapothecary method, of class Roster. - */ - @Test - public void testSetLocalapothecary() { - System.out.println("setLocalapothecary"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int save = roster.getExtrarerolls(); - roster.setExtrarerolls(4); - int nb = roster.getExtrarerolls(); - Assert.assertTrue(nb == 4); - roster.setExtrarerolls(save); - } - } - - /** - * Test of getBloodweiserbabes method, of class Roster. - */ - @Test - public void testGetBloodweiserbabes() { - System.out.println("getBloodweiserbabes"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int nb = roster.getBloodweiserbabes(); - Assert.assertTrue(nb > 0); - } - } - - /** - * Test of setBloodweiserbabes method, of class Roster. - */ - @Test - public void testSetBloodweiserbabes() { - System.out.println("setBloodweiserbabes"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int save = roster.getBloodweiserbabes(); - roster.setBloodweiserbabes(4); - int nb = roster.getBloodweiserbabes(); - Assert.assertTrue(nb == 4); - roster.setBloodweiserbabes(save); - } - } - - /** - * Test of getCorruptions method, of class Roster. - */ - @Test - public void testGetCorruptions() { - System.out.println("getCorruptions"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int nb = roster.getCorruptions(); - Assert.assertTrue(nb > 0); - } - } - - /** - * Test of setCorruptions method, of class Roster. - */ - @Test - public void testSetCorruptions() { - System.out.println("setCorruptions"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int save = roster.getCorruptions(); - roster.setCorruptions(4); - int nb = roster.getCorruptions(); - Assert.assertTrue(nb == 4); - roster.setCorruptions(save); - } - } - /** - * Test of isChef method, of class Roster. - */ - @Test - public void testIsChef() { - System.out.println("isChef"); - if (roster == null) { - fail("Roster not loaded"); - } else { - Assert.assertTrue(roster.isChef()); - } - } - - /** - * Test of setChef method, of class Roster. - */ - @Test - public void testSetChef() { - System.out.println("setChef"); - if (roster == null) { - fail("Roster not loaded"); - } else { - boolean save = roster.isChef(); - roster.setChef(false); - Assert.assertFalse(roster.isChef()); - roster.setChef(save); - } - } - - /** - * Test of isIgor method, of class Roster. - */ - @Test - public void testIsIgor() { - System.out.println("isIgor"); - if (roster == null) { - fail("Roster not loaded"); - } else { - Assert.assertTrue(roster.isIgor()); - } - } - - /** - * Test of setIgor method, of class Roster. - */ - @Test - public void testSetIgor() { - System.out.println("setIgor"); - if (roster == null) { - fail("Roster not loaded"); - } else { - boolean save = roster.isIgor(); - roster.setIgor(false); - Assert.assertFalse(roster.isIgor()); - roster.setIgor(save); - } - } - - /** - * Test of isWizard method, of class Roster. - */ - @Test - public void testIsWizard() { - System.out.println("isWizard"); - if (roster == null) { - fail("Roster not loaded"); - } else { - Assert.assertTrue(roster.isWizard()); - } - } - - /** - * Test of setWizard method, of class Roster. - */ - @Test - public void testSetWizard() { - System.out.println("setWizard"); - if (roster == null) { - fail("Roster not loaded"); - } else { - boolean save = roster.isWizard(); - roster.setWizard(false); - Assert.assertFalse(roster.isWizard()); - roster.setWizard(save); - } - } - - /** - * Test of getCards method, of class Roster. - */ - @Test - public void testGetCards() { - System.out.println("getCards"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int nb = roster.getCards(); - Assert.assertTrue(nb > 0); - } - } - - /** - * Test of setCards method, of class Roster. - */ - @Test - public void testSetCards() { - System.out.println("setCards"); - if (roster == null) { - fail("Roster not loaded"); - } else { - int save = roster.getCards(); - roster.setCards(4); - int nb = roster.getCards(); - Assert.assertTrue(nb == 4); - roster.setCards(save); - } - } /** * Test of getChampion method, of class Roster. @@ -640,7 +395,7 @@ public void testSetRoster() { @Test public void testGetPlayer() { System.out.println("getPlayer"); - if (lrb == null) { + if (lrb == null) { fail("lrb is null"); } if (lrb.getRosterTypeCount() == 0) { @@ -658,10 +413,10 @@ public void testGetPlayer() { } int nb = roster.getPlayerCount(); for (int i = 0; i < nb; i++) { - Player pl=roster.getPlayer(i); + Player pl = roster.getPlayer(i); Assert.assertNotNull(pl); } - + } /** @@ -670,7 +425,7 @@ public void testGetPlayer() { @Test public void testRemovePlayer() { System.out.println("removePlayer"); - if (lrb == null) { + if (lrb == null) { fail("lrb is null"); } if (lrb.getRosterTypeCount() == 0) { @@ -785,7 +540,7 @@ public void testClearPlayers() { } roster.clearPlayers(); assertEquals(roster.getPlayerCount(), 0); - for (Player p:list) { + for (Player p : list) { roster.addPlayer(p); } @@ -882,194 +637,7 @@ public void testSetFanfactor() { } } - /** - * Test of isChaos_wizard method, of class Roster. - */ - @Test - public void testIsChaos_wizard() { - System.out.println("isChaos_wizard"); - Roster instance = new Roster(); - boolean expResult = false; - boolean result = instance.isChaos_wizard(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setChaos_wizard method, of class Roster. - */ - @Test - public void testSetChaos_wizard() { - System.out.println("setChaos_wizard"); - boolean _chaos_wizard = false; - Roster instance = new Roster(); - instance.setChaos_wizard(_chaos_wizard); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of isHoratio_X_Schottenheim method, of class Roster. - */ - @Test - public void testIsHoratio_X_Schottenheim() { - System.out.println("isHoratio_X_Schottenheim"); - Roster instance = new Roster(); - boolean expResult = false; - boolean result = instance.isHoratio_X_Schottenheim(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setHoratio_X_Schottenheim method, of class Roster. - */ - @Test - public void testSetHoratio_X_Schottenheim() { - System.out.println("setHoratio_X_Schottenheim"); - boolean Horatio_X_Schottenheim = false; - Roster instance = new Roster(); - instance.setHoratio_X_Schottenheim(Horatio_X_Schottenheim); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of isKari_Coldsteel method, of class Roster. - */ - @Test - public void testIsKari_Coldsteel() { - System.out.println("isKari_Coldsteel"); - Roster instance = new Roster(); - boolean expResult = false; - boolean result = instance.isKari_Coldsteel(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setKari_Coldsteel method, of class Roster. - */ - @Test - public void testSetKari_Coldsteel() { - System.out.println("setKari_Coldsteel"); - boolean Kari_Coldsteel = false; - Roster instance = new Roster(); - instance.setKari_Coldsteel(Kari_Coldsteel); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of isFink_Da_Fixer method, of class Roster. - */ - @Test - public void testIsFink_Da_Fixer() { - System.out.println("isFink_Da_Fixer"); - Roster instance = new Roster(); - boolean expResult = false; - boolean result = instance.isFink_Da_Fixer(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setFink_Da_Fixer method, of class Roster. - */ - @Test - public void testSetFink_Da_Fixer() { - System.out.println("setFink_Da_Fixer"); - boolean Fink_Da_Fixer = false; - Roster instance = new Roster(); - instance.setFink_Da_Fixer(Fink_Da_Fixer); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of isPapa_Skullbones method, of class Roster. - */ - @Test - public void testIsPapa_Skullbones() { - System.out.println("isPapa_Skullbones"); - Roster instance = new Roster(); - boolean expResult = false; - boolean result = instance.isPapa_Skullbones(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setPapa_Skullbones method, of class Roster. - */ - @Test - public void testSetPapa_Skullbones() { - System.out.println("setPapa_Skullbones"); - boolean Papa_Skullbones = false; - Roster instance = new Roster(); - instance.setPapa_Skullbones(Papa_Skullbones); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of isGalandril_Silverwater method, of class Roster. - */ - @Test - public void testIsGalandril_Silverwater() { - System.out.println("isGalandril_Silverwater"); - Roster instance = new Roster(); - boolean expResult = false; - boolean result = instance.isGalandril_Silverwater(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setGalandril_Silverwater method, of class Roster. - */ - @Test - public void testSetGalandril_Silverwater() { - System.out.println("setGalandril_Silverwater"); - boolean Galandril_Silverwater = false; - Roster instance = new Roster(); - instance.setGalandril_Silverwater(Galandril_Silverwater); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of isKrot_Shockwhisker method, of class Roster. - */ - @Test - public void testIsKrot_Shockwhisker() { - System.out.println("isKrot_Shockwhisker"); - Roster instance = new Roster(); - boolean expResult = false; - boolean result = instance.isKrot_Shockwhisker(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setKrot_Shockwhisker method, of class Roster. - */ - @Test - public void testSetKrot_Shockwhisker() { - System.out.println("setKrot_Shockwhisker"); - boolean Krot_Shockwhisker = false; - Roster instance = new Roster(); - instance.setKrot_Shockwhisker(Krot_Shockwhisker); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } + /** * Test of getVersion method, of class Roster. @@ -1081,8 +649,6 @@ public void testGetVersion() { LRB.E_Version expResult = null; LRB.E_Version result = instance.getVersion(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1094,8 +660,8 @@ public void testSetVersion() { LRB.E_Version _version = null; Roster instance = new Roster(); instance.setVersion(_version); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + LRB.E_Version result = instance.getVersion(); + assertEquals(result, _version); } /** @@ -1104,11 +670,12 @@ public void testSetVersion() { @Test public void testPull() { System.out.println("pull"); - Roster roster = null; +/* Roster roster = null; Roster instance = new Roster(); instance.pull(roster); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + */ + // RMI Method, not testable in testng + } } diff --git a/test/teamma/data/RosterTypeNGTest.java b/test/teamma/data/RosterTypeNGTest.java index d347d7f9..89849b44 100644 --- a/test/teamma/data/RosterTypeNGTest.java +++ b/test/teamma/data/RosterTypeNGTest.java @@ -29,7 +29,7 @@ public RosterTypeNGTest() { @BeforeClass public static void setUpClass() throws Exception { - lrb = LRB.getLRB(); + lrb = LRB.getLRB(LRB.E_Version.BB2016); } @AfterClass @@ -512,13 +512,13 @@ public void testSetApothecary_cost() { } } - /** + /** * Test of getStarPlayer method, of class RosterType. */ @Test public void testGetStarPlayer() { System.out.println("getStarPlayer"); - if (lrb == null) { + if (lrb == null) { fail("No lrb loaded"); } if (lrb.getRosterTypeCount() == 0) { @@ -536,28 +536,28 @@ public void testGetStarPlayer() { StarPlayer pt = instance.getAvailableStarplayer(j); list.add(pt.getName()); } - + for (int j = 0; j < list.size(); j++) { String key = list.get(j); - StarPlayer pt = instance.getStarPlayer(key,false); + StarPlayer pt = instance.getStarPlayer(key, false); Assert.assertNotNull(pt); Assert.assertEquals(pt, instance.getAvailableStarplayer(j)); } - + list.clear(); - + for (int j = 0; j < instance.getAvailableStarplayerCount(); j++) { StarPlayer pt = instance.getAvailableStarplayer(j); list.add(Translate.translate(pt.getName())); } - + for (int j = 0; j < list.size(); j++) { String key = list.get(j); - StarPlayer pt = instance.getStarPlayer(key,true); + StarPlayer pt = instance.getStarPlayer(key, true); Assert.assertNotNull(pt); Assert.assertEquals(pt, instance.getAvailableStarplayer(j)); } - + } else { fail("Null Roster type"); } @@ -1020,7 +1020,7 @@ public void testGetPlayerTypeCount() { int nb = instance.getPlayerTypeCount(); if (nb == 0) { fail("Number of player is null for " + instance.getName()); - } + } } else { fail("Null Roster type"); } @@ -1033,7 +1033,7 @@ public void testGetPlayerTypeCount() { @Test public void testGetPlayerType_int() { System.out.println("getPlayerType"); - if (lrb == null) { + if (lrb == null) { fail("No lrb loaded"); } if (lrb.getRosterTypeCount() == 0) { @@ -1048,11 +1048,11 @@ public void testGetPlayerType_int() { } ArrayList list = new ArrayList<>(); for (int j = 0; j < instance.getPlayerTypeCount(); j++) { - PlayerType pt=instance.getPlayerType(j); + PlayerType pt = instance.getPlayerType(j); Assert.assertNotNull(pt); list.add(pt); } - + } else { fail("Null Roster type"); } @@ -1080,11 +1080,11 @@ public void testGetAvailableStarplayer() { } ArrayList list = new ArrayList<>(); for (int j = 0; j < instance.getAvailableStarplayerCount(); j++) { - StarPlayer typ=instance.getAvailableStarplayer(j); + StarPlayer typ = instance.getAvailableStarplayer(j); Assert.assertNotNull(typ); list.add(typ); } - + } else { fail("Null Roster type"); } @@ -1097,14 +1097,14 @@ public void testGetAvailableStarplayer() { @Test public void testGetAvailableStarplayerCount() { System.out.println("getAvailableStarplayerCount"); - for (int i = 0; i < lrb.getRosterTypeCount(); i++) { + for (int i = 0; i < lrb.getRosterTypeCount(); i++) { RosterType instance = lrb.getRosterType(i); if (instance != null) { int nb = instance.getAvailableStarplayerCount(); if (nb == 0) { fail("Number availabe star player is null for " + instance.getName()); } - + } else { fail("Null Roster type"); } @@ -1173,28 +1173,28 @@ public void testGetPlayerType_String_boolean() { PlayerType pt = instance.getPlayerType(j); list.add(pt.getPosition()); } - + for (int j = 0; j < list.size(); j++) { String key = list.get(j); - PlayerType pt = instance.getPlayerType(key,false); + PlayerType pt = instance.getPlayerType(key, false); Assert.assertNotNull(pt); Assert.assertEquals(pt, instance.getPlayerType(j)); } - + list.clear(); - + for (int j = 0; j < instance.getPlayerTypeCount(); j++) { PlayerType pt = instance.getPlayerType(j); list.add(Translate.translate(pt.getPosition())); } - + for (int j = 0; j < list.size(); j++) { String key = list.get(j); - PlayerType pt = instance.getPlayerType(key,true); + PlayerType pt = instance.getPlayerType(key, true); Assert.assertNotNull(pt); Assert.assertEquals(pt, instance.getPlayerType(j)); } - + } else { fail("Null Roster type"); } @@ -1241,12 +1241,11 @@ public void testClearAvailableStarPlayerType() { @Test public void testGetVersion() { System.out.println("getVersion"); - RosterType instance = null; - LRB.E_Version expResult = null; + LRB lrb=LRB.getLRB(LRB.E_Version.BB2016); + RosterType instance = lrb.getRosterType(0); + LRB.E_Version expResult = LRB.E_Version.BB2016; LRB.E_Version result = instance.getVersion(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1255,11 +1254,11 @@ public void testGetVersion() { @Test public void testSetVersion() { System.out.println("setVersion"); - LRB.E_Version v = null; - RosterType instance = null; + LRB.E_Version v = LRB.E_Version.BB2016; + RosterType instance = new RosterType("test"); instance.setVersion(v); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + LRB.E_Version result = instance.getVersion(); + assertEquals(result, v); } /** @@ -1268,12 +1267,18 @@ public void testSetVersion() { @Test public void testIsChaos_wizard() { System.out.println("isChaos_wizard"); - RosterType instance = null; - boolean expResult = false; + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Elus du Chaos"); + + boolean expResult = true; boolean result = instance.isChaos_wizard(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Gobelins"); + + expResult = false; + result = instance.isChaos_wizard(); + assertEquals(result, expResult); + } /** @@ -1282,11 +1287,16 @@ public void testIsChaos_wizard() { @Test public void testSetChaos_wizard() { System.out.println("setChaos_wizard"); - boolean _chaos_wizard = false; - RosterType instance = null; - instance.setChaos_wizard(_chaos_wizard); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Elus du Chaos"); + + boolean expResult = true; + boolean result = instance.isChaos_wizard(); + assertEquals(result, expResult); + + instance.setChaos_wizard(false); + expResult = false; + result = instance.isChaos_wizard(); + assertEquals(result, expResult); } /** @@ -1295,11 +1305,9 @@ public void testSetChaos_wizard() { @Test public void testGetChaos_wizard_cost() { System.out.println("getChaos_wizard_cost"); - int expResult = 0; + int expResult = 150000; int result = RosterType.getChaos_wizard_cost(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1310,8 +1318,8 @@ public void testSetChaos_wizard_cost() { System.out.println("setChaos_wizard_cost"); int _chaos_wizard_cost = 0; RosterType.setChaos_wizard_cost(_chaos_wizard_cost); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + int result = RosterType.getChaos_wizard_cost(); + assertEquals(result, 0); } /** @@ -1320,11 +1328,10 @@ public void testSetChaos_wizard_cost() { @Test public void testGetHoratio_X_Schottenheim_cost() { System.out.println("getHoratio_X_Schottenheim_cost"); - int expResult = 0; + int expResult = 80000; int result = RosterType.getHoratio_X_Schottenheim_cost(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -1335,8 +1342,8 @@ public void testSetHoratio_X_Schottenheim_cost() { System.out.println("setHoratio_X_Schottenheim_cost"); int Horatio_X_Schottenheim_cost = 0; RosterType.setHoratio_X_Schottenheim_cost(Horatio_X_Schottenheim_cost); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + int result = RosterType.getHoratio_X_Schottenheim_cost(); + assertEquals(result, Horatio_X_Schottenheim_cost); } /** @@ -1345,12 +1352,17 @@ public void testSetHoratio_X_Schottenheim_cost() { @Test public void testIsKari_Coldstell() { System.out.println("isKari_Coldstell"); - RosterType instance = null; - boolean expResult = false; + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Nordiques"); + + boolean expResult = true; boolean result = instance.isKari_Coldstell(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Gobelins"); + + expResult = false; + result = instance.isKari_Coldstell(); + assertEquals(result, expResult); } /** @@ -1359,11 +1371,16 @@ public void testIsKari_Coldstell() { @Test public void testSetKari_Coldstell() { System.out.println("setKari_Coldstell"); - boolean Kari_Coldstell = false; - RosterType instance = null; - instance.setKari_Coldstell(Kari_Coldstell); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Nordiques"); + + boolean expResult = true; + boolean result = instance.isKari_Coldstell(); + assertEquals(result, expResult); + + instance.setKari_Coldstell(false); + expResult = false; + result = instance.isKari_Coldstell(); + assertEquals(result, expResult); } /** @@ -1372,11 +1389,9 @@ public void testSetKari_Coldstell() { @Test public void testGetKari_Coldstell_cost() { System.out.println("getKari_Coldstell_cost"); - int expResult = 0; + int expResult = 50000; int result = RosterType.getKari_Coldstell_cost(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1387,8 +1402,8 @@ public void testSetKari_Coldstell_cost() { System.out.println("setKari_Coldstell_cost"); int Kari_Coldstell_cost = 0; RosterType.setKari_Coldstell_cost(Kari_Coldstell_cost); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + int result = RosterType.getKari_Coldstell_cost(); + assertEquals(result, Kari_Coldstell_cost); } /** @@ -1397,12 +1412,18 @@ public void testSetKari_Coldstell_cost() { @Test public void testIsFink_Da_Fixer() { System.out.println("isFink_Da_Fixer"); - RosterType instance = null; + + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Elus du Chaos"); + boolean expResult = false; boolean result = instance.isFink_Da_Fixer(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Gobelins"); + + expResult = true; + result = instance.isFink_Da_Fixer(); + assertEquals(result, expResult); } /** @@ -1411,11 +1432,16 @@ public void testIsFink_Da_Fixer() { @Test public void testSetFink_Da_Fixer() { System.out.println("setFink_Da_Fixer"); - boolean Fink_Da_Fixer = false; - RosterType instance = null; - instance.setFink_Da_Fixer(Fink_Da_Fixer); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Gobelins"); + + boolean expResult = true; + boolean result = instance.isFink_Da_Fixer(); + assertEquals(result, expResult); + + instance.setFink_Da_Fixer(false); + expResult = false; + result = instance.isFink_Da_Fixer(); + assertEquals(result, expResult); } /** @@ -1424,11 +1450,9 @@ public void testSetFink_Da_Fixer() { @Test public void testGetFink_Da_Fixer_cost() { System.out.println("getFink_Da_Fixer_cost"); - int expResult = 0; + int expResult = 50000; int result = RosterType.getFink_Da_Fixer_cost(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1439,8 +1463,8 @@ public void testSetFink_Da_Fixer_cost() { System.out.println("setFink_Da_Fixer_cost"); int Fink_Da_Fixer_cost = 0; RosterType.setFink_Da_Fixer_cost(Fink_Da_Fixer_cost); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + int result = RosterType.getFink_Da_Fixer_cost(); + assertEquals(result, 0); } /** @@ -1449,12 +1473,17 @@ public void testSetFink_Da_Fixer_cost() { @Test public void testIsPapa_Skullbones() { System.out.println("isPapa_Skullbones"); - RosterType instance = null; - boolean expResult = false; + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Renégats du Chaos"); + + boolean expResult = true; boolean result = instance.isPapa_Skullbones(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Gobelins"); + + expResult = false; + result = instance.isPapa_Skullbones(); + assertEquals(result, expResult); } /** @@ -1463,11 +1492,16 @@ public void testIsPapa_Skullbones() { @Test public void testSetPapa_Skullbones() { System.out.println("setPapa_Skullbones"); - boolean Papa_Skullbones = false; - RosterType instance = null; - instance.setPapa_Skullbones(Papa_Skullbones); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Renégats du Chaos"); + + boolean expResult = true; + boolean result = instance.isPapa_Skullbones(); + assertEquals(result, expResult); + + instance.setPapa_Skullbones(false); + expResult = false; + result = instance.isPapa_Skullbones(); + assertEquals(result, expResult); } /** @@ -1476,11 +1510,9 @@ public void testSetPapa_Skullbones() { @Test public void testGetPapa_Skullbones_cost() { System.out.println("getPapa_Skullbones_cost"); - int expResult = 0; + int expResult = 80000; int result = RosterType.getPapa_Skullbones_cost(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1491,8 +1523,8 @@ public void testSetPapa_Skullbones_cost() { System.out.println("setPapa_Skullbones_cost"); int Papa_Skullbones_cost = 0; RosterType.setPapa_Skullbones_cost(Papa_Skullbones_cost); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + int result = RosterType.getPapa_Skullbones_cost(); + assertEquals(result, Papa_Skullbones_cost); } /** @@ -1501,12 +1533,18 @@ public void testSetPapa_Skullbones_cost() { @Test public void testIsGalandril_Silverwater() { System.out.println("isGalandril_Silverwater"); - RosterType instance = null; - boolean expResult = false; + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Union Elfique"); + + boolean expResult = true; boolean result = instance.isGalandril_Silverwater(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Gobelins"); + + expResult = false; + result = instance.isGalandril_Silverwater(); + assertEquals(result, expResult); + } /** @@ -1515,11 +1553,16 @@ public void testIsGalandril_Silverwater() { @Test public void testSetGalandril_Silverwater() { System.out.println("setGalandril_Silverwater"); - boolean Galandril_Silverwater = false; - RosterType instance = null; - instance.setGalandril_Silverwater(Galandril_Silverwater); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Union Elfique"); + + boolean expResult = true; + boolean result = instance.isGalandril_Silverwater(); + assertEquals(result, expResult); + + instance.setGalandril_Silverwater(false); + expResult = false; + result = instance.isGalandril_Silverwater(); + assertEquals(result, expResult); } /** @@ -1528,11 +1571,9 @@ public void testSetGalandril_Silverwater() { @Test public void testGetGalandril_Silverwater_cost() { System.out.println("getGalandril_Silverwater_cost"); - int expResult = 0; + int expResult = 50000; int result = RosterType.getGalandril_Silverwater_cost(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1543,8 +1584,8 @@ public void testSetGalandril_Silverwater_cost() { System.out.println("setGalandril_Silverwater_cost"); int Galandril_Silverwater_cost = 0; RosterType.setGalandril_Silverwater_cost(Galandril_Silverwater_cost); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + int result = RosterType.getGalandril_Silverwater_cost(); + assertEquals(result, 0); } /** @@ -1553,12 +1594,17 @@ public void testSetGalandril_Silverwater_cost() { @Test public void testIsKrot_Shockwhisker() { System.out.println("isKrot_Shockwhisker"); - RosterType instance = null; - boolean expResult = false; + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Skavens"); + + boolean expResult = true; boolean result = instance.isKrot_Shockwhisker(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Gobelins"); + + expResult = false; + result = instance.isKrot_Shockwhisker(); + assertEquals(result, expResult); } /** @@ -1567,11 +1613,16 @@ public void testIsKrot_Shockwhisker() { @Test public void testSetKrot_Shockwhisker() { System.out.println("setKrot_Shockwhisker"); - boolean Krot_Shockwhisker = false; - RosterType instance = null; - instance.setKrot_Shockwhisker(Krot_Shockwhisker); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + RosterType instance = LRB.getLRB(LRB.E_Version.BB2016).getRosterType("Skavens"); + + boolean expResult = true; + boolean result = instance.isKrot_Shockwhisker(); + assertEquals(result, expResult); + + instance.setKrot_Shockwhisker(false); + expResult = false; + result = instance.isKrot_Shockwhisker(); + assertEquals(result, expResult); } /** @@ -1580,11 +1631,10 @@ public void testSetKrot_Shockwhisker() { @Test public void testGetKrot_Shockwhisker_cost() { System.out.println("getKrot_Shockwhisker_cost"); - int expResult = 0; + int expResult = 80000; int result = RosterType.getKrot_Shockwhisker_cost(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -1595,8 +1645,8 @@ public void testSetKrot_Shockwhisker_cost() { System.out.println("setKrot_Shockwhisker_cost"); int Krot_Shockwhisker_cost = 0; RosterType.setKrot_Shockwhisker_cost(Krot_Shockwhisker_cost); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + int result = RosterType.getKrot_Shockwhisker_cost(); + assertEquals(result, Krot_Shockwhisker_cost); } } diff --git a/test/teamma/data/SkillNGTest.java b/test/teamma/data/SkillNGTest.java index 96eb19a5..07283edc 100644 --- a/test/teamma/data/SkillNGTest.java +++ b/test/teamma/data/SkillNGTest.java @@ -28,7 +28,7 @@ public SkillNGTest() { @BeforeClass public static void setUpClass() throws Exception { - lrb = LRB.getLRB(); + lrb = LRB.getLRB(LRB.E_Version.BB2016); } @AfterClass diff --git a/test/teamma/data/SkillTypeNGTest.java b/test/teamma/data/SkillTypeNGTest.java index c445b600..f06fca52 100644 --- a/test/teamma/data/SkillTypeNGTest.java +++ b/test/teamma/data/SkillTypeNGTest.java @@ -28,7 +28,7 @@ public SkillTypeNGTest() { @BeforeClass public static void setUpClass() throws Exception { - lrb = LRB.getLRB(); + lrb = LRB.getLRB(LRB.E_Version.BB2016); } @AfterClass diff --git a/test/teamma/data/StarPlayerNGTest.java b/test/teamma/data/StarPlayerNGTest.java index c0190711..b13e867c 100644 --- a/test/teamma/data/StarPlayerNGTest.java +++ b/test/teamma/data/StarPlayerNGTest.java @@ -24,7 +24,7 @@ public class StarPlayerNGTest { @BeforeClass public static void setUpClass() throws Exception { - lrb = LRB.getLRB(); + lrb = LRB.getLRB(LRB.E_Version.BB2016); } @AfterClass @@ -420,7 +420,11 @@ public void testGetCost() { if (instance != null) { int result = instance.getCost(); - if ((result == 0)&&(!instance.getName().equals("Grotty"))) { + if ((result == 0)&&(!instance.getName().equals("Grotty *CRP*")) + &&(!instance.getName().equals("Crumbleberry *BB2016*")) + &&(!instance.getName().equals("Valen Swift *BB2016*")) + &&(!instance.getName().equals("Grombrindal, The White Dwarf *Special Event*")) + &&(!instance.getName().equals("The Black Gobbo *Special Event*"))) { fail("cost is null for "+instance.getName()); } } else { diff --git a/test/teamma/tableModel/MjtPlayerTypesNGTest.java b/test/teamma/tableModel/MjtPlayerTypesNGTest.java index e55612d3..adf0ee49 100644 --- a/test/teamma/tableModel/MjtPlayerTypesNGTest.java +++ b/test/teamma/tableModel/MjtPlayerTypesNGTest.java @@ -6,6 +6,8 @@ package teamma.tableModel; import java.awt.Component; +import java.util.ArrayList; +import javax.swing.JEditorPane; import javax.swing.JTable; import static org.testng.Assert.*; import org.testng.annotations.AfterClass; @@ -13,6 +15,10 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import teamma.data.LRB; +import teamma.data.PlayerType; +import teamma.data.RosterType; +import tourma.data.Tournament; /** * @@ -25,6 +31,7 @@ public MjtPlayerTypesNGTest() { @BeforeClass public static void setUpClass() throws Exception { + } @AfterClass @@ -45,12 +52,18 @@ public void tearDownMethod() throws Exception { @Test public void testGetColumnCount() { System.out.println("getColumnCount"); - MjtPlayerTypes instance = null; - int expResult = 0; + LRB lrb=LRB.getLRB(LRB.E_Version.BB2016); + RosterType rt=lrb.getRosterType(0); + ArrayList ar=new ArrayList<>(); + for (int i=0; i ar=new ArrayList<>(); + for (int i=0; i ar=new ArrayList<>(); + for (int i=0; i ar=new ArrayList<>(); + for (int i=0; i ar=new ArrayList<>(); + for (int i=0; i ar=new ArrayList<>(); + for (int i=0; i ar=new ArrayList<>(); + for (int i=0; i ar = new ArrayList<>(); + for (int i = 0; i < lrb.getStarPlayerCount(); i++) { + ar.add(lrb.getStarPlayer(i)); + } + MjtStarPlayers instance = new MjtStarPlayers(ar); + int expResult = 8; int result = instance.getColumnCount(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -59,12 +69,16 @@ public void testGetColumnCount() { @Test public void testGetRowCount() { System.out.println("getRowCount"); - MjtStarPlayers instance = null; - int expResult = 0; + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); + ArrayList ar = new ArrayList<>(); + for (int i = 0; i < lrb.getStarPlayerCount(); i++) { + ar.add(lrb.getStarPlayer(i)); + } + MjtStarPlayers instance = new MjtStarPlayers(ar); + int expResult = 75; int result = instance.getRowCount(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -73,13 +87,17 @@ public void testGetRowCount() { @Test public void testGetColumnName() { System.out.println("getColumnName"); - int col = 0; - MjtStarPlayers instance = null; - String expResult = ""; + int col = 1; + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); + ArrayList ar = new ArrayList<>(); + for (int i = 0; i < lrb.getStarPlayerCount(); i++) { + ar.add(lrb.getStarPlayer(i)); + } + MjtStarPlayers instance = new MjtStarPlayers(ar); + String expResult = "Position"; String result = instance.getColumnName(col); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -90,12 +108,16 @@ public void testGetValueAt() { System.out.println("getValueAt"); int row = 0; int col = 0; - MjtStarPlayers instance = null; - Object expResult = null; + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); + ArrayList ar = new ArrayList<>(); + for (int i = 0; i < lrb.getStarPlayerCount(); i++) { + ar.add(lrb.getStarPlayer(i)); + } + MjtStarPlayers instance = new MjtStarPlayers(ar); + Object expResult = "Bertha Bigfist *CRP*"; Object result = instance.getValueAt(row, col); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -105,12 +127,17 @@ public void testGetValueAt() { public void testGetColumnClass() { System.out.println("getColumnClass"); int c = 0; - MjtStarPlayers instance = null; - Class expResult = null; + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); + ArrayList ar = new ArrayList<>(); + for (int i = 0; i < lrb.getStarPlayerCount(); i++) { + ar.add(lrb.getStarPlayer(i)); + } + MjtStarPlayers instance = new MjtStarPlayers(ar); + + Class expResult = String.class; Class result = instance.getColumnClass(c); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -121,12 +148,16 @@ public void testIsCellEditable() { System.out.println("isCellEditable"); int row = 0; int col = 0; - MjtStarPlayers instance = null; + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); + ArrayList ar = new ArrayList<>(); + for (int i = 0; i < lrb.getStarPlayerCount(); i++) { + ar.add(lrb.getStarPlayer(i)); + } + MjtStarPlayers instance = new MjtStarPlayers(ar); boolean expResult = false; boolean result = instance.isCellEditable(row, col); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -135,18 +166,22 @@ public void testIsCellEditable() { @Test public void testGetTableCellRendererComponent() { System.out.println("getTableCellRendererComponent"); - JTable table = null; - Object value = null; + Object value = "toto"; boolean isSelected = false; boolean hasFocus = false; int row = 0; int column = 0; - MjtStarPlayers instance = null; + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); + ArrayList ar = new ArrayList<>(); + for (int i = 0; i < lrb.getStarPlayerCount(); i++) { + ar.add(lrb.getStarPlayer(i)); + } + MjtStarPlayers instance = new MjtStarPlayers(ar); + JTable table = new JTable(instance); Component expResult = null; Component result = instance.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertTrue(result instanceof JEditorPane); + } - + } diff --git a/test/teamma/tableModel/MjtTeamPlayersNGTest.java b/test/teamma/tableModel/MjtTeamPlayersNGTest.java index a0b71962..5fa5ee59 100644 --- a/test/teamma/tableModel/MjtTeamPlayersNGTest.java +++ b/test/teamma/tableModel/MjtTeamPlayersNGTest.java @@ -39,7 +39,7 @@ public MjtTeamPlayersNGTest() { @BeforeClass public static void setUpClass() throws Exception { - lrb = LRB.getLRB(); + lrb = LRB.getLRB(LRB.E_Version.BB2016); } @AfterClass @@ -167,7 +167,7 @@ public void testGetValueAt() { Object o1 = instance.getValueAt(i, 1); Assert.assertTrue(o1 instanceof String); - Assert.assertEquals((String) o1, Translate.translate(player.getName())); + Assert.assertEquals((String) o1, player.getName()); Object o2 = instance.getValueAt(i, 2); Assert.assertTrue(o2 instanceof String); diff --git a/test/teamma/tableModel/MjtTeamStarsNGTest.java b/test/teamma/tableModel/MjtTeamStarsNGTest.java index 97e0f185..734d0a2b 100644 --- a/test/teamma/tableModel/MjtTeamStarsNGTest.java +++ b/test/teamma/tableModel/MjtTeamStarsNGTest.java @@ -37,7 +37,7 @@ public MjtTeamStarsNGTest() { @BeforeClass public static void setUpClass() throws Exception { - lrb = LRB.getLRB(); + lrb = LRB.getLRB(LRB.E_Version.BB2016); } @AfterClass diff --git a/test/teamma/views/JdgRosterNGTest.java b/test/teamma/views/JdgRosterNGTest.java index 65fd2659..d6b25471 100644 --- a/test/teamma/views/JdgRosterNGTest.java +++ b/test/teamma/views/JdgRosterNGTest.java @@ -17,6 +17,7 @@ import java.util.logging.Logger; import org.fest.swing.core.BasicRobot; import org.fest.swing.core.Robot; +import org.fest.swing.finder.WindowFinder; import org.fest.swing.fixture.DialogFixture; import org.testng.Assert; import static org.testng.Assert.fail; @@ -40,7 +41,7 @@ public JdgRosterNGTest() { } private static Robot robot; - + @BeforeClass public static void setUpClass() throws Exception { robot = BasicRobot.robotWithNewAwtHierarchy(); @@ -56,7 +57,7 @@ public static void tearDownClass() throws Exception { public void setUpMethod() throws Exception { jdg = new JdgRoster(null, true); - window = new DialogFixture(robot,jdg); + window = new DialogFixture(robot, jdg); window.show(); } @@ -80,15 +81,18 @@ public void hmiGeneralTest() { window.optionPane().okButton().click(); Thread.sleep(200); String text = window.label("jlbRosterType").text(); - Assert.assertEquals(text, "Roster: Chaos"); + Assert.assertEquals(text, "Roster: Elus du Chaos"); // Select tab and Add StarPlayers window.tabbedPane("jtpGoods").selectTab(2); Assert.assertFalse(window.button("jbtDelChampion").component().isEnabled()); window.button("jbtAddChampion").click(); Thread.sleep(500); - window.optionPane().comboBox().selectItem(1); - window.optionPane().okButton().click(); + + DialogFixture window2 = WindowFinder.findDialog(JdgSelectPosition.class).withTimeout(10000).using(robot); + Thread.sleep(500); + window2.table("jtPositions").selectRows(1); + window2.button("ok").click(); Thread.sleep(200); Assert.assertTrue(window.table("jtbStars").rowCount() == 1); Assert.assertFalse(window.button("jbtDelChampion").component().isEnabled()); @@ -101,7 +105,7 @@ public void hmiGeneralTest() { // Select tab and Choose Inducements window.tabbedPane("jtpGoods").selectTab(1); - String array[] = {"ExtraReroll", "BribeTheRef", "LocalApothecary", "Wizard", "Igor", "Babes", "Chef"}; + String array[] = {"ExtraReroll", "BribeTheRef", "LocalApothecary", "Wizard", "Igor", "Babes", "Chef", "ChaosWizard", "Horatio", "Kari", "Fink", "Papa", "Galandril", "Krot"}; for (String ext : array) { if (window.slider("jsl" + ext).component().isEnabled()) { window.slider("jsl" + ext).slideToMaximum(); @@ -139,8 +143,8 @@ public void hmiGeneralTest() { for (String ext : array2) { if (window.slider("jsl" + ext).component().isEnabled()) { System.out.println(ext); - - window.slider("jsl" + ext).slideToMaximum(); + + window.slider("jsl" + ext).slideToMaximum(); String cost = window.label("jlbCost" + ext).text(); String nb = window.label("jlbNb" + ext).text(); String price = window.label("jlbPrice" + ext).text(); @@ -152,8 +156,10 @@ public void hmiGeneralTest() { for (int i = 0; i < 5; i++) { window.button("jbtAdd").click(); Thread.sleep(500); - window.optionPane().comboBox().selectItem(0); - window.optionPane().okButton().click(); + DialogFixture window3 = WindowFinder.findDialog(JdgSelectPosition.class).withTimeout(10000).using(robot); + Thread.sleep(500); + window3.table("jtPositions").selectRows(0); + window3.button("ok").click(); Thread.sleep(200); Assert.assertTrue(window.table("jtbPlayers").rowCount() == i + 1); window.table("jtbPlayers").selectRows(i); @@ -162,64 +168,61 @@ public void hmiGeneralTest() { Assert.assertTrue(window.table("jtbPlayers").rowCount() == i); window.button("jbtAdd").click(); Thread.sleep(500); - window.optionPane().comboBox().selectItem(0); - window.optionPane().okButton().click(); + DialogFixture window4 = WindowFinder.findDialog(JdgSelectPosition.class).withTimeout(10000).using(robot); + Thread.sleep(500); + window4.table("jtPositions").selectRows(0); + window4.button("ok").click(); } - LRB lrb=LRB.getLRB(); + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); // Add Skills to Players - for (int i = 0; i <5; i++) { + for (int i = 0; i < 5; i++) { Thread.sleep(500); - for (int j=0; j ar = new ArrayList<>(); + for (int i = 0; i < roster.getRoster().getPlayerTypeCount(); i++) { + PlayerType pt = roster.getRoster().getPlayerType(i); + ar.add(pt); + } + + jdg1 = new JdgSelectPosition(null, true, ar, ar.get(0)); + + ArrayList ar2 = new ArrayList<>(); + for (int i = 0; i < roster.getRoster().getAvailableStarplayerCount(); i++) { + StarPlayer pt = roster.getRoster().getAvailableStarplayer(i); + ar2.add(pt); + } + + jdg2 = new JdgSelectPosition(null, true, ar2, ar2.get(0)); } @AfterMethod public void tearDownMethod() throws Exception { + jdg1.setVisible(false); + jdg2.setVisible(false); } /** @@ -45,12 +95,23 @@ public void tearDownMethod() throws Exception { @Test public void testGetPosition() { System.out.println("getPosition"); - JdgSelectPosition instance = null; - PlayerType expResult = null; - PlayerType result = instance.getPosition(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + try { + window = new DialogFixture(robot, jdg1); + window.show(); + Thread.sleep(500); + window.table("jtPositions").selectRows(1); + Assert.assertEquals(window.table("jtPositions").component().getRowCount(), roster.getRoster().getPlayerTypeCount()); + Thread.sleep(500); + window.button("ok").click(); + + window.cleanUp(); + window = null; + } catch (InterruptedException ex) { + fail("Exception catched"); + Logger.getLogger(JdgSelectSkillNGTest.class.getName()).log(Level.SEVERE, null, ex); + } + } /** @@ -59,12 +120,21 @@ public void testGetPosition() { @Test public void testGetStarPlayer() { System.out.println("getStarPlayer"); - JdgSelectPosition instance = null; - StarPlayer expResult = null; - StarPlayer result = instance.getStarPlayer(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + try { + window = new DialogFixture(robot, jdg2); + window.show(); + Thread.sleep(500); + window.table("jtPositions").selectRows(1); + Assert.assertEquals(window.table("jtPositions").component().getRowCount(), roster.getRoster().getAvailableStarplayerCount()); + Thread.sleep(500); + window.button("ok").click(); + + window.cleanUp(); + window = null; + } catch (InterruptedException ex) { + fail("Exception catched"); + Logger.getLogger(JdgSelectSkillNGTest.class.getName()).log(Level.SEVERE, null, ex); + } } - + } diff --git a/test/teamma/views/JdgSelectSkillNGTest.java b/test/teamma/views/JdgSelectSkillNGTest.java index 65385022..d3d5d113 100644 --- a/test/teamma/views/JdgSelectSkillNGTest.java +++ b/test/teamma/views/JdgSelectSkillNGTest.java @@ -11,6 +11,7 @@ import org.fest.swing.core.BasicRobot; import org.fest.swing.core.Robot; import org.fest.swing.fixture.DialogFixture; +import org.fest.swing.fixture.JComboBoxFixture; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.testng.Assert; @@ -30,6 +31,7 @@ */ public class JdgSelectSkillNGTest { + private DialogFixture window; private Roster roster; JdgSelectSkill jdg; @@ -60,16 +62,17 @@ public void setUpMethod() throws Exception { roster.setXMLElement(racine); // Remove local apothecary, because the team is an unded team - roster.setLocalapothecary(0); + player = roster.getPlayer(0); - jdg = new JdgSelectSkill(null, true, player); + jdg = new JdgSelectSkill(null, true, player,LRB.getLRB(LRB.E_Version.BB2016)); window = new DialogFixture(robot, jdg); window.show(); } @AfterMethod public void tearDownMethod() throws Exception { - window.close(); + jdg.setVisible(false); + //window.close(); window.cleanUp(); window = null; } @@ -81,9 +84,12 @@ public void tearDownMethod() throws Exception { public void hmiGeneralTest() { System.out.println("hmiGeneralTest"); try { - LRB lrb = LRB.getLRB(); + LRB lrb = LRB.getLRB(LRB.E_Version.BB2016); + + JComboBoxFixture jcbf=window.comboBox("jcbGeneral"); + jcbf.component().setEnabled(true); window.comboBox("jcbGeneral").selectItem(1); - Thread.sleep(200); + Thread.sleep(500); int nb = player.getSkillCount(); Assert.assertEquals(nb, player.getSkillCount()); window.button("cancel").click(); diff --git a/test/teamma/views/report/JdgPrintableRosterNGTest.java b/test/teamma/views/report/JdgPrintableRosterNGTest.java index ac0ed809..4da81284 100644 --- a/test/teamma/views/report/JdgPrintableRosterNGTest.java +++ b/test/teamma/views/report/JdgPrintableRosterNGTest.java @@ -60,8 +60,6 @@ public void setUpMethod() throws Exception { roster = new Roster(); roster.setXMLElement(racine); - // Remove local apothecary, because the team is an unded team - roster.setLocalapothecary(0); jdg = new JdgPrintableRoster(null, true, roster, null, true); @@ -91,7 +89,7 @@ public void hmiGeneralTest() { Thread.sleep(500); boolean equals = compareTwoFiles("tmp.html", "test/necros.html"); Assert.assertTrue(equals); - Files.delete(f.toPath()); + //Files.delete(f.toPath()); } catch (InterruptedException ex) { fail("Exception catched"); diff --git a/test/tourma/JdgChangePairingNGTest.java b/test/tourma/JdgChangePairingNGTest.java index f6b96e86..5afc9bf9 100644 --- a/test/tourma/JdgChangePairingNGTest.java +++ b/test/tourma/JdgChangePairingNGTest.java @@ -17,6 +17,7 @@ import org.fest.swing.fixture.JOptionPaneFixture; import org.fest.swing.fixture.JPanelFixture; import org.testng.Assert; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/JdgCoachNGTest.java b/test/tourma/JdgCoachNGTest.java index 2b8f56b1..84ecc681 100644 --- a/test/tourma/JdgCoachNGTest.java +++ b/test/tourma/JdgCoachNGTest.java @@ -11,6 +11,7 @@ import org.fest.swing.core.Robot; import org.fest.swing.fixture.DialogFixture; import static org.testng.Assert.fail; +import static org.testng.Assert.assertEquals; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/JdgTeamNGTest.java b/test/tourma/JdgTeamNGTest.java index da07fa58..93ce0a9b 100644 --- a/test/tourma/JdgTeamNGTest.java +++ b/test/tourma/JdgTeamNGTest.java @@ -11,6 +11,7 @@ import org.fest.swing.core.Robot; import org.fest.swing.fixture.DialogFixture; import static org.testng.Assert.fail; +import static org.testng.Assert.assertEquals; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/data/CategoryNGTest.java b/test/tourma/data/CategoryNGTest.java index 6358e042..f2386243 100644 --- a/test/tourma/data/CategoryNGTest.java +++ b/test/tourma/data/CategoryNGTest.java @@ -8,9 +8,11 @@ import java.io.File; import java.util.ArrayList; import java.util.Objects; +import java.util.Random; import org.jdom.Element; import org.testng.Assert; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -28,7 +30,8 @@ public CategoryNGTest() { @BeforeClass public static void setUpClass() throws Exception { - Tournament.getTournament().loadXML(new File("./test/category.xml")); + Tournament t=Tournament.getTournament(); + t.loadXML(new File("./test/category.xml")); } @AfterClass @@ -193,7 +196,7 @@ public void testGetName() { } /** - * Test of setmName method, of class Category. + * Test of setName method, of class Category. */ @Test public void testSetmName() { @@ -201,7 +204,7 @@ public void testSetmName() { String s = "TestCategory"; Category c = new Category(s); assertEquals(c.getName(), s); - c.setmName("Test"); + c.setName("Test"); assertEquals(c.getName(), "Test"); } @@ -239,12 +242,12 @@ public void testToString() { @Test public void testGetUID() { System.out.println("getUID"); - Category instance = null; - int expResult = 0; - int result = instance.getUID(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Random ran=new Random(1000); + int UID = ran.nextInt(); + Category instance = new Category("UID"); + instance.setUID(UID); + assertEquals(UID, instance.getUID()); + } /** @@ -253,11 +256,11 @@ public void testGetUID() { @Test public void testSetUID() { System.out.println("setUID"); - int UID = 0; - Category instance = null; + Random ran=new Random(1000); + int UID = ran.nextInt(); + Category instance = new Category("UID"); instance.setUID(UID); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(UID, instance.getUID()); } /** @@ -265,12 +268,7 @@ public void testSetUID() { */ @Test public void testPull() { - System.out.println("pull"); - Category cat = null; - Category instance = null; - instance.pull(cat); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + System.out.println("pull - Ignore, RMI test"); } } diff --git a/test/tourma/data/ClanNGTest.java b/test/tourma/data/ClanNGTest.java index 39e60bee..2d3ba5b7 100644 --- a/test/tourma/data/ClanNGTest.java +++ b/test/tourma/data/ClanNGTest.java @@ -9,11 +9,13 @@ import java.io.File; import java.util.ArrayList; import java.util.Objects; +import java.util.Random; import javax.swing.ImageIcon; import org.jdom.Element; import org.testng.Assert; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -192,10 +194,10 @@ public void testGetPicture() { ImageIcon icon = new ImageIcon("./test/clan.png"); BufferedImage p = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); Clan instance = new Clan("Test"); - instance.setPicture(p); + instance.setPicture(icon); assertNotNull(instance.getPicture()); - assertEquals(p,instance.getPicture()); + assertEquals(icon,instance.getPicture()); } /** @@ -208,10 +210,10 @@ public void testSetPicture() { ImageIcon icon = new ImageIcon("./test/clan.png"); BufferedImage p = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); Clan instance = new Clan("Test"); - instance.setPicture(p); + instance.setPicture(icon); assertNotNull(instance.getPicture()); - assertEquals(p,instance.getPicture()); + assertEquals(icon,instance.getPicture()); } /** @@ -260,12 +262,10 @@ public void testDelClan() { @Test public void testIsUpdated() { System.out.println("isUpdated"); - Clan instance = null; + Clan instance = new Clan("Clan"); boolean expResult = false; boolean result = instance.isUpdated(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -275,10 +275,16 @@ public void testIsUpdated() { public void testSetUpdated() { System.out.println("setUpdated"); boolean updated = false; - Clan instance = null; + Clan instance = new Clan("Clan");; instance.setUpdated(updated); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean result = instance.isUpdated(); + assertEquals(result, updated); + + updated = true; + + instance.setUpdated(updated); + result = instance.isUpdated(); + assertEquals(result, updated); } /** @@ -287,12 +293,11 @@ public void testSetUpdated() { @Test public void testGetUID() { System.out.println("getUID"); - Clan instance = null; - int expResult = 0; - int result = instance.getUID(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Random ran=new Random(1000); + int UID = ran.nextInt(); + Clan instance = new Clan("UID"); + instance.setUID(UID); + assertEquals(UID, instance.getUID()); } /** @@ -300,12 +305,11 @@ public void testGetUID() { */ @Test public void testSetUID() { - System.out.println("setUID"); - int UID = 0; - Clan instance = null; + Random ran=new Random(1000); + int UID = ran.nextInt(); + Clan instance = new Clan("UID"); instance.setUID(UID); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(UID, instance.getUID()); } /** @@ -314,11 +318,7 @@ public void testSetUID() { @Test public void testPull() { System.out.println("pull"); - Clan clan = null; - Clan instance = null; - instance.pull(clan); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -327,11 +327,7 @@ public void testPull() { @Test public void testPush() { System.out.println("push"); - Clan clan = null; - Clan instance = null; - instance.push(clan); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } } diff --git a/test/tourma/data/CoachMatchNGTest.java b/test/tourma/data/CoachMatchNGTest.java index 4709900c..7e625d74 100644 --- a/test/tourma/data/CoachMatchNGTest.java +++ b/test/tourma/data/CoachMatchNGTest.java @@ -38,9 +38,11 @@ public static void setUpClass() throws Exception { public static void tearDownClass() throws Exception { } + Tournament t; @BeforeMethod public void setUpMethod() throws Exception { - Tournament.getTournament().loadXML(new File("./test/coachMatch.xml")); + t=Tournament.getTournament(); + t.loadXML(new File("./test/coachMatch.xml")); } @AfterMethod @@ -804,12 +806,11 @@ public void testGetValues() { @Test public void testIsRemotely() { System.out.println("isRemotely"); - CoachMatch instance = null; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); boolean expResult = false; boolean result = instance.isRemotely(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -819,10 +820,11 @@ public void testIsRemotely() { public void testSetRemotely() { System.out.println("setRemotely"); boolean isRemotely = false; - CoachMatch instance = null; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); + instance.setRemotely(isRemotely); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Assert.assertFalse(instance.isRemotely()); } /** @@ -831,12 +833,12 @@ public void testSetRemotely() { @Test public void testGetUID() { System.out.println("getUID"); - CoachMatch instance = null; - int expResult = 0; - int result = instance.getUID(); + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + int expResult = 242; + int result = c.getUID(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -846,10 +848,10 @@ public void testGetUID() { public void testSetUID() { System.out.println("setUID"); int UID = 0; - CoachMatch instance = null; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); instance.setUID(UID); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(instance.getUID(),UID); } /** @@ -858,12 +860,12 @@ public void testSetUID() { @Test public void testIsUpdated() { System.out.println("isUpdated"); - CoachMatch instance = null; - boolean expResult = false; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); + + boolean expResult = true; boolean result = instance.isUpdated(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -874,9 +876,7 @@ public void testPull() { System.out.println("pull"); Match match = null; CoachMatch instance = null; - instance.pull(match); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); +// instance.pull(match); } /** @@ -887,9 +887,7 @@ public void testPush() { System.out.println("push"); Match match = null; CoachMatch instance = null; - instance.push(match); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); +// instance.push(match); } /** @@ -899,10 +897,11 @@ public void testPush() { public void testSetUpdated() { System.out.println("setUpdated"); boolean updated = false; - CoachMatch instance = null; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); + instance.setUpdated(updated); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Assert.assertFalse(instance.isRemotely()); } /** @@ -911,13 +910,11 @@ public void testSetUpdated() { @Test public void testGetGroupModifier() { System.out.println("getGroupModifier"); - Coach c = null; - CoachMatch m = null; +Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); int expResult = 0; int result = CoachMatch.getGroupModifier(c, m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -926,13 +923,16 @@ public void testGetGroupModifier() { @Test public void testGetValue_Criteria() { System.out.println("getValue"); - Criteria c = null; - CoachMatch instance = null; - Value expResult = null; - Value result = instance.getValue(c); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Criteria crit = t.getParams().getCriteria(0); + + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + Value expResult = new Value(crit); + expResult.setValue1(4); + expResult.setValue2(3); + Value result = m.getValue(crit); + assertEquals(result.getValue1(), expResult.getValue1()); + assertEquals(result.getValue2(), expResult.getValue2()); } /** @@ -941,10 +941,10 @@ public void testGetValue_Criteria() { @Test public void testRecomputeValues() { System.out.println("recomputeValues"); - CoachMatch instance = null; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); + instance.recomputeValues(); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -954,11 +954,9 @@ public void testRecomputeValues() { public void testGetSubtypeByValue() { System.out.println("getSubtypeByValue"); int valueType = 0; - int expResult = 0; + int expResult = -1; int result = CoachMatch.getSubtypeByValue(valueType); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -971,8 +969,6 @@ public void testGetCriteriaByValue() { Criteria expResult = null; Criteria result = CoachMatch.getCriteriaByValue(valueType); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -982,13 +978,11 @@ public void testGetCriteriaByValue() { public void testRecomputeValue() { System.out.println("recomputeValue"); int index = 0; - Competitor c = null; - CoachMatch instance = null; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); int expResult = 0; int result = instance.recomputeValue(index, c); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -997,14 +991,13 @@ public void testRecomputeValue() { @Test public void testGetValue_Coach_int() { System.out.println("getValue"); - Coach c = null; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + Criteria crit=t.getParams().getCriteria(0); int valueType = 0; - CoachMatch instance = null; int expResult = 0; - int result = instance.getValue(c, valueType); + int result = m.getValue(c, valueType); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1013,14 +1006,12 @@ public void testGetValue_Coach_int() { @Test public void testGetOppPointsByCoach() { System.out.println("getOppPointsByCoach"); - Coach c = null; - CoachMatch m = null; +Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); boolean includeCurrent = false; - int expResult = 0; + int expResult = 1827; int result = CoachMatch.getOppPointsByCoach(c, m, includeCurrent); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1029,13 +1020,13 @@ public void testGetOppPointsByCoach() { @Test public void testGetCoachNbMatchs() { System.out.println("getCoachNbMatchs"); - Coach c = null; - CoachMatch m = null; - int expResult = 0; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch)c.getMatch(0); + int expResult = 1; + int result = CoachMatch.getCoachNbMatchs(c, m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -1044,13 +1035,11 @@ public void testGetCoachNbMatchs() { @Test public void testGetCoachTablePoints() { System.out.println("getCoachTablePoints"); - Coach c = null; - CoachMatch m = null; - int expResult = 0; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + int expResult = 3; int result = CoachMatch.getCoachTablePoints(c, m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1059,13 +1048,11 @@ public void testGetCoachTablePoints() { @Test public void testGetOppELOByCoach() { System.out.println("getOppELOByCoach"); - Coach c = null; - CoachMatch m = null; - int expResult = 0; +Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + int expResult = 853; int result = CoachMatch.getOppELOByCoach(c, m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1074,13 +1061,11 @@ public void testGetOppELOByCoach() { @Test public void testGetVNDByCoach() { System.out.println("getVNDByCoach"); - Coach c = null; - CoachMatch m = null; - int expResult = 0; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + int expResult = 1000000; int result = CoachMatch.getVNDByCoach(c, m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1089,13 +1074,11 @@ public void testGetVNDByCoach() { @Test public void testGetELOByCoach() { System.out.println("getELOByCoach"); - Coach c = null; - CoachMatch m = null; - int expResult = 0; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + int expResult = 1012; int result = CoachMatch.getELOByCoach(c, m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1104,14 +1087,12 @@ public void testGetELOByCoach() { @Test public void testGetCriteriaBonusPoints() { System.out.println("getCriteriaBonusPoints"); - Coach c = null; - CoachMatch m = null; - Criteria crit = null; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + Criteria crit = t.getParams().getCriteria(0); int expResult = 0; int result = CoachMatch.getCriteriaBonusPoints(c, m, crit); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1120,13 +1101,11 @@ public void testGetCriteriaBonusPoints() { @Test public void testGetCriteriasBonusPoints() { System.out.println("getCriteriasBonusPoints"); - Coach c = null; - CoachMatch m = null; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); int expResult = 0; int result = CoachMatch.getCriteriasBonusPoints(c, m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1135,15 +1114,13 @@ public void testGetCriteriasBonusPoints() { @Test public void testGetPointsByCoach() { System.out.println("getPointsByCoach"); - Coach c = null; - CoachMatch m = null; + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); boolean withMainPoints = false; boolean withBonusPOints = false; int expResult = 0; int result = CoachMatch.getPointsByCoach(c, m, withMainPoints, withBonusPOints); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1152,15 +1129,14 @@ public void testGetPointsByCoach() { @Test public void testGetValue_3args() { System.out.println("getValue"); - Criteria crit = null; + Criteria crit = t.getParams().getCriteria(0); int subtype = 0; - Competitor c = null; - CoachMatch instance = null; - int expResult = 0; - int result = instance.getValue(crit, subtype, c); + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + + int expResult = 4; + int result = m.getValue(crit, subtype, c); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1169,12 +1145,14 @@ public void testGetValue_3args() { @Test public void testIsEntered() { System.out.println("isEntered"); - CoachMatch instance = null; - boolean expResult = false; - boolean result = instance.isEntered(); + Coach c = t.getCoach(0); + CoachMatch m = (CoachMatch) c.getMatch(c.getMatchCount()-1); + + boolean expResult = true; + boolean result = m.isEntered(); + assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + } /** @@ -1183,10 +1161,13 @@ public void testIsEntered() { @Test public void testSwitchCoachs() { System.out.println("switchCoachs"); - CoachMatch instance = null; + Coach c=t.getCoach(0); + CoachMatch instance = (CoachMatch)c.getMatch(0); + Coach c1=(Coach)instance.getCompetitor1(); + Coach c2=(Coach)instance.getCompetitor2(); instance.switchCoachs(); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals((Coach)instance.getCompetitor1(), c2); + assertEquals((Coach)instance.getCompetitor2(), c1); } } diff --git a/test/tourma/data/CoachNGTest.java b/test/tourma/data/CoachNGTest.java index 3412251c..3a264fdf 100644 --- a/test/tourma/data/CoachNGTest.java +++ b/test/tourma/data/CoachNGTest.java @@ -576,7 +576,7 @@ public void testRoundCheck() { Assert.assertNotEquals(opponent, cm4bis.getCompetitor2()); } else { boolean b=opponent.equals(cm4bis.getCompetitor1()); - Assert.assertTrue(b); + Assert.assertFalse(b); } } @@ -912,10 +912,9 @@ public void testGetUID() { System.out.println("getUID"); Coach instance = new Coach(); int expResult = 0; + instance.setUID(0); int result = instance.getUID(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -925,10 +924,9 @@ public void testGetUID() { public void testSetUID() { System.out.println("setUID"); int UID = 0; - Coach instance = new Coach(); + Coach instance = Tournament.getTournament().getCoach(0); instance.setUID(UID); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(instance.getUID(), UID); } /** @@ -937,11 +935,9 @@ public void testSetUID() { @Test public void testPull() { System.out.println("pull"); - Coach c = null; - Coach instance = new Coach(); - instance.pull(c); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Coach instance = Tournament.getTournament().getCoach(0); + /*Coach instance = new Coach(); + instance.pull(c);*/ } /** @@ -950,11 +946,11 @@ public void testPull() { @Test public void testPush() { System.out.println("push"); - Coach c = null; +/* Coach c = null; Coach instance = new Coach(); instance.push(c); // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + fail("The test case is a prototype.");*/ } /** @@ -966,11 +962,9 @@ public void testIsBalanced() { Coach opp = null; Round round = null; Coach instance = new Coach(); - boolean expResult = false; + boolean expResult = true; boolean result = instance.isBalanced(opp, round); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -982,8 +976,6 @@ public void testPrintBalanced() { Round round = null; Coach instance = new Coach(); instance.printBalanced(round); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -992,12 +984,10 @@ public void testPrintBalanced() { @Test public void testGetNafRankAvg() { System.out.println("getNafRankAvg"); - Coach instance = new Coach(); - double expResult = 0.0; + Coach instance = Tournament.getTournament().getCoach(0); + double expResult = 150.0; double result = instance.getNafRankAvg(); assertEquals(result, expResult, 0.0); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1007,10 +997,10 @@ public void testGetNafRankAvg() { public void testSetNafAvg() { System.out.println("setNafAvg"); double mNafRank = 0.0; - Coach instance = new Coach(); + Coach instance = Tournament.getTournament().getCoach(0); instance.setNafAvg(mNafRank); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(instance.getNafRankAvg(), mNafRank); + } /** @@ -1019,12 +1009,10 @@ public void testSetNafAvg() { @Test public void testGetPinCode() { System.out.println("getPinCode"); - Coach instance = new Coach(); + Coach instance = Tournament.getTournament().getCoach(0); int expResult = 0; int result = instance.getPinCode(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -1033,11 +1021,10 @@ public void testGetPinCode() { @Test public void testSetPinCode() { System.out.println("setPinCode"); - int pin = 0; - Coach instance = new Coach(); + int pin = 1234; + Coach instance = Tournament.getTournament().getCoach(0); instance.setPinCode(pin); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(instance.getPinCode(), pin); } /** @@ -1047,12 +1034,10 @@ public void testSetPinCode() { public void testGetMatchRoster() { System.out.println("getMatchRoster"); int i = 0; - Coach instance = new Coach(); - String expResult = ""; + Coach instance = Tournament.getTournament().getCoach(0); + String expResult = "Humains"; String result = instance.getMatchRoster(i); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(result, expResult); } } diff --git a/test/tourma/data/CompetitorNGTest.java b/test/tourma/data/CompetitorNGTest.java index 962ae7c6..101551e9 100644 --- a/test/tourma/data/CompetitorNGTest.java +++ b/test/tourma/data/CompetitorNGTest.java @@ -14,6 +14,7 @@ import org.testng.Assert; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -184,11 +185,11 @@ public void testGetPicture() { System.out.println("getPicture"); Competitor instance = new CompetitorImpl(); ImageIcon icon = new ImageIcon("./test/clan.png"); - BufferedImage p = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); - instance.setPicture(p); + //BufferedImage p = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); + instance.setPicture(icon); assertNotNull(instance.getPicture()); - assertEquals(p, instance.getPicture()); + assertEquals(icon, instance.getPicture()); } /** @@ -236,11 +237,11 @@ public void testSetPicture() { System.out.println("setPicture"); Competitor instance = new CompetitorImpl(); ImageIcon icon = new ImageIcon("./test/clan.png"); - BufferedImage p = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); - instance.setPicture(p); + //BufferedImage p = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); + instance.setPicture(icon); assertNotNull(instance.getPicture()); - assertEquals(p, instance.getPicture()); + assertEquals(icon, instance.getPicture()); } /** @@ -250,8 +251,8 @@ public void testSetPicture() { public void testGetClan() { System.out.println("getClan"); Competitor instance = new CompetitorImpl(); - Clan expResult = new Clan("Test"); - assertEquals(instance.getClan(), null); + Clan expResult = new Clan("Aucun"); + assertEquals(instance.getClan(), Tournament.getTournament().getClan(0)); instance.setClan(expResult); assertEquals(instance.getClan(), expResult); @@ -265,7 +266,7 @@ public void testSetClan() { System.out.println("setClan"); Competitor instance = new CompetitorImpl(); Clan expResult = new Clan("Test"); - assertEquals(instance.getClan(), null); + assertEquals(instance.getClan(), Tournament.getTournament().getClan(0)); instance.setClan(expResult); assertEquals(instance.getClan(), expResult); } @@ -570,8 +571,9 @@ public void testIsUpdated() { boolean expResult = false; boolean result = instance.isUpdated(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + instance.setUpdated(true); + result = instance.isUpdated(); + assertEquals(result, true); } /** @@ -580,11 +582,13 @@ public void testIsUpdated() { @Test public void testSetUpdated() { System.out.println("setUpdated"); - boolean updated = false; Competitor instance = new CompetitorImpl(); - instance.setUpdated(updated); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + boolean expResult = false; + boolean result = instance.isUpdated(); + assertEquals(result, expResult); + instance.setUpdated(true); + result = instance.isUpdated(); + assertEquals(result, true); } /** @@ -593,11 +597,9 @@ public void testSetUpdated() { @Test public void testPull() { System.out.println("pull"); - Competitor comp = null; +/* Competitor comp = null; Competitor instance = new CompetitorImpl(); - instance.pull(comp); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + instance.pull(comp);*/ } /** @@ -606,11 +608,9 @@ public void testPull() { @Test public void testPush() { System.out.println("push"); - Competitor comp = null; +/* Competitor comp = null; Competitor instance = new CompetitorImpl(); - instance.push(comp); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + instance.push(comp);*/ } /** @@ -620,11 +620,12 @@ public void testPush() { public void testGetRawName() { System.out.println("getRawName"); Competitor instance = new CompetitorImpl(); - String expResult = ""; + String result = instance.getRawName(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + assertEquals(result, null); + instance.setName("toto"); + result = instance.getRawName(); + assertEquals(result, "toto"); } /** @@ -633,13 +634,17 @@ public void testGetRawName() { @Test public void testContainsMatch() { System.out.println("containsMatch"); - Match m = null; - Competitor instance = new CompetitorImpl(); + Match m = new CoachMatch(Tournament.getTournament().getRound(0)); + Competitor instance = Tournament.getTournament().getCoach(0); + boolean expResult = false; boolean result = instance.containsMatch(m); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + + m=instance.getMatch(0); + expResult = true; + result = instance.containsMatch(m); + assertEquals(result, expResult); } /** @@ -649,10 +654,9 @@ public void testContainsMatch() { public void testEnableNafAvg() { System.out.println("enableNafAvg"); boolean avg = false; - Competitor instance = new CompetitorImpl(); - instance.enableNafAvg(avg); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Competitor instance = Tournament.getTournament().getCoach(0); + instance.enableNafAvg(avg); + } } diff --git a/test/tourma/data/CriteriaNGTest.java b/test/tourma/data/CriteriaNGTest.java index 0aef5bc7..412d231a 100644 --- a/test/tourma/data/CriteriaNGTest.java +++ b/test/tourma/data/CriteriaNGTest.java @@ -7,17 +7,19 @@ import org.jdom.Element; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; + /** * * @author WFMJ7631 */ public class CriteriaNGTest { - + public CriteriaNGTest() { } @@ -48,7 +50,7 @@ public void testGetXMLElement() { instance.setPointsFor(2); instance.setPointsTeamAgainst(3); instance.setPointsTeamFor(4); - + Element result = instance.getXMLElement(); Criteria crit = new Criteria("None"); @@ -67,7 +69,7 @@ public void testSetXMLElement() { instance.setPointsFor(2); instance.setPointsTeamAgainst(3); instance.setPointsTeamFor(4); - + Element result = instance.getXMLElement(); Criteria crit = new Criteria("None"); @@ -81,9 +83,9 @@ public void testSetXMLElement() { @Test public void testGetName() { System.out.println("getName"); - Criteria instance=new Criteria("Test"); + Criteria instance = new Criteria("Test"); instance.setName("Test2"); - assertEquals(instance.getName(),"Test2"); + assertEquals(instance.getName(), "Test2"); } /** @@ -92,9 +94,9 @@ public void testGetName() { @Test public void testSetName() { System.out.println("setName"); - Criteria instance=new Criteria("Test"); + Criteria instance = new Criteria("Test"); instance.setName("Test2"); - assertEquals(instance.getName(),"Test2"); + assertEquals(instance.getName(), "Test2"); } /** @@ -103,10 +105,10 @@ public void testSetName() { @Test public void testGetPointsFor() { System.out.println("getPointsFor"); - Criteria instance=new Criteria("Test"); - int value=15; + Criteria instance = new Criteria("Test"); + int value = 15; instance.setPointsFor(value); - assertEquals(instance.getPointsFor(),value); + assertEquals(instance.getPointsFor(), value); } /** @@ -115,10 +117,10 @@ public void testGetPointsFor() { @Test public void testSetPointsFor() { System.out.println("setPointsFor"); - Criteria instance=new Criteria("Test"); - int value=15; + Criteria instance = new Criteria("Test"); + int value = 15; instance.setPointsFor(value); - assertEquals(instance.getPointsFor(),value); + assertEquals(instance.getPointsFor(), value); } /** @@ -127,10 +129,10 @@ public void testSetPointsFor() { @Test public void testGetPointsAgainst() { System.out.println("getPointsAgainst"); - Criteria instance=new Criteria("Test"); - int value=18; + Criteria instance = new Criteria("Test"); + int value = 18; instance.setPointsAgainst(value); - assertEquals(instance.getPointsAgainst(),value); + assertEquals(instance.getPointsAgainst(), value); } /** @@ -139,10 +141,10 @@ public void testGetPointsAgainst() { @Test public void testSetPointsAgainst() { System.out.println("setPointsAgainst"); - Criteria instance=new Criteria("Test"); - int value=18; + Criteria instance = new Criteria("Test"); + int value = 18; instance.setPointsAgainst(value); - assertEquals(instance.getPointsAgainst(),value); + assertEquals(instance.getPointsAgainst(), value); } /** @@ -151,10 +153,10 @@ public void testSetPointsAgainst() { @Test public void testGetPointsTeamFor() { System.out.println("getPointsTeamFor"); - Criteria instance=new Criteria("Test"); - int value=21; + Criteria instance = new Criteria("Test"); + int value = 21; instance.setPointsTeamFor(value); - assertEquals(instance.getPointsTeamFor(),value); + assertEquals(instance.getPointsTeamFor(), value); } /** @@ -163,10 +165,10 @@ public void testGetPointsTeamFor() { @Test public void testSetPointsTeamFor() { System.out.println("setPointsTeamFor"); - Criteria instance=new Criteria("Test"); - int value=21; + Criteria instance = new Criteria("Test"); + int value = 21; instance.setPointsTeamFor(value); - assertEquals(instance.getPointsTeamFor(),value); + assertEquals(instance.getPointsTeamFor(), value); } /** @@ -175,10 +177,10 @@ public void testSetPointsTeamFor() { @Test public void testGetPointsTeamAgainst() { System.out.println("getPointsTeamAgainst"); - Criteria instance=new Criteria("Test"); - int value=21; + Criteria instance = new Criteria("Test"); + int value = 21; instance.setPointsTeamAgainst(value); - assertEquals(instance.getPointsTeamAgainst(),value); + assertEquals(instance.getPointsTeamAgainst(), value); } /** @@ -187,10 +189,10 @@ public void testGetPointsTeamAgainst() { @Test public void testSetPointsTeamAgainst() { System.out.println("setPointsTeamAgainst"); - Criteria instance=new Criteria("Test"); - int value=21; + Criteria instance = new Criteria("Test"); + int value = 21; instance.setPointsTeamAgainst(value); - assertEquals(instance.getPointsTeamAgainst(),value); + assertEquals(instance.getPointsTeamAgainst(), value); } /** @@ -239,12 +241,14 @@ public void testPull() { @Test public void testGetAccronym() { System.out.println("getAccronym"); - Criteria instance = null; - String expResult = ""; + Criteria instance = new Criteria("touchdown"); + String expResult = "touchdown"; String result = instance.getAccronym(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + instance.setAccronym("td"); + result = instance.getAccronym(); + assertEquals(result, "td"); + } /** @@ -267,12 +271,10 @@ public void testSetAccronym() { public void testEquals() { System.out.println("equals"); Object obj = null; - Criteria instance = null; + Criteria instance = new Criteria("td"); boolean expResult = false; boolean result = instance.equals(obj); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); } /** @@ -281,12 +283,14 @@ public void testEquals() { @Test public void testGetCriticalThreshold() { System.out.println("getCriticalThreshold"); - Criteria instance = null; - int expResult = 0; + Criteria instance = new Criteria("touchdowns"); + int expResult = 10; int result = instance.getCriticalThreshold(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + instance.setCriticalThreshold(5); + result = instance.getCriticalThreshold(); + assertEquals(result, 5); + } /** @@ -295,11 +299,13 @@ public void testGetCriticalThreshold() { @Test public void testSetCriticalThreshold() { System.out.println("setCriticalThreshold"); - int value = 0; - Criteria instance = null; - instance.setCriticalThreshold(value); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Criteria instance = new Criteria("touchdowns"); + int expResult = 10; + int result = instance.getCriticalThreshold(); + assertEquals(result, expResult); + instance.setCriticalThreshold(5); + result = instance.getCriticalThreshold(); + assertEquals(result, 5); } /** @@ -335,12 +341,14 @@ public void testSetOffensiveDiffThreshold() { @Test public void testGetDefensiveDiffThreshold() { System.out.println("getDefensiveDiffThreshold"); - Criteria instance = null; + Criteria instance = new Criteria("td"); int expResult = 0; int result = instance.getDefensiveDiffThreshold(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + expResult = 10; + instance.setDefensiveDiffThreshold(expResult); + result = instance.getDefensiveDiffThreshold(); + assertEquals(result, expResult); } /** @@ -349,11 +357,14 @@ public void testGetDefensiveDiffThreshold() { @Test public void testSetDefensiveDiffThreshold() { System.out.println("setDefensiveDiffThreshold"); - int mDefensiveDiffThreshold = 0; - Criteria instance = null; - instance.setDefensiveDiffThreshold(mDefensiveDiffThreshold); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Criteria instance = new Criteria("td"); + int expResult = 0; + int result = instance.getDefensiveDiffThreshold(); + assertEquals(result, expResult); + expResult = 10; + instance.setDefensiveDiffThreshold(expResult); + result = instance.getDefensiveDiffThreshold(); + assertEquals(result, expResult); } /** @@ -389,12 +400,13 @@ public void testSetOffensiveDiffBonuses() { @Test public void testGetDefensiveDiffBonuses() { System.out.println("getDefensiveDiffBonuses"); - Criteria instance = null; + Criteria instance = new Criteria("td"); int expResult = 0; int result = instance.getDefensiveDiffBonuses(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + instance.setDefensiveDiffBonuses(10); + result = instance.getDefensiveDiffBonuses(); + assertEquals(result, 10); } /** @@ -403,11 +415,13 @@ public void testGetDefensiveDiffBonuses() { @Test public void testSetDefensiveDiffBonuses() { System.out.println("setDefensiveDiffBonuses"); - int mDefensiveDiffBonuses = 0; - Criteria instance = null; - instance.setDefensiveDiffBonuses(mDefensiveDiffBonuses); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Criteria instance = new Criteria("td"); + int expResult = 0; + int result = instance.getDefensiveDiffBonuses(); + assertEquals(result, expResult); + instance.setDefensiveDiffBonuses(10); + result = instance.getDefensiveDiffBonuses(); + assertEquals(result, 10); } /** @@ -524,12 +538,14 @@ public void testSetOffensiveDiffThresholdByTeam() { @Test public void testGetDefensiveDiffThresholdByTeam() { System.out.println("getDefensiveDiffThresholdByTeam"); - Criteria instance = null; + Criteria instance = new Criteria("td"); int expResult = 0; int result = instance.getDefensiveDiffThresholdByTeam(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + expResult = 10; + instance.setDefensiveDiffThresholdByTeam(expResult); + result = instance.getDefensiveDiffThresholdByTeam(); + assertEquals(result, expResult); } /** @@ -538,11 +554,14 @@ public void testGetDefensiveDiffThresholdByTeam() { @Test public void testSetDefensiveDiffThresholdByTeam() { System.out.println("setDefensiveDiffThresholdByTeam"); - int mDefensiveDiffThresholdByTeam = 0; - Criteria instance = null; - instance.setDefensiveDiffThresholdByTeam(mDefensiveDiffThresholdByTeam); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Criteria instance = new Criteria("td"); + int expResult = 0; + int result = instance.getDefensiveDiffThresholdByTeam(); + assertEquals(result, expResult); + expResult = 10; + instance.setDefensiveDiffThresholdByTeam(expResult); + result = instance.getDefensiveDiffThresholdByTeam(); + assertEquals(result, expResult); } /** @@ -578,12 +597,14 @@ public void testSetOffensiveDiffBonusesByTeam() { @Test public void testGetDefensiveDiffBonusesByTeam() { System.out.println("getDefensiveDiffBonusesByTeam"); - Criteria instance = null; + Criteria instance = new Criteria("td"); int expResult = 0; int result = instance.getDefensiveDiffBonusesByTeam(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + expResult = 10; + instance.setDefensiveDiffBonusesByTeam(expResult); + result = instance.getDefensiveDiffBonusesByTeam(); + assertEquals(result, expResult); } /** @@ -592,11 +613,14 @@ public void testGetDefensiveDiffBonusesByTeam() { @Test public void testSetDefensiveDiffBonusesByTeam() { System.out.println("setDefensiveDiffBonusesByTeam"); - int mDefensiveDiffBonusesByTeam = 0; - Criteria instance = null; - instance.setDefensiveDiffBonusesByTeam(mDefensiveDiffBonusesByTeam); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Criteria instance = new Criteria("td"); + int expResult = 0; + int result = instance.getDefensiveDiffBonusesByTeam(); + assertEquals(result, expResult); + expResult = 10; + instance.setDefensiveDiffBonusesByTeam(expResult); + result = instance.getDefensiveDiffBonusesByTeam(); + assertEquals(result, expResult); } /** @@ -659,12 +683,14 @@ public void testSetOffensiveDiffBonusesForTeam() { @Test public void testGetDefensiveDiffBonusesForTeam() { System.out.println("getDefensiveDiffBonusesForTeam"); - Criteria instance = null; + Criteria instance = new Criteria("td"); int expResult = 0; int result = instance.getDefensiveDiffBonusesForTeam(); assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + expResult = 10; + instance.setDefensiveDiffBonusesForTeam(expResult); + result = instance.getDefensiveDiffBonusesForTeam(); + assertEquals(result, expResult); } /** @@ -673,11 +699,14 @@ public void testGetDefensiveDiffBonusesForTeam() { @Test public void testSetDefensiveDiffBonusesForTeam() { System.out.println("setDefensiveDiffBonusesForTeam"); - int mDefensiveDiffBonusesForTeam = 0; - Criteria instance = null; - instance.setDefensiveDiffBonusesForTeam(mDefensiveDiffBonusesForTeam); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); + Criteria instance = new Criteria("td"); + int expResult = 0; + int result = instance.getDefensiveDiffBonusesForTeam(); + assertEquals(result, expResult); + expResult = 10; + instance.setDefensiveDiffBonusesForTeam(expResult); + result = instance.getDefensiveDiffBonusesForTeam(); + assertEquals(result, expResult); } /** @@ -706,5 +735,5 @@ public void testSetOffensiveBonusesForTeam() { // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } - + } diff --git a/test/tourma/data/GroupNGTest.java b/test/tourma/data/GroupNGTest.java index 23f31c36..19c69411 100644 --- a/test/tourma/data/GroupNGTest.java +++ b/test/tourma/data/GroupNGTest.java @@ -8,6 +8,7 @@ import org.jdom.Element; import org.testng.Assert; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -417,5 +418,32 @@ public void testEquals() { // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } + + /** + * Test of getPoints method, of class Group. + */ + @Test + public void testGetPoints() { + System.out.println("getPoints"); + Group instance = null; + int expResult = 0; + int result = instance.getPoints(); + assertEquals(result, expResult); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } + + /** + * Test of setPoints method, of class Group. + */ + @Test + public void testSetPoints() { + System.out.println("setPoints"); + int _points = 0; + Group instance = null; + instance.setPoints(_points); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } } diff --git a/test/tourma/data/GroupPointsNGTest.java b/test/tourma/data/GroupPointsNGTest.java index 0583891f..89bb22e0 100644 --- a/test/tourma/data/GroupPointsNGTest.java +++ b/test/tourma/data/GroupPointsNGTest.java @@ -6,6 +6,7 @@ package tourma.data; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/data/IContainCoachsNGTest.java b/test/tourma/data/IContainCoachsNGTest.java index dc54c745..5b7dfeef 100644 --- a/test/tourma/data/IContainCoachsNGTest.java +++ b/test/tourma/data/IContainCoachsNGTest.java @@ -6,6 +6,7 @@ package tourma.data; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/data/IWithNameAndPictureNGTest.java b/test/tourma/data/IWithNameAndPictureNGTest.java index 065889cf..8234288d 100644 --- a/test/tourma/data/IWithNameAndPictureNGTest.java +++ b/test/tourma/data/IWithNameAndPictureNGTest.java @@ -6,7 +6,10 @@ package tourma.data; import java.awt.image.BufferedImage; +import java.rmi.RemoteException; +import javax.swing.ImageIcon; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -41,7 +44,7 @@ public void tearDownMethod() throws Exception { * Test of getName method, of class IWithNameAndPicture. */ @Test(enabled=false) - public void testGetName() { + public void testGetName() throws RemoteException { System.out.println("getName"); IWithNameAndPicture instance = new IWithNameAndPictureImpl(); String expResult = ""; @@ -53,7 +56,7 @@ public void testGetName() { * Test of setName method, of class IWithNameAndPicture. */ @Test(enabled=false) - public void testSetName() { + public void testSetName() throws RemoteException { System.out.println("setName"); String name = ""; IWithNameAndPicture instance = new IWithNameAndPictureImpl(); @@ -64,11 +67,11 @@ public void testSetName() { * Test of getPicture method, of class IWithNameAndPicture. */ @Test(enabled=false) - public void testGetPicture() { + public void testGetPicture() throws RemoteException { System.out.println("getPicture"); IWithNameAndPicture instance = new IWithNameAndPictureImpl(); BufferedImage expResult = null; - BufferedImage result = instance.getPicture(); + ImageIcon result = instance.getPicture(); assertEquals(result, expResult); } @@ -76,9 +79,9 @@ public void testGetPicture() { * Test of setPicture method, of class IWithNameAndPicture. */ @Test(enabled=false) - public void testSetPicture() { + public void testSetPicture() throws RemoteException { System.out.println("setPicture"); - BufferedImage p = null; + ImageIcon p = null; IWithNameAndPicture instance = new IWithNameAndPictureImpl(); instance.setPicture(p); } @@ -92,12 +95,17 @@ public String getName() { public void setName(String name) { } - public BufferedImage getPicture() { + public ImageIcon getPicture() { return null; } public void setPicture(BufferedImage p) { } + + @Override + public void setPicture(ImageIcon p) throws RemoteException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } } diff --git a/test/tourma/data/MatchNGTest.java b/test/tourma/data/MatchNGTest.java index 56012672..dc6fcef1 100644 --- a/test/tourma/data/MatchNGTest.java +++ b/test/tourma/data/MatchNGTest.java @@ -7,6 +7,7 @@ import org.jdom.Element; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import static org.testng.Assert.assertTrue; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; @@ -208,6 +209,7 @@ public MatchImpl() { super(null); } + @Override public Element getXMLElement() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. @@ -227,6 +229,41 @@ public Element getXMLElementForDisplay() { public void setXMLElementForDisplay(Element element) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + + @Override + public int getUID() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void setUID(int UID) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void pull(Match match) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void push(Match match) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void recomputeValues() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public int getValue(Criteria crit, int subtype, Competitor c) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public boolean isEntered() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } /** diff --git a/test/tourma/data/ObjectRankingNGTest.java b/test/tourma/data/ObjectRankingNGTest.java index 611cbd56..420bae53 100644 --- a/test/tourma/data/ObjectRankingNGTest.java +++ b/test/tourma/data/ObjectRankingNGTest.java @@ -8,6 +8,7 @@ import org.jdom.Element; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/data/ParametersNGTest.java b/test/tourma/data/ParametersNGTest.java index a89be98d..3bfd7e7a 100644 --- a/test/tourma/data/ParametersNGTest.java +++ b/test/tourma/data/ParametersNGTest.java @@ -11,6 +11,7 @@ import java.util.Date; import org.jdom.Element; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -258,31 +259,6 @@ public void testRemoveCriteria() { assertEquals(nb, instance.getCriteriaCount()); } - /** - * Test of getGame method, of class Parameters. - */ - @Test - public void testGetGame() { - System.out.println("getGame"); - Parameters instance = new Parameters(); - int expResult = 0; - instance.setGame(expResult); - int result = instance.getGame(); - assertEquals(result, expResult); - } - - /** - * Test of setGame method, of class Parameters. - */ - @Test - public void testSetGame() { - System.out.println("setGame"); - Parameters instance = new Parameters(); - int expResult = 0; - instance.setGame(expResult); - int result = instance.getGame(); - assertEquals(result, expResult); - } /** * Test of getPointsIndivVictory method, of class Parameters. diff --git a/test/tourma/data/RankingNGTest.java b/test/tourma/data/RankingNGTest.java index ba4c145a..0c229706 100644 --- a/test/tourma/data/RankingNGTest.java +++ b/test/tourma/data/RankingNGTest.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import org.jdom.Element; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/data/RosterTypeNGTest.java b/test/tourma/data/RosterTypeNGTest.java index eb93495a..79f5c666 100644 --- a/test/tourma/data/RosterTypeNGTest.java +++ b/test/tourma/data/RosterTypeNGTest.java @@ -10,6 +10,7 @@ import org.jdom.Element; import org.testng.Assert; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/data/RoundNGTest.java b/test/tourma/data/RoundNGTest.java index 19895583..3211f586 100644 --- a/test/tourma/data/RoundNGTest.java +++ b/test/tourma/data/RoundNGTest.java @@ -358,37 +358,7 @@ public void testSetCupMaxTour() { assertEquals(result, expResult); } - /** - * Test of isLooserCup method, of class Round. - */ - @Test - public void testIsLooserCup() { - System.out.println("isLooserCup"); - if (Tournament.getTournament().getRoundsCount() == 0) { - fail("No round in file"); - } - Round instance = Tournament.getTournament().getRound(0); - boolean expResult = true; - instance.setLooserCup(expResult); - boolean result = instance.isLooserCup(); - assertEquals(result, expResult); - } - /** - * Test of setLooserCup method, of class Round. - */ - @Test - public void testSetLooserCup() { - System.out.println("setLooserCup"); - if (Tournament.getTournament().getRoundsCount() == 0) { - fail("No round in file"); - } - Round instance = Tournament.getTournament().getRound(0); - boolean expResult = true; - instance.setLooserCup(expResult); - boolean result = instance.isLooserCup(); - assertEquals(result, expResult); - } /** * Test of removeMatch method, of class Round. @@ -679,32 +649,6 @@ public void testEquals() { fail("The test case is a prototype."); } - /** - * Test of isThirdPlace method, of class Round. - */ - @Test - public void testIsThirdPlace() { - System.out.println("isThirdPlace"); - Round instance = new Round(); - boolean expResult = false; - boolean result = instance.isThirdPlace(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setThirdPlace method, of class Round. - */ - @Test - public void testSetThirdPlace() { - System.out.println("setThirdPlace"); - boolean b = false; - Round instance = new Round(); - instance.setThirdPlace(b); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } /** * Test of recomputeMatchs method, of class Round. diff --git a/test/tourma/data/SubstituteNGTest.java b/test/tourma/data/SubstituteNGTest.java index df934930..89e6645f 100644 --- a/test/tourma/data/SubstituteNGTest.java +++ b/test/tourma/data/SubstituteNGTest.java @@ -8,6 +8,7 @@ import java.io.File; import org.jdom.Element; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/data/TeamMatchNGTest.java b/test/tourma/data/TeamMatchNGTest.java index a16ae42f..74e14057 100644 --- a/test/tourma/data/TeamMatchNGTest.java +++ b/test/tourma/data/TeamMatchNGTest.java @@ -748,4 +748,34 @@ public void testIsEntered() { fail("The test case is a prototype."); } + /** + * Test of getTeammatesPoints method, of class TeamMatch. + */ + @Test + public void testGetTeammatesPoints() { + System.out.println("getTeammatesPoints"); + Team t = null; + TeamMatch instance = null; + int expResult = 0; + int result = instance.getTeammatesPoints(t); + assertEquals(result, expResult); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } + + /** + * Test of getTeammatesVND method, of class TeamMatch. + */ + @Test + public void testGetTeammatesVND() { + System.out.println("getTeammatesVND"); + Team t = null; + TeamMatch instance = null; + int expResult = 0; + int result = instance.getTeammatesVND(t); + assertEquals(result, expResult); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } + } diff --git a/test/tourma/data/ValueNGTest.java b/test/tourma/data/ValueNGTest.java index 99fcb70d..3e8a9eed 100644 --- a/test/tourma/data/ValueNGTest.java +++ b/test/tourma/data/ValueNGTest.java @@ -6,6 +6,7 @@ package tourma.data; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/tableModel/MjtAnnexRankIndivNGTest.java b/test/tourma/tableModel/MjtAnnexRankIndivNGTest.java index ae5d13f9..53b42fea 100644 --- a/test/tourma/tableModel/MjtAnnexRankIndivNGTest.java +++ b/test/tourma/tableModel/MjtAnnexRankIndivNGTest.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import org.testng.Assert; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/tableModel/MjtAnnexRankNGTest.java b/test/tourma/tableModel/MjtAnnexRankNGTest.java index fc285607..c0ee7981 100644 --- a/test/tourma/tableModel/MjtAnnexRankNGTest.java +++ b/test/tourma/tableModel/MjtAnnexRankNGTest.java @@ -10,6 +10,7 @@ import javax.swing.JTable; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/tableModel/MjtAnnexRankTeamNGTest.java b/test/tourma/tableModel/MjtAnnexRankTeamNGTest.java index 230900c2..1c04d5f0 100644 --- a/test/tourma/tableModel/MjtAnnexRankTeamNGTest.java +++ b/test/tourma/tableModel/MjtAnnexRankTeamNGTest.java @@ -12,6 +12,7 @@ import javax.swing.JTable; import org.testng.Assert; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/tableModel/MjtRankingIndivNGTest.java b/test/tourma/tableModel/MjtRankingIndivNGTest.java index 8bdc993a..574149b6 100644 --- a/test/tourma/tableModel/MjtRankingIndivNGTest.java +++ b/test/tourma/tableModel/MjtRankingIndivNGTest.java @@ -12,6 +12,7 @@ import javax.swing.JTable; import org.testng.Assert; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/tableModel/MjtRankingManualNGTest.java b/test/tourma/tableModel/MjtRankingManualNGTest.java index bf70e903..75ae74de 100644 --- a/test/tourma/tableModel/MjtRankingManualNGTest.java +++ b/test/tourma/tableModel/MjtRankingManualNGTest.java @@ -12,6 +12,7 @@ import javax.swing.JTable; import org.testng.Assert; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/tableModel/MjtRankingNGTest.java b/test/tourma/tableModel/MjtRankingNGTest.java index 1693fe68..8910c2ba 100644 --- a/test/tourma/tableModel/MjtRankingNGTest.java +++ b/test/tourma/tableModel/MjtRankingNGTest.java @@ -22,6 +22,9 @@ import org.testng.annotations.Test; import tourma.data.Coach; import tourma.data.CoachMatch; +import static tourma.data.CoachMatch.C_STARTING_RANK; +import static tourma.data.CoachMatch.getCoachTablePoints; +import static tourma.data.CoachMatch.getOppPointsByCoach; import tourma.data.Criteria; import tourma.data.ObjectRanking; import tourma.data.Parameters; @@ -31,17 +34,8 @@ import tourma.data.Tournament; import tourma.data.Value; import tourma.languages.Translate; -import static tourma.tableModel.MjtRanking.C_ELO_K; -import static tourma.tableModel.MjtRanking.C_STARTING_RANK; -import static tourma.tableModel.MjtRanking.getCoachNbMatchs; -import static tourma.tableModel.MjtRanking.getCoachTablePoints; import static tourma.tableModel.MjtRanking.getCriteriaByValue; -import static tourma.tableModel.MjtRanking.getELOByCoach; -import static tourma.tableModel.MjtRanking.getOppELOByCoach; -import static tourma.tableModel.MjtRanking.getOppPointsByCoach; -import static tourma.tableModel.MjtRanking.getPointsByCoach; import static tourma.tableModel.MjtRanking.getSubtypeByValue; -import static tourma.tableModel.MjtRanking.getVNDByCoach; import tourma.utility.StringConstants; /** @@ -84,414 +78,7 @@ public void setUpMethod() throws Exception { public void tearDownMethod() throws Exception { } - /** - * Test of getOppPointsByCoach method, of class MjtRanking. - */ - @Test - public void testGetOppPointsByCoach() { - System.out.println("getOppPointsByCoach"); - for (Coach c : coachs) { - CoachMatch m = (CoachMatch) c.getMatch(0); - Value val = m.getValue(Tournament.getTournament().getParams().getCriteria(0)); - Coach opp = null; - int tdPlayer = 0; - int tdOpp = 0; - if (m.getCompetitor1() == c) { - opp = (Coach) m.getCompetitor2(); - tdPlayer = val.getValue1(); - tdOpp = val.getValue2(); - } - if (m.getCompetitor2() == c) { - opp = (Coach) m.getCompetitor1(); - tdOpp = val.getValue1(); - tdPlayer = val.getValue2(); - } - - int value = 0; - if (Tournament.getTournament().getParams().isUseLargeVictory()) { - if (tdOpp - Tournament.getTournament().getParams().getGapLargeVictory() >= tdPlayer) { - value += Tournament.getTournament().getParams().getPointsIndivLargeVictory(); - } else { - if (tdPlayer < tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivVictory(); - } - } - } else { - if (tdPlayer < tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivVictory(); - } - } - - if (tdPlayer == tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivDraw(); - } - - if (tdPlayer > tdOpp) { - if (Tournament.getTournament().getParams().isUseLittleLoss()) { - if (tdOpp + Tournament.getTournament().getParams().getGapLargeVictory() >= tdPlayer) { - value += Tournament.getTournament().getParams().getPointsIndivLittleLost(); - } else { - value += Tournament.getTournament().getParams().getPointsIndivLost(); - } - } else { - value += Tournament.getTournament().getParams().getPointsIndivLost(); - } - } - - int bonus = 0; - // Add/Remove Bonuses - for (int i = 0; i < Tournament.getTournament().getParams().getCriteriaCount(); i++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(i); - val = m.getValue(crit); - if (m.getCompetitor1() == c) { - bonus += val.getValue2() * crit.getPointsFor(); - bonus += val.getValue1() * crit.getPointsAgainst(); - } - if (m.getCompetitor2() == c) { - bonus += val.getValue1() * crit.getPointsFor(); - bonus += val.getValue2() * crit.getPointsAgainst(); - } - } - - if (Tournament.getTournament().getParams().isTableBonus()) { - double coef = Tournament.getTournament().getParams().getTableBonusCoef(); - bonus += Math.round(getCoachTablePoints(c, m) * coef); - } - - if (Tournament.getTournament().getParams().isTableBonusPerRound()) { - // Find Round - Round round = null; - for (int cpt = 0; cpt < Tournament.getTournament().getRoundsCount(); cpt++) { - - Round r = Tournament.getTournament().getRound(cpt); - if (r.containsMatch(m)) { - round = r; - } - } - if (round != null) { - if (round.getMatchsCount() > 0) { - double fBonus = bonus * round.getCoef(m); - bonus = (int) Math.round(fBonus); - } - - } - } - int expResult = value + bonus; - - int result = MjtRanking.getOppPointsByCoach(c, m, true); - assertEquals(result, expResult); - - } - } - - /** - * Test of getCoachNbMatchs method, of class MjtRanking. - */ - @Test - public void testGetCoachNbMatchs() { - System.out.println("getCoachNbMatchs"); - for (Coach c : coachs) { - for (int i = 0; i < c.getMatchCount(); i++) { - CoachMatch m = (CoachMatch) c.getMatch(i); - int expResult = i + 1; - int result = MjtRanking.getCoachNbMatchs(c, m); - assertEquals(result, expResult); - } - } - } - - /** - * Test of getOppELOByCoach method, of class MjtRanking. - */ - @Test - public void testGetOppELOByCoach() { - System.out.println("getOppELOByCoach"); - for (Coach c : coachs) { - CoachMatch m = (CoachMatch) c.getMatch(0); - Value val = m.getValue(Tournament.getTournament().getParams().getCriteria(0)); - Coach opp = null; - int lastPlayerRank = C_STARTING_RANK; - int lastOppRank = C_STARTING_RANK; - - int tdPlayer = 0; - int tdOpp = 0; - if (m.getCompetitor1() == c) { - opp = (Coach) m.getCompetitor2(); - tdPlayer = val.getValue1(); - tdOpp = val.getValue2(); - } - if (m.getCompetitor2() == c) { - opp = (Coach) m.getCompetitor1(); - tdOpp = val.getValue1(); - tdPlayer = val.getValue2(); - } - - double tmp = ((lastPlayerRank - lastOppRank) / (double) 200); - double EA = 1 / (1 + Math.pow(10.0, tmp)); - // Compute real score - // Victory is 1000 - // All bonuses to 1 - double SA = 0; - if (tdPlayer < tdOpp) { - SA = 1000; - } - if (tdPlayer > tdOpp) { - SA = 0; - } - if (tdPlayer == tdOpp) { - SA = 500; - } - - // Add/Remove Bonuses - for (int i = 0; i < Tournament.getTournament().getParams().getCriteriaCount(); i++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(i); - val = m.getValue(crit); - if (m.getCompetitor1() == c) { - SA -= val.getValue1() * crit.getPointsFor(); - SA += val.getValue2() * crit.getPointsFor(); - - SA += val.getValue1() * crit.getPointsAgainst(); - SA -= val.getValue2() * crit.getPointsAgainst(); - } - if (m.getCompetitor2() == c) { - SA += val.getValue1() * crit.getPointsFor(); - SA -= val.getValue2() * crit.getPointsFor(); - - SA += val.getValue2() * crit.getPointsAgainst(); - SA -= val.getValue1() * crit.getPointsAgainst(); - } - } - double diff = SA / 1000 - EA; - int expResult = Math.round((float) (lastOppRank + C_ELO_K * diff)); - - int result = MjtRanking.getOppELOByCoach(c, m); - assertEquals(result, expResult); - } - } - - /** - * Test of getVNDByCoach method, of class MjtRanking. - */ - @Test - public void testGetVNDByCoach() { - System.out.println("getVNDByCoach"); - for (Coach c : coachs) { - CoachMatch m = (CoachMatch) c.getMatch(0); - Value val = m.getValue(Tournament.getTournament().getParams().getCriteria(0)); - Coach opp = null; - int tdPlayer = 0; - int tdOpp = 0; - if (m.getCompetitor1() == c) { - opp = (Coach) m.getCompetitor2(); - tdPlayer = val.getValue1(); - tdOpp = val.getValue2(); - } - if (m.getCompetitor2() == c) { - opp = (Coach) m.getCompetitor1(); - tdOpp = val.getValue1(); - tdPlayer = val.getValue2(); - } - - int value = 0; - if (tdPlayer > tdOpp) { - value += 1000000; - } - - if (tdPlayer == tdOpp) { - value += 1000; - } - - if (tdPlayer < tdOpp) { - value += 1; - - } - - int expResult = value; - - int result = MjtRanking.getVNDByCoach(c, m); - assertEquals(result, expResult); - - } - } - - /** - * Test of getELOByCoach method, of class MjtRanking. - */ - @Test - public void testGetELOByCoach() { - System.out.println("getELOByCoach"); - for (Coach c : coachs) { - CoachMatch m = (CoachMatch) c.getMatch(0); - Value val = m.getValue(Tournament.getTournament().getParams().getCriteria(0)); - Coach opp = null; - int lastPlayerRank = C_STARTING_RANK; - int lastOppRank = C_STARTING_RANK; - - int tdPlayer = 0; - int tdOpp = 0; - if (m.getCompetitor1() == c) { - opp = (Coach) m.getCompetitor2(); - tdPlayer = val.getValue1(); - tdOpp = val.getValue2(); - } - if (m.getCompetitor2() == c) { - opp = (Coach) m.getCompetitor1(); - tdOpp = val.getValue1(); - tdPlayer = val.getValue2(); - } - - double tmp = ((lastOppRank - lastPlayerRank) / (double) 200); - double EA = 1 / (1 + Math.pow(10.0, tmp)); - // Compute real score - // Victory is 1000 - // All bonuses to 1 - double SA = 0; - if (tdPlayer > tdOpp) { - SA = 1000; - } - if (tdPlayer < tdOpp) { - SA = 0; - } - if (tdPlayer == tdOpp) { - SA = 500; - } - - // Add/Remove Bonuses - for (int i = 0; i < Tournament.getTournament().getParams().getCriteriaCount(); i++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(i); - val = m.getValue(crit); - if (m.getCompetitor1() == c) { - SA += val.getValue1() * crit.getPointsFor(); - SA -= val.getValue2() * crit.getPointsFor(); - - SA -= val.getValue1() * crit.getPointsAgainst(); - SA += val.getValue2() * crit.getPointsAgainst(); - } - if (m.getCompetitor2() == c) { - SA -= val.getValue1() * crit.getPointsFor(); - SA += val.getValue2() * crit.getPointsFor(); - - SA -= val.getValue2() * crit.getPointsAgainst(); - SA += val.getValue1() * crit.getPointsAgainst(); - } - } - double diff = SA / 1000 - EA; - int expResult = Math.round((float) (lastPlayerRank + C_ELO_K * diff)); - - int result = MjtRanking.getELOByCoach(c, m); - assertEquals(result, expResult); - } - } - - /** - * Test of getPointsByCoach method, of class MjtRanking. - */ - @Test - public void testGetPointsByCoach() { - System.out.println("getPointsByCoach"); - for (Coach c : coachs) { - CoachMatch m = (CoachMatch) c.getMatch(0); - Value val = m.getValue(Tournament.getTournament().getParams().getCriteria(0)); - Coach opp = null; - int tdPlayer = 0; - int tdOpp = 0; - if (m.getCompetitor1() == c) { - opp = (Coach) m.getCompetitor2(); - tdPlayer = val.getValue1(); - tdOpp = val.getValue2(); - } - if (m.getCompetitor2() == c) { - opp = (Coach) m.getCompetitor1(); - tdOpp = val.getValue1(); - tdPlayer = val.getValue2(); - } - - int value = 0; - if (Tournament.getTournament().getParams().isUseLargeVictory()) { - if (tdPlayer - Tournament.getTournament().getParams().getGapLargeVictory() >= tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivLargeVictory(); - } else { - if (tdPlayer > tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivVictory(); - } - } - } else { - if (tdPlayer > tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivVictory(); - } - } - - if (tdPlayer == tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivDraw(); - } - - if (tdPlayer < tdOpp) { - if (Tournament.getTournament().getParams().isUseLittleLoss()) { - if (tdPlayer + Tournament.getTournament().getParams().getGapLargeVictory() >= tdOpp) { - value += Tournament.getTournament().getParams().getPointsIndivLittleLost(); - } else { - value += Tournament.getTournament().getParams().getPointsIndivLost(); - } - } else { - value += Tournament.getTournament().getParams().getPointsIndivLost(); - } - } - - int bonus = 0; - // Add/Remove Bonuses - for (int i = 0; i < Tournament.getTournament().getParams().getCriteriaCount(); i++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(i); - val = m.getValue(crit); - if (m.getCompetitor1() == c) { - bonus += val.getValue1() * crit.getPointsFor(); - bonus += val.getValue2() * crit.getPointsAgainst(); - } - if (m.getCompetitor2() == c) { - bonus += val.getValue2() * crit.getPointsFor(); - bonus += val.getValue1() * crit.getPointsAgainst(); - } - } - - if (Tournament.getTournament().getParams().isTableBonus()) { - double coef = Tournament.getTournament().getParams().getTableBonusCoef(); - bonus += Math.round(getCoachTablePoints(c, m) * coef); - } - - if (Tournament.getTournament().getParams().isTableBonusPerRound()) { - // Find Round - Round round = null; - for (int cpt = 0; cpt < Tournament.getTournament().getRoundsCount(); cpt++) { - - Round r = Tournament.getTournament().getRound(cpt); - if (r.containsMatch(m)) { - round = r; - } - } - if (round != null) { - if (round.getMatchsCount() > 0) { - double fBonus = bonus * round.getCoef(m); - bonus = (int) Math.round(fBonus); - } - - } - } - int expResult = value; - - int result = MjtRanking.getPointsByCoach(c, m, true, false); - assertEquals(result, expResult); - - expResult = bonus; - - result = MjtRanking.getPointsByCoach(c, m, false, true); - assertEquals(result, expResult); - - expResult = value + bonus; - - result = MjtRanking.getPointsByCoach(c, m, true, true); - assertEquals(result, expResult); - - } - } + /** * Test of getSubtypeByValue method, of class MjtRanking. @@ -661,14 +248,7 @@ public void testGetSortedObject() { } } - /** - * Test of sortDatas method, of class MjtRanking. - */ - @Test(enabled = false) - public void testSortDatas() { - System.out.println("sortDatas"); - instance.sortDatas(); - } + /** * Test of getColumnCount method, of class MjtRanking. @@ -722,433 +302,6 @@ public void testGetRowCount() { assertEquals(result, expResult); } - /** - * Test of getTeamNbMatch method, of class MjtRanking. - */ - @Test - public void testGetTeamNbMatch() { - System.out.println("getTeamNbMatch"); - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - coachs.add(Tournament.getTournament().getCoach(i)); - } - instance = new MjtRankingIndiv(Tournament.getTournament().getRoundsCount() - 1, - coachs, - false, true); - - for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { - Team t = Tournament.getTournament().getTeam(i); - for (int j = 0; j < t.getMatchCount(); j++) { - TeamMatch m = (TeamMatch) t.getMatch(j); - int expResult = j + 1; - int result = instance.getTeamNbMatch(t, m); - assertEquals(result, expResult); - } - } - } - - /** - * Test of getPointsByTeam method, of class MjtRanking. - */ - @Test - public void testGetPointsByTeam() { - System.out.println("getPointsByTeam"); - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - coachs.add(Tournament.getTournament().getCoach(i)); - } - instance = new MjtRankingIndiv(Tournament.getTournament().getRoundsCount() - 1, - coachs, - false, true); - - for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { - Team t = Tournament.getTournament().getTeam(i); - TeamMatch tm = (TeamMatch) t.getMatch(Tournament.getTournament().getRoundsCount() - 1); - - int nbVic = tm.getVictories(t); - int nbLos = tm.getLoss(t); - int value = 0; - if (nbVic > nbLos) { - value += Tournament.getTournament().getParams().getPointsTeamVictory(); - } - - if (nbVic == nbLos) { - value += Tournament.getTournament().getParams().getPointsTeamDraw(); - } - - if (nbVic < nbLos) { - - value += Tournament.getTournament().getParams().getPointsTeamLost(); - } - - int bonus = 0; - - for (int k = 0; k < tm.getMatchCount(); k++) { - CoachMatch m = tm.getMatch(k); - Value val; - - Coach c = null; - if (t.containsCoach((Coach) m.getCompetitor1())) { - c = (Coach) m.getCompetitor1(); - } else { - c = (Coach) m.getCompetitor2(); - } - - // Add/Remove Bonuses - for (int j = 0; j < Tournament.getTournament().getParams().getCriteriaCount(); j++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(j); - val = m.getValue(crit); - if (m.getCompetitor1() == c) { - bonus += val.getValue1() * crit.getPointsFor(); - bonus += val.getValue2() * crit.getPointsAgainst(); - } - if (m.getCompetitor2() == c) { - bonus += val.getValue2() * crit.getPointsFor(); - bonus += val.getValue1() * crit.getPointsAgainst(); - } - } - - if (Tournament.getTournament().getParams().isTableBonus()) { - double coef = Tournament.getTournament().getParams().getTableBonusCoef(); - bonus += Math.round(getCoachTablePoints(c, m) * coef); - } - - if (Tournament.getTournament().getParams().isTableBonusPerRound()) { - // Find Round - Round round = null; - for (int cpt = 0; cpt < Tournament.getTournament().getRoundsCount(); cpt++) { - - Round r = Tournament.getTournament().getRound(cpt); - if (r.containsMatch(m)) { - round = r; - } - } - if (round != null) { - if (round.getMatchsCount() > 0) { - double fBonus = bonus * round.getCoef(m); - bonus = (int) Math.round(fBonus); - } - } - } - } - int expResult = value; - - int result = instance.getPointsByTeam(t, tm, true, false); - assertEquals(result, expResult); - - expResult = bonus; - - result = instance.getPointsByTeam(t, tm, false, true); - assertEquals(result, expResult); - - expResult = value + bonus; - - result = instance.getPointsByTeam(t, tm, true, true); - assertEquals(result, expResult); - - } - } - - /** - * Test of getELOByTeam method, of class MjtRanking. - */ - @Test - public void testGetELOByTeam() { - System.out.println("getELOByTeam"); - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - coachs.add(Tournament.getTournament().getCoach(i)); - } - instance = new MjtRankingIndiv(Tournament.getTournament().getRoundsCount() - 1, - coachs, - false, false); - - for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { - Team t = Tournament.getTournament().getTeam(0); - int roundIndex = 0; - - int expResult = 0; - TeamMatch tm = (TeamMatch) t.getMatch(0); - int nbVic = tm.getVictories(t); - int nbDraw = tm.getVictories(t); - - int lastTeamRank = C_STARTING_RANK; - int lastOppRank = C_STARTING_RANK; - - Team opp = null; - if (tm.getCompetitor1() == t) { - opp = (Team) tm.getCompetitor2(); - - } - if (tm.getCompetitor2() == t) { - opp = (Team) tm.getCompetitor1(); - } - - double tmp = ((lastOppRank - lastTeamRank) / (double) 400); - double EA = 1 / (1 + Math.pow(10.0, tmp)); - - // Compute real score - // Victory is 1000 - // All bonuses to 1 - double SA = 0; - if (nbVic > nbDraw) { - SA = 1000; - } - if (nbVic < nbDraw) { - SA = 0; - } - if (nbVic == nbDraw) { - SA = 500; - } - - // Add/Remove Bonuses - for (int j = 0; j < Tournament.getTournament().getParams().getCriteriaCount(); j++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(j); - for (int k = 0; k < tm.getMatchCount(); k++) { - CoachMatch m = tm.getMatch(k); - Value val = m.getValue(crit); - if (tm.getCompetitor1() == t) { - SA += val.getValue1(); - SA -= val.getValue2(); - } - if (tm.getCompetitor2() == t) { - SA -= val.getValue1(); - SA += val.getValue2(); - } - } - } - expResult = Math.round((float) (lastTeamRank + C_ELO_K * (SA - EA))); - int result = instance.getELOByTeam(t, tm, roundIndex); - assertEquals(result, expResult); - } - } - - /** - * Test of getVNDByTeam method, of class MjtRanking. - */ - @Test - public void testGetVNDByTeam() { - System.out.println("getVNDByTeam"); - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); - - instance = new MjtRankingIndiv(0, - coachs, - false, true); - - for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { - Team t = Tournament.getTournament().getTeam(i); - TeamMatch m = (TeamMatch) t.getMatch(0); - - Team opp = null; - int vPlayer = 0; - int vOpp = 0; - if (m.getCompetitor1() == t) { - opp = (Team) m.getCompetitor2(); - - } - if (m.getCompetitor2() == t) { - opp = (Team) m.getCompetitor1(); - } - vPlayer = m.getVictories(t); - vOpp = m.getVictories(opp); - - int value = 0; - if (vPlayer > vOpp) { - value += 1000000; - } - - if (vPlayer == vOpp) { - value += 1000; - } - - if (vPlayer < vOpp) { - value += 1; - - } - - int expResult = value; - - int result = instance.getVNDByTeam(t, m, true); - assertEquals(result, expResult); - - } - } - - /** - * Test of getOppPointsByTeam method, of class MjtRanking. - */ - @Test - public void testGetOppPointsByTeam() { - System.out.println("getOppPointsByTeam"); - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - coachs.add(Tournament.getTournament().getCoach(i)); - } - instance = new MjtRankingIndiv(Tournament.getTournament().getRoundsCount() - 1, - coachs, - false, true); - - for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { - Team t = Tournament.getTournament().getTeam(i); - TeamMatch tm = (TeamMatch) t.getMatch(Tournament.getTournament().getRoundsCount() - 1); - - int nbVic = tm.getVictories(t); - int nbLos = tm.getLoss(t); - int value = 0; - if (nbVic < nbLos) { - value += Tournament.getTournament().getParams().getPointsTeamVictory(); - } - - if (nbVic == nbLos) { - value += Tournament.getTournament().getParams().getPointsTeamDraw(); - } - - if (nbVic > nbLos) { - - value += Tournament.getTournament().getParams().getPointsTeamLost(); - } - - int bonus = 0; - - for (int k = 0; k < tm.getMatchCount(); k++) { - CoachMatch m = tm.getMatch(k); - Value val; - - Coach c = null; - if (t.containsCoach((Coach) m.getCompetitor1())) { - c = (Coach) m.getCompetitor2(); - } else { - c = (Coach) m.getCompetitor1(); - } - - // Add/Remove Bonuses - for (int j = 0; j < Tournament.getTournament().getParams().getCriteriaCount(); j++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(j); - val = m.getValue(crit); - if (m.getCompetitor1() == c) { - bonus += val.getValue1() * crit.getPointsFor(); - bonus += val.getValue2() * crit.getPointsAgainst(); - } - if (m.getCompetitor2() == c) { - bonus += val.getValue2() * crit.getPointsFor(); - bonus += val.getValue1() * crit.getPointsAgainst(); - } - } - - if (Tournament.getTournament().getParams().isTableBonus()) { - double coef = Tournament.getTournament().getParams().getTableBonusCoef(); - bonus += Math.round(getCoachTablePoints(c, m) * coef); - } - - if (Tournament.getTournament().getParams().isTableBonusPerRound()) { - // Find Round - Round round = null; - for (int cpt = 0; cpt < Tournament.getTournament().getRoundsCount(); cpt++) { - - Round r = Tournament.getTournament().getRound(cpt); - if (r.containsMatch(m)) { - round = r; - } - } - if (round != null) { - if (round.getMatchsCount() > 0) { - double fBonus = bonus * round.getCoef(m); - bonus = (int) Math.round(fBonus); - } - } - } - } - int expResult = value + bonus; - - int result = instance.getOppPointsByTeam(t, tm, false); - assertEquals(result, expResult); - } - } - - /** - * Test of getOppELOByTeam method, of class MjtRanking. - */ - @Test - public void testGetOppELOByTeam() { - System.out.println("getOppELOByTeam"); - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - coachs.add(Tournament.getTournament().getCoach(i)); - } - instance = new MjtRankingIndiv(Tournament.getTournament().getRoundsCount() - 1, - coachs, - false, false); - - for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { - Team t = Tournament.getTournament().getTeam(0); - int roundIndex = 0; - - int expResult = 0; - TeamMatch tm = (TeamMatch) t.getMatch(0); - int nbVic = tm.getVictories(t); - int nbDraw = tm.getVictories(t); - - int lastTeamRank = C_STARTING_RANK; - int lastOppRank = C_STARTING_RANK; - - Team opp = null; - if (tm.getCompetitor1() == t) { - opp = (Team) tm.getCompetitor2(); - - } - if (tm.getCompetitor2() == t) { - opp = (Team) tm.getCompetitor1(); - } - - double tmp = ((lastTeamRank - lastOppRank) / (double) 400); - double EA = 1 / (1 + Math.pow(10.0, tmp)); - - // Compute real score - // Victory is 1000 - // All bonuses to 1 - double SA = 0; - if (nbVic < nbDraw) { - SA = 1000; - } - if (nbVic > nbDraw) { - SA = 0; - } - if (nbVic == nbDraw) { - SA = 500; - } - - // Add/Remove Bonuses - for (int j = 0; j < Tournament.getTournament().getParams().getCriteriaCount(); j++) { - Criteria crit = Tournament.getTournament().getParams().getCriteria(j); - for (int k = 0; k < tm.getMatchCount(); k++) { - CoachMatch m = tm.getMatch(k); - Value val = m.getValue(crit); - if (tm.getCompetitor1() == t) { - SA -= val.getValue1(); - SA += val.getValue2(); - } - if (tm.getCompetitor2() == t) { - SA += val.getValue1(); - SA -= val.getValue2(); - } - } - } - expResult = Math.round((float) (lastOppRank + C_ELO_K * (SA - EA))); - int result = instance.getOppELOByTeam(t, tm, roundIndex); - assertEquals(result, expResult); - } - } /** * Test of getColumnClass method, of class MjtRanking. @@ -1217,29 +370,7 @@ public Object getValueAt(int row, int col) { } } - /** - * Test of getCoachTablePoints method, of class MjtRanking. - */ - @Test - public void testGetCoachTable() { - System.out.println("getCoachTable"); - for (Coach c : coachs) { - Round r = Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1); - ArrayList acm = r.getCoachMatchs(); - int expResult = -1; - CoachMatch m = null; - for (int i = 0; i < acm.size(); i++) { - CoachMatch cm = acm.get(i); - if ((cm.getCompetitor1() == c) || (cm.getCompetitor2() == c)) { - m = cm; - expResult = acm.size() - i; - break; - } - } - int result = MjtRanking.getCoachTablePoints(c, m); - assertEquals(result, expResult); - } - } + /** * Test of getRankingFromString method, of class MjtRanking. @@ -1341,75 +472,8 @@ public void testSetDetail() { } - /** - * Test of getValueByRankingType method, of class MjtRanking. - */ - @Test - public void testGetValueByRankingType_3args_1() { - System.out.println("getValueByRankingType"); - - for (Coach c : coachs) { - Round r = Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1); - ArrayList acm = r.getCoachMatchs(); - for (int cpt = 0; cpt < c.getMatchCount(); cpt++) { - CoachMatch cm = (CoachMatch) c.getMatch(cpt); - for (int i = 0; i < Parameters.C_MAX_RANKING + Tournament.getTournament().getParams().getCriteriaCount() * 3; i++) { - final Criteria c1 = getCriteriaByValue(i); - final int subType1 = getSubtypeByValue(i); - int value = -1; - if (c1 == null) { - value = instance.getValue(c, cm, i); - } else { - value = instance.getValue(c, cm, c1, subType1); - } - - int expResult = value; - int result = instance.getValueByRankingType(i, c, cm); - assertEquals(result, expResult); - } - } - } - } - - /** - * Test of getValueByRankingType method, of class MjtRanking. - */ - @Test - public void testGetValueByRankingType_3args_2() { - System.out.println("getValueByRankingType"); - - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); + - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - coachs.add(Tournament.getTournament().getCoach(i)); - } - instance = new MjtRankingIndiv(Tournament.getTournament().getRoundsCount() - 1, - coachs, - false, true); - - for (int j = 0; j < Tournament.getTournament().getTeamsCount(); j++) { - Team t = Tournament.getTournament().getTeam(j); - Round r = Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1); - for (int cpt = 0; cpt < t.getMatchCount(); cpt++) { - TeamMatch tm = (TeamMatch) t.getMatch(cpt); - for (int i = 0; i < Parameters.C_MAX_RANKING + Tournament.getTournament().getParams().getCriteriaCount() * 3; i++) { - final Criteria c1 = getCriteriaByValue(i); - final int subType1 = getSubtypeByValue(i); - int value = -1; - if (c1 == null) { - value = instance.getValue(t, tm, i, Tournament.getTournament().getParams().isTeamVictoryOnly()); - } else { - value = instance.getValue(t, tm, c1, subType1); - } - - int expResult = value; - int result = instance.getValueByRankingType(i, t, tm); - assertEquals(result, expResult); - } - } - } - } /** * Test of getValueFromArray method, of class MjtRanking. @@ -1460,45 +524,7 @@ public void testRemoveMaxValue() { assertFalse(aValue.contains(200)); } - /** - * Test of getTeamTable method, of class MjtRanking. - */ - @Test - public void testGetTeamTable() { - System.out.println("getTeamTable"); - - Tournament.resetTournament(); - Tournament.getTournament().loadXML(new File("./test/team.xml")); - - for (int i = 0; i < Tournament.getTournament().getCoachsCount(); i++) { - coachs.add(Tournament.getTournament().getCoach(i)); - } - instance = new MjtRankingIndiv(Tournament.getTournament().getRoundsCount() - 1, - coachs, - false, true); - - for (int i = 0; i < Tournament.getTournament().getTeamsCount(); i++) { - Team t = Tournament.getTournament().getTeam(i); - Round r = Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1); - ArrayList atm = new ArrayList<>(); - for (int j = 0; j < r.getMatchsCount(); j++) { - atm.add((TeamMatch) r.getMatch(j)); - } - - int expResult = -1; - TeamMatch m = null; - for (int j = 0; j < atm.size(); j++) { - TeamMatch cm = atm.get(j); - if ((cm.getCompetitor1() == t) || (cm.getCompetitor2() == t)) { - m = cm; - expResult = atm.size() - j; - break; - } - } - int result = instance.getTeamTable(t, m); - assertEquals(result, expResult); - } - } + /** * Test of getRound method, of class MjtRanking. @@ -1511,131 +537,7 @@ public void testGetRound() { assertEquals(result, expResult); } - /** - * Test of getCoachTablePoints method, of class MjtRanking. - */ - @Test - public void testGetCoachTablePoints() { - System.out.println("getCoachTablePoints"); - for (Coach c : coachs) { - CoachMatch m = (CoachMatch) c.getMatch(Tournament.getTournament().getRoundsCount() - 1); - Value val = m.getValue(Tournament.getTournament().getParams().getCriteria(0)); - Round r = Tournament.getTournament().getRound(Tournament.getTournament().getRoundsCount() - 1); - int index = -1; - for (int i = 0; i < r.getMatchsCount(); i++) { - if (r.getMatch(i) == m) { - index = i; - break; - } - } - int expResult = r.getMatchsCount() - index; - - int result = MjtRanking.getCoachTablePoints(c, m); - assertEquals(result, expResult); - - } - } - - /** - * Test of getValue method, of class MjtRanking. - */ - @Test - public void testGetValue_4args() { - System.out.println("getValue"); - for (Coach c : coachs) { - for (int i = 0; i < c.getMatchCount(); i++) { - CoachMatch m = (CoachMatch) c.getMatch(i); - for (int j = 0; j < Tournament.getTournament().getParams().getCriteriaCount(); j++) { - Criteria criteria = Tournament.getTournament().getParams().getCriteria(j); - for (int k = 0; k < 3; k++) { - int expResult = 0; - if (k == Parameters.C_RANKING_SUBTYPE_POSITIVE) { - if (c == m.getCompetitor1()) { - expResult += Math.max(m.getValue(criteria).getValue1(), 0); - } else { - expResult += Math.max(m.getValue(criteria).getValue2(), 0); - } - } else { - if (k == Parameters.C_RANKING_SUBTYPE_NEGATIVE) { - if (c == m.getCompetitor1()) { - expResult += Math.max(m.getValue(criteria).getValue2(), 0); - } else { - expResult += Math.max(m.getValue(criteria).getValue1(), 0); - } - } else { - if (c == m.getCompetitor1()) { - expResult += m.getValue(criteria).getValue1() - m.getValue(criteria).getValue2(); - } else { - expResult += m.getValue(criteria).getValue2() - m.getValue(criteria).getValue1(); - } - } - } - int result = MjtRanking.getValue(c, m, criteria, k); - assertEquals(result, expResult); - } - - } - } - } - } - - /** - * Test of getValue method, of class MjtRanking. - */ - @Test - public void testGetValue_3args() { - System.out.println("getValue"); - for (Coach c : coachs) { - for (int i = 0; i < c.getMatchCount(); i++) { - CoachMatch m = (CoachMatch) c.getMatch(i); - for (int j = 0; j < Parameters.C_MAX_RANKING; j++) { - int valueType = j; - int expResult = 0; - switch (valueType) { - case Parameters.C_RANKING_POINTS: - expResult = getPointsByCoach(c, m, true, true); - break; - case Parameters.C_RANKING_POINTS_WITHOUT_BONUS: - expResult = getPointsByCoach(c, m, true, false); - break; - case Parameters.C_RANKING_BONUS_POINTS: - expResult = getPointsByCoach(c, m, false, true); - break; - case Parameters.C_RANKING_NONE: - expResult = 0; - break; - case Parameters.C_RANKING_OPP_POINTS: - expResult = getOppPointsByCoach(c, m, true); - break; - case Parameters.C_RANKING_OPP_POINTS_OTHER_MATCHS: - expResult = getOppPointsByCoach(c, m, false); - break; - case Parameters.C_RANKING_VND: - expResult = getVNDByCoach(c, m); - break; - case Parameters.C_RANKING_ELO: - expResult = getELOByCoach(c, m); - break; - case Parameters.C_RANKING_ELO_OPP: - expResult = getOppELOByCoach(c, m); - break; - case Parameters.C_RANKING_NB_MATCHS: - expResult = getCoachNbMatchs(c, m); - break; - case Parameters.C_RANKING_TABLES: - expResult = getCoachTablePoints(c, m); - break; - default: - expResult = 0; - break; - } - - int result = MjtRanking.getValue(c, m, valueType); - assertEquals(result, expResult); - } - } - } - } + /** * Test of convertVND method, of class MjtRanking. diff --git a/test/tourma/tableModel/MjtRankingTeamNGTest.java b/test/tourma/tableModel/MjtRankingTeamNGTest.java index be2af1b6..679cb18e 100644 --- a/test/tourma/tableModel/MjtRankingTeamNGTest.java +++ b/test/tourma/tableModel/MjtRankingTeamNGTest.java @@ -16,6 +16,7 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; +import static org.testng.Assert.fail; import org.testng.annotations.Test; import tourma.data.ObjectRanking; import tourma.data.Team; diff --git a/test/tourma/utils/BalancingNGTest.java b/test/tourma/utils/BalancingNGTest.java index 0641c037..6ba49537 100644 --- a/test/tourma/utils/BalancingNGTest.java +++ b/test/tourma/utils/BalancingNGTest.java @@ -6,6 +6,7 @@ package tourma.utils; import java.io.File; +import java.rmi.RemoteException; import java.util.ArrayList; import java.util.HashMap; import static org.testng.Assert.assertEquals; @@ -52,7 +53,14 @@ public void tearDownMethod() throws Exception { public void testBalanceCoachMatchs() { System.out.println("balanceCoachMatchs"); ArrayList matchs = null; + try + { Balancing.balanceCoachMatchs(matchs); + } + catch (RemoteException e) + { + + } // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } diff --git a/test/tourma/utils/GenerationNGTest.java b/test/tourma/utils/GenerationNGTest.java index 703c589b..a6228bce 100644 --- a/test/tourma/utils/GenerationNGTest.java +++ b/test/tourma/utils/GenerationNGTest.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import static org.testng.Assert.assertEquals; + import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; @@ -87,7 +88,7 @@ public void testSubRanking_Team_ArrayList() { Team team = null; ArrayList rounds = null; ArrayList expResult = null; - ArrayList result = Generation.subRanking(team, rounds); + ArrayList result = Generation.subRanking(team, rounds,true); assertEquals(result, expResult); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); @@ -102,7 +103,7 @@ public void testSubRanking_ArrayList_ArrayList() { ArrayList coachs = null; ArrayList rounds = null; ArrayList expResult = null; - ArrayList result = Generation.subRanking(coachs, rounds); + ArrayList result = Generation.subRanking(coachs, rounds,true); assertEquals(result, expResult); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); diff --git a/test/tourma/utils/NAFNGTest.java b/test/tourma/utils/NAFNGTest.java index e41fa5b6..2ba08160 100644 --- a/test/tourma/utils/NAFNGTest.java +++ b/test/tourma/utils/NAFNGTest.java @@ -9,6 +9,7 @@ import java.net.URL; import java.util.ArrayList; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -206,5 +207,17 @@ public void testGetDistance() { // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } + + /** + * Test of setIgnoreCaps method, of class NAF. + */ + @Test + public void testSetIgnoreCaps() { + System.out.println("setIgnoreCaps"); + boolean b = false; + NAF.setIgnoreCaps(b); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } } diff --git a/test/tourma/utils/display/RankedNGTest.java b/test/tourma/utils/display/RankedNGTest.java index ba9cef1b..26e6757b 100644 --- a/test/tourma/utils/display/RankedNGTest.java +++ b/test/tourma/utils/display/RankedNGTest.java @@ -5,6 +5,7 @@ */ package tourma.utils.display; +import java.rmi.RemoteException; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; @@ -20,7 +21,7 @@ * @author WFMJ7631 */ public class RankedNGTest { - + public RankedNGTest() { } @@ -43,70 +44,90 @@ public void tearDownMethod() throws Exception { /** * Test of getRowCount method, of class IRanked. */ - @Test(enabled=false) + @Test(enabled = false) public void testGetRowCount() { System.out.println("getRowCount"); IRanked instance = new RankedImpl(); int expResult = 0; - int result = instance.getRowCount(); - assertEquals(result, expResult); + try { + int result = instance.getRowCount(); + assertEquals(result, expResult); + } catch (RemoteException e) { + + } } /** * Test of getSortedObject method, of class IRanked. */ - @Test(enabled=false) + @Test(enabled = false) public void testGetSortedObject() { System.out.println("getSortedObject"); int i = 0; IRanked instance = new RankedImpl(); ObjectRanking expResult = null; - ObjectRanking result = instance.getSortedObject(i); - //assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. + try { + ObjectRanking result = instance.getSortedObject(i); + //assertEquals(result, expResult); + // TODO review the generated test code and remove the default call to fail. + } catch (RemoteException e) { + + } fail("The test case is a prototype."); } /** * Test of getSortedValue method, of class IRanked. */ - @Test(enabled=false) + @Test(enabled = false) public void testGetSortedValue() { System.out.println("getSortedValue"); int i = 0; int valIndex = 0; IRanked instance = new RankedImpl(); int expResult = 0; - int result = instance.getSortedValue(i, valIndex); - //assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. + try { + int result = instance.getSortedValue(i, valIndex); + //assertEquals(result, expResult); + // TODO review the generated test code and remove the default call to fail. + } catch (RemoteException e) { + + } fail("The test case is a prototype."); } /** * Test of getDetail method, of class IRanked. */ - @Test(enabled=false) + @Test(enabled = false) public void testGetDetail() { System.out.println("getDetail"); IRanked instance = new RankedImpl(); String expResult = ""; - String result = instance.getDetail(); - //assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. + try { + String result = instance.getDetail(); + //assertEquals(result, expResult); + // TODO review the generated test code and remove the default call to fail. + } catch (RemoteException e) { + + } fail("The test case is a prototype."); } /** * Test of setDetail method, of class IRanked. */ - @Test(enabled=false) + @Test(enabled = false) public void testSetDetail() { System.out.println("setDetail"); String s = ""; IRanked instance = new RankedImpl(); - instance.setDetail(s); - // TODO review the generated test code and remove the default call to fail. + try { + instance.setDetail(s); + // TODO review the generated test code and remove the default call to fail. + } catch (RemoteException e) { + + } fail("The test case is a prototype."); } @@ -131,5 +152,5 @@ public String getDetail() { public void setDetail(String s) { } } - + } diff --git a/test/tourma/utils/display/TServerThreadNGTest.java b/test/tourma/utils/display/TServerThreadNGTest.java index 8318d015..6e8bca05 100644 --- a/test/tourma/utils/display/TServerThreadNGTest.java +++ b/test/tourma/utils/display/TServerThreadNGTest.java @@ -8,6 +8,7 @@ import java.net.Socket; import tourma.utils.display.TServerThread; import static org.testng.Assert.fail; +import static org.testng.Assert.assertEquals; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/utils/web/WebServerNGTest.java b/test/tourma/utils/web/WebServerNGTest.java index b932718e..bdd00940 100644 --- a/test/tourma/utils/web/WebServerNGTest.java +++ b/test/tourma/utils/web/WebServerNGTest.java @@ -7,6 +7,7 @@ import fi.iki.elonen.NanoHTTPD; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Map; import static org.testng.Assert.*; @@ -64,11 +65,17 @@ public void testGetPageText() { public void testServe() { System.out.println("serve"); NanoHTTPD.IHTTPSession session = null; + try{ WebServer instance = new WebServer(); NanoHTTPD.Response expResult = null; NanoHTTPD.Response result = instance.serve(session); assertEquals(result, expResult); // TODO review the generated test code and remove the default call to fail. + } + catch (IOException e) + { + + } fail("The test case is a prototype."); } diff --git a/test/tourma/views/GraphicalMatchNGTest.java b/test/tourma/views/GraphicalMatchNGTest.java deleted file mode 100644 index cebe15fc..00000000 --- a/test/tourma/views/GraphicalMatchNGTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package tourma.views; - -import javax.swing.JLabel; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; -import org.testng.annotations.AfterClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; -/** - * - * @author WFMJ7631 - */ -public class GraphicalMatchNGTest { - - public GraphicalMatchNGTest() { - } - - @BeforeClass - public static void setUpClass() throws Exception { - } - - @AfterClass - public static void tearDownClass() throws Exception { - } - - @BeforeMethod - public void setUpMethod() throws Exception { - } - - @AfterMethod - public void tearDownMethod() throws Exception { - } - - /** - * Test of getClanIcon1 method, of class GraphicalMatch. - */ - @Test(enabled=false) - public void testGetClanIcon1() { - System.out.println("getClanIcon1"); - GraphicalMatch instance = null; - JLabel expResult = null; - JLabel result = instance.getClanIcon1(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setClanIcon1 method, of class GraphicalMatch. - */ - @Test(enabled=false) - public void testSetClanIcon1() { - System.out.println("setClanIcon1"); - JLabel clanIcon1 = null; - GraphicalMatch instance = null; - instance.setClanIcon1(clanIcon1); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of getClanIcon2 method, of class GraphicalMatch. - */ - @Test(enabled=false) - public void testGetClanIcon2() { - System.out.println("getClanIcon2"); - GraphicalMatch instance = null; - JLabel expResult = null; - JLabel result = instance.getClanIcon2(); - assertEquals(result, expResult); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - - /** - * Test of setClanIcon2 method, of class GraphicalMatch. - */ - @Test(enabled=false) - public void testSetClanIcon2() { - System.out.println("setClanIcon2"); - JLabel clanIcon2 = null; - GraphicalMatch instance = null; - instance.setClanIcon2(clanIcon2); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - -} diff --git a/test/tourma/views/JPNStatisticsNGTest.java b/test/tourma/views/JPNStatisticsNGTest.java index b39355f7..d36ae41a 100644 --- a/test/tourma/views/JPNStatisticsNGTest.java +++ b/test/tourma/views/JPNStatisticsNGTest.java @@ -7,6 +7,7 @@ import javax.swing.JTabbedPane; import static org.testng.Assert.fail; +import static org.testng.Assert.assertEquals; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; diff --git a/test/tourma/views/fullscreen/JFullScreenClanRankNGTest.java b/test/tourma/views/fullscreen/JFullScreenClanRankNGTest.java index d491c8cf..9fa3ce6e 100644 --- a/test/tourma/views/fullscreen/JFullScreenClanRankNGTest.java +++ b/test/tourma/views/fullscreen/JFullScreenClanRankNGTest.java @@ -49,7 +49,7 @@ public void testSomeMethod() { public void testClientLoop() throws Exception { System.out.println("clientLoop"); JFullScreenClanRank instance = null; - instance.clientLoop(); + instance.clientLoop(0); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } diff --git a/test/tourma/views/fullscreen/JFullScreenClanTeamAnnexNGTest.java b/test/tourma/views/fullscreen/JFullScreenClanTeamAnnexNGTest.java index 10c0d566..4957be4a 100644 --- a/test/tourma/views/fullscreen/JFullScreenClanTeamAnnexNGTest.java +++ b/test/tourma/views/fullscreen/JFullScreenClanTeamAnnexNGTest.java @@ -49,7 +49,7 @@ public void testSomeMethod() { public void testClientLoop() throws Exception { System.out.println("clientLoop"); JFullScreenClanTeamAnnex instance = null; - instance.clientLoop(); + instance.clientLoop(0); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } diff --git a/test/tourma/views/fullscreen/JFullScreenIndivAnnexNGTest.java b/test/tourma/views/fullscreen/JFullScreenIndivAnnexNGTest.java index ae673f28..df2c012f 100644 --- a/test/tourma/views/fullscreen/JFullScreenIndivAnnexNGTest.java +++ b/test/tourma/views/fullscreen/JFullScreenIndivAnnexNGTest.java @@ -49,7 +49,7 @@ public void testSomeMethod() { public void testClientLoop() throws Exception { System.out.println("clientLoop"); JFullScreenIndivAnnex instance = null; - instance.clientLoop(); + instance.clientLoop(0); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } diff --git a/test/tourma/views/fullscreen/JFullScreenIndivRankNGTest.java b/test/tourma/views/fullscreen/JFullScreenIndivRankNGTest.java index 2b364184..07c15aa0 100644 --- a/test/tourma/views/fullscreen/JFullScreenIndivRankNGTest.java +++ b/test/tourma/views/fullscreen/JFullScreenIndivRankNGTest.java @@ -49,7 +49,7 @@ public void testSomeMethod() { public void testClientLoop() throws Exception { System.out.println("clientLoop"); JFullScreenIndivRank instance = null; - instance.clientLoop(); + instance.clientLoop(0); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } diff --git a/test/tourma/views/fullscreen/JFullScreenMatchsNGTest.java b/test/tourma/views/fullscreen/JFullScreenMatchsNGTest.java index d23c2ed3..c4cca774 100644 --- a/test/tourma/views/fullscreen/JFullScreenMatchsNGTest.java +++ b/test/tourma/views/fullscreen/JFullScreenMatchsNGTest.java @@ -55,7 +55,7 @@ public void testSomeMethod() { public void testClientLoop() throws Exception { System.out.println("clientLoop"); JFullScreenMatchs instance = null; - instance.clientLoop(); + instance.clientLoop(0); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } @@ -114,7 +114,7 @@ public void testCreateClashCoachPane() { boolean right = false; JFullScreenMatchs instance = null; JPanel expResult = null; - JPanel result = instance.createClashCoachPane(t, score, right); + JPanel result = instance.createClashCoachPane(t, score, right,0); assertEquals(result, expResult); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); diff --git a/test/tourma/views/fullscreen/JFullScreenNGTest.java b/test/tourma/views/fullscreen/JFullScreenNGTest.java index beeb4028..eb4e9873 100644 --- a/test/tourma/views/fullscreen/JFullScreenNGTest.java +++ b/test/tourma/views/fullscreen/JFullScreenNGTest.java @@ -82,13 +82,14 @@ public void testGetGridbBagConstraints() { public class JFullScreenImpl extends JFullScreen { + @Override - protected void clientLoop() { + protected void setStop(boolean s) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override - protected void setStop(boolean s) { + protected void clientLoop(int screen) throws InterruptedException { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @@ -101,7 +102,7 @@ protected void setStop(boolean s) { public void testClientLoop() throws Exception { System.out.println("clientLoop"); JFullScreen instance = new JFullScreenImpl(); - instance.clientLoop(); + instance.clientLoop(0); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } diff --git a/test/tourma/views/fullscreen/JFullScreenTeamRankNGTest.java b/test/tourma/views/fullscreen/JFullScreenTeamRankNGTest.java index b192e8ef..86cd06a6 100644 --- a/test/tourma/views/fullscreen/JFullScreenTeamRankNGTest.java +++ b/test/tourma/views/fullscreen/JFullScreenTeamRankNGTest.java @@ -49,7 +49,7 @@ public void testSomeMethod() { public void testClientLoop() throws Exception { System.out.println("clientLoop"); JFullScreenTeamRank instance = null; - instance.clientLoop(); + instance.clientLoop(0); // TODO review the generated test code and remove the default call to fail. fail("The test case is a prototype."); } diff --git a/test/tournaments/melting2015.xml b/test/tournaments/melting2015.xml index 0e3b62c3..017ce6a1 100644 --- a/test/tournaments/melting2015.xml +++ b/test/tournaments/melting2015.xml @@ -24,7 +24,7 @@ - + diff --git a/test/tournaments/naf_rugbowl_2018.xml b/test/tournaments/naf_rugbowl_2018.xml new file mode 100644 index 00000000..786c6309 --- /dev/null +++ b/test/tournaments/naf_rugbowl_2018.xml @@ -0,0 +1,2766 @@ + + +Les Azes + + +Albius +22726 +Wood Elves + + +JP +15682 +Lizardmen + + +Oni +18902 +Bretonnians + + +Superdave +15683 +Humans + + +Raztout +16824 +Undead + + +Gentil_Novice +15679 +Norse + + +Miyata +13563 +Wood Elves + + +rippersly +13335 +Dark Elves + + +Talkarde +4398 +Humans + + +Foxxx +18903 +Chaos Pact + + +Olivierdulac +18901 +Skaven + + +Samdulac +19452 +Necromantic + + +Alinadrel +23447 +Wood Elves + + +Meowtrez +23445 +Skaven + + +Ishtar +25870 +Undead + + +krougmolotov +26119 +Vampires + + +sathyakirin +26134 +Orc + + +podpeintur +26135 +Chaos + + +Crom +11783 +Dwarves + + +pop +17719 +Necromantic + + +Leto +17484 +Vampires + + +LordUhr +15579 +Elves + + +Fricotti +13345 +Wood Elves + + +Mad_Coach +24053 +Skaven + + +cyg-obsidian +21201 +Elves + + +Pilaf +21736 +Skaven + + +jersinho07 +21819 +Dark Elves + + +ghorghor +21919 +Necromantic + + +Kesta +9519 +High Elves + + +biereforever +21487 +Wood Elves + + +nicodaz +6833 +Khemri + + +doudou +12769 +Dark Elves + + +commodore_protheus +12133 +Chaos Pact + + +Miko +2808 +Ogres + + +TomTom +3582 +Chaos + + +Patxi +12005 +Norse + + +Legoman +14598 +Dark Elves + + +Nate_River +19264 +Undead + + +firedept +22776 +Skaven + + +kador +15293 +Amazons + + +tiguitare +24004 +Chaos Dwarves + + +Haktar +8734 +Necromantic + + +darthmael +11132 +Wood Elves + + +Hely +15578 +Undead + + +Galladur +11134 +Lizardmen + + +G16 +8559 +Dark Elves + + +silkoun +14616 +Necromantic + + +Boeufbowl +10761 +Norse + + +Chavrouze51 +16353 +Lizardmen + + +Clement0 +18970 +Wood Elves + + +Corrupt +22668 +Necromantic + + +Sebotouno +16213 +Bretonnians + + +zahiko +13997 +Undead + + +zoul +11077 +Humans + + +Paulip +13344 +Khemri + + +dams +11801 +Skaven + + +holleb +16821 +Wood Elves + + +Lord_Bojo +7539 +Khorne + + +Chatman +15248 +Chaos Dwarves + + + +2018-08-18 09:08 + +Albius +22726 +110 +2 +2 + + +Alinadrel +23447 +110 +1 +0 + + + +2018-08-18 09:08 + +JP +15682 +110 +2 +1 + + +krougmolotov +26119 +110 +0 +1 + + + +2018-08-18 09:08 + +Oni +18902 +110 +0 +1 + + +podpeintur +26135 +110 +0 +0 + + + +2018-08-18 09:08 + +Superdave +15683 +110 +2 +0 + + +sathyakirin +26134 +110 +0 +3 + + + +2018-08-18 09:08 + +Raztout +16824 +110 +1 +2 + + +Meowtrez +23445 +110 +0 +0 + + + +2018-08-18 09:08 + +Gentil_Novice +15679 +110 +2 +3 + + +Ishtar +25870 +110 +1 +0 + + + +2018-08-18 09:08 + +cyg-obsidian +21201 +110 +1 +0 + + +Sebotouno +16213 +110 +2 +3 + + + +2018-08-18 09:08 + +Pilaf +21736 +110 +4 +1 + + +Clement0 +18970 +110 +3 +1 + + + +2018-08-18 09:08 + +jersinho07 +21819 +110 +0 +0 + + +Chavrouze51 +16353 +110 +4 +2 + + + +2018-08-18 09:08 + +ghorghor +21919 +110 +2 +2 + + +Corrupt +22668 +110 +1 +3 + + + +2018-08-18 09:08 + +Kesta +9519 +110 +1 +1 + + +zahiko +13997 +110 +1 +0 + + + +2018-08-18 09:08 + +biereforever +21487 +110 +4 +1 + + +zoul +11077 +110 +0 +4 + + + +2018-08-18 09:08 + +nicodaz +6833 +110 +1 +4 + + +Samdulac +19452 +110 +2 +2 + + + +2018-08-18 09:08 + +doudou +12769 +110 +0 +1 + + +Talkarde +4398 +110 +3 +2 + + + +2018-08-18 09:08 + +commodore_protheus +12133 +110 +0 +2 + + +rippersly +13335 +110 +2 +0 + + + +2018-08-18 09:08 + +Miko +2808 +110 +1 +4 + + +Olivierdulac +18901 +110 +7 +3 + + + +2018-08-18 09:08 + +TomTom +3582 +110 +0 +3 + + +Foxxx +18903 +110 +2 +2 + + + +2018-08-18 09:08 + +Patxi +12005 +110 +0 +1 + + +Miyata +13563 +110 +1 +1 + + + +2018-08-18 09:08 + +Legoman +14598 +110 +1 +1 + + +Mad_Coach +24053 +110 +2 +2 + + + +2018-08-18 09:08 + +Nate_River +19264 +110 +1 +0 + + +Leto +17484 +110 +1 +2 + + + +2018-08-18 09:08 + +firedept +22776 +110 +2 +1 + + +Crom +11783 +110 +1 +2 + + + +2018-08-18 09:08 + +kador +15293 +110 +3 +3 + + +LordUhr +15579 +110 +0 +1 + + + +2018-08-18 09:08 + +tiguitare +24004 +110 +2 +3 + + +Fricotti +13345 +110 +1 +0 + + + +2018-08-18 09:08 + +Haktar +8734 +110 +2 +2 + + +pop +17719 +110 +1 +0 + + + +2018-08-18 09:08 + +Paulip +13344 +110 +1 +1 + + +silkoun +14616 +110 +1 +0 + + + +2018-08-18 09:08 + +dams +11801 +110 +1 +0 + + +darthmael +11132 +110 +4 +0 + + + +2018-08-18 09:08 + +holleb +16821 +110 +1 +2 + + +Boeufbowl +10761 +110 +2 +4 + + + +2018-08-18 09:08 + +Lord_Bojo +7539 +110 +0 +3 + + +Hely +15578 +110 +3 +1 + + + +2018-08-18 09:08 + +Chatman +15248 +110 +1 +1 + + +Galladur +11134 +110 +1 +0 + + + +2018-08-18 13:08 + +Miyata +13563 +110 +4 +2 + + +Albius +22726 +110 +1 +4 + + + +2018-08-18 13:08 + +rippersly +13335 +110 +4 +1 + + +JP +15682 +110 +0 +1 + + + +2018-08-18 13:08 + +Talkarde +4398 +110 +1 +1 + + +Superdave +15683 +110 +0 +1 + + + +2018-08-18 13:08 + +Foxxx +18903 +110 +0 +3 + + +Raztout +16824 +110 +2 +2 + + + +2018-08-18 13:08 + +Olivierdulac +18901 +110 +4 +0 + + +Gentil_Novice +15679 +110 +1 +4 + + + +2018-08-18 13:08 + +Samdulac +19452 +110 +2 +3 + + +Oni +18902 +110 +0 +0 + + + +2018-08-18 13:08 + +firedept +22776 +110 +0 +2 + + +darthmael +11132 +110 +6 +2 + + + +2018-08-18 13:08 + +kador +15293 +110 +1 +1 + + +Hely +15578 +110 +0 +0 + + + +2018-08-18 13:08 + +tiguitare +24004 +110 +2 +3 + + +Boeufbowl +10761 +110 +2 +3 + + + +2018-08-18 13:08 + +Haktar +8734 +110 +1 +6 + + +Galladur +11134 +110 +2 +1 + + + +2018-08-18 13:08 + +Nate_River +19264 +110 +0 +3 + + +G16 +8559 +110 +2 +0 + + + +2018-08-18 13:08 + +Legoman +14598 +110 +0 +0 + + +silkoun +14616 +110 +1 +2 + + + +2018-08-18 13:08 + +Pilaf +21736 +110 +2 +4 + + +Mad_Coach +24053 +110 +1 +2 + + + +2018-08-18 13:08 + +ghorghor +21919 +110 +1 +2 + + +Leto +17484 +110 +0 +2 + + + +2018-08-18 13:08 + +biereforever +21487 +110 +1 +1 + + +Crom +11783 +110 +2 +3 + + + +2018-08-18 13:08 + +Kesta +9519 +110 +1 +0 + + +pop +17719 +110 +1 +3 + + + +2018-08-18 13:08 + +cyg-obsidian +21201 +110 +2 +2 + + +LordUhr +15579 +110 +2 +5 + + + +2018-08-18 13:08 + +jersinho07 +21819 +110 +2 +1 + + +Fricotti +13345 +110 +3 +1 + + + +2018-08-18 13:08 + +Chavrouze51 +16353 +110 +0 +1 + + +Paulip +13344 +110 +0 +0 + + + +2018-08-18 13:08 + +zahiko +13997 +110 +1 +4 + + +Chatman +15248 +110 +0 +1 + + + +2018-08-18 13:08 + +Clement0 +18970 +110 +2 +2 + + +dams +11801 +110 +1 +0 + + + +2018-08-18 13:08 + +Corrupt +22668 +110 +2 +3 + + +holleb +16821 +110 +1 +1 + + + +2018-08-18 13:08 + +zoul +11077 +110 +1 +2 + + +Lord_Bojo +7539 +110 +1 +4 + + + +2018-08-18 13:08 + +podpeintur +26135 +110 +1 +1 + + +nicodaz +6833 +110 +2 +2 + + + +2018-08-18 13:08 + +Alinadrel +23447 +110 +3 +1 + + +doudou +12769 +110 +1 +0 + + + +2018-08-18 13:08 + +Meowtrez +23445 +110 +2 +0 + + +commodore_protheus +12133 +110 +1 +2 + + + +2018-08-18 13:08 + +Ishtar +25870 +110 +0 +4 + + +Miko +2808 +110 +1 +0 + + + +2018-08-18 13:08 + +krougmolotov +26119 +110 +2 +0 + + +TomTom +3582 +110 +1 +4 + + + +2018-08-18 13:08 + +sathyakirin +26134 +110 +1 +2 + + +Patxi +12005 +110 +2 +1 + + + +2018-08-18 19:08 + +Talkarde +4398 +110 +0 +2 + + +darthmael +11132 +110 +1 +1 + + + +2018-08-18 19:08 + +rippersly +13335 +110 +1 +0 + + +Boeufbowl +10761 +110 +2 +3 + + + +2018-08-18 19:08 + +Olivierdulac +18901 +110 +4 +4 + + +Galladur +11134 +110 +1 +0 + + + +2018-08-18 19:08 + +Miyata +13563 +110 +1 +0 + + +G16 +8559 +110 +1 +3 + + + +2018-08-18 19:08 + +Samdulac +19452 +110 +0 +0 + + +silkoun +14616 +110 +2 +2 + + + +2018-08-18 19:08 + +Foxxx +18903 +110 +0 +3 + + +Hely +15578 +110 +1 +3 + + + +2018-08-18 19:08 + +Pilaf +21736 +110 +0 +2 + + +Raztout +16824 +110 +2 +4 + + + +2018-08-18 19:08 + +ghorghor +21919 +110 +0 +0 + + +Gentil_Novice +15679 +110 +0 +0 + + + +2018-08-18 19:08 + +biereforever +21487 +110 +3 +1 + + +Albius +22726 +110 +2 +0 + + + +2018-08-18 19:08 + +Kesta +9519 +110 +1 +1 + + +JP +15682 +110 +2 +1 + + + +2018-08-18 19:08 + +cyg-obsidian +21201 +110 +2 +1 + + +Superdave +15683 +110 +1 +4 + + + +2018-08-18 19:08 + +jersinho07 +21819 +110 +1 +1 + + +Oni +18902 +110 +0 +0 + + + +2018-08-18 19:08 + +Chavrouze51 +16353 +110 +1 +2 + + +kador +15293 +110 +1 +1 + + + +2018-08-18 19:08 + +Sebotouno +16213 +110 +2 +0 + + +tiguitare +24004 +110 +0 +2 + + + +2018-08-18 19:08 + +zahiko +13997 +110 +1 +2 + + +firedept +22776 +110 +1 +1 + + + +2018-08-18 19:08 + +Corrupt +22668 +110 +1 +3 + + +Haktar +8734 +110 +2 +1 + + + +2018-08-18 19:08 + +Clement0 +18970 +110 +2 +1 + + +Nate_River +19264 +110 +1 +1 + + + +2018-08-18 19:08 + +zoul +11077 +110 +3 +4 + + +Legoman +14598 +110 +0 +2 + + + +2018-08-18 19:08 + +Crom +11783 +110 +2 +1 + + +Alinadrel +23447 +110 +1 +1 + + + +2018-08-18 19:08 + +Mad_Coach +24053 +110 +3 +3 + + +Meowtrez +23445 +110 +2 +1 + + + +2018-08-18 19:08 + +Fricotti +13345 +110 +1 +2 + + +krougmolotov +26119 +110 +0 +1 + + + +2018-08-18 19:08 + +Leto +17484 +110 +0 +0 + + +podpeintur +26135 +110 +1 +0 + + + +2018-08-18 19:08 + +pop +17719 +110 +1 +1 + + +sathyakirin +26134 +110 +0 +2 + + + +2018-08-18 19:08 + +LordUhr +15579 +110 +3 +1 + + +Ishtar +25870 +110 +1 +2 + + + +2018-08-18 19:08 + +Patxi +12005 +110 +0 +2 + + +Paulip +13344 +110 +2 +4 + + + +2018-08-18 19:08 + +Miko +2808 +110 +0 +2 + + +Chatman +15248 +110 +1 +1 + + + +2018-08-18 19:08 + +TomTom +3582 +110 +0 +3 + + +Lord_Bojo +7539 +110 +1 +1 + + + +2018-08-18 19:08 + +commodore_protheus +12133 +110 +2 +5 + + +dams +11801 +110 +0 +0 + + + +2018-08-18 19:08 + +doudou +12769 +110 +1 +0 + + +holleb +16821 +110 +0 +0 + + + +2018-08-19 08:08 + +darthmael +11132 +110 +1 +2 + + +ghorghor +21919 +110 +1 +4 + + + +2018-08-19 08:08 + +Boeufbowl +10761 +110 +2 +3 + + +Pilaf +21736 +110 +1 +2 + + + +2018-08-19 08:08 + +silkoun +14616 +110 +2 +4 + + +biereforever +21487 +110 +0 +0 + + + +2018-08-19 08:08 + +Hely +15578 +110 +1 +2 + + +cyg-obsidian +21201 +110 +0 +0 + + + +2018-08-19 08:08 + +G16 +8559 +110 +2 +3 + + +jersinho07 +21819 +110 +1 +1 + + + +2018-08-19 08:08 + +Galladur +11134 +110 +2 +4 + + +Kesta +9519 +110 +1 +0 + + + +2018-08-19 08:08 + +Olivierdulac +18901 +110 +2 +5 + + +Sebotouno +16213 +110 +1 +2 + + + +2018-08-19 08:08 + +Miyata +13563 +110 +3 +1 + + +Clement0 +18970 +110 +2 +1 + + + +2018-08-19 08:08 + +Talkarde +4398 +110 +0 +0 + + +Chavrouze51 +16353 +110 +1 +2 + + + +2018-08-19 08:08 + +rippersly +13335 +110 +1 +1 + + +zahiko +13997 +110 +1 +2 + + + +2018-08-19 08:08 + +Samdulac +19452 +110 +1 +0 + + +zoul +11077 +110 +1 +3 + + + +2018-08-19 08:08 + +Foxxx +18903 +110 +0 +1 + + +Corrupt +22668 +110 +1 +1 + + + +2018-08-19 08:08 + +Crom +11783 +110 +0 +1 + + +Raztout +16824 +110 +2 +2 + + + +2018-08-19 08:08 + +Fricotti +13345 +110 +2 +1 + + +Albius +22726 +110 +3 +3 + + + +2018-08-19 08:08 + +Mad_Coach +24053 +110 +0 +0 + + +Gentil_Novice +15679 +110 +2 +2 + + + +2018-08-19 08:08 + +pop +17719 +110 +0 +1 + + +JP +15682 +110 +1 +2 + + + +2018-08-19 08:08 + +LordUhr +15579 +110 +1 +0 + + +Superdave +15683 +110 +2 +4 + + + +2018-08-19 08:08 + +Leto +17484 +110 +0 +0 + + +Oni +18902 +110 +1 +3 + + + +2018-08-19 08:08 + +kador +15293 +110 +2 +2 + + +nicodaz +6833 +110 +1 +3 + + + +2018-08-19 08:08 + +Haktar +8734 +110 +2 +4 + + +Patxi +12005 +110 +1 +0 + + + +2018-08-19 08:08 + +tiguitare +24004 +110 +1 +3 + + +Miko +2808 +110 +0 +2 + + + +2018-08-19 08:08 + +firedept +22776 +110 +0 +2 + + +commodore_protheus +12133 +110 +1 +8 + + + +2018-08-19 08:08 + +Nate_River +19264 +110 +2 +1 + + +doudou +12769 +110 +2 +1 + + + +2018-08-19 08:08 + +Legoman +14598 +110 +1 +1 + + +TomTom +3582 +110 +0 +4 + + + +2018-08-19 08:08 + +Paulip +13344 +110 +2 +5 + + +podpeintur +26135 +110 +0 +1 + + + +2018-08-19 08:08 + +Chatman +15248 +110 +1 +4 + + +Alinadrel +23447 +110 +2 +3 + + + +2018-08-19 08:08 + +Lord_Bojo +7539 +110 +2 +5 + + +Meowtrez +23445 +110 +1 +1 + + + +2018-08-19 08:08 + +holleb +16821 +110 +3 +1 + + +sathyakirin +26134 +110 +0 +3 + + + +2018-08-19 08:08 + +dams +11801 +110 +1 +1 + + +Ishtar +25870 +110 +2 +3 + + + +2018-08-19 13:08 + +darthmael +11132 +110 +2 +3 + + +Chavrouze51 +16353 +110 +1 +1 + + + +2018-08-19 13:08 + +Boeufbowl +10761 +110 +1 +6 + + +Sebotouno +16213 +110 +0 +2 + + + +2018-08-19 13:08 + +silkoun +14616 +110 +1 +2 + + +zahiko +13997 +110 +1 +4 + + + +2018-08-19 13:08 + +Hely +15578 +110 +0 +2 + + +Clement0 +18970 +110 +1 +0 + + + +2018-08-19 13:08 + +G16 +8559 +110 +1 +0 + + +Corrupt +22668 +110 +1 +1 + + + +2018-08-19 13:08 + +Galladur +11134 +110 +1 +1 + + +zoul +11077 +110 +0 +0 + + + +2018-08-19 13:08 + +Olivierdulac +18901 +110 +0 +0 + + +ghorghor +21919 +110 +2 +4 + + + +2018-08-19 13:08 + +Miyata +13563 +110 +1 +1 + + +Pilaf +21736 +110 +3 +2 + + + +2018-08-19 13:08 + +rippersly +13335 +110 +2 +5 + + +biereforever +21487 +110 +0 +0 + + + +2018-08-19 13:08 + +Samdulac +19452 +110 +2 +1 + + +cyg-obsidian +21201 +110 +1 +2 + + + +2018-08-19 13:08 + +Talkarde +4398 +110 +2 +3 + + +jersinho07 +21819 +110 +0 +0 + + + +2018-08-19 13:08 + +Foxxx +18903 +110 +1 +1 + + +Kesta +9519 +110 +2 +0 + + + +2018-08-19 13:08 + +Raztout +16824 +110 +1 +4 + + +Paulip +13344 +110 +1 +2 + + + +2018-08-19 13:08 + +JP +15682 +110 +1 +2 + + +Lord_Bojo +7539 +110 +2 +1 + + + +2018-08-19 13:08 + +Albius +22726 +110 +2 +0 + + +Chatman +15248 +110 +2 +3 + + + +2018-08-19 13:08 + +Superdave +15683 +110 +0 +1 + + +holleb +16821 +110 +1 +1 + + + +2018-08-19 13:08 + +Oni +18902 +110 +2 +2 + + +dams +11801 +110 +0 +0 + + + +2018-08-19 13:08 + +Crom +11783 +110 +0 +3 + + +nicodaz +6833 +110 +2 +1 + + + +2018-08-19 13:08 + +Mad_Coach +24053 +110 +1 +1 + + +commodore_protheus +12133 +110 +2 +5 + + + +2018-08-19 13:08 + +Fricotti +13345 +110 +1 +0 + + +doudou +12769 +110 +2 +0 + + + +2018-08-19 13:08 + +pop +17719 +110 +0 +1 + + +Patxi +12005 +110 +2 +4 + + + +2018-08-19 13:08 + +LordUhr +15579 +110 +3 +3 + + +Miko +2808 +110 +1 +1 + + + +2018-08-19 13:08 + +Leto +17484 +110 +1 +0 + + +TomTom +3582 +110 +0 +5 + + + +2018-08-19 13:08 + +Alinadrel +23447 +110 +1 +1 + + +kador +15293 +110 +2 +1 + + + +2018-08-19 13:08 + +podpeintur +26135 +110 +0 +1 + + +Haktar +8734 +110 +3 +3 + + + +2018-08-19 13:08 + +Meowtrez +23445 +110 +3 +0 + + +tiguitare +24004 +110 +1 +4 + + + +2018-08-19 13:08 + +krougmolotov +26119 +110 +1 +2 + + +firedept +22776 +110 +0 +1 + + + +2018-08-19 13:08 + +Ishtar +25870 +110 +2 +6 + + +Legoman +14598 +110 +0 +1 + + + +2018-08-19 13:08 + +sathyakirin +26134 +110 +1 +1 + + +Nate_River +19264 +110 +1 +3 + + + diff --git a/test/tournaments/stress_cup_pool9.xml b/test/tournaments/stress_cup_pool9.xml new file mode 100644 index 00000000..1b2d6a20 --- /dev/null +++ b/test/tournaments/stress_cup_pool9.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool9_r1.xml b/test/tournaments/stress_cup_pool9_r1.xml new file mode 100644 index 00000000..46469ce1 --- /dev/null +++ b/test/tournaments/stress_cup_pool9_r1.xml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool9_r11.xml b/test/tournaments/stress_cup_pool9_r11.xml new file mode 100644 index 00000000..be82728c --- /dev/null +++ b/test/tournaments/stress_cup_pool9_r11.xml @@ -0,0 +1,1389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAABAhklEQVR42s28BVxVz9YGfALOObSiqICt2N3dHaSU0t2NhKKIAYgB2IoCoiKg0t3dcJruTlsB9X7fmr0BMe///t77fu83Pi7XzJ69Z8+z11qz5px9JGhfzDP2Kvj/LUyuFJh4IeD6T4eMvYaPjvb570LPq4hw61VlclFrfFFnQlHH/1fojC/uQijphnGR/DMSS4eB6z8dwmVCCcJPR/8r8IutJ/jH1bHq+0uq+kt/i+oR+R8pIGvfIqXmzXfUvkOy7l1p3fuSehwfSjH5F5Q2fGA1ffh7n/8iius+FNW9L8V0RvMn/8RGgtfzyjx2bz7n94BDgFx2z3+kwIm57JFzOX15GL4rFW/yK/rzq97kc/vzK9/kV73NrXqbj2Gsklf5Nq/qXX71u4JqJBHwo9XvcrF2XEIfvNtPyIMOlW8zuW+zK95mVQwr6Zw32ZgOLRmYjreAjvfJqRxGJvcNXPZqWDXB7TE3vbwrl9WTzezOZvb8hExGNwK9+z9S4FLfq8zeTLgOQm8muy+ThZDNBvRmc/oRuG8yuG+yua8B2E2D/gbuL5PzGiTcKxABAAU/hOYzRuKzza78GdCYxn4zgtdAxK9I/UM7Dhjd43kVwcmPFV/YARwB0sqG5c8o/zdKUkknyOTSrtQyBFDSfrwOumx5Vwq9F5BK70kFhdGbwuxPY71OY/WnM/vQNEBhv4bJgJLCeg13j08AiMjA7jgNAxyCzngHNMkRBe8wrLDfJDNfJzL6k5gImPL6F/y+PRkB3QDo54IqCeY+pRE5rUmlaFbxxZ0gE4ohiP5niCsakRjw6ncUdQKDiViHBCyUJpT1JtD7kst7Eul9CQj9GEaV/ngM+O3C/OF2ExhoPoBRZWwVuuF98FNAiSvvjy77AbHlCKDEjCB2pE/UaLfy/hgMcfT+iJI+uwdsAqyOoenNsYUdUXntvyI6/5/i186oBUNUQUdUQWdUYWd0QUdMUReO2OLuaIQeQGxJTwymxJT2xZT2YhIpsdiNIsBMoAXNoW9EQS34nPEOcdjE8Jao0r6I4r5whF6YJyhQjSxBiMCAK+EjeFX6Ory0H/Cy9DWOqPLXIbldpjfoBD2PfP+Ehqi8tvDsVhyvRpWs/wD4icPV7BE5jLZXOYB2wMu8zvDc9vCCroj8znBAYU94UU9EEZIYekdkL2os7o0cmeqrot5fgU8VuoWPoQNawgp6Q/N7EAr+IXq/oxABKHuQ1qHuWUJQOpd/I7wGpvcys/VlVuuLzJaQ9JbQjJawjJbnac3B/wzQE/oHp7cGp7cEp7U8Q7L5eWYbasloe57ZHpzZhqpZ7QCohmW3P8/pepHbGZbfE1bY96Kw/0XR6+8o7A8r6AtF6H1R2PsSA0wjJK8b5oxLHNAeNqZPWEEP6CH5Pc/yeoKyu59kdz3N7XmS0/0kt/tpbvc/VILh3Jzu0MK+W3HNym4FBIWz+VdCKmGGT5KbfkIQIAlH47/FE6wzJhsfJzZ+Px1reZrSBHiS1hqU1vYsvfVpVsfjlOY7UVyPx7kO18Js3O6aOl0xtPfUtXE3c75qc/Ghs8+rq0Fp9+NqYZIw4WB09z3YhPFpoyrgeV4ProxFYFZ3YEbHo8yuR5nd/lndmNKFK/6/tIwqgdlIBmR3B2J4ktdzPbJB/kweQdop7dLjUphDQEJDQHzDzxJTHsXVA/zj6iGzBOVhLMIjrOqPHcKP/vaQX2IzXORRUktAcotfUuudiIoLD1LUba4ckFVfvn7XvKVrZ0gtmjFz1rSpkhISElMkJKdNmzZz9tzZ85csWrZqzZZ9R1X0DE/f8nycez+xAc0hqwemDTN5mIEm8zinOyALAQ4FYIBDd1M776d0gATcS+28kzKsjLb8Vrmf1oVLDJ33s3ouhDdKO2cTDjlkOd2n+8XU34+uG8W9qFpc4rj7P8CdmIb7MQ23I2suPsrStLu2fpfcgsXLV65eJ6eg6Ojo8OjRo9iYmKzs3JKS0rKysvKystLS0ry83IT4+ICAgPNubmrqGus2blmxeuOOo2rG5x55hDLvJnfcS+2CacPE/NK78BmC8iAdzQ3abyZ13EzqxNBxI6nDN74Na+nwSezwTey4lYx3+COgA+BOateZZzWHnLIJe23SbW6U3I6oAdwKr7kZXnMroubGq2pc/gqfF1U+L6u8X1SBjkto8X1ZjVdBAeDtOLwj6k7fTZc3PLdo3a7Va9YaGBo9DgoqLy9/8+bNly9fhr6XL78oQ1++fnn//j2bzQ4NDTU3t9iwddfqnXJaVpfcn5ffSem6kdR5OwUZCI6b2MS8Ezq84tq94tquRTeDciWu3Tu2BWtBuBbfcTW+fbT6W+B9vBM77B5V7j2ZTdhlnWZyvRSmdC2s6npYFcQjr5BKUK6FVoL+Ky4/r4DdCUhcH20ZVUaPeoXVugWVKJtdnLdy65r1m93c3IqLS16/fg28DAwMfPr06ePHjx/+WqADdPv8+TOQ9fbtWzCxK15Xdu7au3K7rKHrQ49XNdcSu64ndFzDALO6Et9+MbL1QkTLhcjWi+HNIEfhEdN2KbrNPboNFKiCcimqFYC3DB+KRTo6BHpcu9Fdzm7bDMI281htzyLP4IrLGNyfcT2eVbg/5XoEI3np6XD10o9wHyMv/eZoxaVnlWYe4Wt2H1u4eKmDgyODwUCz/fjx3bt3YDtvsfLmPylwIk5oZWXl+QsXNm3ZtkPeyO5upkdMu2ds++XYdjS3mDa3l01uLxrOvWxyfdUCcENKMyjnwlHVNRwpZzEFr+I4h8kzMa3nIlrcoBrR4hLTpunD2mGdQdhiFnv8fP75IM7FJ9wLQRy3QM75xxzXADYuxyr/GJzTD4pVzK/MWbzm4MGDEZGRvX197e3tVVVVbBabxUJ/KyoqGhoaujo7e3t7e/5Z6e7uxpXX/f1ghmnp6UpKSkvX7tA5E+T6ouFiVBuaZGi9c2iTc1izS0g9yLHKKUwi5UWzY+h3HVdOvxiuurxsOY3Lly2KXowtFumETSZxsqdyTj9knfFnnX6E4PKI5ezHcvoBTAyjyh/h/JBtczNvj7Kl5LSZOjo6EHFbWlroWGmor+/o6IAZdnS019XWgr8UFxdXVVW2tra2/UeltRXohutUVFTa2jvMW7rukP5Fp+Bql1et9k/rbZ422D5tsHnW+CvsghvtnzfZPB2ugm4X3ARyVDmJwT64CRi0D2mWuVC6xiSNsNkk+rBjlu1dhsMDJuDkfabDfZCM77jHsLuD4S7D9jbdBsNvlDt0u7tMQ6/MtQc0xaZIWltbV1ZVcbjcgoKC5uZmiCMQer4Nl6+gQ3BpbGzMzYX1q6Surq7hD6URK789BNTX19ddvHhp9rzFu4/bmTxgWAfVWwXWWgXUmAQixfxxg0XQD7B88rNuiWG0ZbjxSYNZUMOBs8UrjNII642SD5zMtLxZDjOEeVrdolvepFv9CIsb5QBzTP5JgbMMPdNX7tOaIDbZ3t6ey+XCUpWdnQNP++sfCtAEBpGdnZ2XlwdOV41K1QiwCnglmw3xCwwQJBMr0AJhCD9aW1sL/7i7u8+YLbVe1tTgZomhf73Bo3p9v1rjB1X6D+tAHwNU1YcOOB7VGwUgxTCwwTAAQ+CwNAps0POv33GqCBG0Si9xj3Wa0bUSmKeZL4KpD4LhtVITnzJQQBpeLzW6Xqp/teQnGHuXgTRCR8u03LNWHtAXEhmvqakJ8wF2UlJSYBqwYA39uYBl1dTUpKamAkcsFnMYbCaTxSwsLATuwA2BhY6OTjwAAaHACzTCUaAMerI5wBjbxtZ+/CSJDSouujcYOg9qde/XgMShO6L8BGjX9cOUh3Xajxp0HtUDtP0bdDBo+tVtdSpcDgSt0E3YYJKqfbkY5mlwDbGge6UYoONVjCsIXsXQAYcWQhGuDDd6FWu656+VsREQEtm6bXtaWjrEl+Tk5Pz8vO6urs+f8PIZw6j+CV/mQXR3d0GoSkpKAo5KUCnOL8iH09PS0urr6qAP8Pj1CxjcN9zoBgcH+/v78SHgFCALHkZObq6MjAzfOPFN6h5KN2vUb3BO3K46cbta5U6N+r1a1btjcGcYGvdqj98dVqBd7X7d8XsIoKjerTtxp3qzXe4SvWTCSt2EtUbJqhcKcFI0PYq0PIs0PYs0PIrU3AsxFKm7Fx2/WHjiEgIoqheRHFag5UL+Tr27IhOmwF7h5s2bcMepWOFy2LBEvX+HlffvEX4pkAf29fWBEWVlZQFHEJIyMzPj4uKAnebmpoHBz4NDgwPwZ3AQaAI5MIBVhwbhXOAyNjYWeiJmi4sDAgLnSUlNkJi7xywIOFL0rVTy5sr5VB27UX3s5ghujAFWVbpVg3C7ZkSpVbxVewxwo2qtdc4C/VTCMp2EFfpJx1zz8MmrXChQxaByvkAZh1u+khsmXXOUzuUquwJyjp3LVziXD4qiW8EO0+CJc9eTeXhUVI+npqVnZKTDDME7YNpdXV2vUekfwesRiQpkN7B4Q0ApQ9uLPDgrKSk5KioqIyMDGt++e/vd5n4uYFgfYfkDNqE/+DIoQLGpmRmNSpFYumvf2XQZn2qZ65XD8P6uyHojedS7Stq7CrX4VB/1rZH2rUH9Ab6oCjh4rWqpWbaUVhJhkVb8Eq0E6VM5SucLYLYgj7lhOJuj4JoPisKZHDmXHAWXLBlcns4ByJ7ORopL7hH7+LkbjhFJ5KlTJcF8wHDgqUZHxxQVF8HaBHOAZKe7C9yoC0P3KCCgVFVXwV7M0dFJS0vbzNz8wYMHYS9eJSYmcTgciDWj+SRklHhSOaIPl67OLuiZmJgYERERHx8PHvf06VMpKSkyL2XeHoO9F+l7vCoQLlccuFKxDwMoB69W7L9Sue9q1f6rVfuuVB68Xv0TDnkDavZ5chYbpM7WTCIs0IhfrJVw0DlH2jUf4UzeYYBL3qHTeYeccw+fzQd51Ckb5CGnHGmn7IOOOaM44JC9QvYsBGYSibxv//7w8HB4nq9ehUdFx8Cus6GhHlbopqam0UwHVjQsj0GJTH1Dgw9W4OH7+/svWbps//4DN2/dun37toeHB1ykqbEJ0si+XpRLjs0m8UYwPbgOPAOI1q9evXr58mVERGRMTKyKiiqZTKaOm7pGz3/35Yq9l5i7Pbmg/HPsvVIJ2HmBOUc7ZaZmMmGeeryUetwOm8xDp3IPOueimTshHMBZwFr2n8zea5+11y5rn33WbpuMXTYZuxEytxiHiszaQCSS+Pj4bGxs4EZDQkKeP38eExMDG3OU3QAN9d/TmdGkBlIYmBi45KlTp65eu3b9+vVNmzaJTZoiIyuncEzxyFHpdes3+D/yhwTqD7liGxwC6uvr62HFjIyMfvr0yfOQEKDJ9ZzbuPGiRCJxwtKDa51zt1zibrvE3ubG2HKpYtMF7uaL3I0XuaBA+1asZZtn5UaPqi2elbiyyQNk5WbPqk2u9FnaqbO1UgizjsfOVI3dZpWxzyFn98mcPQBgwS5rp132LvvsnfbZu20zQdlunbHTKn2HVfo2y2G5zSp19l5zXpogiUicNFn88mWvJ0+C/P0fBQQEgB3BwgQxqPYPBWiCILV+w8ZpM2bNX7Bw3vwFQsLCfALCc+YtPungCFYkJTVPTU0dkinoCSzU/5gi1mMF/oFnAASBRwcEgBU+CgwM9PX1Xbx4CYFAIPOLzpJz33qmbK0bd+UZ9rqzzJVnOIDNZ8tXu3JWn+OudqtYdY677lLlmguVay8irLlYuc69au2lKpArTzOmqSfPOB5PmK4cLXksarNF+ha77B12Wdtss7baZG6yytxqlbHFNnuzbfY26wxUtczYaJGxwTxjnTlS1pllrtAOEp62hEQkkEikpctWgLPcu3fv7t27IMCOwEAqK6uAo+pfUV1dW1cH67SCggK4AxErcJEZM2ev37BpxsxZs2bNFhYW1jcwgBADFNT+ucCl4DoQg+7cuYMNfe/mzRs7d+6Cy8KNTZy/bZFl4oqz3BVnOBvP0IEmUMZi5VnuKlfu2BbEmit31bmKRfZl4seTpqklIQsCgtYYpQAdG6yyNlplrbfIXGOeuRZgAcgCRtaYpq81SVttnLraMHm1YQpgpWGSxHYTXiofCZvbxo0bwU2AI1+sgBFBZIFdaUVlJQ68jOqQ7IEMCgraunUrcMHPzz9n7lxtbe1Tp05v37Fj9tx5+w8cCAsLq/53BUwMlr/g4Gf4uDdu3AApf0yJSuMjEgm8ghMl5S4vcixe5FiyyKl06SnGklOM5S7sRafYIJef4Sx3wYCoYQ/rwy3cBbalk1USphxPAguKEZePXKafAqSsNkNYaZa5CqQp0leZZq4ySl1hnLbcIGWVYepKg+TlBsnLDNMWHn8qNHM1bj5Qtm/f7ul52cPTE+Kr5+XLsJzBmg1eBiZQMbZwuT/WuPEJCVeuXj/rev7GrfveN+95+94ODAoOCQvPyMzG+3JHTuGOlLE6RLqEhASwHRgWAPdw9dp1leNqfHz8YJU8PDwC8w/Os8yc68CQcqDPO1km5cicd7JUypExz5Eh5cTBMc+JvfDU9yoG7myrUjHlhEnKCYigiUdfLdBKXI2RstwkA/Lr5cZpiw3SlplkLDXJWGSYtkQ/daFu8gLd5EW6yaDM100R33OOLDCRNFK2b9/h5nb+LFbOnDlz8eLFJ0+eQNYHuwHgCGbC+blwWZxKJpvLYZWxC+MLkoOzXnr6X9F64K4a7u+aH+9XnB3DKM2HTQeLXQG98f0EXlCVzYa9SHl5GWSJYIYXLlyAQfGhQVdRPcHPL4C7LWXctOmqgbNty2fblM2yYcyxo8+yoc+2Y+GYc5KN4IDkLAfObEcEUOY6cadZlo0/Fj9BMZ4wSSYcEaSZANQsMc5YZJS+UC9lgW4KsIB0g3QpnZR5uikgpbRT5molzVFPmKMeK7RYjkTmGSVo/fr1DmOKo6PjlatXo6OjCwry0Y4JFXyfxYLdJtp8lqSzsvyqc43q8lXaC1V6ikz6Ss26yk52FQBMWjI0qhJUGl+qcMPN6El3GMXZsFVlYlcAyWAyYG9RVFQE7EDic8ndHcYbHRqWxaPSsjTMgtCd8VCFt1hNtSiStKRPsyoHTLUqn25Nn25Fn2HNmGbLmm7LmmqLlGl27Ol27GkYZtixxU2KBeXjhRQSCOMOvxQ8+GKqUsxcvXQpvTQp3dR5OoiOuTqp8/UBabO1UxApmkmz1eJnnoiffSJuqsIzithCEok4StCCBYssfix2dnaQ0UD+VlBQAHEUZoUxwygtY9BzX9Qnbeunqwx0+XzpT/v2qeLrQNvQQMe3L33fBgFdXz+3ff1Q87U7r5/uXO2/oiDmbn5BEWwsSktLIP+EoAOpNqSjfn5+rq6ukF6MDmppaQnVrdu28VIow3dGJNKmb5ikHSduVi5hXiZuXjbFolzcEkCXsCyXsALQJaxKxa3oU2yYk6yZYhaMCeYMQTMmTSufdCSGJhOLCKLuDxM+GiGsmDxRORHC0pQTKVPVAcmzdNJm6aRP00qfoZ4keSJxxokEcdV4WPnGbXchUYVIY8rUadN1dfWMjY2NRmBgYAD3CsEIZoJvytGXFuXlBYXFmanRpZFynxrt/zXU9K+hnn8NtAO+faxD+FT/7UP1t/dV3z7U/OtTzbsS2zgf6YcP7kKGFQfhKiEBrgY65N8Qb2xtbY3GjAgwNjGBcRctXvz90UGoHjd1vPx9MbPySaZlEzGImZVNgqp5+QQL+gSz8vFmZcLGpXxGdIphOVmvjKhXTtSnE07kEw+PIUhAOkpQIUlAPhEgJBcnJB8vrBAnqpo2XiVVTDVpkmoihKspKvFIKscLLFLk4aWMJUhQUFBOTk4L1iEdbU0tLVxR11A3MTUBXwsNDYW5gUfAk4d9E+wnbtzwSArc/IGjONh/ffD1zcHXvkP9j771pXztTvnam/q1J/1bd+pnukPh3e33b/s+DnoaHBz85MlTb2/vc+fOOTk5mZmZoUHGjIUpWrp6ukrKKmKTJg/7F8YQmSoksNVOxKhQxKhY2LhMyLhM0KiU37CYalhGMSgl65aSdMtIemUEXQSibvkIQXk/EMQvHT1eMVHoWJIAoilBQC5eQC5OWCkV+OKTiaVKxwrKxPDLxAjKxvIfCuWR2DjWv5Cn8/CuXbdO9biqsooyDhUVFVw5ceIEzOfKlSvPnwe/ePEClmTIVi56ermetcgJWf62QvB9vdDHBpHP9aKfa+d94h742Gw01Hb1A9exNGhl6KOLGZk5kBP29/fD/g02ei4uLopQlBSxi6uMDDcyltqJXbt3U6jUsfcGRkSZf5SqkUrRKyLrlhC1SojapQQcOhgv2qWIFxx6wwQRVbJ+IEhQOgpcbLwSxhEQhEwpXkQ5TUgxGToJyMZSj0TxHonmlY4jb/cmj5sxusCPlhkzZkrL/KZIS0traGg8fhwIuQ/kjbAAQTRJT08PDXt1/7ZXeeT8PiahjzsCNqG3gPYhf3592LxnN4xevnoFiTJsuwYGBr99+/blyxfYXgQFPdbT1Tt8+PCvY4EVw2b1pxuDW+WRXE+SjyRoliBSNIsJIwQRdcB8Sr8TBLzg0PsdQUCHiFIycjSFZIyjBBGVdCEwIrAm2ViwI9qRSIp0HO8mNx4BsZ8IApMWEBTatHnrwYOHDh06vHfvPpgASICJiUlaetqHDx/+hRWY5+fPnzs7OyFLCg2LCLh9mh45F3FUQeilE3qKiN25hLY4auxNuaCg4Pz8fNi1ffz44cuX4U9p4QpwOiQQEI8PHDiwf/9+GBFGgUFh4B07dwoKCf1CEJFHZCr5sD9Bh47xUvIzQbhz6dH/RpAQRhBEHLAjIcUUYAeYGn8iCxGkgLyMJg2OFkc98IRn1m4yD4VE+vU2iNOnz9ixY+euXbsh2Qfs3r0H4gWkLfjH9WM/ioY5w46zqLg4OOTlI9+T5RFSfQxiH4vQRyd0JpHTHmz0f+Cblp4J+4x37959GaUHK/jH/pBGn79wHqiBFAzGgkFhaNimoE3GL4XMSyUvOUE8kUHQKiFr549yhBMEtgO+hngZNaI/WpBKOrIaIEghSfBY8ng1nKAkftl46Eo99GT8CrU58xZSqTTS7wqVRlu4aMm2bTs2bNi0afOWs2ddYWP50/RGOXr//h3syMFGnj0LfuRrx3oxqaeQ0JNDZPnPD7h9LiomATLmvr6+wcHB337gDyTBrh4y0m3bd2zYuAloWrxkKeSHv70xfgEBqUUr+NebEI+noLjzowV9J+hvLiYTPe54Jk6QiHKqoGKKsHKaqHr2uOMZwBS/XALvwaBxK5QcnJxPqGvBEyH9oQgKicDGdcXK1fYnHZqammEm6BPl3xX822TYrENe8/RZ8GNvvYpnYvUvRYNv24a9jKKXl3d1dn7+/Okv34jgX4q4ubmtXbd+ydJl48aN/9Nd8fLympqamFraCq4zIKgCR+U4QTx6JcDR98D8d4LGn8gUUc0Yp5IuqpICRiSimi6qkQOsCSqmUsB2Vio5Op2GzB/WEAKBQPpzGTd+graOXk1N7dCXoYHBgS9DX/40STj65s0bWKQgUQp+Hhp2xyLirlZIaGh+QUFLS/P7D+9/a32j/IJxQQeg2NzcXHTChL/cEri/np4ebHiMTMwF12gTVJKRyeiUEEeX9rHs/D4GycYAQRB0wGTAiMB8gJqJWnkgaYeDxq9QtLKxKyoshOgIcfEvBMGhhQsXJiUlDQwMfP48gH/e/hcrgD7gR7W1tXl5+bFxCbDFBaeD0PPmzeu/nDj69QYaYXAITlm+YsWY3Oc3RVZOFpYFeBK6+oZ8q7QJykkoJ9TF0sLfEFROVEn/kSCZaHCoCScyxqsMRyJgSkyvUFA2WGSJrIGhcVRUJOwbXr58uW3btj8RBLcoLCx86dIlSFvAOz4jcgb/Pk/8q7He3t6GhkZ8W9vY0NjX24d/E/snz/pO0ODAp8+fYYn08fEdLzrhLxzt27cPsnCYQmRkhIqaFt9KbZJq3HDi8wtBJAMGSSX1B4JEZCLFtHImamSPRiJRjVxR5Reiy2WPq2k89PMLCPAPDAy4e/fumjVr/kQQmYdHVlYW5vnxw4dPnz7h5vNPyqdPH9++fYN9+twDTvfp46d/eOIAIgh9yVFTU33ihBqFQvkTR+s3bPD398dmEXj//j1Z+WP8K9SQr+nShwPQmGWeZMj8TpDokVf8B14Iy0RO0soR08zG446ISoagzDOxFdLy8vIeHh5eXl4QC2H/qaKiKi4u/tubgMY5c+c+evQQJvnhw3v0Wg/2LdYo/j7PzwNgcugFGTC9f8rryInwPMBPYUMDC9mfCJo0ecrRo9KmpmawWbns5eXu7r7/4BG+ZcdJxyKI+oxht/otQRNkIoRgQy8XO0k7d5JmFhAkqp7Df/jxuEWQhu2D7Z+GpsbOXXsWL1k2efJk9EHUH5yLj59fX98AdqRgAoggcJLBHzDK1OdfFFwf6TkwtvNv+3/+fgpEOuD1w7u3b9kslqWVtYCg4J/cn4eHR1RUdN68+Xv37dfQ1DQ1Nd2ybafgIhmySixRn/mDi/1AkHS40KGXIgrxk3XypmhlTdDMFZEOoM7YOn/+/DVr106RnMEvIAiXxgPwX5x8xcpVgY8fQ+Lz9u27D5iLfUZx6H8KiOJ/PvQZ2R0yvA/v37+HrApC5Lr1G/6+nEGBVR9211JS87Zs2Sw1fxFt7l6SYsQPFmTAJB0bdTGZyGGC9AuBowkKT3lmbOelUEayQeKP+H0By4IdaVZWVkdHB+S+mIt9/E/wx29Q/10H7FtWxM/7rq4uWM7s7e2FRUT+vqKhifBQyVRBiqDouOnL+Ketoay3JmoVjiWIrJBMPhSFCBJTiAaCJijGTdEvFNMtEFMOF911RWiTk8BGc0irKIuUqVPXUyYt5hk3g0dgMplvHIkXiCP/9FjmL1j48OFDWEd7enrwb9yxdwzf/2P8XPAvl2HqI8D+/lQ+4Y3YSO/fw9LJYDCCgoLA8H8miMzLM0GKMvcAzyIV0gpDng02PNvdSPtukI76k+RDyUqR5BOJRL3SYYLAvwxZJIUU0qFozMXkowUPvxJVjBM3LJqsX4Q40ikERxPTzRM3LRTTyZmgljJeNUFYPkLk0FOB/b6UpRpkmjBpzB2AA6qpqSUmJsL6BXf57h+U9//tAtd8/fp1VVVVSkqKgaER38hn0sMfCdFEeHZeIGrkEjXzidrFJEigkUMxUOgxYBENmAg4O7DAAzvgYgqjMUg+RuRo+ESleHHjkimGxZP0gJR8IAjImmrJmGJUMlE7X1QzF8shM8ep5QjsukIWnDS6m4f7kJSUvHz5MvhXTU0N3OXbf1D+CYm/dvvtiXgb/koo5FA5ubne3t4zZswkjBJEJPCKziHJPgc6COhjjTKyHrb/0i37OT/ECCL+RNBEhZjxkAQpJ0gYFwNBkw2KIBJN1s6ZbFgsac0SNy6dpFcwUTsP0ki0wGnmCRx6xAPjjRAEkXvTpk0hISHg/w319a/7+9/+HxUgqLW1taCgAEL1nj17v2/rgaApK8jK0ZDyoE82dLDsWe+HxGcMQcyfLWiSUpzwEWRB0y1KJEyKgKMpBkWTdAtAmWnHEjctA5uaqIOMCBGkkTteOYE2fTsesMF8qFSqurpGQkJCcXFxU1PT2Ldb/utl7FvBY1twBWR7ezvcBmx0zC3M+fj4RmMkeb4cUT0bzwl/v/nCQs8wOzhGCRJTjAMLmqSSMN2iVNKsRNwIczT9QvC4WfYsSfNy5HS6BcDRBK08zIgy+FZo4Bt6MB8xMbFzbm7paWmQAcFC24dKL/yFYNQ3pqDqP8RfysjR/t8poMIaWl5Oz8jIgMxWTGzSMDtUIZ6NjrBrJ/yWl7EEGY4QZPQHgqZZlEpgkQgCkIRJ6ayTHAkrJlRR5MYwQSsXQpLQPi8y33icoPnzF/j5+cEmkE6nNze39P6fFiCIyWTCzTx+/HjR4iW4f5HHzSQfevTHoDM2NhuyRjgacTHpMQTNsCyfblmCjMi4FMxHwrRslgNH0oYlblIKgQm3IxyiKi8oEitxL9uydWtoWFhOTi6LxWppbunp7u7p+p9hzKvjPVDrxpThavdf3jOHLQ64GJvNzsvLi4iIgN0ptpAReaZtIinHEfToxL9Y0IhzgUI2Zn8nSCZumKApx5NmWpVPs6BPNS+TNCvGCZrjwJlhx5IwK4cq4ggySX2UCkzUzqYuO4GyC15eZWXVmNg49I4qmwUu1tnZ2YXh35bRbpjS9Qf8/egPPbu7utpa27gcDsRpiIk6OjoQH1FCuMacqFP8N/MZXbyMWGRDRBB5lCC5BIKkcixO0GxbxgwrxlRzoAksqBQImu1YMcOBK2lBByNCwRtb4zBZLLL3Kpl/Io1KNTYxhgyosLCAzWY1NjV1/J8WWMW4XG5RUVFycvKpU6cnTZpMEpIgywShleuvAQhzLhYJqAHzMeZ8D9KIIJU4UdkoCfXU2XbMmdaM6ZZgROXAjqRZmZRzxezTVdOsmZgRlUL8RiHcqHiKcZmYWgxl2nrY0Tg6OsKqUVhYCFlifUND6/9pgWUUCCopKYF00dPDc86cOTzzjqL8UJ/+bwgyYmOxGbGDOIIgrYgI4pNPJEiqxkMqBATNtWfMtoEwRAdHkzQrh/VroUvF/DPV022YEhZ0oAwHMDUZopJhkdBWB5GJkhcvXoTHBQSB89fV1YGXtbS0NP/vlBas/OVofX09EFRcXJKSmnr79p0lqzaQtp0j/lvnGonQyHYwgshG2G7+aAzfsSTCDLUEUbkoCQ0giDnLhg5GNMOKjgWj8kVnKqVc62basadbMSQws0IwAYAPlk1Ui5y0aNe1q1cxFytkspiQScMzxN9CHH0d8dcfW+Bvdv5vlLq6WnhOhUVFYEF+D+6vlrUmqCQgCv5K0PDiNWI+ZGNkSkSVTKJMNE0hgTBLM3mCQoykRuoiJ/TKzEybYS8Djha6Vi+4UA+OhlwPOLJkIFMyGzEloOnQhSvXfGJiYnNzc8rLyysrK355nfCX8u+O/09KZWUlnUHPzc2Nj4u7fuPeXA3/fxubyQZ0shEegDgYhsMQUSWbKBNLU0gkzNFKnqIUJ6mdtdgJvVA0y5YJoXqaRTlwtNitZrF7o9Spium2LJyjqThH5sMeN00/ydbt5qtX4enp6cUlxfD0wIjA0eqx1yv/VOrhOMLwP6P43gGv1NahPsOor6//flnsHc6fTq+vra3Fv9dOS0t79fKF8dnbfJpJw58W/gFkQwZpxHa++xcQZFqJERRHU0gizNFOkTyRNEM3Y8kp7EUrm++hesn5mmVezfPP1UJCBI3I+6wZkpaYKeEcmZRuNwu5efdhYmICrPSYEVXW/l+UmpraispK/Ecb8fHx3rf8lhiHEfX+aD4ktINnoHXdiDm8cn0niEUyqySp5fNIY6vYXN3UqWpJ041zFp9iz3XkzLFn41xMs6QvcK1edbV50aVGKSfObHvWKEdTrYAmZEfiZvQZRpmazvdCQkJTkpMhAYFEtqKiogov+C+bxpbv1WqE6hqsZeQ3UFVjdDg0tg/e8kdUw4OBoWHDjL9vf8TmIY9OwXdLMQBGMF5GqqgFDz1jecFpMuFSzCvJmvkknKAFBumz1BKkLPKXuXAWODHn2DNwImZZM5a4Vq3zaV3i3jD7VBXiDnNA3NdGQxJwtMgowdnDLyIiEmwbchBIqfFXLYffbB1TxlYrR199/bHn2PYxtb8VGA7SVFgoUlNTX4aFWrndmayfRPiN1QxTw2NYPrxyGY2GnjEwq6RaVfNq5xOlo2nyCYSFhumztFLnW+euOMdd4MSScmTjxgKRaMEp7nqflhVXWxeewQhy5Ey350AUR6/2WWME4SHJpGSTRRhYdWxMDGwUYT+N/+wNktqKMS+lfn+1daT9pzLcbeSUv78hO+ZiHBiupKQYho6Oirx0/d4Cw7Cfv0rG2AFeUMRB1KDQQzakj3UuHDywwJtWUm1qEUFHMAtaBARpp82zyV9zsXKpC0fKkQNrGbIUG8Z8J86mGy2rfdoXnq+bc6pqjiMXOJoN+48RO8IJmmxaNsmk8ICV/+0H/rGxMZmZmcAR7F3R73f/lwsMAcsWDIfYiY7yvv1ohclzsn4ZcYwrjVoNCe3Xh60GHArAY/wbCyKbVSGCdAuQBcliFjRHO3WBbf66y7VA0MJTnLkOHCAIMP90xeY77WtvdCy+ULfgXO1c58q52Fuys0biFAQjCQvGZLNyMdNyccNcGVv/e37AUSzcLhg8hEx4tiz8d86jGHnddVhnIxIxyRolFNpHlZFDTPbIFUapwV4JLSssLMrIzIyJifG5G7DN4jFVr3A43AAvhogXjKBy9KGqIQrJPMbM37jVKEwqeCxqaDY1vHpFaBWTxSxISidlsUPh+qt1q85VAEEQkuc4sOfalc4/xd16q2X9zfalXi2w5M91qQYjAo4QTZAu2bDQLsSSIWbOmGTKmGBKlzTOheh478GD6Kjw1LT0goL80pJiBvq5KZPBZDNYFQwWG4HJHH3pFVPQq8GoOqxjR1nDCmP0EP5bTTYX3JdZXkIvzirOTc1Lj81IeBn7MujBXZ+jlj7i+lGCBln8+rkU/WIS/uWEIQO3IJTyGDGAHfLvrOa7+ZhXUaxreK1rqXrFxKNxyMWWGSOCljmWb7lat+ZC5aJTHMA8tGwxFzhzNvk2b/frXHGtbeGF+oVutXOcK3CCIGDPsGZOteFMt6YvtkpbZ/Vc1u6avq2Lvb3pUw/ZtHvy+Y91OCFarOc6tRFm1a/MuRH29Bh3RsYTZlF6OXormI3wDwuTTWdyGaWFzOxwTrw794VZ9bNjVU8ONYYcrX+h3Bgi2xAiz30qn/pIMd5P8Z67wk1XeaeTugpWF5ebPxUzSCMjz2Kj0IMtVb/GnR9ikEU1xboWOKLplxBlEpAFLTfOAIJWnqJvv16//nLN6vMVS08jjiDczHdir7/etD2gb51vKxAERjTPpXq2E+JojgNnoXXBATs/x7M2wRf2pvlsLHui1J+s+7Hg9CfW3Y/sR9/Bevih2OtNtlNXnEZL0ObGxzu4wZrslLuMogw6k4NsY+RHzaPKqKQzmHQGm1GUyYk5zw2Ua/Jb1hO6vT/d/B3j/rv6uMHekqE3lV/e1X/50Dr0tmGwjzXQXdpfFf+ecedtpnlb2O4cr3n3XA4cd3CbaRYPpkQczQP/RJBpBcWqhgoEWdXwGZTyyMahVWyFacZ8/dRVZ5nbbjdvuFK37lLlKlfu4tPITCBIb7jetCOwb8v9riWeTYvPVc8/Wz3XpQaIO+YcdMf1YJGnZMs98fcpJ4ZqAj91Fn77UPXtY+2/Prd++9z27RPI9mFlsPNfH2uGXlcOtaUOsDz6Xu1svjur4uEOdtwlelkRncGCaEWnl+O/lf5e6OiNelbyvZqHm9t8hbqDln8qO/+lI+Xbm/J/va/+9r7mC7DTT//6turL20qkY9V/va/68q7q6+uyrx3xg2V2fY8laq8Lvri0TtH2kpBxEb6Z+C01IHktqqi2dZgF1VINy0iyMfywWV1pmrlAP23tWeaOO80br9bjP5ha7lYF/iXlzN3o27Trce9Wv55VXo2LztfNP1+//HSZ81ln5hXJDm9i/0PaINPya0fs187Yrx1RXzvjvnZEf20P/9oR87U9ErUgJfxrewT0+YJ364wdanr+5tUmOL39plB1qBo9L6GMzsTeMv+BnrLSUmaUa8sdyS5fQt9Dgc+lDl9agoeanw01BQ01PR5GY+B3Ha824nrQUPNTUD4VaPQ9oHT7EGuvCTk7G04wySMac4fDjcmwwmOCc1TJY1mD1i/rWj67Oipk2HLxfLAXQwQZp24+T995p3mTTxN42ZpLVUsu1i0/X7XApWL15fo9AV07Hnatut665FLDCjeunYtrzdXxvbcJ/YHkdy8FPhXqD1WdHqp2G6pyGaq5NFTlDPogtOA6ki5jWpAcrD7zLnMdnN5zm9jqTeU8VSktyCouQf9zUMlIKSouYyTebLo9tcOX/PoJ+X0Ez8eMQ4Nco6EKu0EE+8Fh5U+wx2D6IXHF2zBeGKv3DrH6ioiW3VmKMZMI1MBqZVZJNuHwmHJ5TTkACM+8ltU021owIiCIBuudXAIf7MXWWGQtMknfeIm7617L1pvNG681rPeoXuNeDTQtO1uxwr3uYFDnrsCedXe6Frk377+UlnF1de8twtsQ8vtInveRvB/iJg+UrBlkKw+yZAbZ8oMsuUG2wiBbBelIgq443AKHWIofS7e/zVnyLl7wfRTP2zCevkByo8/EsnjfbNhEjZSsrOyMjCzuU8XuG0ScHTRWlPBAvvhA4ZLB8g2DzG2DzO1/xrZB+paBomWfs6Z/iKV8TOL9AGOFkPtvEwLO7Z5inkM0rQJ7gYyZbFpBNqvgxWGJwjPNtg6MiM++nmrKJikkoI87VptnLjbO2O5Zsdevdeftps0+TRuvYY7mXrX0fM26Kw1Hn3XtfdK34V73cq+WIxfDS65OehtMgjv+EM3zOZPyOYPyKZ02kD95sERyiCk5yF44yJ4/xJ45yEJyiDVviD17kC01xJk+WCQxUCj5OXfyxxQBOHH4vp+Tu3yIJaE2cfEJ8SMlNi4Oqjn3j/Y9IL17hdj5lEoZyMVBHSjiHywTGeKII7DFhyokhrgSSLKxFo7EIF10sJh/IB/uivo5iwLnwljvInjgth+77Zhknks2r+E14/KA1SAj4vLCzsuihmJZzWeLCAIAQfxmHB6FeETQOquspSYZO70qDga07b3btM23caN347or9Ws9alZfrFrp2XDkWbdc+OtN97pWeHfsOJ8ZcWnthxACPNVPyZSBPOpAIdwxbbCUNsThG2LzDVXyD1Xzf6kR+VIn9LVRCFP4h6r4oX2QyQd9BstpcMrnbCriKJ4XCGq9IRTp5/jkWQiUsLCw4OBnAQEBPrfu37+kzb0p8v4F+WMcLxoIUECF04e42CiV/F/qBb40CnxtFfjaIvC1TfBro8CXGv4vdQLoaAX/IB0bqwCd+CmZ930EuTFIyPCkHQUijlkVr0U18EIxB0eroFhAclgNySHyLLAg21p+IMiiAiyI71giImixWdoen4rDQW37HrbuuNu82bdp/bXGdZ4169yrl7nXH3zSpRj7drt/z7prjWBTeq7eFQHiHyNJn5LQfQ8WAzXohoAFuOOvrYJwr9/aBb91CH7rGlag8UuDABAHfQZZcN98cN+f0nk/RZNbngi52R/ZqH5pp+7ljVpXNutc2a3ntV7Ta5nq5dnHb5jaKlc9HgfdPqeNjFWJLvK1CZEyPETnGLSh4RBxDYgmGOgzEARGFEPuDOX3OC872SyHB9ZyMy7FohKtWRZVPBZVFFCskPkAQThwgnjlE4WUUggbrbOWmWbI3Kw++qR9v38rRKItN5o3eTdCMAJfW3mpZn9Ah2r8mwPPeiHVXnaGucQpX/e0W+q9Ra9f8g6m8wzCfZfREDsNAvAMESOdvwBjCmaF2xHMcyCP520cpfzBZGMzWTGZa7Sj9wSl75B2XyXtukLd780v+5AmfZ8q4ycsffOwtna07/zWUP6hbN6hAgoaq2KYo9+OBY8HCEI2C+ZcRv2YTXqdwJd5f67hKUtRw1Rew3KKEZ1qyoKgQ7WsQoZjicVm65ox7AwTxKOQIKiUTNhplw1h6LBfo3xwh3RAy54HLThHG67WQ1q03rNm+60mlbg3h552r79eseR0wTzbDCmLpC1GPu6ux9Jvz+lNFEDPtpQ2wKAO1NLAyL82C/x8000CX2r5vwA7ZUAN9WMqtTRQ3Mt5xxZlY8G9F6j7vIQPetH2eJI2uyJsOUfd4yl4yBtA3X+Ntv/aLGkXLVO5x9eWlD0Tf5fOhzji8H2p5INrfm0Q+NaKoQ09HuRlGDXQ51MOrfLlxPDrK2wdlBZq+FBUwnk1Unh1sqkGxRRjOjgX1bIaBWbLKuBoLDsCJ+sFHRowghIFwYJ2OOSssc1R9G88/qxNJqj1YGAbcLT9NlryN15vBI42Xa1TjnktHdy58TpnoUPuArPouQYvpmoFz1APWKN1SdNUw+PM9pibC+oSRboyBd+UCL5jCH7kjIAr+I4l+KZAoLdAuC1WuPDxVJ/z69QNZZbJWwnuOkPe6c6z4yJlj6fwvvOUnReHCcI52u0htN8dmALw7vGi7PYUO+S6XslY3Ujew3XTc++lBYEzapOFG9MFO7LGdWSO68ge15wuXJsqXB4m+cp3ie+FtfqWChvVbacfu8Yn7cer8IyiFEo5HsWrmULRy6EalVHNODSLCqAG7IjP5rv5IHZONgg7NglYVVAUk5CL7TmZs8E+T+lxs8qrHmDh0OM2WM5232/ZdgtxtMm7aeOVWrmwnmORfVtvVC12zp9rEjVH7/lMnecSaoETFR+IKdyTULw5V9FzharzAQ1dHXN5M5sjjicPAhxOHjx58qCp9REdM5lDmprLZE2nHnYW2uvGu/MSaacnaet5/p3neHdcoO3xEN53kWfrue8EjXJ04LLgAS++vR5AIs8eL57dnpRdHmB0Ew64Tj96ep6s5UI584VyFqOYK39yhsxZMekrgoevU4/c5TnygFf6IU32EVUugHLsGUXlFUUzGSOolM+CC+zQIPQAO7a1wAsAPAtjpxEIErapElRNF1JJIexzytniVKDytFUnskc5uOPIk/aDAYggANjRlhtN669UHXzcfiLu9aHA1hXnSxaezFpoETtbP2yGToikWiBgiuojMcX7E+TvTlC4KyJ3T+iwr9BhH4DAIV9+wIFrgod8BA5ep+y9zLvLg3eXOxBE2Y3mjCsC+z2FDl3j2X4Bp4a85Rx5qxso0MK310vg4DXhA5f59l+l7r1M2+fFu/cK714v3n3XeRC8yftvkQ/c4jlwi3LwJijUw3coh27zydynHEWgyT6kygdSFZ5QlMIQO2qxVO10qkERzZSBE4TbDr9dHfIp+3ohRA0GpyZRx1ohzRzh46mEfafy9rkWa4a06UX3qL3sPvqsA4xo3yPEEQQjzNfqwaY0E98cC+/ZdrN25YUysKN51mlSFglzTWNn6r2Yrv1cTD1kguqTiSpB45Ufix7zAwjJ3R8nD6H3Nv/R2wLSdwVAHr4hcMibdsCHdsCbtv8Kbf9VvgPXaPvgafsIHval7LmMuNvlwbPnKu9ukFd493gCibSDvkA6hHB0naO3+I7cph25w3v4LvXoPar0A2CB9wgofnwyDyiyAVS5QIr8EzAWqmIwVfE5VTWccjyS93gMRB+KdjpNN5tqWMIH7JhzaJaVo56FW42QA247jaKnmya5tkw5Uy+snYW2Godc8qTd6aYR7fqxvccjeo897zz6tB0t+RhHu7H0euedFs20t5qZHw4/7VzvXbfyInPxmfIFjoXzTxbMtMyWNMuaZpYmYZQkrhcrrhs1XjN6vHr4OLXw8SfCxh8PGaf6fLxqiJDiE2Glp/yKz/gVAgF88gFU2Uc0OX8+uQDBY48F5QN4D97nOXiP56Af76F7PAce8B54wHPAj+fgA6jyywaKKD8TVAkVUn7Op/iUTzGYhvCMCmEFh8pLimoE7XgkVS2Ooh5PUU+gaKVSINwAI+BQBvk0wxKqcRnNBKhho9CDexYele3qRqnB2Zni1jL5XIuocx3leCZNNh4RpODFdEjsM4jt04jsVQ3pUAjtPvq0A+cIbAdi9o47LSoJr7VzPqomvtse0LvOu2X55aal5ysXnK1ceJou5VA607ZsunXxDKt8SYv8yaa5k40zJxtlTDRIEzNIE9VLnqCXMk4nWUQrXkQzdpxmrIhmnIBGvMCJSEG1SGGNGNSoHk2WjSDLviLKgPKCLB3JK/2CJB1Jkokky73gkXlFUYwQ0UwQ1U0U0U4S1EoS0Eri10rm00qmaSZTtVJpOpngO3x6OTS9XKpBAZ9hEc2omGZcxmdSzm9K5zdn8VtwwKf4rCrHUjOWHRGnxgkuTRNcmoGdiWebwd0gePPiBB0+k3fcm3Up47V1yhvd6F6NqF7Flz0yzzuBIPA15G4PW3febZF90aNf+AmMSDr8zZYH3Wt8O1Zea13s0bToYp2Ua7WUa+3s09WznLgzHTmSdmxJW6akTZm4dbmEZbG4ZfFki+LJZoViJgXjDHLH6eeI6OcI6GUL6WUBQBczzhU1yCErp5BUU0iKSaRjSSSlZJJyIkk5GSmqqJ2oksKrmiqonzPRtFjUtETYGEHQqEQAoRQkvwmiA7mPGYvfnI0YwZ3IqorPGvBDHjg2IQR2Jp5pngw+5dYyybVZ2KkRdmQkixpeyyrKiWxEkJxrvvZtjm/pR9fst2bxPdrAUWSv8qsehbBu6WcoZgNHu/07ZZ91GBZ8NGEMaOd+PBjSv+l+z+obnat8O5Zfa1vs3rTwYsOC8/VS5+pnna2f5VI741TNNJc6SccqCYdKSYdKiZMVU2xZU2zZYhb0cWb08WYgy8eZlguZlIuY0SdaMUTNykjqBcQT2SSVDNKJTJJaJvFELlEtH0F9BKBrFFL0y0QtWRPsKsSs2SJWHEFLNkDAkoNgVcFvjUihYQsTn03tKAujEsINvmAJOSCHGueM2AFqxM42i4xQg4NqXcOrloMIUjpfYBRQfZ876FP+2SblDXAEdqQT3asG8ehFj1xoF3AE1gSBSTfvgylzwLDk8/HEtwdC+jf79ay91bXSpwOw7Eor+tzavXHhhXpgau65+jnn6meeRXxNP1MPZIk710k410jYc8VsKybbcQHjbbjjrTkTbDhAopAFi6hVTDyRR1QvJGgUAREgR384+RNIemU0M8542woxp7opjtWiJ6vH21cL2tWCFHaoF7SvFbavBSLAd/CVWwhboWCdEhyJNZhDNeMOhVsN1aZulBocPJY1vOp5iKDjFwstn9aHNn/1qxxyy3l/MvW1fmyfXgzi6EREz7GXyJTA44Am4/S3TnVDwJFByWcIRtKhvTv9e9ZgdoTTtOJ6OzC1xKNpqWfzwov188/Xo3cf3OqnuTYCTQina6edrp16qlbMsWayfQVA3J471bmaz4RBUCvACCr4twQN/9xUrxy8aZxN5RSHaolTdWLO9eMdAQ3jMDnBsVbEsUFkhA5QAKLOjVPONIGxAMTPNk5wbhCwq6X8Qs3PBGm4F7pGt8T2/T8hLd8eVgyezXnvnPnuZGq/WUKfUXy/XmwfOJ1qeO+xsC71xDdunV9PNX2xqhjUyf2olfVBJfa17Mv+vU/7Nt7rBmtae7trlW8nThbyvqutK661LrvcDKFKyr15vjtS5l1onOnaMPVsw9RTNZOc6qadqgHi+AzKMF6KCJpFBK3isT9tR7/B/RUjb0ORDJkUExZEGZGTdXC1KacbJFwaJc41i59rFnNpmnQGLdhQnXK2aYprM0TfiWeawF4E7Oths0o2Qx8JjSWFbFlLssTYsUKfK/Jo5COC5M/knXpWGVz1KYj73rf8rWN8j11Ul1l4p/GLDqOwDp3nbYpP25Uetyo9bjka2OSQ1+dEf2dF/6SX+fZ4Ur9iVC8E76PBXbsfdW6527bxTusa76blXk2rrrWsv9m89kbr2hstq3zal3m1LL3cvORy80L3pnmutXNcqiWdq6c6cKY5cGY4csRtWFTNPKJqNgKEnuM/QqOQqIYsazQMETWLkD/i0C4Zhk4pWbeMasTkM2UJWbBFLFjC1ixBK66gJQeq/GYIFCMm2YCBvT/OGIYheyzIxhyiEVJ4TDg8xmwSxCC5eMI644SjzsnGNxgGNxhavnSly2X7zhbvPVu826Vo9+kikNtcijc7Fm5xLFxrn3fgbJHiNbr0ddZ2T+amC+Wb3crWni1bd7Z0mUvh8lPFyxzylp/MW+RYtNAhZ4l97kLHnMUncxfY5S2wyVtgmzffPH+uce40k9wZxjnTDHKm6mVP1cuaopE2SS1F8FiCgGysgFwcv1wcUmRjvyvo/8kAGc8vF0+TS6Ch//Egnl8hkR993JfEdyyZH/13Gon8oCgk0Y6lwCHqsVR+9FFOAqR5fPKJVPlE2iiOJdNQt2SaYgpSlNJoSqk0xVSacjpSoDqsp6MOx1LGKSb8v+Xr5elEFkVcAAAAAElFTkSuQmCC + + + iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAABAhklEQVR42s28BVxVz9YGfALOObSiqICt2N3dHaSU0t2NhKKIAYgB2IoCoiKg0t3dcJruTlsB9X7fmr0BMe///t77fu83Pi7XzJ69Z8+z11qz5px9JGhfzDP2Kvj/LUyuFJh4IeD6T4eMvYaPjvb570LPq4hw61VlclFrfFFnQlHH/1fojC/uQijphnGR/DMSS4eB6z8dwmVCCcJPR/8r8IutJ/jH1bHq+0uq+kt/i+oR+R8pIGvfIqXmzXfUvkOy7l1p3fuSehwfSjH5F5Q2fGA1ffh7n/8iius+FNW9L8V0RvMn/8RGgtfzyjx2bz7n94BDgFx2z3+kwIm57JFzOX15GL4rFW/yK/rzq97kc/vzK9/kV73NrXqbj2Gsklf5Nq/qXX71u4JqJBHwo9XvcrF2XEIfvNtPyIMOlW8zuW+zK95mVQwr6Zw32ZgOLRmYjreAjvfJqRxGJvcNXPZqWDXB7TE3vbwrl9WTzezOZvb8hExGNwK9+z9S4FLfq8zeTLgOQm8muy+ThZDNBvRmc/oRuG8yuG+yua8B2E2D/gbuL5PzGiTcKxABAAU/hOYzRuKzza78GdCYxn4zgtdAxK9I/UM7Dhjd43kVwcmPFV/YARwB0sqG5c8o/zdKUkknyOTSrtQyBFDSfrwOumx5Vwq9F5BK70kFhdGbwuxPY71OY/WnM/vQNEBhv4bJgJLCeg13j08AiMjA7jgNAxyCzngHNMkRBe8wrLDfJDNfJzL6k5gImPL6F/y+PRkB3QDo54IqCeY+pRE5rUmlaFbxxZ0gE4ohiP5niCsakRjw6ncUdQKDiViHBCyUJpT1JtD7kst7Eul9CQj9GEaV/ngM+O3C/OF2ExhoPoBRZWwVuuF98FNAiSvvjy77AbHlCKDEjCB2pE/UaLfy/hgMcfT+iJI+uwdsAqyOoenNsYUdUXntvyI6/5/i186oBUNUQUdUQWdUYWd0QUdMUReO2OLuaIQeQGxJTwymxJT2xZT2YhIpsdiNIsBMoAXNoW9EQS34nPEOcdjE8Jao0r6I4r5whF6YJyhQjSxBiMCAK+EjeFX6Ory0H/Cy9DWOqPLXIbldpjfoBD2PfP+Ehqi8tvDsVhyvRpWs/wD4icPV7BE5jLZXOYB2wMu8zvDc9vCCroj8znBAYU94UU9EEZIYekdkL2os7o0cmeqrot5fgU8VuoWPoQNawgp6Q/N7EAr+IXq/oxABKHuQ1qHuWUJQOpd/I7wGpvcys/VlVuuLzJaQ9JbQjJawjJbnac3B/wzQE/oHp7cGp7cEp7U8Q7L5eWYbasloe57ZHpzZhqpZ7QCohmW3P8/pepHbGZbfE1bY96Kw/0XR6+8o7A8r6AtF6H1R2PsSA0wjJK8b5oxLHNAeNqZPWEEP6CH5Pc/yeoKyu59kdz3N7XmS0/0kt/tpbvc/VILh3Jzu0MK+W3HNym4FBIWz+VdCKmGGT5KbfkIQIAlH47/FE6wzJhsfJzZ+Px1reZrSBHiS1hqU1vYsvfVpVsfjlOY7UVyPx7kO18Js3O6aOl0xtPfUtXE3c75qc/Ghs8+rq0Fp9+NqYZIw4WB09z3YhPFpoyrgeV4ProxFYFZ3YEbHo8yuR5nd/lndmNKFK/6/tIwqgdlIBmR3B2J4ktdzPbJB/kweQdop7dLjUphDQEJDQHzDzxJTHsXVA/zj6iGzBOVhLMIjrOqPHcKP/vaQX2IzXORRUktAcotfUuudiIoLD1LUba4ckFVfvn7XvKVrZ0gtmjFz1rSpkhISElMkJKdNmzZz9tzZ85csWrZqzZZ9R1X0DE/f8nycez+xAc0hqwemDTN5mIEm8zinOyALAQ4FYIBDd1M776d0gATcS+28kzKsjLb8Vrmf1oVLDJ33s3ouhDdKO2cTDjlkOd2n+8XU34+uG8W9qFpc4rj7P8CdmIb7MQ23I2suPsrStLu2fpfcgsXLV65eJ6eg6Ojo8OjRo9iYmKzs3JKS0rKysvKystLS0ry83IT4+ICAgPNubmrqGus2blmxeuOOo2rG5x55hDLvJnfcS+2CacPE/NK78BmC8iAdzQ3abyZ13EzqxNBxI6nDN74Na+nwSezwTey4lYx3+COgA+BOateZZzWHnLIJe23SbW6U3I6oAdwKr7kZXnMroubGq2pc/gqfF1U+L6u8X1SBjkto8X1ZjVdBAeDtOLwj6k7fTZc3PLdo3a7Va9YaGBo9DgoqLy9/8+bNly9fhr6XL78oQ1++fnn//j2bzQ4NDTU3t9iwddfqnXJaVpfcn5ffSem6kdR5OwUZCI6b2MS8Ezq84tq94tquRTeDciWu3Tu2BWtBuBbfcTW+fbT6W+B9vBM77B5V7j2ZTdhlnWZyvRSmdC2s6npYFcQjr5BKUK6FVoL+Ky4/r4DdCUhcH20ZVUaPeoXVugWVKJtdnLdy65r1m93c3IqLS16/fg28DAwMfPr06ePHjx/+WqADdPv8+TOQ9fbtWzCxK15Xdu7au3K7rKHrQ49XNdcSu64ndFzDALO6Et9+MbL1QkTLhcjWi+HNIEfhEdN2KbrNPboNFKiCcimqFYC3DB+KRTo6BHpcu9Fdzm7bDMI281htzyLP4IrLGNyfcT2eVbg/5XoEI3np6XD10o9wHyMv/eZoxaVnlWYe4Wt2H1u4eKmDgyODwUCz/fjx3bt3YDtvsfLmPylwIk5oZWXl+QsXNm3ZtkPeyO5upkdMu2ds++XYdjS3mDa3l01uLxrOvWxyfdUCcENKMyjnwlHVNRwpZzEFr+I4h8kzMa3nIlrcoBrR4hLTpunD2mGdQdhiFnv8fP75IM7FJ9wLQRy3QM75xxzXADYuxyr/GJzTD4pVzK/MWbzm4MGDEZGRvX197e3tVVVVbBabxUJ/KyoqGhoaujo7e3t7e/5Z6e7uxpXX/f1ghmnp6UpKSkvX7tA5E+T6ouFiVBuaZGi9c2iTc1izS0g9yLHKKUwi5UWzY+h3HVdOvxiuurxsOY3Lly2KXowtFumETSZxsqdyTj9knfFnnX6E4PKI5ezHcvoBTAyjyh/h/JBtczNvj7Kl5LSZOjo6EHFbWlroWGmor+/o6IAZdnS019XWgr8UFxdXVVW2tra2/UeltRXohutUVFTa2jvMW7rukP5Fp+Bql1et9k/rbZ422D5tsHnW+CvsghvtnzfZPB2ugm4X3ARyVDmJwT64CRi0D2mWuVC6xiSNsNkk+rBjlu1dhsMDJuDkfabDfZCM77jHsLuD4S7D9jbdBsNvlDt0u7tMQ6/MtQc0xaZIWltbV1ZVcbjcgoKC5uZmiCMQer4Nl6+gQ3BpbGzMzYX1q6Surq7hD6URK789BNTX19ddvHhp9rzFu4/bmTxgWAfVWwXWWgXUmAQixfxxg0XQD7B88rNuiWG0ZbjxSYNZUMOBs8UrjNII642SD5zMtLxZDjOEeVrdolvepFv9CIsb5QBzTP5JgbMMPdNX7tOaIDbZ3t6ey+XCUpWdnQNP++sfCtAEBpGdnZ2XlwdOV41K1QiwCnglmw3xCwwQJBMr0AJhCD9aW1sL/7i7u8+YLbVe1tTgZomhf73Bo3p9v1rjB1X6D+tAHwNU1YcOOB7VGwUgxTCwwTAAQ+CwNAps0POv33GqCBG0Si9xj3Wa0bUSmKeZL4KpD4LhtVITnzJQQBpeLzW6Xqp/teQnGHuXgTRCR8u03LNWHtAXEhmvqakJ8wF2UlJSYBqwYA39uYBl1dTUpKamAkcsFnMYbCaTxSwsLATuwA2BhY6OTjwAAaHACzTCUaAMerI5wBjbxtZ+/CSJDSouujcYOg9qde/XgMShO6L8BGjX9cOUh3Xajxp0HtUDtP0bdDBo+tVtdSpcDgSt0E3YYJKqfbkY5mlwDbGge6UYoONVjCsIXsXQAYcWQhGuDDd6FWu656+VsREQEtm6bXtaWjrEl+Tk5Pz8vO6urs+f8PIZw6j+CV/mQXR3d0GoSkpKAo5KUCnOL8iH09PS0urr6qAP8Pj1CxjcN9zoBgcH+/v78SHgFCALHkZObq6MjAzfOPFN6h5KN2vUb3BO3K46cbta5U6N+r1a1btjcGcYGvdqj98dVqBd7X7d8XsIoKjerTtxp3qzXe4SvWTCSt2EtUbJqhcKcFI0PYq0PIs0PYs0PIrU3AsxFKm7Fx2/WHjiEgIoqheRHFag5UL+Tr27IhOmwF7h5s2bcMepWOFy2LBEvX+HlffvEX4pkAf29fWBEWVlZQFHEJIyMzPj4uKAnebmpoHBz4NDgwPwZ3AQaAI5MIBVhwbhXOAyNjYWeiJmi4sDAgLnSUlNkJi7xywIOFL0rVTy5sr5VB27UX3s5ghujAFWVbpVg3C7ZkSpVbxVewxwo2qtdc4C/VTCMp2EFfpJx1zz8MmrXChQxaByvkAZh1u+khsmXXOUzuUquwJyjp3LVziXD4qiW8EO0+CJc9eTeXhUVI+npqVnZKTDDME7YNpdXV2vUekfwesRiQpkN7B4Q0ApQ9uLPDgrKSk5KioqIyMDGt++e/vd5n4uYFgfYfkDNqE/+DIoQLGpmRmNSpFYumvf2XQZn2qZ65XD8P6uyHojedS7Stq7CrX4VB/1rZH2rUH9Ab6oCjh4rWqpWbaUVhJhkVb8Eq0E6VM5SucLYLYgj7lhOJuj4JoPisKZHDmXHAWXLBlcns4ByJ7ORopL7hH7+LkbjhFJ5KlTJcF8wHDgqUZHxxQVF8HaBHOAZKe7C9yoC0P3KCCgVFVXwV7M0dFJS0vbzNz8wYMHYS9eJSYmcTgciDWj+SRklHhSOaIPl67OLuiZmJgYERERHx8PHvf06VMpKSkyL2XeHoO9F+l7vCoQLlccuFKxDwMoB69W7L9Sue9q1f6rVfuuVB68Xv0TDnkDavZ5chYbpM7WTCIs0IhfrJVw0DlH2jUf4UzeYYBL3qHTeYeccw+fzQd51Ckb5CGnHGmn7IOOOaM44JC9QvYsBGYSibxv//7w8HB4nq9ehUdFx8Cus6GhHlbopqam0UwHVjQsj0GJTH1Dgw9W4OH7+/svWbps//4DN2/dun37toeHB1ykqbEJ0si+XpRLjs0m8UYwPbgOPAOI1q9evXr58mVERGRMTKyKiiqZTKaOm7pGz3/35Yq9l5i7Pbmg/HPsvVIJ2HmBOUc7ZaZmMmGeeryUetwOm8xDp3IPOueimTshHMBZwFr2n8zea5+11y5rn33WbpuMXTYZuxEytxiHiszaQCSS+Pj4bGxs4EZDQkKeP38eExMDG3OU3QAN9d/TmdGkBlIYmBi45KlTp65eu3b9+vVNmzaJTZoiIyuncEzxyFHpdes3+D/yhwTqD7liGxwC6uvr62HFjIyMfvr0yfOQEKDJ9ZzbuPGiRCJxwtKDa51zt1zibrvE3ubG2HKpYtMF7uaL3I0XuaBA+1asZZtn5UaPqi2elbiyyQNk5WbPqk2u9FnaqbO1UgizjsfOVI3dZpWxzyFn98mcPQBgwS5rp132LvvsnfbZu20zQdlunbHTKn2HVfo2y2G5zSp19l5zXpogiUicNFn88mWvJ0+C/P0fBQQEgB3BwgQxqPYPBWiCILV+w8ZpM2bNX7Bw3vwFQsLCfALCc+YtPungCFYkJTVPTU0dkinoCSzU/5gi1mMF/oFnAASBRwcEgBU+CgwM9PX1Xbx4CYFAIPOLzpJz33qmbK0bd+UZ9rqzzJVnOIDNZ8tXu3JWn+OudqtYdY677lLlmguVay8irLlYuc69au2lKpArTzOmqSfPOB5PmK4cLXksarNF+ha77B12Wdtss7baZG6yytxqlbHFNnuzbfY26wxUtczYaJGxwTxjnTlS1pllrtAOEp62hEQkkEikpctWgLPcu3fv7t27IMCOwEAqK6uAo+pfUV1dW1cH67SCggK4AxErcJEZM2ev37BpxsxZs2bNFhYW1jcwgBADFNT+ucCl4DoQg+7cuYMNfe/mzRs7d+6Cy8KNTZy/bZFl4oqz3BVnOBvP0IEmUMZi5VnuKlfu2BbEmit31bmKRfZl4seTpqklIQsCgtYYpQAdG6yyNlplrbfIXGOeuRZgAcgCRtaYpq81SVttnLraMHm1YQpgpWGSxHYTXiofCZvbxo0bwU2AI1+sgBFBZIFdaUVlJQ68jOqQ7IEMCgraunUrcMHPzz9n7lxtbe1Tp05v37Fj9tx5+w8cCAsLq/53BUwMlr/g4Gf4uDdu3AApf0yJSuMjEgm8ghMl5S4vcixe5FiyyKl06SnGklOM5S7sRafYIJef4Sx3wYCoYQ/rwy3cBbalk1USphxPAguKEZePXKafAqSsNkNYaZa5CqQp0leZZq4ySl1hnLbcIGWVYepKg+TlBsnLDNMWHn8qNHM1bj5Qtm/f7ul52cPTE+Kr5+XLsJzBmg1eBiZQMbZwuT/WuPEJCVeuXj/rev7GrfveN+95+94ODAoOCQvPyMzG+3JHTuGOlLE6RLqEhASwHRgWAPdw9dp1leNqfHz8YJU8PDwC8w/Os8yc68CQcqDPO1km5cicd7JUypExz5Eh5cTBMc+JvfDU9yoG7myrUjHlhEnKCYigiUdfLdBKXI2RstwkA/Lr5cZpiw3SlplkLDXJWGSYtkQ/daFu8gLd5EW6yaDM100R33OOLDCRNFK2b9/h5nb+LFbOnDlz8eLFJ0+eQNYHuwHgCGbC+blwWZxKJpvLYZWxC+MLkoOzXnr6X9F64K4a7u+aH+9XnB3DKM2HTQeLXQG98f0EXlCVzYa9SHl5GWSJYIYXLlyAQfGhQVdRPcHPL4C7LWXctOmqgbNty2fblM2yYcyxo8+yoc+2Y+GYc5KN4IDkLAfObEcEUOY6cadZlo0/Fj9BMZ4wSSYcEaSZANQsMc5YZJS+UC9lgW4KsIB0g3QpnZR5uikgpbRT5molzVFPmKMeK7RYjkTmGSVo/fr1DmOKo6PjlatXo6OjCwry0Y4JFXyfxYLdJtp8lqSzsvyqc43q8lXaC1V6ikz6Ss26yk52FQBMWjI0qhJUGl+qcMPN6El3GMXZsFVlYlcAyWAyYG9RVFQE7EDic8ndHcYbHRqWxaPSsjTMgtCd8VCFt1hNtSiStKRPsyoHTLUqn25Nn25Fn2HNmGbLmm7LmmqLlGl27Ol27GkYZtixxU2KBeXjhRQSCOMOvxQ8+GKqUsxcvXQpvTQp3dR5OoiOuTqp8/UBabO1UxApmkmz1eJnnoiffSJuqsIzithCEok4StCCBYssfix2dnaQ0UD+VlBQAHEUZoUxwygtY9BzX9Qnbeunqwx0+XzpT/v2qeLrQNvQQMe3L33fBgFdXz+3ff1Q87U7r5/uXO2/oiDmbn5BEWwsSktLIP+EoAOpNqSjfn5+rq6ukF6MDmppaQnVrdu28VIow3dGJNKmb5ikHSduVi5hXiZuXjbFolzcEkCXsCyXsALQJaxKxa3oU2yYk6yZYhaMCeYMQTMmTSufdCSGJhOLCKLuDxM+GiGsmDxRORHC0pQTKVPVAcmzdNJm6aRP00qfoZ4keSJxxokEcdV4WPnGbXchUYVIY8rUadN1dfWMjY2NRmBgYAD3CsEIZoJvytGXFuXlBYXFmanRpZFynxrt/zXU9K+hnn8NtAO+faxD+FT/7UP1t/dV3z7U/OtTzbsS2zgf6YcP7kKGFQfhKiEBrgY65N8Qb2xtbY3GjAgwNjGBcRctXvz90UGoHjd1vPx9MbPySaZlEzGImZVNgqp5+QQL+gSz8vFmZcLGpXxGdIphOVmvjKhXTtSnE07kEw+PIUhAOkpQIUlAPhEgJBcnJB8vrBAnqpo2XiVVTDVpkmoihKspKvFIKscLLFLk4aWMJUhQUFBOTk4L1iEdbU0tLVxR11A3MTUBXwsNDYW5gUfAk4d9E+wnbtzwSArc/IGjONh/ffD1zcHXvkP9j771pXztTvnam/q1J/1bd+pnukPh3e33b/s+DnoaHBz85MlTb2/vc+fOOTk5mZmZoUHGjIUpWrp6ukrKKmKTJg/7F8YQmSoksNVOxKhQxKhY2LhMyLhM0KiU37CYalhGMSgl65aSdMtIemUEXQSibvkIQXk/EMQvHT1eMVHoWJIAoilBQC5eQC5OWCkV+OKTiaVKxwrKxPDLxAjKxvIfCuWR2DjWv5Cn8/CuXbdO9biqsooyDhUVFVw5ceIEzOfKlSvPnwe/ePEClmTIVi56ermetcgJWf62QvB9vdDHBpHP9aKfa+d94h742Gw01Hb1A9exNGhl6KOLGZk5kBP29/fD/g02ei4uLopQlBSxi6uMDDcyltqJXbt3U6jUsfcGRkSZf5SqkUrRKyLrlhC1SojapQQcOhgv2qWIFxx6wwQRVbJ+IEhQOgpcbLwSxhEQhEwpXkQ5TUgxGToJyMZSj0TxHonmlY4jb/cmj5sxusCPlhkzZkrL/KZIS0traGg8fhwIuQ/kjbAAQTRJT08PDXt1/7ZXeeT8PiahjzsCNqG3gPYhf3592LxnN4xevnoFiTJsuwYGBr99+/blyxfYXgQFPdbT1Tt8+PCvY4EVw2b1pxuDW+WRXE+SjyRoliBSNIsJIwQRdcB8Sr8TBLzg0PsdQUCHiFIycjSFZIyjBBGVdCEwIrAm2ViwI9qRSIp0HO8mNx4BsZ8IApMWEBTatHnrwYOHDh06vHfvPpgASICJiUlaetqHDx/+hRWY5+fPnzs7OyFLCg2LCLh9mh45F3FUQeilE3qKiN25hLY4auxNuaCg4Pz8fNi1ffz44cuX4U9p4QpwOiQQEI8PHDiwf/9+GBFGgUFh4B07dwoKCf1CEJFHZCr5sD9Bh47xUvIzQbhz6dH/RpAQRhBEHLAjIcUUYAeYGn8iCxGkgLyMJg2OFkc98IRn1m4yD4VE+vU2iNOnz9ixY+euXbsh2Qfs3r0H4gWkLfjH9WM/ioY5w46zqLg4OOTlI9+T5RFSfQxiH4vQRyd0JpHTHmz0f+Cblp4J+4x37959GaUHK/jH/pBGn79wHqiBFAzGgkFhaNimoE3GL4XMSyUvOUE8kUHQKiFr549yhBMEtgO+hngZNaI/WpBKOrIaIEghSfBY8ng1nKAkftl46Eo99GT8CrU58xZSqTTS7wqVRlu4aMm2bTs2bNi0afOWs2ddYWP50/RGOXr//h3syMFGnj0LfuRrx3oxqaeQ0JNDZPnPD7h9LiomATLmvr6+wcHB337gDyTBrh4y0m3bd2zYuAloWrxkKeSHv70xfgEBqUUr+NebEI+noLjzowV9J+hvLiYTPe54Jk6QiHKqoGKKsHKaqHr2uOMZwBS/XALvwaBxK5QcnJxPqGvBEyH9oQgKicDGdcXK1fYnHZqammEm6BPl3xX822TYrENe8/RZ8GNvvYpnYvUvRYNv24a9jKKXl3d1dn7+/Okv34jgX4q4ubmtXbd+ydJl48aN/9Nd8fLympqamFraCq4zIKgCR+U4QTx6JcDR98D8d4LGn8gUUc0Yp5IuqpICRiSimi6qkQOsCSqmUsB2Vio5Op2GzB/WEAKBQPpzGTd+graOXk1N7dCXoYHBgS9DX/40STj65s0bWKQgUQp+Hhp2xyLirlZIaGh+QUFLS/P7D+9/a32j/IJxQQeg2NzcXHTChL/cEri/np4ebHiMTMwF12gTVJKRyeiUEEeX9rHs/D4GycYAQRB0wGTAiMB8gJqJWnkgaYeDxq9QtLKxKyoshOgIcfEvBMGhhQsXJiUlDQwMfP48gH/e/hcrgD7gR7W1tXl5+bFxCbDFBaeD0PPmzeu/nDj69QYaYXAITlm+YsWY3Oc3RVZOFpYFeBK6+oZ8q7QJykkoJ9TF0sLfEFROVEn/kSCZaHCoCScyxqsMRyJgSkyvUFA2WGSJrIGhcVRUJOwbXr58uW3btj8RBLcoLCx86dIlSFvAOz4jcgb/Pk/8q7He3t6GhkZ8W9vY0NjX24d/E/snz/pO0ODAp8+fYYn08fEdLzrhLxzt27cPsnCYQmRkhIqaFt9KbZJq3HDi8wtBJAMGSSX1B4JEZCLFtHImamSPRiJRjVxR5Reiy2WPq2k89PMLCPAPDAy4e/fumjVr/kQQmYdHVlYW5vnxw4dPnz7h5vNPyqdPH9++fYN9+twDTvfp46d/eOIAIgh9yVFTU33ihBqFQvkTR+s3bPD398dmEXj//j1Z+WP8K9SQr+nShwPQmGWeZMj8TpDokVf8B14Iy0RO0soR08zG446ISoagzDOxFdLy8vIeHh5eXl4QC2H/qaKiKi4u/tubgMY5c+c+evQQJvnhw3v0Wg/2LdYo/j7PzwNgcugFGTC9f8rryInwPMBPYUMDC9mfCJo0ecrRo9KmpmawWbns5eXu7r7/4BG+ZcdJxyKI+oxht/otQRNkIoRgQy8XO0k7d5JmFhAkqp7Df/jxuEWQhu2D7Z+GpsbOXXsWL1k2efJk9EHUH5yLj59fX98AdqRgAoggcJLBHzDK1OdfFFwf6TkwtvNv+3/+fgpEOuD1w7u3b9kslqWVtYCg4J/cn4eHR1RUdN68+Xv37dfQ1DQ1Nd2ybafgIhmySixRn/mDi/1AkHS40KGXIgrxk3XypmhlTdDMFZEOoM7YOn/+/DVr106RnMEvIAiXxgPwX5x8xcpVgY8fQ+Lz9u27D5iLfUZx6H8KiOJ/PvQZ2R0yvA/v37+HrApC5Lr1G/6+nEGBVR9211JS87Zs2Sw1fxFt7l6SYsQPFmTAJB0bdTGZyGGC9AuBowkKT3lmbOelUEayQeKP+H0By4IdaVZWVkdHB+S+mIt9/E/wx29Q/10H7FtWxM/7rq4uWM7s7e2FRUT+vqKhifBQyVRBiqDouOnL+Ketoay3JmoVjiWIrJBMPhSFCBJTiAaCJijGTdEvFNMtEFMOF911RWiTk8BGc0irKIuUqVPXUyYt5hk3g0dgMplvHIkXiCP/9FjmL1j48OFDWEd7enrwb9yxdwzf/2P8XPAvl2HqI8D+/lQ+4Y3YSO/fw9LJYDCCgoLA8H8miMzLM0GKMvcAzyIV0gpDng02PNvdSPtukI76k+RDyUqR5BOJRL3SYYLAvwxZJIUU0qFozMXkowUPvxJVjBM3LJqsX4Q40ikERxPTzRM3LRTTyZmgljJeNUFYPkLk0FOB/b6UpRpkmjBpzB2AA6qpqSUmJsL6BXf57h+U9//tAtd8/fp1VVVVSkqKgaER38hn0sMfCdFEeHZeIGrkEjXzidrFJEigkUMxUOgxYBENmAg4O7DAAzvgYgqjMUg+RuRo+ESleHHjkimGxZP0gJR8IAjImmrJmGJUMlE7X1QzF8shM8ep5QjsukIWnDS6m4f7kJSUvHz5MvhXTU0N3OXbf1D+CYm/dvvtiXgb/koo5FA5ubne3t4zZswkjBJEJPCKziHJPgc6COhjjTKyHrb/0i37OT/ECCL+RNBEhZjxkAQpJ0gYFwNBkw2KIBJN1s6ZbFgsac0SNy6dpFcwUTsP0ki0wGnmCRx6xAPjjRAEkXvTpk0hISHg/w319a/7+9/+HxUgqLW1taCgAEL1nj17v2/rgaApK8jK0ZDyoE82dLDsWe+HxGcMQcyfLWiSUpzwEWRB0y1KJEyKgKMpBkWTdAtAmWnHEjctA5uaqIOMCBGkkTteOYE2fTsesMF8qFSqurpGQkJCcXFxU1PT2Ldb/utl7FvBY1twBWR7ezvcBmx0zC3M+fj4RmMkeb4cUT0bzwl/v/nCQs8wOzhGCRJTjAMLmqSSMN2iVNKsRNwIczT9QvC4WfYsSfNy5HS6BcDRBK08zIgy+FZo4Bt6MB8xMbFzbm7paWmQAcFC24dKL/yFYNQ3pqDqP8RfysjR/t8poMIaWl5Oz8jIgMxWTGzSMDtUIZ6NjrBrJ/yWl7EEGY4QZPQHgqZZlEpgkQgCkIRJ6ayTHAkrJlRR5MYwQSsXQpLQPi8y33icoPnzF/j5+cEmkE6nNze39P6fFiCIyWTCzTx+/HjR4iW4f5HHzSQfevTHoDM2NhuyRjgacTHpMQTNsCyfblmCjMi4FMxHwrRslgNH0oYlblIKgQm3IxyiKi8oEitxL9uydWtoWFhOTi6LxWppbunp7u7p+p9hzKvjPVDrxpThavdf3jOHLQ64GJvNzsvLi4iIgN0ptpAReaZtIinHEfToxL9Y0IhzgUI2Zn8nSCZumKApx5NmWpVPs6BPNS+TNCvGCZrjwJlhx5IwK4cq4ggySX2UCkzUzqYuO4GyC15eZWXVmNg49I4qmwUu1tnZ2YXh35bRbpjS9Qf8/egPPbu7utpa27gcDsRpiIk6OjoQH1FCuMacqFP8N/MZXbyMWGRDRBB5lCC5BIKkcixO0GxbxgwrxlRzoAksqBQImu1YMcOBK2lBByNCwRtb4zBZLLL3Kpl/Io1KNTYxhgyosLCAzWY1NjV1/J8WWMW4XG5RUVFycvKpU6cnTZpMEpIgywShleuvAQhzLhYJqAHzMeZ8D9KIIJU4UdkoCfXU2XbMmdaM6ZZgROXAjqRZmZRzxezTVdOsmZgRlUL8RiHcqHiKcZmYWgxl2nrY0Tg6OsKqUVhYCFlifUND6/9pgWUUCCopKYF00dPDc86cOTzzjqL8UJ/+bwgyYmOxGbGDOIIgrYgI4pNPJEiqxkMqBATNtWfMtoEwRAdHkzQrh/VroUvF/DPV022YEhZ0oAwHMDUZopJhkdBWB5GJkhcvXoTHBQSB89fV1YGXtbS0NP/vlBas/OVofX09EFRcXJKSmnr79p0lqzaQtp0j/lvnGonQyHYwgshG2G7+aAzfsSTCDLUEUbkoCQ0giDnLhg5GNMOKjgWj8kVnKqVc62basadbMSQws0IwAYAPlk1Ui5y0aNe1q1cxFytkspiQScMzxN9CHH0d8dcfW+Bvdv5vlLq6WnhOhUVFYEF+D+6vlrUmqCQgCv5K0PDiNWI+ZGNkSkSVTKJMNE0hgTBLM3mCQoykRuoiJ/TKzEybYS8Djha6Vi+4UA+OhlwPOLJkIFMyGzEloOnQhSvXfGJiYnNzc8rLyysrK355nfCX8u+O/09KZWUlnUHPzc2Nj4u7fuPeXA3/fxubyQZ0shEegDgYhsMQUSWbKBNLU0gkzNFKnqIUJ6mdtdgJvVA0y5YJoXqaRTlwtNitZrF7o9Spium2LJyjqThH5sMeN00/ydbt5qtX4enp6cUlxfD0wIjA0eqx1yv/VOrhOMLwP6P43gGv1NahPsOor6//flnsHc6fTq+vra3Fv9dOS0t79fKF8dnbfJpJw58W/gFkQwZpxHa++xcQZFqJERRHU0gizNFOkTyRNEM3Y8kp7EUrm++hesn5mmVezfPP1UJCBI3I+6wZkpaYKeEcmZRuNwu5efdhYmICrPSYEVXW/l+UmpraispK/Ecb8fHx3rf8lhiHEfX+aD4ktINnoHXdiDm8cn0niEUyqySp5fNIY6vYXN3UqWpJ041zFp9iz3XkzLFn41xMs6QvcK1edbV50aVGKSfObHvWKEdTrYAmZEfiZvQZRpmazvdCQkJTkpMhAYFEtqKiogov+C+bxpbv1WqE6hqsZeQ3UFVjdDg0tg/e8kdUw4OBoWHDjL9vf8TmIY9OwXdLMQBGMF5GqqgFDz1jecFpMuFSzCvJmvkknKAFBumz1BKkLPKXuXAWODHn2DNwImZZM5a4Vq3zaV3i3jD7VBXiDnNA3NdGQxJwtMgowdnDLyIiEmwbchBIqfFXLYffbB1TxlYrR199/bHn2PYxtb8VGA7SVFgoUlNTX4aFWrndmayfRPiN1QxTw2NYPrxyGY2GnjEwq6RaVfNq5xOlo2nyCYSFhumztFLnW+euOMdd4MSScmTjxgKRaMEp7nqflhVXWxeewQhy5Ey350AUR6/2WWME4SHJpGSTRRhYdWxMDGwUYT+N/+wNktqKMS+lfn+1daT9pzLcbeSUv78hO+ZiHBiupKQYho6Oirx0/d4Cw7Cfv0rG2AFeUMRB1KDQQzakj3UuHDywwJtWUm1qEUFHMAtaBARpp82zyV9zsXKpC0fKkQNrGbIUG8Z8J86mGy2rfdoXnq+bc6pqjiMXOJoN+48RO8IJmmxaNsmk8ICV/+0H/rGxMZmZmcAR7F3R73f/lwsMAcsWDIfYiY7yvv1ohclzsn4ZcYwrjVoNCe3Xh60GHArAY/wbCyKbVSGCdAuQBcliFjRHO3WBbf66y7VA0MJTnLkOHCAIMP90xeY77WtvdCy+ULfgXO1c58q52Fuys0biFAQjCQvGZLNyMdNyccNcGVv/e37AUSzcLhg8hEx4tiz8d86jGHnddVhnIxIxyRolFNpHlZFDTPbIFUapwV4JLSssLMrIzIyJifG5G7DN4jFVr3A43AAvhogXjKBy9KGqIQrJPMbM37jVKEwqeCxqaDY1vHpFaBWTxSxISidlsUPh+qt1q85VAEEQkuc4sOfalc4/xd16q2X9zfalXi2w5M91qQYjAo4QTZAu2bDQLsSSIWbOmGTKmGBKlzTOheh478GD6Kjw1LT0goL80pJiBvq5KZPBZDNYFQwWG4HJHH3pFVPQq8GoOqxjR1nDCmP0EP5bTTYX3JdZXkIvzirOTc1Lj81IeBn7MujBXZ+jlj7i+lGCBln8+rkU/WIS/uWEIQO3IJTyGDGAHfLvrOa7+ZhXUaxreK1rqXrFxKNxyMWWGSOCljmWb7lat+ZC5aJTHMA8tGwxFzhzNvk2b/frXHGtbeGF+oVutXOcK3CCIGDPsGZOteFMt6YvtkpbZ/Vc1u6avq2Lvb3pUw/ZtHvy+Y91OCFarOc6tRFm1a/MuRH29Bh3RsYTZlF6OXormI3wDwuTTWdyGaWFzOxwTrw794VZ9bNjVU8ONYYcrX+h3Bgi2xAiz30qn/pIMd5P8Z67wk1XeaeTugpWF5ebPxUzSCMjz2Kj0IMtVb/GnR9ikEU1xboWOKLplxBlEpAFLTfOAIJWnqJvv16//nLN6vMVS08jjiDczHdir7/etD2gb51vKxAERjTPpXq2E+JojgNnoXXBATs/x7M2wRf2pvlsLHui1J+s+7Hg9CfW3Y/sR9/Bevih2OtNtlNXnEZL0ObGxzu4wZrslLuMogw6k4NsY+RHzaPKqKQzmHQGm1GUyYk5zw2Ua/Jb1hO6vT/d/B3j/rv6uMHekqE3lV/e1X/50Dr0tmGwjzXQXdpfFf+ecedtpnlb2O4cr3n3XA4cd3CbaRYPpkQczQP/RJBpBcWqhgoEWdXwGZTyyMahVWyFacZ8/dRVZ5nbbjdvuFK37lLlKlfu4tPITCBIb7jetCOwb8v9riWeTYvPVc8/Wz3XpQaIO+YcdMf1YJGnZMs98fcpJ4ZqAj91Fn77UPXtY+2/Prd++9z27RPI9mFlsPNfH2uGXlcOtaUOsDz6Xu1svjur4uEOdtwlelkRncGCaEWnl+O/lf5e6OiNelbyvZqHm9t8hbqDln8qO/+lI+Xbm/J/va/+9r7mC7DTT//6turL20qkY9V/va/68q7q6+uyrx3xg2V2fY8laq8Lvri0TtH2kpBxEb6Z+C01IHktqqi2dZgF1VINy0iyMfywWV1pmrlAP23tWeaOO80br9bjP5ha7lYF/iXlzN3o27Trce9Wv55VXo2LztfNP1+//HSZ81ln5hXJDm9i/0PaINPya0fs187Yrx1RXzvjvnZEf20P/9oR87U9ErUgJfxrewT0+YJ364wdanr+5tUmOL39plB1qBo9L6GMzsTeMv+BnrLSUmaUa8sdyS5fQt9Dgc+lDl9agoeanw01BQ01PR5GY+B3Ha824nrQUPNTUD4VaPQ9oHT7EGuvCTk7G04wySMac4fDjcmwwmOCc1TJY1mD1i/rWj67Oipk2HLxfLAXQwQZp24+T995p3mTTxN42ZpLVUsu1i0/X7XApWL15fo9AV07Hnatut665FLDCjeunYtrzdXxvbcJ/YHkdy8FPhXqD1WdHqp2G6pyGaq5NFTlDPogtOA6ki5jWpAcrD7zLnMdnN5zm9jqTeU8VSktyCouQf9zUMlIKSouYyTebLo9tcOX/PoJ+X0Ez8eMQ4Nco6EKu0EE+8Fh5U+wx2D6IXHF2zBeGKv3DrH6ioiW3VmKMZMI1MBqZVZJNuHwmHJ5TTkACM+8ltU021owIiCIBuudXAIf7MXWWGQtMknfeIm7617L1pvNG681rPeoXuNeDTQtO1uxwr3uYFDnrsCedXe6Frk377+UlnF1de8twtsQ8vtInveRvB/iJg+UrBlkKw+yZAbZ8oMsuUG2wiBbBelIgq443AKHWIofS7e/zVnyLl7wfRTP2zCevkByo8/EsnjfbNhEjZSsrOyMjCzuU8XuG0ScHTRWlPBAvvhA4ZLB8g2DzG2DzO1/xrZB+paBomWfs6Z/iKV8TOL9AGOFkPtvEwLO7Z5inkM0rQJ7gYyZbFpBNqvgxWGJwjPNtg6MiM++nmrKJikkoI87VptnLjbO2O5Zsdevdeftps0+TRuvYY7mXrX0fM26Kw1Hn3XtfdK34V73cq+WIxfDS65OehtMgjv+EM3zOZPyOYPyKZ02kD95sERyiCk5yF44yJ4/xJ45yEJyiDVviD17kC01xJk+WCQxUCj5OXfyxxQBOHH4vp+Tu3yIJaE2cfEJ8SMlNi4Oqjn3j/Y9IL17hdj5lEoZyMVBHSjiHywTGeKII7DFhyokhrgSSLKxFo7EIF10sJh/IB/uivo5iwLnwljvInjgth+77Zhknks2r+E14/KA1SAj4vLCzsuihmJZzWeLCAIAQfxmHB6FeETQOquspSYZO70qDga07b3btM23caN347or9Ws9alZfrFrp2XDkWbdc+OtN97pWeHfsOJ8ZcWnthxACPNVPyZSBPOpAIdwxbbCUNsThG2LzDVXyD1Xzf6kR+VIn9LVRCFP4h6r4oX2QyQd9BstpcMrnbCriKJ4XCGq9IRTp5/jkWQiUsLCw4OBnAQEBPrfu37+kzb0p8v4F+WMcLxoIUECF04e42CiV/F/qBb40CnxtFfjaIvC1TfBro8CXGv4vdQLoaAX/IB0bqwCd+CmZ930EuTFIyPCkHQUijlkVr0U18EIxB0eroFhAclgNySHyLLAg21p+IMiiAiyI71giImixWdoen4rDQW37HrbuuNu82bdp/bXGdZ4169yrl7nXH3zSpRj7drt/z7prjWBTeq7eFQHiHyNJn5LQfQ8WAzXohoAFuOOvrYJwr9/aBb91CH7rGlag8UuDABAHfQZZcN98cN+f0nk/RZNbngi52R/ZqH5pp+7ljVpXNutc2a3ntV7Ta5nq5dnHb5jaKlc9HgfdPqeNjFWJLvK1CZEyPETnGLSh4RBxDYgmGOgzEARGFEPuDOX3OC872SyHB9ZyMy7FohKtWRZVPBZVFFCskPkAQThwgnjlE4WUUggbrbOWmWbI3Kw++qR9v38rRKItN5o3eTdCMAJfW3mpZn9Ah2r8mwPPeiHVXnaGucQpX/e0W+q9Ra9f8g6m8wzCfZfREDsNAvAMESOdvwBjCmaF2xHMcyCP520cpfzBZGMzWTGZa7Sj9wSl75B2XyXtukLd780v+5AmfZ8q4ycsffOwtna07/zWUP6hbN6hAgoaq2KYo9+OBY8HCEI2C+ZcRv2YTXqdwJd5f67hKUtRw1Rew3KKEZ1qyoKgQ7WsQoZjicVm65ox7AwTxKOQIKiUTNhplw1h6LBfo3xwh3RAy54HLThHG67WQ1q03rNm+60mlbg3h552r79eseR0wTzbDCmLpC1GPu6ux9Jvz+lNFEDPtpQ2wKAO1NLAyL82C/x8000CX2r5vwA7ZUAN9WMqtTRQ3Mt5xxZlY8G9F6j7vIQPetH2eJI2uyJsOUfd4yl4yBtA3X+Ntv/aLGkXLVO5x9eWlD0Tf5fOhzji8H2p5INrfm0Q+NaKoQ09HuRlGDXQ51MOrfLlxPDrK2wdlBZq+FBUwnk1Unh1sqkGxRRjOjgX1bIaBWbLKuBoLDsCJ+sFHRowghIFwYJ2OOSssc1R9G88/qxNJqj1YGAbcLT9NlryN15vBI42Xa1TjnktHdy58TpnoUPuArPouQYvpmoFz1APWKN1SdNUw+PM9pibC+oSRboyBd+UCL5jCH7kjIAr+I4l+KZAoLdAuC1WuPDxVJ/z69QNZZbJWwnuOkPe6c6z4yJlj6fwvvOUnReHCcI52u0htN8dmALw7vGi7PYUO+S6XslY3Ujew3XTc++lBYEzapOFG9MFO7LGdWSO68ge15wuXJsqXB4m+cp3ie+FtfqWChvVbacfu8Yn7cer8IyiFEo5HsWrmULRy6EalVHNODSLCqAG7IjP5rv5IHZONgg7NglYVVAUk5CL7TmZs8E+T+lxs8qrHmDh0OM2WM5232/ZdgtxtMm7aeOVWrmwnmORfVtvVC12zp9rEjVH7/lMnecSaoETFR+IKdyTULw5V9FzharzAQ1dHXN5M5sjjicPAhxOHjx58qCp9REdM5lDmprLZE2nHnYW2uvGu/MSaacnaet5/p3neHdcoO3xEN53kWfrue8EjXJ04LLgAS++vR5AIs8eL57dnpRdHmB0Ew64Tj96ep6s5UI584VyFqOYK39yhsxZMekrgoevU4/c5TnygFf6IU32EVUugHLsGUXlFUUzGSOolM+CC+zQIPQAO7a1wAsAPAtjpxEIErapElRNF1JJIexzytniVKDytFUnskc5uOPIk/aDAYggANjRlhtN669UHXzcfiLu9aHA1hXnSxaezFpoETtbP2yGToikWiBgiuojMcX7E+TvTlC4KyJ3T+iwr9BhH4DAIV9+wIFrgod8BA5ep+y9zLvLg3eXOxBE2Y3mjCsC+z2FDl3j2X4Bp4a85Rx5qxso0MK310vg4DXhA5f59l+l7r1M2+fFu/cK714v3n3XeRC8yftvkQ/c4jlwi3LwJijUw3coh27zydynHEWgyT6kygdSFZ5QlMIQO2qxVO10qkERzZSBE4TbDr9dHfIp+3ohRA0GpyZRx1ohzRzh46mEfafy9rkWa4a06UX3qL3sPvqsA4xo3yPEEQQjzNfqwaY0E98cC+/ZdrN25YUysKN51mlSFglzTWNn6r2Yrv1cTD1kguqTiSpB45Ufix7zAwjJ3R8nD6H3Nv/R2wLSdwVAHr4hcMibdsCHdsCbtv8Kbf9VvgPXaPvgafsIHval7LmMuNvlwbPnKu9ukFd493gCibSDvkA6hHB0naO3+I7cph25w3v4LvXoPar0A2CB9wgofnwyDyiyAVS5QIr8EzAWqmIwVfE5VTWccjyS93gMRB+KdjpNN5tqWMIH7JhzaJaVo56FW42QA247jaKnmya5tkw5Uy+snYW2Godc8qTd6aYR7fqxvccjeo897zz6tB0t+RhHu7H0euedFs20t5qZHw4/7VzvXbfyInPxmfIFjoXzTxbMtMyWNMuaZpYmYZQkrhcrrhs1XjN6vHr4OLXw8SfCxh8PGaf6fLxqiJDiE2Glp/yKz/gVAgF88gFU2Uc0OX8+uQDBY48F5QN4D97nOXiP56Af76F7PAce8B54wHPAj+fgA6jyywaKKD8TVAkVUn7Op/iUTzGYhvCMCmEFh8pLimoE7XgkVS2Ooh5PUU+gaKVSINwAI+BQBvk0wxKqcRnNBKhho9CDexYele3qRqnB2Zni1jL5XIuocx3leCZNNh4RpODFdEjsM4jt04jsVQ3pUAjtPvq0A+cIbAdi9o47LSoJr7VzPqomvtse0LvOu2X55aal5ysXnK1ceJou5VA607ZsunXxDKt8SYv8yaa5k40zJxtlTDRIEzNIE9VLnqCXMk4nWUQrXkQzdpxmrIhmnIBGvMCJSEG1SGGNGNSoHk2WjSDLviLKgPKCLB3JK/2CJB1Jkokky73gkXlFUYwQ0UwQ1U0U0U4S1EoS0Eri10rm00qmaSZTtVJpOpngO3x6OTS9XKpBAZ9hEc2omGZcxmdSzm9K5zdn8VtwwKf4rCrHUjOWHRGnxgkuTRNcmoGdiWebwd0gePPiBB0+k3fcm3Up47V1yhvd6F6NqF7Flz0yzzuBIPA15G4PW3febZF90aNf+AmMSDr8zZYH3Wt8O1Zea13s0bToYp2Ua7WUa+3s09WznLgzHTmSdmxJW6akTZm4dbmEZbG4ZfFki+LJZoViJgXjDHLH6eeI6OcI6GUL6WUBQBczzhU1yCErp5BUU0iKSaRjSSSlZJJyIkk5GSmqqJ2oksKrmiqonzPRtFjUtETYGEHQqEQAoRQkvwmiA7mPGYvfnI0YwZ3IqorPGvBDHjg2IQR2Jp5pngw+5dYyybVZ2KkRdmQkixpeyyrKiWxEkJxrvvZtjm/pR9fst2bxPdrAUWSv8qsehbBu6WcoZgNHu/07ZZ91GBZ8NGEMaOd+PBjSv+l+z+obnat8O5Zfa1vs3rTwYsOC8/VS5+pnna2f5VI741TNNJc6SccqCYdKSYdKiZMVU2xZU2zZYhb0cWb08WYgy8eZlguZlIuY0SdaMUTNykjqBcQT2SSVDNKJTJJaJvFELlEtH0F9BKBrFFL0y0QtWRPsKsSs2SJWHEFLNkDAkoNgVcFvjUihYQsTn03tKAujEsINvmAJOSCHGueM2AFqxM42i4xQg4NqXcOrloMIUjpfYBRQfZ876FP+2SblDXAEdqQT3asG8ehFj1xoF3AE1gSBSTfvgylzwLDk8/HEtwdC+jf79ay91bXSpwOw7Eor+tzavXHhhXpgau65+jnn6meeRXxNP1MPZIk710k410jYc8VsKybbcQHjbbjjrTkTbDhAopAFi6hVTDyRR1QvJGgUAREgR384+RNIemU0M8542woxp7opjtWiJ6vH21cL2tWCFHaoF7SvFbavBSLAd/CVWwhboWCdEhyJNZhDNeMOhVsN1aZulBocPJY1vOp5iKDjFwstn9aHNn/1qxxyy3l/MvW1fmyfXgzi6EREz7GXyJTA44Am4/S3TnVDwJFByWcIRtKhvTv9e9ZgdoTTtOJ6OzC1xKNpqWfzwov188/Xo3cf3OqnuTYCTQina6edrp16qlbMsWayfQVA3J471bmaz4RBUCvACCr4twQN/9xUrxy8aZxN5RSHaolTdWLO9eMdAQ3jMDnBsVbEsUFkhA5QAKLOjVPONIGxAMTPNk5wbhCwq6X8Qs3PBGm4F7pGt8T2/T8hLd8eVgyezXnvnPnuZGq/WUKfUXy/XmwfOJ1qeO+xsC71xDdunV9PNX2xqhjUyf2olfVBJfa17Mv+vU/7Nt7rBmtae7trlW8nThbyvqutK661LrvcDKFKyr15vjtS5l1onOnaMPVsw9RTNZOc6qadqgHi+AzKMF6KCJpFBK3isT9tR7/B/RUjb0ORDJkUExZEGZGTdXC1KacbJFwaJc41i59rFnNpmnQGLdhQnXK2aYprM0TfiWeawF4E7Oths0o2Qx8JjSWFbFlLssTYsUKfK/Jo5COC5M/knXpWGVz1KYj73rf8rWN8j11Ul1l4p/GLDqOwDp3nbYpP25Uetyo9bjka2OSQ1+dEf2dF/6SX+fZ4Ur9iVC8E76PBXbsfdW6527bxTusa76blXk2rrrWsv9m89kbr2hstq3zal3m1LL3cvORy80L3pnmutXNcqiWdq6c6cKY5cGY4csRtWFTNPKJqNgKEnuM/QqOQqIYsazQMETWLkD/i0C4Zhk4pWbeMasTkM2UJWbBFLFjC1ixBK66gJQeq/GYIFCMm2YCBvT/OGIYheyzIxhyiEVJ4TDg8xmwSxCC5eMI644SjzsnGNxgGNxhavnSly2X7zhbvPVu826Vo9+kikNtcijc7Fm5xLFxrn3fgbJHiNbr0ddZ2T+amC+Wb3crWni1bd7Z0mUvh8lPFyxzylp/MW+RYtNAhZ4l97kLHnMUncxfY5S2wyVtgmzffPH+uce40k9wZxjnTDHKm6mVP1cuaopE2SS1F8FiCgGysgFwcv1wcUmRjvyvo/8kAGc8vF0+TS6Ch//Egnl8hkR993JfEdyyZH/13Gon8oCgk0Y6lwCHqsVR+9FFOAqR5fPKJVPlE2iiOJdNQt2SaYgpSlNJoSqk0xVSacjpSoDqsp6MOx1LGKSb8v+Xr5elEFkVcAAAAAElFTkSuQmCC + + + iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAABAhklEQVR42s28BVxVz9YGfALOObSiqICt2N3dHaSU0t2NhKKIAYgB2IoCoiKg0t3dcJruTlsB9X7fmr0BMe///t77fu83Pi7XzJ69Z8+z11qz5px9JGhfzDP2Kvj/LUyuFJh4IeD6T4eMvYaPjvb570LPq4hw61VlclFrfFFnQlHH/1fojC/uQijphnGR/DMSS4eB6z8dwmVCCcJPR/8r8IutJ/jH1bHq+0uq+kt/i+oR+R8pIGvfIqXmzXfUvkOy7l1p3fuSehwfSjH5F5Q2fGA1ffh7n/8iius+FNW9L8V0RvMn/8RGgtfzyjx2bz7n94BDgFx2z3+kwIm57JFzOX15GL4rFW/yK/rzq97kc/vzK9/kV73NrXqbj2Gsklf5Nq/qXX71u4JqJBHwo9XvcrF2XEIfvNtPyIMOlW8zuW+zK95mVQwr6Zw32ZgOLRmYjreAjvfJqRxGJvcNXPZqWDXB7TE3vbwrl9WTzezOZvb8hExGNwK9+z9S4FLfq8zeTLgOQm8muy+ThZDNBvRmc/oRuG8yuG+yua8B2E2D/gbuL5PzGiTcKxABAAU/hOYzRuKzza78GdCYxn4zgtdAxK9I/UM7Dhjd43kVwcmPFV/YARwB0sqG5c8o/zdKUkknyOTSrtQyBFDSfrwOumx5Vwq9F5BK70kFhdGbwuxPY71OY/WnM/vQNEBhv4bJgJLCeg13j08AiMjA7jgNAxyCzngHNMkRBe8wrLDfJDNfJzL6k5gImPL6F/y+PRkB3QDo54IqCeY+pRE5rUmlaFbxxZ0gE4ohiP5niCsakRjw6ncUdQKDiViHBCyUJpT1JtD7kst7Eul9CQj9GEaV/ngM+O3C/OF2ExhoPoBRZWwVuuF98FNAiSvvjy77AbHlCKDEjCB2pE/UaLfy/hgMcfT+iJI+uwdsAqyOoenNsYUdUXntvyI6/5/i186oBUNUQUdUQWdUYWd0QUdMUReO2OLuaIQeQGxJTwymxJT2xZT2YhIpsdiNIsBMoAXNoW9EQS34nPEOcdjE8Jao0r6I4r5whF6YJyhQjSxBiMCAK+EjeFX6Ory0H/Cy9DWOqPLXIbldpjfoBD2PfP+Ehqi8tvDsVhyvRpWs/wD4icPV7BE5jLZXOYB2wMu8zvDc9vCCroj8znBAYU94UU9EEZIYekdkL2os7o0cmeqrot5fgU8VuoWPoQNawgp6Q/N7EAr+IXq/oxABKHuQ1qHuWUJQOpd/I7wGpvcys/VlVuuLzJaQ9JbQjJawjJbnac3B/wzQE/oHp7cGp7cEp7U8Q7L5eWYbasloe57ZHpzZhqpZ7QCohmW3P8/pepHbGZbfE1bY96Kw/0XR6+8o7A8r6AtF6H1R2PsSA0wjJK8b5oxLHNAeNqZPWEEP6CH5Pc/yeoKyu59kdz3N7XmS0/0kt/tpbvc/VILh3Jzu0MK+W3HNym4FBIWz+VdCKmGGT5KbfkIQIAlH47/FE6wzJhsfJzZ+Px1reZrSBHiS1hqU1vYsvfVpVsfjlOY7UVyPx7kO18Js3O6aOl0xtPfUtXE3c75qc/Ghs8+rq0Fp9+NqYZIw4WB09z3YhPFpoyrgeV4ProxFYFZ3YEbHo8yuR5nd/lndmNKFK/6/tIwqgdlIBmR3B2J4ktdzPbJB/kweQdop7dLjUphDQEJDQHzDzxJTHsXVA/zj6iGzBOVhLMIjrOqPHcKP/vaQX2IzXORRUktAcotfUuudiIoLD1LUba4ckFVfvn7XvKVrZ0gtmjFz1rSpkhISElMkJKdNmzZz9tzZ85csWrZqzZZ9R1X0DE/f8nycez+xAc0hqwemDTN5mIEm8zinOyALAQ4FYIBDd1M776d0gATcS+28kzKsjLb8Vrmf1oVLDJ33s3ouhDdKO2cTDjlkOd2n+8XU34+uG8W9qFpc4rj7P8CdmIb7MQ23I2suPsrStLu2fpfcgsXLV65eJ6eg6Ojo8OjRo9iYmKzs3JKS0rKysvKystLS0ry83IT4+ICAgPNubmrqGus2blmxeuOOo2rG5x55hDLvJnfcS+2CacPE/NK78BmC8iAdzQ3abyZ13EzqxNBxI6nDN74Na+nwSezwTey4lYx3+COgA+BOateZZzWHnLIJe23SbW6U3I6oAdwKr7kZXnMroubGq2pc/gqfF1U+L6u8X1SBjkto8X1ZjVdBAeDtOLwj6k7fTZc3PLdo3a7Va9YaGBo9DgoqLy9/8+bNly9fhr6XL78oQ1++fnn//j2bzQ4NDTU3t9iwddfqnXJaVpfcn5ffSem6kdR5OwUZCI6b2MS8Ezq84tq94tquRTeDciWu3Tu2BWtBuBbfcTW+fbT6W+B9vBM77B5V7j2ZTdhlnWZyvRSmdC2s6npYFcQjr5BKUK6FVoL+Ky4/r4DdCUhcH20ZVUaPeoXVugWVKJtdnLdy65r1m93c3IqLS16/fg28DAwMfPr06ePHjx/+WqADdPv8+TOQ9fbtWzCxK15Xdu7au3K7rKHrQ49XNdcSu64ndFzDALO6Et9+MbL1QkTLhcjWi+HNIEfhEdN2KbrNPboNFKiCcimqFYC3DB+KRTo6BHpcu9Fdzm7bDMI281htzyLP4IrLGNyfcT2eVbg/5XoEI3np6XD10o9wHyMv/eZoxaVnlWYe4Wt2H1u4eKmDgyODwUCz/fjx3bt3YDtvsfLmPylwIk5oZWXl+QsXNm3ZtkPeyO5upkdMu2ds++XYdjS3mDa3l01uLxrOvWxyfdUCcENKMyjnwlHVNRwpZzEFr+I4h8kzMa3nIlrcoBrR4hLTpunD2mGdQdhiFnv8fP75IM7FJ9wLQRy3QM75xxzXADYuxyr/GJzTD4pVzK/MWbzm4MGDEZGRvX197e3tVVVVbBabxUJ/KyoqGhoaujo7e3t7e/5Z6e7uxpXX/f1ghmnp6UpKSkvX7tA5E+T6ouFiVBuaZGi9c2iTc1izS0g9yLHKKUwi5UWzY+h3HVdOvxiuurxsOY3Lly2KXowtFumETSZxsqdyTj9knfFnnX6E4PKI5ezHcvoBTAyjyh/h/JBtczNvj7Kl5LSZOjo6EHFbWlroWGmor+/o6IAZdnS019XWgr8UFxdXVVW2tra2/UeltRXohutUVFTa2jvMW7rukP5Fp+Bql1et9k/rbZ422D5tsHnW+CvsghvtnzfZPB2ugm4X3ARyVDmJwT64CRi0D2mWuVC6xiSNsNkk+rBjlu1dhsMDJuDkfabDfZCM77jHsLuD4S7D9jbdBsNvlDt0u7tMQ6/MtQc0xaZIWltbV1ZVcbjcgoKC5uZmiCMQer4Nl6+gQ3BpbGzMzYX1q6Surq7hD6URK789BNTX19ddvHhp9rzFu4/bmTxgWAfVWwXWWgXUmAQixfxxg0XQD7B88rNuiWG0ZbjxSYNZUMOBs8UrjNII642SD5zMtLxZDjOEeVrdolvepFv9CIsb5QBzTP5JgbMMPdNX7tOaIDbZ3t6ey+XCUpWdnQNP++sfCtAEBpGdnZ2XlwdOV41K1QiwCnglmw3xCwwQJBMr0AJhCD9aW1sL/7i7u8+YLbVe1tTgZomhf73Bo3p9v1rjB1X6D+tAHwNU1YcOOB7VGwUgxTCwwTAAQ+CwNAps0POv33GqCBG0Si9xj3Wa0bUSmKeZL4KpD4LhtVITnzJQQBpeLzW6Xqp/teQnGHuXgTRCR8u03LNWHtAXEhmvqakJ8wF2UlJSYBqwYA39uYBl1dTUpKamAkcsFnMYbCaTxSwsLATuwA2BhY6OTjwAAaHACzTCUaAMerI5wBjbxtZ+/CSJDSouujcYOg9qde/XgMShO6L8BGjX9cOUh3Xajxp0HtUDtP0bdDBo+tVtdSpcDgSt0E3YYJKqfbkY5mlwDbGge6UYoONVjCsIXsXQAYcWQhGuDDd6FWu656+VsREQEtm6bXtaWjrEl+Tk5Pz8vO6urs+f8PIZw6j+CV/mQXR3d0GoSkpKAo5KUCnOL8iH09PS0urr6qAP8Pj1CxjcN9zoBgcH+/v78SHgFCALHkZObq6MjAzfOPFN6h5KN2vUb3BO3K46cbta5U6N+r1a1btjcGcYGvdqj98dVqBd7X7d8XsIoKjerTtxp3qzXe4SvWTCSt2EtUbJqhcKcFI0PYq0PIs0PYs0PIrU3AsxFKm7Fx2/WHjiEgIoqheRHFag5UL+Tr27IhOmwF7h5s2bcMepWOFy2LBEvX+HlffvEX4pkAf29fWBEWVlZQFHEJIyMzPj4uKAnebmpoHBz4NDgwPwZ3AQaAI5MIBVhwbhXOAyNjYWeiJmi4sDAgLnSUlNkJi7xywIOFL0rVTy5sr5VB27UX3s5ghujAFWVbpVg3C7ZkSpVbxVewxwo2qtdc4C/VTCMp2EFfpJx1zz8MmrXChQxaByvkAZh1u+khsmXXOUzuUquwJyjp3LVziXD4qiW8EO0+CJc9eTeXhUVI+npqVnZKTDDME7YNpdXV2vUekfwesRiQpkN7B4Q0ApQ9uLPDgrKSk5KioqIyMDGt++e/vd5n4uYFgfYfkDNqE/+DIoQLGpmRmNSpFYumvf2XQZn2qZ65XD8P6uyHojedS7Stq7CrX4VB/1rZH2rUH9Ab6oCjh4rWqpWbaUVhJhkVb8Eq0E6VM5SucLYLYgj7lhOJuj4JoPisKZHDmXHAWXLBlcns4ByJ7ORopL7hH7+LkbjhFJ5KlTJcF8wHDgqUZHxxQVF8HaBHOAZKe7C9yoC0P3KCCgVFVXwV7M0dFJS0vbzNz8wYMHYS9eJSYmcTgciDWj+SRklHhSOaIPl67OLuiZmJgYERERHx8PHvf06VMpKSkyL2XeHoO9F+l7vCoQLlccuFKxDwMoB69W7L9Sue9q1f6rVfuuVB68Xv0TDnkDavZ5chYbpM7WTCIs0IhfrJVw0DlH2jUf4UzeYYBL3qHTeYeccw+fzQd51Ckb5CGnHGmn7IOOOaM44JC9QvYsBGYSibxv//7w8HB4nq9ehUdFx8Cus6GhHlbopqam0UwHVjQsj0GJTH1Dgw9W4OH7+/svWbps//4DN2/dun37toeHB1ykqbEJ0si+XpRLjs0m8UYwPbgOPAOI1q9evXr58mVERGRMTKyKiiqZTKaOm7pGz3/35Yq9l5i7Pbmg/HPsvVIJ2HmBOUc7ZaZmMmGeeryUetwOm8xDp3IPOueimTshHMBZwFr2n8zea5+11y5rn33WbpuMXTYZuxEytxiHiszaQCSS+Pj4bGxs4EZDQkKeP38eExMDG3OU3QAN9d/TmdGkBlIYmBi45KlTp65eu3b9+vVNmzaJTZoiIyuncEzxyFHpdes3+D/yhwTqD7liGxwC6uvr62HFjIyMfvr0yfOQEKDJ9ZzbuPGiRCJxwtKDa51zt1zibrvE3ubG2HKpYtMF7uaL3I0XuaBA+1asZZtn5UaPqi2elbiyyQNk5WbPqk2u9FnaqbO1UgizjsfOVI3dZpWxzyFn98mcPQBgwS5rp132LvvsnfbZu20zQdlunbHTKn2HVfo2y2G5zSp19l5zXpogiUicNFn88mWvJ0+C/P0fBQQEgB3BwgQxqPYPBWiCILV+w8ZpM2bNX7Bw3vwFQsLCfALCc+YtPungCFYkJTVPTU0dkinoCSzU/5gi1mMF/oFnAASBRwcEgBU+CgwM9PX1Xbx4CYFAIPOLzpJz33qmbK0bd+UZ9rqzzJVnOIDNZ8tXu3JWn+OudqtYdY677lLlmguVay8irLlYuc69au2lKpArTzOmqSfPOB5PmK4cLXksarNF+ha77B12Wdtss7baZG6yytxqlbHFNnuzbfY26wxUtczYaJGxwTxjnTlS1pllrtAOEp62hEQkkEikpctWgLPcu3fv7t27IMCOwEAqK6uAo+pfUV1dW1cH67SCggK4AxErcJEZM2ev37BpxsxZs2bNFhYW1jcwgBADFNT+ucCl4DoQg+7cuYMNfe/mzRs7d+6Cy8KNTZy/bZFl4oqz3BVnOBvP0IEmUMZi5VnuKlfu2BbEmit31bmKRfZl4seTpqklIQsCgtYYpQAdG6yyNlplrbfIXGOeuRZgAcgCRtaYpq81SVttnLraMHm1YQpgpWGSxHYTXiofCZvbxo0bwU2AI1+sgBFBZIFdaUVlJQ68jOqQ7IEMCgraunUrcMHPzz9n7lxtbe1Tp05v37Fj9tx5+w8cCAsLq/53BUwMlr/g4Gf4uDdu3AApf0yJSuMjEgm8ghMl5S4vcixe5FiyyKl06SnGklOM5S7sRafYIJef4Sx3wYCoYQ/rwy3cBbalk1USphxPAguKEZePXKafAqSsNkNYaZa5CqQp0leZZq4ySl1hnLbcIGWVYepKg+TlBsnLDNMWHn8qNHM1bj5Qtm/f7ul52cPTE+Kr5+XLsJzBmg1eBiZQMbZwuT/WuPEJCVeuXj/rev7GrfveN+95+94ODAoOCQvPyMzG+3JHTuGOlLE6RLqEhASwHRgWAPdw9dp1leNqfHz8YJU8PDwC8w/Os8yc68CQcqDPO1km5cicd7JUypExz5Eh5cTBMc+JvfDU9yoG7myrUjHlhEnKCYigiUdfLdBKXI2RstwkA/Lr5cZpiw3SlplkLDXJWGSYtkQ/daFu8gLd5EW6yaDM100R33OOLDCRNFK2b9/h5nb+LFbOnDlz8eLFJ0+eQNYHuwHgCGbC+blwWZxKJpvLYZWxC+MLkoOzXnr6X9F64K4a7u+aH+9XnB3DKM2HTQeLXQG98f0EXlCVzYa9SHl5GWSJYIYXLlyAQfGhQVdRPcHPL4C7LWXctOmqgbNty2fblM2yYcyxo8+yoc+2Y+GYc5KN4IDkLAfObEcEUOY6cadZlo0/Fj9BMZ4wSSYcEaSZANQsMc5YZJS+UC9lgW4KsIB0g3QpnZR5uikgpbRT5molzVFPmKMeK7RYjkTmGSVo/fr1DmOKo6PjlatXo6OjCwry0Y4JFXyfxYLdJtp8lqSzsvyqc43q8lXaC1V6ikz6Ss26yk52FQBMWjI0qhJUGl+qcMPN6El3GMXZsFVlYlcAyWAyYG9RVFQE7EDic8ndHcYbHRqWxaPSsjTMgtCd8VCFt1hNtSiStKRPsyoHTLUqn25Nn25Fn2HNmGbLmm7LmmqLlGl27Ol27GkYZtixxU2KBeXjhRQSCOMOvxQ8+GKqUsxcvXQpvTQp3dR5OoiOuTqp8/UBabO1UxApmkmz1eJnnoiffSJuqsIzithCEok4StCCBYssfix2dnaQ0UD+VlBQAHEUZoUxwygtY9BzX9Qnbeunqwx0+XzpT/v2qeLrQNvQQMe3L33fBgFdXz+3ff1Q87U7r5/uXO2/oiDmbn5BEWwsSktLIP+EoAOpNqSjfn5+rq6ukF6MDmppaQnVrdu28VIow3dGJNKmb5ikHSduVi5hXiZuXjbFolzcEkCXsCyXsALQJaxKxa3oU2yYk6yZYhaMCeYMQTMmTSufdCSGJhOLCKLuDxM+GiGsmDxRORHC0pQTKVPVAcmzdNJm6aRP00qfoZ4keSJxxokEcdV4WPnGbXchUYVIY8rUadN1dfWMjY2NRmBgYAD3CsEIZoJvytGXFuXlBYXFmanRpZFynxrt/zXU9K+hnn8NtAO+faxD+FT/7UP1t/dV3z7U/OtTzbsS2zgf6YcP7kKGFQfhKiEBrgY65N8Qb2xtbY3GjAgwNjGBcRctXvz90UGoHjd1vPx9MbPySaZlEzGImZVNgqp5+QQL+gSz8vFmZcLGpXxGdIphOVmvjKhXTtSnE07kEw+PIUhAOkpQIUlAPhEgJBcnJB8vrBAnqpo2XiVVTDVpkmoihKspKvFIKscLLFLk4aWMJUhQUFBOTk4L1iEdbU0tLVxR11A3MTUBXwsNDYW5gUfAk4d9E+wnbtzwSArc/IGjONh/ffD1zcHXvkP9j771pXztTvnam/q1J/1bd+pnukPh3e33b/s+DnoaHBz85MlTb2/vc+fOOTk5mZmZoUHGjIUpWrp6ukrKKmKTJg/7F8YQmSoksNVOxKhQxKhY2LhMyLhM0KiU37CYalhGMSgl65aSdMtIemUEXQSibvkIQXk/EMQvHT1eMVHoWJIAoilBQC5eQC5OWCkV+OKTiaVKxwrKxPDLxAjKxvIfCuWR2DjWv5Cn8/CuXbdO9biqsooyDhUVFVw5ceIEzOfKlSvPnwe/ePEClmTIVi56ermetcgJWf62QvB9vdDHBpHP9aKfa+d94h742Gw01Hb1A9exNGhl6KOLGZk5kBP29/fD/g02ei4uLopQlBSxi6uMDDcyltqJXbt3U6jUsfcGRkSZf5SqkUrRKyLrlhC1SojapQQcOhgv2qWIFxx6wwQRVbJ+IEhQOgpcbLwSxhEQhEwpXkQ5TUgxGToJyMZSj0TxHonmlY4jb/cmj5sxusCPlhkzZkrL/KZIS0traGg8fhwIuQ/kjbAAQTRJT08PDXt1/7ZXeeT8PiahjzsCNqG3gPYhf3592LxnN4xevnoFiTJsuwYGBr99+/blyxfYXgQFPdbT1Tt8+PCvY4EVw2b1pxuDW+WRXE+SjyRoliBSNIsJIwQRdcB8Sr8TBLzg0PsdQUCHiFIycjSFZIyjBBGVdCEwIrAm2ViwI9qRSIp0HO8mNx4BsZ8IApMWEBTatHnrwYOHDh06vHfvPpgASICJiUlaetqHDx/+hRWY5+fPnzs7OyFLCg2LCLh9mh45F3FUQeilE3qKiN25hLY4auxNuaCg4Pz8fNi1ffz44cuX4U9p4QpwOiQQEI8PHDiwf/9+GBFGgUFh4B07dwoKCf1CEJFHZCr5sD9Bh47xUvIzQbhz6dH/RpAQRhBEHLAjIcUUYAeYGn8iCxGkgLyMJg2OFkc98IRn1m4yD4VE+vU2iNOnz9ixY+euXbsh2Qfs3r0H4gWkLfjH9WM/ioY5w46zqLg4OOTlI9+T5RFSfQxiH4vQRyd0JpHTHmz0f+Cblp4J+4x37959GaUHK/jH/pBGn79wHqiBFAzGgkFhaNimoE3GL4XMSyUvOUE8kUHQKiFr549yhBMEtgO+hngZNaI/WpBKOrIaIEghSfBY8ng1nKAkftl46Eo99GT8CrU58xZSqTTS7wqVRlu4aMm2bTs2bNi0afOWs2ddYWP50/RGOXr//h3syMFGnj0LfuRrx3oxqaeQ0JNDZPnPD7h9LiomATLmvr6+wcHB337gDyTBrh4y0m3bd2zYuAloWrxkKeSHv70xfgEBqUUr+NebEI+noLjzowV9J+hvLiYTPe54Jk6QiHKqoGKKsHKaqHr2uOMZwBS/XALvwaBxK5QcnJxPqGvBEyH9oQgKicDGdcXK1fYnHZqammEm6BPl3xX822TYrENe8/RZ8GNvvYpnYvUvRYNv24a9jKKXl3d1dn7+/Okv34jgX4q4ubmtXbd+ydJl48aN/9Nd8fLympqamFraCq4zIKgCR+U4QTx6JcDR98D8d4LGn8gUUc0Yp5IuqpICRiSimi6qkQOsCSqmUsB2Vio5Op2GzB/WEAKBQPpzGTd+graOXk1N7dCXoYHBgS9DX/40STj65s0bWKQgUQp+Hhp2xyLirlZIaGh+QUFLS/P7D+9/a32j/IJxQQeg2NzcXHTChL/cEri/np4ebHiMTMwF12gTVJKRyeiUEEeX9rHs/D4GycYAQRB0wGTAiMB8gJqJWnkgaYeDxq9QtLKxKyoshOgIcfEvBMGhhQsXJiUlDQwMfP48gH/e/hcrgD7gR7W1tXl5+bFxCbDFBaeD0PPmzeu/nDj69QYaYXAITlm+YsWY3Oc3RVZOFpYFeBK6+oZ8q7QJykkoJ9TF0sLfEFROVEn/kSCZaHCoCScyxqsMRyJgSkyvUFA2WGSJrIGhcVRUJOwbXr58uW3btj8RBLcoLCx86dIlSFvAOz4jcgb/Pk/8q7He3t6GhkZ8W9vY0NjX24d/E/snz/pO0ODAp8+fYYn08fEdLzrhLxzt27cPsnCYQmRkhIqaFt9KbZJq3HDi8wtBJAMGSSX1B4JEZCLFtHImamSPRiJRjVxR5Reiy2WPq2k89PMLCPAPDAy4e/fumjVr/kQQmYdHVlYW5vnxw4dPnz7h5vNPyqdPH9++fYN9+twDTvfp46d/eOIAIgh9yVFTU33ihBqFQvkTR+s3bPD398dmEXj//j1Z+WP8K9SQr+nShwPQmGWeZMj8TpDokVf8B14Iy0RO0soR08zG446ISoagzDOxFdLy8vIeHh5eXl4QC2H/qaKiKi4u/tubgMY5c+c+evQQJvnhw3v0Wg/2LdYo/j7PzwNgcugFGTC9f8rryInwPMBPYUMDC9mfCJo0ecrRo9KmpmawWbns5eXu7r7/4BG+ZcdJxyKI+oxht/otQRNkIoRgQy8XO0k7d5JmFhAkqp7Df/jxuEWQhu2D7Z+GpsbOXXsWL1k2efJk9EHUH5yLj59fX98AdqRgAoggcJLBHzDK1OdfFFwf6TkwtvNv+3/+fgpEOuD1w7u3b9kslqWVtYCg4J/cn4eHR1RUdN68+Xv37dfQ1DQ1Nd2ybafgIhmySixRn/mDi/1AkHS40KGXIgrxk3XypmhlTdDMFZEOoM7YOn/+/DVr106RnMEvIAiXxgPwX5x8xcpVgY8fQ+Lz9u27D5iLfUZx6H8KiOJ/PvQZ2R0yvA/v37+HrApC5Lr1G/6+nEGBVR9211JS87Zs2Sw1fxFt7l6SYsQPFmTAJB0bdTGZyGGC9AuBowkKT3lmbOelUEayQeKP+H0By4IdaVZWVkdHB+S+mIt9/E/wx29Q/10H7FtWxM/7rq4uWM7s7e2FRUT+vqKhifBQyVRBiqDouOnL+Ketoay3JmoVjiWIrJBMPhSFCBJTiAaCJijGTdEvFNMtEFMOF911RWiTk8BGc0irKIuUqVPXUyYt5hk3g0dgMplvHIkXiCP/9FjmL1j48OFDWEd7enrwb9yxdwzf/2P8XPAvl2HqI8D+/lQ+4Y3YSO/fw9LJYDCCgoLA8H8miMzLM0GKMvcAzyIV0gpDng02PNvdSPtukI76k+RDyUqR5BOJRL3SYYLAvwxZJIUU0qFozMXkowUPvxJVjBM3LJqsX4Q40ikERxPTzRM3LRTTyZmgljJeNUFYPkLk0FOB/b6UpRpkmjBpzB2AA6qpqSUmJsL6BXf57h+U9//tAtd8/fp1VVVVSkqKgaER38hn0sMfCdFEeHZeIGrkEjXzidrFJEigkUMxUOgxYBENmAg4O7DAAzvgYgqjMUg+RuRo+ESleHHjkimGxZP0gJR8IAjImmrJmGJUMlE7X1QzF8shM8ep5QjsukIWnDS6m4f7kJSUvHz5MvhXTU0N3OXbf1D+CYm/dvvtiXgb/koo5FA5ubne3t4zZswkjBJEJPCKziHJPgc6COhjjTKyHrb/0i37OT/ECCL+RNBEhZjxkAQpJ0gYFwNBkw2KIBJN1s6ZbFgsac0SNy6dpFcwUTsP0ki0wGnmCRx6xAPjjRAEkXvTpk0hISHg/w319a/7+9/+HxUgqLW1taCgAEL1nj17v2/rgaApK8jK0ZDyoE82dLDsWe+HxGcMQcyfLWiSUpzwEWRB0y1KJEyKgKMpBkWTdAtAmWnHEjctA5uaqIOMCBGkkTteOYE2fTsesMF8qFSqurpGQkJCcXFxU1PT2Ldb/utl7FvBY1twBWR7ezvcBmx0zC3M+fj4RmMkeb4cUT0bzwl/v/nCQs8wOzhGCRJTjAMLmqSSMN2iVNKsRNwIczT9QvC4WfYsSfNy5HS6BcDRBK08zIgy+FZo4Bt6MB8xMbFzbm7paWmQAcFC24dKL/yFYNQ3pqDqP8RfysjR/t8poMIaWl5Oz8jIgMxWTGzSMDtUIZ6NjrBrJ/yWl7EEGY4QZPQHgqZZlEpgkQgCkIRJ6ayTHAkrJlRR5MYwQSsXQpLQPi8y33icoPnzF/j5+cEmkE6nNze39P6fFiCIyWTCzTx+/HjR4iW4f5HHzSQfevTHoDM2NhuyRjgacTHpMQTNsCyfblmCjMi4FMxHwrRslgNH0oYlblIKgQm3IxyiKi8oEitxL9uydWtoWFhOTi6LxWppbunp7u7p+p9hzKvjPVDrxpThavdf3jOHLQ64GJvNzsvLi4iIgN0ptpAReaZtIinHEfToxL9Y0IhzgUI2Zn8nSCZumKApx5NmWpVPs6BPNS+TNCvGCZrjwJlhx5IwK4cq4ggySX2UCkzUzqYuO4GyC15eZWXVmNg49I4qmwUu1tnZ2YXh35bRbpjS9Qf8/egPPbu7utpa27gcDsRpiIk6OjoQH1FCuMacqFP8N/MZXbyMWGRDRBB5lCC5BIKkcixO0GxbxgwrxlRzoAksqBQImu1YMcOBK2lBByNCwRtb4zBZLLL3Kpl/Io1KNTYxhgyosLCAzWY1NjV1/J8WWMW4XG5RUVFycvKpU6cnTZpMEpIgywShleuvAQhzLhYJqAHzMeZ8D9KIIJU4UdkoCfXU2XbMmdaM6ZZgROXAjqRZmZRzxezTVdOsmZgRlUL8RiHcqHiKcZmYWgxl2nrY0Tg6OsKqUVhYCFlifUND6/9pgWUUCCopKYF00dPDc86cOTzzjqL8UJ/+bwgyYmOxGbGDOIIgrYgI4pNPJEiqxkMqBATNtWfMtoEwRAdHkzQrh/VroUvF/DPV022YEhZ0oAwHMDUZopJhkdBWB5GJkhcvXoTHBQSB89fV1YGXtbS0NP/vlBas/OVofX09EFRcXJKSmnr79p0lqzaQtp0j/lvnGonQyHYwgshG2G7+aAzfsSTCDLUEUbkoCQ0giDnLhg5GNMOKjgWj8kVnKqVc62basadbMSQws0IwAYAPlk1Ui5y0aNe1q1cxFytkspiQScMzxN9CHH0d8dcfW+Bvdv5vlLq6WnhOhUVFYEF+D+6vlrUmqCQgCv5K0PDiNWI+ZGNkSkSVTKJMNE0hgTBLM3mCQoykRuoiJ/TKzEybYS8Djha6Vi+4UA+OhlwPOLJkIFMyGzEloOnQhSvXfGJiYnNzc8rLyysrK355nfCX8u+O/09KZWUlnUHPzc2Nj4u7fuPeXA3/fxubyQZ0shEegDgYhsMQUSWbKBNLU0gkzNFKnqIUJ6mdtdgJvVA0y5YJoXqaRTlwtNitZrF7o9Spium2LJyjqThH5sMeN00/ydbt5qtX4enp6cUlxfD0wIjA0eqx1yv/VOrhOMLwP6P43gGv1NahPsOor6//flnsHc6fTq+vra3Fv9dOS0t79fKF8dnbfJpJw58W/gFkQwZpxHa++xcQZFqJERRHU0gizNFOkTyRNEM3Y8kp7EUrm++hesn5mmVezfPP1UJCBI3I+6wZkpaYKeEcmZRuNwu5efdhYmICrPSYEVXW/l+UmpraispK/Ecb8fHx3rf8lhiHEfX+aD4ktINnoHXdiDm8cn0niEUyqySp5fNIY6vYXN3UqWpJ041zFp9iz3XkzLFn41xMs6QvcK1edbV50aVGKSfObHvWKEdTrYAmZEfiZvQZRpmazvdCQkJTkpMhAYFEtqKiogov+C+bxpbv1WqE6hqsZeQ3UFVjdDg0tg/e8kdUw4OBoWHDjL9vf8TmIY9OwXdLMQBGMF5GqqgFDz1jecFpMuFSzCvJmvkknKAFBumz1BKkLPKXuXAWODHn2DNwImZZM5a4Vq3zaV3i3jD7VBXiDnNA3NdGQxJwtMgowdnDLyIiEmwbchBIqfFXLYffbB1TxlYrR199/bHn2PYxtb8VGA7SVFgoUlNTX4aFWrndmayfRPiN1QxTw2NYPrxyGY2GnjEwq6RaVfNq5xOlo2nyCYSFhumztFLnW+euOMdd4MSScmTjxgKRaMEp7nqflhVXWxeewQhy5Ey350AUR6/2WWME4SHJpGSTRRhYdWxMDGwUYT+N/+wNktqKMS+lfn+1daT9pzLcbeSUv78hO+ZiHBiupKQYho6Oirx0/d4Cw7Cfv0rG2AFeUMRB1KDQQzakj3UuHDywwJtWUm1qEUFHMAtaBARpp82zyV9zsXKpC0fKkQNrGbIUG8Z8J86mGy2rfdoXnq+bc6pqjiMXOJoN+48RO8IJmmxaNsmk8ICV/+0H/rGxMZmZmcAR7F3R73f/lwsMAcsWDIfYiY7yvv1ohclzsn4ZcYwrjVoNCe3Xh60GHArAY/wbCyKbVSGCdAuQBcliFjRHO3WBbf66y7VA0MJTnLkOHCAIMP90xeY77WtvdCy+ULfgXO1c58q52Fuys0biFAQjCQvGZLNyMdNyccNcGVv/e37AUSzcLhg8hEx4tiz8d86jGHnddVhnIxIxyRolFNpHlZFDTPbIFUapwV4JLSssLMrIzIyJifG5G7DN4jFVr3A43AAvhogXjKBy9KGqIQrJPMbM37jVKEwqeCxqaDY1vHpFaBWTxSxISidlsUPh+qt1q85VAEEQkuc4sOfalc4/xd16q2X9zfalXi2w5M91qQYjAo4QTZAu2bDQLsSSIWbOmGTKmGBKlzTOheh478GD6Kjw1LT0goL80pJiBvq5KZPBZDNYFQwWG4HJHH3pFVPQq8GoOqxjR1nDCmP0EP5bTTYX3JdZXkIvzirOTc1Lj81IeBn7MujBXZ+jlj7i+lGCBln8+rkU/WIS/uWEIQO3IJTyGDGAHfLvrOa7+ZhXUaxreK1rqXrFxKNxyMWWGSOCljmWb7lat+ZC5aJTHMA8tGwxFzhzNvk2b/frXHGtbeGF+oVutXOcK3CCIGDPsGZOteFMt6YvtkpbZ/Vc1u6avq2Lvb3pUw/ZtHvy+Y91OCFarOc6tRFm1a/MuRH29Bh3RsYTZlF6OXormI3wDwuTTWdyGaWFzOxwTrw794VZ9bNjVU8ONYYcrX+h3Bgi2xAiz30qn/pIMd5P8Z67wk1XeaeTugpWF5ebPxUzSCMjz2Kj0IMtVb/GnR9ikEU1xboWOKLplxBlEpAFLTfOAIJWnqJvv16//nLN6vMVS08jjiDczHdir7/etD2gb51vKxAERjTPpXq2E+JojgNnoXXBATs/x7M2wRf2pvlsLHui1J+s+7Hg9CfW3Y/sR9/Bevih2OtNtlNXnEZL0ObGxzu4wZrslLuMogw6k4NsY+RHzaPKqKQzmHQGm1GUyYk5zw2Ua/Jb1hO6vT/d/B3j/rv6uMHekqE3lV/e1X/50Dr0tmGwjzXQXdpfFf+ecedtpnlb2O4cr3n3XA4cd3CbaRYPpkQczQP/RJBpBcWqhgoEWdXwGZTyyMahVWyFacZ8/dRVZ5nbbjdvuFK37lLlKlfu4tPITCBIb7jetCOwb8v9riWeTYvPVc8/Wz3XpQaIO+YcdMf1YJGnZMs98fcpJ4ZqAj91Fn77UPXtY+2/Prd++9z27RPI9mFlsPNfH2uGXlcOtaUOsDz6Xu1svjur4uEOdtwlelkRncGCaEWnl+O/lf5e6OiNelbyvZqHm9t8hbqDln8qO/+lI+Xbm/J/va/+9r7mC7DTT//6turL20qkY9V/va/68q7q6+uyrx3xg2V2fY8laq8Lvri0TtH2kpBxEb6Z+C01IHktqqi2dZgF1VINy0iyMfywWV1pmrlAP23tWeaOO80br9bjP5ha7lYF/iXlzN3o27Trce9Wv55VXo2LztfNP1+//HSZ81ln5hXJDm9i/0PaINPya0fs187Yrx1RXzvjvnZEf20P/9oR87U9ErUgJfxrewT0+YJ364wdanr+5tUmOL39plB1qBo9L6GMzsTeMv+BnrLSUmaUa8sdyS5fQt9Dgc+lDl9agoeanw01BQ01PR5GY+B3Ha824nrQUPNTUD4VaPQ9oHT7EGuvCTk7G04wySMac4fDjcmwwmOCc1TJY1mD1i/rWj67Oipk2HLxfLAXQwQZp24+T995p3mTTxN42ZpLVUsu1i0/X7XApWL15fo9AV07Hnatut665FLDCjeunYtrzdXxvbcJ/YHkdy8FPhXqD1WdHqp2G6pyGaq5NFTlDPogtOA6ki5jWpAcrD7zLnMdnN5zm9jqTeU8VSktyCouQf9zUMlIKSouYyTebLo9tcOX/PoJ+X0Ez8eMQ4Nco6EKu0EE+8Fh5U+wx2D6IXHF2zBeGKv3DrH6ioiW3VmKMZMI1MBqZVZJNuHwmHJ5TTkACM+8ltU021owIiCIBuudXAIf7MXWWGQtMknfeIm7617L1pvNG681rPeoXuNeDTQtO1uxwr3uYFDnrsCedXe6Frk377+UlnF1de8twtsQ8vtInveRvB/iJg+UrBlkKw+yZAbZ8oMsuUG2wiBbBelIgq443AKHWIofS7e/zVnyLl7wfRTP2zCevkByo8/EsnjfbNhEjZSsrOyMjCzuU8XuG0ScHTRWlPBAvvhA4ZLB8g2DzG2DzO1/xrZB+paBomWfs6Z/iKV8TOL9AGOFkPtvEwLO7Z5inkM0rQJ7gYyZbFpBNqvgxWGJwjPNtg6MiM++nmrKJikkoI87VptnLjbO2O5Zsdevdeftps0+TRuvYY7mXrX0fM26Kw1Hn3XtfdK34V73cq+WIxfDS65OehtMgjv+EM3zOZPyOYPyKZ02kD95sERyiCk5yF44yJ4/xJ45yEJyiDVviD17kC01xJk+WCQxUCj5OXfyxxQBOHH4vp+Tu3yIJaE2cfEJ8SMlNi4Oqjn3j/Y9IL17hdj5lEoZyMVBHSjiHywTGeKII7DFhyokhrgSSLKxFo7EIF10sJh/IB/uivo5iwLnwljvInjgth+77Zhknks2r+E14/KA1SAj4vLCzsuihmJZzWeLCAIAQfxmHB6FeETQOquspSYZO70qDga07b3btM23caN347or9Ws9alZfrFrp2XDkWbdc+OtN97pWeHfsOJ8ZcWnthxACPNVPyZSBPOpAIdwxbbCUNsThG2LzDVXyD1Xzf6kR+VIn9LVRCFP4h6r4oX2QyQd9BstpcMrnbCriKJ4XCGq9IRTp5/jkWQiUsLCw4OBnAQEBPrfu37+kzb0p8v4F+WMcLxoIUECF04e42CiV/F/qBb40CnxtFfjaIvC1TfBro8CXGv4vdQLoaAX/IB0bqwCd+CmZ930EuTFIyPCkHQUijlkVr0U18EIxB0eroFhAclgNySHyLLAg21p+IMiiAiyI71giImixWdoen4rDQW37HrbuuNu82bdp/bXGdZ4169yrl7nXH3zSpRj7drt/z7prjWBTeq7eFQHiHyNJn5LQfQ8WAzXohoAFuOOvrYJwr9/aBb91CH7rGlag8UuDABAHfQZZcN98cN+f0nk/RZNbngi52R/ZqH5pp+7ljVpXNutc2a3ntV7Ta5nq5dnHb5jaKlc9HgfdPqeNjFWJLvK1CZEyPETnGLSh4RBxDYgmGOgzEARGFEPuDOX3OC872SyHB9ZyMy7FohKtWRZVPBZVFFCskPkAQThwgnjlE4WUUggbrbOWmWbI3Kw++qR9v38rRKItN5o3eTdCMAJfW3mpZn9Ah2r8mwPPeiHVXnaGucQpX/e0W+q9Ra9f8g6m8wzCfZfREDsNAvAMESOdvwBjCmaF2xHMcyCP520cpfzBZGMzWTGZa7Sj9wSl75B2XyXtukLd780v+5AmfZ8q4ycsffOwtna07/zWUP6hbN6hAgoaq2KYo9+OBY8HCEI2C+ZcRv2YTXqdwJd5f67hKUtRw1Rew3KKEZ1qyoKgQ7WsQoZjicVm65ox7AwTxKOQIKiUTNhplw1h6LBfo3xwh3RAy54HLThHG67WQ1q03rNm+60mlbg3h552r79eseR0wTzbDCmLpC1GPu6ux9Jvz+lNFEDPtpQ2wKAO1NLAyL82C/x8000CX2r5vwA7ZUAN9WMqtTRQ3Mt5xxZlY8G9F6j7vIQPetH2eJI2uyJsOUfd4yl4yBtA3X+Ntv/aLGkXLVO5x9eWlD0Tf5fOhzji8H2p5INrfm0Q+NaKoQ09HuRlGDXQ51MOrfLlxPDrK2wdlBZq+FBUwnk1Unh1sqkGxRRjOjgX1bIaBWbLKuBoLDsCJ+sFHRowghIFwYJ2OOSssc1R9G88/qxNJqj1YGAbcLT9NlryN15vBI42Xa1TjnktHdy58TpnoUPuArPouQYvpmoFz1APWKN1SdNUw+PM9pibC+oSRboyBd+UCL5jCH7kjIAr+I4l+KZAoLdAuC1WuPDxVJ/z69QNZZbJWwnuOkPe6c6z4yJlj6fwvvOUnReHCcI52u0htN8dmALw7vGi7PYUO+S6XslY3Ujew3XTc++lBYEzapOFG9MFO7LGdWSO68ge15wuXJsqXB4m+cp3ie+FtfqWChvVbacfu8Yn7cer8IyiFEo5HsWrmULRy6EalVHNODSLCqAG7IjP5rv5IHZONgg7NglYVVAUk5CL7TmZs8E+T+lxs8qrHmDh0OM2WM5232/ZdgtxtMm7aeOVWrmwnmORfVtvVC12zp9rEjVH7/lMnecSaoETFR+IKdyTULw5V9FzharzAQ1dHXN5M5sjjicPAhxOHjx58qCp9REdM5lDmprLZE2nHnYW2uvGu/MSaacnaet5/p3neHdcoO3xEN53kWfrue8EjXJ04LLgAS++vR5AIs8eL57dnpRdHmB0Ew64Tj96ep6s5UI584VyFqOYK39yhsxZMekrgoevU4/c5TnygFf6IU32EVUugHLsGUXlFUUzGSOolM+CC+zQIPQAO7a1wAsAPAtjpxEIErapElRNF1JJIexzytniVKDytFUnskc5uOPIk/aDAYggANjRlhtN669UHXzcfiLu9aHA1hXnSxaezFpoETtbP2yGToikWiBgiuojMcX7E+TvTlC4KyJ3T+iwr9BhH4DAIV9+wIFrgod8BA5ep+y9zLvLg3eXOxBE2Y3mjCsC+z2FDl3j2X4Bp4a85Rx5qxso0MK310vg4DXhA5f59l+l7r1M2+fFu/cK714v3n3XeRC8yftvkQ/c4jlwi3LwJijUw3coh27zydynHEWgyT6kygdSFZ5QlMIQO2qxVO10qkERzZSBE4TbDr9dHfIp+3ohRA0GpyZRx1ohzRzh46mEfafy9rkWa4a06UX3qL3sPvqsA4xo3yPEEQQjzNfqwaY0E98cC+/ZdrN25YUysKN51mlSFglzTWNn6r2Yrv1cTD1kguqTiSpB45Ufix7zAwjJ3R8nD6H3Nv/R2wLSdwVAHr4hcMibdsCHdsCbtv8Kbf9VvgPXaPvgafsIHval7LmMuNvlwbPnKu9ukFd493gCibSDvkA6hHB0naO3+I7cph25w3v4LvXoPar0A2CB9wgofnwyDyiyAVS5QIr8EzAWqmIwVfE5VTWccjyS93gMRB+KdjpNN5tqWMIH7JhzaJaVo56FW42QA247jaKnmya5tkw5Uy+snYW2Godc8qTd6aYR7fqxvccjeo897zz6tB0t+RhHu7H0euedFs20t5qZHw4/7VzvXbfyInPxmfIFjoXzTxbMtMyWNMuaZpYmYZQkrhcrrhs1XjN6vHr4OLXw8SfCxh8PGaf6fLxqiJDiE2Glp/yKz/gVAgF88gFU2Uc0OX8+uQDBY48F5QN4D97nOXiP56Af76F7PAce8B54wHPAj+fgA6jyywaKKD8TVAkVUn7Op/iUTzGYhvCMCmEFh8pLimoE7XgkVS2Ooh5PUU+gaKVSINwAI+BQBvk0wxKqcRnNBKhho9CDexYele3qRqnB2Zni1jL5XIuocx3leCZNNh4RpODFdEjsM4jt04jsVQ3pUAjtPvq0A+cIbAdi9o47LSoJr7VzPqomvtse0LvOu2X55aal5ysXnK1ceJou5VA607ZsunXxDKt8SYv8yaa5k40zJxtlTDRIEzNIE9VLnqCXMk4nWUQrXkQzdpxmrIhmnIBGvMCJSEG1SGGNGNSoHk2WjSDLviLKgPKCLB3JK/2CJB1Jkokky73gkXlFUYwQ0UwQ1U0U0U4S1EoS0Eri10rm00qmaSZTtVJpOpngO3x6OTS9XKpBAZ9hEc2omGZcxmdSzm9K5zdn8VtwwKf4rCrHUjOWHRGnxgkuTRNcmoGdiWebwd0gePPiBB0+k3fcm3Up47V1yhvd6F6NqF7Flz0yzzuBIPA15G4PW3febZF90aNf+AmMSDr8zZYH3Wt8O1Zea13s0bToYp2Ua7WUa+3s09WznLgzHTmSdmxJW6akTZm4dbmEZbG4ZfFki+LJZoViJgXjDHLH6eeI6OcI6GUL6WUBQBczzhU1yCErp5BUU0iKSaRjSSSlZJJyIkk5GSmqqJ2oksKrmiqonzPRtFjUtETYGEHQqEQAoRQkvwmiA7mPGYvfnI0YwZ3IqorPGvBDHjg2IQR2Jp5pngw+5dYyybVZ2KkRdmQkixpeyyrKiWxEkJxrvvZtjm/pR9fst2bxPdrAUWSv8qsehbBu6WcoZgNHu/07ZZ91GBZ8NGEMaOd+PBjSv+l+z+obnat8O5Zfa1vs3rTwYsOC8/VS5+pnna2f5VI741TNNJc6SccqCYdKSYdKiZMVU2xZU2zZYhb0cWb08WYgy8eZlguZlIuY0SdaMUTNykjqBcQT2SSVDNKJTJJaJvFELlEtH0F9BKBrFFL0y0QtWRPsKsSs2SJWHEFLNkDAkoNgVcFvjUihYQsTn03tKAujEsINvmAJOSCHGueM2AFqxM42i4xQg4NqXcOrloMIUjpfYBRQfZ876FP+2SblDXAEdqQT3asG8ehFj1xoF3AE1gSBSTfvgylzwLDk8/HEtwdC+jf79ay91bXSpwOw7Eor+tzavXHhhXpgau65+jnn6meeRXxNP1MPZIk710k410jYc8VsKybbcQHjbbjjrTkTbDhAopAFi6hVTDyRR1QvJGgUAREgR384+RNIemU0M8542woxp7opjtWiJ6vH21cL2tWCFHaoF7SvFbavBSLAd/CVWwhboWCdEhyJNZhDNeMOhVsN1aZulBocPJY1vOp5iKDjFwstn9aHNn/1qxxyy3l/MvW1fmyfXgzi6EREz7GXyJTA44Am4/S3TnVDwJFByWcIRtKhvTv9e9ZgdoTTtOJ6OzC1xKNpqWfzwov188/Xo3cf3OqnuTYCTQina6edrp16qlbMsWayfQVA3J471bmaz4RBUCvACCr4twQN/9xUrxy8aZxN5RSHaolTdWLO9eMdAQ3jMDnBsVbEsUFkhA5QAKLOjVPONIGxAMTPNk5wbhCwq6X8Qs3PBGm4F7pGt8T2/T8hLd8eVgyezXnvnPnuZGq/WUKfUXy/XmwfOJ1qeO+xsC71xDdunV9PNX2xqhjUyf2olfVBJfa17Mv+vU/7Nt7rBmtae7trlW8nThbyvqutK661LrvcDKFKyr15vjtS5l1onOnaMPVsw9RTNZOc6qadqgHi+AzKMF6KCJpFBK3isT9tR7/B/RUjb0ORDJkUExZEGZGTdXC1KacbJFwaJc41i59rFnNpmnQGLdhQnXK2aYprM0TfiWeawF4E7Oths0o2Qx8JjSWFbFlLssTYsUKfK/Jo5COC5M/knXpWGVz1KYj73rf8rWN8j11Ul1l4p/GLDqOwDp3nbYpP25Uetyo9bjka2OSQ1+dEf2dF/6SX+fZ4Ur9iVC8E76PBXbsfdW6527bxTusa76blXk2rrrWsv9m89kbr2hstq3zal3m1LL3cvORy80L3pnmutXNcqiWdq6c6cKY5cGY4csRtWFTNPKJqNgKEnuM/QqOQqIYsazQMETWLkD/i0C4Zhk4pWbeMasTkM2UJWbBFLFjC1ixBK66gJQeq/GYIFCMm2YCBvT/OGIYheyzIxhyiEVJ4TDg8xmwSxCC5eMI644SjzsnGNxgGNxhavnSly2X7zhbvPVu826Vo9+kikNtcijc7Fm5xLFxrn3fgbJHiNbr0ddZ2T+amC+Wb3crWni1bd7Z0mUvh8lPFyxzylp/MW+RYtNAhZ4l97kLHnMUncxfY5S2wyVtgmzffPH+uce40k9wZxjnTDHKm6mVP1cuaopE2SS1F8FiCgGysgFwcv1wcUmRjvyvo/8kAGc8vF0+TS6Ch//Egnl8hkR993JfEdyyZH/13Gon8oCgk0Y6lwCHqsVR+9FFOAqR5fPKJVPlE2iiOJdNQt2SaYgpSlNJoSqk0xVSacjpSoDqsp6MOx1LGKSb8v+Xr5elEFkVcAAAAAElFTkSuQmCC + + + iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAABAhklEQVR42s28BVxVz9YGfALOObSiqICt2N3dHaSU0t2NhKKIAYgB2IoCoiKg0t3dcJruTlsB9X7fmr0BMe///t77fu83Pi7XzJ69Z8+z11qz5px9JGhfzDP2Kvj/LUyuFJh4IeD6T4eMvYaPjvb570LPq4hw61VlclFrfFFnQlHH/1fojC/uQijphnGR/DMSS4eB6z8dwmVCCcJPR/8r8IutJ/jH1bHq+0uq+kt/i+oR+R8pIGvfIqXmzXfUvkOy7l1p3fuSehwfSjH5F5Q2fGA1ffh7n/8iius+FNW9L8V0RvMn/8RGgtfzyjx2bz7n94BDgFx2z3+kwIm57JFzOX15GL4rFW/yK/rzq97kc/vzK9/kV73NrXqbj2Gsklf5Nq/qXX71u4JqJBHwo9XvcrF2XEIfvNtPyIMOlW8zuW+zK95mVQwr6Zw32ZgOLRmYjreAjvfJqRxGJvcNXPZqWDXB7TE3vbwrl9WTzezOZvb8hExGNwK9+z9S4FLfq8zeTLgOQm8muy+ThZDNBvRmc/oRuG8yuG+yua8B2E2D/gbuL5PzGiTcKxABAAU/hOYzRuKzza78GdCYxn4zgtdAxK9I/UM7Dhjd43kVwcmPFV/YARwB0sqG5c8o/zdKUkknyOTSrtQyBFDSfrwOumx5Vwq9F5BK70kFhdGbwuxPY71OY/WnM/vQNEBhv4bJgJLCeg13j08AiMjA7jgNAxyCzngHNMkRBe8wrLDfJDNfJzL6k5gImPL6F/y+PRkB3QDo54IqCeY+pRE5rUmlaFbxxZ0gE4ohiP5niCsakRjw6ncUdQKDiViHBCyUJpT1JtD7kst7Eul9CQj9GEaV/ngM+O3C/OF2ExhoPoBRZWwVuuF98FNAiSvvjy77AbHlCKDEjCB2pE/UaLfy/hgMcfT+iJI+uwdsAqyOoenNsYUdUXntvyI6/5/i186oBUNUQUdUQWdUYWd0QUdMUReO2OLuaIQeQGxJTwymxJT2xZT2YhIpsdiNIsBMoAXNoW9EQS34nPEOcdjE8Jao0r6I4r5whF6YJyhQjSxBiMCAK+EjeFX6Ory0H/Cy9DWOqPLXIbldpjfoBD2PfP+Ehqi8tvDsVhyvRpWs/wD4icPV7BE5jLZXOYB2wMu8zvDc9vCCroj8znBAYU94UU9EEZIYekdkL2os7o0cmeqrot5fgU8VuoWPoQNawgp6Q/N7EAr+IXq/oxABKHuQ1qHuWUJQOpd/I7wGpvcys/VlVuuLzJaQ9JbQjJawjJbnac3B/wzQE/oHp7cGp7cEp7U8Q7L5eWYbasloe57ZHpzZhqpZ7QCohmW3P8/pepHbGZbfE1bY96Kw/0XR6+8o7A8r6AtF6H1R2PsSA0wjJK8b5oxLHNAeNqZPWEEP6CH5Pc/yeoKyu59kdz3N7XmS0/0kt/tpbvc/VILh3Jzu0MK+W3HNym4FBIWz+VdCKmGGT5KbfkIQIAlH47/FE6wzJhsfJzZ+Px1reZrSBHiS1hqU1vYsvfVpVsfjlOY7UVyPx7kO18Js3O6aOl0xtPfUtXE3c75qc/Ghs8+rq0Fp9+NqYZIw4WB09z3YhPFpoyrgeV4ProxFYFZ3YEbHo8yuR5nd/lndmNKFK/6/tIwqgdlIBmR3B2J4ktdzPbJB/kweQdop7dLjUphDQEJDQHzDzxJTHsXVA/zj6iGzBOVhLMIjrOqPHcKP/vaQX2IzXORRUktAcotfUuudiIoLD1LUba4ckFVfvn7XvKVrZ0gtmjFz1rSpkhISElMkJKdNmzZz9tzZ85csWrZqzZZ9R1X0DE/f8nycez+xAc0hqwemDTN5mIEm8zinOyALAQ4FYIBDd1M776d0gATcS+28kzKsjLb8Vrmf1oVLDJ33s3ouhDdKO2cTDjlkOd2n+8XU34+uG8W9qFpc4rj7P8CdmIb7MQ23I2suPsrStLu2fpfcgsXLV65eJ6eg6Ojo8OjRo9iYmKzs3JKS0rKysvKystLS0ry83IT4+ICAgPNubmrqGus2blmxeuOOo2rG5x55hDLvJnfcS+2CacPE/NK78BmC8iAdzQ3abyZ13EzqxNBxI6nDN74Na+nwSezwTey4lYx3+COgA+BOateZZzWHnLIJe23SbW6U3I6oAdwKr7kZXnMroubGq2pc/gqfF1U+L6u8X1SBjkto8X1ZjVdBAeDtOLwj6k7fTZc3PLdo3a7Va9YaGBo9DgoqLy9/8+bNly9fhr6XL78oQ1++fnn//j2bzQ4NDTU3t9iwddfqnXJaVpfcn5ffSem6kdR5OwUZCI6b2MS8Ezq84tq94tquRTeDciWu3Tu2BWtBuBbfcTW+fbT6W+B9vBM77B5V7j2ZTdhlnWZyvRSmdC2s6npYFcQjr5BKUK6FVoL+Ky4/r4DdCUhcH20ZVUaPeoXVugWVKJtdnLdy65r1m93c3IqLS16/fg28DAwMfPr06ePHjx/+WqADdPv8+TOQ9fbtWzCxK15Xdu7au3K7rKHrQ49XNdcSu64ndFzDALO6Et9+MbL1QkTLhcjWi+HNIEfhEdN2KbrNPboNFKiCcimqFYC3DB+KRTo6BHpcu9Fdzm7bDMI281htzyLP4IrLGNyfcT2eVbg/5XoEI3np6XD10o9wHyMv/eZoxaVnlWYe4Wt2H1u4eKmDgyODwUCz/fjx3bt3YDtvsfLmPylwIk5oZWXl+QsXNm3ZtkPeyO5upkdMu2ds++XYdjS3mDa3l01uLxrOvWxyfdUCcENKMyjnwlHVNRwpZzEFr+I4h8kzMa3nIlrcoBrR4hLTpunD2mGdQdhiFnv8fP75IM7FJ9wLQRy3QM75xxzXADYuxyr/GJzTD4pVzK/MWbzm4MGDEZGRvX197e3tVVVVbBabxUJ/KyoqGhoaujo7e3t7e/5Z6e7uxpXX/f1ghmnp6UpKSkvX7tA5E+T6ouFiVBuaZGi9c2iTc1izS0g9yLHKKUwi5UWzY+h3HVdOvxiuurxsOY3Lly2KXowtFumETSZxsqdyTj9knfFnnX6E4PKI5ezHcvoBTAyjyh/h/JBtczNvj7Kl5LSZOjo6EHFbWlroWGmor+/o6IAZdnS019XWgr8UFxdXVVW2tra2/UeltRXohutUVFTa2jvMW7rukP5Fp+Bql1et9k/rbZ422D5tsHnW+CvsghvtnzfZPB2ugm4X3ARyVDmJwT64CRi0D2mWuVC6xiSNsNkk+rBjlu1dhsMDJuDkfabDfZCM77jHsLuD4S7D9jbdBsNvlDt0u7tMQ6/MtQc0xaZIWltbV1ZVcbjcgoKC5uZmiCMQer4Nl6+gQ3BpbGzMzYX1q6Surq7hD6URK789BNTX19ddvHhp9rzFu4/bmTxgWAfVWwXWWgXUmAQixfxxg0XQD7B88rNuiWG0ZbjxSYNZUMOBs8UrjNII642SD5zMtLxZDjOEeVrdolvepFv9CIsb5QBzTP5JgbMMPdNX7tOaIDbZ3t6ey+XCUpWdnQNP++sfCtAEBpGdnZ2XlwdOV41K1QiwCnglmw3xCwwQJBMr0AJhCD9aW1sL/7i7u8+YLbVe1tTgZomhf73Bo3p9v1rjB1X6D+tAHwNU1YcOOB7VGwUgxTCwwTAAQ+CwNAps0POv33GqCBG0Si9xj3Wa0bUSmKeZL4KpD4LhtVITnzJQQBpeLzW6Xqp/teQnGHuXgTRCR8u03LNWHtAXEhmvqakJ8wF2UlJSYBqwYA39uYBl1dTUpKamAkcsFnMYbCaTxSwsLATuwA2BhY6OTjwAAaHACzTCUaAMerI5wBjbxtZ+/CSJDSouujcYOg9qde/XgMShO6L8BGjX9cOUh3Xajxp0HtUDtP0bdDBo+tVtdSpcDgSt0E3YYJKqfbkY5mlwDbGge6UYoONVjCsIXsXQAYcWQhGuDDd6FWu656+VsREQEtm6bXtaWjrEl+Tk5Pz8vO6urs+f8PIZw6j+CV/mQXR3d0GoSkpKAo5KUCnOL8iH09PS0urr6qAP8Pj1CxjcN9zoBgcH+/v78SHgFCALHkZObq6MjAzfOPFN6h5KN2vUb3BO3K46cbta5U6N+r1a1btjcGcYGvdqj98dVqBd7X7d8XsIoKjerTtxp3qzXe4SvWTCSt2EtUbJqhcKcFI0PYq0PIs0PYs0PIrU3AsxFKm7Fx2/WHjiEgIoqheRHFag5UL+Tr27IhOmwF7h5s2bcMepWOFy2LBEvX+HlffvEX4pkAf29fWBEWVlZQFHEJIyMzPj4uKAnebmpoHBz4NDgwPwZ3AQaAI5MIBVhwbhXOAyNjYWeiJmi4sDAgLnSUlNkJi7xywIOFL0rVTy5sr5VB27UX3s5ghujAFWVbpVg3C7ZkSpVbxVewxwo2qtdc4C/VTCMp2EFfpJx1zz8MmrXChQxaByvkAZh1u+khsmXXOUzuUquwJyjp3LVziXD4qiW8EO0+CJc9eTeXhUVI+npqVnZKTDDME7YNpdXV2vUekfwesRiQpkN7B4Q0ApQ9uLPDgrKSk5KioqIyMDGt++e/vd5n4uYFgfYfkDNqE/+DIoQLGpmRmNSpFYumvf2XQZn2qZ65XD8P6uyHojedS7Stq7CrX4VB/1rZH2rUH9Ab6oCjh4rWqpWbaUVhJhkVb8Eq0E6VM5SucLYLYgj7lhOJuj4JoPisKZHDmXHAWXLBlcns4ByJ7ORopL7hH7+LkbjhFJ5KlTJcF8wHDgqUZHxxQVF8HaBHOAZKe7C9yoC0P3KCCgVFVXwV7M0dFJS0vbzNz8wYMHYS9eJSYmcTgciDWj+SRklHhSOaIPl67OLuiZmJgYERERHx8PHvf06VMpKSkyL2XeHoO9F+l7vCoQLlccuFKxDwMoB69W7L9Sue9q1f6rVfuuVB68Xv0TDnkDavZ5chYbpM7WTCIs0IhfrJVw0DlH2jUf4UzeYYBL3qHTeYeccw+fzQd51Ckb5CGnHGmn7IOOOaM44JC9QvYsBGYSibxv//7w8HB4nq9ehUdFx8Cus6GhHlbopqam0UwHVjQsj0GJTH1Dgw9W4OH7+/svWbps//4DN2/dun37toeHB1ykqbEJ0si+XpRLjs0m8UYwPbgOPAOI1q9evXr58mVERGRMTKyKiiqZTKaOm7pGz3/35Yq9l5i7Pbmg/HPsvVIJ2HmBOUc7ZaZmMmGeeryUetwOm8xDp3IPOueimTshHMBZwFr2n8zea5+11y5rn33WbpuMXTYZuxEytxiHiszaQCSS+Pj4bGxs4EZDQkKeP38eExMDG3OU3QAN9d/TmdGkBlIYmBi45KlTp65eu3b9+vVNmzaJTZoiIyuncEzxyFHpdes3+D/yhwTqD7liGxwC6uvr62HFjIyMfvr0yfOQEKDJ9ZzbuPGiRCJxwtKDa51zt1zibrvE3ubG2HKpYtMF7uaL3I0XuaBA+1asZZtn5UaPqi2elbiyyQNk5WbPqk2u9FnaqbO1UgizjsfOVI3dZpWxzyFn98mcPQBgwS5rp132LvvsnfbZu20zQdlunbHTKn2HVfo2y2G5zSp19l5zXpogiUicNFn88mWvJ0+C/P0fBQQEgB3BwgQxqPYPBWiCILV+w8ZpM2bNX7Bw3vwFQsLCfALCc+YtPungCFYkJTVPTU0dkinoCSzU/5gi1mMF/oFnAASBRwcEgBU+CgwM9PX1Xbx4CYFAIPOLzpJz33qmbK0bd+UZ9rqzzJVnOIDNZ8tXu3JWn+OudqtYdY677lLlmguVay8irLlYuc69au2lKpArTzOmqSfPOB5PmK4cLXksarNF+ha77B12Wdtss7baZG6yytxqlbHFNnuzbfY26wxUtczYaJGxwTxjnTlS1pllrtAOEp62hEQkkEikpctWgLPcu3fv7t27IMCOwEAqK6uAo+pfUV1dW1cH67SCggK4AxErcJEZM2ev37BpxsxZs2bNFhYW1jcwgBADFNT+ucCl4DoQg+7cuYMNfe/mzRs7d+6Cy8KNTZy/bZFl4oqz3BVnOBvP0IEmUMZi5VnuKlfu2BbEmit31bmKRfZl4seTpqklIQsCgtYYpQAdG6yyNlplrbfIXGOeuRZgAcgCRtaYpq81SVttnLraMHm1YQpgpWGSxHYTXiofCZvbxo0bwU2AI1+sgBFBZIFdaUVlJQ68jOqQ7IEMCgraunUrcMHPzz9n7lxtbe1Tp05v37Fj9tx5+w8cCAsLq/53BUwMlr/g4Gf4uDdu3AApf0yJSuMjEgm8ghMl5S4vcixe5FiyyKl06SnGklOM5S7sRafYIJef4Sx3wYCoYQ/rwy3cBbalk1USphxPAguKEZePXKafAqSsNkNYaZa5CqQp0leZZq4ySl1hnLbcIGWVYepKg+TlBsnLDNMWHn8qNHM1bj5Qtm/f7ul52cPTE+Kr5+XLsJzBmg1eBiZQMbZwuT/WuPEJCVeuXj/rev7GrfveN+95+94ODAoOCQvPyMzG+3JHTuGOlLE6RLqEhASwHRgWAPdw9dp1leNqfHz8YJU8PDwC8w/Os8yc68CQcqDPO1km5cicd7JUypExz5Eh5cTBMc+JvfDU9yoG7myrUjHlhEnKCYigiUdfLdBKXI2RstwkA/Lr5cZpiw3SlplkLDXJWGSYtkQ/daFu8gLd5EW6yaDM100R33OOLDCRNFK2b9/h5nb+LFbOnDlz8eLFJ0+eQNYHuwHgCGbC+blwWZxKJpvLYZWxC+MLkoOzXnr6X9F64K4a7u+aH+9XnB3DKM2HTQeLXQG98f0EXlCVzYa9SHl5GWSJYIYXLlyAQfGhQVdRPcHPL4C7LWXctOmqgbNty2fblM2yYcyxo8+yoc+2Y+GYc5KN4IDkLAfObEcEUOY6cadZlo0/Fj9BMZ4wSSYcEaSZANQsMc5YZJS+UC9lgW4KsIB0g3QpnZR5uikgpbRT5molzVFPmKMeK7RYjkTmGSVo/fr1DmOKo6PjlatXo6OjCwry0Y4JFXyfxYLdJtp8lqSzsvyqc43q8lXaC1V6ikz6Ss26yk52FQBMWjI0qhJUGl+qcMPN6El3GMXZsFVlYlcAyWAyYG9RVFQE7EDic8ndHcYbHRqWxaPSsjTMgtCd8VCFt1hNtSiStKRPsyoHTLUqn25Nn25Fn2HNmGbLmm7LmmqLlGl27Ol27GkYZtixxU2KBeXjhRQSCOMOvxQ8+GKqUsxcvXQpvTQp3dR5OoiOuTqp8/UBabO1UxApmkmz1eJnnoiffSJuqsIzithCEok4StCCBYssfix2dnaQ0UD+VlBQAHEUZoUxwygtY9BzX9Qnbeunqwx0+XzpT/v2qeLrQNvQQMe3L33fBgFdXz+3ff1Q87U7r5/uXO2/oiDmbn5BEWwsSktLIP+EoAOpNqSjfn5+rq6ukF6MDmppaQnVrdu28VIow3dGJNKmb5ikHSduVi5hXiZuXjbFolzcEkCXsCyXsALQJaxKxa3oU2yYk6yZYhaMCeYMQTMmTSufdCSGJhOLCKLuDxM+GiGsmDxRORHC0pQTKVPVAcmzdNJm6aRP00qfoZ4keSJxxokEcdV4WPnGbXchUYVIY8rUadN1dfWMjY2NRmBgYAD3CsEIZoJvytGXFuXlBYXFmanRpZFynxrt/zXU9K+hnn8NtAO+faxD+FT/7UP1t/dV3z7U/OtTzbsS2zgf6YcP7kKGFQfhKiEBrgY65N8Qb2xtbY3GjAgwNjGBcRctXvz90UGoHjd1vPx9MbPySaZlEzGImZVNgqp5+QQL+gSz8vFmZcLGpXxGdIphOVmvjKhXTtSnE07kEw+PIUhAOkpQIUlAPhEgJBcnJB8vrBAnqpo2XiVVTDVpkmoihKspKvFIKscLLFLk4aWMJUhQUFBOTk4L1iEdbU0tLVxR11A3MTUBXwsNDYW5gUfAk4d9E+wnbtzwSArc/IGjONh/ffD1zcHXvkP9j771pXztTvnam/q1J/1bd+pnukPh3e33b/s+DnoaHBz85MlTb2/vc+fOOTk5mZmZoUHGjIUpWrp6ukrKKmKTJg/7F8YQmSoksNVOxKhQxKhY2LhMyLhM0KiU37CYalhGMSgl65aSdMtIemUEXQSibvkIQXk/EMQvHT1eMVHoWJIAoilBQC5eQC5OWCkV+OKTiaVKxwrKxPDLxAjKxvIfCuWR2DjWv5Cn8/CuXbdO9biqsooyDhUVFVw5ceIEzOfKlSvPnwe/ePEClmTIVi56ermetcgJWf62QvB9vdDHBpHP9aKfa+d94h742Gw01Hb1A9exNGhl6KOLGZk5kBP29/fD/g02ei4uLopQlBSxi6uMDDcyltqJXbt3U6jUsfcGRkSZf5SqkUrRKyLrlhC1SojapQQcOhgv2qWIFxx6wwQRVbJ+IEhQOgpcbLwSxhEQhEwpXkQ5TUgxGToJyMZSj0TxHonmlY4jb/cmj5sxusCPlhkzZkrL/KZIS0traGg8fhwIuQ/kjbAAQTRJT08PDXt1/7ZXeeT8PiahjzsCNqG3gPYhf3592LxnN4xevnoFiTJsuwYGBr99+/blyxfYXgQFPdbT1Tt8+PCvY4EVw2b1pxuDW+WRXE+SjyRoliBSNIsJIwQRdcB8Sr8TBLzg0PsdQUCHiFIycjSFZIyjBBGVdCEwIrAm2ViwI9qRSIp0HO8mNx4BsZ8IApMWEBTatHnrwYOHDh06vHfvPpgASICJiUlaetqHDx/+hRWY5+fPnzs7OyFLCg2LCLh9mh45F3FUQeilE3qKiN25hLY4auxNuaCg4Pz8fNi1ffz44cuX4U9p4QpwOiQQEI8PHDiwf/9+GBFGgUFh4B07dwoKCf1CEJFHZCr5sD9Bh47xUvIzQbhz6dH/RpAQRhBEHLAjIcUUYAeYGn8iCxGkgLyMJg2OFkc98IRn1m4yD4VE+vU2iNOnz9ixY+euXbsh2Qfs3r0H4gWkLfjH9WM/ioY5w46zqLg4OOTlI9+T5RFSfQxiH4vQRyd0JpHTHmz0f+Cblp4J+4x37959GaUHK/jH/pBGn79wHqiBFAzGgkFhaNimoE3GL4XMSyUvOUE8kUHQKiFr549yhBMEtgO+hngZNaI/WpBKOrIaIEghSfBY8ng1nKAkftl46Eo99GT8CrU58xZSqTTS7wqVRlu4aMm2bTs2bNi0afOWs2ddYWP50/RGOXr//h3syMFGnj0LfuRrx3oxqaeQ0JNDZPnPD7h9LiomATLmvr6+wcHB337gDyTBrh4y0m3bd2zYuAloWrxkKeSHv70xfgEBqUUr+NebEI+noLjzowV9J+hvLiYTPe54Jk6QiHKqoGKKsHKaqHr2uOMZwBS/XALvwaBxK5QcnJxPqGvBEyH9oQgKicDGdcXK1fYnHZqammEm6BPl3xX822TYrENe8/RZ8GNvvYpnYvUvRYNv24a9jKKXl3d1dn7+/Okv34jgX4q4ubmtXbd+ydJl48aN/9Nd8fLympqamFraCq4zIKgCR+U4QTx6JcDR98D8d4LGn8gUUc0Yp5IuqpICRiSimi6qkQOsCSqmUsB2Vio5Op2GzB/WEAKBQPpzGTd+graOXk1N7dCXoYHBgS9DX/40STj65s0bWKQgUQp+Hhp2xyLirlZIaGh+QUFLS/P7D+9/a32j/IJxQQeg2NzcXHTChL/cEri/np4ebHiMTMwF12gTVJKRyeiUEEeX9rHs/D4GycYAQRB0wGTAiMB8gJqJWnkgaYeDxq9QtLKxKyoshOgIcfEvBMGhhQsXJiUlDQwMfP48gH/e/hcrgD7gR7W1tXl5+bFxCbDFBaeD0PPmzeu/nDj69QYaYXAITlm+YsWY3Oc3RVZOFpYFeBK6+oZ8q7QJykkoJ9TF0sLfEFROVEn/kSCZaHCoCScyxqsMRyJgSkyvUFA2WGSJrIGhcVRUJOwbXr58uW3btj8RBLcoLCx86dIlSFvAOz4jcgb/Pk/8q7He3t6GhkZ8W9vY0NjX24d/E/snz/pO0ODAp8+fYYn08fEdLzrhLxzt27cPsnCYQmRkhIqaFt9KbZJq3HDi8wtBJAMGSSX1B4JEZCLFtHImamSPRiJRjVxR5Reiy2WPq2k89PMLCPAPDAy4e/fumjVr/kQQmYdHVlYW5vnxw4dPnz7h5vNPyqdPH9++fYN9+twDTvfp46d/eOIAIgh9yVFTU33ihBqFQvkTR+s3bPD398dmEXj//j1Z+WP8K9SQr+nShwPQmGWeZMj8TpDokVf8B14Iy0RO0soR08zG446ISoagzDOxFdLy8vIeHh5eXl4QC2H/qaKiKi4u/tubgMY5c+c+evQQJvnhw3v0Wg/2LdYo/j7PzwNgcugFGTC9f8rryInwPMBPYUMDC9mfCJo0ecrRo9KmpmawWbns5eXu7r7/4BG+ZcdJxyKI+oxht/otQRNkIoRgQy8XO0k7d5JmFhAkqp7Df/jxuEWQhu2D7Z+GpsbOXXsWL1k2efJk9EHUH5yLj59fX98AdqRgAoggcJLBHzDK1OdfFFwf6TkwtvNv+3/+fgpEOuD1w7u3b9kslqWVtYCg4J/cn4eHR1RUdN68+Xv37dfQ1DQ1Nd2ybafgIhmySixRn/mDi/1AkHS40KGXIgrxk3XypmhlTdDMFZEOoM7YOn/+/DVr106RnMEvIAiXxgPwX5x8xcpVgY8fQ+Lz9u27D5iLfUZx6H8KiOJ/PvQZ2R0yvA/v37+HrApC5Lr1G/6+nEGBVR9211JS87Zs2Sw1fxFt7l6SYsQPFmTAJB0bdTGZyGGC9AuBowkKT3lmbOelUEayQeKP+H0By4IdaVZWVkdHB+S+mIt9/E/wx29Q/10H7FtWxM/7rq4uWM7s7e2FRUT+vqKhifBQyVRBiqDouOnL+Ketoay3JmoVjiWIrJBMPhSFCBJTiAaCJijGTdEvFNMtEFMOF911RWiTk8BGc0irKIuUqVPXUyYt5hk3g0dgMplvHIkXiCP/9FjmL1j48OFDWEd7enrwb9yxdwzf/2P8XPAvl2HqI8D+/lQ+4Y3YSO/fw9LJYDCCgoLA8H8miMzLM0GKMvcAzyIV0gpDng02PNvdSPtukI76k+RDyUqR5BOJRL3SYYLAvwxZJIUU0qFozMXkowUPvxJVjBM3LJqsX4Q40ikERxPTzRM3LRTTyZmgljJeNUFYPkLk0FOB/b6UpRpkmjBpzB2AA6qpqSUmJsL6BXf57h+U9//tAtd8/fp1VVVVSkqKgaER38hn0sMfCdFEeHZeIGrkEjXzidrFJEigkUMxUOgxYBENmAg4O7DAAzvgYgqjMUg+RuRo+ESleHHjkimGxZP0gJR8IAjImmrJmGJUMlE7X1QzF8shM8ep5QjsukIWnDS6m4f7kJSUvHz5MvhXTU0N3OXbf1D+CYm/dvvtiXgb/koo5FA5ubne3t4zZswkjBJEJPCKziHJPgc6COhjjTKyHrb/0i37OT/ECCL+RNBEhZjxkAQpJ0gYFwNBkw2KIBJN1s6ZbFgsac0SNy6dpFcwUTsP0ki0wGnmCRx6xAPjjRAEkXvTpk0hISHg/w319a/7+9/+HxUgqLW1taCgAEL1nj17v2/rgaApK8jK0ZDyoE82dLDsWe+HxGcMQcyfLWiSUpzwEWRB0y1KJEyKgKMpBkWTdAtAmWnHEjctA5uaqIOMCBGkkTteOYE2fTsesMF8qFSqurpGQkJCcXFxU1PT2Ldb/utl7FvBY1twBWR7ezvcBmx0zC3M+fj4RmMkeb4cUT0bzwl/v/nCQs8wOzhGCRJTjAMLmqSSMN2iVNKsRNwIczT9QvC4WfYsSfNy5HS6BcDRBK08zIgy+FZo4Bt6MB8xMbFzbm7paWmQAcFC24dKL/yFYNQ3pqDqP8RfysjR/t8poMIaWl5Oz8jIgMxWTGzSMDtUIZ6NjrBrJ/yWl7EEGY4QZPQHgqZZlEpgkQgCkIRJ6ayTHAkrJlRR5MYwQSsXQpLQPi8y33icoPnzF/j5+cEmkE6nNze39P6fFiCIyWTCzTx+/HjR4iW4f5HHzSQfevTHoDM2NhuyRjgacTHpMQTNsCyfblmCjMi4FMxHwrRslgNH0oYlblIKgQm3IxyiKi8oEitxL9uydWtoWFhOTi6LxWppbunp7u7p+p9hzKvjPVDrxpThavdf3jOHLQ64GJvNzsvLi4iIgN0ptpAReaZtIinHEfToxL9Y0IhzgUI2Zn8nSCZumKApx5NmWpVPs6BPNS+TNCvGCZrjwJlhx5IwK4cq4ggySX2UCkzUzqYuO4GyC15eZWXVmNg49I4qmwUu1tnZ2YXh35bRbpjS9Qf8/egPPbu7utpa27gcDsRpiIk6OjoQH1FCuMacqFP8N/MZXbyMWGRDRBB5lCC5BIKkcixO0GxbxgwrxlRzoAksqBQImu1YMcOBK2lBByNCwRtb4zBZLLL3Kpl/Io1KNTYxhgyosLCAzWY1NjV1/J8WWMW4XG5RUVFycvKpU6cnTZpMEpIgywShleuvAQhzLhYJqAHzMeZ8D9KIIJU4UdkoCfXU2XbMmdaM6ZZgROXAjqRZmZRzxezTVdOsmZgRlUL8RiHcqHiKcZmYWgxl2nrY0Tg6OsKqUVhYCFlifUND6/9pgWUUCCopKYF00dPDc86cOTzzjqL8UJ/+bwgyYmOxGbGDOIIgrYgI4pNPJEiqxkMqBATNtWfMtoEwRAdHkzQrh/VroUvF/DPV022YEhZ0oAwHMDUZopJhkdBWB5GJkhcvXoTHBQSB89fV1YGXtbS0NP/vlBas/OVofX09EFRcXJKSmnr79p0lqzaQtp0j/lvnGonQyHYwgshG2G7+aAzfsSTCDLUEUbkoCQ0giDnLhg5GNMOKjgWj8kVnKqVc62basadbMSQws0IwAYAPlk1Ui5y0aNe1q1cxFytkspiQScMzxN9CHH0d8dcfW+Bvdv5vlLq6WnhOhUVFYEF+D+6vlrUmqCQgCv5K0PDiNWI+ZGNkSkSVTKJMNE0hgTBLM3mCQoykRuoiJ/TKzEybYS8Djha6Vi+4UA+OhlwPOLJkIFMyGzEloOnQhSvXfGJiYnNzc8rLyysrK355nfCX8u+O/09KZWUlnUHPzc2Nj4u7fuPeXA3/fxubyQZ0shEegDgYhsMQUSWbKBNLU0gkzNFKnqIUJ6mdtdgJvVA0y5YJoXqaRTlwtNitZrF7o9Spium2LJyjqThH5sMeN00/ydbt5qtX4enp6cUlxfD0wIjA0eqx1yv/VOrhOMLwP6P43gGv1NahPsOor6//flnsHc6fTq+vra3Fv9dOS0t79fKF8dnbfJpJw58W/gFkQwZpxHa++xcQZFqJERRHU0gizNFOkTyRNEM3Y8kp7EUrm++hesn5mmVezfPP1UJCBI3I+6wZkpaYKeEcmZRuNwu5efdhYmICrPSYEVXW/l+UmpraispK/Ecb8fHx3rf8lhiHEfX+aD4ktINnoHXdiDm8cn0niEUyqySp5fNIY6vYXN3UqWpJ041zFp9iz3XkzLFn41xMs6QvcK1edbV50aVGKSfObHvWKEdTrYAmZEfiZvQZRpmazvdCQkJTkpMhAYFEtqKiogov+C+bxpbv1WqE6hqsZeQ3UFVjdDg0tg/e8kdUw4OBoWHDjL9vf8TmIY9OwXdLMQBGMF5GqqgFDz1jecFpMuFSzCvJmvkknKAFBumz1BKkLPKXuXAWODHn2DNwImZZM5a4Vq3zaV3i3jD7VBXiDnNA3NdGQxJwtMgowdnDLyIiEmwbchBIqfFXLYffbB1TxlYrR199/bHn2PYxtb8VGA7SVFgoUlNTX4aFWrndmayfRPiN1QxTw2NYPrxyGY2GnjEwq6RaVfNq5xOlo2nyCYSFhumztFLnW+euOMdd4MSScmTjxgKRaMEp7nqflhVXWxeewQhy5Ey350AUR6/2WWME4SHJpGSTRRhYdWxMDGwUYT+N/+wNktqKMS+lfn+1daT9pzLcbeSUv78hO+ZiHBiupKQYho6Oirx0/d4Cw7Cfv0rG2AFeUMRB1KDQQzakj3UuHDywwJtWUm1qEUFHMAtaBARpp82zyV9zsXKpC0fKkQNrGbIUG8Z8J86mGy2rfdoXnq+bc6pqjiMXOJoN+48RO8IJmmxaNsmk8ICV/+0H/rGxMZmZmcAR7F3R73f/lwsMAcsWDIfYiY7yvv1ohclzsn4ZcYwrjVoNCe3Xh60GHArAY/wbCyKbVSGCdAuQBcliFjRHO3WBbf66y7VA0MJTnLkOHCAIMP90xeY77WtvdCy+ULfgXO1c58q52Fuys0biFAQjCQvGZLNyMdNyccNcGVv/e37AUSzcLhg8hEx4tiz8d86jGHnddVhnIxIxyRolFNpHlZFDTPbIFUapwV4JLSssLMrIzIyJifG5G7DN4jFVr3A43AAvhogXjKBy9KGqIQrJPMbM37jVKEwqeCxqaDY1vHpFaBWTxSxISidlsUPh+qt1q85VAEEQkuc4sOfalc4/xd16q2X9zfalXi2w5M91qQYjAo4QTZAu2bDQLsSSIWbOmGTKmGBKlzTOheh478GD6Kjw1LT0goL80pJiBvq5KZPBZDNYFQwWG4HJHH3pFVPQq8GoOqxjR1nDCmP0EP5bTTYX3JdZXkIvzirOTc1Lj81IeBn7MujBXZ+jlj7i+lGCBln8+rkU/WIS/uWEIQO3IJTyGDGAHfLvrOa7+ZhXUaxreK1rqXrFxKNxyMWWGSOCljmWb7lat+ZC5aJTHMA8tGwxFzhzNvk2b/frXHGtbeGF+oVutXOcK3CCIGDPsGZOteFMt6YvtkpbZ/Vc1u6avq2Lvb3pUw/ZtHvy+Y91OCFarOc6tRFm1a/MuRH29Bh3RsYTZlF6OXormI3wDwuTTWdyGaWFzOxwTrw794VZ9bNjVU8ONYYcrX+h3Bgi2xAiz30qn/pIMd5P8Z67wk1XeaeTugpWF5ebPxUzSCMjz2Kj0IMtVb/GnR9ikEU1xboWOKLplxBlEpAFLTfOAIJWnqJvv16//nLN6vMVS08jjiDczHdir7/etD2gb51vKxAERjTPpXq2E+JojgNnoXXBATs/x7M2wRf2pvlsLHui1J+s+7Hg9CfW3Y/sR9/Bevih2OtNtlNXnEZL0ObGxzu4wZrslLuMogw6k4NsY+RHzaPKqKQzmHQGm1GUyYk5zw2Ua/Jb1hO6vT/d/B3j/rv6uMHekqE3lV/e1X/50Dr0tmGwjzXQXdpfFf+ecedtpnlb2O4cr3n3XA4cd3CbaRYPpkQczQP/RJBpBcWqhgoEWdXwGZTyyMahVWyFacZ8/dRVZ5nbbjdvuFK37lLlKlfu4tPITCBIb7jetCOwb8v9riWeTYvPVc8/Wz3XpQaIO+YcdMf1YJGnZMs98fcpJ4ZqAj91Fn77UPXtY+2/Prd++9z27RPI9mFlsPNfH2uGXlcOtaUOsDz6Xu1svjur4uEOdtwlelkRncGCaEWnl+O/lf5e6OiNelbyvZqHm9t8hbqDln8qO/+lI+Xbm/J/va/+9r7mC7DTT//6turL20qkY9V/va/68q7q6+uyrx3xg2V2fY8laq8Lvri0TtH2kpBxEb6Z+C01IHktqqi2dZgF1VINy0iyMfywWV1pmrlAP23tWeaOO80br9bjP5ha7lYF/iXlzN3o27Trce9Wv55VXo2LztfNP1+//HSZ81ln5hXJDm9i/0PaINPya0fs187Yrx1RXzvjvnZEf20P/9oR87U9ErUgJfxrewT0+YJ364wdanr+5tUmOL39plB1qBo9L6GMzsTeMv+BnrLSUmaUa8sdyS5fQt9Dgc+lDl9agoeanw01BQ01PR5GY+B3Ha824nrQUPNTUD4VaPQ9oHT7EGuvCTk7G04wySMac4fDjcmwwmOCc1TJY1mD1i/rWj67Oipk2HLxfLAXQwQZp24+T995p3mTTxN42ZpLVUsu1i0/X7XApWL15fo9AV07Hnatut665FLDCjeunYtrzdXxvbcJ/YHkdy8FPhXqD1WdHqp2G6pyGaq5NFTlDPogtOA6ki5jWpAcrD7zLnMdnN5zm9jqTeU8VSktyCouQf9zUMlIKSouYyTebLo9tcOX/PoJ+X0Ez8eMQ4Nco6EKu0EE+8Fh5U+wx2D6IXHF2zBeGKv3DrH6ioiW3VmKMZMI1MBqZVZJNuHwmHJ5TTkACM+8ltU021owIiCIBuudXAIf7MXWWGQtMknfeIm7617L1pvNG681rPeoXuNeDTQtO1uxwr3uYFDnrsCedXe6Frk377+UlnF1de8twtsQ8vtInveRvB/iJg+UrBlkKw+yZAbZ8oMsuUG2wiBbBelIgq443AKHWIofS7e/zVnyLl7wfRTP2zCevkByo8/EsnjfbNhEjZSsrOyMjCzuU8XuG0ScHTRWlPBAvvhA4ZLB8g2DzG2DzO1/xrZB+paBomWfs6Z/iKV8TOL9AGOFkPtvEwLO7Z5inkM0rQJ7gYyZbFpBNqvgxWGJwjPNtg6MiM++nmrKJikkoI87VptnLjbO2O5Zsdevdeftps0+TRuvYY7mXrX0fM26Kw1Hn3XtfdK34V73cq+WIxfDS65OehtMgjv+EM3zOZPyOYPyKZ02kD95sERyiCk5yF44yJ4/xJ45yEJyiDVviD17kC01xJk+WCQxUCj5OXfyxxQBOHH4vp+Tu3yIJaE2cfEJ8SMlNi4Oqjn3j/Y9IL17hdj5lEoZyMVBHSjiHywTGeKII7DFhyokhrgSSLKxFo7EIF10sJh/IB/uivo5iwLnwljvInjgth+77Zhknks2r+E14/KA1SAj4vLCzsuihmJZzWeLCAIAQfxmHB6FeETQOquspSYZO70qDga07b3btM23caN347or9Ws9alZfrFrp2XDkWbdc+OtN97pWeHfsOJ8ZcWnthxACPNVPyZSBPOpAIdwxbbCUNsThG2LzDVXyD1Xzf6kR+VIn9LVRCFP4h6r4oX2QyQd9BstpcMrnbCriKJ4XCGq9IRTp5/jkWQiUsLCw4OBnAQEBPrfu37+kzb0p8v4F+WMcLxoIUECF04e42CiV/F/qBb40CnxtFfjaIvC1TfBro8CXGv4vdQLoaAX/IB0bqwCd+CmZ930EuTFIyPCkHQUijlkVr0U18EIxB0eroFhAclgNySHyLLAg21p+IMiiAiyI71giImixWdoen4rDQW37HrbuuNu82bdp/bXGdZ4169yrl7nXH3zSpRj7drt/z7prjWBTeq7eFQHiHyNJn5LQfQ8WAzXohoAFuOOvrYJwr9/aBb91CH7rGlag8UuDABAHfQZZcN98cN+f0nk/RZNbngi52R/ZqH5pp+7ljVpXNutc2a3ntV7Ta5nq5dnHb5jaKlc9HgfdPqeNjFWJLvK1CZEyPETnGLSh4RBxDYgmGOgzEARGFEPuDOX3OC872SyHB9ZyMy7FohKtWRZVPBZVFFCskPkAQThwgnjlE4WUUggbrbOWmWbI3Kw++qR9v38rRKItN5o3eTdCMAJfW3mpZn9Ah2r8mwPPeiHVXnaGucQpX/e0W+q9Ra9f8g6m8wzCfZfREDsNAvAMESOdvwBjCmaF2xHMcyCP520cpfzBZGMzWTGZa7Sj9wSl75B2XyXtukLd780v+5AmfZ8q4ycsffOwtna07/zWUP6hbN6hAgoaq2KYo9+OBY8HCEI2C+ZcRv2YTXqdwJd5f67hKUtRw1Rew3KKEZ1qyoKgQ7WsQoZjicVm65ox7AwTxKOQIKiUTNhplw1h6LBfo3xwh3RAy54HLThHG67WQ1q03rNm+60mlbg3h552r79eseR0wTzbDCmLpC1GPu6ux9Jvz+lNFEDPtpQ2wKAO1NLAyL82C/x8000CX2r5vwA7ZUAN9WMqtTRQ3Mt5xxZlY8G9F6j7vIQPetH2eJI2uyJsOUfd4yl4yBtA3X+Ntv/aLGkXLVO5x9eWlD0Tf5fOhzji8H2p5INrfm0Q+NaKoQ09HuRlGDXQ51MOrfLlxPDrK2wdlBZq+FBUwnk1Unh1sqkGxRRjOjgX1bIaBWbLKuBoLDsCJ+sFHRowghIFwYJ2OOSssc1R9G88/qxNJqj1YGAbcLT9NlryN15vBI42Xa1TjnktHdy58TpnoUPuArPouQYvpmoFz1APWKN1SdNUw+PM9pibC+oSRboyBd+UCL5jCH7kjIAr+I4l+KZAoLdAuC1WuPDxVJ/z69QNZZbJWwnuOkPe6c6z4yJlj6fwvvOUnReHCcI52u0htN8dmALw7vGi7PYUO+S6XslY3Ujew3XTc++lBYEzapOFG9MFO7LGdWSO68ge15wuXJsqXB4m+cp3ie+FtfqWChvVbacfu8Yn7cer8IyiFEo5HsWrmULRy6EalVHNODSLCqAG7IjP5rv5IHZONgg7NglYVVAUk5CL7TmZs8E+T+lxs8qrHmDh0OM2WM5232/ZdgtxtMm7aeOVWrmwnmORfVtvVC12zp9rEjVH7/lMnecSaoETFR+IKdyTULw5V9FzharzAQ1dHXN5M5sjjicPAhxOHjx58qCp9REdM5lDmprLZE2nHnYW2uvGu/MSaacnaet5/p3neHdcoO3xEN53kWfrue8EjXJ04LLgAS++vR5AIs8eL57dnpRdHmB0Ew64Tj96ep6s5UI584VyFqOYK39yhsxZMekrgoevU4/c5TnygFf6IU32EVUugHLsGUXlFUUzGSOolM+CC+zQIPQAO7a1wAsAPAtjpxEIErapElRNF1JJIexzytniVKDytFUnskc5uOPIk/aDAYggANjRlhtN669UHXzcfiLu9aHA1hXnSxaezFpoETtbP2yGToikWiBgiuojMcX7E+TvTlC4KyJ3T+iwr9BhH4DAIV9+wIFrgod8BA5ep+y9zLvLg3eXOxBE2Y3mjCsC+z2FDl3j2X4Bp4a85Rx5qxso0MK310vg4DXhA5f59l+l7r1M2+fFu/cK714v3n3XeRC8yftvkQ/c4jlwi3LwJijUw3coh27zydynHEWgyT6kygdSFZ5QlMIQO2qxVO10qkERzZSBE4TbDr9dHfIp+3ohRA0GpyZRx1ohzRzh46mEfafy9rkWa4a06UX3qL3sPvqsA4xo3yPEEQQjzNfqwaY0E98cC+/ZdrN25YUysKN51mlSFglzTWNn6r2Yrv1cTD1kguqTiSpB45Ufix7zAwjJ3R8nD6H3Nv/R2wLSdwVAHr4hcMibdsCHdsCbtv8Kbf9VvgPXaPvgafsIHval7LmMuNvlwbPnKu9ukFd493gCibSDvkA6hHB0naO3+I7cph25w3v4LvXoPar0A2CB9wgofnwyDyiyAVS5QIr8EzAWqmIwVfE5VTWccjyS93gMRB+KdjpNN5tqWMIH7JhzaJaVo56FW42QA247jaKnmya5tkw5Uy+snYW2Godc8qTd6aYR7fqxvccjeo897zz6tB0t+RhHu7H0euedFs20t5qZHw4/7VzvXbfyInPxmfIFjoXzTxbMtMyWNMuaZpYmYZQkrhcrrhs1XjN6vHr4OLXw8SfCxh8PGaf6fLxqiJDiE2Glp/yKz/gVAgF88gFU2Uc0OX8+uQDBY48F5QN4D97nOXiP56Af76F7PAce8B54wHPAj+fgA6jyywaKKD8TVAkVUn7Op/iUTzGYhvCMCmEFh8pLimoE7XgkVS2Ooh5PUU+gaKVSINwAI+BQBvk0wxKqcRnNBKhho9CDexYele3qRqnB2Zni1jL5XIuocx3leCZNNh4RpODFdEjsM4jt04jsVQ3pUAjtPvq0A+cIbAdi9o47LSoJr7VzPqomvtse0LvOu2X55aal5ysXnK1ceJou5VA607ZsunXxDKt8SYv8yaa5k40zJxtlTDRIEzNIE9VLnqCXMk4nWUQrXkQzdpxmrIhmnIBGvMCJSEG1SGGNGNSoHk2WjSDLviLKgPKCLB3JK/2CJB1Jkokky73gkXlFUYwQ0UwQ1U0U0U4S1EoS0Eri10rm00qmaSZTtVJpOpngO3x6OTS9XKpBAZ9hEc2omGZcxmdSzm9K5zdn8VtwwKf4rCrHUjOWHRGnxgkuTRNcmoGdiWebwd0gePPiBB0+k3fcm3Up47V1yhvd6F6NqF7Flz0yzzuBIPA15G4PW3febZF90aNf+AmMSDr8zZYH3Wt8O1Zea13s0bToYp2Ua7WUa+3s09WznLgzHTmSdmxJW6akTZm4dbmEZbG4ZfFki+LJZoViJgXjDHLH6eeI6OcI6GUL6WUBQBczzhU1yCErp5BUU0iKSaRjSSSlZJJyIkk5GSmqqJ2oksKrmiqonzPRtFjUtETYGEHQqEQAoRQkvwmiA7mPGYvfnI0YwZ3IqorPGvBDHjg2IQR2Jp5pngw+5dYyybVZ2KkRdmQkixpeyyrKiWxEkJxrvvZtjm/pR9fst2bxPdrAUWSv8qsehbBu6WcoZgNHu/07ZZ91GBZ8NGEMaOd+PBjSv+l+z+obnat8O5Zfa1vs3rTwYsOC8/VS5+pnna2f5VI741TNNJc6SccqCYdKSYdKiZMVU2xZU2zZYhb0cWb08WYgy8eZlguZlIuY0SdaMUTNykjqBcQT2SSVDNKJTJJaJvFELlEtH0F9BKBrFFL0y0QtWRPsKsSs2SJWHEFLNkDAkoNgVcFvjUihYQsTn03tKAujEsINvmAJOSCHGueM2AFqxM42i4xQg4NqXcOrloMIUjpfYBRQfZ876FP+2SblDXAEdqQT3asG8ehFj1xoF3AE1gSBSTfvgylzwLDk8/HEtwdC+jf79ay91bXSpwOw7Eor+tzavXHhhXpgau65+jnn6meeRXxNP1MPZIk710k410jYc8VsKybbcQHjbbjjrTkTbDhAopAFi6hVTDyRR1QvJGgUAREgR384+RNIemU0M8542woxp7opjtWiJ6vH21cL2tWCFHaoF7SvFbavBSLAd/CVWwhboWCdEhyJNZhDNeMOhVsN1aZulBocPJY1vOp5iKDjFwstn9aHNn/1qxxyy3l/MvW1fmyfXgzi6EREz7GXyJTA44Am4/S3TnVDwJFByWcIRtKhvTv9e9ZgdoTTtOJ6OzC1xKNpqWfzwov188/Xo3cf3OqnuTYCTQina6edrp16qlbMsWayfQVA3J471bmaz4RBUCvACCr4twQN/9xUrxy8aZxN5RSHaolTdWLO9eMdAQ3jMDnBsVbEsUFkhA5QAKLOjVPONIGxAMTPNk5wbhCwq6X8Qs3PBGm4F7pGt8T2/T8hLd8eVgyezXnvnPnuZGq/WUKfUXy/XmwfOJ1qeO+xsC71xDdunV9PNX2xqhjUyf2olfVBJfa17Mv+vU/7Nt7rBmtae7trlW8nThbyvqutK661LrvcDKFKyr15vjtS5l1onOnaMPVsw9RTNZOc6qadqgHi+AzKMF6KCJpFBK3isT9tR7/B/RUjb0ORDJkUExZEGZGTdXC1KacbJFwaJc41i59rFnNpmnQGLdhQnXK2aYprM0TfiWeawF4E7Oths0o2Qx8JjSWFbFlLssTYsUKfK/Jo5COC5M/knXpWGVz1KYj73rf8rWN8j11Ul1l4p/GLDqOwDp3nbYpP25Uetyo9bjka2OSQ1+dEf2dF/6SX+fZ4Ur9iVC8E76PBXbsfdW6527bxTusa76blXk2rrrWsv9m89kbr2hstq3zal3m1LL3cvORy80L3pnmutXNcqiWdq6c6cKY5cGY4csRtWFTNPKJqNgKEnuM/QqOQqIYsazQMETWLkD/i0C4Zhk4pWbeMasTkM2UJWbBFLFjC1ixBK66gJQeq/GYIFCMm2YCBvT/OGIYheyzIxhyiEVJ4TDg8xmwSxCC5eMI644SjzsnGNxgGNxhavnSly2X7zhbvPVu826Vo9+kikNtcijc7Fm5xLFxrn3fgbJHiNbr0ddZ2T+amC+Wb3crWni1bd7Z0mUvh8lPFyxzylp/MW+RYtNAhZ4l97kLHnMUncxfY5S2wyVtgmzffPH+uce40k9wZxjnTDHKm6mVP1cuaopE2SS1F8FiCgGysgFwcv1wcUmRjvyvo/8kAGc8vF0+TS6Ch//Egnl8hkR993JfEdyyZH/13Gon8oCgk0Y6lwCHqsVR+9FFOAqR5fPKJVPlE2iiOJdNQt2SaYgpSlNJoSqk0xVSacjpSoDqsp6MOx1LGKSb8v+Xr5elEFkVcAAAAAElFTkSuQmCC + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/tournaments/stress_cup_pool9_r12.xml b/test/tournaments/stress_cup_pool9_r12.xml new file mode 100644 index 00000000..38cf118c --- /dev/null +++ b/test/tournaments/stress_cup_pool9_r12.xml @@ -0,0 +1,1500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/tournaments/stress_cup_pool9_r3.xml b/test/tournaments/stress_cup_pool9_r3.xml new file mode 100644 index 00000000..446bfbc9 --- /dev/null +++ b/test/tournaments/stress_cup_pool9_r3.xml @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool9_r7.xml b/test/tournaments/stress_cup_pool9_r7.xml new file mode 100644 index 00000000..f340e851 --- /dev/null +++ b/test/tournaments/stress_cup_pool9_r7.xml @@ -0,0 +1,928 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool9_r8.xml b/test/tournaments/stress_cup_pool9_r8.xml new file mode 100644 index 00000000..048ae030 --- /dev/null +++ b/test/tournaments/stress_cup_pool9_r8.xml @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r1.xml b/test/tournaments/stress_cup_pool_r1.xml new file mode 100644 index 00000000..9a017702 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r1.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r2.xml b/test/tournaments/stress_cup_pool_r2.xml new file mode 100644 index 00000000..4aa1a9bd --- /dev/null +++ b/test/tournaments/stress_cup_pool_r2.xml @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r3.xml b/test/tournaments/stress_cup_pool_r3.xml new file mode 100644 index 00000000..a11a4663 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r3.xml @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r4.xml b/test/tournaments/stress_cup_pool_r4.xml new file mode 100644 index 00000000..67308ab2 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r4.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r5.xml b/test/tournaments/stress_cup_pool_r5.xml new file mode 100644 index 00000000..09311488 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r5.xml @@ -0,0 +1,632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r6.xml b/test/tournaments/stress_cup_pool_r6.xml new file mode 100644 index 00000000..dc8af0ba --- /dev/null +++ b/test/tournaments/stress_cup_pool_r6.xml @@ -0,0 +1,730 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r6_ranking.xml b/test/tournaments/stress_cup_pool_r6_ranking.xml new file mode 100644 index 00000000..76706657 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r6_ranking.xml @@ -0,0 +1,762 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r7.xml b/test/tournaments/stress_cup_pool_r7.xml new file mode 100644 index 00000000..098f93c7 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r7.xml @@ -0,0 +1,972 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r7_tourma.xml b/test/tournaments/stress_cup_pool_r7_tourma.xml new file mode 100644 index 00000000..4b97abae --- /dev/null +++ b/test/tournaments/stress_cup_pool_r7_tourma.xml @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r8_ranking.xml b/test/tournaments/stress_cup_pool_r8_ranking.xml new file mode 100644 index 00000000..43c802a8 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r8_ranking.xml @@ -0,0 +1,912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/tournaments/stress_cup_pool_r9_looser.xml b/test/tournaments/stress_cup_pool_r9_looser.xml new file mode 100644 index 00000000..853a86d0 --- /dev/null +++ b/test/tournaments/stress_cup_pool_r9_looser.xml @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/tournaments/volcano_final.XML b/test/tournaments/volcano_final.XML index e2602744..f0a5bb2a 100644 --- a/test/tournaments/volcano_final.XML +++ b/test/tournaments/volcano_final.XML @@ -21,16 +21,16 @@ - + - - - - - + + + + + @@ -45,7 +45,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -70,7 +70,7 @@ - + @@ -82,123 +82,126 @@ - + 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 diff --git a/testExportFBB.csv b/testExportFBB.csv new file mode 100644 index 00000000..e54fba7b --- /dev/null +++ b/testExportFBB.csv @@ -0,0 +1,16 @@ +;17/01/2015 09:57:10;false +; +1;BiBi;0;Nain du Chaos +2;papaGégé;0;Chaos Pact +3;Benny;0;Nordiques +4;Yanno;0;Elfe Noir +5;Lord Bojo;0;Haut-Elfes +6;Fyennij;0;Humains +7;Reqqy;0;Homme Lézard +8;Loamelas;0;Amazones +9;Fredao;0;Skavens +10;Cyrlesire;0;Elfe Noir +11;Shgun;0;Khemri +12;Hebijillan;0;Ogres +13;Sran;0;Elfe Sylvain +14;Papa Noel;0;Homme Lézard \ No newline at end of file diff --git a/testExportFBB.csv.PNG b/testExportFBB.csv.PNG new file mode 100644 index 00000000..2ce50e77 Binary files /dev/null and b/testExportFBB.csv.PNG differ diff --git a/testExportFullFBB.fbb_xml b/testExportFullFBB.fbb_xml index 4ae268f9..c6f7dda5 100644 --- a/testExportFullFBB.fbb_xml +++ b/testExportFullFBB.fbb_xml @@ -4,99 +4,139 @@ - - + + - + - + - + - + - - - - + + + + - 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 - - + + - + - + - + - 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 - + @@ -133,78 +173,78 @@ - + - - - + + + - + - - - + + + - + + + + + + - - - - - - - - - - + - + + + + + - + - + - - - + + + - - - + + + - + - - - + + + - - - - + + + + @@ -259,36 +299,36 @@ - + - + - - + + - + - - - + + + - - + + - + - - - + + + - + - + @@ -343,36 +383,36 @@ - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + @@ -427,7 +467,7 @@ - + @@ -464,78 +504,78 @@ - + - - - + + + - + - - - - - - + + + + + + - - - - - + + + + - + - - - - - - - - + + + + + - + + + + + - - - + + + - - - + + + - + - + - - + + - - - + + + - + - - + + @@ -590,35 +630,35 @@ - + - + - - + + - - - - + + + + - - - + + + - - + + - - + + - + @@ -675,35 +715,35 @@ - + - - + + - + - - + + - - + + - - - + + + - + - - + + - - + + @@ -758,7 +798,7 @@ - + @@ -795,78 +835,78 @@ - - - - + + + + - - - - - - - - - + + + + + + + + + - + - - - - - - + - + + + + + + - + - - + + - - + + - - - + + + - + - + - - - + + + - - + + - - + + @@ -922,35 +962,35 @@ - - + + - + - + - - + + - - + + - - - + + + - - + + - - - + + + @@ -1006,35 +1046,35 @@ - + - - - - + + + + - + - - + + - + - - - - - + + + + + - + - + @@ -1089,7 +1129,7 @@ - + @@ -1126,78 +1166,78 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - + - + - + - + - - - + + + - - + + - - + + - + - + - + - - - - + + + + - - - + + + @@ -1241,7 +1281,7 @@ - + @@ -1253,35 +1293,35 @@ - - + + - + - + - + - - - + + + - - + + - - + + - + - - - + + + @@ -1337,35 +1377,35 @@ - - + + - - + + - - - - + + + + - - + + - - - - - + + + + + - + @@ -1420,7 +1460,7 @@ - + @@ -1457,78 +1497,78 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - - - - + + + + - - - + + + @@ -1572,7 +1612,7 @@ - + @@ -1585,34 +1625,34 @@ - - + + - - + + - - + + - - + + - - + + - + - - - - - + + + + + @@ -1668,35 +1708,35 @@ - + - + - - - - + + + + - - + + - + - + - - - - + + + + - + - + diff --git a/testExportNaf.xml b/testExportNaf.xml new file mode 100644 index 00000000..a01b94d6 --- /dev/null +++ b/testExportNaf.xml @@ -0,0 +1,211 @@ + + + + + +Benny +17043 +Lizardmen + + +Shogun +7635 +Khemri + + +yannolegob +13425 +Dark Elves + + +BiBi +11491 +Chaos Dwarves + + +Loamelas +21136 +Amazons + + +Cyrlesire +17415 +Dark Elves + + +Fredao +17005 +Skaven + + + +2015-01-17 13:01 + +BiBi +11491 +110 +2 +2 + + +Cyrlesire +17415 +110 +1 +0 + + + +2015-01-17 13:01 + +Loamelas +21136 +0 +1 +3 + + +Fredao +17005 +0 +3 +3 + + + +2015-01-17 13:01 + +Shogun +7635 +0 +0 +3 + + +yannolegob +13425 +110 +1 +0 + + + +2015-01-17 13:01 + +Benny +17043 +110 +3 +1 + + +BiBi +11491 +110 +1 +4 + + + +2015-01-17 16:01 + +Benny +17043 +110 +2 +4 + + +Fredao +17005 +0 +1 +1 + + + +2015-01-17 16:01 + +Loamelas +21136 +0 +0 +1 + + +yannolegob +13425 +110 +3 +1 + + + +2015-01-17 16:01 + +BiBi +11491 +110 +1 +5 + + +Shogun +7635 +0 +0 +1 + + + +2015-01-18 08:01 + +yannolegob +13425 +110 +0 +0 + + +BiBi +11491 +110 +1 +0 + + + +2015-01-18 08:01 + +Loamelas +21136 +0 +-1 +0 + + +Cyrlesire +17415 +110 +-1 +0 + + + +2015-01-18 15:01 + +yannolegob +13425 +110 +2 +2 + + +Cyrlesire +17415 +110 +0 +0 + + + diff --git a/tmp.html b/tmp.html new file mode 100644 index 00000000..16e565b5 --- /dev/null +++ b/tmp.html @@ -0,0 +1,438 @@ + + + + + + + + + +
Roster
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#NomPositionMFAgArCompétencesCoûtSD
1? Loup-Garou8338 + Frénésie + Régénération + Griffes +
Blocage
+
140000GAFP
2? Loup-Garou8338 + Frénésie + Régénération + Griffes +
Châtaigne
+
150000GAFP
3? Goule7337 + Esquive + 70000GAFP
4? Goule7337 + Esquive + 70000GAFP
5? Revenant6338 + Blocage + Régénération + 90000GFPA
6? Revenant6338 + Blocage + Régénération + 90000GFPA
7? Golem de chair4429 + Stabilité + Régénération + Crâne épais +
Garde
+
130000GFPA
8? Golem de chair4429 + Stabilité + Régénération + Crâne épais +
Garde
+
130000GFPA
9? Zombie4328 + Régénération + 40000GFPA
10? Zombie4328 + Régénération + 40000GFPA
11? Zombie4328 + Régénération + 40000GFPA
12? Zombie4328 + Régénération + 40000GFPA
13Comte Luthor Von Drakenborg Vampire6549 + Perso + Regard hypnotique + Blocage + Régénération + Glissade contrôlée + 390000  
14Setekh Blitz-Ra6428 + Perso + Arracher le ballon + Blocage + Esquive en force + Juggernaut + Régénération + 220000  
+ Nom de l'équipe +  Apothicaire 1 X5000050000
+ Nom du Coach +  Assistants2X1000020000
+ Race + NecromantiquesPom-Pom Girls 3X1000030000
+ Classement + 299Facteur de popularité1X1000080000
+   + Relance 1X7000010000
+   + Relance additionnelle2X100000200000
+   + Igor 1X100000100000
+   + Corruption d'arbitre 2X100000200000
+   + Sorcier 1 X150000150000
+   + Serveuse de Bloodweiser 1X5000050000
+   + Cuistot Halfling1X300000300000
+   + Cartes spéciales  100000
+   + Total 2990000
+
+ + diff --git a/tools/JarAnalyzer-1.2.zip b/tools/JarAnalyzer-1.2.zip deleted file mode 100644 index c9cc4b44..00000000 Binary files a/tools/JarAnalyzer-1.2.zip and /dev/null differ diff --git a/tools/ObfuscationAnnotation.jar b/tools/ObfuscationAnnotation.jar index cbc89de5..73425a86 100644 Binary files a/tools/ObfuscationAnnotation.jar and b/tools/ObfuscationAnnotation.jar differ diff --git a/tools/checkstyle_conf.xml b/tools/checkstyle_conf.xml deleted file mode 100644 index b6913345..00000000 --- a/tools/checkstyle_conf.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/checkstyle_prop.xml b/tools/checkstyle_prop.xml deleted file mode 100644 index e69de29b..00000000 diff --git a/tools/dependencies.html b/tools/dependencies.html deleted file mode 100644 index 8a05abba..00000000 --- a/tools/dependencies.html +++ /dev/null @@ -1,252 +0,0 @@ - - - -JarAnalyzer Analysis - - - -

-JarAnalyzer Analysis -

-

Run with JarAnalyzer on

-
- - - - -
-

Summary

-
- [summary] - [jars] - [cycles] - [explanations] -
- - - - - - - -
Jar NameTotal ClassesAbstract ClassesPackagesAbstractnessEfferentAfferentInstabilityDistance
TourMa.jar38177962190.2100-1.0-1.0
- - - - -
-

Jars

-
- [summary] - [jars] - [cycles] - [explanations] -
-

-TourMa.jar -

- - - - -
Afferent Couplings: 0Efferent Couplings: 0Abstractness: 0.21Instability: -1.0Distance: -1.0
- - - - - - - -
Uses JarsUsed by JarsCycles With
NoneNoneNone
- - - - - - - -
Packages within jarUnresolved Packages
com.bric.awt
com.bric.swing
com.google.zxing
com.google.zxing.aztec
com.google.zxing.aztec.decoder
com.google.zxing.aztec.detector
com.google.zxing.client.j2se
com.google.zxing.client.result
com.google.zxing.common
com.google.zxing.common.detector
com.google.zxing.common.reedsolomon
com.google.zxing.datamatrix
com.google.zxing.datamatrix.decoder
com.google.zxing.datamatrix.detector
com.google.zxing.maxicode
com.google.zxing.maxicode.decoder
com.google.zxing.multi
com.google.zxing.multi.qrcode
com.google.zxing.multi.qrcode.detector
com.google.zxing.oned
com.google.zxing.oned.rss
com.google.zxing.oned.rss.expanded
com.google.zxing.oned.rss.expanded.decoders
com.google.zxing.pdf417
com.google.zxing.pdf417.decoder
com.google.zxing.pdf417.decoder.ec
com.google.zxing.pdf417.detector
com.google.zxing.pdf417.encoder
com.google.zxing.qrcode
com.google.zxing.qrcode.decoder
com.google.zxing.qrcode.detector
com.google.zxing.qrcode.encoder
com.keypoint
com.toedter.calendar
com.toedter.calendar.demo
com.toedter.components
com.toedter.plaf
edu.umd.cs.findbugs.annotations
freemarker.cache
freemarker.core
freemarker.debug
freemarker.debug.impl
freemarker.ext.ant
freemarker.ext.beans
freemarker.ext.dom
freemarker.ext.jdom
freemarker.ext.jsp
freemarker.ext.jython
freemarker.ext.rhino
freemarker.ext.servlet
freemarker.ext.util
freemarker.ext.xml
freemarker.log
freemarker.template
freemarker.template.utility
javax.annotation
javax.annotation.concurrent
javax.annotation.meta
javax.xml
javax.xml.datatype
javax.xml.namespace
javax.xml.parsers
javax.xml.stream
javax.xml.stream.events
javax.xml.stream.util
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stax
javax.xml.transform.stream
javax.xml.validation
javax.xml.xpath
net.java.dev.colorchooser
net.jcip.annotations
org.apache.commons.logging
org.apache.commons.logging.impl
org.apache.html.dom
org.apache.wml
org.apache.wml.dom
org.apache.xerces.dom
org.apache.xerces.dom.events
org.apache.xerces.dom3.as
org.apache.xerces.impl
org.apache.xerces.impl.dtd
org.apache.xerces.impl.dtd.models
org.apache.xerces.impl.dv
org.apache.xerces.impl.dv.dtd
org.apache.xerces.impl.dv.util
org.apache.xerces.impl.dv.xs
org.apache.xerces.impl.io
org.apache.xerces.impl.msg
org.apache.xerces.impl.validation
org.apache.xerces.impl.xpath
org.apache.xerces.impl.xpath.regex
org.apache.xerces.impl.xs
org.apache.xerces.impl.xs.identity
org.apache.xerces.impl.xs.models
org.apache.xerces.impl.xs.opti
org.apache.xerces.impl.xs.traversers
org.apache.xerces.impl.xs.util
org.apache.xerces.jaxp
org.apache.xerces.jaxp.datatype
org.apache.xerces.jaxp.validation
org.apache.xerces.parsers
org.apache.xerces.stax
org.apache.xerces.stax.events
org.apache.xerces.util
org.apache.xerces.xinclude
org.apache.xerces.xni
org.apache.xerces.xni.grammars
org.apache.xerces.xni.parser
org.apache.xerces.xpointer
org.apache.xerces.xs
org.apache.xerces.xs.datatypes
org.apache.xml.serialize
org.apache.xmlcommons
org.jdom2
org.jdom.adapters
org.jdom.filter
org.jdom.input
org.jdom.input.sax
org.jdom.input.stax
org.jdom.internal
org.jdom.located
org.jdom.output
org.jdom.output.support
org.jdom.transform
org.jdom.util
org.jdom.xpath
org.jdom.xpath.jaxen
org.jdom.xpath.util
org.jfree
org.jfree.base
org.jfree.base.config
org.jfree.base.log
org.jfree.base.modules
org.jfree.chart
org.jfree.chart.annotations
org.jfree.chart.axis
org.jfree.chart.block
org.jfree.chart.demo
org.jfree.chart.editor
org.jfree.chart.encoders
org.jfree.chart.entity
org.jfree.chart.event
org.jfree.chart.imagemap
org.jfree.chart.labels
org.jfree.chart.needle
org.jfree.chart.panel
org.jfree.chart.plot
org.jfree.chart.plot.dial
org.jfree.chart.renderer
org.jfree.chart.renderer.category
org.jfree.chart.renderer.xy
org.jfree.chart.resources
org.jfree.chart.servlet
org.jfree.chart.title
org.jfree.chart.urls
org.jfree.chart.util
org.jfree.data
org.jfree.data.category
org.jfree.data.contour
org.jfree.data.function
org.jfree.data.gantt
org.jfree.data.general
org.jfree.data.io
org.jfree.data.jdbc
org.jfree.data.resources
org.jfree.data.statistics
org.jfree.data.time
org.jfree.data.time.ohlc
org.jfree.data.xml
org.jfree.data.xy
org.jfree.date
org.jfree.io
org.jfree.layout
org.jfree.resources
org.jfree.text
org.jfree.threads
org.jfree.ui
org.jfree.ui.about
org.jfree.ui.about.resources
org.jfree.ui.action
org.jfree.ui.tabbedui
org.jfree.util
org.netbeans.lib.awtextra
org.slf4j
org.slf4j.helpers
org.slf4j.impl
org.slf4j.spi
org.w3c.dom
org.w3c.dom.bootstrap
org.w3c.dom.css
org.w3c.dom.events
org.w3c.dom.html
org.w3c.dom.ls
org.w3c.dom.ranges
org.w3c.dom.stylesheets
org.w3c.dom.traversal
org.w3c.dom.views
org.w3c.dom.xpath
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers
teamma.data
teamma.tableModel
teamma.views
teamma.views.report
tourma
tourma.data
tourma.tableModel
tourma.utility
tourma.utils
tourma.views
tourma.views.fullscreen
tourma.views.parameters
tourma.views.report
tourma.views.round
tourma.views.system
-
com.jgoodies.looks -
-com.jgoodies.looks.plastic -
-org.apache.tools.ant -
-org.apache.tools.ant.taskdefs -
-org.python.util -
-org.zeroturnaround.javarebel -
-org.jaxen -
-org.jaxen.dom -
-com.sun.org.apache.xml.internal.utils -
-com.sun.org.apache.xpath.internal -
-com.sun.org.apache.xpath.internal.objects -
-org.apache.xml.utils -
-org.apache.xpath -
-org.apache.xpath.objects -
-org.jdom -
-org.jdom.output -
-org.jaxen.jdom -
-org.jdom.input -
-org.python.core -
-org.mozilla.javascript -
-org.jaxen.dom4j -
-org.dom4j -
-org.dom4j.tree -
-org.apache.log -
-org.apache.log4j -
-org.apache.avalon.framework.logger -
-org.apache.xml.resolver -
-org.apache.xml.resolver.readers -
-org.jaxen.util -
-org.jaxen.saxpath -
-
- - - - -
-

Cycles

-
- [summary] - [jars] - [cycles] - [explanations] -
-

TourMa.jar has cycles with

-

-None -

-
- - - - -
-

Explanations

-
- [summary] - [jars] - [cycles] - [explanations] -
-

The following explanations are for quick reference. More detailed information can be found in the JarAnalyzer documentation.

-

-Number of Classes -

-

The number of concrete and abstract classes (and interfaces) in the jar is an indicator of the extensibility of the jar.

-

-Number of Packages -

-

The number of packages in the jar.

-

-Afferent Couplings -

-

The number of other jars that depend upon classes within the jar is an indicator of the jar's responsibility.

-

-Efferent Couplings -

-

The number of other jars that the classes in the jar depend upon is an indicator of the jar's independence.

-

-Abstractness -

-

The ratio of the number of abstract classes (and interfaces) in the analyzed jar to the total number of classes in the analyzed jar.

-

The range for this metric is 0 to 1, with A=0 indicating a completely concrete jar and A=1 indicating a completely abstract jar.

-

-Instability -

-

The ratio of efferent coupling (Ce) to total coupling (Ce / (Ce + Ca)). This metric is an indicator of the jar's resilience to change.

-

The range for this metric is 0 to 1, with I=0 indicating a completely stable jar and I=1 indicating a completely instable jar.

-

-Distance -

-

The perpendicular distance of a jar from the idealized line A + I = 1. This metric is an indicator of the jar's balance between abstractness and stability.

-

A jar squarely on the main sequence is optimally balanced with respect to its abstractness and stability. Ideal jars are either completely abstract and stable (x=0, y=1) or completely concrete and instable (x=1, y=0).

-

The range for this metric is 0 to 1, with D=0 indicating a jar that is coincident with the main sequence and D=1 indicating a jar that is as far from the main sequence as possible.

-

-Unresolved Packages -

-

Packages not found in any of the jars analyzed. These can be filtered from output by specifying the packages to exlude in the Filter.properties file. Conversely, you can include jars containing these packages in the directory being analyzed.

-

These packages are excluded from all calculations and adding the jars containing these packages will result in modified metrics.

- - diff --git a/tools/dependencies.xml b/tools/dependencies.xml deleted file mode 100644 index c1146388..00000000 --- a/tools/dependencies.xml +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - 3817 - 796 - 219 - - - - 0.21 - 0 - 0 - -1.0 - -1.0 - - - - com.bric.awt - com.bric.swing - com.google.zxing - com.google.zxing.aztec - com.google.zxing.aztec.decoder - com.google.zxing.aztec.detector - com.google.zxing.client.j2se - com.google.zxing.client.result - com.google.zxing.common - com.google.zxing.common.detector - com.google.zxing.common.reedsolomon - com.google.zxing.datamatrix - com.google.zxing.datamatrix.decoder - com.google.zxing.datamatrix.detector - com.google.zxing.maxicode - com.google.zxing.maxicode.decoder - com.google.zxing.multi - com.google.zxing.multi.qrcode - com.google.zxing.multi.qrcode.detector - com.google.zxing.oned - com.google.zxing.oned.rss - com.google.zxing.oned.rss.expanded - com.google.zxing.oned.rss.expanded.decoders - com.google.zxing.pdf417 - com.google.zxing.pdf417.decoder - com.google.zxing.pdf417.decoder.ec - com.google.zxing.pdf417.detector - com.google.zxing.pdf417.encoder - com.google.zxing.qrcode - com.google.zxing.qrcode.decoder - com.google.zxing.qrcode.detector - com.google.zxing.qrcode.encoder - com.keypoint - com.toedter.calendar - com.toedter.calendar.demo - com.toedter.components - com.toedter.plaf - edu.umd.cs.findbugs.annotations - freemarker.cache - freemarker.core - freemarker.debug - freemarker.debug.impl - freemarker.ext.ant - freemarker.ext.beans - freemarker.ext.dom - freemarker.ext.jdom - freemarker.ext.jsp - freemarker.ext.jython - freemarker.ext.rhino - freemarker.ext.servlet - freemarker.ext.util - freemarker.ext.xml - freemarker.log - freemarker.template - freemarker.template.utility - javax.annotation - javax.annotation.concurrent - javax.annotation.meta - javax.xml - javax.xml.datatype - javax.xml.namespace - javax.xml.parsers - javax.xml.stream - javax.xml.stream.events - javax.xml.stream.util - javax.xml.transform - javax.xml.transform.dom - javax.xml.transform.sax - javax.xml.transform.stax - javax.xml.transform.stream - javax.xml.validation - javax.xml.xpath - net.java.dev.colorchooser - net.jcip.annotations - org.apache.commons.logging - org.apache.commons.logging.impl - org.apache.html.dom - org.apache.wml - org.apache.wml.dom - org.apache.xerces.dom - org.apache.xerces.dom.events - org.apache.xerces.dom3.as - org.apache.xerces.impl - org.apache.xerces.impl.dtd - org.apache.xerces.impl.dtd.models - org.apache.xerces.impl.dv - org.apache.xerces.impl.dv.dtd - org.apache.xerces.impl.dv.util - org.apache.xerces.impl.dv.xs - org.apache.xerces.impl.io - org.apache.xerces.impl.msg - org.apache.xerces.impl.validation - org.apache.xerces.impl.xpath - org.apache.xerces.impl.xpath.regex - org.apache.xerces.impl.xs - org.apache.xerces.impl.xs.identity - org.apache.xerces.impl.xs.models - org.apache.xerces.impl.xs.opti - org.apache.xerces.impl.xs.traversers - org.apache.xerces.impl.xs.util - org.apache.xerces.jaxp - org.apache.xerces.jaxp.datatype - org.apache.xerces.jaxp.validation - org.apache.xerces.parsers - org.apache.xerces.stax - org.apache.xerces.stax.events - org.apache.xerces.util - org.apache.xerces.xinclude - org.apache.xerces.xni - org.apache.xerces.xni.grammars - org.apache.xerces.xni.parser - org.apache.xerces.xpointer - org.apache.xerces.xs - org.apache.xerces.xs.datatypes - org.apache.xml.serialize - org.apache.xmlcommons - org.jdom2 - org.jdom.adapters - org.jdom.filter - org.jdom.input - org.jdom.input.sax - org.jdom.input.stax - org.jdom.internal - org.jdom.located - org.jdom.output - org.jdom.output.support - org.jdom.transform - org.jdom.util - org.jdom.xpath - org.jdom.xpath.jaxen - org.jdom.xpath.util - org.jfree - org.jfree.base - org.jfree.base.config - org.jfree.base.log - org.jfree.base.modules - org.jfree.chart - org.jfree.chart.annotations - org.jfree.chart.axis - org.jfree.chart.block - org.jfree.chart.demo - org.jfree.chart.editor - org.jfree.chart.encoders - org.jfree.chart.entity - org.jfree.chart.event - org.jfree.chart.imagemap - org.jfree.chart.labels - org.jfree.chart.needle - org.jfree.chart.panel - org.jfree.chart.plot - org.jfree.chart.plot.dial - org.jfree.chart.renderer - org.jfree.chart.renderer.category - org.jfree.chart.renderer.xy - org.jfree.chart.resources - org.jfree.chart.servlet - org.jfree.chart.title - org.jfree.chart.urls - org.jfree.chart.util - org.jfree.data - org.jfree.data.category - org.jfree.data.contour - org.jfree.data.function - org.jfree.data.gantt - org.jfree.data.general - org.jfree.data.io - org.jfree.data.jdbc - org.jfree.data.resources - org.jfree.data.statistics - org.jfree.data.time - org.jfree.data.time.ohlc - org.jfree.data.xml - org.jfree.data.xy - org.jfree.date - org.jfree.io - org.jfree.layout - org.jfree.resources - org.jfree.text - org.jfree.threads - org.jfree.ui - org.jfree.ui.about - org.jfree.ui.about.resources - org.jfree.ui.action - org.jfree.ui.tabbedui - org.jfree.util - org.netbeans.lib.awtextra - org.slf4j - org.slf4j.helpers - org.slf4j.impl - org.slf4j.spi - org.w3c.dom - org.w3c.dom.bootstrap - org.w3c.dom.css - org.w3c.dom.events - org.w3c.dom.html - org.w3c.dom.ls - org.w3c.dom.ranges - org.w3c.dom.stylesheets - org.w3c.dom.traversal - org.w3c.dom.views - org.w3c.dom.xpath - org.xml.sax - org.xml.sax.ext - org.xml.sax.helpers - teamma.data - teamma.tableModel - teamma.views - teamma.views.report - tourma - tourma.data - tourma.tableModel - tourma.utility - tourma.utils - tourma.views - tourma.views.fullscreen - tourma.views.parameters - tourma.views.report - tourma.views.round - tourma.views.system - - - - - - - - - - - - - com.jgoodies.looks - com.jgoodies.looks.plastic - org.apache.tools.ant - org.apache.tools.ant.taskdefs - org.python.util - org.zeroturnaround.javarebel - org.jaxen - org.jaxen.dom - com.sun.org.apache.xml.internal.utils - com.sun.org.apache.xpath.internal - com.sun.org.apache.xpath.internal.objects - org.apache.xml.utils - org.apache.xpath - org.apache.xpath.objects - org.jdom - org.jdom.output - org.jaxen.jdom - org.jdom.input - org.python.core - org.mozilla.javascript - org.jaxen.dom4j - org.dom4j - org.dom4j.tree - org.apache.log - org.apache.log4j - org.apache.avalon.framework.logger - org.apache.xml.resolver - org.apache.xml.resolver.readers - org.jaxen.util - org.jaxen.saxpath - - - - - - - diff --git a/tools/docs/api/allclasses-frame.html b/tools/docs/api/allclasses-frame.html deleted file mode 100644 index 1aa6b844..00000000 --- a/tools/docs/api/allclasses-frame.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - -All Classes (JarAnalyzer API) - - - - - - - - - - -All Classes -
- - - - - -
Analyzer -
-BCELClassFactory -
-BCELPublicClass -
-Configuration -
-DOTSummary -
-Jar -
-JarAnalyzerTask -
-JarBuilder -
-JarBuilderImpl -
-JarClass -
-JarCollection -
-JarCollectionDecorator -
-JarCollectionImpl -
-JarFile -
-JarImpl -
-JarMetrics -
-JarMetricsImpl -
-JarPackage -
-JarPackageImpl -
-JarRelationshipDecorator -
-PackageVisitor -
-Summary -
-XMLUISummary -
-
- - - diff --git a/tools/docs/api/allclasses-noframe.html b/tools/docs/api/allclasses-noframe.html deleted file mode 100644 index d6619258..00000000 --- a/tools/docs/api/allclasses-noframe.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - -All Classes (JarAnalyzer API) - - - - - - - - - - -All Classes -
- - - - - -
Analyzer -
-BCELClassFactory -
-BCELPublicClass -
-Configuration -
-DOTSummary -
-Jar -
-JarAnalyzerTask -
-JarBuilder -
-JarBuilderImpl -
-JarClass -
-JarCollection -
-JarCollectionDecorator -
-JarCollectionImpl -
-JarFile -
-JarImpl -
-JarMetrics -
-JarMetricsImpl -
-JarPackage -
-JarPackageImpl -
-JarRelationshipDecorator -
-PackageVisitor -
-Summary -
-XMLUISummary -
-
- - - diff --git a/tools/docs/api/com/kirkk/analyzer/Analyzer.html b/tools/docs/api/com/kirkk/analyzer/Analyzer.html deleted file mode 100644 index 74a50515..00000000 --- a/tools/docs/api/com/kirkk/analyzer/Analyzer.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - -Analyzer (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer -
-Class Analyzer

-
-java.lang.Object
-  extended by com.kirkk.analyzer.Analyzer
-
-
-
-
public class Analyzer
extends java.lang.Object
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
Analyzer() - -
-           
-  - - - - - - - - - - - -
-Method Summary
- Jar[]analyze(java.io.File file) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-Analyzer

-
-public Analyzer()
-
-
- - - - - - - - -
-Method Detail
- -

-analyze

-
-public Jar[] analyze(java.io.File file)
-              throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/Configuration.html b/tools/docs/api/com/kirkk/analyzer/Configuration.html deleted file mode 100644 index f3224277..00000000 --- a/tools/docs/api/com/kirkk/analyzer/Configuration.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - -Configuration (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer -
-Class Configuration

-
-java.lang.Object
-  extended by com.kirkk.analyzer.Configuration
-
-
-
-
public class Configuration
extends java.lang.Object
- - -

-


- -

- - - - - - - - - - - - - - - -
-Field Summary
-static java.util.ListignoreJars - -
-           
-static java.util.ListignorePackages - -
-           
-  - - - - - - - - - - -
-Constructor Summary
Configuration() - -
-           
-  - - - - - - - - - - - -
-Method Summary
-static voidinitialize(java.lang.String packageFilter, - java.lang.String jarFilter) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Field Detail
- -

-ignorePackages

-
-public static java.util.List ignorePackages
-
-
-
-
-
- -

-ignoreJars

-
-public static java.util.List ignoreJars
-
-
-
-
- - - - - - - - -
-Constructor Detail
- -

-Configuration

-
-public Configuration()
-
-
- - - - - - - - -
-Method Detail
- -

-initialize

-
-public static void initialize(java.lang.String packageFilter,
-                              java.lang.String jarFilter)
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/Jar.html b/tools/docs/api/com/kirkk/analyzer/framework/Jar.html deleted file mode 100644 index 49a8f90f..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/Jar.html +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - -Jar (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework -
-Interface Jar

-
-
All Known Implementing Classes:
JarImpl
-
-
-
-
public interface Jar
- - -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidaddCyclicJar(Jar jar) - -
-           
- voidaddIncomingDependency(Jar jar) - -
-           
- voidaddOutgoingDependency(Jar jar) - -
-           
- voidaddPackage(JarPackage jarPackage) - -
-           
- JarMetricscalculateMetrics() - -
-           
- booleancontainsPackage(java.lang.String packageName) - -
-           
- intgetAbstractClassCount() - -
-           
- java.util.ListgetAllContainedPackages() - -
-           
- java.util.ListgetAllExternallyReferencedPackages() - -
-           
- java.util.ListgetAllUnidentifiableExternallyReferencedPackages() - -
-           
- intgetClassCount() - -
-           
- java.util.ListgetCyclicJars() - -
-           
- java.util.ListgetIncomingDependencies() - -
-           
- java.lang.StringgetJarFileName() - -
-           
- java.util.ListgetOutgoingDependencies() - -
-           
- JarPackagegetPackage(java.lang.String packageName) - -
-           
- intgetPackageCount() - -
-           
- booleanhasCycles() - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-getAllContainedPackages

-
-java.util.List getAllContainedPackages()
-
-
-
-
-
-
- -

-getAllExternallyReferencedPackages

-
-java.util.List getAllExternallyReferencedPackages()
-
-
-
-
-
-
- -

-getPackageCount

-
-int getPackageCount()
-
-
-
-
-
-
- -

-getAbstractClassCount

-
-int getAbstractClassCount()
-
-
-
-
-
-
- -

-getClassCount

-
-int getClassCount()
-
-
-
-
-
-
- -

-getJarFileName

-
-java.lang.String getJarFileName()
-
-
-
-
-
-
- -

-addPackage

-
-void addPackage(JarPackage jarPackage)
-
-
-
-
-
-
- -

-getPackage

-
-JarPackage getPackage(java.lang.String packageName)
-
-
-
-
-
-
- -

-containsPackage

-
-boolean containsPackage(java.lang.String packageName)
-
-
-
-
-
-
- -

-getOutgoingDependencies

-
-java.util.List getOutgoingDependencies()
-
-
-
-
-
-
- -

-getIncomingDependencies

-
-java.util.List getIncomingDependencies()
-
-
-
-
-
-
- -

-getAllUnidentifiableExternallyReferencedPackages

-
-java.util.List getAllUnidentifiableExternallyReferencedPackages()
-
-
-
-
-
-
- -

-hasCycles

-
-boolean hasCycles()
-
-
-
-
-
-
- -

-getCyclicJars

-
-java.util.List getCyclicJars()
-
-
-
-
-
-
- -

-addOutgoingDependency

-
-void addOutgoingDependency(Jar jar)
-
-
-
-
-
-
- -

-addIncomingDependency

-
-void addIncomingDependency(Jar jar)
-
-
-
-
-
-
- -

-addCyclicJar

-
-void addCyclicJar(Jar jar)
-
-
-
-
-
-
- -

-calculateMetrics

-
-JarMetrics calculateMetrics()
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/JarBuilder.html b/tools/docs/api/com/kirkk/analyzer/framework/JarBuilder.html deleted file mode 100644 index 3461e8b3..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/JarBuilder.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - -JarBuilder (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework -
-Interface JarBuilder

-
-
All Known Implementing Classes:
JarBuilderImpl
-
-
-
-
public interface JarBuilder
- - -

-


- -

- - - - - - - - - - - - -
-Method Summary
- JarbuildJar(JarFile jarFile, - java.util.List ignorePackages) - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-buildJar

-
-Jar buildJar(JarFile jarFile,
-             java.util.List ignorePackages)
-             throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/JarClass.html b/tools/docs/api/com/kirkk/analyzer/framework/JarClass.html deleted file mode 100644 index 677eff32..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/JarClass.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - -JarClass (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework -
-Interface JarClass

-
-
All Known Implementing Classes:
BCELPublicClass
-
-
-
-
public interface JarClass
- - -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- java.util.ListgetImportedPackageNames() - -
-           
- java.lang.StringgetLongName() - -
-           
- booleanisAbstract() - -
-           
- booleanisInterface() - -
-           
- booleanisPublic() - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-isPublic

-
-boolean isPublic()
-
-
-
-
-
-
- -

-getImportedPackageNames

-
-java.util.List getImportedPackageNames()
-
-
-
-
-
-
- -

-getLongName

-
-java.lang.String getLongName()
-
-
-
-
-
-
- -

-isInterface

-
-boolean isInterface()
-
-
-
-
-
-
- -

-isAbstract

-
-boolean isAbstract()
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/JarCollection.html b/tools/docs/api/com/kirkk/analyzer/framework/JarCollection.html deleted file mode 100644 index a2713d0e..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/JarCollection.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - -JarCollection (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework -
-Interface JarCollection

-
-
All Known Implementing Classes:
JarCollectionDecorator, JarCollectionImpl, JarRelationshipDecorator
-
-
-
-
public interface JarCollection
- - -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidfirst() - -
-           
- JargetJar(java.lang.String jarName) - -
-           
- JargetJarContainingPackage(java.lang.String packageName) - -
-           
- intgetJarCount() - -
-           
- booleanhasNext() - -
-           
- JarnextJar() - -
-           
- Jar[]toArray() - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-getJarCount

-
-int getJarCount()
-
-
-
-
-
-
- -

-hasNext

-
-boolean hasNext()
-
-
-
-
-
-
- -

-nextJar

-
-Jar nextJar()
-
-
-
-
-
-
- -

-getJarContainingPackage

-
-Jar getJarContainingPackage(java.lang.String packageName)
-
-
-
-
-
-
- -

-first

-
-void first()
-
-
-
-
-
-
- -

-getJar

-
-Jar getJar(java.lang.String jarName)
-
-
-
-
-
-
- -

-toArray

-
-Jar[] toArray()
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/JarCollectionDecorator.html b/tools/docs/api/com/kirkk/analyzer/framework/JarCollectionDecorator.html deleted file mode 100644 index eaca0467..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/JarCollectionDecorator.html +++ /dev/null @@ -1,424 +0,0 @@ - - - - - - -JarCollectionDecorator (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework -
-Class JarCollectionDecorator

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.JarCollectionDecorator
-
-
-
All Implemented Interfaces:
JarCollection
-
-
-
Direct Known Subclasses:
JarRelationshipDecorator
-
-
-
-
public abstract class JarCollectionDecorator
extends java.lang.Object
implements JarCollection
- - -

-


- -

- - - - - - - - - - - -
-Field Summary
-protected  JarCollectionjarCollection - -
-           
-  - - - - - - - - - - -
-Constructor Summary
JarCollectionDecorator(JarCollection jarCollection) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidfirst() - -
-           
- JargetJar(java.lang.String jarName) - -
-           
- JargetJarContainingPackage(java.lang.String packageName) - -
-           
- intgetJarCount() - -
-           
- booleanhasNext() - -
-           
- JarnextJar() - -
-           
- Jar[]toArray() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Field Detail
- -

-jarCollection

-
-protected JarCollection jarCollection
-
-
-
-
- - - - - - - - -
-Constructor Detail
- -

-JarCollectionDecorator

-
-public JarCollectionDecorator(JarCollection jarCollection)
-
-
- - - - - - - - -
-Method Detail
- -

-getJarCount

-
-public int getJarCount()
-
-
-
Specified by:
getJarCount in interface JarCollection
-
-
-
-
-
-
- -

-hasNext

-
-public boolean hasNext()
-
-
-
Specified by:
hasNext in interface JarCollection
-
-
-
-
-
-
- -

-nextJar

-
-public Jar nextJar()
-
-
-
Specified by:
nextJar in interface JarCollection
-
-
-
-
-
-
- -

-getJarContainingPackage

-
-public Jar getJarContainingPackage(java.lang.String packageName)
-
-
-
Specified by:
getJarContainingPackage in interface JarCollection
-
-
-
-
-
-
- -

-first

-
-public void first()
-
-
-
Specified by:
first in interface JarCollection
-
-
-
-
-
-
- -

-getJar

-
-public Jar getJar(java.lang.String jarName)
-
-
-
Specified by:
getJar in interface JarCollection
-
-
-
-
-
-
- -

-toArray

-
-public Jar[] toArray()
-
-
-
Specified by:
toArray in interface JarCollection
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/JarMetrics.html b/tools/docs/api/com/kirkk/analyzer/framework/JarMetrics.html deleted file mode 100644 index 825d8b5d..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/JarMetrics.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - -JarMetrics (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework -
-Interface JarMetrics

-
-
All Known Implementing Classes:
JarMetricsImpl
-
-
-
-
public interface JarMetrics
- - -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- java.math.BigDecimalcalculateAbstractness() - -
-           
- intcalculateAfferentCoupling() - -
-           
- java.math.BigDecimalcalculateDistance() - -
-           
- intcalculateEfferentCoupling() - -
-           
- java.math.BigDecimalcalculateInstability() - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-calculateAbstractness

-
-java.math.BigDecimal calculateAbstractness()
-
-
-
-
-
-
- -

-calculateInstability

-
-java.math.BigDecimal calculateInstability()
-
-
-
-
-
-
- -

-calculateAfferentCoupling

-
-int calculateAfferentCoupling()
-
-
-
-
-
-
- -

-calculateEfferentCoupling

-
-int calculateEfferentCoupling()
-
-
-
-
-
-
- -

-calculateDistance

-
-java.math.BigDecimal calculateDistance()
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/JarPackage.html b/tools/docs/api/com/kirkk/analyzer/framework/JarPackage.html deleted file mode 100644 index 53c847e2..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/JarPackage.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - -JarPackage (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework -
-Interface JarPackage

-
-
All Known Implementing Classes:
JarPackageImpl
-
-
-
-
public interface JarPackage
- - -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidaddClass(JarClass jarClass) - -
-           
- intgetClassCount() - -
-           
- java.util.ListgetClasses() - -
-           
- java.util.ListgetImportedPackageNames() - -
-           
- java.lang.StringgetLongName() - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-getImportedPackageNames

-
-java.util.List getImportedPackageNames()
-
-
-
-
-
-
- -

-addClass

-
-void addClass(JarClass jarClass)
-
-
-
-
-
-
- -

-getClasses

-
-java.util.List getClasses()
-
-
-
-
-
-
- -

-getClassCount

-
-int getClassCount()
-
-
-
-
-
-
- -

-getLongName

-
-java.lang.String getLongName()
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcel/BCELClassFactory.html b/tools/docs/api/com/kirkk/analyzer/framework/bcel/BCELClassFactory.html deleted file mode 100644 index 964e0451..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcel/BCELClassFactory.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - -BCELClassFactory (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcel -
-Class BCELClassFactory

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.bcel.BCELClassFactory
-
-
-
-
public class BCELClassFactory
extends java.lang.Object
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
BCELClassFactory() - -
-           
-  - - - - - - - - - - - -
-Method Summary
-static org.apache.bcel.classfile.JavaClassgetClass(java.lang.String file, - java.lang.String className) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-BCELClassFactory

-
-public BCELClassFactory()
-
-
- - - - - - - - -
-Method Detail
- -

-getClass

-
-public static org.apache.bcel.classfile.JavaClass getClass(java.lang.String file,
-                                                           java.lang.String className)
-                                                    throws java.io.IOException
-
-
- -
Throws: -
java.io.IOException
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcel/BCELPublicClass.html b/tools/docs/api/com/kirkk/analyzer/framework/bcel/BCELPublicClass.html deleted file mode 100644 index a0241986..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcel/BCELPublicClass.html +++ /dev/null @@ -1,393 +0,0 @@ - - - - - - -BCELPublicClass (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcel -
-Class BCELPublicClass

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.bcel.BCELPublicClass
-
-
-
All Implemented Interfaces:
JarClass
-
-
-
-
public class BCELPublicClass
extends java.lang.Object
implements JarClass
- - -

-


- -

- - - - - - - - - - - - - - -
-Constructor Summary
BCELPublicClass(java.lang.String fileName, - java.lang.String className) - -
-           
BCELPublicClass(java.lang.String fileName, - java.lang.String className, - java.util.List ignorePackages) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- java.util.ListgetImportedPackageNames() - -
-           
- java.lang.StringgetLongName() - -
-           
- java.lang.StringgetPackageName() - -
-           
- booleanisAbstract() - -
-           
- booleanisInterface() - -
-           
- booleanisPublic() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-BCELPublicClass

-
-public BCELPublicClass(java.lang.String fileName,
-                       java.lang.String className)
-                throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
-
- -

-BCELPublicClass

-
-public BCELPublicClass(java.lang.String fileName,
-                       java.lang.String className,
-                       java.util.List ignorePackages)
-                throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
- - - - - - - - -
-Method Detail
- -

-isPublic

-
-public boolean isPublic()
-
-
-
Specified by:
isPublic in interface JarClass
-
-
-
-
-
-
- -

-isAbstract

-
-public boolean isAbstract()
-
-
-
Specified by:
isAbstract in interface JarClass
-
-
-
-
-
-
- -

-getImportedPackageNames

-
-public java.util.List getImportedPackageNames()
-
-
-
Specified by:
getImportedPackageNames in interface JarClass
-
-
-
-
-
-
- -

-getPackageName

-
-public java.lang.String getPackageName()
-
-
-
-
-
-
-
-
-
- -

-getLongName

-
-public java.lang.String getLongName()
-
-
-
Specified by:
getLongName in interface JarClass
-
-
-
-
-
-
- -

-isInterface

-
-public boolean isInterface()
-
-
-
Specified by:
isInterface in interface JarClass
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcel/PackageVisitor.html b/tools/docs/api/com/kirkk/analyzer/framework/bcel/PackageVisitor.html deleted file mode 100644 index af6e9730..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcel/PackageVisitor.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - -PackageVisitor (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcel -
-Class PackageVisitor

-
-java.lang.Object
-  extended by org.apache.bcel.classfile.EmptyVisitor
-      extended by com.kirkk.analyzer.framework.bcel.PackageVisitor
-
-
-
All Implemented Interfaces:
org.apache.bcel.classfile.Visitor
-
-
-
-
public class PackageVisitor
extends org.apache.bcel.classfile.EmptyVisitor
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
PackageVisitor(org.apache.bcel.classfile.JavaClass javaClass) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- java.util.ListgetAllImports() - -
-           
- java.util.ListgetImports(java.util.List ignorePackages) - -
-           
- voidvisitConstantClass(org.apache.bcel.classfile.ConstantClass cls) - -
-           
- voidvisitConstantString(org.apache.bcel.classfile.ConstantString str) - -
-           
- voidvisitConstantUtf8(org.apache.bcel.classfile.ConstantUtf8 utf) - -
-           
- - - - - - - -
Methods inherited from class org.apache.bcel.classfile.EmptyVisitor
visitCode, visitCodeException, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantPool, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitInnerClasses, visitJavaClass, visitLineNumber, visitLineNumberTable, visitLocalVariable, visitLocalVariableTable, visitMethod, visitSignature, visitSourceFile, visitStackMap, visitStackMapEntry, visitSynthetic, visitUnknown
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-PackageVisitor

-
-public PackageVisitor(org.apache.bcel.classfile.JavaClass javaClass)
-
-
- - - - - - - - -
-Method Detail
- -

-visitConstantClass

-
-public void visitConstantClass(org.apache.bcel.classfile.ConstantClass cls)
-
-
-
Specified by:
visitConstantClass in interface org.apache.bcel.classfile.Visitor
Overrides:
visitConstantClass in class org.apache.bcel.classfile.EmptyVisitor
-
-
-
-
-
-
- -

-visitConstantUtf8

-
-public void visitConstantUtf8(org.apache.bcel.classfile.ConstantUtf8 utf)
-
-
-
Specified by:
visitConstantUtf8 in interface org.apache.bcel.classfile.Visitor
Overrides:
visitConstantUtf8 in class org.apache.bcel.classfile.EmptyVisitor
-
-
-
-
-
-
- -

-visitConstantString

-
-public void visitConstantString(org.apache.bcel.classfile.ConstantString str)
-
-
-
Specified by:
visitConstantString in interface org.apache.bcel.classfile.Visitor
Overrides:
visitConstantString in class org.apache.bcel.classfile.EmptyVisitor
-
-
-
-
-
-
- -

-getAllImports

-
-public java.util.List getAllImports()
-
-
-
-
-
-
- -

-getImports

-
-public java.util.List getImports(java.util.List ignorePackages)
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-frame.html b/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-frame.html deleted file mode 100644 index eed2a0ee..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-frame.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.bcel (JarAnalyzer API) - - - - - - - - - - - -com.kirkk.analyzer.framework.bcel - - - - -
-Classes  - -
-BCELClassFactory -
-BCELPublicClass -
-PackageVisitor
- - - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-summary.html b/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-summary.html deleted file mode 100644 index cee2c3fd..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-summary.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.bcel (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.kirkk.analyzer.framework.bcel -

- - - - - - - - - - - - - - - - - -
-Class Summary
BCELClassFactory 
BCELPublicClass 
PackageVisitor 
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-tree.html b/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-tree.html deleted file mode 100644 index 90a2a4e6..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcel/package-tree.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.bcel Class Hierarchy (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.kirkk.analyzer.framework.bcel -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

-
    -
  • java.lang.Object
      -
    • com.kirkk.analyzer.framework.bcel.BCELClassFactory
    • com.kirkk.analyzer.framework.bcel.BCELPublicClass (implements com.kirkk.analyzer.framework.JarClass) -
    • org.apache.bcel.classfile.EmptyVisitor (implements org.apache.bcel.classfile.Visitor) - -
    -
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarBuilderImpl.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarBuilderImpl.html deleted file mode 100644 index a4cd2af9..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarBuilderImpl.html +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - -JarBuilderImpl (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcelbundle -
-Class JarBuilderImpl

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.bcelbundle.JarBuilderImpl
-
-
-
All Implemented Interfaces:
JarBuilder
-
-
-
-
public class JarBuilderImpl
extends java.lang.Object
implements JarBuilder
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
JarBuilderImpl() - -
-           
-  - - - - - - - - - - - -
-Method Summary
- JarbuildJar(JarFile jarFile, - java.util.List ignorePackages) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-JarBuilderImpl

-
-public JarBuilderImpl()
-
-
- - - - - - - - -
-Method Detail
- -

-buildJar

-
-public Jar buildJar(JarFile jarFile,
-                    java.util.List ignorePackages)
-             throws java.lang.Exception
-
-
-
Specified by:
buildJar in interface JarBuilder
-
-
- -
Throws: -
java.lang.Exception
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarCollectionImpl.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarCollectionImpl.html deleted file mode 100644 index 0a2a1bfc..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarCollectionImpl.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - -JarCollectionImpl (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcelbundle -
-Class JarCollectionImpl

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl
-
-
-
All Implemented Interfaces:
JarCollection
-
-
-
-
public class JarCollectionImpl
extends java.lang.Object
implements JarCollection
- - -

-


- -

- - - - - - - - - - - - - - - - - -
-Constructor Summary
JarCollectionImpl(java.io.File file) - -
-           
JarCollectionImpl(java.io.File file, - java.util.List ignorePackages) - -
-           
JarCollectionImpl(java.io.File file, - java.util.List ignorePackages, - java.util.List ignoreJars) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidfirst() - -
-           
- JargetJar(java.lang.String jarName) - -
-           
- JargetJarContainingPackage(java.lang.String packageName) - -
-           
- intgetJarCount() - -
-           
- booleanhasNext() - -
-           
- JarnextJar() - -
-           
- Jar[]toArray() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-JarCollectionImpl

-
-public JarCollectionImpl(java.io.File file)
-                  throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
-
- -

-JarCollectionImpl

-
-public JarCollectionImpl(java.io.File file,
-                         java.util.List ignorePackages)
-                  throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
-
- -

-JarCollectionImpl

-
-public JarCollectionImpl(java.io.File file,
-                         java.util.List ignorePackages,
-                         java.util.List ignoreJars)
-                  throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
- - - - - - - - -
-Method Detail
- -

-getJarCount

-
-public int getJarCount()
-
-
-
Specified by:
getJarCount in interface JarCollection
-
-
-
-
-
-
- -

-hasNext

-
-public boolean hasNext()
-
-
-
Specified by:
hasNext in interface JarCollection
-
-
-
-
-
-
- -

-nextJar

-
-public Jar nextJar()
-
-
-
Specified by:
nextJar in interface JarCollection
-
-
-
-
-
-
- -

-first

-
-public void first()
-
-
-
Specified by:
first in interface JarCollection
-
-
-
-
-
-
- -

-getJar

-
-public Jar getJar(java.lang.String jarName)
-
-
-
Specified by:
getJar in interface JarCollection
-
-
-
-
-
-
- -

-getJarContainingPackage

-
-public Jar getJarContainingPackage(java.lang.String packageName)
-
-
-
Specified by:
getJarContainingPackage in interface JarCollection
-
-
-
-
-
-
- -

-toArray

-
-public Jar[] toArray()
-
-
-
Specified by:
toArray in interface JarCollection
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarImpl.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarImpl.html deleted file mode 100644 index 73dfb929..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarImpl.html +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - -JarImpl (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcelbundle -
-Class JarImpl

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.bcelbundle.JarImpl
-
-
-
All Implemented Interfaces:
Jar
-
-
-
-
public class JarImpl
extends java.lang.Object
implements Jar
- - -

-


- -

- - - - - - - - - - - -
-Field Summary
- java.util.Listpackages - -
-           
-  - - - - - - - - - - -
-Constructor Summary
JarImpl(java.lang.String jarFileName) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidaddCyclicJar(Jar jar) - -
-           
- voidaddIncomingDependency(Jar jar) - -
-           
- voidaddOutgoingDependency(Jar jar) - -
-           
- voidaddPackage(JarPackage jarPackage) - -
-           
- JarMetricscalculateMetrics() - -
-           
- booleancontainsPackage(java.lang.String s) - -
-           
- intgetAbstractClassCount() - -
-           
- java.util.ListgetAllContainedPackages() - -
-           
- java.util.ListgetAllExternallyReferencedPackages() - -
-           
- java.util.ListgetAllUnidentifiableExternallyReferencedPackages() - -
-           
- intgetClassCount() - -
-           
- java.util.ListgetCyclicJars() - -
-           
- java.lang.StringgetFullyQualifiedJarFileName() - -
-           
- java.util.ListgetIncomingDependencies() - -
-           
- java.lang.StringgetJarFileName() - -
-           
- java.util.ListgetOutgoingDependencies() - -
-           
- JarPackagegetPackage(java.lang.String s) - -
-           
- intgetPackageCount() - -
-           
- booleanhasCycles() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Field Detail
- -

-packages

-
-public java.util.List packages
-
-
-
-
- - - - - - - - -
-Constructor Detail
- -

-JarImpl

-
-public JarImpl(java.lang.String jarFileName)
-
-
- - - - - - - - -
-Method Detail
- -

-getAllContainedPackages

-
-public java.util.List getAllContainedPackages()
-
-
-
Specified by:
getAllContainedPackages in interface Jar
-
-
-
-
-
-
- -

-addOutgoingDependency

-
-public void addOutgoingDependency(Jar jar)
-
-
-
Specified by:
addOutgoingDependency in interface Jar
-
-
-
-
-
-
- -

-addIncomingDependency

-
-public void addIncomingDependency(Jar jar)
-
-
-
Specified by:
addIncomingDependency in interface Jar
-
-
-
-
-
-
- -

-addCyclicJar

-
-public void addCyclicJar(Jar jar)
-
-
-
Specified by:
addCyclicJar in interface Jar
-
-
-
-
-
-
- -

-hasCycles

-
-public boolean hasCycles()
-
-
-
Specified by:
hasCycles in interface Jar
-
-
-
-
-
-
- -

-getCyclicJars

-
-public java.util.List getCyclicJars()
-
-
-
Specified by:
getCyclicJars in interface Jar
-
-
-
-
-
-
- -

-getOutgoingDependencies

-
-public java.util.List getOutgoingDependencies()
-
-
-
Specified by:
getOutgoingDependencies in interface Jar
-
-
-
-
-
-
- -

-getIncomingDependencies

-
-public java.util.List getIncomingDependencies()
-
-
-
Specified by:
getIncomingDependencies in interface Jar
-
-
-
-
-
-
- -

-getAllExternallyReferencedPackages

-
-public java.util.List getAllExternallyReferencedPackages()
-
-
-
Specified by:
getAllExternallyReferencedPackages in interface Jar
-
-
-
-
-
-
- -

-getAllUnidentifiableExternallyReferencedPackages

-
-public java.util.List getAllUnidentifiableExternallyReferencedPackages()
-
-
-
Specified by:
getAllUnidentifiableExternallyReferencedPackages in interface Jar
-
-
-
-
-
-
- -

-getPackageCount

-
-public int getPackageCount()
-
-
-
Specified by:
getPackageCount in interface Jar
-
-
-
-
-
-
- -

-getJarFileName

-
-public java.lang.String getJarFileName()
-
-
-
Specified by:
getJarFileName in interface Jar
-
-
-
-
-
-
- -

-getFullyQualifiedJarFileName

-
-public java.lang.String getFullyQualifiedJarFileName()
-
-
-
-
-
-
-
-
-
- -

-getClassCount

-
-public int getClassCount()
-
-
-
Specified by:
getClassCount in interface Jar
-
-
-
-
-
-
- -

-getAbstractClassCount

-
-public int getAbstractClassCount()
-
-
-
Specified by:
getAbstractClassCount in interface Jar
-
-
-
-
-
-
- -

-addPackage

-
-public void addPackage(JarPackage jarPackage)
-
-
-
Specified by:
addPackage in interface Jar
-
-
-
-
-
-
- -

-getPackage

-
-public JarPackage getPackage(java.lang.String s)
-
-
-
Specified by:
getPackage in interface Jar
-
-
-
-
-
-
- -

-containsPackage

-
-public boolean containsPackage(java.lang.String s)
-
-
-
Specified by:
containsPackage in interface Jar
-
-
-
-
-
-
- -

-calculateMetrics

-
-public JarMetrics calculateMetrics()
-
-
-
Specified by:
calculateMetrics in interface Jar
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarMetricsImpl.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarMetricsImpl.html deleted file mode 100644 index 78859e96..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarMetricsImpl.html +++ /dev/null @@ -1,341 +0,0 @@ - - - - - - -JarMetricsImpl (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcelbundle -
-Class JarMetricsImpl

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.bcelbundle.JarMetricsImpl
-
-
-
All Implemented Interfaces:
JarMetrics
-
-
-
-
public class JarMetricsImpl
extends java.lang.Object
implements JarMetrics
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
JarMetricsImpl(Jar jar) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- java.math.BigDecimalcalculateAbstractness() - -
-           
- intcalculateAfferentCoupling() - -
-           
- java.math.BigDecimalcalculateDistance() - -
-           
- intcalculateEfferentCoupling() - -
-           
- java.math.BigDecimalcalculateInstability() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-JarMetricsImpl

-
-public JarMetricsImpl(Jar jar)
-
-
- - - - - - - - -
-Method Detail
- -

-calculateAbstractness

-
-public java.math.BigDecimal calculateAbstractness()
-
-
-
Specified by:
calculateAbstractness in interface JarMetrics
-
-
-
-
-
-
- -

-calculateInstability

-
-public java.math.BigDecimal calculateInstability()
-
-
-
Specified by:
calculateInstability in interface JarMetrics
-
-
-
-
-
-
- -

-calculateEfferentCoupling

-
-public int calculateEfferentCoupling()
-
-
-
Specified by:
calculateEfferentCoupling in interface JarMetrics
-
-
-
-
-
-
- -

-calculateAfferentCoupling

-
-public int calculateAfferentCoupling()
-
-
-
Specified by:
calculateAfferentCoupling in interface JarMetrics
-
-
-
-
-
-
- -

-calculateDistance

-
-public java.math.BigDecimal calculateDistance()
-
-
-
Specified by:
calculateDistance in interface JarMetrics
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarPackageImpl.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarPackageImpl.html deleted file mode 100644 index eac88833..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarPackageImpl.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - -JarPackageImpl (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcelbundle -
-Class JarPackageImpl

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl
-
-
-
All Implemented Interfaces:
JarPackage
-
-
-
-
public class JarPackageImpl
extends java.lang.Object
implements JarPackage
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
JarPackageImpl(java.lang.String packageName) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidaddClass(JarClass jarClass) - -
-           
- booleanequals(java.lang.Object obj) - -
-           
- intgetClassCount() - -
-           
- java.util.ListgetClasses() - -
-           
- java.util.ListgetImportedPackageNames() - -
-           
- java.lang.StringgetLongName() - -
-           
- inthashCode() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-JarPackageImpl

-
-public JarPackageImpl(java.lang.String packageName)
-
-
- - - - - - - - -
-Method Detail
- -

-addClass

-
-public void addClass(JarClass jarClass)
-
-
-
Specified by:
addClass in interface JarPackage
-
-
-
-
-
-
- -

-getClasses

-
-public java.util.List getClasses()
-
-
-
Specified by:
getClasses in interface JarPackage
-
-
-
-
-
-
- -

-getClassCount

-
-public int getClassCount()
-
-
-
Specified by:
getClassCount in interface JarPackage
-
-
-
-
-
-
- -

-getLongName

-
-public java.lang.String getLongName()
-
-
-
Specified by:
getLongName in interface JarPackage
-
-
-
-
-
-
- -

-equals

-
-public boolean equals(java.lang.Object obj)
-
-
-
Overrides:
equals in class java.lang.Object
-
-
-
-
-
-
- -

-hashCode

-
-public int hashCode()
-
-
-
Overrides:
hashCode in class java.lang.Object
-
-
-
-
-
-
- -

-getImportedPackageNames

-
-public java.util.List getImportedPackageNames()
-
-
-
Specified by:
getImportedPackageNames in interface JarPackage
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarRelationshipDecorator.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarRelationshipDecorator.html deleted file mode 100644 index 20112702..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/JarRelationshipDecorator.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - -JarRelationshipDecorator (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.bcelbundle -
-Class JarRelationshipDecorator

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.JarCollectionDecorator
-      extended by com.kirkk.analyzer.framework.bcelbundle.JarRelationshipDecorator
-
-
-
All Implemented Interfaces:
JarCollection
-
-
-
-
public class JarRelationshipDecorator
extends JarCollectionDecorator
- - -

-


- -

- - - - - - - -
-Field Summary
- - - - - - - -
Fields inherited from class com.kirkk.analyzer.framework.JarCollectionDecorator
jarCollection
-  - - - - - - - - - - -
-Constructor Summary
JarRelationshipDecorator(JarCollection jarCollection) - -
-           
-  - - - - - - - -
-Method Summary
- - - - - - - -
Methods inherited from class com.kirkk.analyzer.framework.JarCollectionDecorator
first, getJar, getJarContainingPackage, getJarCount, hasNext, nextJar, toArray
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-JarRelationshipDecorator

-
-public JarRelationshipDecorator(JarCollection jarCollection)
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-frame.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-frame.html deleted file mode 100644 index 18960adc..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.bcelbundle (JarAnalyzer API) - - - - - - - - - - - -com.kirkk.analyzer.framework.bcelbundle - - - - -
-Classes  - -
-JarBuilderImpl -
-JarCollectionImpl -
-JarImpl -
-JarMetricsImpl -
-JarPackageImpl -
-JarRelationshipDecorator
- - - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-summary.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-summary.html deleted file mode 100644 index 6f128feb..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-summary.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.bcelbundle (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.kirkk.analyzer.framework.bcelbundle -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class Summary
JarBuilderImpl 
JarCollectionImpl 
JarImpl 
JarMetricsImpl 
JarPackageImpl 
JarRelationshipDecorator 
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-tree.html b/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-tree.html deleted file mode 100644 index 37b12879..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/bcelbundle/package-tree.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.bcelbundle Class Hierarchy (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.kirkk.analyzer.framework.bcelbundle -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/jar/JarFile.html b/tools/docs/api/com/kirkk/analyzer/framework/jar/JarFile.html deleted file mode 100644 index e7a8eb54..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/jar/JarFile.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - -JarFile (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.framework.jar -
-Class JarFile

-
-java.lang.Object
-  extended by com.kirkk.analyzer.framework.jar.JarFile
-
-
-
-
public class JarFile
extends java.lang.Object
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
JarFile(java.io.File file) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidclose() - -
-           
- java.lang.StringgetFileName() - -
-           
- java.lang.StringgetShortFileName() - -
-           
- booleanhasMoreClasses() - -
-           
- java.lang.StringnextClass() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-JarFile

-
-public JarFile(java.io.File file)
-        throws java.util.zip.ZipException,
-               java.io.IOException
-
-
- -
Throws: -
java.util.zip.ZipException -
java.io.IOException
-
- - - - - - - - -
-Method Detail
- -

-hasMoreClasses

-
-public boolean hasMoreClasses()
-
-
-
-
-
-
- -

-nextClass

-
-public java.lang.String nextClass()
-
-
-
-
-
-
- -

-getFileName

-
-public java.lang.String getFileName()
-
-
-
-
-
-
- -

-getShortFileName

-
-public java.lang.String getShortFileName()
-
-
-
-
-
-
- -

-close

-
-public void close()
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/jar/package-frame.html b/tools/docs/api/com/kirkk/analyzer/framework/jar/package-frame.html deleted file mode 100644 index 7a561f0b..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/jar/package-frame.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.jar (JarAnalyzer API) - - - - - - - - - - - -com.kirkk.analyzer.framework.jar - - - - -
-Classes  - -
-JarFile
- - - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/jar/package-summary.html b/tools/docs/api/com/kirkk/analyzer/framework/jar/package-summary.html deleted file mode 100644 index 160d4110..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/jar/package-summary.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.jar (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.kirkk.analyzer.framework.jar -

- - - - - - - - - -
-Class Summary
JarFile 
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/jar/package-tree.html b/tools/docs/api/com/kirkk/analyzer/framework/jar/package-tree.html deleted file mode 100644 index ec3074df..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/jar/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework.jar Class Hierarchy (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.kirkk.analyzer.framework.jar -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

-
    -
  • java.lang.Object
      -
    • com.kirkk.analyzer.framework.jar.JarFile
    -
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/package-frame.html b/tools/docs/api/com/kirkk/analyzer/framework/package-frame.html deleted file mode 100644 index 30f921d9..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/package-frame.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework (JarAnalyzer API) - - - - - - - - - - - -com.kirkk.analyzer.framework - - - - -
-Interfaces  - -
-Jar -
-JarBuilder -
-JarClass -
-JarCollection -
-JarMetrics -
-JarPackage
- - - - - - -
-Classes  - -
-JarCollectionDecorator
- - - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/package-summary.html b/tools/docs/api/com/kirkk/analyzer/framework/package-summary.html deleted file mode 100644 index c0af433f..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/package-summary.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.kirkk.analyzer.framework -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Interface Summary
Jar 
JarBuilder 
JarClass 
JarCollection 
JarMetrics 
JarPackage 
-  - -

- - - - - - - - - -
-Class Summary
JarCollectionDecorator 
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/framework/package-tree.html b/tools/docs/api/com/kirkk/analyzer/framework/package-tree.html deleted file mode 100644 index 4622051e..00000000 --- a/tools/docs/api/com/kirkk/analyzer/framework/package-tree.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - -com.kirkk.analyzer.framework Class Hierarchy (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.kirkk.analyzer.framework -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

- -

-Interface Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/package-frame.html b/tools/docs/api/com/kirkk/analyzer/package-frame.html deleted file mode 100644 index 61b2906e..00000000 --- a/tools/docs/api/com/kirkk/analyzer/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - -com.kirkk.analyzer (JarAnalyzer API) - - - - - - - - - - - -com.kirkk.analyzer - - - - -
-Classes  - -
-Analyzer -
-Configuration
- - - - diff --git a/tools/docs/api/com/kirkk/analyzer/package-summary.html b/tools/docs/api/com/kirkk/analyzer/package-summary.html deleted file mode 100644 index 4c694528..00000000 --- a/tools/docs/api/com/kirkk/analyzer/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - -com.kirkk.analyzer (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.kirkk.analyzer -

- - - - - - - - - - - - - -
-Class Summary
Analyzer 
Configuration 
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/package-tree.html b/tools/docs/api/com/kirkk/analyzer/package-tree.html deleted file mode 100644 index 00a4bb0d..00000000 --- a/tools/docs/api/com/kirkk/analyzer/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - -com.kirkk.analyzer Class Hierarchy (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.kirkk.analyzer -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/textui/DOTSummary.html b/tools/docs/api/com/kirkk/analyzer/textui/DOTSummary.html deleted file mode 100644 index c73b7690..00000000 --- a/tools/docs/api/com/kirkk/analyzer/textui/DOTSummary.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - -DOTSummary (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.textui -
-Class DOTSummary

-
-java.lang.Object
-  extended by com.kirkk.analyzer.textui.DOTSummary
-
-
-
All Implemented Interfaces:
Summary
-
-
-
-
public class DOTSummary
extends java.lang.Object
implements Summary
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
DOTSummary() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidcreateSummary(java.io.File srcDir, - java.io.File destFile) - -
-           
- voidcreateSummary(java.io.File srcDir, - java.io.File destFile, - java.lang.String packageFilter, - java.lang.String jarFilter) - -
-           
- voidinstanceMain(java.lang.String[] args) - -
-           
-static voidmain(java.lang.String[] args) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-DOTSummary

-
-public DOTSummary()
-
-
- - - - - - - - -
-Method Detail
- -

-main

-
-public static void main(java.lang.String[] args)
-                 throws java.lang.Exception
-
-
-
-
-
- -
Throws: -
java.lang.Exception
-
-
-
- -

-instanceMain

-
-public void instanceMain(java.lang.String[] args)
-                  throws java.lang.Exception
-
-
-
-
-
- -
Throws: -
java.lang.Exception
-
-
-
- -

-createSummary

-
-public void createSummary(java.io.File srcDir,
-                          java.io.File destFile)
-                   throws java.lang.Exception
-
-
-
Specified by:
createSummary in interface Summary
-
-
- -
Throws: -
java.lang.Exception
-
-
-
- -

-createSummary

-
-public void createSummary(java.io.File srcDir,
-                          java.io.File destFile,
-                          java.lang.String packageFilter,
-                          java.lang.String jarFilter)
-                   throws java.lang.Exception
-
-
-
Specified by:
createSummary in interface Summary
-
-
- -
Throws: -
java.lang.Exception
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/textui/JarAnalyzerTask.html b/tools/docs/api/com/kirkk/analyzer/textui/JarAnalyzerTask.html deleted file mode 100644 index 65a3e6d3..00000000 --- a/tools/docs/api/com/kirkk/analyzer/textui/JarAnalyzerTask.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - -JarAnalyzerTask (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.textui -
-Class JarAnalyzerTask

-
-java.lang.Object
-  extended by Task
-      extended by com.kirkk.analyzer.textui.JarAnalyzerTask
-
-
-
-
public class JarAnalyzerTask
extends Task
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
JarAnalyzerTask() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidexecute() - -
-           
- voidsetDestfile(java.io.File destfile) - -
-           
- voidsetJarFilter(java.lang.String jarFilter) - -
-           
- voidsetPackageFilter(java.lang.String packageFilter) - -
-           
- voidsetSrcdir(java.io.File srcdir) - -
-           
- voidsetSummaryclass(java.lang.String summaryclass) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-JarAnalyzerTask

-
-public JarAnalyzerTask()
-
-
- - - - - - - - -
-Method Detail
- -

-setJarFilter

-
-public void setJarFilter(java.lang.String jarFilter)
-
-
-
-
-
-
- -

-setPackageFilter

-
-public void setPackageFilter(java.lang.String packageFilter)
-
-
-
-
-
-
- -

-setSrcdir

-
-public void setSrcdir(java.io.File srcdir)
-
-
-
-
-
-
- -

-setDestfile

-
-public void setDestfile(java.io.File destfile)
-
-
-
-
-
-
- -

-setSummaryclass

-
-public void setSummaryclass(java.lang.String summaryclass)
-
-
-
-
-
-
- -

-execute

-
-public void execute()
-             throws BuildException
-
-
- -
Throws: -
BuildException
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/textui/Summary.html b/tools/docs/api/com/kirkk/analyzer/textui/Summary.html deleted file mode 100644 index 9caeb4c1..00000000 --- a/tools/docs/api/com/kirkk/analyzer/textui/Summary.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - -Summary (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.textui -
-Interface Summary

-
-
All Known Implementing Classes:
DOTSummary, XMLUISummary
-
-
-
-
public interface Summary
- - -

-


- -

- - - - - - - - - - - - - - - - -
-Method Summary
- voidcreateSummary(java.io.File srcDir, - java.io.File destFile) - -
-           
- voidcreateSummary(java.io.File srcDir, - java.io.File destFile, - java.lang.String packageFilter, - java.lang.String jarFilter) - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-createSummary

-
-void createSummary(java.io.File srcDir,
-                   java.io.File destFile)
-                   throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
-
-
- -

-createSummary

-
-void createSummary(java.io.File srcDir,
-                   java.io.File destFile,
-                   java.lang.String packageFilter,
-                   java.lang.String jarFilter)
-                   throws java.lang.Exception
-
-
- -
Throws: -
java.lang.Exception
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/textui/XMLUISummary.html b/tools/docs/api/com/kirkk/analyzer/textui/XMLUISummary.html deleted file mode 100644 index 83f25df1..00000000 --- a/tools/docs/api/com/kirkk/analyzer/textui/XMLUISummary.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - -XMLUISummary (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.kirkk.analyzer.textui -
-Class XMLUISummary

-
-java.lang.Object
-  extended by com.kirkk.analyzer.textui.XMLUISummary
-
-
-
All Implemented Interfaces:
Summary
-
-
-
-
public class XMLUISummary
extends java.lang.Object
implements Summary
- - -

-


- -

- - - - - - - - - - - -
-Constructor Summary
XMLUISummary() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidcreateSummary(java.io.File srcDir, - java.io.File destFile) - -
-           
- voidcreateSummary(java.io.File srcDir, - java.io.File destFile, - java.lang.String packageFilter, - java.lang.String jarFilter) - -
-           
- voidinstanceMain(java.lang.String[] args) - -
-           
-static voidmain(java.lang.String[] args) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-XMLUISummary

-
-public XMLUISummary()
-
-
- - - - - - - - -
-Method Detail
- -

-main

-
-public static void main(java.lang.String[] args)
-                 throws java.lang.Exception
-
-
-
-
-
- -
Throws: -
java.lang.Exception
-
-
-
- -

-instanceMain

-
-public void instanceMain(java.lang.String[] args)
-                  throws java.lang.Exception
-
-
-
-
-
- -
Throws: -
java.lang.Exception
-
-
-
- -

-createSummary

-
-public void createSummary(java.io.File srcDir,
-                          java.io.File destFile)
-                   throws java.lang.Exception
-
-
-
Specified by:
createSummary in interface Summary
-
-
- -
Throws: -
java.lang.Exception
-
-
-
- -

-createSummary

-
-public void createSummary(java.io.File srcDir,
-                          java.io.File destFile,
-                          java.lang.String packageFilter,
-                          java.lang.String jarFilter)
-                   throws java.lang.Exception
-
-
-
Specified by:
createSummary in interface Summary
-
-
- -
Throws: -
java.lang.Exception
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/textui/package-frame.html b/tools/docs/api/com/kirkk/analyzer/textui/package-frame.html deleted file mode 100644 index bdd80043..00000000 --- a/tools/docs/api/com/kirkk/analyzer/textui/package-frame.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - -com.kirkk.analyzer.textui (JarAnalyzer API) - - - - - - - - - - - -com.kirkk.analyzer.textui - - - - -
-Interfaces  - -
-Summary
- - - - - - -
-Classes  - -
-DOTSummary -
-JarAnalyzerTask -
-XMLUISummary
- - - - diff --git a/tools/docs/api/com/kirkk/analyzer/textui/package-summary.html b/tools/docs/api/com/kirkk/analyzer/textui/package-summary.html deleted file mode 100644 index e1c4cb58..00000000 --- a/tools/docs/api/com/kirkk/analyzer/textui/package-summary.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - -com.kirkk.analyzer.textui (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.kirkk.analyzer.textui -

- - - - - - - - - -
-Interface Summary
Summary 
-  - -

- - - - - - - - - - - - - - - - - -
-Class Summary
DOTSummary 
JarAnalyzerTask 
XMLUISummary 
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/com/kirkk/analyzer/textui/package-tree.html b/tools/docs/api/com/kirkk/analyzer/textui/package-tree.html deleted file mode 100644 index 587ebd32..00000000 --- a/tools/docs/api/com/kirkk/analyzer/textui/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - -com.kirkk.analyzer.textui Class Hierarchy (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.kirkk.analyzer.textui -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

- -

-Interface Hierarchy -

-
    -
  • com.kirkk.analyzer.textui.Summary
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/constant-values.html b/tools/docs/api/constant-values.html deleted file mode 100644 index 254fc73a..00000000 --- a/tools/docs/api/constant-values.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -Constant Field Values (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Constant Field Values

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/deprecated-list.html b/tools/docs/api/deprecated-list.html deleted file mode 100644 index ad7374a6..00000000 --- a/tools/docs/api/deprecated-list.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -Deprecated List (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Deprecated API

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/help-doc.html b/tools/docs/api/help-doc.html deleted file mode 100644 index e378d5b1..00000000 --- a/tools/docs/api/help-doc.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - -API Help (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-How This API Document Is Organized

-
-This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

-Overview

-
- -

-The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

-

-Package

-
- -

-Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    -
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
-
-

-Class/Interface

-
- -

-Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    -
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description -

    -

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary -

    -

  • Field Detail
  • Constructor Detail
  • Method Detail
-Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
- -

-Annotation Type

-
- -

-Each annotation type has its own separate page with the following sections:

    -
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
-
- -

-Enum

-
- -

-Each enum has its own separate page with the following sections:

    -
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
-
-

-Tree (Class Hierarchy)

-
-There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    -
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-
-

-Deprecated API

-
-The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-

-Index

-
-The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-

-Prev/Next

-These links take you to the next or previous class, interface, package, or related page.

-Frames/No Frames

-These links show and hide the HTML frames. All pages are available with or without frames. -

-

-Serialized Form

-Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. -

-

-Constant Field Values

-The Constant Field Values page lists the static final fields and their values. -

- - -This help file applies to API documentation generated using the standard doclet. - -
-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/index-all.html b/tools/docs/api/index-all.html deleted file mode 100644 index 571d7872..00000000 --- a/tools/docs/api/index-all.html +++ /dev/null @@ -1,651 +0,0 @@ - - - - - - -Index (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -A B C D E F G H I J M N P S T V X
-

-A

-
-
addClass(JarClass) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
addClass(JarClass) - -Method in interface com.kirkk.analyzer.framework.JarPackage -
  -
addCyclicJar(Jar) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
addCyclicJar(Jar) - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
addIncomingDependency(Jar) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
addIncomingDependency(Jar) - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
addOutgoingDependency(Jar) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
addOutgoingDependency(Jar) - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
addPackage(JarPackage) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
addPackage(JarPackage) - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
analyze(File) - -Method in class com.kirkk.analyzer.Analyzer -
  -
Analyzer - Class in com.kirkk.analyzer
 
Analyzer() - -Constructor for class com.kirkk.analyzer.Analyzer -
  -
-
-

-B

-
-
BCELClassFactory - Class in com.kirkk.analyzer.framework.bcel
 
BCELClassFactory() - -Constructor for class com.kirkk.analyzer.framework.bcel.BCELClassFactory -
  -
BCELPublicClass - Class in com.kirkk.analyzer.framework.bcel
 
BCELPublicClass(String, String) - -Constructor for class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
BCELPublicClass(String, String, List) - -Constructor for class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
buildJar(JarFile, List) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarBuilderImpl -
  -
buildJar(JarFile, List) - -Method in interface com.kirkk.analyzer.framework.JarBuilder -
  -
-
-

-C

-
-
calculateAbstractness() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarMetricsImpl -
  -
calculateAbstractness() - -Method in interface com.kirkk.analyzer.framework.JarMetrics -
  -
calculateAfferentCoupling() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarMetricsImpl -
  -
calculateAfferentCoupling() - -Method in interface com.kirkk.analyzer.framework.JarMetrics -
  -
calculateDistance() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarMetricsImpl -
  -
calculateDistance() - -Method in interface com.kirkk.analyzer.framework.JarMetrics -
  -
calculateEfferentCoupling() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarMetricsImpl -
  -
calculateEfferentCoupling() - -Method in interface com.kirkk.analyzer.framework.JarMetrics -
  -
calculateInstability() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarMetricsImpl -
  -
calculateInstability() - -Method in interface com.kirkk.analyzer.framework.JarMetrics -
  -
calculateMetrics() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
calculateMetrics() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
close() - -Method in class com.kirkk.analyzer.framework.jar.JarFile -
  -
com.kirkk.analyzer - package com.kirkk.analyzer
 
com.kirkk.analyzer.framework - package com.kirkk.analyzer.framework
 
com.kirkk.analyzer.framework.bcel - package com.kirkk.analyzer.framework.bcel
 
com.kirkk.analyzer.framework.bcelbundle - package com.kirkk.analyzer.framework.bcelbundle
 
com.kirkk.analyzer.framework.jar - package com.kirkk.analyzer.framework.jar
 
com.kirkk.analyzer.textui - package com.kirkk.analyzer.textui
 
Configuration - Class in com.kirkk.analyzer
 
Configuration() - -Constructor for class com.kirkk.analyzer.Configuration -
  -
containsPackage(String) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
containsPackage(String) - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
createSummary(File, File) - -Method in class com.kirkk.analyzer.textui.DOTSummary -
  -
createSummary(File, File, String, String) - -Method in class com.kirkk.analyzer.textui.DOTSummary -
  -
createSummary(File, File) - -Method in interface com.kirkk.analyzer.textui.Summary -
  -
createSummary(File, File, String, String) - -Method in interface com.kirkk.analyzer.textui.Summary -
  -
createSummary(File, File) - -Method in class com.kirkk.analyzer.textui.XMLUISummary -
  -
createSummary(File, File, String, String) - -Method in class com.kirkk.analyzer.textui.XMLUISummary -
  -
-
-

-D

-
-
DOTSummary - Class in com.kirkk.analyzer.textui
 
DOTSummary() - -Constructor for class com.kirkk.analyzer.textui.DOTSummary -
  -
-
-

-E

-
-
equals(Object) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
execute() - -Method in class com.kirkk.analyzer.textui.JarAnalyzerTask -
  -
-
-

-F

-
-
first() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
first() - -Method in interface com.kirkk.analyzer.framework.JarCollection -
  -
first() - -Method in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
-
-

-G

-
-
getAbstractClassCount() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getAbstractClassCount() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getAllContainedPackages() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getAllContainedPackages() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getAllExternallyReferencedPackages() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getAllExternallyReferencedPackages() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getAllImports() - -Method in class com.kirkk.analyzer.framework.bcel.PackageVisitor -
  -
getAllUnidentifiableExternallyReferencedPackages() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getAllUnidentifiableExternallyReferencedPackages() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getClass(String, String) - -Static method in class com.kirkk.analyzer.framework.bcel.BCELClassFactory -
  -
getClassCount() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getClassCount() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
getClassCount() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getClassCount() - -Method in interface com.kirkk.analyzer.framework.JarPackage -
  -
getClasses() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
getClasses() - -Method in interface com.kirkk.analyzer.framework.JarPackage -
  -
getCyclicJars() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getCyclicJars() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getFileName() - -Method in class com.kirkk.analyzer.framework.jar.JarFile -
  -
getFullyQualifiedJarFileName() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getImportedPackageNames() - -Method in class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
getImportedPackageNames() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
getImportedPackageNames() - -Method in interface com.kirkk.analyzer.framework.JarClass -
  -
getImportedPackageNames() - -Method in interface com.kirkk.analyzer.framework.JarPackage -
  -
getImports(List) - -Method in class com.kirkk.analyzer.framework.bcel.PackageVisitor -
  -
getIncomingDependencies() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getIncomingDependencies() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getJar(String) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
getJar(String) - -Method in interface com.kirkk.analyzer.framework.JarCollection -
  -
getJar(String) - -Method in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
getJarContainingPackage(String) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
getJarContainingPackage(String) - -Method in interface com.kirkk.analyzer.framework.JarCollection -
  -
getJarContainingPackage(String) - -Method in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
getJarCount() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
getJarCount() - -Method in interface com.kirkk.analyzer.framework.JarCollection -
  -
getJarCount() - -Method in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
getJarFileName() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getJarFileName() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getLongName() - -Method in class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
getLongName() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
getLongName() - -Method in interface com.kirkk.analyzer.framework.JarClass -
  -
getLongName() - -Method in interface com.kirkk.analyzer.framework.JarPackage -
  -
getOutgoingDependencies() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getOutgoingDependencies() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getPackage(String) - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getPackage(String) - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getPackageCount() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
getPackageCount() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
getPackageName() - -Method in class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
getShortFileName() - -Method in class com.kirkk.analyzer.framework.jar.JarFile -
  -
-
-

-H

-
-
hasCycles() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
hasCycles() - -Method in interface com.kirkk.analyzer.framework.Jar -
  -
hashCode() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
hasMoreClasses() - -Method in class com.kirkk.analyzer.framework.jar.JarFile -
  -
hasNext() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
hasNext() - -Method in interface com.kirkk.analyzer.framework.JarCollection -
  -
hasNext() - -Method in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
-
-

-I

-
-
ignoreJars - -Static variable in class com.kirkk.analyzer.Configuration -
  -
ignorePackages - -Static variable in class com.kirkk.analyzer.Configuration -
  -
initialize(String, String) - -Static method in class com.kirkk.analyzer.Configuration -
  -
instanceMain(String[]) - -Method in class com.kirkk.analyzer.textui.DOTSummary -
  -
instanceMain(String[]) - -Method in class com.kirkk.analyzer.textui.XMLUISummary -
  -
isAbstract() - -Method in class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
isAbstract() - -Method in interface com.kirkk.analyzer.framework.JarClass -
  -
isInterface() - -Method in class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
isInterface() - -Method in interface com.kirkk.analyzer.framework.JarClass -
  -
isPublic() - -Method in class com.kirkk.analyzer.framework.bcel.BCELPublicClass -
  -
isPublic() - -Method in interface com.kirkk.analyzer.framework.JarClass -
  -
-
-

-J

-
-
Jar - Interface in com.kirkk.analyzer.framework
 
JarAnalyzerTask - Class in com.kirkk.analyzer.textui
 
JarAnalyzerTask() - -Constructor for class com.kirkk.analyzer.textui.JarAnalyzerTask -
  -
JarBuilder - Interface in com.kirkk.analyzer.framework
 
JarBuilderImpl - Class in com.kirkk.analyzer.framework.bcelbundle
 
JarBuilderImpl() - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarBuilderImpl -
  -
JarClass - Interface in com.kirkk.analyzer.framework
 
JarCollection - Interface in com.kirkk.analyzer.framework
 
jarCollection - -Variable in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
JarCollectionDecorator - Class in com.kirkk.analyzer.framework
 
JarCollectionDecorator(JarCollection) - -Constructor for class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
JarCollectionImpl - Class in com.kirkk.analyzer.framework.bcelbundle
 
JarCollectionImpl(File) - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
JarCollectionImpl(File, List) - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
JarCollectionImpl(File, List, List) - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
JarFile - Class in com.kirkk.analyzer.framework.jar
 
JarFile(File) - -Constructor for class com.kirkk.analyzer.framework.jar.JarFile -
  -
JarImpl - Class in com.kirkk.analyzer.framework.bcelbundle
 
JarImpl(String) - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
JarMetrics - Interface in com.kirkk.analyzer.framework
 
JarMetricsImpl - Class in com.kirkk.analyzer.framework.bcelbundle
 
JarMetricsImpl(Jar) - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarMetricsImpl -
  -
JarPackage - Interface in com.kirkk.analyzer.framework
 
JarPackageImpl - Class in com.kirkk.analyzer.framework.bcelbundle
 
JarPackageImpl(String) - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarPackageImpl -
  -
JarRelationshipDecorator - Class in com.kirkk.analyzer.framework.bcelbundle
 
JarRelationshipDecorator(JarCollection) - -Constructor for class com.kirkk.analyzer.framework.bcelbundle.JarRelationshipDecorator -
  -
-
-

-M

-
-
main(String[]) - -Static method in class com.kirkk.analyzer.textui.DOTSummary -
  -
main(String[]) - -Static method in class com.kirkk.analyzer.textui.XMLUISummary -
  -
-
-

-N

-
-
nextClass() - -Method in class com.kirkk.analyzer.framework.jar.JarFile -
  -
nextJar() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
nextJar() - -Method in interface com.kirkk.analyzer.framework.JarCollection -
  -
nextJar() - -Method in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
-
-

-P

-
-
packages - -Variable in class com.kirkk.analyzer.framework.bcelbundle.JarImpl -
  -
PackageVisitor - Class in com.kirkk.analyzer.framework.bcel
 
PackageVisitor(JavaClass) - -Constructor for class com.kirkk.analyzer.framework.bcel.PackageVisitor -
  -
-
-

-S

-
-
setDestfile(File) - -Method in class com.kirkk.analyzer.textui.JarAnalyzerTask -
  -
setJarFilter(String) - -Method in class com.kirkk.analyzer.textui.JarAnalyzerTask -
  -
setPackageFilter(String) - -Method in class com.kirkk.analyzer.textui.JarAnalyzerTask -
  -
setSrcdir(File) - -Method in class com.kirkk.analyzer.textui.JarAnalyzerTask -
  -
setSummaryclass(String) - -Method in class com.kirkk.analyzer.textui.JarAnalyzerTask -
  -
Summary - Interface in com.kirkk.analyzer.textui
 
-
-

-T

-
-
toArray() - -Method in class com.kirkk.analyzer.framework.bcelbundle.JarCollectionImpl -
  -
toArray() - -Method in interface com.kirkk.analyzer.framework.JarCollection -
  -
toArray() - -Method in class com.kirkk.analyzer.framework.JarCollectionDecorator -
  -
-
-

-V

-
-
visitConstantClass(ConstantClass) - -Method in class com.kirkk.analyzer.framework.bcel.PackageVisitor -
  -
visitConstantString(ConstantString) - -Method in class com.kirkk.analyzer.framework.bcel.PackageVisitor -
  -
visitConstantUtf8(ConstantUtf8) - -Method in class com.kirkk.analyzer.framework.bcel.PackageVisitor -
  -
-
-

-X

-
-
XMLUISummary - Class in com.kirkk.analyzer.textui
 
XMLUISummary() - -Constructor for class com.kirkk.analyzer.textui.XMLUISummary -
  -
-
-A B C D E F G H I J M N P S T V X - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/index.html b/tools/docs/api/index.html deleted file mode 100644 index 685fdfe3..00000000 --- a/tools/docs/api/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - -JarAnalyzer API - - - - - - - - - - - -<H2> -Frame Alert</H2> - -<P> -This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. -<BR> -Link to<A HREF="overview-summary.html">Non-frame version.</A> - - - diff --git a/tools/docs/api/overview-frame.html b/tools/docs/api/overview-frame.html deleted file mode 100644 index 3f1c3e87..00000000 --- a/tools/docs/api/overview-frame.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - -Overview (JarAnalyzer API) - - - - - - - - - - - - - - - -
-
- - - - - -
All Classes -

- -Packages -
-com.kirkk.analyzer -
-com.kirkk.analyzer.framework -
-com.kirkk.analyzer.framework.bcel -
-com.kirkk.analyzer.framework.bcelbundle -
-com.kirkk.analyzer.framework.jar -
-com.kirkk.analyzer.textui -
-

- -

-  - - diff --git a/tools/docs/api/overview-summary.html b/tools/docs/api/overview-summary.html deleted file mode 100644 index 9e716fcd..00000000 --- a/tools/docs/api/overview-summary.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - -Overview (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -


-
-

-JarAnalyzer API -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Packages
com.kirkk.analyzer 
com.kirkk.analyzer.framework 
com.kirkk.analyzer.framework.bcel 
com.kirkk.analyzer.framework.bcelbundle 
com.kirkk.analyzer.framework.jar 
com.kirkk.analyzer.textui 
- -


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/overview-tree.html b/tools/docs/api/overview-tree.html deleted file mode 100644 index fb8819fc..00000000 --- a/tools/docs/api/overview-tree.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Class Hierarchy (JarAnalyzer API) - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For All Packages

-
-
-
Package Hierarchies:
com.kirkk.analyzer, com.kirkk.analyzer.framework, com.kirkk.analyzer.framework.bcel, com.kirkk.analyzer.framework.bcelbundle, com.kirkk.analyzer.framework.jar, com.kirkk.analyzer.textui
-
-

-Class Hierarchy -

- -

-Interface Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2006 Kirk Knoernschild - - diff --git a/tools/docs/api/package-list b/tools/docs/api/package-list deleted file mode 100644 index 45d4d02d..00000000 --- a/tools/docs/api/package-list +++ /dev/null @@ -1,6 +0,0 @@ -com.kirkk.analyzer -com.kirkk.analyzer.framework -com.kirkk.analyzer.framework.bcel -com.kirkk.analyzer.framework.bcelbundle -com.kirkk.analyzer.framework.jar -com.kirkk.analyzer.textui diff --git a/tools/docs/api/resources/inherit.gif b/tools/docs/api/resources/inherit.gif deleted file mode 100644 index c814867a..00000000 Binary files a/tools/docs/api/resources/inherit.gif and /dev/null differ diff --git a/tools/docs/api/stylesheet.css b/tools/docs/api/stylesheet.css deleted file mode 100644 index 6d31fdbc..00000000 --- a/tools/docs/api/stylesheet.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Javadoc style sheet */ - -/* Define colors, fonts and other style attributes here to override the defaults */ - -/* Page background color */ -body { background-color: #FFFFFF } - -/* Headings */ -h1 { font-size: 145% } - -/* Table colors */ -.TableHeadingColor { background: #CCCCFF } /* Dark mauve */ -.TableSubHeadingColor { background: #EEEEFF } /* Light mauve */ -.TableRowColor { background: #FFFFFF } /* White */ - -/* Font used in left-hand frame lists */ -.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif } -.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } -.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } - -/* Navigation bar fonts and colors */ -.NavBarCell1 { background-color:#EEEEFF;} /* Light mauve */ -.NavBarCell1Rev { background-color:#00008B;} /* Dark Blue */ -.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;} -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;} - -.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} -.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} - diff --git a/tools/jaranalyzer-1.2.jar b/tools/jaranalyzer-1.2.jar deleted file mode 100644 index 3f12026b..00000000 Binary files a/tools/jaranalyzer-1.2.jar and /dev/null differ diff --git a/tools/jaranalyzer.xsl b/tools/jaranalyzer.xsl deleted file mode 100644 index ea90d97d..00000000 --- a/tools/jaranalyzer.xsl +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - - - JarAnalyzer Analysis - - - - - - - -

JarAnalyzer Analysis

-

Run with JarAnalyzer on

-
- -
-

Summary

-
- [summary] - [jars] - [cycles] - [explanations] -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Jar NameTotal ClassesAbstract ClassesPackagesAbstractnessEfferentAfferentInstabilityDistance
- - #PK - - - -
- -
- -
-

Jars

-
- [summary] - [jars] - [cycles] - [explanations] -
- - - -

PK -

- - - - - - - -
Afferent Couplings: Efferent Couplings: Abstractness: Instability: Distance:
- - - - - - - - - - - - -
Uses JarsUsed by JarsCycles With
- - None - - - - #PK - -
-
-
-
- - None - - - - #PK - -
-
-
-
- - None - - - - #PK - -
-
-
-
-
- - - - - - - - - - - -
Packages within jarUnresolved Packages
- - None - - -
-
-
- - None - - - - -
-
-
-
-
- -
-

Cycles

-
- [summary] - [jars] - [cycles] - [explanations] -
- - -

has cycles with

- - None - - - -
-

-
- -
-
-

Explanations

-
- [summary] - [jars] - [cycles] - [explanations] -
- -

The following explanations are for quick reference. More detailed information can be found in the JarAnalyzer documentation.

- -

Number of Classes

-

The number of concrete and abstract classes (and interfaces) in the jar is an indicator of the extensibility of the jar.

-

Number of Packages

-

The number of packages in the jar.

-

Afferent Couplings

-

The number of other jars that depend upon classes within the jar is an indicator of the jar's responsibility.

-

Efferent Couplings

-

The number of other jars that the classes in the jar depend upon is an indicator of the jar's independence.

-

Abstractness

-

The ratio of the number of abstract classes (and interfaces) in the analyzed jar to the total number of classes in the analyzed jar.

-

The range for this metric is 0 to 1, with A=0 indicating a completely concrete jar and A=1 indicating a completely abstract jar.

-

Instability

-

The ratio of efferent coupling (Ce) to total coupling (Ce / (Ce + Ca)). This metric is an indicator of the jar's resilience to change.

-

The range for this metric is 0 to 1, with I=0 indicating a completely stable jar and I=1 indicating a completely instable jar.

-

Distance

-

The perpendicular distance of a jar from the idealized line A + I = 1. This metric is an indicator of the jar's balance between abstractness and stability.

-

A jar squarely on the main sequence is optimally balanced with respect to its abstractness and stability. Ideal jars are either completely abstract and stable (x=0, y=1) or completely concrete and instable (x=1, y=0).

-

The range for this metric is 0 to 1, with D=0 indicating a jar that is coincident with the main sequence and D=1 indicating a jar that is as far from the main sequence as possible.

-

Unresolved Packages

-

Packages not found in any of the jars analyzed. These can be filtered from output by specifying the packages to exlude in the Filter.properties file. Conversely, you can include jars containing these packages in the directory being analyzed.

-

These packages are excluded from all calculations and adding the jars containing these packages will result in modified metrics.

- - -
- -
diff --git a/tools/lib/bcel-5.2.jar b/tools/lib/bcel-5.2.jar deleted file mode 100644 index 2fa90ceb..00000000 Binary files a/tools/lib/bcel-5.2.jar and /dev/null differ diff --git a/tools/lib/com/kirkk/analyzer/framework/Filter.properties b/tools/lib/com/kirkk/analyzer/framework/Filter.properties deleted file mode 100644 index 4b541c0b..00000000 --- a/tools/lib/com/kirkk/analyzer/framework/Filter.properties +++ /dev/null @@ -1,2 +0,0 @@ -filter.packages = javax.*;java.*;org.omg*;org.ietf.jgss*;org.w3c.dom*;org.xml.sax*;sun.*;sunw.*;com.sun.* -filter.jars= \ No newline at end of file diff --git a/tools/lib/jakarta-regexp-1.3.jar b/tools/lib/jakarta-regexp-1.3.jar deleted file mode 100644 index d653a388..00000000 Binary files a/tools/lib/jakarta-regexp-1.3.jar and /dev/null differ diff --git a/tools/license.txt b/tools/license.txt deleted file mode 100644 index 11d09782..00000000 --- a/tools/license.txt +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2004, Kirk Knoernschild -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Kirk Knoernschild nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/tools/proguard.jar b/tools/proguard.jar deleted file mode 100644 index f262f7d7..00000000 Binary files a/tools/proguard.jar and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/README b/tools/proguard/proguard6.0.3/README deleted file mode 100644 index ec047fda..00000000 --- a/tools/proguard/proguard6.0.3/README +++ /dev/null @@ -1,42 +0,0 @@ -ProGuard, Java class file shrinker, optimizer, obfuscator, and preverifier -========================================================================== - -This distribution contains the following directories: - -- bin : simple wrapper scripts to run ProGuard, its GUI, and ReTrace -- lib : the main jars, compiled and ready to use with "java -jar ...." -- docs : the complete documentation, licenses, etc. in html format -- examples : some example configuration files - -It also contains the source code and builds scripts: - -- core : the ProGuard core -- retrace : the ReTrace tool -- gui : the ProGuard/ReTrace GUI -- gradle : the ProGuard Gradle plugin -- ant : the ProGuard Ant plugin -- wtk : the ProGuard WTK plugin -- annotations : the optional annotations to configure ProGuard -- buildscripts : various alternative build scripts - - -The best place to start is docs/index.html - - -Example -------- - -If you want to give ProGuard a spin right away, try processing the ProGuard -jar itself: - - cd examples/standalone - ../../bin/proguard.sh @ proguard.pro - -The resulting proguard_out.jar contains the same application, but it's a lot -smaller. - -Enjoy! - -https://www.guardsquare.com/proguard - -Copyright (c) 2002-2018 Eric Lafortune @ GuardSquare diff --git a/tools/proguard/proguard6.0.3/annotations/build.gradle b/tools/proguard/proguard6.0.3/annotations/build.gradle deleted file mode 100644 index 588ddbb9..00000000 --- a/tools/proguard/proguard6.0.3/annotations/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -// Gradle build script for the ProGuard annotations. - -apply plugin: 'java' - -sourceSets.main { - java { - srcDirs = ['src'] - } - resources { - srcDirs = ['src'] - include '**/*.properties' - include '**/*.gif' - include '**/*.png' - include '**/*.pro' - } -} diff --git a/tools/proguard/proguard6.0.3/annotations/build.sh b/tools/proguard/proguard6.0.3/annotations/build.sh deleted file mode 100644 index 004251b9..00000000 --- a/tools/proguard/proguard6.0.3/annotations/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for ProGuard. - -cd $(dirname "$0") - -source ../buildscripts/functions.sh - -MAIN_CLASS=proguard.annotation.* - -compile $MAIN_CLASS && \ -createjar "$ANNOTATIONS_JAR" || exit 1 diff --git a/tools/proguard/proguard6.0.3/annotations/build.xml b/tools/proguard/proguard6.0.3/annotations/build.xml deleted file mode 100644 index e6dc8a93..00000000 --- a/tools/proguard/proguard6.0.3/annotations/build.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/annotations/makefile b/tools/proguard/proguard6.0.3/annotations/makefile deleted file mode 100644 index ef2ce97c..00000000 --- a/tools/proguard/proguard6.0.3/annotations/makefile +++ /dev/null @@ -1,7 +0,0 @@ -# GNU/Linux makefile for the ProGuard annotations. - -MAIN_CLASS = proguard/annotation/* -CLASSPATH = -TARGET = annotations - -include ../buildscripts/functions.mk diff --git a/tools/proguard/proguard6.0.3/annotations/pom.xml b/tools/proguard/proguard6.0.3/annotations/pom.xml deleted file mode 100644 index c177c9cf..00000000 --- a/tools/proguard/proguard6.0.3/annotations/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - ../buildscripts/pom.xml - - proguard-annotations - [${project.groupId}] ${project.artifactId} - - - src - - - maven-source-plugin - - - maven-compiler-plugin - - - maven-jar-plugin - - - maven-javadoc-plugin - - - - diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/Keep.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/Keep.java deleted file mode 100644 index 2e5ad049..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/Keep.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies not to optimize or obfuscate the annotated class or - * class member as an entry point. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface Keep {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepApplication.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepApplication.java deleted file mode 100644 index 072a80db..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep the annotated class as an application, - * together with its a main method. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepApplication {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepClassMemberNames.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepClassMemberNames.java deleted file mode 100644 index 4adb5ec3..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepClassMemberNames.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all class members of the annotated class - * from being optimized or obfuscated as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepClassMemberNames {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepClassMembers.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepClassMembers.java deleted file mode 100644 index 9cdfc679..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepClassMembers.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all class members of the annotated class - * from being shrunk, optimized, or obfuscated as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepClassMembers {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepGettersSetters.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepGettersSetters.java deleted file mode 100644 index 37d7cc77..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepGettersSetters.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all getters and setters of the annotated - * class from being shrunk, optimized, or obfuscated as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepGettersSetters {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepImplementations.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepImplementations.java deleted file mode 100644 index b2bce128..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepImplementations.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all implementations or extensions of the - * annotated class as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepImplementations {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepName.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepName.java deleted file mode 100644 index ec1574bb..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepName.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies not to optimize or obfuscate the annotated class or - * class member as an entry point. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepName {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicClassMemberNames.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicClassMemberNames.java deleted file mode 100644 index e951f197..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicClassMemberNames.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all public class members of the annotated - * class from being optimized or obfuscated as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepPublicClassMemberNames {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicClassMembers.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicClassMembers.java deleted file mode 100644 index 480c0364..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicClassMembers.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all public class members of the annotated - * class from being shrunk, optimized, or obfuscated as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepPublicClassMembers {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicGettersSetters.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicGettersSetters.java deleted file mode 100644 index 3b6f8e6a..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicGettersSetters.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all public getters and setters of the - * annotated class from being shrunk, optimized, or obfuscated as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepPublicGettersSetters {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicImplementations.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicImplementations.java deleted file mode 100644 index c777d9be..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicImplementations.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all public implementations or extensions - * of the annotated class as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepPublicImplementations {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java deleted file mode 100644 index f4511ea0..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all public or protected class members of - * the annotated class from being optimized or obfuscated as entry points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepPublicProtectedClassMemberNames {} diff --git a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java b/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java deleted file mode 100644 index 5b195bbf..00000000 --- a/tools/proguard/proguard6.0.3/annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - */ -package proguard.annotation; - -import java.lang.annotation.*; - -/** - * This annotation specifies to keep all public or protected class members of - * the annotated class from being shrunk, optimized, or obfuscated as entry - * points. - * - * @author Eric Lafortune - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.CLASS) -@Documented -public @interface KeepPublicProtectedClassMembers {} diff --git a/tools/proguard/proguard6.0.3/ant/build.gradle b/tools/proguard/proguard6.0.3/ant/build.gradle deleted file mode 100644 index f5db0adb..00000000 --- a/tools/proguard/proguard6.0.3/ant/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -// Gradle build script for the ProGuard Ant task. - -apply plugin: 'java' - -repositories { - jcenter() -} - -sourceSets.main { - java { - srcDirs = ['src'] - } - resources { - srcDirs = ['src'] - include '**/*.properties' - include '**/*.gif' - include '**/*.png' - include '**/*.pro' - } -} - -dependencies { - compile project(':core') - compile 'org.apache.ant:ant:1.9.7' -} diff --git a/tools/proguard/proguard6.0.3/ant/build.sh b/tools/proguard/proguard6.0.3/ant/build.sh deleted file mode 100644 index cc266340..00000000 --- a/tools/proguard/proguard6.0.3/ant/build.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for the ProGuard Ant task. - -cd $(dirname "$0") - -source ../buildscripts/functions.sh - -MAIN_CLASS=proguard.ant.ProGuardTask - -ANT_HOME=${ANT_HOME:-/usr/local/java/ant} - -ANT_JAR=$ANT_HOME/lib/ant.jar - -# Make sure the Ant jar is present. -if [ ! -f "$ANT_JAR" ]; then - echo "Please make sure the environment variable ANT_HOME is set correctly," - echo "if you want to compile the optional ProGuard Ant task." - exit 1 -fi - -# Make sure the ProGuard core has been compiled. -if [ ! -d ../core/$OUT ]; then - ../core/build.sh || exit 1 -fi - -# Compile and package. -export CLASSPATH=../core/$OUT:$ANT_JAR - -compile $MAIN_CLASS && \ -updatejar "$PROGUARD_JAR" || exit 1 diff --git a/tools/proguard/proguard6.0.3/ant/build.xml b/tools/proguard/proguard6.0.3/ant/build.xml deleted file mode 100644 index 79872e9c..00000000 --- a/tools/proguard/proguard6.0.3/ant/build.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/ant/makefile b/tools/proguard/proguard6.0.3/ant/makefile deleted file mode 100644 index feb0883e..00000000 --- a/tools/proguard/proguard6.0.3/ant/makefile +++ /dev/null @@ -1,15 +0,0 @@ -# GNU/Linux makefile for the ProGuard Ant task. - -ifndef ANT_HOME -ANT_HOME = /usr/local/java/ant -endif - -MAIN_CLASS = proguard/ant/ProGuardTask -ANT_JAR = $(ANT_HOME)/lib/ant.jar -CLASSPATH = ../core/$(OUT):$(ANT_JAR) -TARGET = proguard -UPDATE_JAR = true - -include ../buildscripts/functions.mk - -$(ANT_JAR): ; $(error Please make sure ANT_HOME is set correctly) diff --git a/tools/proguard/proguard6.0.3/ant/pom.xml b/tools/proguard/proguard6.0.3/ant/pom.xml deleted file mode 100644 index 3b381d70..00000000 --- a/tools/proguard/proguard6.0.3/ant/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - ../buildscripts/pom.xml - - proguard-anttask - [${project.groupId}] ${project.artifactId} - - - src - - - maven-source-plugin - - - maven-compiler-plugin - - - maven-jar-plugin - - - - true - - - - - - maven-javadoc-plugin - - - - - src - - **/*.java - - - - - - - - ${project.groupId} - proguard-base - ${project.version} - - - org.apache.ant - ant - 1.7.0 - provided - - - diff --git a/tools/proguard/proguard6.0.3/ant/settings.gradle b/tools/proguard/proguard6.0.3/ant/settings.gradle deleted file mode 100644 index 55d8d75b..00000000 --- a/tools/proguard/proguard6.0.3/ant/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'core' diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ClassPathElement.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ClassPathElement.java deleted file mode 100644 index 830a9360..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ClassPathElement.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import org.apache.tools.ant.*; -import org.apache.tools.ant.types.*; -import proguard.*; -import proguard.util.ListUtil; - -import java.io.File; - -/** - * This FileSet represents a class path entry (or a set of class path entries) - * in Ant. - * - * @author Eric Lafortune - */ -public class ClassPathElement extends Path -{ - private String filter; - private String apkFilter; - private String jarFilter; - private String aarFilter; - private String warFilter; - private String earFilter; - private String zipFilter; - - - /** - * @see Path#Path(Project) - */ - public ClassPathElement(Project project) - { - super(project); - } - - - /** - * Adds the contents of this class path element to the given class path. - * @param classPath the class path to be extended. - * @param output specifies whether this is an output entry or not. - */ - public void appendClassPathEntriesTo(ClassPath classPath, boolean output) - { - File baseDir = getProject().getBaseDir(); - String[] fileNames; - - if (isReference()) - { - // Get the referenced path or file set. - Object referencedObject = getCheckedRef(DataType.class, - DataType.class.getName()); - - if (referencedObject instanceof Path) - { - Path path = (Path)referencedObject; - - // Get the names of the files in the referenced path. - fileNames = path.list(); - } - else if (referencedObject instanceof AbstractFileSet) - { - AbstractFileSet fileSet = (AbstractFileSet)referencedObject; - - // Get the names of the existing input files in the referenced file set. - DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); - baseDir = scanner.getBasedir(); - fileNames = scanner.getIncludedFiles(); - } - else - { - throw new BuildException("The refid attribute doesn't point to a element or a element"); - } - } - else - { - // Get the names of the files in this path. - fileNames = list(); - } - - if (output) - { - if (fileNames.length != 1) - { - throw new BuildException("The element must specify exactly one file or directory ["+fileNames.length+"]"); - } - } - //else - //{ - // if (fileNames.length < 1) - // { - // throw new BuildException("The element must specify at least one file or directory"); - // } - //} - - for (int index = 0; index < fileNames.length; index++) - { - // Create a new class path entry, with the proper file name and - // any filters. - String fileName = fileNames[index]; - File file = new File(fileName); - - ClassPathEntry entry = - new ClassPathEntry(file.isAbsolute() ? file : new File(baseDir, fileName), - output); - entry.setFilter(ListUtil.commaSeparatedList(filter)); - entry.setApkFilter(ListUtil.commaSeparatedList(apkFilter)); - entry.setJarFilter(ListUtil.commaSeparatedList(jarFilter)); - entry.setAarFilter(ListUtil.commaSeparatedList(aarFilter)); - entry.setWarFilter(ListUtil.commaSeparatedList(warFilter)); - entry.setEarFilter(ListUtil.commaSeparatedList(earFilter)); - entry.setZipFilter(ListUtil.commaSeparatedList(zipFilter)); - - // Add it to the class path. - classPath.add(entry); - } - } - - - // Ant task attributes. - - /** - * @deprecated Use {@link #setLocation(File)} instead. - */ - public void setFile(File file) - { - setLocation(file); - } - - - /** - * @deprecated Use {@link #setLocation(File)} instead. - */ - public void setDir(File file) - { - setLocation(file); - } - - - /** - * @deprecated Use {@link #setLocation(File)} instead. - */ - public void setName(File file) - { - setLocation(file); - } - - - public void setFilter(String filter) - { - this.filter = filter; - } - - - public void setApkfilter(String apkFilter) - { - this.apkFilter = apkFilter; - } - - - public void setJarfilter(String jarFilter) - { - this.jarFilter = jarFilter; - } - - - public void setAarfilter(String aarFilter) - { - this.aarFilter = aarFilter; - } - - - public void setWarfilter(String warFilter) - { - this.warFilter = warFilter; - } - - - public void setEarfilter(String earFilter) - { - this.earFilter = earFilter; - } - - - public void setZipfilter(String zipFilter) - { - this.zipFilter = zipFilter; - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ClassSpecificationElement.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ClassSpecificationElement.java deleted file mode 100644 index 6b80115b..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ClassSpecificationElement.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.types.DataType; -import proguard.*; -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; - -import java.util.*; - -/** - * This DataType represents a class specification in Ant. - * - * @author Eric Lafortune - */ -public class ClassSpecificationElement extends DataType -{ - private static final String ANY_CLASS_KEYWORD = "*"; - - private String access; - private String annotation; - private String type; - private String name; - private String extendsAnnotation; - private String extends_; - private List fieldSpecifications = new ArrayList(); - private List methodSpecifications = new ArrayList(); - - - /** - * Adds the contents of this class specification element to the given list. - * @param classSpecifications the class specifications to be extended. - */ - public void appendTo(List classSpecifications) - { - // Get the referenced file set, or else this one. - ClassSpecificationElement classSpecificationElement = isReference() ? - (ClassSpecificationElement)getCheckedRef(this.getClass(), - this.getClass().getName()) : - this; - - ClassSpecification classSpecification = - createClassSpecification(classSpecificationElement); - - // Add it to the list. - classSpecifications.add(classSpecification); - } - - - /** - * Creates a new class specification corresponding to the contents of this - * class specification element. - */ - protected ClassSpecification createClassSpecification(ClassSpecificationElement classSpecificationElement) - { - String access = classSpecificationElement.access; - String annotation = classSpecificationElement.annotation; - String type = classSpecificationElement.type; - String name = classSpecificationElement.name; - String extendsAnnotation = classSpecificationElement.extendsAnnotation; - String extends_ = classSpecificationElement.extends_; - - // For backward compatibility, allow a single "*" wildcard to match - // any class. - if (name != null && - name.equals(ANY_CLASS_KEYWORD)) - { - name = null; - } - - ClassSpecification classSpecification = - new ClassSpecification(null, - requiredAccessFlags(true, access, type), - requiredAccessFlags(false, access, type), - annotation != null ? ClassUtil.internalType(annotation) : null, - name != null ? ClassUtil.internalClassName(name) : null, - extendsAnnotation != null ? ClassUtil.internalType(extendsAnnotation) : null, - extends_ != null ? ClassUtil.internalClassName(extends_) : null); - - for (int index = 0; index < fieldSpecifications.size(); index++) - { - classSpecification.addField((MemberSpecification)fieldSpecifications.get(index)); - } - - for (int index = 0; index < methodSpecifications.size(); index++) - { - classSpecification.addMethod((MemberSpecification)methodSpecifications.get(index)); - } - - return classSpecification; - } - - - // Ant task attributes. - - public void setAccess(String access) - { - this.access = access; - } - - - public void setAnnotation(String annotation) - { - this.annotation = annotation; - } - - - public void setType(String type) - { - this.type = type; - } - - - public void setName(String name) - { - this.name = name; - } - - - public void setExtendsannotation(String extendsAnnotation) - { - this.extendsAnnotation = extendsAnnotation; - } - - - public void setExtends(String extends_) - { - this.extends_ = extends_; - } - - - public void setImplements(String implements_) - { - this.extends_ = implements_; - } - - - // Ant task nested elements. - - public void addConfiguredField(MemberSpecificationElement memberSpecificationElement) - { - if (fieldSpecifications == null) - { - fieldSpecifications = new ArrayList(); - } - - memberSpecificationElement.appendTo(fieldSpecifications, - false, - false); - } - - - public void addConfiguredMethod(MemberSpecificationElement memberSpecificationElement) - { - if (methodSpecifications == null) - { - methodSpecifications = new ArrayList(); - } - - memberSpecificationElement.appendTo(methodSpecifications, - true, - false); - } - - - public void addConfiguredConstructor(MemberSpecificationElement memberSpecificationElement) - { - if (methodSpecifications == null) - { - methodSpecifications = new ArrayList(); - } - - memberSpecificationElement.appendTo(methodSpecifications, - true, - true); - } - - - // Small utility methods. - - private int requiredAccessFlags(boolean set, - String access, - String type) - throws BuildException - { - int accessFlags = 0; - - if (access != null) - { - StringTokenizer tokenizer = new StringTokenizer(access, " ,"); - while (tokenizer.hasMoreTokens()) - { - String token = tokenizer.nextToken(); - - if (token.startsWith("!") ^ set) - { - String strippedToken = token.startsWith("!") ? - token.substring(1) : - token; - - int accessFlag = - strippedToken.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC : - strippedToken.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL : - strippedToken.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT : - strippedToken.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC : - strippedToken.equals(JavaConstants.ACC_ANNOTATION) ? ClassConstants.ACC_ANNOTATION : - 0; - - if (accessFlag == 0) - { - throw new BuildException("Incorrect class access modifier ["+strippedToken+"]"); - } - - accessFlags |= accessFlag; - } - } - } - - if (type != null && (type.startsWith("!") ^ set)) - { - int accessFlag = - type.equals("class") ? 0 : - type.equals( JavaConstants.ACC_INTERFACE) || - type.equals("!" + JavaConstants.ACC_INTERFACE) ? ClassConstants.ACC_INTERFACE : - type.equals( JavaConstants.ACC_ENUM) || - type.equals("!" + JavaConstants.ACC_ENUM) ? ClassConstants.ACC_ENUM : - -1; - - if (accessFlag == -1) - { - throw new BuildException("Incorrect class type ["+type+"]"); - } - - accessFlags |= accessFlag; - } - - return accessFlags; - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ConfigurationElement.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ConfigurationElement.java deleted file mode 100644 index 0e537430..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ConfigurationElement.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import org.apache.tools.ant.*; -import org.apache.tools.ant.types.*; -import proguard.*; - -import java.io.*; -import java.util.Properties; - -/** - * This DataType represents a reference to an XML-style ProGuard configuration - * in Ant, or a file set of ProGuard-style configuration files. - * - * @author Eric Lafortune - */ -public class ConfigurationElement extends FileSet -{ - /** - * Adds the contents of this configuration element to the given - * configuration. - * @param configuration the configuration to be extended. - */ - public void appendTo(Configuration configuration) - { - File baseDir; - String[] fileNames; - - if (isReference()) - { - // Get the referenced path or file set. - Object referencedObject = getCheckedRef(Object.class, - Object.class.getName()); - - if (referencedObject instanceof ConfigurationTask) - { - // The reference doesn't point to a file set, but to a - // configuration task. - ConfigurationTask configurationTask = - (ConfigurationTask)referencedObject; - - // Append the contents of the referenced configuration to the - // current configuration. - configurationTask.appendTo(configuration); - - return; - } - else if (referencedObject instanceof AbstractFileSet) - { - AbstractFileSet fileSet = (AbstractFileSet)referencedObject; - - // Get the names of the existing input files in the referenced file set. - DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); - baseDir = scanner.getBasedir(); - fileNames = scanner.getIncludedFiles(); - } - else - { - throw new BuildException("The refid attribute doesn't point to a element or a element"); - } - } - else - { - // Get the names of the existing input files in the referenced file set. - DirectoryScanner scanner = getDirectoryScanner(getProject()); - baseDir = scanner.getBasedir(); - fileNames = scanner.getIncludedFiles(); - } - - // Get the combined system properties and Ant properties, for - // replacing ProGuard-style properties ('<...>'). - Properties properties = new Properties(); - properties.putAll(getProject().getProperties()); - - try - { - // Append the contents of the configuration files to the current - // configuration. - for (int index = 0; index < fileNames.length; index++) - { - File configurationFile = new File(baseDir, fileNames[index]); - - ConfigurationParser parser = - new ConfigurationParser(configurationFile, properties); - try - { - parser.parse(configuration); - } - catch (ParseException ex) - { - throw new BuildException(ex.getMessage()); - } - finally - { - parser.close(); - } - } - } - catch (IOException ex) - { - throw new BuildException(ex.getMessage()); - } - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ConfigurationTask.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ConfigurationTask.java deleted file mode 100644 index 28f6715d..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ConfigurationTask.java +++ /dev/null @@ -1,480 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import org.apache.tools.ant.*; -import proguard.*; - -import java.io.IOException; -import java.util.*; - -/** - * This Task allows to define a ProGuard configuration from Ant. - * - * @author Eric Lafortune - */ -public class ConfigurationTask extends Task -{ - protected final Configuration configuration = new Configuration(); - - - /** - * Adds the contents of this configuration task to the given configuration. - * @param configuration the configuration to be extended. - */ - public void appendTo(Configuration configuration) - { - // Append all of these configuration entries to the given configuration. - configuration.programJars = extendClassPath(configuration.programJars, - this.configuration.programJars); - - configuration.libraryJars = extendClassPath(configuration.libraryJars, - this.configuration.libraryJars); - - configuration.keep = extendClassSpecifications(configuration.keep, - this.configuration.keep); - - configuration.keepDirectories = extendList(configuration.keepDirectories, - this.configuration.keepDirectories); - - configuration.whyAreYouKeeping = extendClassSpecifications(configuration.whyAreYouKeeping, - this.configuration.whyAreYouKeeping); - - configuration.optimizations = extendClassSpecifications(configuration.optimizations, - this.configuration.optimizations); - - configuration.assumeNoSideEffects = extendClassSpecifications(configuration.assumeNoSideEffects, - this.configuration.assumeNoSideEffects); - - configuration.assumeNoExternalSideEffects = extendClassSpecifications(configuration.assumeNoExternalSideEffects, - this.configuration.assumeNoExternalSideEffects); - - configuration.assumeNoEscapingParameters = extendClassSpecifications(configuration.assumeNoEscapingParameters, - this.configuration.assumeNoEscapingParameters); - - configuration.assumeNoExternalReturnValues = extendClassSpecifications(configuration.assumeNoExternalReturnValues, - this.configuration.assumeNoExternalReturnValues); - - configuration.keepPackageNames = extendList(configuration.keepPackageNames, - this.configuration.keepPackageNames); - - configuration.keepAttributes = extendList(configuration.keepAttributes, - this.configuration.keepAttributes); - - configuration.adaptClassStrings = extendList(configuration.adaptClassStrings, - this.configuration.adaptClassStrings); - - configuration.adaptResourceFileNames = extendList(configuration.adaptResourceFileNames, - this.configuration.adaptResourceFileNames); - - configuration.adaptResourceFileContents = extendList(configuration.adaptResourceFileContents, - this.configuration.adaptResourceFileContents); - - configuration.note = extendList(configuration.note, - this.configuration.note); - - configuration.warn = extendList(configuration.warn, - this.configuration.warn); - } - - - // Ant task nested elements. - - public void addConfiguredInjar(ClassPathElement classPathElement) - { - configuration.programJars = extendClassPath(configuration.programJars, - classPathElement, - false); - } - - - public void addConfiguredOutjar(ClassPathElement classPathElement) - { - configuration.programJars = extendClassPath(configuration.programJars, - classPathElement, - true); - } - - - public void addConfiguredLibraryjar(ClassPathElement classPathElement) - { - configuration.libraryJars = extendClassPath(configuration.libraryJars, - classPathElement, - false); - } - - - public void addConfiguredKeepdirectory(FilterElement filterElement) - { - configuration.keepDirectories = extendFilter(configuration.keepDirectories, - filterElement); - } - - - public void addConfiguredKeepdirectories(FilterElement filterElement) - { - configuration.keepDirectories = extendFilter(configuration.keepDirectories, - filterElement); - } - - - public void addConfiguredKeep(KeepSpecificationElement keepSpecificationElement) - { - configuration.keep = extendKeepSpecifications(configuration.keep, - keepSpecificationElement, - true, - false); - } - - - public void addConfiguredKeepclassmembers(KeepSpecificationElement keepSpecificationElement) - { - configuration.keep = extendKeepSpecifications(configuration.keep, - keepSpecificationElement, - false, - false); - } - - - public void addConfiguredKeepclasseswithmembers(KeepSpecificationElement keepSpecificationElement) - { - configuration.keep = extendKeepSpecifications(configuration.keep, - keepSpecificationElement, - true, - true); - } - - - public void addConfiguredKeepnames(KeepSpecificationElement keepSpecificationElement) - { - // Set the shrinking flag, based on the name (backward compatibility). - keepSpecificationElement.setAllowshrinking(true); - - configuration.keep = extendKeepSpecifications(configuration.keep, - keepSpecificationElement, - true, - false); - } - - - public void addConfiguredKeepclassmembernames(KeepSpecificationElement keepSpecificationElement) - { - // Set the shrinking flag, based on the name (backward compatibility). - keepSpecificationElement.setAllowshrinking(true); - - configuration.keep = extendKeepSpecifications(configuration.keep, - keepSpecificationElement, - false, - false); - } - - - public void addConfiguredKeepclasseswithmembernames(KeepSpecificationElement keepSpecificationElement) - { - // Set the shrinking flag, based on the name (backward compatibility). - keepSpecificationElement.setAllowshrinking(true); - - configuration.keep = extendKeepSpecifications(configuration.keep, - keepSpecificationElement, - true, - true); - } - - - public void addConfiguredWhyareyoukeeping(ClassSpecificationElement classSpecificationElement) - { - configuration.whyAreYouKeeping = extendClassSpecifications(configuration.whyAreYouKeeping, - classSpecificationElement); - } - - - public void addConfiguredAssumenosideeffects(ClassSpecificationElement classSpecificationElement) - { - configuration.assumeNoSideEffects = extendClassSpecifications(configuration.assumeNoSideEffects, - classSpecificationElement); - } - - - public void addConfiguredAssumenoexternalsideeffects(ClassSpecificationElement classSpecificationElement) - { - configuration.assumeNoExternalSideEffects = extendClassSpecifications(configuration.assumeNoExternalSideEffects, - classSpecificationElement); - } - - - public void addConfiguredAssumenoescapingparameters(ClassSpecificationElement classSpecificationElement) - { - configuration.assumeNoEscapingParameters = extendClassSpecifications(configuration.assumeNoEscapingParameters, - classSpecificationElement); - } - - - public void addConfiguredAssumenoexternalreturnvalues(ClassSpecificationElement classSpecificationElement) - { - configuration.assumeNoExternalReturnValues = extendClassSpecifications(configuration.assumeNoExternalReturnValues, - classSpecificationElement); - } - - - public void addConfiguredOptimizations(FilterElement filterElement) - { - addConfiguredOptimization(filterElement); - } - - - public void addConfiguredOptimization(FilterElement filterElement) - { - configuration.optimizations = extendFilter(configuration.optimizations, - filterElement); - } - - - public void addConfiguredKeeppackagename(FilterElement filterElement) - { - configuration.keepPackageNames = extendFilter(configuration.keepPackageNames, - filterElement, - true); - } - - - public void addConfiguredKeeppackagenames(FilterElement filterElement) - { - configuration.keepPackageNames = extendFilter(configuration.keepPackageNames, - filterElement, - true); - } - - - public void addConfiguredKeepattributes(FilterElement filterElement) - { - addConfiguredKeepattribute(filterElement); - } - - - public void addConfiguredKeepattribute(FilterElement filterElement) - { - configuration.keepAttributes = extendFilter(configuration.keepAttributes, - filterElement); - } - - - public void addConfiguredAdaptclassstrings(FilterElement filterElement) - { - configuration.adaptClassStrings = extendFilter(configuration.adaptClassStrings, - filterElement, true); - } - - - public void addConfiguredAdaptresourcefilenames(FilterElement filterElement) - { - configuration.adaptResourceFileNames = extendFilter(configuration.adaptResourceFileNames, - filterElement); - } - - - public void addConfiguredAdaptresourcefilecontents(FilterElement filterElement) - { - configuration.adaptResourceFileContents = extendFilter(configuration.adaptResourceFileContents, - filterElement); - } - - - public void addConfiguredDontnote(FilterElement filterElement) - { - configuration.note = extendFilter(configuration.note, filterElement, true); - } - - - public void addConfiguredDontwarn(FilterElement filterElement) - { - configuration.warn = extendFilter(configuration.warn, filterElement, true); - } - - - public void addConfiguredConfiguration(ConfigurationElement configurationElement) - { - configurationElement.appendTo(configuration); - } - - - // Implementations for Task. - - public void addText(String text) throws BuildException - { - try - { - Project project = getProject(); - - // Replace Ant-style properties ('${...}'). - String arg = project.replaceProperties(text); - - // Get the combined system properties and Ant properties, for - // replacing ProGuard-style properties ('<...>'). - Properties properties = new Properties(); - properties.putAll(project.getProperties()); - - ConfigurationParser parser = new ConfigurationParser(arg, - "embedded configuration", - project.getBaseDir(), - properties); - - try - { - parser.parse(configuration); - } - catch (ParseException ex) - { - throw new BuildException(ex.getMessage()); - } - finally - { - parser.close(); - } - } - catch (IOException ex) - { - throw new BuildException(ex.getMessage()); - } - } - - - // Small utility methods. - - private ClassPath extendClassPath(ClassPath classPath, - ClassPathElement classPathElement, - boolean output) - { - if (classPath == null) - { - classPath = new ClassPath(); - } - - classPathElement.appendClassPathEntriesTo(classPath, - output); - - return classPath; - } - - - private ClassPath extendClassPath(ClassPath classPath, - ClassPath additionalClassPath) - { - if (additionalClassPath != null) - { - if (classPath == null) - { - classPath = new ClassPath(); - } - - classPath.addAll(additionalClassPath); - } - - return classPath; - } - - - private List extendKeepSpecifications(List keepSpecifications, - KeepSpecificationElement keepSpecificationElement, - boolean markClasses, - boolean markClassesConditionally) - { - if (keepSpecifications == null) - { - keepSpecifications = new ArrayList(); - } - - keepSpecificationElement.appendTo(keepSpecifications, - markClasses, - markClassesConditionally); - - return keepSpecifications; - } - - - private List extendClassSpecifications(List classSpecifications, - ClassSpecificationElement classSpecificationElement) - { - if (classSpecifications == null) - { - classSpecifications = new ArrayList(); - } - - classSpecificationElement.appendTo(classSpecifications); - - return classSpecifications; - } - - - private List extendClassSpecifications(List classSpecifications, - List additionalClassSpecifications) - { - if (additionalClassSpecifications != null) - { - if (classSpecifications == null) - { - classSpecifications = new ArrayList(); - } - - classSpecifications.addAll(additionalClassSpecifications); - } - - return classSpecifications; - } - - - private List extendFilter(List filter, - FilterElement filterElement) - { - return extendFilter(filter, filterElement, false); - } - - - private List extendFilter(List filter, - FilterElement filterElement, - boolean internal) - { - if (filter == null) - { - filter = new ArrayList(); - } - - filterElement.appendTo(filter, internal); - - return filter; - } - - - private List extendList(List list, - List additionalList) - { - if (additionalList != null) - { - if (list == null) - { - list = new ArrayList(); - } - - list.addAll(additionalList); - } - - return list; - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/FilterElement.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/FilterElement.java deleted file mode 100644 index f167ddee..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/FilterElement.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import org.apache.tools.ant.types.DataType; -import proguard.classfile.util.ClassUtil; -import proguard.util.ListUtil; - -import java.util.List; - -/** - * This DataType represents a name filter in Ant. - * - * @author Eric Lafortune - */ -public class FilterElement extends DataType -{ - private String filter; - - - /** - * Adds the contents of this element to the given name filter. - * @param filter the list of attributes to be extended. - * @param internal specifies whether the filter string should be converted - * to internal types. - */ - public void appendTo(List filter, boolean internal) - { - // Get the referenced element, or else this one. - FilterElement filterElement = isReference() ? - (FilterElement)getCheckedRef(this.getClass(), - this.getClass().getName()) : - this; - - String filterString = filterElement.filter; - - if (filterString == null) - { - // Clear the filter to keep all names. - filter.clear(); - } - else - { - if (internal) - { - filterString = ClassUtil.internalClassName(filterString); - } - - // Append the filter. - filter.addAll(ListUtil.commaSeparatedList(filterString)); - } - } - - - // Ant task attributes. - - public void setName(String name) - { - this.filter = name; - } - - - public void setFilter(String filter) - { - this.filter = filter; - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/KeepSpecificationElement.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/KeepSpecificationElement.java deleted file mode 100644 index 7771cb6c..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/KeepSpecificationElement.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import proguard.KeepClassSpecification; - -import java.util.List; - -/** - * This DataType represents a class specification in Ant. - * - * @author Eric Lafortune - */ -public class KeepSpecificationElement extends ClassSpecificationElement -{ - private boolean markDescriptorClasses; - private boolean markCodeAttributes; - private boolean allowShrinking; - private boolean allowOptimization; - private boolean allowObfuscation; - - - /** - * Adds the contents of this class specification element to the given list. - * @param keepSpecifications the class specifications to be extended. - * @param markClasses specifies whether to mark the classes. - * @param markConditionally specifies whether to mark the classes - * and class members conditionally. - */ - public void appendTo(List keepSpecifications, - boolean markClasses, - boolean markConditionally) - { - // Get the referenced file set, or else this one. - KeepSpecificationElement keepSpecificationElement = isReference() ? - (KeepSpecificationElement)getCheckedRef(this.getClass(), - this.getClass().getName()) : - this; - - KeepClassSpecification keepClassSpecification = - new KeepClassSpecification(markClasses, - markConditionally, - markDescriptorClasses, - markCodeAttributes, - allowShrinking, - allowOptimization, - allowObfuscation, - null, - createClassSpecification(keepSpecificationElement)); - - // Add it to the list. - keepSpecifications.add(keepClassSpecification); - } - - - // Ant task attributes. - - public void setIncludedescriptorclasses(boolean markDescriptorClasses) - { - this.markDescriptorClasses = markDescriptorClasses; - } - - - public void setIncludecode(boolean markCodeAttributes) - { - this.markCodeAttributes = markCodeAttributes; - } - - - public void setAllowshrinking(boolean allowShrinking) - { - this.allowShrinking = allowShrinking; - } - - - public void setAllowoptimization(boolean allowOptimization) - { - this.allowOptimization = allowOptimization; - } - - - public void setAllowobfuscation(boolean allowObfuscation) - { - this.allowObfuscation = allowObfuscation; - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/MemberSpecificationElement.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/MemberSpecificationElement.java deleted file mode 100644 index 6d7075bf..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/MemberSpecificationElement.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.types.DataType; -import proguard.MemberSpecification; -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; -import proguard.util.ListUtil; - -import java.util.*; - -/** - * This DataType represents a class member specification in Ant. - * - * @author Eric Lafortune - */ -public class MemberSpecificationElement extends DataType -{ - private String access; - private String annotation; - private String type; - private String name; - private String parameters; - - - /** - * Adds the contents of this class member specification element to the given - * list. - * @param memberSpecifications the class member specifications to be - * extended. - * @param isMethod specifies whether this specification - * refers to a method. - * @param isConstructor specifies whether this specification - * refers to a constructor. - */ - public void appendTo(List memberSpecifications, - boolean isMethod, - boolean isConstructor) - { - // Get the referenced file set, or else this one. - MemberSpecificationElement memberSpecificationElement = isReference() ? - (MemberSpecificationElement)getCheckedRef(this.getClass(), - this.getClass().getName()) : - this; - - // Create a new class member specification. - String access = memberSpecificationElement.access; - String type = memberSpecificationElement.type; - String annotation = memberSpecificationElement.annotation; - String name = memberSpecificationElement.name; - String parameters = memberSpecificationElement.parameters; - - // Perform some basic conversions and checks on the attributes. - if (annotation != null) - { - annotation = ClassUtil.internalType(annotation); - } - - if (isMethod) - { - if (isConstructor) - { - if (type != null) - { - throw new BuildException("Type attribute not allowed in constructor specification ["+type+"]"); - } - - if (parameters != null) - { - type = JavaConstants.TYPE_VOID; - } - - name = ClassConstants.METHOD_NAME_INIT; - } - else if ((type != null) ^ (parameters != null)) - { - throw new BuildException("Type and parameters attributes must always be present in combination in method specification"); - } - } - else - { - if (parameters != null) - { - throw new BuildException("Parameters attribute not allowed in field specification ["+parameters+"]"); - } - } - - List parameterList = ListUtil.commaSeparatedList(parameters); - - String descriptor = - parameters != null ? ClassUtil.internalMethodDescriptor(type, parameterList) : - type != null ? ClassUtil.internalType(type) : - null; - - MemberSpecification memberSpecification = - new MemberSpecification(requiredAccessFlags(true, access), - requiredAccessFlags(false, access), - annotation, - name, - descriptor); - - // Add it to the list. - memberSpecifications.add(memberSpecification); - } - - - // Ant task attributes. - - public void setAccess(String access) - { - this.access = access; - } - - - public void setAnnotation(String annotation) - { - this.annotation = annotation; - } - - - public void setType(String type) - { - this.type = type; - } - - - public void setName(String name) - { - this.name = name; - } - - - public void setParameters(String parameters) - { - this.parameters = parameters; - } - - - /** - * @deprecated Use {@link #setParameters(String)} instead. - */ - public void setParam(String parameters) - { - this.parameters = parameters; - } - - - // Small utility methods. - - private int requiredAccessFlags(boolean set, - String access) - throws BuildException - { - int accessFlags = 0; - - if (access != null) - { - StringTokenizer tokenizer = new StringTokenizer(access, " ,"); - while (tokenizer.hasMoreTokens()) - { - String token = tokenizer.nextToken(); - - if (token.startsWith("!") ^ set) - { - String strippedToken = token.startsWith("!") ? - token.substring(1) : - token; - - int accessFlag = - strippedToken.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC : - strippedToken.equals(JavaConstants.ACC_PRIVATE) ? ClassConstants.ACC_PRIVATE : - strippedToken.equals(JavaConstants.ACC_PROTECTED) ? ClassConstants.ACC_PROTECTED : - strippedToken.equals(JavaConstants.ACC_STATIC) ? ClassConstants.ACC_STATIC : - strippedToken.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL : - strippedToken.equals(JavaConstants.ACC_SYNCHRONIZED) ? ClassConstants.ACC_SYNCHRONIZED : - strippedToken.equals(JavaConstants.ACC_VOLATILE) ? ClassConstants.ACC_VOLATILE : - strippedToken.equals(JavaConstants.ACC_TRANSIENT) ? ClassConstants.ACC_TRANSIENT : - strippedToken.equals(JavaConstants.ACC_BRIDGE) ? ClassConstants.ACC_BRIDGE : - strippedToken.equals(JavaConstants.ACC_VARARGS) ? ClassConstants.ACC_VARARGS : - strippedToken.equals(JavaConstants.ACC_NATIVE) ? ClassConstants.ACC_NATIVE : - strippedToken.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT : - strippedToken.equals(JavaConstants.ACC_STRICT) ? ClassConstants.ACC_STRICT : - strippedToken.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC : - 0; - - if (accessFlag == 0) - { - throw new BuildException("Incorrect class member access modifier ["+strippedToken+"]"); - } - - accessFlags |= accessFlag; - } - } - } - - return accessFlags; - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ProGuardTask.java b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ProGuardTask.java deleted file mode 100644 index ce22a4b4..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/ProGuardTask.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.ant; - -import org.apache.tools.ant.BuildException; -import proguard.*; -import proguard.classfile.util.ClassUtil; - -import java.io.*; -import java.net.*; -import java.util.*; - -/** - * This Task allows to configure and run ProGuard from Ant. - * - * @author Eric Lafortune - */ -public class ProGuardTask extends ConfigurationTask -{ - // Ant task attributes. - - public void setConfiguration(File configurationFile) throws BuildException - { - try - { - // Get the combined system properties and Ant properties, for - // replacing ProGuard-style properties ('<...>'). - Properties properties = new Properties(); - properties.putAll(getProject().getProperties()); - - URL configUrl = - ConfigurationElement.class.getResource(configurationFile.toString()); - - ConfigurationParser parser = configUrl != null ? - new ConfigurationParser(configUrl, properties) : - new ConfigurationParser(configurationFile, properties); - - try - { - parser.parse(configuration); - } - catch (ParseException e) - { - throw new BuildException(e.getMessage(), e); - } - finally - { - parser.close(); - } - } - catch (IOException e) - { - throw new BuildException(e.getMessage(), e); - } - } - - - /** - * @deprecated Use the nested outjar element instead. - */ - public void setOutjar(String parameters) - { - throw new BuildException("Use the nested element instead of the 'outjar' attribute"); - } - - - public void setSkipnonpubliclibraryclasses(boolean skipNonPublicLibraryClasses) - { - configuration.skipNonPublicLibraryClasses = skipNonPublicLibraryClasses; - } - - - public void setSkipnonpubliclibraryclassmembers(boolean skipNonPublicLibraryClassMembers) - { - configuration.skipNonPublicLibraryClassMembers = skipNonPublicLibraryClassMembers; - } - - - public void setTarget(String target) - { - configuration.targetClassVersion = ClassUtil.internalClassVersion(target); - if (configuration.targetClassVersion == 0) - { - throw new BuildException("Unsupported target '"+target+"'"); - } - } - - - public void setForceprocessing(boolean forceProcessing) - { - configuration.lastModified = forceProcessing ? Long.MAX_VALUE : 0; - } - - - public void setPrintseeds(File printSeeds) - { - configuration.printSeeds = optionalFile(printSeeds); - } - - - public void setShrink(boolean shrink) - { - configuration.shrink = shrink; - } - - - public void setPrintusage(File printUsage) - { - configuration.printUsage = optionalFile(printUsage); - } - - - public void setOptimize(boolean optimize) - { - configuration.optimize = optimize; - } - - - public void setOptimizationpasses(int optimizationPasses) - { - configuration.optimizationPasses = optimizationPasses; - } - - - public void setAllowaccessmodification(boolean allowAccessModification) - { - configuration.allowAccessModification = allowAccessModification; - } - - - public void setMergeinterfacesaggressively(boolean mergeinterfacesaggressively) - { - configuration.mergeInterfacesAggressively = mergeinterfacesaggressively; - } - - - public void setObfuscate(boolean obfuscate) - { - configuration.obfuscate = obfuscate; - } - - - public void setPrintmapping(File printMapping) - { - configuration.printMapping = optionalFile(printMapping); - } - - - public void setApplymapping(File applyMapping) - { - configuration.applyMapping = resolvedFile(applyMapping); - } - - - public void setObfuscationdictionary(File obfuscationDictionary) - { - configuration.obfuscationDictionary = resolvedURL(obfuscationDictionary); - } - - - public void setClassobfuscationdictionary(File classObfuscationDictionary) - { - configuration.classObfuscationDictionary = resolvedURL(classObfuscationDictionary); - } - - - public void setPackageobfuscationdictionary(File packageObfuscationDictionary) - { - configuration.packageObfuscationDictionary = resolvedURL(packageObfuscationDictionary); - } - - - public void setOverloadaggressively(boolean overloadAggressively) - { - configuration.overloadAggressively = overloadAggressively; - } - - - public void setUseuniqueclassmembernames(boolean useUniqueClassMemberNames) - { - configuration.useUniqueClassMemberNames = useUniqueClassMemberNames; - } - - - public void setUsemixedcaseclassnames(boolean useMixedCaseClassNames) - { - configuration.useMixedCaseClassNames = useMixedCaseClassNames; - } - - - public void setFlattenpackagehierarchy(String flattenPackageHierarchy) - { - configuration.flattenPackageHierarchy = ClassUtil.internalClassName(flattenPackageHierarchy); - } - - - public void setRepackageclasses(String repackageClasses) - { - configuration.repackageClasses = ClassUtil.internalClassName(repackageClasses); - } - - /** - * @deprecated Use the repackageclasses attribute instead. - */ - public void setDefaultpackage(String defaultPackage) - { - configuration.repackageClasses = ClassUtil.internalClassName(defaultPackage); - } - - - public void setKeepparameternames(boolean keepParameterNames) - { - configuration.keepParameterNames = keepParameterNames; - } - - - public void setRenamesourcefileattribute(String newSourceFileAttribute) - { - configuration.newSourceFileAttribute = newSourceFileAttribute; - } - - - public void setPreverify(boolean preverify) - { - configuration.preverify = preverify; - } - - - public void setMicroedition(boolean microEdition) - { - configuration.microEdition = microEdition; - } - - - public void setAndroid(boolean android) - { - configuration.android = android; - } - - - public void setVerbose(boolean verbose) - { - configuration.verbose = verbose; - } - - - public void setNote(boolean note) - { - if (note) - { - // Switch on notes if they were completely disabled. - if (configuration.note != null && - configuration.note.isEmpty()) - { - configuration.note = null; - } - } - else - { - // Switch off notes. - configuration.note = new ArrayList(); - } - } - - - public void setWarn(boolean warn) - { - if (warn) - { - // Switch on warnings if they were completely disabled. - if (configuration.warn != null && - configuration.warn.isEmpty()) - { - configuration.warn = null; - } - } - else - { - // Switch off warnings. - configuration.warn = new ArrayList(); - } - } - - - public void setIgnorewarnings(boolean ignoreWarnings) - { - configuration.ignoreWarnings = ignoreWarnings; - } - - - public void setPrintconfiguration(File printConfiguration) - { - configuration.printConfiguration = optionalFile(printConfiguration); - } - - - public void setDump(File dump) - { - configuration.dump = optionalFile(dump); - } - - - public void setAddConfigurationDebugging(boolean addConfigurationDebugging) - { - configuration.addConfigurationDebugging = addConfigurationDebugging; - } - - - - // Implementations for Task. - - public void execute() throws BuildException - { - try - { - ProGuard proGuard = new ProGuard(configuration); - proGuard.execute(); - } - catch (IOException e) - { - throw new BuildException(e.getMessage(), e); - } - } - - - // Small utility methods. - - /** - * Returns a file that is properly resolved with respect to the project - * directory, or null or empty if its name is actually a - * boolean flag. - */ - private File optionalFile(File file) - { - String fileName = file.getName(); - - return - fileName.equalsIgnoreCase("false") || - fileName.equalsIgnoreCase("no") || - fileName.equalsIgnoreCase("off") ? null : - fileName.equalsIgnoreCase("true") || - fileName.equalsIgnoreCase("yes") || - fileName.equalsIgnoreCase("on") ? Configuration.STD_OUT : - resolvedFile(file); - } - - - /** - * Returns a URL that is properly resolved with respect to the project - * directory. - */ - private URL resolvedURL(File file) - { - try - { - return resolvedFile(file).toURI().toURL(); - } - catch (MalformedURLException e) - { - return null; - } - } - - - /** - * Returns a file that is properly resolved with respect to the project - * directory. - */ - private File resolvedFile(File file) - { - return file.isAbsolute() ? file : - new File(getProject().getBaseDir(), - file.getName()); - } -} diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/package.html b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/package.html deleted file mode 100644 index 75e0466d..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains the Ant task for ProGuard. - diff --git a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/task.properties b/tools/proguard/proguard6.0.3/ant/src/proguard/ant/task.properties deleted file mode 100644 index 82d0f3f4..00000000 --- a/tools/proguard/proguard6.0.3/ant/src/proguard/ant/task.properties +++ /dev/null @@ -1,2 +0,0 @@ -proguard = proguard.ant.ProGuardTask -proguardconfiguration = proguard.ant.ConfigurationTask diff --git a/tools/proguard/proguard6.0.3/bin/proguard.bat b/tools/proguard/proguard6.0.3/bin/proguard.bat deleted file mode 100644 index daf2c1a3..00000000 --- a/tools/proguard/proguard6.0.3/bin/proguard.bat +++ /dev/null @@ -1,14 +0,0 @@ -@ECHO OFF - -REM Start-up script for ProGuard -- free class file shrinker, optimizer, -REM obfuscator, and preverifier for Java bytecode. -REM -REM Note: when passing file names containing spaces to this script, -REM you'll have to add escaped quotes around them, e.g. -REM "\"C:/My Directory/My File.txt\"" - -IF EXIST "%PROGUARD_HOME%" GOTO home -SET PROGUARD_HOME=%~dp0\.. -:home - -java -jar "%PROGUARD_HOME%\lib\proguard.jar" %* diff --git a/tools/proguard/proguard6.0.3/bin/proguard.sh b/tools/proguard/proguard6.0.3/bin/proguard.sh deleted file mode 100644 index 3ee60ed7..00000000 --- a/tools/proguard/proguard6.0.3/bin/proguard.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# -# Start-up script for ProGuard -- free class file shrinker, optimizer, -# obfuscator, and preverifier for Java bytecode. -# -# Note: when passing file names containing spaces to this script, -# you'll have to add escaped quotes around them, e.g. -# "\"/My Directory/My File.txt\"" - -# Account for possibly missing/basic readlink. -# POSIX conformant (dash/ksh/zsh/bash). -PROGUARD=`readlink -f "$0" 2>/dev/null` -if test "$PROGUARD" = '' -then - PROGUARD=`readlink "$0" 2>/dev/null` - if test "$PROGUARD" = '' - then - PROGUARD="$0" - fi -fi - -PROGUARD_HOME=`dirname "$PROGUARD"`/.. - -java -jar "$PROGUARD_HOME/lib/proguard.jar" "$@" diff --git a/tools/proguard/proguard6.0.3/bin/proguardgui.bat b/tools/proguard/proguard6.0.3/bin/proguardgui.bat deleted file mode 100644 index c328f5b1..00000000 --- a/tools/proguard/proguard6.0.3/bin/proguardgui.bat +++ /dev/null @@ -1,14 +0,0 @@ -@ECHO OFF - -REM Start-up script for the GUI of ProGuard -- free class file shrinker, -REM optimizer, obfuscator, and preverifier for Java bytecode. -REM -REM Note: when passing file names containing spaces to this script, -REM you'll have to add escaped quotes around them, e.g. -REM "\"C:/My Directory/My File.txt\"" - -IF EXIST "%PROGUARD_HOME%" GOTO home -SET PROGUARD_HOME=%~dp0\.. -:home - -java -jar "%PROGUARD_HOME%\lib\proguardgui.jar" %* diff --git a/tools/proguard/proguard6.0.3/bin/proguardgui.sh b/tools/proguard/proguard6.0.3/bin/proguardgui.sh deleted file mode 100644 index aba7f622..00000000 --- a/tools/proguard/proguard6.0.3/bin/proguardgui.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh -# -# Start-up script for the GUI of ProGuard -- free class file shrinker, -# optimizer, obfuscator, and preverifier for Java bytecode. -# -# Note: when passing file names containing spaces to this script, -# you'll have to add escaped quotes around them, e.g. -# "\"/My Directory/My File.txt\"" - -# Account for possibly missing/basic readlink. -# POSIX conformant (dash/ksh/zsh/bash). -PROGUARD=`readlink -f "$0" 2>/dev/null` -if test "$PROGUARD" = '' -then - PROGUARD=`readlink "$0" 2>/dev/null` - if test "$PROGUARD" = '' - then - PROGUARD="$0" - fi -fi - -PROGUARD_HOME=`dirname "$PROGUARD"`/.. - -# On Linux, Java 1.6.0_24 and higher hang when starting the GUI: -# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7027598 -# We're using the -D option as a workaround. -java -DsuppressSwingDropSupport=true -jar "$PROGUARD_HOME/lib/proguardgui.jar" "$@" diff --git a/tools/proguard/proguard6.0.3/bin/retrace.bat b/tools/proguard/proguard6.0.3/bin/retrace.bat deleted file mode 100644 index ae16ddec..00000000 --- a/tools/proguard/proguard6.0.3/bin/retrace.bat +++ /dev/null @@ -1,14 +0,0 @@ -@ECHO OFF - -REM Start-up script for Retrace -- companion tool for ProGuard, free class file -REM shrinker, optimizer, obfuscator, and preverifier for Java bytecode. -REM -REM Note: when passing file names containing spaces to this script, -REM you'll have to add escaped quotes around them, e.g. -REM "\"C:/My Directory/My File.txt\"" - -IF EXIST "%PROGUARD_HOME%" GOTO home -SET PROGUARD_HOME=%~dp0\.. -:home - -java -jar "%PROGUARD_HOME%\lib\retrace.jar" %* diff --git a/tools/proguard/proguard6.0.3/bin/retrace.sh b/tools/proguard/proguard6.0.3/bin/retrace.sh deleted file mode 100644 index 2f274de9..00000000 --- a/tools/proguard/proguard6.0.3/bin/retrace.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# -# Start-up script for Retrace -- companion tool for ProGuard, free class file -# shrinker, optimizer, obfuscator, and preverifier for Java bytecode. -# -# Note: when passing file names containing spaces to this script, -# you'll have to add escaped quotes around them, e.g. -# "\"/My Directory/My File.txt\"" - -# Account for possibly missing/basic readlink. -# POSIX conformant (dash/ksh/zsh/bash). -PROGUARD=`readlink -f "$0" 2>/dev/null` -if test "$PROGUARD" = '' -then - PROGUARD=`readlink "$0" 2>/dev/null` - if test "$PROGUARD" = '' - then - PROGUARD="$0" - fi -fi - -PROGUARD_HOME=`dirname "$PROGUARD"`/.. - -java -jar "$PROGUARD_HOME/lib/retrace.jar" "$@" diff --git a/tools/proguard/proguard6.0.3/buildscripts/README b/tools/proguard/proguard6.0.3/buildscripts/README deleted file mode 100644 index 9d3431cf..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/README +++ /dev/null @@ -1,30 +0,0 @@ -ProGuard, Java class file shrinker, optimizer, obfuscator, and preverifier -========================================================================== - -This directory contains a number of alternative ways to build ProGuard: - -- build.sh: a shell script for GNU/Linux - - ./build.sh - -- makefile: a makefile for GNU/Linux - - make clean all - -- build.gradle : a Gradle build file for all platforms - - gradle clean assemble - -- build.xml: an Ant build file for all platforms - - ant clean all - -- pom.xml: a Maven POM for building the Maven artifacts - - mvn clean package - -Pick your favorite build tool and enjoy! - -https://www.guardsquare.com/proguard - -Copyright (c) 2002-2018 Eric Lafortune @ GuardSquare diff --git a/tools/proguard/proguard6.0.3/buildscripts/build.gradle b/tools/proguard/proguard6.0.3/buildscripts/build.gradle deleted file mode 100644 index 2687e97a..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/build.gradle +++ /dev/null @@ -1,64 +0,0 @@ -// Gradle build script for all ProGuard jars. - -task clean { - delete fileTree('../lib') -} - -// Collect the main ProGuard jar. - -task assembleProguardJar(type: Jar) { - destinationDir = file('../lib') - baseName = 'proguard' - - manifest.from '../core/src/META-INF/MANIFEST.MF' -} - -def proguardSubprojects = - [':core', ':gradle', ':ant', ':wtk'].collect{ project(it) } - -proguardSubprojects.each { subproject -> - subproject.afterEvaluate { - assembleProguardJar.dependsOn subproject.tasks['jar'] - assembleProguardJar.from subproject.configurations.archives.artifacts.files.collect { zipTree(it) } - } -} - -// Copy the ReTrace jar. - -task copyRetraceJar(type: Copy) { - into '../lib' -} - -project(':retrace').afterEvaluate { - copyRetraceJar.from it.tasks['jar'] -} - -// Copy the GUI jar. - -task copyGuiJar(type: Copy) { - into '../lib' - rename 'gui.jar', 'proguardgui.jar' -} - -project(':gui').afterEvaluate { - copyGuiJar.from it.tasks['jar'] -} - -// Copy the annotations jar. - -task copyAnnotationsJar(type: Copy) { - into '../lib' -} - -project(':annotations').afterEvaluate { - copyAnnotationsJar.from it.tasks['jar'] -} - -// Assemble or copy all jars. - -task assemble { - dependsOn assembleProguardJar - dependsOn copyRetraceJar - dependsOn copyGuiJar - dependsOn copyAnnotationsJar -} diff --git a/tools/proguard/proguard6.0.3/buildscripts/build.sh b/tools/proguard/proguard6.0.3/buildscripts/build.sh deleted file mode 100644 index 16c8c1c9..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/build.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for ProGuard. - -cd $(dirname "$0") - -# Standard modules. -../core/build.sh && \ -../retrace/build.sh && \ -../gui/build.sh && \ -../annotations/build.sh || exit 1 - -# Optional modules. -../gradle/build.sh -../ant/build.sh -../wtk/build.sh diff --git a/tools/proguard/proguard6.0.3/buildscripts/build.xml b/tools/proguard/proguard6.0.3/buildscripts/build.xml deleted file mode 100644 index 154865df..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/build.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/buildscripts/functions.sh b/tools/proguard/proguard6.0.3/buildscripts/functions.sh deleted file mode 100644 index 90be905b..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/functions.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# -# Support functions for building ProGuard. - -SRC=src -OUT=out -LIB=../lib - -PROGUARD_JAR=$LIB/proguard.jar -RETRACE_JAR=$LIB/retrace.jar -PROGUARD_GUI_JAR=$LIB/proguardgui.jar -ANNOTATIONS_JAR=$LIB/annotations.jar - -set -o pipefail - -function compile { - # Compile java source files. - echo "Compiling $(basename $PWD) ($1)..." - mkdir -p "$OUT" && \ - javac -nowarn -Xlint:none -sourcepath "$SRC" -d "$OUT" \ - "$SRC"/${1//.//}.java 2>&1 \ - | sed -e 's|^| |' || return 1 - - # Copy resource files. - (cd "$SRC" && \ - find proguard \ - \( -name \*.properties -o -name \*.png -o -name \*.gif -o -name \*.pro \) \ - -exec cp --parents {} "../$OUT" \; ) -} - -function createjar { - echo "Creating $1..." - if [ -f "$SRC/META-INF/MANIFEST.MF" ]; then - jar -cfm "$1" "$SRC/META-INF/MANIFEST.MF" -C "$OUT" proguard - else - jar -cf "$1" -C "$OUT" proguard - fi -} - -function updatejar { - echo "Updating $1..." - jar -uf "$1" -C "$OUT" proguard -} diff --git a/tools/proguard/proguard6.0.3/buildscripts/gradle.properties b/tools/proguard/proguard6.0.3/buildscripts/gradle.properties deleted file mode 100644 index cc20def1..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -wtkDir=/usr/local/java/wtk2.1 diff --git a/tools/proguard/proguard6.0.3/buildscripts/makefile b/tools/proguard/proguard6.0.3/buildscripts/makefile deleted file mode 100644 index c6a58004..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/makefile +++ /dev/null @@ -1,22 +0,0 @@ -# GNU/Linux makefile for ProGuard. - -BASIC_MODULES = core retrace gui annotations -OPTIONAL_MODULES = gradle ant wtk - -MODULES = $(BASIC_MODULES) $(OPTIONAL_MODULES) - -LIB = ../lib - -# The main targets. - -all: basic optional -basic: $(BASIC_MODULES) -optional: $(OPTIONAL_MODULES) - -$(MODULES): - cd ../$@ && $(MAKE) - -clean: - rm -fr $(LIB) - -.PHONY: all basic optional $(MODULES) clean diff --git a/tools/proguard/proguard6.0.3/buildscripts/pom.xml b/tools/proguard/proguard6.0.3/buildscripts/pom.xml deleted file mode 100644 index 082e3715..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/pom.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - pom - [${project.groupId}] ${project.artifactId} - ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. - http://proguard.sourceforge.net/ - - - 3 - - - - - lafortune - Eric Lafortune - http://www.lafortune.eu/ - GuardSquare - http://www.guardsquare.com/ - - Project Administrator - Developer - - - - - - - GNU General Public License, Version 2 - http://www.gnu.org/licenses/gpl-2.0.txt - repo - - - - - SourceForge.net Tracker - http://sourceforge.net/p/proguard/bugs/ - - - - http://hg.code.sf.net/p/proguard/code - scm:hg:http://hg.code.sf.net/p/proguard/code - - - - UTF-8 - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.0.2 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - 1.5 - 1.5 - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - http://download.oracle.com/javase/1.5.0/docs/api/ - - true - - - - attach-javadoc - package - - jar - - - -Xdoclint:none - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.0.1 - - - attach-sources - package - - jar - - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - - - - - - - sonatype-nexus-staging - Nexus Release Repository - https://oss.sonatype.org/service/local/staging/deploy/maven2 - - - - - ../core - ../retrace - ../gui - ../gradle - ../ant - ../annotations - - - - - __wtk_plugin_build__ - - - ${wtk.home}/wtklib/kenv.zip - - - - ../wtk - - - - diff --git a/tools/proguard/proguard6.0.3/buildscripts/settings.gradle b/tools/proguard/proguard6.0.3/buildscripts/settings.gradle deleted file mode 100644 index f3185ec7..00000000 --- a/tools/proguard/proguard6.0.3/buildscripts/settings.gradle +++ /dev/null @@ -1,12 +0,0 @@ -includeFlat 'core' -includeFlat 'retrace' -includeFlat 'gui' -includeFlat 'gradle' -includeFlat 'ant' -includeFlat 'annotations' - -if (file(wtkDir).isDirectory()) { - includeFlat 'wtk' -} else { - System.err.println "Can't find the WTK directory [${wtkDir}]. Not building the WTK plugin." -} diff --git a/tools/proguard/proguard6.0.3/core/build.gradle b/tools/proguard/proguard6.0.3/core/build.gradle deleted file mode 100644 index b6e6a9fb..00000000 --- a/tools/proguard/proguard6.0.3/core/build.gradle +++ /dev/null @@ -1,20 +0,0 @@ -// Gradle build script for ProGuard. - -apply plugin: 'java' - -sourceSets.main { - java { - srcDirs = ['src'] - } - resources { - srcDirs = ['src'] - include '**/*.properties' - include '**/*.gif' - include '**/*.png' - include '**/*.pro' - } -} - -jar { - manifest.from 'src/META-INF/MANIFEST.MF' -} diff --git a/tools/proguard/proguard6.0.3/core/build.sh b/tools/proguard/proguard6.0.3/core/build.sh deleted file mode 100644 index 7ba492d3..00000000 --- a/tools/proguard/proguard6.0.3/core/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for ProGuard. - -cd $(dirname "$0") - -source ../buildscripts/functions.sh - -MAIN_CLASS=proguard.ProGuard - -compile $MAIN_CLASS && \ -createjar "$PROGUARD_JAR" || exit 1 diff --git a/tools/proguard/proguard6.0.3/core/build.xml b/tools/proguard/proguard6.0.3/core/build.xml deleted file mode 100644 index 1f861304..00000000 --- a/tools/proguard/proguard6.0.3/core/build.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/core/makefile b/tools/proguard/proguard6.0.3/core/makefile deleted file mode 100644 index e982b47b..00000000 --- a/tools/proguard/proguard6.0.3/core/makefile +++ /dev/null @@ -1,8 +0,0 @@ -# GNU/Linux makefile for ProGuard. - -MAIN_CLASS = proguard/ProGuard -CLASSPATH = -TARGET = proguard -INCLUDE_MANIFEST = true - -include ../buildscripts/functions.mk diff --git a/tools/proguard/proguard6.0.3/core/pom.xml b/tools/proguard/proguard6.0.3/core/pom.xml deleted file mode 100644 index b82fcd0e..00000000 --- a/tools/proguard/proguard6.0.3/core/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - ../buildscripts/pom.xml - - proguard-base - [${project.groupId}] ${project.artifactId} - - - src - - - maven-source-plugin - - - maven-compiler-plugin - - - maven-jar-plugin - - - - proguard.ProGuard - - - - - - maven-javadoc-plugin - - - - diff --git a/tools/proguard/proguard6.0.3/core/src/META-INF/MANIFEST.MF b/tools/proguard/proguard6.0.3/core/src/META-INF/MANIFEST.MF deleted file mode 100644 index 3bad15ec..00000000 --- a/tools/proguard/proguard6.0.3/core/src/META-INF/MANIFEST.MF +++ /dev/null @@ -1,2 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: proguard.ProGuard diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ArgumentWordReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/ArgumentWordReader.java deleted file mode 100644 index 227f1765..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ArgumentWordReader.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.io.*; - - -/** - * A WordReader that returns words from an argument list. - * Single arguments are split into individual words if necessary. - * - * @author Eric Lafortune - */ -public class ArgumentWordReader extends WordReader -{ - private final String[] arguments; - - private int index = 0; - - -// /** -// * Creates a new ArgumentWordReader for the given arguments. -// */ -// public ArgumentWordReader(String[] arguments) -// { -// this(arguments, null); -// } -// -// - /** - * Creates a new ArgumentWordReader for the given arguments, with the - * given base directory. - */ - public ArgumentWordReader(String[] arguments, File baseDir) - { - super(baseDir); - - this.arguments = arguments; - } - - - // Implementations for WordReader. - - protected String nextLine() throws IOException - { - return index < arguments.length ? - arguments[index++] : - null; - } - - - protected String lineLocationDescription() - { - return "argument number " + index; - } - - - /** - * Test application that prints out the individual words of - * the argument list. - */ - public static void main(String[] args) { - - try - { - WordReader reader = new ArgumentWordReader(args, null); - - try - { - while (true) - { - String word = reader.nextWord(false, false); - if (word == null) - System.exit(-1); - - System.err.println("["+word+"]"); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - finally - { - reader.close(); - } - } - catch (IOException ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/AssumeNoSideEffectsChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/AssumeNoSideEffectsChecker.java deleted file mode 100644 index c0034395..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/AssumeNoSideEffectsChecker.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.util.*; - -import java.util.List; - -/** - * This class checks if the user is specifying to assume no side effects - * for a reasonable number of methods in a class: not none and not all. - * - * @author Eric Lafortune - */ -public class AssumeNoSideEffectsChecker -{ - private final WarningPrinter notePrinter; - - - /** - * Creates a new KeepClassMemberChecker. - */ - public AssumeNoSideEffectsChecker(WarningPrinter notePrinter) - { - this.notePrinter = notePrinter; - } - - - /** - * Checks if the given class specifications try to assume no side effects - * for all methods in a class, printing notes if necessary. - */ - public void checkClassSpecifications(List classSpecifications) - { - if (classSpecifications != null) - { - for (int classSpecificationIndex = 0; - classSpecificationIndex < classSpecifications.size(); - classSpecificationIndex++) - { - ClassSpecification classSpecification = - (ClassSpecification)classSpecifications.get(classSpecificationIndex); - - String className = classSpecification.className; - if (className == null) - { - className = classSpecification.extendsClassName; - } - - if (className == null || - notePrinter.accepts(className)) - { - List methodSpecifications = - classSpecification.methodSpecifications; - - if (methodSpecifications != null) - { - for (int methodSpecificationIndex = 0; - methodSpecificationIndex < methodSpecifications.size(); - methodSpecificationIndex++) - { - final MemberSpecification methodSpecification = - (MemberSpecification)methodSpecifications.get(methodSpecificationIndex); - - if (methodSpecification.name == null && - methodSpecification.descriptor == null) - { - notePrinter.print(className, - "Note: the configuration specifies that none of the methods of class '" + - (className == null ? - ConfigurationConstants.ANY_CLASS_KEYWORD : - ClassUtil.externalClassName(className)) + "' have any side effects"); - } - } - } - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ClassMemberChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/ClassMemberChecker.java deleted file mode 100644 index b0161b8d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ClassMemberChecker.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -import java.util.List; - -/** - * This class checks if the user has specified non-existent class members. - * - * @author Eric Lafortune - */ -public class ClassMemberChecker -extends SimplifiedVisitor -implements MemberVisitor -{ - private final ClassPool programClassPool; - private final WarningPrinter notePrinter; - - - /** - * Creates a new ClassMemberChecker. - */ - public ClassMemberChecker(ClassPool programClassPool, - WarningPrinter notePrinter) - { - this.programClassPool = programClassPool; - this.notePrinter = notePrinter; - } - - - /** - * Checks the classes mentioned in the given class specifications, printing - * notes if necessary. - */ - public void checkClassSpecifications(List classSpecifications) - { - if (classSpecifications != null) - { - for (int index = 0; index < classSpecifications.size(); index++) - { - ClassSpecification classSpecification = - (ClassSpecification)classSpecifications.get(index); - - String className = classSpecification.className; - if (className != null && - !containsWildCards(className) && - notePrinter.accepts(className)) - { - Clazz clazz = programClassPool.getClass(className); - if (clazz != null) - { - checkMemberSpecifications(clazz, classSpecification.fieldSpecifications, true); - checkMemberSpecifications(clazz, classSpecification.methodSpecifications, false); - } - } - } - } - } - - - /** - * Checks the class members mentioned in the given class member - * specifications, printing notes if necessary. - */ - private void checkMemberSpecifications(Clazz clazz, - List memberSpecifications, - boolean isField) - { - if (memberSpecifications != null) - { - String className = clazz.getName(); - - for (int index = 0; index < memberSpecifications.size(); index++) - { - MemberSpecification memberSpecification = - (MemberSpecification)memberSpecifications.get(index); - - String memberName = memberSpecification.name; - String descriptor = memberSpecification.descriptor; - if (memberName != null && - !containsWildCards(memberName) && - descriptor != null && - !containsWildCards(descriptor)) - { - if (isField) - { - if (clazz.findField(memberName, descriptor) == null) - { - notePrinter.print(className, - "Note: the configuration refers to the unknown field '" + - ClassUtil.externalFullFieldDescription(0, memberName, descriptor) + "' in class '" + - ClassUtil.externalClassName(className) + "'"); - } - } - else - { - if (clazz.findMethod(memberName, descriptor) == null) - { - notePrinter.print(className, - "Note: the configuration refers to the unknown method '" + - ClassUtil.externalFullMethodDescription(className, 0, memberName, descriptor) + "' in class '" + - ClassUtil.externalClassName(className) + "'"); - } - } - } - } - } - } - - - private static boolean containsWildCards(String string) - { - return string != null && - (string.indexOf('!') >= 0 || - string.indexOf('*') >= 0 || - string.indexOf('?') >= 0 || - string.indexOf(',') >= 0 || - string.indexOf("///") >= 0); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - System.out.println(" Maybe you meant the field '" + - ClassUtil.externalFullFieldDescription(0, programField.getName(programClass), programField.getDescriptor(programClass)) + "'?"); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - System.out.println(" Maybe you meant the method '" + - ClassUtil.externalFullMethodDescription(programClass.getName(), 0, programMethod.getName(programClass), programMethod.getDescriptor(programClass)) + "'?"); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ClassPath.java b/tools/proguard/proguard6.0.3/core/src/proguard/ClassPath.java deleted file mode 100644 index b4b4f6f8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ClassPath.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.util.*; - - -/** - * This class represents a class path, as a list of ClassPathEntry objects. - * - * @author Eric Lafortune - */ -public class ClassPath -{ - private final List classPathEntries = new ArrayList(); - - - /** - * Returns whether the class path contains any output entries. - */ - public boolean hasOutput() - { - for (int index = 0; index < classPathEntries.size(); index++) - { - if (((ClassPathEntry)classPathEntries.get(index)).isOutput()) - { - return true; - } - } - - return false; - } - - - // Delegates to List. - - public void clear() - { - classPathEntries.clear(); - } - - public void add(int index, ClassPathEntry classPathEntry) - { - classPathEntries.add(index, classPathEntry); - } - - public boolean add(ClassPathEntry classPathEntry) - { - return classPathEntries.add(classPathEntry); - } - - public boolean addAll(ClassPath classPath) - { - return classPathEntries.addAll(classPath.classPathEntries); - } - - public ClassPathEntry get(int index) - { - return (ClassPathEntry)classPathEntries.get(index); - } - - public ClassPathEntry remove(int index) - { - return (ClassPathEntry)classPathEntries.remove(index); - } - - public boolean isEmpty() - { - return classPathEntries.isEmpty(); - } - - public int size() - { - return classPathEntries.size(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ClassPathEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/ClassPathEntry.java deleted file mode 100644 index 11cf3ca0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ClassPathEntry.java +++ /dev/null @@ -1,414 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.util.ListUtil; - -import java.io.*; -import java.util.List; - - -/** - * This class represents an entry from a class path: an apk, a jar, an aar, a - * war, a zip, an ear, or a directory, with a name and a flag to indicates - * whether the entry is an input entry or an output entry. Optional filters can - * be specified for the names of the contained resource/classes, apks, jars, - * aars, wars, ears, and zips. - * - * @author Eric Lafortune - */ -public class ClassPathEntry -{ - private File file; - private boolean output; - private List filter; - private List apkFilter; - private List jarFilter; - private List aarFilter; - private List warFilter; - private List earFilter; - private List jmodFilter; - private List zipFilter; - - private String cachedName; - - - /** - * Creates a new ClassPathEntry with the given file and output flag. - */ - public ClassPathEntry(File file, boolean isOutput) - { - this.file = file; - this.output = isOutput; - } - - - /** - * Returns the path name of the entry. - */ - public String getName() - { - if (cachedName == null) - { - cachedName = getUncachedName(); - } - - return cachedName; - } - - - /** - * Returns the uncached path name of the entry. - */ - private String getUncachedName() - { - try - { - return file.getCanonicalPath(); - } - catch (IOException ex) - { - return file.getPath(); - } - } - - - /** - * Returns the file. - */ - public File getFile() - { - return file; - } - - - /** - * Sets the file. - */ - public void setFile(File file) - { - this.file = file; - this.cachedName = null; - } - - - /** - * Returns whether this data entry is an output entry. - */ - public boolean isOutput() - { - return output; - } - - - /** - * Specifies whether this data entry is an output entry. - */ - public void setOutput(boolean output) - { - this.output = output; - } - - - /** - * Returns whether this data entry is a dex file. - */ - public boolean isDex() - { - return hasExtension(".dex"); - } - - - /** - * Returns whether this data entry is an apk file. - */ - public boolean isApk() - { - return hasExtension(".apk") || - hasExtension(".ap_"); - } - - - /** - * Returns whether this data entry is a jar file. - */ - public boolean isJar() - { - return hasExtension(".jar"); - } - - - /** - * Returns whether this data entry is an aar file. - */ - public boolean isAar() - { - return hasExtension(".aar"); - } - - - /** - * Returns whether this data entry is a war file. - */ - public boolean isWar() - { - return hasExtension(".war"); - } - - - /** - * Returns whether this data entry is a ear file. - */ - public boolean isEar() - { - return hasExtension(".ear"); - } - - - /** - * Returns whether this data entry is a jmod file. - */ - public boolean isJmod() - { - return hasExtension(".jmod"); - } - - - /** - * Returns whether this data entry is a zip file. - */ - public boolean isZip() - { - return hasExtension(".zip"); - } - - - /** - * Returns whether this data entry has the given extension. - */ - private boolean hasExtension(String extension) - { - return endsWithIgnoreCase(file.getPath(), extension); - } - - - /** - * Returns whether the given string ends with the given suffix, ignoring - * its case. - */ - private static boolean endsWithIgnoreCase(String string, String suffix) - { - int stringLength = string.length(); - int suffixLength = suffix.length(); - - return string.regionMatches(true, stringLength - - suffixLength, suffix, 0, suffixLength); - } - - - /** - * Returns whether this data entry has any kind of filter. - */ - public boolean isFiltered() - { - return filter != null || - apkFilter != null || - jarFilter != null || - aarFilter != null || - warFilter != null || - earFilter != null || - jmodFilter != null || - zipFilter != null; - } - - - /** - * Returns the name filter that is applied to bottom-level files in this entry. - */ - public List getFilter() - { - return filter; - } - - /** - * Sets the name filter that is applied to bottom-level files in this entry. - */ - public void setFilter(List filter) - { - this.filter = filter == null || filter.size() == 0 ? null : filter; - } - - - /** - * Returns the name filter that is applied to apk files in this entry, if any. - */ - public List getApkFilter() - { - return apkFilter; - } - - /** - * Sets the name filter that is applied to apk files in this entry, if any. - */ - public void setApkFilter(List filter) - { - this.apkFilter = filter == null || filter.size() == 0 ? null : filter; - } - - - /** - * Returns the name filter that is applied to jar files in this entry, if any. - */ - public List getJarFilter() - { - return jarFilter; - } - - /** - * Sets the name filter that is applied to jar files in this entry, if any. - */ - public void setJarFilter(List filter) - { - this.jarFilter = filter == null || filter.size() == 0 ? null : filter; - } - - - /** - * Returns the name filter that is applied to aar files in this entry, if any. - */ - public List getAarFilter() - { - return aarFilter; - } - - /** - * Sets the name filter that is applied to aar files in this entry, if any. - */ - public void setAarFilter(List filter) - { - this.aarFilter = filter == null || filter.size() == 0 ? null : filter; - } - - - /** - * Returns the name filter that is applied to war files in this entry, if any. - */ - public List getWarFilter() - { - return warFilter; - } - - /** - * Sets the name filter that is applied to war files in this entry, if any. - */ - public void setWarFilter(List filter) - { - this.warFilter = filter == null || filter.size() == 0 ? null : filter; - } - - - /** - * Returns the name filter that is applied to ear files in this entry, if any. - */ - public List getEarFilter() - { - return earFilter; - } - - /** - * Sets the name filter that is applied to ear files in this entry, if any. - */ - public void setEarFilter(List filter) - { - this.earFilter = filter == null || filter.size() == 0 ? null : filter; - } - - - /** - * Returns the name filter that is applied to jmod files in this entry, if any. - */ - public List getJmodFilter() - { - return jmodFilter; - } - - /** - * Sets the name filter that is applied to jmod files in this entry, if any. - */ - public void setJmodFilter(List filter) - { - this.jmodFilter = filter == null || filter.size() == 0 ? null : jmodFilter; - } - - /** - * Returns the name filter that is applied to zip files in this entry, if any. - */ - public List getZipFilter() - { - return zipFilter; - } - - /** - * Sets the name filter that is applied to zip files in this entry, if any. - */ - public void setZipFilter(List filter) - { - this.zipFilter = filter == null || filter.size() == 0 ? null : filter; - } - - - // Implementations for Object. - - public String toString() - { - String string = getName(); - - if (filter != null || - jarFilter != null || - aarFilter != null || - warFilter != null || - earFilter != null || - jmodFilter != null || - zipFilter != null) - { - string += - ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD + - (aarFilter != null ? ListUtil.commaSeparatedString(aarFilter, true) : "") + - ConfigurationConstants.SEPARATOR_KEYWORD + - (apkFilter != null ? ListUtil.commaSeparatedString(apkFilter, true) : "") + - ConfigurationConstants.SEPARATOR_KEYWORD + - (zipFilter != null ? ListUtil.commaSeparatedString(zipFilter, true) : "") + - ConfigurationConstants.SEPARATOR_KEYWORD + - (jmodFilter != null ? ListUtil.commaSeparatedString(jmodFilter, true) : "") + - ConfigurationConstants.SEPARATOR_KEYWORD + - (earFilter != null ? ListUtil.commaSeparatedString(earFilter, true) : "") + - ConfigurationConstants.SEPARATOR_KEYWORD + - (warFilter != null ? ListUtil.commaSeparatedString(warFilter, true) : "") + - ConfigurationConstants.SEPARATOR_KEYWORD + - (jarFilter != null ? ListUtil.commaSeparatedString(jarFilter, true) : "") + - ConfigurationConstants.SEPARATOR_KEYWORD + - (filter != null ? ListUtil.commaSeparatedString(filter, true) : "") + - ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD; - } - - return string; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ClassSpecification.java b/tools/proguard/proguard6.0.3/core/src/proguard/ClassSpecification.java deleted file mode 100644 index 43d4cb21..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ClassSpecification.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.util.*; - -/** - * This class stores a specification of classes and possibly class members. - * The specification is template-based: the class names and class member names - * and descriptors can contain wildcards. Classes can be specified explicitly, - * or as extensions or implementations in the class hierarchy. - * - * @author Eric Lafortune - */ -public class ClassSpecification implements Cloneable -{ - public final String comments; - public int requiredSetAccessFlags; - public int requiredUnsetAccessFlags; - public final String annotationType; - public String className; - public final String extendsAnnotationType; - public final String extendsClassName; - - public final List attributeNames = null; - public List fieldSpecifications; - public List methodSpecifications; - - - /** - * Creates a new ClassSpecification for all possible classes, without - * comments or class members. - */ - public ClassSpecification() - { - this(null, - 0, - 0, - null, - null, - null, - null); - } - - - /** - * Creates a new ClassSpecification that is a copy of the given specification. - */ - public ClassSpecification(ClassSpecification classSpecification) - { - this(classSpecification.comments, - classSpecification.requiredSetAccessFlags, - classSpecification.requiredUnsetAccessFlags, - classSpecification.annotationType, - classSpecification.className, - classSpecification.extendsAnnotationType, - classSpecification.extendsClassName, - classSpecification.fieldSpecifications, - classSpecification.methodSpecifications); - } - - - /** - * Creates a new ClassSpecification for the specified class(es), without - * class members. - * - * @param comments provides optional comments on this - * specification. - * @param requiredSetAccessFlags the class access flags that must be set - * in order for the class to apply. - * @param requiredUnsetAccessFlags the class access flags that must be - * unset in order for the class to apply. - * @param annotationType the name of the class that must be an - * annotation of the class in order for it - * to apply. The name may be null to - * specify that no annotation is required. - * @param className the class name. The name may be null to - * specify any class, or it may contain - * "**", "*", or "?" wildcards. - * @param extendsAnnotationType the name of the class of that must be - * an annotation of the class that the - * class must extend or implement in order - * to apply. The name may be null to - * specify that no annotation is required. - * @param extendsClassName the name of the class that the class - * must extend or implement in order to - * apply. The name may be null to specify - * any class. - */ - public ClassSpecification(String comments, - int requiredSetAccessFlags, - int requiredUnsetAccessFlags, - String annotationType, - String className, - String extendsAnnotationType, - String extendsClassName) - { - this(comments, - requiredSetAccessFlags, - requiredUnsetAccessFlags, - annotationType, - className, - extendsAnnotationType, - extendsClassName, - null, - null); - } - - - /** - * Creates a new ClassSpecification for the specified classes and class - * members. - * - * @param comments provides optional comments on this - * specification. - * @param requiredSetAccessFlags the class access flags that must be set - * in order for the class to apply. - * @param requiredUnsetAccessFlags the class access flags that must be - * unset in order for the class to apply. - * @param annotationType the name of the class that must be an - * annotation of the class in order for it - * to apply. The name may be null to - * specify that no annotation is required. - * @param className the class name. The name may be null to - * specify any class, or it may contain - * "**", "*", or "?" wildcards. - * @param extendsAnnotationType the name of the class of that must be - * an annotation of the class that the - * class must extend or implement in order - * to apply. The name may be null to - * specify that no annotation is required. - * @param extendsClassName the name of the class that the class - * must extend or implement in order to - * apply. The name may be null to specify - * any class. - * @param fieldSpecifications the field specifications. - * @param methodSpecifications the method specifications. - */ - public ClassSpecification(String comments, - int requiredSetAccessFlags, - int requiredUnsetAccessFlags, - String annotationType, - String className, - String extendsAnnotationType, - String extendsClassName, - List fieldSpecifications, - List methodSpecifications) - { - this.comments = comments; - this.requiredSetAccessFlags = requiredSetAccessFlags; - this.requiredUnsetAccessFlags = requiredUnsetAccessFlags; - this.annotationType = annotationType; - this.className = className; - this.extendsAnnotationType = extendsAnnotationType; - this.extendsClassName = extendsClassName; - this.fieldSpecifications = fieldSpecifications; - this.methodSpecifications = methodSpecifications; - } - - - /** - * Specifies to keep the specified field(s) of this option's class(es). - * - * @param fieldSpecification the field specification. - */ - public void addField(MemberSpecification fieldSpecification) - { - if (fieldSpecifications == null) - { - fieldSpecifications = new ArrayList(); - } - - fieldSpecifications.add(fieldSpecification); - } - - - /** - * Specifies to keep the specified method(s) of this option's class(es). - * - * @param methodSpecification the method specification. - */ - public void addMethod(MemberSpecification methodSpecification) - { - if (methodSpecifications == null) - { - methodSpecifications = new ArrayList(); - } - - methodSpecifications.add(methodSpecification); - } - - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - ClassSpecification other = (ClassSpecification)object; - return -// (this.comments == null ? other.comments == null : this.comments.equals(other.comments) ) && - (this.requiredSetAccessFlags == other.requiredSetAccessFlags ) && - (this.requiredUnsetAccessFlags == other.requiredUnsetAccessFlags ) && - (this.annotationType == null ? other.annotationType == null : this.annotationType.equals(other.annotationType) ) && - (this.className == null ? other.className == null : this.className.equals(other.className) ) && - (this.extendsAnnotationType == null ? other.extendsAnnotationType == null : this.extendsAnnotationType.equals(other.extendsAnnotationType)) && - (this.extendsClassName == null ? other.extendsClassName == null : this.extendsClassName.equals(other.extendsClassName) ) && - (this.fieldSpecifications == null ? other.fieldSpecifications == null : this.fieldSpecifications.equals(other.fieldSpecifications) ) && - (this.methodSpecifications == null ? other.methodSpecifications == null : this.methodSpecifications.equals(other.methodSpecifications) ); - } - - public int hashCode() - { - return -// (comments == null ? 0 : comments.hashCode() ) ^ - (requiredSetAccessFlags ) ^ - (requiredUnsetAccessFlags ) ^ - (annotationType == null ? 0 : annotationType.hashCode() ) ^ - (className == null ? 0 : className.hashCode() ) ^ - (extendsAnnotationType == null ? 0 : extendsAnnotationType.hashCode()) ^ - (extendsClassName == null ? 0 : extendsClassName.hashCode() ) ^ - (fieldSpecifications == null ? 0 : fieldSpecifications.hashCode() ) ^ - (methodSpecifications == null ? 0 : methodSpecifications.hashCode() ); - } - - public Object clone() - { - try - { - return super.clone(); - } - catch (CloneNotSupportedException e) - { - return null; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ClassSpecificationVisitorFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/ClassSpecificationVisitorFactory.java deleted file mode 100644 index b70caa19..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ClassSpecificationVisitorFactory.java +++ /dev/null @@ -1,674 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.visitor.*; -import proguard.util.*; - -import java.util.List; - -/** - * This factory creates visitors to efficiently travel to specified classes and - * class members. - * - * @author Eric Lafortune - */ -public class ClassSpecificationVisitorFactory -{ - /** - * Constructs a ClassPoolVisitor to efficiently travel to the specified - * classes, class members, and attributes. - * - * @param classSpecifications the list of ClassSpecification instances - * that specify the classes and class members - * to visit. - * @param classVisitor an optional ClassVisitor to be applied to - * all classes. - * @param memberVisitor an optional MemberVisitor to be applied to - * matching fields and methods. - */ - public ClassPoolVisitor createClassPoolVisitor(List classSpecifications, - ClassVisitor classVisitor, - MemberVisitor memberVisitor) - { - return createClassPoolVisitor(classSpecifications, - classVisitor, - memberVisitor, - memberVisitor, - null); - } - - - /** - * Constructs a ClassPoolVisitor to efficiently travel to the specified - * classes and class members. - * - * @param classSpecifications the list of ClassSpecification instances - * that specify the classes and class members - * to visit. - * @param classVisitor an optional ClassVisitor to be applied to - * all classes. - * @param fieldVisitor an optional MemberVisitor to be applied to - * matching fields. - * @param methodVisitor an optional MemberVisitor to be applied to - * matching methods. - * @param attributeVisitor an optional AttributeVisitor to be applied - * to matching attributes. - */ - public ClassPoolVisitor createClassPoolVisitor(List classSpecifications, - ClassVisitor classVisitor, - MemberVisitor fieldVisitor, - MemberVisitor methodVisitor, - AttributeVisitor attributeVisitor) - { - MultiClassPoolVisitor multiClassPoolVisitor = new MultiClassPoolVisitor(); - - if (classSpecifications != null) - { - for (int index = 0; index < classSpecifications.size(); index++) - { - ClassSpecification classSpecification = - (ClassSpecification)classSpecifications.get(index); - - multiClassPoolVisitor.addClassPoolVisitor( - createClassPoolVisitor(classSpecification, - classVisitor, - fieldVisitor, - methodVisitor, - attributeVisitor, - null)); - } - } - - return multiClassPoolVisitor; - } - - - /** - * Constructs a ClassPoolVisitor to efficiently travel to the specified - * classes, class members, and attributes. - * - * @param classSpecification the specifications of the class(es) and class - * members to visit. - * @param classVisitor an optional ClassVisitor to be applied to - * matching classes. - * @param fieldVisitor an optional MemberVisitor to be applied to - * matching fields. - * @param methodVisitor an optional MemberVisitor to be applied to - * matching methods. - * @param attributeVisitor an optional AttributeVisitor to be applied - * to matching attributes. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - */ - protected ClassPoolVisitor createClassPoolVisitor(ClassSpecification classSpecification, - ClassVisitor classVisitor, - MemberVisitor fieldVisitor, - MemberVisitor methodVisitor, - AttributeVisitor attributeVisitor, - List variableStringMatchers) - { - String className = classSpecification.className; - String annotationType = classSpecification.annotationType; - String extendsAnnotationType = classSpecification.extendsAnnotationType; - String extendsClassName = classSpecification.extendsClassName; - - // We explicitly need to match a wildcard class name, so it can be - // referenced through its variable string matcher. - if (className == null) - { - className = "**"; - } - - // We need to parse the class names before any class member names, to - // make sure the list of variable string matchers is filled out in the - // right order. - StringMatcher annotationTypeMatcher = annotationType == null ? null : - new ListParser(new ClassNameParser(variableStringMatchers)).parse(annotationType); - - StringMatcher classNameMatcher = - new ListParser(new ClassNameParser(variableStringMatchers)).parse(className); - - StringMatcher extendsAnnotationTypeMatcher = extendsAnnotationType == null ? null : - new ListParser(new ClassNameParser(variableStringMatchers)).parse(extendsAnnotationType); - - StringMatcher extendsClassNameMatcher = extendsClassName == null ? null : - new ListParser(new ClassNameParser(variableStringMatchers)).parse(extendsClassName); - - // Combine both visitors. - ClassVisitor combinedClassVisitor = - createCombinedClassVisitor(classSpecification.attributeNames, - classSpecification.fieldSpecifications, - classSpecification.methodSpecifications, - classVisitor, - fieldVisitor, - methodVisitor, - attributeVisitor, - variableStringMatchers); - - // If the class name has wildcards, only visit classes with matching names. - if (extendsAnnotationType != null || - extendsClassName != null || - containsWildCards(className)) - { - combinedClassVisitor = - new ClassNameFilter(classNameMatcher, combinedClassVisitor); - - // We'll have to visit all classes now. - className = null; - } - - // If specified, only visit classes with the right annotation. - if (annotationType != null) - { - combinedClassVisitor = - new AllAttributeVisitor( - new AllAnnotationVisitor( - new AnnotationTypeFilter(annotationTypeMatcher, - new AnnotationToAnnotatedClassVisitor(combinedClassVisitor)))); - } - - // If specified, only visit classes with the right access flags. - if (classSpecification.requiredSetAccessFlags != 0 || - classSpecification.requiredUnsetAccessFlags != 0) - { - combinedClassVisitor = - new ClassAccessFilter(classSpecification.requiredSetAccessFlags, - classSpecification.requiredUnsetAccessFlags, - combinedClassVisitor); - } - - // If it's specified, start visiting from the extended class. - if (extendsAnnotationType != null || - extendsClassName != null) - { - // Start visiting from the extended class. - combinedClassVisitor = - new ClassHierarchyTraveler(false, false, false, true, - combinedClassVisitor); - - // If specified, only visit extended classes with the right annotation. - if (extendsAnnotationType != null) - { - combinedClassVisitor = - new AllAttributeVisitor( - new AllAnnotationVisitor( - new AnnotationTypeFilter(extendsAnnotationTypeMatcher, - new AnnotationToAnnotatedClassVisitor(combinedClassVisitor)))); - } - - // If specified, only visit extended classes with matching names. - if (extendsClassName != null) - { - // If wildcarded, only visit extended classes with matching names. - if (containsWildCards(extendsClassName)) - { - combinedClassVisitor = - new ClassNameFilter(extendsClassNameMatcher, - combinedClassVisitor); - } - else - { - // Start visiting from the named extended class. - className = extendsClassName; - } - } - } - - // If specified, visit a single named class, otherwise visit all classes. - return className != null ? - new NamedClassVisitor(combinedClassVisitor, className) : - new AllClassVisitor(combinedClassVisitor); - } - - - /** - * Constructs a ClassVisitor to efficiently delegate to the given ClassVisitor - * and travel to the specified class members and attributes. - * @param attributeNames optional names (with wildcards) of class - * attributes to visit. - * @param fieldSpecifications optional specifications of the fields to - * visit. - * @param methodSpecifications optional specifications of the methods to - * visit. - * @param classVisitor an optional ClassVisitor to be applied to - * all classes. - * @param fieldVisitor an optional MemberVisitor to be applied to - * matching fields. - * @param methodVisitor an optional MemberVisitor to be applied to - * matching methods. - * @param attributeVisitor an optional AttributeVisitor to be applied - * to matching attributes. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - */ - protected ClassVisitor createCombinedClassVisitor(List attributeNames, - List fieldSpecifications, - List methodSpecifications, - ClassVisitor classVisitor, - MemberVisitor fieldVisitor, - MemberVisitor methodVisitor, - AttributeVisitor attributeVisitor, - List variableStringMatchers) - { - // Don't visit any members if there aren't any member specifications. - if (fieldSpecifications == null) - { - fieldVisitor = null; - } - - if (methodSpecifications == null) - { - methodVisitor = null; - } - - // The class visitor for classes and their members. - MultiClassVisitor multiClassVisitor = new MultiClassVisitor(); - - // If specified, let the class visitor visit the class itself. - if (classVisitor != null) - { - // This class visitor may be the only one. - if (fieldVisitor == null && - methodVisitor == null && - attributeVisitor == null) - { - return classVisitor; - } - - multiClassVisitor.addClassVisitor(classVisitor); - } - - // If specified, let the attribute visitor visit the class attributes. - if (attributeVisitor != null) - { - // If specified, only visit attributes with the right names. - if (attributeNames != null) - { - attributeVisitor = - new AttributeNameFilter(attributeNames, attributeVisitor); - } - - multiClassVisitor.addClassVisitor(new AllAttributeVisitor(attributeVisitor)); - } - - // If specified, let the member info visitor visit the class members. - if (fieldVisitor != null || - methodVisitor != null) - { - ClassVisitor memberClassVisitor = - createClassVisitor(fieldSpecifications, - methodSpecifications, - fieldVisitor, - methodVisitor, - attributeVisitor, - variableStringMatchers); - - // This class visitor may be the only one. - if (classVisitor == null) - { - return memberClassVisitor; - } - - multiClassVisitor.addClassVisitor(memberClassVisitor); - } - - return multiClassVisitor; - } - - - /** - * Constructs a ClassVisitor to efficiently travel to the specified class - * members. - * - * @param fieldSpecifications the specifications of the fields to visit. - * @param methodSpecifications the specifications of the methods to visit. - * @param fieldVisitor an optional MemberVisitor to be applied to - * matching fields. - * @param methodVisitor an optional MemberVisitor to be applied to - * matching methods. - * @param attributeVisitor an optional AttributeVisitor to be applied - * to matching attributes. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - */ - private ClassVisitor createClassVisitor(List fieldSpecifications, - List methodSpecifications, - MemberVisitor fieldVisitor, - MemberVisitor methodVisitor, - AttributeVisitor attributeVisitor, - List variableStringMatchers) - { - MultiClassVisitor multiClassVisitor = new MultiClassVisitor(); - - addMemberVisitors(fieldSpecifications, true, multiClassVisitor, fieldVisitor, attributeVisitor, variableStringMatchers); - addMemberVisitors(methodSpecifications, false, multiClassVisitor, methodVisitor, attributeVisitor, variableStringMatchers); - - // Mark the class member in this class and in super classes. - return new ClassHierarchyTraveler(true, true, false, false, - multiClassVisitor); - } - - - /** - * Adds elements to the given MultiClassVisitor, to apply the given - * MemberVisitor to all class members that match the given List - * of options (of the given type). - */ - private void addMemberVisitors(List memberSpecifications, - boolean isField, - MultiClassVisitor multiClassVisitor, - MemberVisitor memberVisitor, - AttributeVisitor attributeVisitor, - List variableStringMatchers) - { - if (memberSpecifications != null) - { - for (int index = 0; index < memberSpecifications.size(); index++) - { - MemberSpecification memberSpecification = - (MemberSpecification)memberSpecifications.get(index); - - multiClassVisitor.addClassVisitor( - createClassVisitor(memberSpecification, - isField, - memberVisitor, - attributeVisitor, - variableStringMatchers)); - } - } - } - - - /** - * Constructs a ClassPoolVisitor that conditionally applies the given - * ClassPoolVisitor for all classes that match the given class - * specification. - */ - protected ClassPoolVisitor createClassTester(ClassSpecification classSpecification, - ClassPoolVisitor classPoolVisitor, - List variableStringMatchers) - { - ClassPoolClassVisitor classPoolClassVisitor = - new ClassPoolClassVisitor(classPoolVisitor); - - // Parse the class condition. - ClassPoolVisitor conditionalClassTester = - createClassTester(classSpecification, - (ClassVisitor)classPoolClassVisitor, - variableStringMatchers); - - // The ClassPoolClassVisitor first needs to visit the class pool - // and then its classes. - return new MultiClassPoolVisitor( - new ClassPoolVisitor[] - { - classPoolClassVisitor, - conditionalClassTester - }); - } - - - /** - * Constructs a ClassPoolVisitor that conditionally applies the given - * ClassVisitor to all classes that match the given class specification. - */ - protected ClassPoolVisitor createClassTester(ClassSpecification classSpecification, - ClassVisitor classVisitor, - List variableStringMatchers) - { - // Create a placeholder for the class visitor that tests class - // members. - MultiClassVisitor conditionalMemberTester = - new MultiClassVisitor(); - - // Parse the class condition. - ClassPoolVisitor conditionalClassTester = - createClassPoolVisitor(classSpecification, - conditionalMemberTester, - null, - null, - null, - variableStringMatchers); - - // Parse the member conditions and add the result to the placeholder. - conditionalMemberTester.addClassVisitor( - createClassMemberTester(classSpecification.fieldSpecifications, - classSpecification.methodSpecifications, - classVisitor, - variableStringMatchers)); - - return conditionalClassTester; - } - - - /** - * Constructs a ClassVisitor that conditionally applies the given - * ClassVisitor to all classes that contain the given class members. - */ - private ClassVisitor createClassMemberTester(List fieldSpecifications, - List methodSpecifications, - ClassVisitor classVisitor, - List variableStringMatchers) - { - // Create a linked list of conditional visitors, for fields and for - // methods. - return createClassMemberTester(fieldSpecifications, - true, - createClassMemberTester(methodSpecifications, - false, - classVisitor, variableStringMatchers), - variableStringMatchers); - } - - - /** - * Constructs a ClassVisitor that conditionally applies the given - * ClassVisitor to all classes that contain the given List of class - * members (of the given type). - */ - private ClassVisitor createClassMemberTester(List memberSpecifications, - boolean isField, - ClassVisitor classVisitor, - List variableStringMatchers) - { - // Create a linked list of conditional visitors. - if (memberSpecifications != null) - { - for (int index = 0; index < memberSpecifications.size(); index++) - { - MemberSpecification memberSpecification = - (MemberSpecification)memberSpecifications.get(index); - - classVisitor = - createClassVisitor(memberSpecification, - isField, - new MemberToClassVisitor(classVisitor), - null, - variableStringMatchers); - } - } - - return classVisitor; - } - - - /** - * Creates a new ClassVisitor to efficiently travel to the specified class - * members and attributes. - * - * @param memberSpecification the specification of the class member(s) to - * visit. - * @param memberVisitor the MemberVisitor to be applied to matching - * class member(s). - * @param variableStringMatchers a mutable list of VariableStringMatcher - * instances that match the wildcards. - */ - private ClassVisitor createClassVisitor(MemberSpecification memberSpecification, - boolean isField, - MemberVisitor memberVisitor, - AttributeVisitor attributeVisitor, - List variableStringMatchers) - { - String annotationType = memberSpecification.annotationType; - String name = memberSpecification.name; - String descriptor = memberSpecification.descriptor; - List attributeNames = memberSpecification.attributeNames; - - // We need to parse the names before the descriptors, to make sure the - // list of variable string matchers is filled out in the right order. - StringMatcher annotationTypeMatcher = annotationType == null ? null : - new ListParser(new ClassNameParser(variableStringMatchers)).parse(annotationType); - - StringMatcher nameMatcher = name == null ? null : - new ListParser(new NameParser(variableStringMatchers)).parse(name); - - StringMatcher descriptorMatcher = descriptor == null ? null : - new ListParser(new ClassNameParser(variableStringMatchers)).parse(descriptor); - - StringMatcher attributesMatcher = attributeNames == null ? null : - new ListParser(new NameParser(variableStringMatchers)).parse(attributeNames); - - // If specified, let the attribute visitor visit the class member - // attributes. - if (attributeVisitor != null) - { - // If specified, only visit attributes with the right names. - if (attributesMatcher != null) - { - attributeVisitor = - new AttributeNameFilter(attributesMatcher, attributeVisitor); - } - - memberVisitor = - new MultiMemberVisitor( - new MemberVisitor[] - { - memberVisitor, - new AllAttributeVisitor(attributeVisitor) - }); - } - - // If specified, only visit class members with the right annotation. - if (memberSpecification.annotationType != null) - { - memberVisitor = - new AllAttributeVisitor( - new AllAnnotationVisitor( - new AnnotationTypeFilter(annotationTypeMatcher, - new AnnotationToAnnotatedMemberVisitor(memberVisitor)))); - } - - // If any access flags are specified, only visit matching class members. - if (memberSpecification.requiredSetAccessFlags != 0 || - memberSpecification.requiredUnsetAccessFlags != 0) - { - memberVisitor = - new MemberAccessFilter(memberSpecification.requiredSetAccessFlags, - memberSpecification.requiredUnsetAccessFlags, - memberVisitor); - } - - // Are the name and descriptor fully specified? - if (name != null && - descriptor != null && - !containsWildCards(name) && - !containsWildCards(descriptor)) - { - // Somewhat more efficiently, visit a single named class member. - return isField ? - new NamedFieldVisitor(name, descriptor, memberVisitor) : - new NamedMethodVisitor(name, descriptor, memberVisitor); - } - - // If specified, only visit class members with the right descriptors. - if (descriptorMatcher != null) - { - memberVisitor = - new MemberDescriptorFilter(descriptorMatcher, memberVisitor); - } - - // If specified, only visit class members with the right names. - if (name != null) - { - memberVisitor = - new MemberNameFilter(nameMatcher, memberVisitor); - } - - // Visit all class members, filtering the matching ones. - return isField ? - new AllFieldVisitor(memberVisitor) : - new AllMethodVisitor(memberVisitor); - } - - - // Small utility methods. - - /** - * Returns whether the given string contains a wild card. - */ - private boolean containsWildCards(String string) - { - return string != null && - (string.indexOf('!') >= 0 || - string.indexOf('*') >= 0 || - string.indexOf('?') >= 0 || - string.indexOf('%') >= 0 || - string.indexOf(',') >= 0 || - string.indexOf("///") >= 0 || - containsWildCardReferences(string)); - } - - - /** - * Returns whether the given string contains a numeric reference to a - * wild card (""). - */ - private boolean containsWildCardReferences(String string) - { - int openIndex = string.indexOf('<'); - if (openIndex < 0) - { - return false; - } - - int closeIndex = string.indexOf('>', openIndex + 1); - if (closeIndex < 0) - { - return false; - } - - try - { - Integer.parseInt(string.substring(openIndex + 1, closeIndex)); - } - catch (NumberFormatException e) - { - return false; - } - - return true; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/Configuration.java b/tools/proguard/proguard6.0.3/core/src/proguard/Configuration.java deleted file mode 100644 index 36cbeec1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/Configuration.java +++ /dev/null @@ -1,369 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.io.File; -import java.net.URL; -import java.util.*; - -/** - * The ProGuard configuration. - * - * @see ProGuard - * - * @author Eric Lafortune - */ -public class Configuration -{ - public static final File STD_OUT = new File(""); - - - /////////////////////////////////////////////////////////////////////////// - // Input and output options. - /////////////////////////////////////////////////////////////////////////// - - /** - * A list of input and output entries (jars, wars, ears, jmods, zips, and directories). - */ - public ClassPath programJars; - - /** - * A list of library entries (jars, wars, ears, jmods, zips, and directories). - */ - public ClassPath libraryJars; - - /** - * Specifies whether to skip non-public library classes while reading - * library jars. - */ - public boolean skipNonPublicLibraryClasses = false; - - /** - * Specifies whether to skip non-public library class members while reading - * library classes. - */ - public boolean skipNonPublicLibraryClassMembers = true; - - /** - * A list of Strings specifying directories to be kept in - * the output directories or the output jars. A null list - * means no directories. An empty list means all directories. The directory - * names may contain "**", "*", or "?" wildcards, and they may be preceded - * by the "!" negator. - */ - public List keepDirectories; - - /** - * Specifies the version number of the output classes, or 0 if the version - * number can be left unchanged. - */ - public int targetClassVersion; - - /** - * Specifies the last modification time of this configuration. This time - * is necessary to check whether the input has to be processed. Setting it - * to Long.MAX_VALUE forces processing, even if the modification times - * of the output appear more recent than the modification times of the - * input. - */ - public long lastModified = 0L; - - /////////////////////////////////////////////////////////////////////////// - // Keep options. - /////////////////////////////////////////////////////////////////////////// - - /** - * A list of {@link KeepClassSpecification} instances, whose class names and - * class member names are to be kept from shrinking, optimization, and/or - * obfuscation. - */ - public List keep; - - /** - * An optional output file for listing the kept seeds. - * An empty file name means the standard output. - */ - public File printSeeds; - - /////////////////////////////////////////////////////////////////////////// - // Shrinking options. - /////////////////////////////////////////////////////////////////////////// - - /** - * Specifies whether the code should be shrunk. - */ - public boolean shrink = true; - - /** - * An optional output file for listing the unused classes and class - * members. An empty file name means the standard output. - */ - public File printUsage; - - /** - * A list of {@link ClassSpecification} instances, for which an explanation - * is to be printed, why they are kept in the shrinking step. - */ - public List whyAreYouKeeping; - - /////////////////////////////////////////////////////////////////////////// - // Optimization options. - /////////////////////////////////////////////////////////////////////////// - - /** - * Specifies whether the code should be optimized. - */ - public boolean optimize = true; - - /** - * A list of Strings specifying the optimizations to be - * performed. A null list means all optimizations. The - * optimization names may contain "*" or "?" wildcards, and they may - * be preceded by the "!" negator. - */ - public List optimizations; - - /** - * Specifies the number of optimization passes. - */ - public int optimizationPasses = 1; - - /** - * A list of {@link ClassSpecification} instances, whose methods are - * assumed to have no side effects. - */ - public List assumeNoSideEffects; - - /** - * A list of {@link ClassSpecification} instances, whose methods are - * assumed to have no side external effects (that is, outside of 'this'). - */ - public List assumeNoExternalSideEffects; - - /** - * A list of {@link ClassSpecification} instances, whose methods are - * assumed not to let any reference parameters escape (including 'this'). - */ - public List assumeNoEscapingParameters; - - /** - * A list of {@link ClassSpecification} instances, whose methods are - * assumed not to return any external references (only parameters and new - * instances). - */ - public List assumeNoExternalReturnValues; - - /** - * Specifies whether the access of class members can be modified. - */ - public boolean allowAccessModification = false; - - /** - * Specifies whether interfaces may be merged aggressively. - */ - public boolean mergeInterfacesAggressively = false; - - /////////////////////////////////////////////////////////////////////////// - // Obfuscation options. - /////////////////////////////////////////////////////////////////////////// - - /** - * Specifies whether the code should be obfuscated. - */ - public boolean obfuscate = true; - - /** - * An optional output file for listing the obfuscation mapping. - * An empty file name means the standard output. - */ - public File printMapping; - - /** - * An optional input file for reading an obfuscation mapping. - */ - public File applyMapping; - - /** - * An optional name of a file containing obfuscated class member names. - */ - public URL obfuscationDictionary; - - /** - * An optional name of a file containing obfuscated class names. - */ - public URL classObfuscationDictionary; - - /** - * An optional name of a file containing obfuscated package names. - */ - public URL packageObfuscationDictionary; - - /** - * Specifies whether to apply aggressive name overloading on class members. - */ - public boolean overloadAggressively = false; - - /** - * Specifies whether to generate globally unique class member names. - */ - public boolean useUniqueClassMemberNames = false; - - /** - * Specifies whether obfuscated packages and classes can get mixed-case names. - */ - public boolean useMixedCaseClassNames = true; - - /** - * A list of Strings specifying package names to be kept. - * A null list means no names. An empty list means all - * names. The package names may contain "**", "*", or "?" wildcards, and - * they may be preceded by the "!" negator. - */ - public List keepPackageNames; - - /** - * An optional base package if the obfuscated package hierarchy is to be - * flattened, null otherwise. - */ - public String flattenPackageHierarchy; - - /** - * An optional base package if the obfuscated classes are to be repackaged - * into a single package, null otherwise. - */ - public String repackageClasses; - - /** - * A list of Strings specifying optional attributes to be kept. - * A null list means no attributes. An empty list means all - * attributes. The attribute names may contain "*" or "?" wildcards, and - * they may be preceded by the "!" negator. - */ - public List keepAttributes; - - /** - * Specifies whether method parameter names and types should be kept for - * methods that are not obfuscated. This is achieved by keeping partial - * "LocalVariableTable" and "LocalVariableTypeTable" attributes. - */ - public boolean keepParameterNames = false; - - /** - * An optional replacement for all SourceFile attributes. - */ - public String newSourceFileAttribute; - - /** - * A list of Strings specifying a filter for classes whose - * string constants are to be adapted, based on corresponding obfuscated - * class names. - */ - public List adaptClassStrings; - - /** - * A list of Strings specifying a filter for files whose - * names are to be adapted, based on corresponding obfuscated class names. - */ - public List adaptResourceFileNames; - - /** - * A list of Strings specifying a filter for files whose - * contents are to be adapted, based on obfuscated class names. - */ - public List adaptResourceFileContents; - - /////////////////////////////////////////////////////////////////////////// - // Preverification options. - /////////////////////////////////////////////////////////////////////////// - - /** - * Specifies whether the code should be preverified. - */ - public boolean preverify = true; - - /** - * Specifies whether the code should be preverified for Java Micro Edition - * (creating StackMap attributes) instead of for Java Standard Edition - * (creating StackMapTable attributes). - */ - public boolean microEdition = false; - - /** - * Specifies whether the code should be targeted at the Android platform. - */ - public boolean android = false; - - /////////////////////////////////////////////////////////////////////////// - // General options. - /////////////////////////////////////////////////////////////////////////// - - /** - * Specifies whether to print verbose messages. - */ - public boolean verbose = false; - - /** - * A list of Strings specifying a filter for the classes for - * which not to print notes, if there are noteworthy potential problems. - * A null list means all classes. The class names may contain - * "**", "*", or "?" wildcards, and they may be preceded by the "!" negator. - */ - public List note = null; - - /** - * A list of Strings specifying a filter for the classes for - * which not to print warnings, if there are any problems. - * A null list means all classes. The class names may contain - * "**", "*", or "?" wildcards, and they may be preceded by the "!" negator. - */ - public List warn = null; - - /** - * Specifies whether to ignore any warnings. - */ - public boolean ignoreWarnings = false; - - /** - * An optional output file for printing out the configuration that ProGuard - * is using (with included files and replaced variables). - * An empty file name means the standard output. - */ - public File printConfiguration; - - /** - * An optional output file for printing out the processed code in a more - * or less readable form. An empty file name means the standard output. - */ - public File dump; - - /** - * Specifies whether to add logging to reflection code, providing suggestions - * on the ProGuard configuration. - */ - public boolean addConfigurationDebugging; - - /** - * Specifies whether to backporting of class files to another - * targetClassVersion shall be enabled. - */ - public boolean backport = false; - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationChecker.java deleted file mode 100644 index 60d76997..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationChecker.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.util.WarningPrinter; - -import java.io.IOException; - -/** - * This class performs sanity checks on a given configurations. - * - * @author Eric Lafortune - */ -public class ConfigurationChecker -{ - private final Configuration configuration; - - - /** - * Creates a new ConfigurationChecker with the given configuration. - */ - public ConfigurationChecker(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Checks the given configuration for potential problems. - */ - public void check() throws IOException - { - ClassPath programJars = configuration.programJars; - ClassPath libraryJars = configuration.libraryJars; - - // Check that the input isn't empty. - if (programJars == null) - { - throw new IOException("The input is empty. You have to specify one or more '-injars' options."); - } - - // Check that the first jar is an input jar. - ClassPathEntry firstEntry = programJars.get(0); - if (firstEntry.isOutput()) - { - throw new IOException("The output jar [" + firstEntry.getName() + - "] must be specified after an input jar, or it will be empty."); - } - - // Check that the first of two subsequent the output jars has a filter. - for (int index = 0; index < programJars.size() - 1; index++) - { - ClassPathEntry entry = programJars.get(index); - if (entry.isOutput() && - !entry.isFiltered() && - programJars.get(index + 1).isOutput()) - { - throw new IOException("The output jar [" + entry.getName() + - "] must have a filter, or all subsequent output jars will be empty."); - } - } - - // Check for conflicts between input/output entries of the class paths. - checkConflicts(programJars, programJars); - checkConflicts(programJars, libraryJars); - checkConflicts(libraryJars, libraryJars); - - // Print out some general notes if necessary. - if ((configuration.note == null || - !configuration.note.isEmpty())) - { - // Check for potential problems with mixed-case class names on - // case-insensitive file systems. - if (configuration.obfuscate && - configuration.useMixedCaseClassNames && - configuration.classObfuscationDictionary == null) - { - String os = System.getProperty("os.name").toLowerCase(); - if (os.startsWith("windows") || - os.startsWith("mac os")) - { - // Go over all program class path entries. - for (int index = 0; index < programJars.size(); index++) - { - // Is it an output directory? - ClassPathEntry entry = programJars.get(index); - if (entry.isOutput() && - !entry.isApk() && - !entry.isJar() && - !entry.isAar() && - !entry.isWar() && - !entry.isEar() && - !entry.isJmod() && - !entry.isZip()) - { - System.out.println("Note: you're writing the processed class files to a directory [" + entry.getName() + "]."); - System.out.println(" This will likely cause problems with obfuscated mixed-case class names."); - System.out.println(" You should consider writing the output to a jar file, or otherwise"); - System.out.println(" specify '-dontusemixedcaseclassnames'."); - - break; - } - } - } - } - - // Check if -adaptresourcefilecontents has a proper filter. - if (configuration.adaptResourceFileContents != null && - (configuration.adaptResourceFileContents.isEmpty() || - configuration.adaptResourceFileContents.get(0).equals(ConfigurationConstants.ANY_FILE_KEYWORD))) - { - System.out.println("Note: you're specifying '-adaptresourcefilecontents' for all resource files."); - System.out.println(" This will most likely cause problems with binary files."); - } - - // Check if all -keepclassmembers options indeed have class members. - WarningPrinter keepClassMemberNotePrinter = new WarningPrinter(System.out, configuration.note); - - new KeepClassMemberChecker(keepClassMemberNotePrinter).checkClassSpecifications(configuration.keep); - - // Check if -assumenosideffects options don't specify all methods. - WarningPrinter assumeNoSideEffectsNotePrinter = new WarningPrinter(System.out, configuration.note); - - new AssumeNoSideEffectsChecker(assumeNoSideEffectsNotePrinter).checkClassSpecifications(configuration.assumeNoSideEffects); - - // Print out a summary of the notes, if necessary. - int keepClassMemberNoteCount = keepClassMemberNotePrinter.getWarningCount(); - if (keepClassMemberNoteCount > 0) - { - System.out.println("Note: there were " + keepClassMemberNoteCount + - " '-keepclassmembers' options that didn't specify class"); - System.out.println(" members. You should specify at least some class members or consider"); - System.out.println(" if you just need '-keep'."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#classmembers)"); - } - - int assumeNoSideEffectsNoteCount = assumeNoSideEffectsNotePrinter.getWarningCount(); - if (assumeNoSideEffectsNoteCount > 0) - { - System.out.println("Note: there were " + assumeNoSideEffectsNoteCount + - " '-assumenosideeffects' options that try to match all"); - System.out.println(" methods with wildcards. This will likely cause problems with methods like"); - System.out.println(" 'wait()' and 'notify()'. You should specify the methods more precisely."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#nosideeffects)"); - } - } - } - - - /** - * Performs some sanity checks on the class paths. - */ - private void checkConflicts(ClassPath classPath1, - ClassPath classPath2) - throws IOException - { - if (classPath1 == null || - classPath2 == null) - { - return; - } - - for (int index1 = 0; index1 < classPath1.size(); index1++) - { - ClassPathEntry entry1 = classPath1.get(index1); - - for (int index2 = 0; index2 < classPath2.size(); index2++) - { - if (classPath1 != classPath2 || index1 != index2) - { - ClassPathEntry entry2 = classPath2.get(index2); - - if (entry2.getName().equals(entry1.getName())) - { - if (entry1.isOutput()) - { - if (entry2.isOutput()) - { - // Output / output. - throw new IOException("The same output jar ["+entry1.getName()+"] is specified twice."); - } - else - { - // Output / input. - throw new IOException("Input jars and output jars must be different ["+entry1.getName()+"]."); - } - } - else - { - if (entry2.isOutput()) - { - // Input / output. - throw new IOException("Input jars and output jars must be different ["+entry1.getName()+"]."); - } - else if (!entry1.isFiltered() || - !entry2.isFiltered()) - { - // Input / input. - throw new IOException("The same input jar ["+entry1.getName()+"] is specified twice."); - } - } - } - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationConstants.java b/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationConstants.java deleted file mode 100644 index 407d7c3f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationConstants.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -/** - * This class provides constants for parsing and writing ProGuard configurations. - * - * @author Eric Lafortune - */ -class ConfigurationConstants -{ - public static final String OPTION_PREFIX = "-"; - public static final String AT_DIRECTIVE = "@"; - public static final String INCLUDE_DIRECTIVE = "-include"; - public static final String BASE_DIRECTORY_DIRECTIVE = "-basedirectory"; - - public static final String INJARS_OPTION = "-injars"; - public static final String OUTJARS_OPTION = "-outjars"; - public static final String LIBRARYJARS_OPTION = "-libraryjars"; - public static final String RESOURCEJARS_OPTION = "-resourcejars"; - - public static final String IF_OPTION = "-if"; - public static final String KEEP_OPTION = "-keep"; - public static final String KEEP_CLASS_MEMBERS_OPTION = "-keepclassmembers"; - public static final String KEEP_CLASSES_WITH_MEMBERS_OPTION = "-keepclasseswithmembers"; - public static final String KEEP_NAMES_OPTION = "-keepnames"; - public static final String KEEP_CLASS_MEMBER_NAMES_OPTION = "-keepclassmembernames"; - public static final String KEEP_CLASSES_WITH_MEMBER_NAMES_OPTION = "-keepclasseswithmembernames"; - public static final String INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION = "includedescriptorclasses"; - public static final String INCLUDE_CODE_SUBOPTION = "includecode"; - public static final String ALLOW_SHRINKING_SUBOPTION = "allowshrinking"; - public static final String ALLOW_OPTIMIZATION_SUBOPTION = "allowoptimization"; - public static final String ALLOW_OBFUSCATION_SUBOPTION = "allowobfuscation"; - public static final String PRINT_SEEDS_OPTION = "-printseeds"; - - public static final String DONT_SHRINK_OPTION = "-dontshrink"; - public static final String PRINT_USAGE_OPTION = "-printusage"; - public static final String WHY_ARE_YOU_KEEPING_OPTION = "-whyareyoukeeping"; - - public static final String DONT_OPTIMIZE_OPTION = "-dontoptimize"; - public static final String OPTIMIZATIONS = "-optimizations"; - public static final String OPTIMIZATION_PASSES = "-optimizationpasses"; - public static final String ASSUME_NO_SIDE_EFFECTS_OPTION = "-assumenosideeffects"; - public static final String ASSUME_NO_EXTERNAL_SIDE_EFFECTS_OPTION = "-assumenoexternalsideeffects"; - public static final String ASSUME_NO_ESCAPING_PARAMETERS_OPTION = "-assumenoescapingparameters"; - public static final String ASSUME_NO_EXTERNAL_RETURN_VALUES_OPTION = "-assumenoexternalreturnvalues"; - public static final String ALLOW_ACCESS_MODIFICATION_OPTION = "-allowaccessmodification"; - public static final String MERGE_INTERFACES_AGGRESSIVELY_OPTION = "-mergeinterfacesaggressively"; - - public static final String DONT_OBFUSCATE_OPTION = "-dontobfuscate"; - public static final String PRINT_MAPPING_OPTION = "-printmapping"; - public static final String APPLY_MAPPING_OPTION = "-applymapping"; - public static final String OBFUSCATION_DICTIONARY_OPTION = "-obfuscationdictionary"; - public static final String CLASS_OBFUSCATION_DICTIONARY_OPTION = "-classobfuscationdictionary"; - public static final String PACKAGE_OBFUSCATION_DICTIONARY_OPTION = "-packageobfuscationdictionary"; - public static final String OVERLOAD_AGGRESSIVELY_OPTION = "-overloadaggressively"; - public static final String USE_UNIQUE_CLASS_MEMBER_NAMES_OPTION = "-useuniqueclassmembernames"; - public static final String DONT_USE_MIXED_CASE_CLASS_NAMES_OPTION = "-dontusemixedcaseclassnames"; - public static final String KEEP_PACKAGE_NAMES_OPTION = "-keeppackagenames"; - public static final String FLATTEN_PACKAGE_HIERARCHY_OPTION = "-flattenpackagehierarchy"; - public static final String REPACKAGE_CLASSES_OPTION = "-repackageclasses"; - public static final String DEFAULT_PACKAGE_OPTION = "-defaultpackage"; - public static final String KEEP_ATTRIBUTES_OPTION = "-keepattributes"; - public static final String KEEP_PARAMETER_NAMES_OPTION = "-keepparameternames"; - public static final String RENAME_SOURCE_FILE_ATTRIBUTE_OPTION = "-renamesourcefileattribute"; - public static final String ADAPT_CLASS_STRINGS_OPTION = "-adaptclassstrings"; - public static final String ADAPT_RESOURCE_FILE_NAMES_OPTION = "-adaptresourcefilenames"; - public static final String ADAPT_RESOURCE_FILE_CONTENTS_OPTION = "-adaptresourcefilecontents"; - - public static final String DONT_PREVERIFY_OPTION = "-dontpreverify"; - public static final String MICRO_EDITION_OPTION = "-microedition"; - public static final String ANDROID_OPTION = "-android"; - - public static final String VERBOSE_OPTION = "-verbose"; - public static final String DONT_NOTE_OPTION = "-dontnote"; - public static final String DONT_WARN_OPTION = "-dontwarn"; - public static final String IGNORE_WARNINGS_OPTION = "-ignorewarnings"; - public static final String PRINT_CONFIGURATION_OPTION = "-printconfiguration"; - public static final String DUMP_OPTION = "-dump"; - public static final String ADD_CONFIGURATION_DEBUGGING_OPTION = "-addconfigurationdebugging"; - public static final String SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION = "-skipnonpubliclibraryclasses"; - public static final String DONT_SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION = "-dontskipnonpubliclibraryclasses"; - public static final String DONT_SKIP_NON_PUBLIC_LIBRARY_CLASS_MEMBERS_OPTION = "-dontskipnonpubliclibraryclassmembers"; - public static final String TARGET_OPTION = "-target"; - public static final String KEEP_DIRECTORIES_OPTION = "-keepdirectories"; - public static final String FORCE_PROCESSING_OPTION = "-forceprocessing"; - - - public static final String ANY_FILE_KEYWORD = "**"; - - public static final String ANY_ATTRIBUTE_KEYWORD = "*"; - public static final String ATTRIBUTE_SEPARATOR_KEYWORD = ","; - - public static final String JAR_SEPARATOR_KEYWORD = System.getProperty("path.separator"); - - public static final char OPEN_SYSTEM_PROPERTY = '<'; - public static final char CLOSE_SYSTEM_PROPERTY = '>'; - - public static final String ANNOTATION_KEYWORD = "@"; - public static final String NEGATOR_KEYWORD = "!"; - public static final String CLASS_KEYWORD = "class"; - public static final String ANY_CLASS_KEYWORD = "*"; - public static final String ANY_TYPE_KEYWORD = "***"; - public static final String IMPLEMENTS_KEYWORD = "implements"; - public static final String EXTENDS_KEYWORD = "extends"; - public static final String OPEN_KEYWORD = "{"; - public static final String ANY_CLASS_MEMBER_KEYWORD = "*"; - public static final String ANY_FIELD_KEYWORD = ""; - public static final String ANY_METHOD_KEYWORD = ""; - public static final String OPEN_ARGUMENTS_KEYWORD = "("; - public static final String ARGUMENT_SEPARATOR_KEYWORD = ","; - public static final String ANY_ARGUMENTS_KEYWORD = "..."; - public static final String CLOSE_ARGUMENTS_KEYWORD = ")"; - public static final String SEPARATOR_KEYWORD = ";"; - public static final String CLOSE_KEYWORD = "}"; -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationParser.java b/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationParser.java deleted file mode 100644 index 0ba26660..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationParser.java +++ /dev/null @@ -1,1633 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; -import proguard.util.*; - -import java.io.*; -import java.net.*; -import java.util.*; - - -/** - * This class parses ProGuard configurations. Configurations can be read from an - * array of arguments or from a configuration file or URL. External references - * in file names ('<...>') can be resolved against a given set of properties. - * - * @author Eric Lafortune - */ -public class ConfigurationParser -{ - private final WordReader reader; - private final Properties properties; - - private String nextWord; - private String lastComments; - - - /** - * Creates a new ConfigurationParser for the given String arguments and - * the given Properties. - */ - public ConfigurationParser(String[] args, - Properties properties) throws IOException - { - this(args, null, properties); - } - - - /** - * Creates a new ConfigurationParser for the given String arguments, - * with the given base directory and the given Properties. - */ - public ConfigurationParser(String[] args, - File baseDir, - Properties properties) throws IOException - { - this(new ArgumentWordReader(args, baseDir), properties); - } - - - /** - * Creates a new ConfigurationParser for the given lines, - * with the given base directory and the given Properties. - */ - public ConfigurationParser(String lines, - String description, - File baseDir, - Properties properties) throws IOException - { - this(new LineWordReader(new LineNumberReader(new StringReader(lines)), - description, - baseDir), - properties); - } - - - /** - * Creates a new ConfigurationParser for the given file, with the system - * Properties. - * @deprecated Temporary code for backward compatibility in Obclipse. - */ - public ConfigurationParser(File file) throws IOException - { - this(file, System.getProperties()); - } - - - /** - * Creates a new ConfigurationParser for the given file and the given - * Properties. - */ - public ConfigurationParser(File file, - Properties properties) throws IOException - { - this(new FileWordReader(file), properties); - } - - - /** - * Creates a new ConfigurationParser for the given URL and the given - * Properties. - */ - public ConfigurationParser(URL url, - Properties properties) throws IOException - { - this(new FileWordReader(url), properties); - } - - - /** - * Creates a new ConfigurationParser for the given word reader and the - * given Properties. - */ - public ConfigurationParser(WordReader reader, - Properties properties) throws IOException - { - this.reader = reader; - this.properties = properties; - - readNextWord(); - } - - - /** - * Parses and returns the configuration. - * @param configuration the configuration that is updated as a side-effect. - * @throws ParseException if the any of the configuration settings contains - * a syntax error. - * @throws IOException if an IO error occurs while reading a configuration. - */ - public void parse(Configuration configuration) - throws ParseException, IOException - { - while (nextWord != null) - { - lastComments = reader.lastComments(); - - // First include directives. - if (ConfigurationConstants.AT_DIRECTIVE .startsWith(nextWord) || - ConfigurationConstants.INCLUDE_DIRECTIVE .startsWith(nextWord)) configuration.lastModified = parseIncludeArgument(configuration.lastModified); - else if (ConfigurationConstants.BASE_DIRECTORY_DIRECTIVE .startsWith(nextWord)) parseBaseDirectoryArgument(); - - // Then configuration options with or without arguments. - else if (ConfigurationConstants.INJARS_OPTION .startsWith(nextWord)) configuration.programJars = parseClassPathArgument(configuration.programJars, false); - else if (ConfigurationConstants.OUTJARS_OPTION .startsWith(nextWord)) configuration.programJars = parseClassPathArgument(configuration.programJars, true); - else if (ConfigurationConstants.LIBRARYJARS_OPTION .startsWith(nextWord)) configuration.libraryJars = parseClassPathArgument(configuration.libraryJars, false); - else if (ConfigurationConstants.RESOURCEJARS_OPTION .startsWith(nextWord)) throw new ParseException("The '-resourcejars' option is no longer supported. Please use the '-injars' option for all input"); - else if (ConfigurationConstants.SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION .startsWith(nextWord)) configuration.skipNonPublicLibraryClasses = parseNoArgument(true); - else if (ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION .startsWith(nextWord)) configuration.skipNonPublicLibraryClasses = parseNoArgument(false); - else if (ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASS_MEMBERS_OPTION.startsWith(nextWord)) configuration.skipNonPublicLibraryClassMembers = parseNoArgument(false); - else if (ConfigurationConstants.TARGET_OPTION .startsWith(nextWord)) configuration.targetClassVersion = parseClassVersion(); - else if (ConfigurationConstants.FORCE_PROCESSING_OPTION .startsWith(nextWord)) configuration.lastModified = parseNoArgument(Long.MAX_VALUE); - - else if (ConfigurationConstants.IF_OPTION .startsWith(nextWord)) configuration.keep = parseIfCondition(configuration.keep); - else if (ConfigurationConstants.KEEP_OPTION .startsWith(nextWord)) configuration.keep = parseKeepClassSpecificationArguments(configuration.keep, true, false, false, null); - else if (ConfigurationConstants.KEEP_CLASS_MEMBERS_OPTION .startsWith(nextWord)) configuration.keep = parseKeepClassSpecificationArguments(configuration.keep, false, false, false, null); - else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBERS_OPTION .startsWith(nextWord)) configuration.keep = parseKeepClassSpecificationArguments(configuration.keep, false, true, false, null); - else if (ConfigurationConstants.KEEP_NAMES_OPTION .startsWith(nextWord)) configuration.keep = parseKeepClassSpecificationArguments(configuration.keep, true, false, true, null); - else if (ConfigurationConstants.KEEP_CLASS_MEMBER_NAMES_OPTION .startsWith(nextWord)) configuration.keep = parseKeepClassSpecificationArguments(configuration.keep, false, false, true, null); - else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBER_NAMES_OPTION .startsWith(nextWord)) configuration.keep = parseKeepClassSpecificationArguments(configuration.keep, false, true, true, null); - else if (ConfigurationConstants.PRINT_SEEDS_OPTION .startsWith(nextWord)) configuration.printSeeds = parseOptionalFile(); - - // After '-keep'. - else if (ConfigurationConstants.KEEP_DIRECTORIES_OPTION .startsWith(nextWord)) configuration.keepDirectories = parseCommaSeparatedList("directory name", true, true, false, true, false, true, true, false, false, configuration.keepDirectories); - - else if (ConfigurationConstants.DONT_SHRINK_OPTION .startsWith(nextWord)) configuration.shrink = parseNoArgument(false); - else if (ConfigurationConstants.PRINT_USAGE_OPTION .startsWith(nextWord)) configuration.printUsage = parseOptionalFile(); - else if (ConfigurationConstants.WHY_ARE_YOU_KEEPING_OPTION .startsWith(nextWord)) configuration.whyAreYouKeeping = parseClassSpecificationArguments(true, configuration.whyAreYouKeeping); - - else if (ConfigurationConstants.DONT_OPTIMIZE_OPTION .startsWith(nextWord)) configuration.optimize = parseNoArgument(false); - else if (ConfigurationConstants.OPTIMIZATION_PASSES .startsWith(nextWord)) configuration.optimizationPasses = parseIntegerArgument(); - else if (ConfigurationConstants.OPTIMIZATIONS .startsWith(nextWord)) configuration.optimizations = parseCommaSeparatedList("optimization name", true, false, false, false, false, true, false, false, false, configuration.optimizations); - else if (ConfigurationConstants.ASSUME_NO_SIDE_EFFECTS_OPTION .startsWith(nextWord)) configuration.assumeNoSideEffects = parseClassSpecificationArguments(true, configuration.assumeNoSideEffects); - else if (ConfigurationConstants.ASSUME_NO_EXTERNAL_SIDE_EFFECTS_OPTION .startsWith(nextWord)) configuration.assumeNoExternalSideEffects = parseClassSpecificationArguments(true, configuration.assumeNoExternalSideEffects); - else if (ConfigurationConstants.ASSUME_NO_ESCAPING_PARAMETERS_OPTION .startsWith(nextWord)) configuration.assumeNoEscapingParameters = parseClassSpecificationArguments(true, configuration.assumeNoEscapingParameters); - else if (ConfigurationConstants.ASSUME_NO_EXTERNAL_RETURN_VALUES_OPTION .startsWith(nextWord)) configuration.assumeNoExternalReturnValues = parseClassSpecificationArguments(true, configuration.assumeNoExternalReturnValues); - else if (ConfigurationConstants.ALLOW_ACCESS_MODIFICATION_OPTION .startsWith(nextWord)) configuration.allowAccessModification = parseNoArgument(true); - else if (ConfigurationConstants.MERGE_INTERFACES_AGGRESSIVELY_OPTION .startsWith(nextWord)) configuration.mergeInterfacesAggressively = parseNoArgument(true); - - else if (ConfigurationConstants.DONT_OBFUSCATE_OPTION .startsWith(nextWord)) configuration.obfuscate = parseNoArgument(false); - else if (ConfigurationConstants.PRINT_MAPPING_OPTION .startsWith(nextWord)) configuration.printMapping = parseOptionalFile(); - else if (ConfigurationConstants.APPLY_MAPPING_OPTION .startsWith(nextWord)) configuration.applyMapping = parseFile(); - else if (ConfigurationConstants.OBFUSCATION_DICTIONARY_OPTION .startsWith(nextWord)) configuration.obfuscationDictionary = parseURL(); - else if (ConfigurationConstants.CLASS_OBFUSCATION_DICTIONARY_OPTION .startsWith(nextWord)) configuration.classObfuscationDictionary = parseURL(); - else if (ConfigurationConstants.PACKAGE_OBFUSCATION_DICTIONARY_OPTION .startsWith(nextWord)) configuration.packageObfuscationDictionary = parseURL(); - else if (ConfigurationConstants.OVERLOAD_AGGRESSIVELY_OPTION .startsWith(nextWord)) configuration.overloadAggressively = parseNoArgument(true); - else if (ConfigurationConstants.USE_UNIQUE_CLASS_MEMBER_NAMES_OPTION .startsWith(nextWord)) configuration.useUniqueClassMemberNames = parseNoArgument(true); - else if (ConfigurationConstants.DONT_USE_MIXED_CASE_CLASS_NAMES_OPTION .startsWith(nextWord)) configuration.useMixedCaseClassNames = parseNoArgument(false); - else if (ConfigurationConstants.KEEP_PACKAGE_NAMES_OPTION .startsWith(nextWord)) configuration.keepPackageNames = parseCommaSeparatedList("package name", true, true, false, false, true, false, false, true, false, configuration.keepPackageNames); - else if (ConfigurationConstants.FLATTEN_PACKAGE_HIERARCHY_OPTION .startsWith(nextWord)) configuration.flattenPackageHierarchy = ClassUtil.internalClassName(parseOptionalArgument()); - else if (ConfigurationConstants.REPACKAGE_CLASSES_OPTION .startsWith(nextWord)) configuration.repackageClasses = ClassUtil.internalClassName(parseOptionalArgument()); - else if (ConfigurationConstants.DEFAULT_PACKAGE_OPTION .startsWith(nextWord)) configuration.repackageClasses = ClassUtil.internalClassName(parseOptionalArgument()); - else if (ConfigurationConstants.KEEP_ATTRIBUTES_OPTION .startsWith(nextWord)) configuration.keepAttributes = parseCommaSeparatedList("attribute name", true, true, false, false, true, false, false, false, false, configuration.keepAttributes); - else if (ConfigurationConstants.KEEP_PARAMETER_NAMES_OPTION .startsWith(nextWord)) configuration.keepParameterNames = parseNoArgument(true); - else if (ConfigurationConstants.RENAME_SOURCE_FILE_ATTRIBUTE_OPTION .startsWith(nextWord)) configuration.newSourceFileAttribute = parseOptionalArgument(); - else if (ConfigurationConstants.ADAPT_CLASS_STRINGS_OPTION .startsWith(nextWord)) configuration.adaptClassStrings = parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.adaptClassStrings); - else if (ConfigurationConstants.ADAPT_RESOURCE_FILE_NAMES_OPTION .startsWith(nextWord)) configuration.adaptResourceFileNames = parseCommaSeparatedList("resource file name", true, true, false, true, false, true, false, false, false, configuration.adaptResourceFileNames); - else if (ConfigurationConstants.ADAPT_RESOURCE_FILE_CONTENTS_OPTION .startsWith(nextWord)) configuration.adaptResourceFileContents = parseCommaSeparatedList("resource file name", true, true, false, true, false, true, false, false, false, configuration.adaptResourceFileContents); - - else if (ConfigurationConstants.DONT_PREVERIFY_OPTION .startsWith(nextWord)) configuration.preverify = parseNoArgument(false); - else if (ConfigurationConstants.MICRO_EDITION_OPTION .startsWith(nextWord)) configuration.microEdition = parseNoArgument(true); - else if (ConfigurationConstants.ANDROID_OPTION .startsWith(nextWord)) configuration.android = parseNoArgument(true); - - else if (ConfigurationConstants.VERBOSE_OPTION .startsWith(nextWord)) configuration.verbose = parseNoArgument(true); - else if (ConfigurationConstants.DONT_NOTE_OPTION .startsWith(nextWord)) configuration.note = parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.note); - else if (ConfigurationConstants.DONT_WARN_OPTION .startsWith(nextWord)) configuration.warn = parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.warn); - else if (ConfigurationConstants.IGNORE_WARNINGS_OPTION .startsWith(nextWord)) configuration.ignoreWarnings = parseNoArgument(true); - else if (ConfigurationConstants.PRINT_CONFIGURATION_OPTION .startsWith(nextWord)) configuration.printConfiguration = parseOptionalFile(); - else if (ConfigurationConstants.DUMP_OPTION .startsWith(nextWord)) configuration.dump = parseOptionalFile(); - else if (ConfigurationConstants.ADD_CONFIGURATION_DEBUGGING_OPTION .startsWith(nextWord)) configuration.addConfigurationDebugging = parseNoArgument(true); - else - { - throw new ParseException("Unknown option " + reader.locationDescription()); - } - } - } - - - /** - * Closes the configuration. - * @throws IOException if an IO error occurs while closing the configuration. - */ - public void close() throws IOException - { - if (reader != null) - { - reader.close(); - } - } - - - private long parseIncludeArgument(long lastModified) throws ParseException, IOException - { - // Read the configuration file name. - readNextWord("configuration file name", true, true, false); - - URL baseURL = reader.getBaseURL(); - URL url = null; - - try - { - // Check if the file name is a valid URL. - url = new URL(nextWord); - } - catch (MalformedURLException ex) {} - - if (url != null) - { - reader.includeWordReader(new FileWordReader(url)); - } - // Is it relative to a URL or to a file? - else if (baseURL != null) - { - url = new URL(baseURL, nextWord); - reader.includeWordReader(new FileWordReader(url)); - } - else - { - // Is the file a valid resource URL? - url = ConfigurationParser.class.getResource(nextWord); - if (url != null) - { - reader.includeWordReader(new FileWordReader(url)); - } - else - { - File file = file(nextWord); - reader.includeWordReader(new FileWordReader(file)); - - long fileLastModified = file.lastModified(); - if (fileLastModified > lastModified) - { - lastModified = fileLastModified; - } - } - } - - readNextWord(); - - return lastModified; - } - - - private void parseBaseDirectoryArgument() throws ParseException, IOException - { - // Read the base directory name. - readNextWord("base directory name", true, true, false); - - reader.setBaseDir(file(nextWord)); - - readNextWord(); - } - - - private ClassPath parseClassPathArgument(ClassPath classPath, - boolean isOutput) - throws ParseException, IOException - { - // Create a new List if necessary. - if (classPath == null) - { - classPath = new ClassPath(); - } - - while (true) - { - // Read the next jar name. - readNextWord("jar or directory name", true, false, false); - - // Create a new class path entry. - ClassPathEntry entry = new ClassPathEntry(file(nextWord), isOutput); - - // Read the opening parenthesis or the separator, if any. - readNextWord(); - - // Read the optional filters. - if (!configurationEnd() && - ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD.equals(nextWord)) - { - // Read all filters in an array. - List[] filters = new List[7]; - - int counter = 0; - do - { - // Read the filter. - filters[counter++] = - parseCommaSeparatedList("filter", true, true, true, true, false, true, true, false, false, null); - } - while (counter < filters.length && - ConfigurationConstants.SEPARATOR_KEYWORD.equals(nextWord)); - - // Make sure there is a closing parenthesis. - if (!ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD.equals(nextWord)) - { - throw new ParseException("Expecting separating '" + ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - "' or '" + ConfigurationConstants.SEPARATOR_KEYWORD + - "', or closing '" + ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD + - "' before " + reader.locationDescription()); - } - - // Set all filters from the array on the entry. - entry.setFilter(filters[--counter]); - if (counter > 0) - { - entry.setJarFilter(filters[--counter]); - if (counter > 0) - { - entry.setWarFilter(filters[--counter]); - if (counter > 0) - { - entry.setEarFilter(filters[--counter]); - if (counter > 0) - { - entry.setJmodFilter(filters[--counter]); - if (counter > 0) - { - entry.setZipFilter(filters[--counter]); - if (counter > 0) - { - // For backward compatibility, the apk - // filter comes second in the list. - entry.setApkFilter(filters[--counter]); - if (counter > 0) - { - // For backward compatibility, the aar - // filter comes first in the list. - entry.setAarFilter(filters[--counter]); - } - } - } - } - } - } - } - - // Read the separator, if any. - readNextWord(); - } - - // Add the entry to the list. - classPath.add(entry); - - if (configurationEnd()) - { - return classPath; - } - - if (!nextWord.equals(ConfigurationConstants.JAR_SEPARATOR_KEYWORD)) - { - throw new ParseException("Expecting class path separator '" + ConfigurationConstants.JAR_SEPARATOR_KEYWORD + - "' before " + reader.locationDescription()); - } - } - } - - - private int parseClassVersion() - throws ParseException, IOException - { - // Read the obligatory target. - readNextWord("java version"); - - int classVersion = ClassUtil.internalClassVersion(nextWord); - if (classVersion == 0) - { - throw new ParseException("Unsupported java version " + reader.locationDescription()); - } - - readNextWord(); - - return classVersion; - } - - - private int parseIntegerArgument() - throws ParseException, IOException - { - try - { - // Read the obligatory integer. - readNextWord("integer"); - - int integer = Integer.parseInt(nextWord); - if (integer <= 0) - { - throw new ParseException("Expecting value larger than 0, instead of '" + nextWord + - "' before " + reader.locationDescription()); - } - - readNextWord(); - - return integer; - } - catch (NumberFormatException e) - { - throw new ParseException("Expecting integer argument instead of '" + nextWord + - "' before " + reader.locationDescription()); - } - } - - - private URL parseURL() - throws ParseException, IOException - { - // Read the obligatory file name. - readNextWord("file name", true, true, false); - - // Make sure the file is properly resolved. - URL url = url(nextWord); - - readNextWord(); - - return url; - } - - - private File parseFile() - throws ParseException, IOException - { - // Read the obligatory file name. - readNextWord("file name", true, true, false); - - // Make sure the file is properly resolved. - File file = file(nextWord); - - readNextWord(); - - return file; - } - - - private File parseOptionalFile() - throws ParseException, IOException - { - // Read the optional file name. - readNextWord(true, true); - - // Didn't the user specify a file name? - if (configurationEnd()) - { - return Configuration.STD_OUT; - } - - // Make sure the file is properly resolved. - File file = file(nextWord); - - readNextWord(); - - return file; - } - - - private String parseOptionalArgument() throws IOException - { - // Read the optional argument. - readNextWord(); - - // Didn't the user specify an argument? - if (configurationEnd()) - { - return ""; - } - - String argument = nextWord; - - readNextWord(); - - return argument; - } - - - private boolean parseNoArgument(boolean value) throws IOException - { - readNextWord(); - - return value; - } - - - private long parseNoArgument(long value) throws IOException - { - readNextWord(); - - return value; - } - - - private List parseIfCondition(List keepClassSpecifications) - throws ParseException, IOException - { - // Read the condition. - readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD + - "', '" + JavaConstants.ACC_INTERFACE + - "', or '" + JavaConstants.ACC_ENUM + "'", - false, - false, - true); - - ClassSpecification condition = - parseClassSpecificationArguments(); - - // Read the corresponding keep option. - if (nextWord == null) - { - throw new ParseException("Expecting '-keep' option after '-if' option, before " + reader.locationDescription()); - } - - if (ConfigurationConstants.KEEP_OPTION .startsWith(nextWord)) keepClassSpecifications = parseKeepClassSpecificationArguments(keepClassSpecifications, true, false, false, condition); - else if (ConfigurationConstants.KEEP_CLASS_MEMBERS_OPTION .startsWith(nextWord)) keepClassSpecifications = parseKeepClassSpecificationArguments(keepClassSpecifications, false, false, false, condition); - else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBERS_OPTION .startsWith(nextWord)) keepClassSpecifications = parseKeepClassSpecificationArguments(keepClassSpecifications, false, true, false, condition); - else if (ConfigurationConstants.KEEP_NAMES_OPTION .startsWith(nextWord)) keepClassSpecifications = parseKeepClassSpecificationArguments(keepClassSpecifications, true, false, true, condition); - else if (ConfigurationConstants.KEEP_CLASS_MEMBER_NAMES_OPTION .startsWith(nextWord)) keepClassSpecifications = parseKeepClassSpecificationArguments(keepClassSpecifications, false, false, true, condition); - else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBER_NAMES_OPTION.startsWith(nextWord)) keepClassSpecifications = parseKeepClassSpecificationArguments(keepClassSpecifications, false, true, true, condition); - else - { - throw new ParseException("Expecting '-keep' option after '-if' option, before " + reader.locationDescription()); - } - - return keepClassSpecifications; - } - - - private List parseKeepClassSpecificationArguments(List keepClassSpecifications, - boolean markClasses, - boolean markConditionally, - boolean allowShrinking, - ClassSpecification condition) - throws ParseException, IOException - { - // Create a new List if necessary. - if (keepClassSpecifications == null) - { - keepClassSpecifications = new ArrayList(); - } - - // Read and add the keep configuration. - keepClassSpecifications.add(parseKeepClassSpecificationArguments(markClasses, - markConditionally, - allowShrinking, - condition)); - return keepClassSpecifications; - } - - - private KeepClassSpecification parseKeepClassSpecificationArguments(boolean markClasses, - boolean markConditionally, - boolean allowShrinking, - ClassSpecification condition) - throws ParseException, IOException - { - boolean markDescriptorClasses = false; - boolean markCodeAttributes = false; - //boolean allowShrinking = false; - boolean allowOptimization = false; - boolean allowObfuscation = false; - - // Read the keep modifiers. - while (true) - { - readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD + - "', '" + JavaConstants.ACC_INTERFACE + - "', or '" + JavaConstants.ACC_ENUM + "'", - false, false, true); - - if (!ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD.equals(nextWord)) - { - // Not a comma. Stop parsing the keep modifiers. - break; - } - - readNextWord("keyword '" + ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION + - "', '" + ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION + - "', or '" + ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION + "'"); - - if (ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION.startsWith(nextWord)) - { - markDescriptorClasses = true; - } - else if (ConfigurationConstants.INCLUDE_CODE_SUBOPTION .startsWith(nextWord)) - { - markCodeAttributes = true; - } - else if (ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION .startsWith(nextWord)) - { - allowShrinking = true; - } - else if (ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION .startsWith(nextWord)) - { - allowOptimization = true; - } - else if (ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION .startsWith(nextWord)) - { - allowObfuscation = true; - } - else - { - throw new ParseException("Expecting keyword '" + ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION + - "', '" + ConfigurationConstants.INCLUDE_CODE_SUBOPTION + - "', '" + ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION + - "', '" + ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION + - "', or '" + ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION + - "' before " + reader.locationDescription()); - } - } - - // Read the class configuration. - ClassSpecification classSpecification = - parseClassSpecificationArguments(); - - // Create and return the keep configuration. - return new KeepClassSpecification(markClasses, - markConditionally, - markDescriptorClasses, - markCodeAttributes, - allowShrinking, - allowOptimization, - allowObfuscation, - condition, - classSpecification); - } - - - private List parseClassSpecificationArguments(boolean readFirstWord, - List classSpecifications) - throws ParseException, IOException - { - // Create a new List if necessary. - if (classSpecifications == null) - { - classSpecifications = new ArrayList(); - } - - if (readFirstWord) - { - readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD + - "', '" + JavaConstants.ACC_INTERFACE + - "', or '" + JavaConstants.ACC_ENUM + "'", - false, false, true); - } - - // Read and add the class configuration. - classSpecifications.add(parseClassSpecificationArguments()); - - return classSpecifications; - } - - - /** - * Parses and returns a class specification. - * @throws ParseException if the class specification contains a syntax error. - * @throws IOException if an IO error occurs while reading the class - * specification. - */ - public ClassSpecification parseClassSpecificationArguments() - throws ParseException, IOException - { - // Clear the annotation type. - String annotationType = null; - - // Clear the class access modifiers. - int requiredSetClassAccessFlags = 0; - int requiredUnsetClassAccessFlags = 0; - - // Parse the class annotations and access modifiers until the class keyword. - while (!ConfigurationConstants.CLASS_KEYWORD.equals(nextWord)) - { - // Strip the negating sign, if any. - boolean negated = - nextWord.startsWith(ConfigurationConstants.NEGATOR_KEYWORD); - - String strippedWord = negated ? - nextWord.substring(1) : - nextWord; - - // Parse the class access modifiers. - int accessFlag = - strippedWord.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC : - strippedWord.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL : - strippedWord.equals(JavaConstants.ACC_INTERFACE) ? ClassConstants.ACC_INTERFACE : - strippedWord.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT : - strippedWord.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC : - strippedWord.equals(JavaConstants.ACC_ANNOTATION) ? ClassConstants.ACC_ANNOTATION : - strippedWord.equals(JavaConstants.ACC_ENUM) ? ClassConstants.ACC_ENUM : - unknownAccessFlag(); - - // Is it an annotation modifier? - if (accessFlag == ClassConstants.ACC_ANNOTATION) - { - readNextWord("annotation type or keyword '" + JavaConstants.ACC_INTERFACE + "'", - false, false, false); - - // Is the next word actually an annotation type? - if (!nextWord.equals(JavaConstants.ACC_INTERFACE) && - !nextWord.equals(JavaConstants.ACC_ENUM) && - !nextWord.equals(ConfigurationConstants.CLASS_KEYWORD)) - { - // Parse the annotation type. - annotationType = - ListUtil.commaSeparatedString( - parseCommaSeparatedList("annotation type", - false, false, false, false, true, false, false, false, true, null), false); - - // Continue parsing the access modifier that we just read - // in the next cycle. - continue; - } - - // Otherwise just handle the annotation modifier. - } - - if (!negated) - { - requiredSetClassAccessFlags |= accessFlag; - } - else - { - requiredUnsetClassAccessFlags |= accessFlag; - } - - if ((requiredSetClassAccessFlags & - requiredUnsetClassAccessFlags) != 0) - { - throw new ParseException("Conflicting class access modifiers for '" + strippedWord + - "' before " + reader.locationDescription()); - } - - if (strippedWord.equals(JavaConstants.ACC_INTERFACE) || - strippedWord.equals(JavaConstants.ACC_ENUM) || - strippedWord.equals(ConfigurationConstants.CLASS_KEYWORD)) - { - // The interface or enum keyword. Stop parsing the class flags. - break; - } - - // Should we read the next word? - if (accessFlag != ClassConstants.ACC_ANNOTATION) - { - readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD + - "', '" + JavaConstants.ACC_INTERFACE + - "', or '" + JavaConstants.ACC_ENUM + "'", - false, false, true); - } - } - - // Parse the class name part. - String externalClassName = - ListUtil.commaSeparatedString( - parseCommaSeparatedList("class name or interface name", - true, false, false, false, true, false, false, false, false, null), false); - - // For backward compatibility, allow a single "*" wildcard to match any - // class. - String className = ConfigurationConstants.ANY_CLASS_KEYWORD.equals(externalClassName) ? - null : - ClassUtil.internalClassName(externalClassName); - - // Clear the annotation type and the class name of the extends part. - String extendsAnnotationType = null; - String extendsClassName = null; - - if (!configurationEnd()) - { - // Parse 'implements ...' or 'extends ...' part, if any. - if (ConfigurationConstants.IMPLEMENTS_KEYWORD.equals(nextWord) || - ConfigurationConstants.EXTENDS_KEYWORD.equals(nextWord)) - { - readNextWord("class name or interface name", false, false, true); - - // Parse the annotation type, if any. - if (ConfigurationConstants.ANNOTATION_KEYWORD.equals(nextWord)) - { - extendsAnnotationType = - ListUtil.commaSeparatedString( - parseCommaSeparatedList("annotation type", - true, false, false, false, true, false, false, false, true, null), false); - } - - String externalExtendsClassName = - ListUtil.commaSeparatedString( - parseCommaSeparatedList("class name or interface name", - false, false, false, false, true, false, false, false, false, null), false); - - extendsClassName = ConfigurationConstants.ANY_CLASS_KEYWORD.equals(externalExtendsClassName) ? - null : - ClassUtil.internalClassName(externalExtendsClassName); - } - } - - // Create the basic class specification. - ClassSpecification classSpecification = - new ClassSpecification(lastComments, - requiredSetClassAccessFlags, - requiredUnsetClassAccessFlags, - annotationType, - className, - extendsAnnotationType, - extendsClassName); - - - // Now add any class members to this class specification. - if (!configurationEnd()) - { - // Check the class member opening part. - if (!ConfigurationConstants.OPEN_KEYWORD.equals(nextWord)) - { - throw new ParseException("Expecting opening '" + ConfigurationConstants.OPEN_KEYWORD + - "' at " + reader.locationDescription()); - } - - // Parse all class members. - while (true) - { - readNextWord("class member description" + - " or closing '" + ConfigurationConstants.CLOSE_KEYWORD + "'", - false, false, true); - - if (nextWord.equals(ConfigurationConstants.CLOSE_KEYWORD)) - { - // The closing brace. Stop parsing the class members. - readNextWord(); - - break; - } - - parseMemberSpecificationArguments(externalClassName, - classSpecification); - } - } - - return classSpecification; - } - - - private void parseMemberSpecificationArguments(String externalClassName, - ClassSpecification classSpecification) - throws ParseException, IOException - { - // Clear the annotation name. - String annotationType = null; - - // Parse the class member access modifiers, if any. - int requiredSetMemberAccessFlags = 0; - int requiredUnsetMemberAccessFlags = 0; - - while (!configurationEnd(true)) - { - // Parse the annotation type, if any. - if (ConfigurationConstants.ANNOTATION_KEYWORD.equals(nextWord)) - { - annotationType = - ListUtil.commaSeparatedString( - parseCommaSeparatedList("annotation type", - true, false, false, false, true, false, false, false, true, null), false); - continue; - } - - String strippedWord = nextWord.startsWith("!") ? - nextWord.substring(1) : - nextWord; - - // Parse the class member access modifiers. - int accessFlag = - strippedWord.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC : - strippedWord.equals(JavaConstants.ACC_PRIVATE) ? ClassConstants.ACC_PRIVATE : - strippedWord.equals(JavaConstants.ACC_PROTECTED) ? ClassConstants.ACC_PROTECTED : - strippedWord.equals(JavaConstants.ACC_STATIC) ? ClassConstants.ACC_STATIC : - strippedWord.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL : - strippedWord.equals(JavaConstants.ACC_SYNCHRONIZED) ? ClassConstants.ACC_SYNCHRONIZED : - strippedWord.equals(JavaConstants.ACC_VOLATILE) ? ClassConstants.ACC_VOLATILE : - strippedWord.equals(JavaConstants.ACC_TRANSIENT) ? ClassConstants.ACC_TRANSIENT : - strippedWord.equals(JavaConstants.ACC_BRIDGE) ? ClassConstants.ACC_BRIDGE : - strippedWord.equals(JavaConstants.ACC_VARARGS) ? ClassConstants.ACC_VARARGS : - strippedWord.equals(JavaConstants.ACC_NATIVE) ? ClassConstants.ACC_NATIVE : - strippedWord.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT : - strippedWord.equals(JavaConstants.ACC_STRICT) ? ClassConstants.ACC_STRICT : - strippedWord.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC : - 0; - if (accessFlag == 0) - { - // Not a class member access modifier. Stop parsing them. - break; - } - - if (strippedWord.equals(nextWord)) - { - requiredSetMemberAccessFlags |= accessFlag; - } - else - { - requiredUnsetMemberAccessFlags |= accessFlag; - } - - // Make sure the user doesn't try to set and unset the same - // access flags simultaneously. - if ((requiredSetMemberAccessFlags & - requiredUnsetMemberAccessFlags) != 0) - { - throw new ParseException("Conflicting class member access modifiers for " + - reader.locationDescription()); - } - - readNextWord("class member description"); - } - - // Parse the class member type and name part. - - // Did we get a special wildcard? - if (ConfigurationConstants.ANY_CLASS_MEMBER_KEYWORD.equals(nextWord) || - ConfigurationConstants.ANY_FIELD_KEYWORD .equals(nextWord) || - ConfigurationConstants.ANY_METHOD_KEYWORD .equals(nextWord)) - { - // Act according to the type of wildcard.. - if (ConfigurationConstants.ANY_CLASS_MEMBER_KEYWORD.equals(nextWord)) - { - checkFieldAccessFlags(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags); - checkMethodAccessFlags(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags); - - classSpecification.addField( - new MemberSpecification(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags, - annotationType, - null, - null)); - classSpecification.addMethod( - new MemberSpecification(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags, - annotationType, - null, - null)); - } - else if (ConfigurationConstants.ANY_FIELD_KEYWORD.equals(nextWord)) - { - checkFieldAccessFlags(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags); - - classSpecification.addField( - new MemberSpecification(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags, - annotationType, - null, - null)); - } - else if (ConfigurationConstants.ANY_METHOD_KEYWORD.equals(nextWord)) - { - checkMethodAccessFlags(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags); - - classSpecification.addMethod( - new MemberSpecification(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags, - annotationType, - null, - null)); - } - - // We still have to read the closing separator. - readNextWord("separator '" + ConfigurationConstants.SEPARATOR_KEYWORD + "'"); - - if (!ConfigurationConstants.SEPARATOR_KEYWORD.equals(nextWord)) - { - throw new ParseException("Expecting separator '" + ConfigurationConstants.SEPARATOR_KEYWORD + - "' before " + reader.locationDescription()); - } - } - else - { - // Make sure we have a proper type. - checkJavaIdentifier("java type"); - String type = nextWord; - - readNextWord("class member name"); - String name = nextWord; - - // Did we get just one word before the opening parenthesis? - if (ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD.equals(name)) - { - // This must be a constructor then. - // Make sure the type is a proper constructor name. - if (!(type.equals(ClassConstants.METHOD_NAME_INIT) || - type.equals(externalClassName) || - type.equals(ClassUtil.externalShortClassName(externalClassName)))) - { - throw new ParseException("Expecting type and name " + - "instead of just '" + type + - "' before " + reader.locationDescription()); - } - - // Assign the fixed constructor type and name. - type = JavaConstants.TYPE_VOID; - name = ClassConstants.METHOD_NAME_INIT; - } - else - { - // It's not a constructor. - // Make sure we have a proper name. - checkJavaIdentifier("class member name"); - - // Read the opening parenthesis or the separating - // semi-colon. - readNextWord("opening '" + ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD + - "' or separator '" + ConfigurationConstants.SEPARATOR_KEYWORD + "'"); - } - - // Are we looking at a field, a method, or something else? - if (ConfigurationConstants.SEPARATOR_KEYWORD.equals(nextWord)) - { - // It's a field. - checkFieldAccessFlags(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags); - - // We already have a field descriptor. - String descriptor = ClassUtil.internalType(type); - - // Add the field. - classSpecification.addField( - new MemberSpecification(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags, - annotationType, - name, - descriptor)); - } - else if (ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD.equals(nextWord)) - { - // It's a method. - checkMethodAccessFlags(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags); - - // Parse the method arguments. - String descriptor = - ClassUtil.internalMethodDescriptor(type, - parseCommaSeparatedList("argument", true, true, true, false, true, false, false, false, false, null)); - - if (!ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD.equals(nextWord)) - { - throw new ParseException("Expecting separating '" + ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - "' or closing '" + ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD + - "' before " + reader.locationDescription()); - } - - // Read the separator after the closing parenthesis. - readNextWord("separator '" + ConfigurationConstants.SEPARATOR_KEYWORD + "'"); - - if (!ConfigurationConstants.SEPARATOR_KEYWORD.equals(nextWord)) - { - throw new ParseException("Expecting separator '" + ConfigurationConstants.SEPARATOR_KEYWORD + - "' before " + reader.locationDescription()); - } - - // Add the method. - classSpecification.addMethod( - new MemberSpecification(requiredSetMemberAccessFlags, - requiredUnsetMemberAccessFlags, - annotationType, - name, - descriptor)); - } - else - { - // It doesn't look like a field or a method. - throw new ParseException("Expecting opening '" + ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD + - "' or separator '" + ConfigurationConstants.SEPARATOR_KEYWORD + - "' before " + reader.locationDescription()); - } - } - } - - - /** - * Reads a comma-separated list of Lists of java identifiers or of file - * names. - */ - private List parseCommaSeparatedLists(String expectedDescription, - boolean readFirstWord, - boolean allowEmptyList, - boolean expectClosingParenthesis, - boolean isFileName, - boolean checkJavaIdentifiers, - boolean allowGenerics, - boolean replaceSystemProperties, - boolean replaceExternalClassNames, - boolean replaceExternalTypes, - List list) - throws ParseException, IOException - { - if (list == null) - { - list = new ArrayList(); - } - - // Parse a new list and add it to our list. - list.add(parseCommaSeparatedList(expectedDescription, - readFirstWord, - allowEmptyList, - expectClosingParenthesis, - isFileName, - checkJavaIdentifiers, - allowGenerics, - replaceSystemProperties, - replaceExternalClassNames, - replaceExternalTypes, - null)); - return list; - } - - - /** - * Reads a comma-separated list of java identifiers or of file names. - * Examples of invocation arguments: - * - * expected read allow expect is check allow replace replace replace - * description First empty Closing File Java Generic System Extern Extern - * Word List Paren Name Id Prop Class Types - * ---------------------------------------------------------------------------------- - * ("directory name", true, true, false, true, false, true, true, false, false, ...) - * ("optimization", true, false, false, false, false, true, false, false, false, ...) - * ("package name", true, true, false, false, true, false, false, true, false, ...) - * ("attribute name", true, true, false, false, true, false, false, false, false, ...) - * ("class name", true, true, false, false, true, false, false, true, false, ...) - * ("filter", true, true, true, true, false, true, true, false, false, ...) - * ("annotation ", false, false, false, false, true, false, false, false, true, ...) - * ("class name ", true, false, false, false, true, false, false, false, false, ...) - * ("annotation ", true, false, false, false, true, false, false, false, true, ...) - * ("class name ", false, false, false, false, true, false, false, false, false, ...) - * ("annotation ", true, false, false, false, true, false, false, false, true, ...) - * ("argument", true, true, true, false, true, false, false, false, false, ...) - */ - private List parseCommaSeparatedList(String expectedDescription, - boolean readFirstWord, - boolean allowEmptyList, - boolean expectClosingParenthesis, - boolean isFileName, - boolean checkJavaIdentifiers, - boolean allowGenerics, - boolean replaceSystemProperties, - boolean replaceExternalClassNames, - boolean replaceExternalTypes, - List list) - throws ParseException, IOException - { - if (list == null) - { - list = new ArrayList(); - } - - if (readFirstWord) - { - if (!allowEmptyList) - { - // Read the first list entry. - readNextWord(expectedDescription, isFileName, true, false); - } - else if (expectClosingParenthesis) - { - // Read the first list entry. - readNextWord(expectedDescription, isFileName, true, false); - - // Return if the entry is actually empty (an empty file name or - // a closing parenthesis). - if (nextWord.length() == 0) - { - // Read the closing parenthesis - readNextWord("closing '" + ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD + - "'"); - - return list; - } - else if (nextWord.equals(ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD)) - { - return list; - } - } - else - { - // Read the first list entry, if there is any. - readNextWord(isFileName, true); - - // Check if the list is empty. - if (configurationEnd()) - { - return list; - } - } - } - - while (true) - { - if (checkJavaIdentifiers) - { - checkJavaIdentifier("java type", allowGenerics); - } - - if (replaceSystemProperties) - { - nextWord = replaceSystemProperties(nextWord); - } - - if (replaceExternalClassNames) - { - nextWord = ClassUtil.internalClassName(nextWord); - } - - if (replaceExternalTypes) - { - nextWord = ClassUtil.internalType(nextWord); - } - - list.add(nextWord); - - if (expectClosingParenthesis) - { - // Read a comma (or a closing parenthesis, or a different word). - readNextWord("separating '" + ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - "' or closing '" + ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD + - "'"); - } - else - { - // Read a comma (or a different word). - readNextWord(); - } - - if (!ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD.equals(nextWord)) - { - return list; - } - - // Read the next list entry. - readNextWord(expectedDescription, isFileName, true, false); - } - } - - - /** - * Throws a ParseException for an unexpected keyword. - */ - private int unknownAccessFlag() throws ParseException - { - throw new ParseException("Unexpected keyword " + reader.locationDescription()); - } - - - /** - * Creates a properly resolved URL, based on the given word. - */ - private URL url(String word) throws ParseException, MalformedURLException - { - String fileName = replaceSystemProperties(word); - URL url; - - try - { - // Check if the file name is a valid URL. - url = new URL(fileName); - return url; - } - catch (MalformedURLException ex) {} - - // Is it relative to a URL or to a file? - URL baseURL = reader.getBaseURL(); - if (baseURL != null) - { - url = new URL(baseURL, fileName); - } - else - { - // Is the file a valid resource URL? - url = ConfigurationParser.class.getResource(fileName); - if (url == null) - { - File file = new File(fileName); - - // Try to get an absolute file. - if (!file.isAbsolute()) - { - file = new File(reader.getBaseDir(), fileName); - } - - url = file.toURI().toURL(); - } - } - - return url; - } - - - /** - * Creates a properly resolved File, based on the given word. - */ - private File file(String word) throws ParseException - { - String fileName = replaceSystemProperties(word); - File file = new File(fileName); - - // Try to get an absolute file. - if (!file.isAbsolute()) - { - file = new File(reader.getBaseDir(), fileName); - } - - return file; - } - - - /** - * Replaces any properties in the given word by their values. - * For instance, the substring "" is replaced by its value. - */ - private String replaceSystemProperties(String word) throws ParseException - { - int fromIndex = 0; - while (true) - { - fromIndex = word.indexOf(ConfigurationConstants.OPEN_SYSTEM_PROPERTY, fromIndex); - if (fromIndex < 0) - { - break; - } - - int toIndex = word.indexOf(ConfigurationConstants.CLOSE_SYSTEM_PROPERTY, fromIndex+1); - if (toIndex < 0) - { - break; - } - - String propertyName = word.substring(fromIndex+1, toIndex); - String propertyValue = properties.getProperty(propertyName); - if (propertyValue == null) - { - throw new ParseException("Value of system property '" + propertyName + - "' is undefined in " + reader.locationDescription()); - } - - word = word.substring(0, fromIndex) + propertyValue + word.substring(toIndex+1); - - fromIndex += propertyValue.length(); - } - - return word; - } - - - /** - * Reads the next word of the configuration in the 'nextWord' field, - * throwing an exception if there is no next word. - */ - private void readNextWord(String expectedDescription) - throws ParseException, IOException - { - readNextWord(expectedDescription, false, false, false); - } - - - /** - * Reads the next word of the configuration in the 'nextWord' field, - * throwing an exception if there is no next word. - */ - private void readNextWord(String expectedDescription, - boolean isFileName, - boolean expectSingleFile, - boolean expectingAtCharacter) - throws ParseException, IOException - { - readNextWord(isFileName, expectSingleFile); - if (configurationEnd(expectingAtCharacter)) - { - throw new ParseException("Expecting " + expectedDescription + - " before " + reader.locationDescription()); - } - } - - - /** - * Reads the next word of the configuration in the 'nextWord' field. - */ - private void readNextWord() throws IOException - { - readNextWord(false, false); - } - - - /** - * Reads the next word of the configuration in the 'nextWord' field. - */ - private void readNextWord(boolean isFileName, - boolean expectSingleFile) throws IOException - { - nextWord = reader.nextWord(isFileName, expectSingleFile); - } - - - /** - * Returns whether the end of the configuration has been reached. - */ - private boolean configurationEnd() - { - return configurationEnd(false); - } - - - /** - * Returns whether the end of the configuration has been reached. - */ - private boolean configurationEnd(boolean expectingAtCharacter) - { - return nextWord == null || - nextWord.startsWith(ConfigurationConstants.OPTION_PREFIX) || - (!expectingAtCharacter && - nextWord.equals(ConfigurationConstants.AT_DIRECTIVE)); - } - - - /** - * Checks whether the given word is a valid Java identifier and throws - * a ParseException if it isn't. Wildcard characters are accepted. - */ - private void checkJavaIdentifier(String expectedDescription) - throws ParseException - { - checkJavaIdentifier(expectedDescription, true); - } - - - /** - * Checks whether the given word is a valid Java identifier and throws - * a ParseException if it isn't. Wildcard characters are accepted. - */ - private void checkJavaIdentifier(String expectedDescription, boolean allowGenerics) - throws ParseException - { - if (!isJavaIdentifier(nextWord)) - { - throw new ParseException("Expecting " + expectedDescription + - " before " + reader.locationDescription()); - } - - if (!allowGenerics && containsGenerics(nextWord)) - { - throw new ParseException("Use of generics not allowed for " + - expectedDescription + - " at " + reader.locationDescription()); - } - } - - - /** - * Returns whether the given word is a valid Java identifier. - * Wildcard characters are accepted. - */ - private boolean isJavaIdentifier(String aWord) - { - if (aWord.length() == 0) - { - return false; - } - - for (int index = 0; index < aWord.length(); index++) - { - char c = aWord.charAt(index); - if (!(Character.isJavaIdentifierPart(c) || - c == '.' || - c == '[' || - c == ']' || - c == '<' || - c == '>' || - c == '-' || - c == '!' || - c == '*' || - c == '?' || - c == '%')) - { - return false; - } - } - - return true; - } - - - private boolean containsGenerics(String aWord) - { - return containsGenerics(aWord, 0); - } - - - /** - * Returns whether the given word contains angle brackets around - * a non-digit string. - */ - private boolean containsGenerics(String aWord, int startIndex) - { - int openIndex = aWord.indexOf('<', startIndex); - if (openIndex < 0) - { - return false; - } - - int closeIndex = aWord.indexOf('>', startIndex + openIndex + 1); - if (closeIndex < 0) - { - return false; - } - - try - { - Integer.parseInt(aWord.substring(openIndex + 1, closeIndex)); - } - catch (NumberFormatException e) - { - return true; - } - - return containsGenerics(aWord,closeIndex); - } - - - /** - * Checks whether the given access flags are valid field access flags, - * throwing a ParseException if they aren't. - */ - private void checkFieldAccessFlags(int requiredSetMemberAccessFlags, - int requiredUnsetMemberAccessFlags) - throws ParseException - { - if (((requiredSetMemberAccessFlags | - requiredUnsetMemberAccessFlags) & - ~ClassConstants.VALID_ACC_FIELD) != 0) - { - throw new ParseException("Invalid method access modifier for field before " + - reader.locationDescription()); - } - } - - - /** - * Checks whether the given access flags are valid method access flags, - * throwing a ParseException if they aren't. - */ - private void checkMethodAccessFlags(int requiredSetMemberAccessFlags, - int requiredUnsetMemberAccessFlags) - throws ParseException - { - if (((requiredSetMemberAccessFlags | - requiredUnsetMemberAccessFlags) & - ~ClassConstants.VALID_ACC_METHOD) != 0) - { - throw new ParseException("Invalid field access modifier for method before " + - reader.locationDescription()); - } - } - - - /** - * A main method for testing configuration parsing. - */ - public static void main(String[] args) - { - try - { - ConfigurationParser parser = - new ConfigurationParser(args, System.getProperties()); - - try - { - parser.parse(new Configuration()); - } - catch (ParseException ex) - { - ex.printStackTrace(); - } - finally - { - parser.close(); - } - } - catch (IOException ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationWriter.java deleted file mode 100644 index 04a3b29f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ConfigurationWriter.java +++ /dev/null @@ -1,714 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.ClassConstants; -import proguard.classfile.util.ClassUtil; -import proguard.util.ListUtil; - -import java.io.*; -import java.net.*; -import java.util.*; - -/** - * This class writes ProGuard configurations to a file. - * - * @author Eric Lafortune - */ -public class ConfigurationWriter -{ - private static final String[] KEEP_OPTIONS = new String[] - { - ConfigurationConstants.KEEP_OPTION, - ConfigurationConstants.KEEP_CLASS_MEMBERS_OPTION, - ConfigurationConstants.KEEP_CLASSES_WITH_MEMBERS_OPTION - }; - - - private final PrintWriter writer; - private File baseDir; - - - /** - * Creates a new ConfigurationWriter for the given file name. - */ - public ConfigurationWriter(File configurationFile) throws IOException - { - this(new PrintWriter( - new OutputStreamWriter( - new FileOutputStream(configurationFile), "UTF-8"))); - - baseDir = configurationFile.getParentFile(); - } - - - /** - * Creates a new ConfigurationWriter for the given OutputStream. - */ - public ConfigurationWriter(OutputStream outputStream) throws IOException - { - this(new PrintWriter(outputStream)); - } - - - /** - * Creates a new ConfigurationWriter for the given PrintWriter. - */ - public ConfigurationWriter(PrintWriter writer) throws IOException - { - this.writer = writer; - } - - - /** - * Closes this ConfigurationWriter. - */ - public void close() throws IOException - { - writer.close(); - } - - - /** - * Writes the given configuration. - * @param configuration the configuration that is to be written out. - * @throws IOException if an IO error occurs while writing the configuration. - */ - public void write(Configuration configuration) throws IOException - { - // Write the program class path (input and output entries). - writeJarOptions(ConfigurationConstants.INJARS_OPTION, - ConfigurationConstants.OUTJARS_OPTION, - configuration.programJars); - writer.println(); - - // Write the library class path (output entries only). - writeJarOptions(ConfigurationConstants.LIBRARYJARS_OPTION, - ConfigurationConstants.LIBRARYJARS_OPTION, - configuration.libraryJars); - writer.println(); - - // Write the other options. - writeOption(ConfigurationConstants.SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION, configuration.skipNonPublicLibraryClasses); - writeOption(ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASS_MEMBERS_OPTION, !configuration.skipNonPublicLibraryClassMembers); - writeOption(ConfigurationConstants.KEEP_DIRECTORIES_OPTION, configuration.keepDirectories); - writeOption(ConfigurationConstants.TARGET_OPTION, ClassUtil.externalClassVersion(configuration.targetClassVersion)); - writeOption(ConfigurationConstants.FORCE_PROCESSING_OPTION, configuration.lastModified == Long.MAX_VALUE); - - writeOption(ConfigurationConstants.DONT_SHRINK_OPTION, !configuration.shrink); - writeOption(ConfigurationConstants.PRINT_USAGE_OPTION, configuration.printUsage); - - writeOption(ConfigurationConstants.DONT_OPTIMIZE_OPTION, !configuration.optimize); - writeOption(ConfigurationConstants.OPTIMIZATIONS, configuration.optimizations); - writeOption(ConfigurationConstants.OPTIMIZATION_PASSES, configuration.optimizationPasses); - writeOption(ConfigurationConstants.ALLOW_ACCESS_MODIFICATION_OPTION, configuration.allowAccessModification); - writeOption(ConfigurationConstants.MERGE_INTERFACES_AGGRESSIVELY_OPTION, configuration.mergeInterfacesAggressively); - - writeOption(ConfigurationConstants.DONT_OBFUSCATE_OPTION, !configuration.obfuscate); - writeOption(ConfigurationConstants.PRINT_MAPPING_OPTION, configuration.printMapping); - writeOption(ConfigurationConstants.APPLY_MAPPING_OPTION, configuration.applyMapping); - writeOption(ConfigurationConstants.OBFUSCATION_DICTIONARY_OPTION, configuration.obfuscationDictionary); - writeOption(ConfigurationConstants.CLASS_OBFUSCATION_DICTIONARY_OPTION, configuration.classObfuscationDictionary); - writeOption(ConfigurationConstants.PACKAGE_OBFUSCATION_DICTIONARY_OPTION, configuration.packageObfuscationDictionary); - writeOption(ConfigurationConstants.OVERLOAD_AGGRESSIVELY_OPTION, configuration.overloadAggressively); - writeOption(ConfigurationConstants.USE_UNIQUE_CLASS_MEMBER_NAMES_OPTION, configuration.useUniqueClassMemberNames); - writeOption(ConfigurationConstants.DONT_USE_MIXED_CASE_CLASS_NAMES_OPTION, !configuration.useMixedCaseClassNames); - writeOption(ConfigurationConstants.KEEP_PACKAGE_NAMES_OPTION, configuration.keepPackageNames, true); - writeOption(ConfigurationConstants.FLATTEN_PACKAGE_HIERARCHY_OPTION, configuration.flattenPackageHierarchy, true); - writeOption(ConfigurationConstants.REPACKAGE_CLASSES_OPTION, configuration.repackageClasses, true); - writeOption(ConfigurationConstants.KEEP_ATTRIBUTES_OPTION, configuration.keepAttributes); - writeOption(ConfigurationConstants.KEEP_PARAMETER_NAMES_OPTION, configuration.keepParameterNames); - writeOption(ConfigurationConstants.RENAME_SOURCE_FILE_ATTRIBUTE_OPTION, configuration.newSourceFileAttribute); - writeOption(ConfigurationConstants.ADAPT_CLASS_STRINGS_OPTION, configuration.adaptClassStrings, true); - writeOption(ConfigurationConstants.ADAPT_RESOURCE_FILE_NAMES_OPTION, configuration.adaptResourceFileNames); - writeOption(ConfigurationConstants.ADAPT_RESOURCE_FILE_CONTENTS_OPTION, configuration.adaptResourceFileContents); - - writeOption(ConfigurationConstants.DONT_PREVERIFY_OPTION, !configuration.preverify); - writeOption(ConfigurationConstants.MICRO_EDITION_OPTION, configuration.microEdition); - writeOption(ConfigurationConstants.ANDROID_OPTION, configuration.android); - - writeOption(ConfigurationConstants.VERBOSE_OPTION, configuration.verbose); - writeOption(ConfigurationConstants.DONT_NOTE_OPTION, configuration.note, true); - writeOption(ConfigurationConstants.DONT_WARN_OPTION, configuration.warn, true); - writeOption(ConfigurationConstants.IGNORE_WARNINGS_OPTION, configuration.ignoreWarnings); - writeOption(ConfigurationConstants.PRINT_CONFIGURATION_OPTION, configuration.printConfiguration); - writeOption(ConfigurationConstants.DUMP_OPTION, configuration.dump); - writeOption(ConfigurationConstants.ADD_CONFIGURATION_DEBUGGING_OPTION, configuration.addConfigurationDebugging); - - writeOption(ConfigurationConstants.PRINT_SEEDS_OPTION, configuration.printSeeds); - writer.println(); - - // Write the "why are you keeping" options. - writeOptions(ConfigurationConstants.WHY_ARE_YOU_KEEPING_OPTION, configuration.whyAreYouKeeping); - writer.println(); - - // Write the keep options. - writeOptions(KEEP_OPTIONS, configuration.keep); - - // Write the "no side effect methods" options. - writeOptions(ConfigurationConstants.ASSUME_NO_SIDE_EFFECTS_OPTION, configuration.assumeNoSideEffects); - writeOptions(ConfigurationConstants.ASSUME_NO_EXTERNAL_SIDE_EFFECTS_OPTION, configuration.assumeNoExternalSideEffects); - writeOptions(ConfigurationConstants.ASSUME_NO_ESCAPING_PARAMETERS_OPTION, configuration.assumeNoEscapingParameters); - writeOptions(ConfigurationConstants.ASSUME_NO_EXTERNAL_RETURN_VALUES_OPTION, configuration.assumeNoExternalReturnValues); - - - if (writer.checkError()) - { - throw new IOException("Can't write configuration"); - } - } - - - private void writeJarOptions(String inputEntryOptionName, - String outputEntryOptionName, - ClassPath classPath) - { - if (classPath != null) - { - for (int index = 0; index < classPath.size(); index++) - { - ClassPathEntry entry = classPath.get(index); - String optionName = entry.isOutput() ? - outputEntryOptionName : - inputEntryOptionName; - - writer.print(optionName); - writer.print(' '); - writer.print(relativeFileName(entry.getFile())); - - // Append the filters, if any. - boolean filtered = false; - - // For backward compatibility, the aar and apk filters come - // first. - filtered = writeFilter(filtered, entry.getAarFilter()); - filtered = writeFilter(filtered, entry.getApkFilter()); - filtered = writeFilter(filtered, entry.getZipFilter()); - filtered = writeFilter(filtered, entry.getJmodFilter()); - filtered = writeFilter(filtered, entry.getEarFilter()); - filtered = writeFilter(filtered, entry.getWarFilter()); - filtered = writeFilter(filtered, entry.getJarFilter()); - filtered = writeFilter(filtered, entry.getFilter()); - - if (filtered) - { - writer.print(ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD); - } - - writer.println(); - } - } - } - - - private boolean writeFilter(boolean filtered, List filter) - { - if (filtered) - { - writer.print(ConfigurationConstants.SEPARATOR_KEYWORD); - } - - if (filter != null) - { - if (!filtered) - { - writer.print(ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD); - } - - writer.print(ListUtil.commaSeparatedString(filter, true)); - - filtered = true; - } - - return filtered; - } - - - private void writeOption(String optionName, boolean flag) - { - if (flag) - { - writer.println(optionName); - } - } - - - private void writeOption(String optionName, int argument) - { - if (argument != 1) - { - writer.print(optionName); - writer.print(' '); - writer.println(argument); - } - } - - - private void writeOption(String optionName, List arguments) - { - writeOption(optionName, arguments, false); - } - - - private void writeOption(String optionName, - List arguments, - boolean replaceInternalClassNames) - { - if (arguments != null) - { - if (arguments.isEmpty()) - { - writer.println(optionName); - } - else - { - if (replaceInternalClassNames) - { - arguments = externalClassNames(arguments); - } - - writer.print(optionName); - writer.print(' '); - writer.println(ListUtil.commaSeparatedString(arguments, true)); - } - } - } - - - private void writeOption(String optionName, String arguments) - { - writeOption(optionName, arguments, false); - } - - - private void writeOption(String optionName, - String arguments, - boolean replaceInternalClassNames) - { - if (arguments != null) - { - if (replaceInternalClassNames) - { - arguments = ClassUtil.externalClassName(arguments); - } - - writer.print(optionName); - writer.print(' '); - writer.println(quotedString(arguments)); - } - } - - - private void writeOption(String optionName, URL url) - { - if (url != null) - { - if (url.getPath().length() > 0) - { - String fileName = url.toExternalForm(); - if (url.getProtocol().equals("file")) - { - try - { - fileName = relativeFileName(new File(url.toURI())); - } - catch (URISyntaxException ignore) {} - } - else - { - } - - writer.print(optionName); - writer.print(' '); - writer.println(fileName); - } - else - { - writer.println(optionName); - } - } - } - - - private void writeOption(String optionName, File file) - { - if (file != null) - { - if (file.getPath().length() > 0) - { - writer.print(optionName); - writer.print(' '); - writer.println(relativeFileName(file)); - } - else - { - writer.println(optionName); - } - } - } - - - private void writeOptions(String[] optionNames, - List keepClassSpecifications) - { - if (keepClassSpecifications != null) - { - for (int index = 0; index < keepClassSpecifications.size(); index++) - { - writeOption(optionNames, (KeepClassSpecification)keepClassSpecifications.get(index)); - } - } - } - - - private void writeOption(String[] optionNames, - KeepClassSpecification keepClassSpecification) - { - if (keepClassSpecification.condition != null) - { - writeOption(ConfigurationConstants.IF_OPTION, keepClassSpecification.condition); - } - - // Compose the option name. - String optionName = optionNames[keepClassSpecification.markConditionally ? 2 : - keepClassSpecification.markClasses ? 0 : - 1]; - - if (keepClassSpecification.markDescriptorClasses) - { - optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION; - } - - if (keepClassSpecification.markCodeAttributes) - { - optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - ConfigurationConstants.INCLUDE_CODE_SUBOPTION; - } - - if (keepClassSpecification.allowShrinking) - { - optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION; - } - - if (keepClassSpecification.allowOptimization) - { - optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION; - } - - if (keepClassSpecification.allowObfuscation) - { - optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + - ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION; - } - - // Write out the option with the proper class specification. - writeOption(optionName, keepClassSpecification); - } - - - private void writeOptions(String optionName, - List classSpecifications) - { - if (classSpecifications != null) - { - for (int index = 0; index < classSpecifications.size(); index++) - { - writeOption(optionName, (ClassSpecification)classSpecifications.get(index)); - } - } - } - - - private void writeOption(String optionName, - ClassSpecification classSpecification) - { - writer.println(); - - // Write out the comments for this option. - writeComments(classSpecification.comments); - - writer.print(optionName); - writer.print(' '); - - // Write out the required annotation, if any. - if (classSpecification.annotationType != null) - { - writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); - writer.print(ClassUtil.externalType(classSpecification.annotationType)); - writer.print(' '); - } - - // Write out the class access flags. - writer.print(ClassUtil.externalClassAccessFlags(classSpecification.requiredUnsetAccessFlags, - ConfigurationConstants.NEGATOR_KEYWORD)); - - writer.print(ClassUtil.externalClassAccessFlags(classSpecification.requiredSetAccessFlags)); - - // Write out the class keyword, if we didn't write the interface - // keyword earlier. - if (((classSpecification.requiredSetAccessFlags | - classSpecification.requiredUnsetAccessFlags) & - (ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_ENUM | - ClassConstants.ACC_MODULE)) == 0) - { - writer.print(ConfigurationConstants.CLASS_KEYWORD); - } - - writer.print(' '); - - // Write out the class name. - writer.print(classSpecification.className != null ? - ClassUtil.externalClassName(classSpecification.className) : - ConfigurationConstants.ANY_CLASS_KEYWORD); - - // Write out the extends template, if any. - if (classSpecification.extendsAnnotationType != null || - classSpecification.extendsClassName != null) - { - writer.print(' '); - writer.print(ConfigurationConstants.EXTENDS_KEYWORD); - writer.print(' '); - - // Write out the required extends annotation, if any. - if (classSpecification.extendsAnnotationType != null) - { - writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); - writer.print(ClassUtil.externalType(classSpecification.extendsAnnotationType)); - writer.print(' '); - } - - // Write out the extended class name. - writer.print(classSpecification.extendsClassName != null ? - ClassUtil.externalClassName(classSpecification.extendsClassName) : - ConfigurationConstants.ANY_CLASS_KEYWORD); - } - - // Write out the keep field and keep method options, if any. - if (classSpecification.fieldSpecifications != null || - classSpecification.methodSpecifications != null) - { - writer.print(' '); - writer.println(ConfigurationConstants.OPEN_KEYWORD); - - writeFieldSpecification( classSpecification.fieldSpecifications); - writeMethodSpecification(classSpecification.methodSpecifications); - - writer.println(ConfigurationConstants.CLOSE_KEYWORD); - } - else - { - writer.println(); - } - } - - - - private void writeComments(String comments) - { - if (comments != null) - { - int index = 0; - while (index < comments.length()) - { - int breakIndex = comments.indexOf('\n', index); - if (breakIndex < 0) - { - breakIndex = comments.length(); - } - - writer.print('#'); - - if (comments.charAt(index) != ' ') - { - writer.print(' '); - } - - writer.println(comments.substring(index, breakIndex)); - - index = breakIndex + 1; - } - } - } - - - private void writeFieldSpecification(List memberSpecifications) - { - if (memberSpecifications != null) - { - for (int index = 0; index < memberSpecifications.size(); index++) - { - MemberSpecification memberSpecification = - (MemberSpecification)memberSpecifications.get(index); - - writer.print(" "); - - // Write out the required annotation, if any. - if (memberSpecification.annotationType != null) - { - writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); - writer.println(ClassUtil.externalType(memberSpecification.annotationType)); - writer.print(" "); - } - - // Write out the field access flags. - writer.print(ClassUtil.externalFieldAccessFlags(memberSpecification.requiredUnsetAccessFlags, - ConfigurationConstants.NEGATOR_KEYWORD)); - - writer.print(ClassUtil.externalFieldAccessFlags(memberSpecification.requiredSetAccessFlags)); - - // Write out the field name and descriptor. - String name = memberSpecification.name; - String descriptor = memberSpecification.descriptor; - - writer.print(descriptor == null ? name == null ? - ConfigurationConstants.ANY_FIELD_KEYWORD : - ConfigurationConstants.ANY_TYPE_KEYWORD + ' ' + name : - ClassUtil.externalFullFieldDescription(0, - name == null ? ConfigurationConstants.ANY_CLASS_MEMBER_KEYWORD : name, - descriptor)); - - writer.println(ConfigurationConstants.SEPARATOR_KEYWORD); - } - } - } - - - private void writeMethodSpecification(List memberSpecifications) - { - if (memberSpecifications != null) - { - for (int index = 0; index < memberSpecifications.size(); index++) - { - MemberSpecification memberSpecification = - (MemberSpecification)memberSpecifications.get(index); - - writer.print(" "); - - // Write out the required annotation, if any. - if (memberSpecification.annotationType != null) - { - writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); - writer.println(ClassUtil.externalType(memberSpecification.annotationType)); - writer.print(" "); - } - - // Write out the method access flags. - writer.print(ClassUtil.externalMethodAccessFlags(memberSpecification.requiredUnsetAccessFlags, - ConfigurationConstants.NEGATOR_KEYWORD)); - - writer.print(ClassUtil.externalMethodAccessFlags(memberSpecification.requiredSetAccessFlags)); - - // Write out the method name and descriptor. - String name = memberSpecification.name; - String descriptor = memberSpecification.descriptor; - - writer.print(descriptor == null ? name == null ? - ConfigurationConstants.ANY_METHOD_KEYWORD : - ConfigurationConstants.ANY_TYPE_KEYWORD + ' ' + name + ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD + ConfigurationConstants.ANY_ARGUMENTS_KEYWORD + ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD : - ClassUtil.externalFullMethodDescription(ClassConstants.METHOD_NAME_INIT, - 0, - name == null ? ConfigurationConstants.ANY_CLASS_MEMBER_KEYWORD : name, - descriptor)); - - writer.println(ConfigurationConstants.SEPARATOR_KEYWORD); - } - } - } - - - /** - * Returns a list with external versions of the given list of internal - * class names. - */ - private List externalClassNames(List internalClassNames) - { - List externalClassNames = new ArrayList(internalClassNames.size()); - - for (int index = 0; index < internalClassNames.size(); index++) - { - externalClassNames.add(ClassUtil.externalClassName((String)internalClassNames.get(index))); - } - - return externalClassNames; - } - - - /** - * Returns a relative file name of the given file, if possible. - * The file name is also quoted, if necessary. - */ - private String relativeFileName(File file) - { - String fileName = file.getAbsolutePath(); - - // See if we can convert the file name into a relative file name. - if (baseDir != null) - { - String baseDirName = baseDir.getAbsolutePath() + File.separator; - if (fileName.startsWith(baseDirName)) - { - fileName = fileName.substring(baseDirName.length()); - } - } - - return quotedString(fileName); - } - - - /** - * Returns a quoted version of the given string, if necessary. - */ - private String quotedString(String string) - { - return string.length() == 0 || - string.indexOf(' ') >= 0 || - string.indexOf('@') >= 0 || - string.indexOf('{') >= 0 || - string.indexOf('}') >= 0 || - string.indexOf('(') >= 0 || - string.indexOf(')') >= 0 || - string.indexOf(':') >= 0 || - string.indexOf(';') >= 0 || - string.indexOf(',') >= 0 ? ("'" + string + "'") : - ( string ); - } - - - /** - * A main method for testing configuration writing. - */ - public static void main(String[] args) { - try - { - ConfigurationWriter writer = new ConfigurationWriter(new File(args[0])); - - writer.write(new Configuration()); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/DataEntryReaderFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/DataEntryReaderFactory.java deleted file mode 100644 index a51096ba..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/DataEntryReaderFactory.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.ClassConstants; -import proguard.io.*; -import proguard.util.*; - -import java.util.List; - - -/** - * This class can create DataEntryReader instances based on class path entries. - * The readers will unwrap the input data entries from any jars, wars, ears, - * jmods, and zips before passing them to a given reader. - * - * @author Eric Lafortune - */ -public class DataEntryReaderFactory -{ - /** - * Creates a DataEntryReader that can read the given class path entry. - * - * @param messagePrefix a prefix for messages that are printed out. - * @param classPathEntry the input class path entry. - * @param reader a data entry reader to which the reading of actual - * classes and resource files can be delegated. - * @return a DataEntryReader for reading the given class path entry. - */ - public static DataEntryReader createDataEntryReader(String messagePrefix, - ClassPathEntry classPathEntry, - DataEntryReader reader) - { - boolean isApk = classPathEntry.isApk(); - boolean isJar = classPathEntry.isJar(); - boolean isAar = classPathEntry.isAar(); - boolean isWar = classPathEntry.isWar(); - boolean isEar = classPathEntry.isEar(); - boolean isJmod = classPathEntry.isJmod(); - boolean isZip = classPathEntry.isZip(); - - List filter = classPathEntry.getFilter(); - List apkFilter = classPathEntry.getApkFilter(); - List jarFilter = classPathEntry.getJarFilter(); - List aarFilter = classPathEntry.getAarFilter(); - List warFilter = classPathEntry.getWarFilter(); - List earFilter = classPathEntry.getEarFilter(); - List jmodFilter = classPathEntry.getJmodFilter(); - List zipFilter = classPathEntry.getZipFilter(); - - System.out.println(messagePrefix + - (isApk ? "apk" : - isJar ? "jar" : - isAar ? "aar" : - isWar ? "war" : - isEar ? "ear" : - isJmod ? "jmod" : - isZip ? "zip" : - "directory") + - " [" + classPathEntry.getName() + "]" + - (filter != null || - apkFilter != null || - jarFilter != null || - aarFilter != null || - warFilter != null || - earFilter != null || - jmodFilter != null || - zipFilter != null ? " (filtered)" : "")); - - // Add a filter, if specified. - if (filter != null) - { - reader = new FilteredDataEntryReader( - new DataEntryNameFilter( - new ListParser(new FileNameParser()).parse(filter)), - reader); - } - - // Unzip any apks, if necessary. - reader = wrapInJarReader(reader, false, false, isApk, apkFilter, ".apk"); - if (!isApk) - { - // Unzip any jars, if necessary. - reader = wrapInJarReader(reader, false, false, isJar, jarFilter, ".jar"); - if (!isJar) - { - // Unzip any aars, if necessary. - reader = wrapInJarReader(reader, false, false, isAar, aarFilter, ".aar"); - if (!isAar) - { - // Unzip any wars, if necessary. - reader = wrapInJarReader(reader, true, false, isWar, warFilter, ".war"); - if (!isWar) - { - // Unzip any ears, if necessary. - reader = wrapInJarReader(reader, false, false, isEar, earFilter, ".ear"); - if (!isEar) - { - // Unzip any jmods, if necessary. - reader = wrapInJarReader(reader, true, true, isJmod, jmodFilter, ".jmod"); - if (!isJmod) - { - // Unzip any zips, if necessary. - reader = wrapInJarReader(reader, false, false, isZip, zipFilter, ".zip"); - } - } - } - } - } - } - - return reader; - } - - - /** - * Wraps the given DataEntryReader in a JarReader, filtering it if - * necessary. - * @param reader the data entry reader that can read the - * entries contained in the jar file. - * @param stripClassesPrefix specifies whether to strip the ""classes/" - * prefix from contained .class data entries. - *@param stripJmodHeader specifies whether to strip the jmod magic - * bytes from the zip. - * @param isJar specifies whether the data entries should - * always be unzipped. - * @param jarFilter otherwise, an optional filter on the data - * entry names. - * @param jarExtension also otherwise, a required data entry name - * extension. - * @return a DataEntryReader for reading the entries of jar file data - * entries. - */ - private static DataEntryReader wrapInJarReader(DataEntryReader reader, - boolean stripClassesPrefix, - boolean stripJmodHeader, - boolean isJar, - List jarFilter, - String jarExtension) - { - if (stripClassesPrefix) - { - reader = new FilteredDataEntryReader( - new DataEntryNameFilter(new ExtensionMatcher(ClassConstants.CLASS_FILE_EXTENSION)), - new PrefixStrippingDataEntryReader(ClassConstants.JMOD_CLASS_FILE_PREFIX, reader), - reader); - } - - // Unzip any jars, if necessary. - DataEntryReader jarReader = new JarReader(reader, stripJmodHeader); - - if (isJar) - { - // Always unzip. - return jarReader; - } - else - { - // Add a filter, if specified. - if (jarFilter != null) - { - jarReader = new FilteredDataEntryReader( - new DataEntryNameFilter( - new ListParser(new FileNameParser()).parse(jarFilter)), - jarReader); - } - - // Only unzip the right type of jars. - return new FilteredDataEntryReader( - new DataEntryNameFilter( - new ExtensionMatcher(jarExtension)), - jarReader, - reader); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/DataEntryWriterFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/DataEntryWriterFactory.java deleted file mode 100644 index 73fdd165..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/DataEntryWriterFactory.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.io.*; -import proguard.util.*; - -import java.util.List; - -/** - * This class can create DataEntryWriter instances based on class paths. The - * writers will wrap the output in the proper apks, jars, wars, ears, jmods, - * and zips. - * - * @author Eric Lafortune - */ -public class DataEntryWriterFactory -{ - private final ClassPool programClassPool; - private final MultiValueMap extraClassNameMap; - - - /** - * Creates a new DataEntryWriterFactory with the given parameters. - * @param programClassPool the program classpool to process. - */ - public DataEntryWriterFactory(ClassPool programClassPool, - MultiValueMap extraClassNamemap) - { - this.programClassPool = programClassPool; - this.extraClassNameMap = extraClassNamemap; - } - - - /** - * Creates a DataEntryWriter that can write to the given class path entries. - * - * @param classPath the output class path. - * @param fromIndex the start index in the class path. - * @param toIndex the end index in the class path. - * @return a DataEntryWriter for writing to the given class path entries. - */ - public DataEntryWriter createDataEntryWriter(ClassPath classPath, - int fromIndex, - int toIndex) - { - DataEntryWriter writer = null; - - // Create a chain of writers, one for each class path entry. - for (int index = toIndex - 1; index >= fromIndex; index--) - { - ClassPathEntry entry = classPath.get(index); - - writer = createClassPathEntryWriter(entry, writer); - } - - return writer; - } - - - /** - * Creates a DataEntryWriter that can write to the given class path entry, - * or delegate to another DataEntryWriter if its filters don't match. - */ - private DataEntryWriter createClassPathEntryWriter(ClassPathEntry classPathEntry, - DataEntryWriter alternativeWriter) - { - boolean isApk = classPathEntry.isApk(); - boolean isJar = classPathEntry.isJar(); - boolean isAar = classPathEntry.isAar(); - boolean isWar = classPathEntry.isWar(); - boolean isEar = classPathEntry.isEar(); - boolean isJmod = classPathEntry.isJmod(); - boolean isZip = classPathEntry.isZip(); - - List filter = classPathEntry.getFilter(); - List apkFilter = classPathEntry.getApkFilter(); - List jarFilter = classPathEntry.getJarFilter(); - List aarFilter = classPathEntry.getAarFilter(); - List warFilter = classPathEntry.getWarFilter(); - List earFilter = classPathEntry.getEarFilter(); - List jmodFilter = classPathEntry.getJmodFilter(); - List zipFilter = classPathEntry.getZipFilter(); - - System.out.println("Preparing output " + - (isApk ? "apk" : - isJar ? "jar" : - isAar ? "aar" : - isWar ? "war" : - isEar ? "ear" : - isJmod ? "jmod" : - isZip ? "zip" : - "directory") + - " [" + classPathEntry.getName() + "]" + - (filter != null || - apkFilter != null || - jarFilter != null || - aarFilter != null || - warFilter != null || - earFilter != null || - jmodFilter != null || - zipFilter != null ? " (filtered)" : "")); - - DataEntryWriter writer = new DirectoryWriter(classPathEntry.getFile(), - isApk || - isJar || - isAar || - isWar || - isEar || - isJmod || - isZip); - - // If the output is an archive, we'll flatten (unpack the contents of) - // higher level input archives, e.g. when writing into a jar file, we - // flatten zip files. - boolean flattenApks = false; - boolean flattenJars = flattenApks || isApk; - boolean flattenAars = flattenJars || isJar; - boolean flattenWars = flattenAars || isAar; - boolean flattenEars = flattenWars || isWar; - boolean flattenJmods = flattenEars || isEar; - boolean flattenZips = flattenJmods || isJmod; - - // Set up the filtered jar writers. - writer = wrapInJarWriter(writer, flattenZips, isZip, ".zip", zipFilter, null, null); - writer = wrapInJarWriter(writer, flattenJmods, isJmod, ".jmod", jmodFilter, ClassConstants.JMOD_HEADER, ClassConstants.JMOD_CLASS_FILE_PREFIX); - writer = wrapInJarWriter(writer, flattenEars, isEar, ".ear", earFilter, null, null); - writer = wrapInJarWriter(writer, flattenWars, isWar, ".war", warFilter, null, ClassConstants.WAR_CLASS_FILE_PREFIX); - writer = wrapInJarWriter(writer, flattenAars, isAar, ".aar", aarFilter, null, null); - writer = wrapInJarWriter(writer, flattenJars, isJar, ".jar", jarFilter, null, null); - writer = wrapInJarWriter(writer, flattenApks, isApk, ".apk", apkFilter, null, null); - - // Set up for writing out the program classes. - writer = new ClassDataEntryWriter(programClassPool, writer); - - // Add a data entry filter, if specified. - writer = filter != null ? - new FilteredDataEntryWriter( - new DataEntryNameFilter( - new ListParser(new FileNameParser()).parse(filter)), - writer) : - writer; - - // Add a writer for the injected classes. - writer = new ExtraDataEntryWriter(extraClassNameMap, - writer, - writer, - ClassConstants.CLASS_FILE_EXTENSION); - - // Let the writer cascade, if specified. - return alternativeWriter != null ? - new CascadingDataEntryWriter(writer, alternativeWriter) : - writer; - } - - - /** - * Wraps the given DataEntryWriter in a JarWriter, filtering if necessary. - */ - private DataEntryWriter wrapInJarWriter(DataEntryWriter writer, - boolean flatten, - boolean isOutputJar, - String jarFilterExtension, - List jarFilter, - byte[] jarHeader, - String classFilePrefix) - { - // Flatten jars or zip them up. - DataEntryWriter jarWriter; - if (flatten) - { - // Unpack the jar. - jarWriter = new ParentDataEntryWriter(writer); - } - else - { - // Pack the jar. - jarWriter = new JarWriter(jarHeader, writer); - - // Add a prefix for class files inside the jar, if specified. - if (classFilePrefix != null) - { - jarWriter = - new FilteredDataEntryWriter( - new DataEntryNameFilter( - new ExtensionMatcher(ClassConstants.CLASS_FILE_EXTENSION)), - new PrefixAddingDataEntryWriter(classFilePrefix, - jarWriter), - jarWriter); - } - } - - // Either zip up the jar or delegate to the original writer. - return - new FilteredDataEntryWriter( - new DataEntryParentFilter( - new DataEntryNameFilter( - new ExtensionMatcher(jarFilterExtension))), - - // The parent of the data entry is a jar. - // Write the data entry to the jar. - // Apply the jar filter, if specified, to the parent. - jarFilter != null ? - new FilteredDataEntryWriter( - new DataEntryParentFilter( - new DataEntryNameFilter( - new ListParser(new FileNameParser()).parse(jarFilter))), - jarWriter) : - jarWriter, - - // The parent of the data entry is not a jar. - // Write the entry to a jar anyway if the output is a jar. - // Otherwise just delegate to the original writer. - isOutputJar ? - jarWriter : - writer); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/DescriptorKeepChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/DescriptorKeepChecker.java deleted file mode 100644 index a7817a58..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/DescriptorKeepChecker.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.*; - -import java.util.List; - -/** - * This class checks whether classes referenced by class members that are - * marked to be kept are marked to be kept too. - * - * @author Eric Lafortune - */ -public class DescriptorKeepChecker -extends SimplifiedVisitor -implements MemberVisitor, - ClassVisitor -{ - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final WarningPrinter notePrinter; - - // Some fields acting as parameters for the class visitor. - private Clazz referencingClass; - private Member referencingMember; - private boolean isField; - - - /** - * Creates a new DescriptorKeepChecker. - */ - public DescriptorKeepChecker(ClassPool programClassPool, - ClassPool libraryClassPool, - WarningPrinter notePrinter) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.notePrinter = notePrinter; - } - - - /** - * Checks the classes mentioned in the given keep specifications, printing - * notes if necessary. - */ - public void checkClassSpecifications(List keepSpecifications) - { - // Clean up any old visitor info. - programClassPool.classesAccept(new ClassCleaner()); - libraryClassPool.classesAccept(new ClassCleaner()); - - // Create a visitor for marking the seeds. - KeepMarker keepMarker = new KeepMarker(); - ClassPoolVisitor classPoolvisitor = - new KeepClassSpecificationVisitorFactory(true, true, true) - .createClassPoolVisitor(keepSpecifications, - keepMarker, - keepMarker, - keepMarker, - null); - // Mark the seeds. - programClassPool.accept(classPoolvisitor); - libraryClassPool.accept(classPoolvisitor); - - // Print out notes about argument types that are not being kept in - // class members that are being kept. - programClassPool.classesAccept( - new AllMemberVisitor( - new KeptMemberFilter(this))); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - //referencingClass = programClass; - //referencingMember = programField; - //isField = true; - // - // Don't check the type, because it is not required for introspection. - //programField.referencedClassesAccept(this); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - referencingClass = programClass; - referencingMember = programMethod; - isField = false; - - // Don't check the return type, because it is not required for - // introspection (e.g. the return type of the special Enum methods). - //programMethod.referencedClassesAccept(this); - - Clazz[] referencedClasses = programMethod.referencedClasses; - if (referencedClasses != null) - { - int count = referencedClasses.length; - - // Adapt the count if the return type is a class type (not so - // pretty; assuming test just checks for final ';'). - if (ClassUtil.isInternalClassType(programMethod.getDescriptor(programClass))) - { - count--; - } - - for (int index = 0; index < count; index++) - { - if (referencedClasses[index] != null) - { - referencedClasses[index].accept(this); - } - } - } - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (!KeepMarker.isKept(programClass)) - { - notePrinter.print(referencingClass.getName(), - programClass.getName(), - "Note: the configuration keeps the entry point '" + - ClassUtil.externalClassName(referencingClass.getName()) + - " { " + - (isField ? - ClassUtil.externalFullFieldDescription(0, - referencingMember.getName(referencingClass), - referencingMember.getDescriptor(referencingClass)) : - ClassUtil.externalFullMethodDescription(referencingClass.getName(), - 0, - referencingMember.getName(referencingClass), - referencingMember.getDescriptor(referencingClass))) + - "; }', but not the descriptor class '" + - ClassUtil.externalClassName(programClass.getName()) + - "'"); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) {} -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/DuplicateClassPrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/DuplicateClassPrinter.java deleted file mode 100644 index f8d0f4d9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/DuplicateClassPrinter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor writes out notes about the class files that it visits - * being duplicates. - * - * @author Eric Lafortune - */ -public class DuplicateClassPrinter implements ClassVisitor -{ - private final WarningPrinter notePrinter; - - - /** - * Creates a new DuplicateClassVisitor. - */ - public DuplicateClassPrinter(WarningPrinter notePrinter) - { - this.notePrinter = notePrinter; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - notePrinter.print(programClass.getName(), - "Note: duplicate definition of program class [" + - ClassUtil.externalClassName(programClass.getName()) + "]"); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - notePrinter.print(libraryClass.getName(), - "Note: duplicate definition of library class [" + - ClassUtil.externalClassName(libraryClass.getName()) + "]"); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/FileWordReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/FileWordReader.java deleted file mode 100644 index 2e32c470..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/FileWordReader.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.io.*; -import java.net.URL; - - -/** - * A WordReader that returns words from a file or a URL. - * - * @author Eric Lafortune - */ -public class FileWordReader extends LineWordReader -{ - /** - * Creates a new FileWordReader for the given file. - */ - public FileWordReader(File file) throws IOException - { - super(new LineNumberReader(new BufferedReader(new FileReader(file))), - "file '" + file.getPath() + "'", - file.getParentFile() - ); - } - - - /** - * Creates a new FileWordReader for the given URL. - */ - public FileWordReader(URL url) throws IOException - { - super(new LineNumberReader(new BufferedReader(new InputStreamReader(url.openStream()))), - "file '" + url.toString() + "'", - null); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/FullyQualifiedClassNameChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/FullyQualifiedClassNameChecker.java deleted file mode 100644 index 1f514194..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/FullyQualifiedClassNameChecker.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.util.*; - -/** - * This class checks if the user has forgotten to fully qualify any classes - * in the configuration. - * - * @author Eric Lafortune - */ -public class FullyQualifiedClassNameChecker -extends SimplifiedVisitor -implements ClassVisitor -{ - private static final String INVALID_CLASS_EXTENSION = ClassUtil.internalClassName(ClassConstants.CLASS_FILE_EXTENSION); - - - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final WarningPrinter notePrinter; - - - /** - * Creates a new FullyQualifiedClassNameChecker. - */ - public FullyQualifiedClassNameChecker(ClassPool programClassPool, - ClassPool libraryClassPool, - WarningPrinter notePrinter) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.notePrinter = notePrinter; - } - - - /** - * Checks the classes mentioned in the given class specifications, printing - * notes if necessary. - */ - public void checkClassSpecifications(List classSpecifications) - { - if (classSpecifications != null) - { - for (int index = 0; index < classSpecifications.size(); index++) - { - ClassSpecification classSpecification = - (ClassSpecification)classSpecifications.get(index); - - checkType(classSpecification.annotationType); - checkClassName(classSpecification.className); - checkType(classSpecification.extendsAnnotationType); - checkClassName(classSpecification.extendsClassName); - - checkMemberSpecifications(classSpecification.fieldSpecifications, true); - checkMemberSpecifications(classSpecification.methodSpecifications, false); - } - } - } - - - /** - * Checks the classes mentioned in the given class member specifications, - * printing notes if necessary. - */ - private void checkMemberSpecifications(List memberSpecifications, boolean isField) - { - if (memberSpecifications != null) - { - for (int index = 0; index < memberSpecifications.size(); index++) - { - MemberSpecification memberSpecification = - (MemberSpecification)memberSpecifications.get(index); - - checkType(memberSpecification.annotationType); - - if (isField) - { - checkType(memberSpecification.descriptor); - } - else - { - checkDescriptor(memberSpecification.descriptor); - } - } - } - } - - - /** - * Checks the classes mentioned in the given class member descriptor, - * printing notes if necessary. - */ - private void checkDescriptor(String descriptor) - { - if (descriptor != null) - { - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(descriptor); - - checkType(internalTypeEnumeration.returnType()); - - while (internalTypeEnumeration.hasMoreTypes()) - { - checkType(internalTypeEnumeration.nextType()); - } - } - } - - - /** - * Checks the class mentioned in the given type (if any), - * printing notes if necessary. - */ - private void checkType(String type) - { - if (type != null) - { - checkClassName(ClassUtil.internalClassNameFromType(type)); - } - } - - - /** - * Checks the specified class (if any), - * printing notes if necessary. - */ - private void checkClassName(String className) - { - if (className != null && - !containsWildCards(className) && - programClassPool.getClass(className) == null && - libraryClassPool.getClass(className) == null && - notePrinter.accepts(className)) - { - notePrinter.print(className, - "Note: the configuration refers to the unknown class '" + - ClassUtil.externalClassName(className) + "'"); - - // Strip "/class" or replace the package name by a wildcard. - int lastSeparatorIndex = - className.lastIndexOf(ClassConstants.PACKAGE_SEPARATOR); - - String fullyQualifiedClassName = - className.endsWith(INVALID_CLASS_EXTENSION) ? - className.substring(0, lastSeparatorIndex) : - "**" + ClassConstants.PACKAGE_SEPARATOR + className.substring(lastSeparatorIndex + 1); - - // Suggest matching classes. - ClassNameFilter classNameFilter = - new ClassNameFilter(fullyQualifiedClassName, this); - - programClassPool.classesAccept(classNameFilter); - libraryClassPool.classesAccept(classNameFilter); - } - } - - - private static boolean containsWildCards(String string) - { - return string != null && - (string.indexOf('!') >= 0 || - string.indexOf('*') >= 0 || - string.indexOf('?') >= 0 || - string.indexOf(',') >= 0 || - string.indexOf("///") >= 0 || - string.indexOf('<') >= 0); - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - System.out.println(" Maybe you meant the fully qualified name '" + - ClassUtil.externalClassName(clazz.getName()) + "'?"); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/GPL.java b/tools/proguard/proguard6.0.3/core/src/proguard/GPL.java deleted file mode 100644 index 635c3e1c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/GPL.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.io.*; -import java.util.*; - -/** - * This class checks and prints out information about the GPL. - * - * @author Eric Lafortune - */ -public class GPL -{ - /** - * Prints out a note about the GPL if ProGuard is linked against unknown - * code. - */ - public static void check() - { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - new Exception().printStackTrace(new PrintStream(out)); - LineNumberReader reader = new LineNumberReader( - new InputStreamReader( - new ByteArrayInputStream(out.toByteArray()))); - - Set unknownPackageNames = unknownPackageNames(reader); - - if (unknownPackageNames.size() > 0) - { - String uniquePackageNames = uniquePackageNames(unknownPackageNames); - - System.out.println("ProGuard is released under the GNU General Public License. You therefore"); - System.out.println("must ensure that programs that link to it ("+uniquePackageNames+"...)"); - System.out.println("carry the GNU General Public License as well. Alternatively, you can"); - System.out.println("apply for an exception with the author of ProGuard."); - } - } - - - /** - * Returns a set of package names from the given stack trace. - */ - private static Set unknownPackageNames(LineNumberReader reader) - { - Set packageNames = new HashSet(); - - try - { - while (true) - { - String line = reader.readLine(); - if (line == null) - { - break; - } - - line = line.trim(); - if (line.startsWith("at ")) - { - line = line.substring(2).trim(); - line = trimSuffix(line, '('); - line = trimSuffix(line, '.'); - line = trimSuffix(line, '.'); - - if (line.length() > 0 && !isKnown(line)) - { - packageNames.add(line); - } - } - } - } - catch (IOException ex) - { - // We'll just stop looking for more names. - } - - return packageNames; - } - - - /** - * Returns a comma-separated list of package names from the set, excluding - * any subpackages of packages in the set. - */ - private static String uniquePackageNames(Set packageNames) - { - StringBuffer buffer = new StringBuffer(); - - Iterator iterator = packageNames.iterator(); - while (iterator.hasNext()) - { - String packageName = (String)iterator.next(); - if (!containsPrefix(packageNames, packageName)) - { - buffer.append(packageName).append(", "); - } - } - - return buffer.toString(); - } - - - /** - * Returns a given string without the suffix, as defined by the given - * separator. - */ - private static String trimSuffix(String string, char separator) - { - int index = string.lastIndexOf(separator); - return index < 0 ? "" : string.substring(0, index); - } - - - /** - * Returns whether the given set contains a prefix of the given name. - */ - private static boolean containsPrefix(Set set, String name) - { - int index = 0; - - while (!set.contains(name.substring(0, index))) - { - index = name.indexOf('.', index + 1); - if (index < 0) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the given package name has been granted an exception - * against the GPL linking clause, by the copyright holder of ProGuard. - * This method is not legally binding, but of course the actual license is. - * Please contact the copyright holder if you would like an exception for - * your code as well. - */ - private static boolean isKnown(String packageName) - { - return packageName.startsWith("java") || - packageName.startsWith("sun.reflect") || - packageName.startsWith("proguard") || - packageName.startsWith("org.apache.tools.ant") || - packageName.startsWith("org.apache.tools.maven") || - packageName.startsWith("org.gradle") || - packageName.startsWith("org.codehaus.groovy") || - packageName.startsWith("org.eclipse") || - packageName.startsWith("org.netbeans") || - packageName.startsWith("com.android") || - packageName.startsWith("com.sun.kvem") || - packageName.startsWith("net.certiv.proguarddt") || - packageName.startsWith("groovy") || - packageName.startsWith("scala") || - packageName.startsWith("sbt") || - packageName.startsWith("xsbt") || - packageName.startsWith("eclipseme"); - } - - - public static void main(String[] args) - { - LineNumberReader reader = new LineNumberReader( - new InputStreamReader(System.in)); - - Set unknownPackageNames = unknownPackageNames(reader); - - if (unknownPackageNames.size() > 0) - { - String uniquePackageNames = uniquePackageNames(unknownPackageNames); - - System.out.println(uniquePackageNames); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/GetAnnotationChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/GetAnnotationChecker.java deleted file mode 100644 index c51131c1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/GetAnnotationChecker.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; - -/** - * This constant visitor checks whether visited method references try to - * access annotations. - * - * @author Eric Lafortune - */ -public class GetAnnotationChecker -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final WarningPrinter notePrinter; - - - /** - * Creates a new GetAnnotationChecker. - */ - public GetAnnotationChecker(WarningPrinter notePrinter) - { - this.notePrinter = notePrinter; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - String className = methodrefConstant.getClassName(clazz); - - if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS) || - className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_FIELD) || - className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_METHOD)) - { - String methodName = methodrefConstant.getName(clazz); - - if (methodName.equals(ClassConstants.METHOD_NAME_GET_ANNOTATION) || - methodName.equals(ClassConstants.METHOD_NAME_GET_ANNOTATIONS) || - methodName.equals(ClassConstants.METHOD_NAME_GET_DECLARED_ANNOTATIONS) || - methodName.equals(ClassConstants.METHOD_NAME_GET_PARAMETER_ANNOTATIONS)) - { - notePrinter.print(clazz.getName(), - "Note: " + - ClassUtil.externalClassName(clazz.getName()) + - " calls '" + - ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) + - "." + - methodName + "'"); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/GetEnclosingClassChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/GetEnclosingClassChecker.java deleted file mode 100644 index b9d58aa4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/GetEnclosingClassChecker.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; - -/** - * This constant visitor checks whether visited method references try to - * access enclosing classes. - * - * @author Eric Lafortune - */ -public class GetEnclosingClassChecker -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final WarningPrinter notePrinter; - - - /** - * Creates a new GetEnclosingMethodChecker. - */ - public GetEnclosingClassChecker(WarningPrinter notePrinter) - { - this.notePrinter = notePrinter; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - String className = methodrefConstant.getClassName(clazz); - - if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS)) - { - String methodName = methodrefConstant.getName(clazz); - - if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_CLASS) || - methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_DECLARING_CLASS)) - { - notePrinter.print(clazz.getName(), - "Note: " + - ClassUtil.externalClassName(clazz.getName()) + - " calls '" + - ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) + - "." + - methodName + "'"); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/GetEnclosingMethodChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/GetEnclosingMethodChecker.java deleted file mode 100644 index 40edb35c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/GetEnclosingMethodChecker.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; - -/** - * This constant visitor checks whether visited method references try to - * access enclosing methods. - * - * @author Eric Lafortune - */ -public class GetEnclosingMethodChecker -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final WarningPrinter notePrinter; - - - /** - * Creates a new GetEnclosingMethodChecker. - */ - public GetEnclosingMethodChecker(WarningPrinter notePrinter) - { - this.notePrinter = notePrinter; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - String className = methodrefConstant.getClassName(clazz); - - if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS)) - { - String methodName = methodrefConstant.getName(clazz); - - if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_CONSTRUCTOR) || - methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_METHOD)) - { - notePrinter.print(clazz.getName(), - "Note: " + - ClassUtil.externalClassName(clazz.getName()) + - " calls '" + - ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) + - "." + - methodName + "'"); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/GetSignatureChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/GetSignatureChecker.java deleted file mode 100644 index 699f2bbe..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/GetSignatureChecker.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; - -/** - * This constant visitor checks whether visited method references try to - * access signatures. - * - * @author Eric Lafortune - */ -public class GetSignatureChecker -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final WarningPrinter notePrinter; - - - /** - * Creates a new GetSignatureChecker. - */ - public GetSignatureChecker(WarningPrinter notePrinter) - { - this.notePrinter = notePrinter; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - String className = methodrefConstant.getClassName(clazz); - - if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS) || - className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_FIELD) || - className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_METHOD)) - { - String methodName = methodrefConstant.getName(clazz); - - if (methodName.startsWith(ClassConstants.METHOD_NAME_GET_TYPE_PREFIX) || - methodName.startsWith(ClassConstants.METHOD_NAME_GET_GENERIC_PREFIX)) - { - notePrinter.print(clazz.getName(), - "Note: " + - ClassUtil.externalClassName(clazz.getName()) + - " calls '" + - ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) + - "." + - methodName + "'"); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/Initializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/Initializer.java deleted file mode 100644 index 4e51f440..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/Initializer.java +++ /dev/null @@ -1,623 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.AllElementValueVisitor; -import proguard.classfile.attribute.visitor.AllAttributeVisitor; -import proguard.classfile.constant.visitor.AllConstantVisitor; -import proguard.classfile.instruction.visitor.AllInstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.util.*; - -import java.io.*; -import java.util.*; - -/** - * This class initializes class pools and resource information. - * - * @author Eric Lafortune - */ -public class Initializer -{ - private final Configuration configuration; - - - /** - * Creates a new Initializer to initialize classes according to the given - * configuration. - */ - public Initializer(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Initializes the classes in the given program class pool and library class - * pool, performs some basic checks, and shrinks the library class pool. - */ - public void execute(ClassPool programClassPool, - ClassPool libraryClassPool) throws IOException - { - // We're using the system's default character encoding for writing to - // the standard output and error output. - PrintWriter out = new PrintWriter(System.out, true); - PrintWriter err = new PrintWriter(System.err, true); - - int originalLibraryClassPoolSize = libraryClassPool.size(); - - // Perform basic checks on the configuration. - WarningPrinter fullyQualifiedClassNameNotePrinter = new WarningPrinter(System.out, configuration.note); - - FullyQualifiedClassNameChecker fullyQualifiedClassNameChecker = - new FullyQualifiedClassNameChecker(programClassPool, - libraryClassPool, - fullyQualifiedClassNameNotePrinter); - - fullyQualifiedClassNameChecker.checkClassSpecifications(configuration.keep); - fullyQualifiedClassNameChecker.checkClassSpecifications(configuration.assumeNoSideEffects); - fullyQualifiedClassNameChecker.checkClassSpecifications(configuration.assumeNoExternalSideEffects); - fullyQualifiedClassNameChecker.checkClassSpecifications(configuration.assumeNoEscapingParameters); - fullyQualifiedClassNameChecker.checkClassSpecifications(configuration.assumeNoExternalReturnValues); - - StringMatcher keepAttributesMatcher = configuration.keepAttributes != null ? - new ListParser(new NameParser()).parse(configuration.keepAttributes) : - new EmptyStringMatcher(); - - WarningPrinter getAnnotationNotePrinter = new WarningPrinter(System.out, configuration.note); - - if (!keepAttributesMatcher.matches(ClassConstants.ATTR_RuntimeVisibleAnnotations)) - { - programClassPool.classesAccept( - new AllConstantVisitor( - new GetAnnotationChecker(getAnnotationNotePrinter))); - } - - WarningPrinter getSignatureNotePrinter = new WarningPrinter(System.out, configuration.note); - - if (!keepAttributesMatcher.matches(ClassConstants.ATTR_Signature)) - { - programClassPool.classesAccept( - new AllConstantVisitor( - new GetSignatureChecker(getSignatureNotePrinter))); - } - - WarningPrinter getEnclosingClassNotePrinter = new WarningPrinter(System.out, configuration.note); - - if (!keepAttributesMatcher.matches(ClassConstants.ATTR_InnerClasses)) - { - programClassPool.classesAccept( - new AllConstantVisitor( - new GetEnclosingClassChecker(getEnclosingClassNotePrinter))); - } - - WarningPrinter getEnclosingMethodNotePrinter = new WarningPrinter(System.out, configuration.note); - - if (!keepAttributesMatcher.matches(ClassConstants.ATTR_EnclosingMethod)) - { - programClassPool.classesAccept( - new AllConstantVisitor( - new GetEnclosingMethodChecker(getEnclosingMethodNotePrinter))); - } - - // Construct a reduced library class pool with only those library - // classes whose hierarchies are referenced by the program classes. - // We can't do this if we later have to come up with the obfuscated - // class member names that are globally unique. - ClassPool reducedLibraryClassPool = configuration.useUniqueClassMemberNames ? - null : new ClassPool(); - - WarningPrinter classReferenceWarningPrinter = new WarningPrinter(System.err, configuration.warn); - WarningPrinter dependencyWarningPrinter = new WarningPrinter(System.err, configuration.warn); - - // Initialize the superclass hierarchies for program classes. - programClassPool.classesAccept( - new ClassSuperHierarchyInitializer(programClassPool, - libraryClassPool, - classReferenceWarningPrinter, - null)); - - // Initialize the superclass hierarchy of all library classes, without - // warnings. - libraryClassPool.classesAccept( - new ClassSuperHierarchyInitializer(programClassPool, - libraryClassPool, - null, - dependencyWarningPrinter)); - - // Initialize the class references of program class members and - // attributes. Note that all superclass hierarchies have to be - // initialized for this purpose. - WarningPrinter programMemberReferenceWarningPrinter = new WarningPrinter(System.err, configuration.warn); - WarningPrinter libraryMemberReferenceWarningPrinter = new WarningPrinter(System.err, configuration.warn); - - programClassPool.classesAccept( - new ClassReferenceInitializer(programClassPool, - libraryClassPool, - classReferenceWarningPrinter, - programMemberReferenceWarningPrinter, - libraryMemberReferenceWarningPrinter, - null)); - - if (reducedLibraryClassPool != null) - { - // Collect the library classes that are directly referenced by - // program classes, without introspection. - programClassPool.classesAccept( - new ReferencedClassVisitor( - new LibraryClassFilter( - new ClassPoolFiller(reducedLibraryClassPool)))); - - // Reinitialize the superclass hierarchies of referenced library - // classes, this time with warnings. - reducedLibraryClassPool.classesAccept( - new ClassSuperHierarchyInitializer(programClassPool, - libraryClassPool, - classReferenceWarningPrinter, - null)); - } - - // Initialize the enum annotation references. - programClassPool.classesAccept( - new AllAttributeVisitor(true, - new AllElementValueVisitor(true, - new EnumFieldReferenceInitializer()))); - - // Initialize the Class.forName references. - WarningPrinter dynamicClassReferenceNotePrinter = new WarningPrinter(System.out, configuration.note); - WarningPrinter classForNameNotePrinter = new WarningPrinter(System.out, configuration.note); - - programClassPool.classesAccept( - new AllMethodVisitor( - new AllAttributeVisitor( - new AllInstructionVisitor( - new DynamicClassReferenceInitializer(programClassPool, - libraryClassPool, - dynamicClassReferenceNotePrinter, - null, - classForNameNotePrinter, - createClassNoteExceptionMatcher(configuration.keep, true)))))); - - // Initialize the WebView.addJavascriptInterface references. - WarningPrinter webViewClassReferenceNotePrinter = new WarningPrinter(System.out, configuration.note); - - // Initialize the Class.get[Declared]{Field,Method} references. - WarningPrinter getMemberNotePrinter = new WarningPrinter(System.out, configuration.note); - - programClassPool.classesAccept( - new AllMethodVisitor( - new AllAttributeVisitor( - new DynamicMemberReferenceInitializer(programClassPool, - libraryClassPool, - getMemberNotePrinter, - createClassMemberNoteExceptionMatcher(configuration.keep, true), - createClassMemberNoteExceptionMatcher(configuration.keep, false))))); - - // Initialize other string constant references, if requested. - if (configuration.adaptClassStrings != null) - { - programClassPool.classesAccept( - new ClassNameFilter(configuration.adaptClassStrings, - new AllConstantVisitor( - new StringReferenceInitializer(programClassPool, - libraryClassPool)))); - } - - // Initialize the class references of library class members. - if (reducedLibraryClassPool != null) - { - // Collect the library classes that are referenced by program - // classes, directly or indirectly, with or without reflection. - programClassPool.classesAccept( - new ReferencedClassVisitor( - new LibraryClassFilter( - new ClassHierarchyTraveler(true, true, true, false, - new LibraryClassFilter( - new ClassPoolFiller(reducedLibraryClassPool)))))); - - // Initialize the class references of referenced library - // classes, without warnings. - reducedLibraryClassPool.classesAccept( - new ClassReferenceInitializer(programClassPool, - libraryClassPool, - null, - null, - null, - dependencyWarningPrinter)); - - // Reset the library class pool. - libraryClassPool.clear(); - - // Copy the library classes that are referenced directly by program - // classes and the library classes that are referenced by referenced - // library classes. - reducedLibraryClassPool.classesAccept( - new MultiClassVisitor( - new ClassHierarchyTraveler(true, true, true, false, - new LibraryClassFilter( - new ClassPoolFiller(libraryClassPool))), - - new ReferencedClassVisitor( - new LibraryClassFilter( - new ClassHierarchyTraveler(true, true, true, false, - new LibraryClassFilter( - new ClassPoolFiller(libraryClassPool))))) - )); - } - else - { - // Initialize the class references of all library class members. - libraryClassPool.classesAccept( - new ClassReferenceInitializer(programClassPool, - libraryClassPool, - null, - null, - null, - dependencyWarningPrinter)); - } - - // Initialize the subclass hierarchies. - programClassPool.classesAccept(new ClassSubHierarchyInitializer()); - libraryClassPool.classesAccept(new ClassSubHierarchyInitializer()); - - // Share strings between the classes, to reduce heap memory usage. - programClassPool.classesAccept(new StringSharer()); - libraryClassPool.classesAccept(new StringSharer()); - - // Check for any unmatched class members. - WarningPrinter classMemberNotePrinter = new WarningPrinter(System.out, configuration.note); - - ClassMemberChecker classMemberChecker = - new ClassMemberChecker(programClassPool, - classMemberNotePrinter); - - classMemberChecker.checkClassSpecifications(configuration.keep); - classMemberChecker.checkClassSpecifications(configuration.assumeNoSideEffects); - classMemberChecker.checkClassSpecifications(configuration.assumeNoExternalSideEffects); - classMemberChecker.checkClassSpecifications(configuration.assumeNoEscapingParameters); - classMemberChecker.checkClassSpecifications(configuration.assumeNoExternalReturnValues); - - // Check for unkept descriptor classes of kept class members. - WarningPrinter descriptorKeepNotePrinter = new WarningPrinter(System.out, configuration.note); - - new DescriptorKeepChecker(programClassPool, - libraryClassPool, - descriptorKeepNotePrinter).checkClassSpecifications(configuration.keep); - - // Check for keep options that only match library classes. - WarningPrinter libraryKeepNotePrinter = new WarningPrinter(System.out, configuration.note); - - new LibraryKeepChecker(programClassPool, - libraryClassPool, - libraryKeepNotePrinter).checkClassSpecifications(configuration.keep); - - // Print out a summary of the notes, if necessary. - int fullyQualifiedNoteCount = fullyQualifiedClassNameNotePrinter.getWarningCount(); - if (fullyQualifiedNoteCount > 0) - { - System.out.println("Note: there were " + fullyQualifiedNoteCount + - " references to unknown classes."); - System.out.println(" You should check your configuration for typos."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)"); - } - - int classMemberNoteCount = classMemberNotePrinter.getWarningCount(); - if (classMemberNoteCount > 0) - { - System.out.println("Note: there were " + classMemberNoteCount + - " references to unknown class members."); - System.out.println(" You should check your configuration for typos."); - } - - int getAnnotationNoteCount = getAnnotationNotePrinter.getWarningCount(); - if (getAnnotationNoteCount > 0) - { - System.out.println("Note: there were " + getAnnotationNoteCount + - " classes trying to access annotations using reflection."); - System.out.println(" You should consider keeping the annotation attributes"); - System.out.println(" (using '-keepattributes *Annotation*')."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)"); - } - - int getSignatureNoteCount = getSignatureNotePrinter.getWarningCount(); - if (getSignatureNoteCount > 0) - { - System.out.println("Note: there were " + getSignatureNoteCount + - " classes trying to access generic signatures using reflection."); - System.out.println(" You should consider keeping the signature attributes"); - System.out.println(" (using '-keepattributes Signature')."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)"); - } - - int getEnclosingClassNoteCount = getEnclosingClassNotePrinter.getWarningCount(); - if (getEnclosingClassNoteCount > 0) - { - System.out.println("Note: there were " + getEnclosingClassNoteCount + - " classes trying to access enclosing classes using reflection."); - System.out.println(" You should consider keeping the inner classes attributes"); - System.out.println(" (using '-keepattributes InnerClasses')."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)"); - } - - int getEnclosingMethodNoteCount = getEnclosingMethodNotePrinter.getWarningCount(); - if (getEnclosingMethodNoteCount > 0) - { - System.out.println("Note: there were " + getEnclosingMethodNoteCount + - " classes trying to access enclosing methods using reflection."); - System.out.println(" You should consider keeping the enclosing method attributes"); - System.out.println(" (using '-keepattributes InnerClasses,EnclosingMethod')."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)"); - } - - int descriptorNoteCount = descriptorKeepNotePrinter.getWarningCount(); - if (descriptorNoteCount > 0) - { - System.out.println("Note: there were " + descriptorNoteCount + - " unkept descriptor classes in kept class members."); - System.out.println(" You should consider explicitly keeping the mentioned classes"); - System.out.println(" (using '-keep')."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)"); - } - - int libraryNoteCount = libraryKeepNotePrinter.getWarningCount(); - if (libraryNoteCount > 0) - { - System.out.println("Note: there were " + libraryNoteCount + - " library classes explicitly being kept."); - System.out.println(" You don't need to keep library classes; they are already left unchanged."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#libraryclass)"); - } - - int dynamicClassReferenceNoteCount = dynamicClassReferenceNotePrinter.getWarningCount(); - if (dynamicClassReferenceNoteCount > 0) - { - System.out.println("Note: there were " + dynamicClassReferenceNoteCount + - " unresolved dynamic references to classes or interfaces."); - System.out.println(" You should check if you need to specify additional program jars."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)"); - } - - int classForNameNoteCount = classForNameNotePrinter.getWarningCount(); - if (classForNameNoteCount > 0) - { - System.out.println("Note: there were " + classForNameNoteCount + - " class casts of dynamically created class instances."); - System.out.println(" You might consider explicitly keeping the mentioned classes and/or"); - System.out.println(" their implementations (using '-keep')."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclasscast)"); - } - - int getmemberNoteCount = getMemberNotePrinter.getWarningCount(); - if (getmemberNoteCount > 0) - { - System.out.println("Note: there were " + getmemberNoteCount + - " accesses to class members by means of introspection."); - System.out.println(" You should consider explicitly keeping the mentioned class members"); - System.out.println(" (using '-keep' or '-keepclassmembers')."); - System.out.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclassmember)"); - } - - // Print out a summary of the warnings, if necessary. - int classReferenceWarningCount = classReferenceWarningPrinter.getWarningCount(); - if (classReferenceWarningCount > 0) - { - System.err.println("Warning: there were " + classReferenceWarningCount + - " unresolved references to classes or interfaces."); - System.err.println(" You may need to add missing library jars or update their versions."); - System.err.println(" If your code works fine without the missing classes, you can suppress"); - System.err.println(" the warnings with '-dontwarn' options."); - - if (configuration.skipNonPublicLibraryClasses) - { - System.err.println(" You may also have to remove the option '-skipnonpubliclibraryclasses'."); - } - - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)"); - } - - int dependencyWarningCount = dependencyWarningPrinter.getWarningCount(); - if (dependencyWarningCount > 0) - { - System.err.println("Warning: there were " + dependencyWarningCount + - " instances of library classes depending on program classes."); - System.err.println(" You must avoid such dependencies, since the program classes will"); - System.err.println(" be processed, while the library classes will remain unchanged."); - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#dependency)"); - } - - int programMemberReferenceWarningCount = programMemberReferenceWarningPrinter.getWarningCount(); - if (programMemberReferenceWarningCount > 0) - { - System.err.println("Warning: there were " + programMemberReferenceWarningCount + - " unresolved references to program class members."); - System.err.println(" Your input classes appear to be inconsistent."); - System.err.println(" You may need to recompile the code."); - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)"); - } - - int libraryMemberReferenceWarningCount = libraryMemberReferenceWarningPrinter.getWarningCount(); - if (libraryMemberReferenceWarningCount > 0) - { - System.err.println("Warning: there were " + libraryMemberReferenceWarningCount + - " unresolved references to library class members."); - System.err.println(" You probably need to update the library versions."); - - if (!configuration.skipNonPublicLibraryClassMembers) - { - System.err.println(" Alternatively, you may have to specify the option "); - System.err.println(" '-dontskipnonpubliclibraryclassmembers'."); - } - - if (configuration.skipNonPublicLibraryClasses) - { - System.err.println(" You may also have to remove the option '-skipnonpubliclibraryclasses'."); - } - - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)"); - } - - if ((classReferenceWarningCount > 0 || - dependencyWarningCount > 0 || - programMemberReferenceWarningCount > 0 || - libraryMemberReferenceWarningCount > 0) && - !configuration.ignoreWarnings) - { - throw new IOException("Please correct the above warnings first."); - } - - if ((configuration.note == null || - !configuration.note.isEmpty()) && - (configuration.warn != null && - configuration.warn.isEmpty() || - configuration.ignoreWarnings)) - { - System.out.println("Note: you're ignoring all warnings!"); - } - - // Discard unused library classes. - if (configuration.verbose) - { - System.out.println("Ignoring unused library classes..."); - System.out.println(" Original number of library classes: " + originalLibraryClassPoolSize); - System.out.println(" Final number of library classes: " + libraryClassPool.size()); - } - } - - - /** - * Extracts a list of exceptions of classes for which not to print notes, - * from the keep configuration. - */ - private StringMatcher createClassNoteExceptionMatcher(List noteExceptions, - boolean markClasses) - { - if (noteExceptions != null) - { - List noteExceptionNames = new ArrayList(noteExceptions.size()); - for (int index = 0; index < noteExceptions.size(); index++) - { - KeepClassSpecification keepClassSpecification = (KeepClassSpecification)noteExceptions.get(index); - if (keepClassSpecification.markClasses || !markClasses) - { - // If the class itself is being kept, it's ok. - String className = keepClassSpecification.className; - if (className != null && - !containsWildCardReferences(className)) - { - noteExceptionNames.add(className); - } - - // If all of its extensions are being kept, it's ok too. - String extendsClassName = keepClassSpecification.extendsClassName; - if (extendsClassName != null && - !containsWildCardReferences(extendsClassName)) - { - noteExceptionNames.add(extendsClassName); - } - } - } - - if (noteExceptionNames.size() > 0) - { - return new ListParser(new ClassNameParser()).parse(noteExceptionNames); - } - } - - return null; - } - - - /** - * Extracts a list of exceptions of field or method names for which not to - * print notes, from the keep configuration. - */ - private StringMatcher createClassMemberNoteExceptionMatcher(List noteExceptions, - boolean isField) - { - if (noteExceptions != null) - { - List noteExceptionNames = new ArrayList(); - for (int index = 0; index < noteExceptions.size(); index++) - { - KeepClassSpecification keepClassSpecification = (KeepClassSpecification)noteExceptions.get(index); - List memberSpecifications = isField ? - keepClassSpecification.fieldSpecifications : - keepClassSpecification.methodSpecifications; - - if (memberSpecifications != null) - { - for (int index2 = 0; index2 < memberSpecifications.size(); index2++) - { - MemberSpecification memberSpecification = - (MemberSpecification)memberSpecifications.get(index2); - - String memberName = memberSpecification.name; - if (memberName != null && - !containsWildCardReferences(memberName)) - { - noteExceptionNames.add(memberName); - } - } - } - } - - if (noteExceptionNames.size() > 0) - { - return new ListParser(new NameParser()).parse(noteExceptionNames); - } - } - - return null; - } - - - /** - * Returns whether the given string contains a numeric reference to a - * wild card (""). - */ - private static boolean containsWildCardReferences(String string) - { - int openIndex = string.indexOf('<'); - if (openIndex < 0) - { - return false; - } - - int closeIndex = string.indexOf('>', openIndex + 1); - if (closeIndex < 0) - { - return false; - } - - try - { - Integer.parseInt(string.substring(openIndex + 1, closeIndex)); - } - catch (NumberFormatException e) - { - return false; - } - - return true; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/InputReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/InputReader.java deleted file mode 100644 index 34f98aa0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/InputReader.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.ClassPool; -import proguard.classfile.util.WarningPrinter; -import proguard.classfile.visitor.*; -import proguard.io.*; - -import java.io.IOException; - -/** - * This class reads the input class files. - * - * @author Eric Lafortune - */ -public class InputReader -{ - // Option to favor library classes over program classes, in case of - // duplicates. - // https://sourceforge.net/p/proguard/discussion/182455/thread/76430d9e - private static final boolean FAVOR_LIBRARY_CLASSES = System.getProperty("favor.library.classes") != null; - - - private final Configuration configuration; - - - /** - * Creates a new InputReader to read input class files as specified by the - * given configuration. - */ - public InputReader(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Fills the given program class pool and library class pool by reading - * class files, based on the current configuration. - */ - public void execute(ClassPool programClassPool, - ClassPool libraryClassPool) throws IOException - { - WarningPrinter warningPrinter = new WarningPrinter(System.err, configuration.warn); - WarningPrinter notePrinter = new WarningPrinter(System.out, configuration.note); - - DuplicateClassPrinter duplicateClassPrinter = new DuplicateClassPrinter(notePrinter); - - // Read the library class files, if any and if they should get priority. - if (FAVOR_LIBRARY_CLASSES && - configuration.libraryJars != null) - { - // Prepare a data entry reader to filter all classes, - // which are then decoded to classes by a class reader, - // which are then put in the class pool by a class pool filler. - readInput("Reading library ", - configuration.libraryJars, - new ClassFilter( - new ClassReader(true, - configuration.skipNonPublicLibraryClasses, - configuration.skipNonPublicLibraryClassMembers, - warningPrinter, - new ClassPresenceFilter(libraryClassPool, duplicateClassPrinter, - new ClassPoolFiller(libraryClassPool))))); - } - - // Read the program class files. - // Prepare a data entry reader to filter all classes, - // which are then decoded to classes by a class reader, - // which are then put in the class pool by a class pool filler. - readInput("Reading program ", - configuration.programJars, - new ClassFilter( - new ClassReader(false, - configuration.skipNonPublicLibraryClasses, - configuration.skipNonPublicLibraryClassMembers, - warningPrinter, - new ClassPresenceFilter(programClassPool, duplicateClassPrinter, - new ClassPresenceFilter(libraryClassPool, duplicateClassPrinter, - new ClassPoolFiller(programClassPool)))))); - - // Check if we have at least some input classes. - if (programClassPool.size() == 0) - { - throw new IOException("The input doesn't contain any classes. Did you specify the proper '-injars' options?"); - } - - // Read the library class files, if any. - if (!FAVOR_LIBRARY_CLASSES && - configuration.libraryJars != null) - { - // Prepare a data entry reader to filter all classes, - // which are then decoded to classes by a class reader, - // which are then put in the class pool by a class pool filler. - readInput("Reading library ", - configuration.libraryJars, - new ClassFilter( - new ClassReader(true, - configuration.skipNonPublicLibraryClasses, - configuration.skipNonPublicLibraryClassMembers, - warningPrinter, - new ClassPresenceFilter(programClassPool, duplicateClassPrinter, - new ClassPresenceFilter(libraryClassPool, duplicateClassPrinter, - new ClassPoolFiller(libraryClassPool)))))); - } - - // Print out a summary of the notes, if necessary. - int noteCount = notePrinter.getWarningCount(); - if (noteCount > 0) - { - System.err.println("Note: there were " + noteCount + - " duplicate class definitions."); - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)"); - } - - // Print out a summary of the warnings, if necessary. - int warningCount = warningPrinter.getWarningCount(); - if (warningCount > 0) - { - System.err.println("Warning: there were " + warningCount + - " classes in incorrectly named files."); - System.err.println(" You should make sure all file names correspond to their class names."); - System.err.println(" The directory hierarchies must correspond to the package hierarchies."); - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#unexpectedclass)"); - - if (!configuration.ignoreWarnings) - { - System.err.println(" If you don't mind the mentioned classes not being written out,"); - System.err.println(" you could try your luck using the '-ignorewarnings' option."); - throw new IOException("Please correct the above warnings first."); - } - } - } - - - /** - * Reads all input entries from the given class path. - */ - private void readInput(String messagePrefix, - ClassPath classPath, - DataEntryReader reader) throws IOException - { - readInput(messagePrefix, - classPath, - 0, - classPath.size(), - reader); - } - - - /** - * Reads all input entries from the given section of the given class path. - */ - public void readInput(String messagePrefix, - ClassPath classPath, - int fromIndex, - int toIndex, - DataEntryReader reader) throws IOException - { - for (int index = fromIndex; index < toIndex; index++) - { - ClassPathEntry entry = classPath.get(index); - if (!entry.isOutput()) - { - readInput(messagePrefix, entry, reader); - } - } - } - - - /** - * Reads the given input class path entry. - */ - private void readInput(String messagePrefix, - ClassPathEntry classPathEntry, - DataEntryReader dataEntryReader) throws IOException - { - try - { - // Create a reader that can unwrap jars, wars, ears, jmods and zips. - DataEntryReader reader = - DataEntryReaderFactory.createDataEntryReader(messagePrefix, - classPathEntry, - dataEntryReader); - - // Create the data entry pump. - DirectoryPump directoryPump = - new DirectoryPump(classPathEntry.getFile()); - - // Pump the data entries into the reader. - directoryPump.pumpDataEntries(reader); - } - catch (IOException ex) - { - throw (IOException)new IOException("Can't read [" + classPathEntry + "] (" + ex.getMessage() + ")").initCause(ex); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassMemberChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassMemberChecker.java deleted file mode 100644 index d8fb25e0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassMemberChecker.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.List; - -/** - * This class checks if the user has forgotten to specify class members in - * some keep options in the configuration. - * - * @author Eric Lafortune - */ -public class KeepClassMemberChecker -{ - private final WarningPrinter notePrinter; - - - /** - * Creates a new KeepClassMemberChecker. - */ - public KeepClassMemberChecker(WarningPrinter notePrinter) - { - this.notePrinter = notePrinter; - } - - - /** - * Checks if the given class specifications try to keep class members - * without actually specifying any, printing notes if necessary. - */ - public void checkClassSpecifications(List keepClassSpecifications) - { - if (keepClassSpecifications != null) - { - for (int index = 0; index < keepClassSpecifications.size(); index++) - { - KeepClassSpecification keepClassSpecification = - (KeepClassSpecification)keepClassSpecifications.get(index); - - if (!keepClassSpecification.markClasses && - (keepClassSpecification.fieldSpecifications == null || - keepClassSpecification.fieldSpecifications.size() == 0) && - (keepClassSpecification.methodSpecifications == null || - keepClassSpecification.methodSpecifications.size() == 0)) - { - String className = keepClassSpecification.className; - if (className == null) - { - className = keepClassSpecification.extendsClassName; - } - - if (className == null || - notePrinter.accepts(className)) - { - notePrinter.print(className, - "Note: the configuration doesn't specify which class members to keep for class '" + - (className == null ? - ConfigurationConstants.ANY_CLASS_KEYWORD : - ClassUtil.externalClassName(className)) + "'"); - } - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassSpecification.java b/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassSpecification.java deleted file mode 100644 index 2b4bd17f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassSpecification.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -/** - * This class represents a keep option with class specification. - * - * @author Eric Lafortune - */ -public class KeepClassSpecification extends ClassSpecification -{ - public final boolean markClasses; - public final boolean markConditionally; - public final boolean markDescriptorClasses; - public final boolean markCodeAttributes; - public final boolean allowShrinking; - public final boolean allowOptimization; - public final boolean allowObfuscation; - public final ClassSpecification condition; - - - - /** - * Creates a new KeepClassSpecification. - * This older constructor is still present for the sake of - * com/android/build/gradle/internal/transforms/BaseProguardAction.java - * @param markClasses specifies whether to mark the classes. - * If false, only class members are marked. - * If true, the classes are marked as well. - * @param markConditionally specifies whether to mark the classes and - * class members conditionally. If true, - * classes and class members are marked, on - * the condition that all specified class - * members are present. - * @param markDescriptorClasses specifies whether to mark the classes in - * the descriptors of the marked class members. - * @param allowShrinking specifies whether shrinking is allowed. - * @param allowOptimization specifies whether optimization is allowed. - * @param allowObfuscation specifies whether obfuscation is allowed. - * @param classSpecification the specification of classes and class - * members. - * @deprecated - */ - public KeepClassSpecification(boolean markClasses, - boolean markConditionally, - boolean markDescriptorClasses, - boolean allowShrinking, - boolean allowOptimization, - boolean allowObfuscation, - ClassSpecification classSpecification) - { - this(markClasses, - markConditionally, - markDescriptorClasses, - false, - allowShrinking, - allowOptimization, - allowObfuscation, - null, - classSpecification); - } - - - /** - * Creates a new KeepClassSpecification. - * @param markClasses specifies whether to mark the classes. - * If false, only class members are marked. - * If true, the classes are marked as well. - * @param markConditionally specifies whether to mark the classes and - * class members conditionally. If true, - * classes and class members are marked, on - * the condition that all specified class - * members are present. - * @param markDescriptorClasses specifies whether to mark the classes in - * the descriptors of the marked class members. - * @param markCodeAttributes specified whether to mark the code attributes - * of the marked class methods. - * @param allowShrinking specifies whether shrinking is allowed. - * @param allowOptimization specifies whether optimization is allowed. - * @param allowObfuscation specifies whether obfuscation is allowed. - * @param condition an optional extra condition. - * @param classSpecification the specification of classes and class - * members. - */ - public KeepClassSpecification(boolean markClasses, - boolean markConditionally, - boolean markDescriptorClasses, - boolean markCodeAttributes, - boolean allowShrinking, - boolean allowOptimization, - boolean allowObfuscation, - ClassSpecification condition, - ClassSpecification classSpecification) - { - super(classSpecification); - - this.markClasses = markClasses; - this.markConditionally = markConditionally; - this.markDescriptorClasses = markDescriptorClasses; - this.markCodeAttributes = markCodeAttributes; - this.allowShrinking = allowShrinking; - this.allowOptimization = allowOptimization; - this.allowObfuscation = allowObfuscation; - this.condition = condition; - } - - - // Implementations for Object. - - @Override - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - KeepClassSpecification other = (KeepClassSpecification)object; - return - this.markClasses == other.markClasses && - this.markConditionally == other.markConditionally && - this.markDescriptorClasses == other.markDescriptorClasses && - this.markCodeAttributes == other.markCodeAttributes && - this.allowShrinking == other.allowShrinking && - this.allowOptimization == other.allowOptimization && - this.allowObfuscation == other.allowObfuscation && - (this.condition == null ? - other.condition == null : - this.condition .equals(other.condition)) && - super.equals(other); - } - - @Override - public int hashCode() - { - return - (markClasses ? 0 : 1) ^ - (markConditionally ? 0 : 2) ^ - (markDescriptorClasses ? 0 : 4) ^ - (markCodeAttributes ? 0 : 8) ^ - (allowShrinking ? 0 : 16) ^ - (allowOptimization ? 0 : 32) ^ - (allowObfuscation ? 0 : 64) ^ - (condition == null ? 0 : condition.hashCode()) ^ - super.hashCode(); - } - - @Override - public Object clone() - { -// try -// { - return super.clone(); -// } -// catch (CloneNotSupportedException e) -// { -// return null; -// } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassSpecificationVisitorFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassSpecificationVisitorFactory.java deleted file mode 100644 index 72a14fb8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/KeepClassSpecificationVisitorFactory.java +++ /dev/null @@ -1,293 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.ClassConstants; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.visitor.*; - -import java.util.*; - -/** - * This factory creates visitors to efficiently travel to specified classes and - * class members. - * - * @author Eric Lafortune - */ -public class KeepClassSpecificationVisitorFactory -extends ClassSpecificationVisitorFactory -{ - private final boolean shrinking; - private final boolean optimizing; - private final boolean obfuscating; - - - /** - * Creates a new KeepClassSpecificationVisitorFactory that creates - * visitors for the specified goal. - * - * @param shrinking a flag that specifies whether the visitors are - * intended for the shrinking step. - * @param optimizing a flag that specifies whether the visitors are - * intended for the optimization step. - * @param obfuscating a flag that specifies whether the visitors are - * intended for the obfuscation step. - */ - public KeepClassSpecificationVisitorFactory(boolean shrinking, - boolean optimizing, - boolean obfuscating) - { - this.shrinking = shrinking; - this.optimizing = optimizing; - this.obfuscating = obfuscating; - } - - - // Overriding implementations for ClassSpecificationVisitorFactory. - - /** - * Constructs a ClassPoolVisitor to efficiently travel to the specified - * classes, class members and code attributes. - * - * @param keepClassSpecifications the specifications of the class(es) and - * class members to visit. - * @param classVisitor an optional ClassVisitor to be applied to - * matching classes. - * @param fieldVisitor an optional MemberVisitor to be applied - * to matching fields. - * @param methodVisitor an optional MemberVisitor to be applied - * to matching methods. - * @param attributeVisitor an optional AttributeVisitor to be applied - * to matching code attributes. - */ - public ClassPoolVisitor createClassPoolVisitor(List keepClassSpecifications, - ClassVisitor classVisitor, - MemberVisitor fieldVisitor, - MemberVisitor methodVisitor, - AttributeVisitor attributeVisitor) - { - MultiClassPoolVisitor multiClassPoolVisitor = new MultiClassPoolVisitor(); - - if (keepClassSpecifications != null) - { - for (int index = 0; index < keepClassSpecifications.size(); index++) - { - KeepClassSpecification keepClassSpecification = - (KeepClassSpecification)keepClassSpecifications.get(index); - - if ((shrinking && !keepClassSpecification.allowShrinking) || - (optimizing && !keepClassSpecification.allowOptimization) || - (obfuscating && !keepClassSpecification.allowObfuscation)) - { - multiClassPoolVisitor.addClassPoolVisitor( - createClassPoolVisitor(keepClassSpecification, - classVisitor, - fieldVisitor, - methodVisitor, - attributeVisitor)); - } - } - } - - return multiClassPoolVisitor; - } - - - /** - * Constructs a ClassPoolVisitor to efficiently travel to the specified - * classes, class members, and attributes. - * - * @param keepClassSpecification the specifications of the class(es) and - * class members to visit. - * @param classVisitor an optional ClassVisitor to be applied to - * matching classes. - * @param fieldVisitor an optional MemberVisitor to be applied - * to matching fields. - * @param methodVisitor an optional MemberVisitor to be applied - * to matching methods. - * @param attributeVisitor an optional AttributeVisitor to be applied - * to matching code attributes. - */ - public ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification keepClassSpecification, - ClassVisitor classVisitor, - MemberVisitor fieldVisitor, - MemberVisitor methodVisitor, - AttributeVisitor attributeVisitor) - { - // Start a global list of wilcdard matchers, so they can be referenced - // from regular expressions. They are identified by their indices, - // which imposes a number of tricky constraints: - // - They need to be parsed in the right order, so the list is filled - // out in the expected order (corresponding to the text file - // configuration). - // - They need to be matched in the right order, so the variable - // matchers are matched before they are referenced. - List variableStringMatchers = new ArrayList(); - - // If specified, let the class visitor also visit the descriptor - // classes and the signature classes. - if (keepClassSpecification.markDescriptorClasses && - classVisitor != null) - { - fieldVisitor = fieldVisitor == null ? - new MemberDescriptorReferencedClassVisitor(classVisitor) : - new MultiMemberVisitor( - new MemberVisitor[] - { - fieldVisitor, - new MemberDescriptorReferencedClassVisitor(classVisitor) - }); - - methodVisitor = methodVisitor == null ? - new MemberDescriptorReferencedClassVisitor(classVisitor) : - new MultiMemberVisitor( - new MemberVisitor[] - { - methodVisitor, - new MemberDescriptorReferencedClassVisitor(classVisitor) - }); - } - - // Don't visit the classes if not specified. - if (!keepClassSpecification.markClasses && - !keepClassSpecification.markConditionally) - { - classVisitor = null; - } - - // Don't visit the code attributes if not specified. - attributeVisitor = keepClassSpecification.markCodeAttributes ? - new AttributeNameFilter(ClassConstants.ATTR_Code, attributeVisitor) : - null; - - ClassSpecification condition = keepClassSpecification.condition; - if (condition != null) - { - // Parse the condition. We need to parse it before the actual keep - // specification, to make sure the list of variable string matchers - // is filled out in the right order. - - // Create a placeholder for the class pool visitor that - // corresponds to the actual keep specification. Note that we - // visit the entire class pool for each matched class. - MultiClassPoolVisitor keepClassPoolVisitor = - new MultiClassPoolVisitor(); - - // Parse the condition. - ClassPoolVisitor conditionalKeepClassPoolVisitor = - createClassTester(condition, - keepClassPoolVisitor, - variableStringMatchers); - - // Parse the actual keep specification and add it to the - // placeholder. - keepClassPoolVisitor.addClassPoolVisitor( - createClassPoolVisitor(keepClassSpecification, - classVisitor, - fieldVisitor, - methodVisitor, - attributeVisitor, - variableStringMatchers)); - - return conditionalKeepClassPoolVisitor; - } - else - { - // Just parse the actual keep specification. - return createClassPoolVisitor(keepClassSpecification, - classVisitor, - fieldVisitor, - methodVisitor, - attributeVisitor, - variableStringMatchers); - } - } - - - /** - * Constructs a ClassPoolVisitor to efficiently travel to the specified - * classes and class members. - * - * @param keepClassSpecification the specifications of the class(es) and class - * members to visit. - * @param classVisitor an optional ClassVisitor to be applied to - * matching classes. - * @param fieldVisitor an optional MemberVisitor to be applied - * to matching fields. - * @param methodVisitor an optional MemberVisitor to be applied - * to matching methods. - * @param attributeVisitor an optional AttributeVisitor to be applied - * to matching code attributes. - * @param variableStringMatchers a mutable list of VariableStringMatcher - * instances that match the wildcards. - */ - private ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification keepClassSpecification, - ClassVisitor classVisitor, - MemberVisitor fieldVisitor, - MemberVisitor methodVisitor, - AttributeVisitor attributeVisitor, - List variableStringMatchers) - { - // If specified, let the marker visit the class and its class - // members conditionally. - if (keepClassSpecification.markConditionally) - { - // Parse the condition. We need to parse it before the actual keep - // specification, to make sure the list of variable string matchers - // is filled out in the right order. - - // Create a placeholder for the class visitor that corresponds to - // the actual keep specification. - MultiClassVisitor keepClassVisitor = - new MultiClassVisitor(); - - // Parse the condition. Only add string matchers locally. - ClassPoolVisitor conditionalKeepClassPoolVisitor = - createClassTester(keepClassSpecification, - keepClassVisitor, - new ArrayList(variableStringMatchers)); - - // Parse the actual keep specification and add it to the - // placeholder. - keepClassVisitor.addClassVisitor( - createCombinedClassVisitor(keepClassSpecification.attributeNames, - keepClassSpecification.fieldSpecifications, - keepClassSpecification.methodSpecifications, - classVisitor, - fieldVisitor, - methodVisitor, - attributeVisitor, - variableStringMatchers)); - - return conditionalKeepClassPoolVisitor; - } - else - { - // Just parse the actual keep specification. - return super.createClassPoolVisitor(keepClassSpecification, - classVisitor, - fieldVisitor, - methodVisitor, - attributeVisitor, - variableStringMatchers); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/LibraryKeepChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/LibraryKeepChecker.java deleted file mode 100644 index 0f407245..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/LibraryKeepChecker.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.util.List; - -/** - * This class checks whether some keep rules only keep library classes, no - * program classes. That is strange, because library classes never need to - * be kept explicitly. - * - * @author Eric Lafortune - */ -public class LibraryKeepChecker -implements ClassVisitor -{ - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final WarningPrinter notePrinter; - - // Some fields acting as parameters for the class visitor. - private String keepName; - - - /** - * Creates a new DescriptorKeepChecker. - */ - public LibraryKeepChecker(ClassPool programClassPool, - ClassPool libraryClassPool, - WarningPrinter notePrinter) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.notePrinter = notePrinter; - } - - - /** - * Checks the classes mentioned in the given keep specifications, printing - * notes if necessary. - */ - public void checkClassSpecifications(List keepSpecifications) - { - if (keepSpecifications != null) - { - // Go over all individual keep specifications. - for (int index = 0; index < keepSpecifications.size(); index++) - { - KeepClassSpecification keepClassSpecification = - (KeepClassSpecification)keepSpecifications.get(index); - - // Is the keep specification more specific than a general - // wildcard? - keepName = keepClassSpecification.className; - if (keepName != null) - { - KeepClassSpecificationVisitorFactory visitorFactory = - new KeepClassSpecificationVisitorFactory(true, true, true); - - // Doesn't the specification match any program classes? - ClassCounter programClassCounter = new ClassCounter(); - - programClassPool.accept( - visitorFactory - .createClassPoolVisitor(keepClassSpecification, - programClassCounter, - null, - null, - null)); - - if (programClassCounter.getCount() == 0) - { - // Print out notes about any matched library classes. - libraryClassPool.accept( - visitorFactory - .createClassPoolVisitor(keepClassSpecification, - this, - null, - null, - null)); - } - } - } - } - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) {} - - - public void visitLibraryClass(LibraryClass libraryClass) - { - String className = libraryClass.getName(); - notePrinter.print(className, - "Note: the configuration explicitly specifies '" + - ClassUtil.externalClassName(keepName) + - "' to keep library class '" + - ClassUtil.externalClassName(className) + - "'"); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/LineWordReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/LineWordReader.java deleted file mode 100644 index 48dc4e80..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/LineWordReader.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.io.*; - - -/** - * A WordReader that returns words from a line number reader. - * - * @author Eric Lafortune - */ -public class LineWordReader extends WordReader -{ - private final LineNumberReader reader; - private final String description; - - - /** - * Creates a new LineWordReader for the given input. - */ - public LineWordReader(LineNumberReader lineNumberReader, - String description, - File baseDir) throws IOException - { - super(baseDir); - - this.reader = lineNumberReader; - this.description = description; - } - - - // Implementations for WordReader. - - protected String nextLine() throws IOException - { - return reader.readLine(); - } - - - protected String lineLocationDescription() - { - return "line " + reader.getLineNumber() + " of " + description; - } - - - public void close() throws IOException - { - super.close(); - - if (reader != null) - { - reader.close(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/MemberSpecification.java b/tools/proguard/proguard6.0.3/core/src/proguard/MemberSpecification.java deleted file mode 100644 index 17de6759..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/MemberSpecification.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - - -import java.util.List; - -/** - * This class stores a specification of class members. The specification is - * template-based: the class member names and descriptors can contain wildcards. - * - * @author Eric Lafortune - */ -public class MemberSpecification -{ - public int requiredSetAccessFlags; - public int requiredUnsetAccessFlags; - public final String annotationType; - public final String name; - public final String descriptor; - public final List attributeNames = null; - - - /** - * Creates a new option to keep all possible class members. - */ - public MemberSpecification() - { - this(0, - 0, - null, - null, - null); - } - - - /** - * Creates a new option to keep the specified class member(s). - * - * @param requiredSetAccessFlags the class access flags that must be set - * in order for the class to apply. - * @param requiredUnsetAccessFlags the class access flags that must be unset - * in order for the class to apply. - * @param annotationType the name of the class that must be an - * annotation in order for the class member - * to apply. The name may be null to specify - * that no annotation is required. - * @param name the class member name. The name may be - * null to specify any class member or it - * may contain "*" or "?" wildcards. - * @param descriptor the class member descriptor. The - * descriptor may be null to specify any - * class member or it may contain - * "**", "*", or "?" wildcards. - */ - public MemberSpecification(int requiredSetAccessFlags, - int requiredUnsetAccessFlags, - String annotationType, - String name, - String descriptor) - { - this.requiredSetAccessFlags = requiredSetAccessFlags; - this.requiredUnsetAccessFlags = requiredUnsetAccessFlags; - this.annotationType = annotationType; - this.name = name; - this.descriptor = descriptor; - } - - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - MemberSpecification other = (MemberSpecification)object; - return - (this.requiredSetAccessFlags == other.requiredSetAccessFlags ) && - (this.requiredUnsetAccessFlags == other.requiredUnsetAccessFlags ) && - (this.annotationType == null ? other.annotationType == null : this.annotationType.equals(other.annotationType)) && - (this.name == null ? other.name == null : this.name.equals(other.name) ) && - (this.descriptor == null ? other.descriptor == null : this.descriptor.equals(other.descriptor) ); - } - - public int hashCode() - { - return - (requiredSetAccessFlags ) ^ - (requiredUnsetAccessFlags ) ^ - (annotationType == null ? 0 : annotationType.hashCode()) ^ - (name == null ? 0 : name.hashCode() ) ^ - (descriptor == null ? 0 : descriptor.hashCode() ); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/OutputWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/OutputWriter.java deleted file mode 100644 index 3f635c68..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/OutputWriter.java +++ /dev/null @@ -1,298 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; -import proguard.configuration.ConfigurationLogger; -import proguard.io.*; -import proguard.util.*; - -import java.io.*; -import java.nio.charset.Charset; -import java.util.*; - -/** - * This class writes the output class files. - * - * @author Eric Lafortune - */ -public class OutputWriter -{ - private final Configuration configuration; - - - /** - * Creates a new OutputWriter to write output class files as specified by - * the given configuration. - */ - public OutputWriter(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Writes the given class pool to class files, based on the current - * configuration. - */ - public void execute(ClassPool programClassPool, - MultiValueMap injectedClassNameMap) throws IOException - { - ClassPath programJars = configuration.programJars; - - // Create a data entry writer factory with common archival parameters. - DataEntryWriterFactory dataEntryWriterFactory = - new DataEntryWriterFactory(programClassPool, - injectedClassNameMap); - - int firstInputIndex = 0; - int lastInputIndex = 0; - - // Go over all program class path entries. - for (int index = 0; index < programJars.size(); index++) - { - // Is it an input entry? - ClassPathEntry entry = programJars.get(index); - if (!entry.isOutput()) - { - // It's an input entry. Remember the highest index. - lastInputIndex = index; - } - else - { - // It's an output entry. Is it the last one in a - // series of output entries? - int nextIndex = index + 1; - if (nextIndex == programJars.size() || - !programJars.get(nextIndex).isOutput()) - { - // Write the processed input entries to the output entries. - writeOutput(dataEntryWriterFactory, - programClassPool, - programJars, - firstInputIndex, - lastInputIndex + 1, - nextIndex); - - // Start with the next series of input entries. - firstInputIndex = nextIndex; - } - } - } - } - - - /** - * Transfers the specified input jars to the specified output jars. - */ - private void writeOutput(DataEntryWriterFactory dataEntryWriterFactory, - ClassPool programClassPool, - ClassPath classPath, - int fromInputIndex, - int fromOutputIndex, - int toOutputIndex) - throws IOException - { - try - { - // Construct the writer that can write apks, jars, wars, ears, zips, - // and directories, cascading over the specified output entries. - DataEntryWriter writer = - dataEntryWriterFactory.createDataEntryWriter(classPath, - fromOutputIndex, - toOutputIndex); - - if (configuration.addConfigurationDebugging) - { - writer = new ExtraDataEntryWriter(ConfigurationLogger.CLASS_MAP_FILENAME, - writer, - new ClassMapDataEntryWriter(programClassPool, writer)); - System.err.println("Warning: -addconfigurationdebugging is enabled; the resulting build will contain obfuscation information."); - System.err.println("It should only be used for debugging purposes."); - } - - DataEntryWriter resourceWriter = writer; - - // Adapt plain resource file names that correspond to class names, - // if necessary. - if (configuration.obfuscate && - configuration.adaptResourceFileNames != null) - { - // Rename processed general resources. - resourceWriter = - renameResourceFiles(programClassPool, - resourceWriter); - } - - // By default, just copy resource files into the above writers. - DataEntryReader resourceCopier = - new DataEntryCopier(resourceWriter); - - // We're now switching to the reader side, operating on the - // contents possibly parsed from the input streams. - DataEntryReader resourceRewriter = resourceCopier; - - // Adapt resource file contents, if allowed. - if ((configuration.shrink || - configuration.optimize || - configuration.obfuscate) && - configuration.adaptResourceFileContents != null) - { - DataEntryReader adaptingContentWriter = resourceRewriter; - - // Adapt the contents of general resource files (manifests - // and native libraries). - if (configuration.obfuscate) - { - adaptingContentWriter = - adaptResourceFiles(programClassPool, - resourceWriter); - } - - // Add the overall filter for adapting resource file contents. - resourceRewriter = - new NameFilter(configuration.adaptResourceFileContents, - adaptingContentWriter, - resourceRewriter); - } - - // Write any kept directories. - DataEntryReader reader = - writeDirectories(programClassPool, - resourceCopier, - resourceRewriter); - - // Trigger writing classes. - reader = - new ClassFilter(new IdleRewriter(writer), - reader); - - // Go over the specified input entries and write their processed - // versions. - new InputReader(configuration).readInput(" Copying resources from program ", - classPath, - fromInputIndex, - fromOutputIndex, - reader); - - // Close all output entries. - writer.close(); - } - catch (IOException ex) - { - throw (IOException)new IOException("Can't write [" + classPath.get(fromOutputIndex).getName() + "] (" + ex.getMessage() + ")").initCause(ex); - } - } - - - /** - * Returns a writer that writes possibly renamed resource files to the - * given resource writer. - */ - private DataEntryWriter renameResourceFiles(ClassPool programClassPool, - DataEntryWriter dataEntryWriter) - { - Map packagePrefixMap = createPackagePrefixMap(programClassPool); - - return - new NameFilteredDataEntryWriter(configuration.adaptResourceFileNames, - new RenamedDataEntryWriter(programClassPool, packagePrefixMap, dataEntryWriter), - dataEntryWriter); - } - - - /** - * Returns a reader that writes all general resource files (manifest, - * native libraries, text files) with shrunk, optimized, and obfuscated - * contents to the given writer. - */ - private DataEntryReader adaptResourceFiles(ClassPool programClassPool, - DataEntryWriter writer) - { - // Pick a suitable encoding. - Charset charset = configuration.android ? - Charset.forName("UTF-8") : - Charset.defaultCharset(); - - // Filter between the various general resource files. - return - new NameFilter("META-INF/MANIFEST.MF,META-INF/*.SF", - new ManifestRewriter(programClassPool, charset, writer), - new DataEntryRewriter(programClassPool, charset, writer)); - } - - - /** - * Writes possibly renamed directories that should be preserved to the - * given resource copier, and non-directories to the given file copier. - */ - private DirectoryFilter writeDirectories(ClassPool programClassPool, - DataEntryReader directoryCopier, - DataEntryReader fileCopier) - { - DataEntryReader directoryRewriter = null; - - // Wrap the directory copier with a filter and a data entry renamer. - if (configuration.keepDirectories != null) - { - Map packagePrefixMap = createPackagePrefixMap(programClassPool); - - directoryRewriter = - new NameFilter(configuration.keepDirectories, - new RenamedDataEntryReader(packagePrefixMap, - directoryCopier, - directoryCopier)); - } - - // Filter on directories and files. - return new DirectoryFilter(directoryRewriter, fileCopier); - } - - - /** - * Creates a map of old package prefixes to new package prefixes, based on - * the given class pool. - */ - private static Map createPackagePrefixMap(ClassPool classPool) - { - Map packagePrefixMap = new HashMap(); - - Iterator iterator = classPool.classNames(); - while (iterator.hasNext()) - { - String className = (String)iterator.next(); - String packagePrefix = ClassUtil.internalPackagePrefix(className); - - String mappedNewPackagePrefix = (String)packagePrefixMap.get(packagePrefix); - if (mappedNewPackagePrefix == null || - !mappedNewPackagePrefix.equals(packagePrefix)) - { - String newClassName = classPool.getClass(className).getName(); - String newPackagePrefix = ClassUtil.internalPackagePrefix(newClassName); - - packagePrefixMap.put(packagePrefix, newPackagePrefix); - } - } - - return packagePrefixMap; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ParseException.java b/tools/proguard/proguard6.0.3/core/src/proguard/ParseException.java deleted file mode 100644 index ae537eab..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ParseException.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - - -/** - * This Exception signals that a parse exception of some - * sort has occurred. - * - * @author Eric Lafortune - */ -public class ParseException extends Exception { - - /** - * Constructs a ParseException with null - * as its error detail message. - */ - public ParseException() { - super(); - } - - /** - * Constructs a ParseException with the specified detail - * message. The error message string s can later be - * retrieved by the {@link Throwable#getMessage} - * method of class Throwable. - * - * @param s the detail message. - */ - public ParseException(String s) { - super(s); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/ProGuard.java b/tools/proguard/proguard6.0.3/core/src/proguard/ProGuard.java deleted file mode 100644 index 8a0dcc64..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/ProGuard.java +++ /dev/null @@ -1,592 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.backport.Backporter; -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AllAttributeVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.configuration.ConfigurationLoggingAdder; -import proguard.obfuscate.Obfuscator; -import proguard.optimize.Optimizer; -import proguard.optimize.peephole.LineNumberLinearizer; -import proguard.preverify.*; -import proguard.shrink.Shrinker; -import proguard.util.*; - -import java.io.*; - -/** - * Tool for shrinking, optimizing, obfuscating, and preverifying Java classes. - * - * @author Eric Lafortune - */ -public class ProGuard -{ - public static final String VERSION = "ProGuard, version 6.0.3"; - - private final Configuration configuration; - private ClassPool programClassPool = new ClassPool(); - private final ClassPool libraryClassPool = new ClassPool(); - - // Map with class names as keys, and the names of all injected classes that are - // referenced from these key classes as values. - // All names are the original, non-obfuscated class names. - private final MultiValueMap injectedClassNameMap = new MultiValueMap(); - - - /** - * Creates a new ProGuard object to process jars as specified by the given - * configuration. - */ - public ProGuard(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Performs all subsequent ProGuard operations. - */ - public void execute() throws IOException - { - System.out.println(VERSION); - - GPL.check(); - - if (configuration.printConfiguration != null) - { - printConfiguration(); - } - - new ConfigurationChecker(configuration).check(); - - if (configuration.programJars != null && - configuration.programJars.hasOutput() && - new UpToDateChecker(configuration).check()) - { - return; - } - - if (configuration.targetClassVersion != 0) - { - configuration.backport = true; - } - - readInput(); - - if (configuration.shrink || - configuration.optimize || - configuration.obfuscate || - configuration.preverify) - { - clearPreverification(); - } - - if (configuration.printSeeds != null || - configuration.shrink || - configuration.optimize || - configuration.obfuscate || - configuration.preverify || - configuration.backport) - { - initialize(); - } - - if (configuration.obfuscate || - configuration.optimize) - { - introducePrimitiveArrayConstants(); - } - - if (configuration.backport) - { - backport(); - } - - if (configuration.addConfigurationDebugging) - { - addConfigurationLogging(); - } - - if (configuration.printSeeds != null) - { - printSeeds(); - } - - if (configuration.preverify || - configuration.android) - { - inlineSubroutines(); - } - - if (configuration.shrink) - { - shrink(); - } - - if (configuration.optimize) - { - for (int optimizationPass = 0; - optimizationPass < configuration.optimizationPasses; - optimizationPass++) - { - if (!optimize(optimizationPass+1, configuration.optimizationPasses)) - { - // Stop optimizing if the code doesn't improve any further. - break; - } - - // Shrink again, if we may. - if (configuration.shrink) - { - // Don't print any usage this time around. - configuration.printUsage = null; - configuration.whyAreYouKeeping = null; - - shrink(); - } - } - - linearizeLineNumbers(); - } - - if (configuration.obfuscate) - { - obfuscate(); - } - - if (configuration.optimize || - configuration.obfuscate) - { - expandPrimitiveArrayConstants(); - } - - if (configuration.optimize) - { - trimLineNumbers(); - } - - if (configuration.targetClassVersion != 0) - { - target(); - } - - if (configuration.preverify) - { - preverify(); - } - - if (configuration.shrink || - configuration.optimize || - configuration.obfuscate || - configuration.preverify) - { - sortClassElements(); - } - - if (configuration.programJars.hasOutput()) - { - writeOutput(); - } - - if (configuration.dump != null) - { - dump(); - } - } - - - /** - * Prints out the configuration that ProGuard is using. - */ - private void printConfiguration() throws IOException - { - if (configuration.verbose) - { - System.out.println("Printing configuration to [" + - PrintWriterUtil.fileName(configuration.printConfiguration) + - "]..."); - } - - PrintWriter pw = PrintWriterUtil.createPrintWriterOut(configuration.printConfiguration); - try - { - new ConfigurationWriter(pw).write(configuration); - } - finally - { - PrintWriterUtil.closePrintWriter(configuration.printConfiguration, pw); - } - } - - - /** - * Reads the input class files. - */ - private void readInput() throws IOException - { - if (configuration.verbose) - { - System.out.println("Reading input..."); - } - - // Fill the program class pool and the library class pool. - new InputReader(configuration).execute(programClassPool, - libraryClassPool); - } - - - /** - * Initializes the cross-references between all classes, performs some - * basic checks, and shrinks the library class pool. - */ - private void initialize() throws IOException - { - if (configuration.verbose) - { - System.out.println("Initializing..."); - } - - new Initializer(configuration).execute(programClassPool, - libraryClassPool); - } - - - /** - * Replaces primitive array initialization code by primitive array constants. - */ - private void introducePrimitiveArrayConstants() - { - programClassPool.classesAccept(new ArrayInitializationReplacer()); - } - - - /** - * Expands primitive array constants back to traditional primitive array - * initialization code. - */ - private void expandPrimitiveArrayConstants() - { - programClassPool.classesAccept(new PrimitiveArrayConstantReplacer()); - } - - - /** - * Backports java language features to the specified target version. - */ - private void backport() - { - new Backporter(configuration).execute(programClassPool, - libraryClassPool, - injectedClassNameMap); - } - - - /** - * Adds configuration logging code, providing suggestions on improving - * the ProGuard configuration. - */ - private void addConfigurationLogging() - { - new ConfigurationLoggingAdder(configuration).execute(programClassPool, - libraryClassPool, - injectedClassNameMap); - } - - - /** - * Sets that target versions of the program classes. - */ - private void target() throws IOException - { - if (configuration.verbose) - { - System.out.println("Setting target versions..."); - } - - new Targeter(configuration).execute(programClassPool); - } - - - /** - * Prints out classes and class members that are used as seeds in the - * shrinking and obfuscation steps. - */ - private void printSeeds() throws IOException - { - if (configuration.verbose) - { - System.out.println("Printing kept classes, fields, and methods..."); - } - - PrintWriter pw = PrintWriterUtil.createPrintWriterOut(configuration.printSeeds); - try - { - new SeedPrinter(pw).write(configuration, - programClassPool, - libraryClassPool); - } - finally - { - PrintWriterUtil.closePrintWriter(configuration.printSeeds, pw); - } - } - - - /** - * Performs the shrinking step. - */ - private void shrink() throws IOException - { - if (configuration.verbose) - { - System.out.println("Shrinking..."); - - // We'll print out some explanation, if requested. - if (configuration.whyAreYouKeeping != null) - { - System.out.println("Explaining why classes and class members are being kept..."); - } - - // We'll print out the usage, if requested. - if (configuration.printUsage != null) - { - System.out.println("Printing usage to [" + PrintWriterUtil.fileName(configuration.printUsage) + "]..."); - } - } - - // Perform the actual shrinking. - programClassPool = - new Shrinker(configuration).execute(programClassPool, - libraryClassPool); - } - - - /** - * Performs the subroutine inlining step. - */ - private void inlineSubroutines() - { - if (configuration.verbose) - { - System.out.println("Inlining subroutines..."); - } - - // Perform the actual inlining. - new SubroutineInliner(configuration).execute(programClassPool); - } - - - /** - * Performs the optimization step. - */ - private boolean optimize(int currentPass, - int maxPasses) throws IOException - { - if (configuration.verbose) - { - System.out.println("Optimizing (pass " + currentPass + "/" + maxPasses + ")..."); - } - - // Perform the actual optimization. - return new Optimizer(configuration).execute(programClassPool, - libraryClassPool, - injectedClassNameMap); - } - - - /** - * Performs the obfuscation step. - */ - private void obfuscate() throws IOException - { - if (configuration.verbose) - { - System.out.println("Obfuscating..."); - - // We'll apply a mapping, if requested. - if (configuration.applyMapping != null) - { - System.out.println("Applying mapping [" + PrintWriterUtil.fileName(configuration.applyMapping) + "]"); - } - - // We'll print out the mapping, if requested. - if (configuration.printMapping != null) - { - System.out.println("Printing mapping to [" + PrintWriterUtil.fileName(configuration.printMapping) + "]..."); - } - } - - // Perform the actual obfuscation. - new Obfuscator(configuration).execute(programClassPool, - libraryClassPool); - } - - - /** - * Disambiguates the line numbers of all program classes, after - * optimizations like method inlining and class merging. - */ - private void linearizeLineNumbers() - { - programClassPool.classesAccept(new LineNumberLinearizer()); - } - - - /** - * Trims the line number table attributes of all program classes. - */ - private void trimLineNumbers() - { - programClassPool.classesAccept(new AllAttributeVisitor(true, - new LineNumberTableAttributeTrimmer())); - } - - - /** - * Clears any JSE preverification information from the program classes. - */ - private void clearPreverification() - { - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_6, - new AllMethodVisitor( - new AllAttributeVisitor( - new NamedAttributeDeleter(ClassConstants.ATTR_StackMapTable))))); - } - - - /** - * Performs the preverification step. - */ - private void preverify() - { - if (configuration.verbose) - { - System.out.println("Preverifying..."); - } - - // Perform the actual preverification. - new Preverifier(configuration).execute(programClassPool); - } - - - /** - * Sorts the elements of all program classes. - */ - private void sortClassElements() - { - programClassPool.classesAccept(new ClassElementSorter()); - } - - - /** - * Writes the output class files. - */ - private void writeOutput() throws IOException - { - if (configuration.verbose) - { - System.out.println("Writing output..."); - } - - // Write out the program class pool. - new OutputWriter(configuration).execute(programClassPool, - injectedClassNameMap); - } - - - /** - * Prints out the contents of the program classes. - */ - private void dump() throws IOException - { - if (configuration.verbose) - { - System.out.println("Printing classes to [" + PrintWriterUtil.fileName(configuration.dump) + "]..."); - } - - PrintWriter pw = PrintWriterUtil.createPrintWriterOut(configuration.dump); - try - { - programClassPool.classesAccept(new ClassPrinter(pw)); - } - finally - { - PrintWriterUtil.closePrintWriter(configuration.dump, pw); - } - } - - - /** - * The main method for ProGuard. - */ - public static void main(String[] args) - { - if (args.length == 0) - { - System.out.println(VERSION); - System.out.println("Usage: java proguard.ProGuard [options ...]"); - System.exit(1); - } - - // Create the default options. - Configuration configuration = new Configuration(); - - try - { - // Parse the options specified in the command line arguments. - ConfigurationParser parser = new ConfigurationParser(args, - System.getProperties()); - try - { - parser.parse(configuration); - } - finally - { - parser.close(); - } - - // Execute ProGuard with these options. - new ProGuard(configuration).execute(); - } - catch (Exception ex) - { - if (configuration.verbose) - { - // Print a verbose stack trace. - ex.printStackTrace(); - } - else - { - // Print just the stack trace message. - System.err.println("Error: "+ex.getMessage()); - } - - System.exit(1); - } - - System.exit(0); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/SeedPrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/SeedPrinter.java deleted file mode 100644 index 04e326d0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/SeedPrinter.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.ClassPool; -import proguard.classfile.visitor.*; -import proguard.optimize.*; - -import java.io.*; - -/** - * This class prints out the seeds specified by keep options. - * - * @author Eric Lafortune - */ -public class SeedPrinter -{ - private final PrintWriter printWriter; - - - /** - * Creates a new ConfigurationWriter that prints to the given writer. - */ - public SeedPrinter(PrintWriter printWriter) throws IOException - { - this.printWriter = printWriter; - } - - - /** - * Prints out the seeds for the classes in the given program class pool. - * @param configuration the configuration containing the keep options. - * @throws IOException if an IO error occurs while writing the configuration. - */ - public void write(Configuration configuration, - ClassPool programClassPool, - ClassPool libraryClassPool) throws IOException - { - // Check if we have at least some keep commands. - if (configuration.keep == null) - { - throw new IOException("You have to specify '-keep' options for the shrinking step."); - } - - // Clean up any old visitor info. - programClassPool.classesAccept(new ClassCleaner()); - libraryClassPool.classesAccept(new ClassCleaner()); - - // Create a visitor for printing out the seeds. We're printing out - // the program elements that are preserved against shrinking, - // optimization, or obfuscation. - KeepMarker keepMarker = new KeepMarker(); - ClassPoolVisitor classPoolvisitor = - new KeepClassSpecificationVisitorFactory(true, true, true) - .createClassPoolVisitor(configuration.keep, - keepMarker, - keepMarker, - keepMarker, - null); - - // Mark the seeds. - programClassPool.accept(classPoolvisitor); - libraryClassPool.accept(classPoolvisitor); - - // Print out the seeds. - SimpleClassPrinter printer = new SimpleClassPrinter(false, printWriter); - programClassPool.classesAcceptAlphabetically( - new MultiClassVisitor( - new KeptClassFilter(printer), - new AllMemberVisitor(new KeptMemberFilter(printer)) - )); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/SubclassedClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/SubclassedClassFilter.java deleted file mode 100644 index 7ec4e60a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/SubclassedClassFilter.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates all its method calls to another ClassVisitor, - * but only for Clazz objects that are being subclassed. - * - * @author Eric Lafortune - */ -final class SubclassedClassFilter -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - public SubclassedClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (programClass.subClasses != null) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (libraryClass.subClasses != null) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/Targeter.java b/tools/proguard/proguard6.0.3/core/src/proguard/Targeter.java deleted file mode 100644 index e81742d0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/Targeter.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import proguard.classfile.ClassPool; -import proguard.classfile.util.ClassUtil; -import proguard.classfile.visitor.ClassVersionSetter; - -import java.io.IOException; -import java.util.*; - -/** - * This class sets the target version on program classes. - * - * @author Eric Lafortune - */ -public class Targeter -{ - private final Configuration configuration; - - - /** - * Creates a new Targeter to set the target version on program classes - * according to the given configuration. - */ - public Targeter(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Sets the target version on classes in the given program class pool. - */ - public void execute(ClassPool programClassPool) throws IOException - { - Set newerClassVersions = configuration.warn != null ? null : new HashSet(); - - programClassPool.classesAccept(new ClassVersionSetter(configuration.targetClassVersion, - newerClassVersions)); - - if (newerClassVersions != null && - newerClassVersions.size() > 0) - { - System.err.print("Warning: some classes have more recent versions ("); - - Iterator iterator = newerClassVersions.iterator(); - while (iterator.hasNext()) - { - Integer classVersion = (Integer)iterator.next(); - System.err.print(ClassUtil.externalClassVersion(classVersion.intValue())); - - if (iterator.hasNext()) - { - System.err.print(","); - } - } - - System.err.println(")"); - System.err.println(" than the target version ("+ClassUtil.externalClassVersion(configuration.targetClassVersion)+")."); - - if (!configuration.ignoreWarnings) - { - System.err.println(" If you are sure this is not a problem,"); - System.err.println(" you could try your luck using the '-ignorewarnings' option."); - throw new IOException("Please correct the above warnings first."); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/UpToDateChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/UpToDateChecker.java deleted file mode 100644 index 57351b2c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/UpToDateChecker.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.io.File; -import java.net.*; - -/** - * This class checks whether the output is up to date. - * - * @author Eric Lafortune - */ -public class UpToDateChecker -{ - private final Configuration configuration; - - - /** - * Creates a new UpToDateChecker with the given configuration. - */ - public UpToDateChecker(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Returns whether the output is up to date, based on the modification times - * of the input jars, output jars, and library jars (or directories). - */ - public boolean check() - { - try - { - ModificationTimeChecker checker = new ModificationTimeChecker(); - - checker.updateInputModificationTime(configuration.lastModified); - - ClassPath programJars = configuration.programJars; - ClassPath libraryJars = configuration.libraryJars; - - // Check the dates of the program jars, if any. - if (programJars != null) - { - for (int index = 0; index < programJars.size(); index++) - { - // Update the input and output modification times. - ClassPathEntry classPathEntry = programJars.get(index); - - checker.updateModificationTime(classPathEntry.getFile(), - classPathEntry.isOutput()); - } - } - - // Check the dates of the library jars, if any. - if (libraryJars != null) - { - for (int index = 0; index < libraryJars.size(); index++) - { - // Update the input modification time. - ClassPathEntry classPathEntry = libraryJars.get(index); - - checker.updateModificationTime(classPathEntry.getFile(), - false); - } - } - - // Check the dates of the auxiliary input files. - checker.updateInputModificationTime(configuration.applyMapping); - checker.updateInputModificationTime(configuration.obfuscationDictionary); - checker.updateInputModificationTime(configuration.classObfuscationDictionary); - checker.updateInputModificationTime(configuration.packageObfuscationDictionary); - - // Check the dates of the auxiliary output files. - checker.updateOutputModificationTime(configuration.printSeeds); - checker.updateOutputModificationTime(configuration.printUsage); - checker.updateOutputModificationTime(configuration.printMapping); - checker.updateOutputModificationTime(configuration.printConfiguration); - checker.updateOutputModificationTime(configuration.dump); - } - catch (IllegalStateException e) - { - // The output is outdated. - return false; - } - - System.out.println("The output seems up to date"); - - return true; - } - - - /** - * This class maintains the modification times of input and output. - * The methods throw an IllegalStateException if the output appears - * outdated. - */ - private static class ModificationTimeChecker { - - private long inputModificationTime = Long.MIN_VALUE; - private long outputModificationTime = Long.MAX_VALUE; - - - /** - * Updates the input modification time based on the given file or - * directory (recursively). - */ - public void updateInputModificationTime(URL url) - { - if (url != null && - url.getProtocol().equals("file")) - { - try - { - updateModificationTime(new File(url.toURI()), false); - } - catch (URISyntaxException ignore) {} - } - } - - - /** - * Updates the input modification time based on the given file or - * directory (recursively). - */ - public void updateInputModificationTime(File file) - { - if (file != null) - { - updateModificationTime(file, false); - } - } - - - /** - * Updates the input modification time based on the given file or - * directory (recursively). - */ - public void updateOutputModificationTime(File file) - { - if (file != null && file.getName().length() > 0) - { - updateModificationTime(file, true); - } - } - - - /** - * Updates the specified modification time based on the given file or - * directory (recursively). - */ - public void updateModificationTime(File file, boolean isOutput) - { - // Is it a directory? - if (file.isDirectory()) - { - // Ignore the directory's modification time; just recurse on - // its files. - File[] files = file.listFiles(); - - // Still, an empty output directory is probably a sign that it - // is not up to date. - if (files.length == 0 && isOutput) - { - updateOutputModificationTime(Long.MIN_VALUE); - } - - for (int index = 0; index < files.length; index++) - { - updateModificationTime(files[index], isOutput); - } - } - else - { - // Update with the file's modification time. - updateModificationTime(file.lastModified(), isOutput); - } - } - - - /** - * Updates the specified modification time. - */ - public void updateModificationTime(long time, boolean isOutput) - { - if (isOutput) - { - updateOutputModificationTime(time); - } - else - { - updateInputModificationTime(time); - } - } - - - /** - * Updates the input modification time. - */ - public void updateInputModificationTime(long time) - { - if (inputModificationTime < time) - { - inputModificationTime = time; - - checkModificationTimes(); - } - } - - - /** - * Updates the output modification time. - */ - public void updateOutputModificationTime(long time) - { - if (outputModificationTime > time) - { - outputModificationTime = time; - - checkModificationTimes(); - } - } - - - private void checkModificationTimes() - { - if (inputModificationTime > outputModificationTime) - { - throw new IllegalStateException("The output is outdated"); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/WordReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/WordReader.java deleted file mode 100644 index 2af8e342..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/WordReader.java +++ /dev/null @@ -1,427 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard; - -import java.io.*; -import java.net.URL; - - -/** - * An abstract reader of words, with the possibility to include other readers. - * Words are separated by spaces or broken off at delimiters. Words containing - * spaces or delimiters can be quoted with single or double quotes. - * Comments (everything starting with '#' on a single line) are ignored. - * - * @author Eric Lafortune - * @noinspection TailRecursion - */ -public abstract class WordReader -{ - private static final char COMMENT_CHARACTER = '#'; - - - private File baseDir; - private URL baseURL; - private WordReader includeWordReader; - private String currentLine; - private int currentLineLength; - private int currentIndex; - private String currentWord; - private String currentComments; - - - /** - * Creates a new WordReader with the given base directory. - */ - protected WordReader(File baseDir) - { - this.baseDir = baseDir; - } - - - /** - * Creates a new WordReader with the given base URL. - */ - protected WordReader(URL baseURL) - { - this.baseURL = baseURL; - } - - - /** - * Sets the base directory of this reader. - */ - public void setBaseDir(File baseDir) - { - if (includeWordReader != null) - { - includeWordReader.setBaseDir(baseDir); - } - else - { - this.baseDir = baseDir; - } - } - - - /** - * Returns the base directory of this reader, if any. - */ - public File getBaseDir() - { - return includeWordReader != null ? - includeWordReader.getBaseDir() : - baseDir; - } - - - /** - * Returns the base URL of this reader, if any. - */ - public URL getBaseURL() - { - return includeWordReader != null ? - includeWordReader.getBaseURL() : - baseURL; - } - - - /** - * Specifies to start reading words from the given WordReader. When it is - * exhausted, this WordReader will continue to provide its own words. - * - * @param newIncludeWordReader the WordReader that will start reading words. - */ - public void includeWordReader(WordReader newIncludeWordReader) - { - if (includeWordReader == null) - { - includeWordReader = newIncludeWordReader; - } - else - { - includeWordReader.includeWordReader(newIncludeWordReader); - } - } - - - /** - * Reads a word from this WordReader, or from one of its active included - * WordReader objects. - * - * @param isFileName return a complete line (or argument), if the word - * isn't an option (it doesn't start with '-'). - * @param expectSingleFile if true, the remaining line is expected to be a - * single file name (excluding path separator), - * otherwise multiple files might be specified - * using the path separator. - * @return the read word. - */ - public String nextWord(boolean isFileName, - boolean expectSingleFile) throws IOException - { - currentWord = null; - - // See if we have an included reader to produce a word. - if (includeWordReader != null) - { - // Does the included word reader still produce a word? - currentWord = includeWordReader.nextWord(isFileName, expectSingleFile); - if (currentWord != null) - { - // Return it if so. - return currentWord; - } - - // Otherwise close and ditch the word reader. - includeWordReader.close(); - includeWordReader = null; - } - - // Get a word from this reader. - - // Skip any whitespace and comments left on the current line. - if (currentLine != null) - { - // Skip any leading whitespace. - while (currentIndex < currentLineLength && - Character.isWhitespace(currentLine.charAt(currentIndex))) - { - currentIndex++; - } - - // Skip any comments. - if (currentIndex < currentLineLength && - isComment(currentLine.charAt(currentIndex))) - { - currentIndex = currentLineLength; - } - } - - // Make sure we have a non-blank line. - while (currentLine == null || currentIndex == currentLineLength) - { - currentLine = nextLine(); - if (currentLine == null) - { - return null; - } - - currentLineLength = currentLine.length(); - - // Skip any leading whitespace. - currentIndex = 0; - while (currentIndex < currentLineLength && - Character.isWhitespace(currentLine.charAt(currentIndex))) - { - currentIndex++; - } - - // Remember any leading comments. - if (currentIndex < currentLineLength && - isComment(currentLine.charAt(currentIndex))) - { - // Remember the comments. - String comment = currentLine.substring(currentIndex + 1); - currentComments = currentComments == null ? - comment : - currentComments + '\n' + comment; - - // Skip the comments. - currentIndex = currentLineLength; - } - } - - // Find the word starting at the current index. - int startIndex = currentIndex; - int endIndex; - - char startChar = currentLine.charAt(startIndex); - - if (isQuote(startChar)) - { - // The next word is starting with a quote character. - // Skip the opening quote. - startIndex++; - - // The next word is a quoted character string. - // Find the closing quote. - do - { - currentIndex++; - - if (currentIndex == currentLineLength) - { - currentWord = currentLine.substring(startIndex-1, currentIndex); - throw new IOException("Missing closing quote for "+locationDescription()); - } - } - while (currentLine.charAt(currentIndex) != startChar); - - endIndex = currentIndex++; - } - else if (isFileName && - !isOption(startChar)) - { - // The next word is a (possibly optional) file name. - // Find the end of the line, the first path separator, the first - // option, or the first comment. - while (currentIndex < currentLineLength) - { - char currentCharacter = currentLine.charAt(currentIndex); - if (isFileDelimiter(currentCharacter, !expectSingleFile) || - ((isOption(currentCharacter) || - isComment(currentCharacter)) && - Character.isWhitespace(currentLine.charAt(currentIndex-1)))) { - break; - } - - currentIndex++; - } - - endIndex = currentIndex; - - // Trim any trailing whitespace. - while (endIndex > startIndex && - Character.isWhitespace(currentLine.charAt(endIndex-1))) - { - endIndex--; - } - } - else if (isDelimiter(startChar)) - { - // The next word is a single delimiting character. - endIndex = ++currentIndex; - } - else - { - // The next word is a simple character string. - // Find the end of the line, the first delimiter, or the first - // white space. - while (currentIndex < currentLineLength) - { - char currentCharacter = currentLine.charAt(currentIndex); - if (isNonStartDelimiter(currentCharacter) || - Character.isWhitespace(currentCharacter) || - isComment(currentCharacter)) { - break; - } - - currentIndex++; - } - - endIndex = currentIndex; - } - - // Remember and return the parsed word. - currentWord = currentLine.substring(startIndex, endIndex); - - return currentWord; - } - - - /** - * Returns the comments collected before returning the last word. - * Starts collecting new comments. - * - * @return the collected comments, or null if there weren't any. - */ - public String lastComments() throws IOException - { - if (includeWordReader == null) - { - String comments = currentComments; - currentComments = null; - return comments; - } - else - { - return includeWordReader.lastComments(); - } - } - - - /** - * Constructs a readable description of the current position in this - * WordReader and its included WordReader objects. - * - * @return the description. - */ - public String locationDescription() - { - return - (includeWordReader == null ? - (currentWord == null ? - "end of " : - "'" + currentWord + "' in " ) : - (includeWordReader.locationDescription() + ",\n" + - " included from ")) + - lineLocationDescription(); - } - - - /** - * Reads a line from this WordReader, or from one of its active included - * WordReader objects. - * - * @return the read line. - */ - protected abstract String nextLine() throws IOException; - - - /** - * Returns a readable description of the current WordReader position. - * - * @return the description. - */ - protected abstract String lineLocationDescription(); - - - /** - * Closes the FileWordReader. - */ - public void close() throws IOException - { - // Close and ditch the included word reader, if any. - if (includeWordReader != null) - { - includeWordReader.close(); - includeWordReader = null; - } - } - - - // Small utility methods. - - private boolean isOption(char character) - { - return character == '-'; - } - - - private boolean isComment(char character) - { - return character == COMMENT_CHARACTER; - } - - - private boolean isDelimiter(char character) - { - return isStartDelimiter(character) || isNonStartDelimiter(character); - } - - - private boolean isStartDelimiter(char character) - { - return character == '@'; - } - - - private boolean isNonStartDelimiter(char character) - { - return character == '{' || - character == '}' || - character == '(' || - character == ')' || - character == ',' || - character == ';' || - character == File.pathSeparatorChar; - } - - - private boolean isFileDelimiter(char character, - boolean includePathSeparator) - { - return character == '(' || - character == ')' || - character == ',' || - character == ';' || - (includePathSeparator && - character == File.pathSeparatorChar); - } - - - private boolean isQuote(char character) - { - return character == '\'' || - character == '"'; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/backport/Backporter.java b/tools/proguard/proguard6.0.3/core/src/proguard/backport/Backporter.java deleted file mode 100644 index 6c3ae9c4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/backport/Backporter.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.backport; - -import proguard.*; -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionCounter; -import proguard.classfile.util.ClassReferenceInitializer; -import proguard.classfile.visitor.*; -import proguard.optimize.peephole.*; -import proguard.util.MultiValueMap; - -/** - * This class backports classes to the specified targetClassVersion. - * - * @author Thomas Neidhart - */ -public class Backporter -{ - private final Configuration configuration; - - - public Backporter(Configuration configuration) - { - this.configuration = configuration; - } - - - public void execute(ClassPool programClassPool, - ClassPool libraryClassPool, - MultiValueMap injectedClassNameMap) - { - int targetClassVersion = configuration.targetClassVersion; - - if (configuration.verbose) - { - System.out.println("Backporting class files..."); - } - - // Clean up any previous visitor info. - programClassPool.classesAccept(new ClassCleaner()); - libraryClassPool.classesAccept(new ClassCleaner()); - - final InstructionCounter replacedStringConcatCounter = new InstructionCounter(); - final ClassCounter lambdaExpressionCounter = new ClassCounter(); - final MemberCounter staticInterfaceMethodCounter = new MemberCounter(); - final MemberCounter defaultInterfaceMethodCounter = new MemberCounter(); - final InstructionCounter replacedMethodCallCounter = new InstructionCounter(); - - if (targetClassVersion < ClassConstants.CLASS_VERSION_1_9) - { - // Convert indy string concatenations to StringBuilder chains - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(true, true); - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_9, - new AllAttributeVisitor( - new AttributeNameFilter(ClassConstants.ATTR_BootstrapMethods, - new AttributeToClassVisitor( - new MultiClassVisitor( - new AllMethodVisitor( - new AllAttributeVisitor( - new PeepholeOptimizer(codeAttributeEditor, - - // Replace the indy instructions related to String concatenation. - new StringConcatenationConverter(replacedStringConcatCounter, - codeAttributeEditor))) - ), - - // Clean up unused bootstrap methods and their dangling constants. - new BootstrapMethodsAttributeShrinker(), - - // Initialize new references to StringBuilder. - new ClassReferenceInitializer(programClassPool, libraryClassPool) - )))))); - } - - if (targetClassVersion < ClassConstants.CLASS_VERSION_1_8) - { - // Collect all classes with BootstrapMethod attributes, - // and convert lambda expressions and method references. - ClassPool filteredClasses = new ClassPool(); - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_8, - new AllAttributeVisitor( - new AttributeNameFilter(ClassConstants.ATTR_BootstrapMethods, - new AttributeToClassVisitor( - new ClassPoolFiller(filteredClasses)))))); - - // Note: we visit the filtered classes in a separate step - // because we modify the programClassPool while converting - filteredClasses.classesAccept( - new MultiClassVisitor( - // Replace the indy instructions related to lambda expressions. - new LambdaExpressionConverter(programClassPool, - libraryClassPool, - injectedClassNameMap, - lambdaExpressionCounter), - - // Clean up unused bootstrap methods and their dangling constants. - new BootstrapMethodsAttributeShrinker(), - - // Re-initialize references. - new ClassReferenceInitializer(programClassPool, libraryClassPool) - )); - - // Remove static and default methods from interfaces if the - // target version is < 1.8. The dalvik format 037 has native - // support for default methods. The dalvik format specification - // does not explicitly mention static interface methods, although - // they seem to work correctly. - ClassPool interfaceClasses = new ClassPool(); - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_8, - new ClassAccessFilter(ClassConstants.ACC_INTERFACE, 0, - new ClassPoolFiller(interfaceClasses)))); - - ClassPool modifiedClasses = new ClassPool(); - ClassVisitor modifiedClassCollector = - new ClassPoolFiller(modifiedClasses); - - interfaceClasses.classesAccept( - new MultiClassVisitor( - new StaticInterfaceMethodConverter(programClassPool, - libraryClassPool, - injectedClassNameMap, - modifiedClassCollector, - staticInterfaceMethodCounter), - - new DefaultInterfaceMethodConverter(modifiedClassCollector, - defaultInterfaceMethodCounter) - )); - - // Re-Initialize references in modified classes. - modifiedClasses.classesAccept( - new ClassReferenceInitializer(programClassPool, - libraryClassPool)); - } - - if (targetClassVersion < ClassConstants.CLASS_VERSION_1_7) - { - // Replace / remove method calls only available in Java 7+. - InstructionSequenceBuilder ____ = - new InstructionSequenceBuilder(programClassPool, - libraryClassPool); - - Instruction[][][] instructions = new Instruction[][][] - { - // Replace Objects.requireNonNull(...) with Object.getClass(). - - // Starting in JDK 9, javac uses {@code requireNonNull} for - // synthetic null-checks - // (see - // JDK-8074306). - { - ____.invokestatic("java/util/Objects", - "requireNonNull", - "(Ljava/lang/Object;)Ljava/lang/Object;").__(), - - ____.dup() - .invokevirtual(ClassConstants.NAME_JAVA_LANG_OBJECT, - ClassConstants.METHOD_NAME_OBJECT_GET_CLASS, - ClassConstants.METHOD_TYPE_OBJECT_GET_CLASS) - .pop().__() - }, - - // Remove Throwable.addSuppressed(...). - { - ____.invokevirtual("java/util/Throwable", - "addSuppressed", - "(Ljava/lang/Throwable;)V").__(), - - ____.pop() // the suppressed exception - .pop().__() // the original exception - } - }; - - Constant[] constants = ____.constants(); - - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - programClassPool.classesAccept( - new AllMethodVisitor( - new AllAttributeVisitor( - new PeepholeOptimizer(null, codeAttributeEditor, - new InstructionSequencesReplacer(constants, - instructions, - null, - codeAttributeEditor, - replacedMethodCallCounter))))); - } - - if (targetClassVersion != 0) - { - // Set the class version of all classes in the program ClassPool - // to the specified target version. This is needed to perform - // optimization on the backported + generated classes. - programClassPool.classesAccept(new ClassVersionSetter(targetClassVersion)); - } - - if (configuration.verbose) - { - System.out.println(" Number of converted string concatenations: " + replacedStringConcatCounter.getCount()); - System.out.println(" Number of converted lambda expressions: " + lambdaExpressionCounter.getCount()); - System.out.println(" Number of converted static interface methods: " + staticInterfaceMethodCounter.getCount()); - System.out.println(" Number of converted default interface methods: " + defaultInterfaceMethodCounter.getCount()); - System.out.println(" Number of replaced Java 7+ method calls: " + replacedMethodCallCounter.getCount()); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/backport/DefaultInterfaceMethodConverter.java b/tools/proguard/proguard6.0.3/core/src/proguard/backport/DefaultInterfaceMethodConverter.java deleted file mode 100644 index 6cd5ff74..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/backport/DefaultInterfaceMethodConverter.java +++ /dev/null @@ -1,304 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.backport; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.peephole.*; -import proguard.util.StringTransformer; - -import java.util.*; - -/** - * This ClassVisitor moves all default interface methods in the visited - * interfaces to concrete implementations. - * - * @author Thomas Neidhart - */ -public class DefaultInterfaceMethodConverter -extends SimplifiedVisitor -implements ClassVisitor, - - // Implementation interfaces. - AttributeVisitor -{ - private final ClassVisitor modifiedClassVisitor; - private final MemberVisitor extraMemberVisitor; - - // Fields acting as parameters and return values for the visitor methods. - - private final Set implClasses = new LinkedHashSet(); - private boolean hasDefaultMethods; - - - public DefaultInterfaceMethodConverter(ClassVisitor modifiedClassVisitor, - MemberVisitor extraMemberVisitor) - { - this.modifiedClassVisitor = modifiedClassVisitor; - this.extraMemberVisitor = extraMemberVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - hasDefaultMethods = false; - implClasses.clear(); - - // Collect all implementations of the interface. - programClass.hierarchyAccept(false, false, false, true, - new ProgramClassFilter( - new ClassCollector(implClasses))); - - programClass.accept( - new AllMethodVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_STATIC, - new AllAttributeVisitor(this)))); - - if (hasDefaultMethods) - { - // Shrink the constant pool of unused constants. - programClass.accept(new ConstantPoolShrinker()); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - hasDefaultMethods = true; - - ProgramClass interfaceClass = (ProgramClass) clazz; - ProgramMethod defaultMethod = (ProgramMethod) method; - - for (Clazz implClass : implClasses) - { - ProgramClass targetClass = (ProgramClass) implClass; - - // Add the default method to the implementing class - // if necessary. - if (!hasInheritedMethod(targetClass, - defaultMethod.getName(interfaceClass), - defaultMethod.getDescriptor(interfaceClass))) - { - defaultMethod.accept(interfaceClass, - new MemberAdder(targetClass)); - - targetClass.accept(modifiedClassVisitor); - } - - // Add the default method as a different method and adapt - // super invocations to it, if necessary. - if (callsDefaultMethodUsingSuper(targetClass, - interfaceClass, - defaultMethod)) - { - replaceDefaultMethodInvocation(targetClass, - interfaceClass, - defaultMethod); - - targetClass.accept(modifiedClassVisitor); - } - } - - // Remove the code attribute from the method and - // add make it abstract. - defaultMethod.accept(interfaceClass, - new MultiMemberVisitor( - new NamedAttributeDeleter(ClassConstants.ATTR_Code), - - new MemberAccessFlagSetter(ClassConstants.ACC_ABSTRACT) - )); - - // Call extra visitor for each visited default method. - if (extraMemberVisitor != null) - { - defaultMethod.accept(interfaceClass, extraMemberVisitor); - } - } - - - // Small utility methods. - - private boolean hasInheritedMethod(Clazz clazz, - String methodName, - String methodDescriptor) - { - MemberCounter counter = new MemberCounter(); - - clazz.hierarchyAccept(true, true, false, false, - new NamedMethodVisitor(methodName, methodDescriptor, - counter)); - - return counter.getCount() > 0; - } - - - /** - * Returns true if any method of the given class - * calls Interface.super.defaultMethod(...). - */ - private boolean callsDefaultMethodUsingSuper(Clazz clazz, - Clazz interfaceClass, - Method defaultMethod) - { - ConstantCounter counter = new ConstantCounter(); - - clazz.accept( - new AllMethodVisitor( - new AllAttributeVisitor( - new AllInstructionVisitor( - new InvocationInstructionMatcher(interfaceClass, - defaultMethod, - counter))))); - - return counter.getCount() > 0; - } - - - /** - * Replaces any super calls to the given default interface method - * in the target class. The default method is copied to the target - * class and the invoke is updated accordingly. - */ - private void replaceDefaultMethodInvocation(ProgramClass targetClass, - ProgramClass interfaceClass, - ProgramMethod interfaceMethod) - { - // Copy the interface method to the target class, with an updated name. - StringTransformer memberRenamer = new StringTransformer() - { - public String transform(String string) - { - return "default$" + string; - } - }; - - interfaceMethod.accept(interfaceClass, - new MemberAdder(targetClass, memberRenamer, null)); - - String targetMethodName = - memberRenamer.transform(interfaceMethod.getName(interfaceClass)); - - // Update invocations of the method inside the target class. - String descriptor = interfaceMethod.getDescriptor(interfaceClass); - Method targetMethod = targetClass.findMethod(targetMethodName, descriptor); - - InstructionSequenceBuilder ____ = - new InstructionSequenceBuilder(); - - Instruction[] patternInstructions = - ____.invokespecial_interface(interfaceClass, - interfaceMethod).__(); - - Instruction[] replacementInstructions = - ____.invokevirtual(targetClass, - targetMethod).__(); - - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - Constant[] constants = ____.constants(); - - targetClass.accept( - new AllMethodVisitor( - new AllAttributeVisitor( - new PeepholeOptimizer(null, codeAttributeEditor, - new InstructionSequenceReplacer(constants, - patternInstructions, - constants, - replacementInstructions, - null, - codeAttributeEditor))))); - } - - - /** - * This InstructionVisitor will call the specified ConstantVisitor - * for any encountered INVOKESPECIAL instruction whose associated - * constant is an InterfaceMethodRefConstant and matches the given - * referenced class and method. - */ - private static class InvocationInstructionMatcher - extends SimplifiedVisitor - implements InstructionVisitor, - ConstantVisitor - { - private final Clazz referencedClass; - private final Method referencedMethod; - private final ConstantVisitor constantVisitor; - - public InvocationInstructionMatcher(Clazz referencedClass, - Method referencedMethod, - ConstantVisitor constantVisitor) - { - this.referencedClass = referencedClass; - this.referencedMethod = referencedMethod; - this.constantVisitor = constantVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_INVOKESPECIAL: - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - if (interfaceMethodrefConstant.referencedClass == referencedClass && - interfaceMethodrefConstant.referencedMember == referencedMethod) - { - constantVisitor.visitInterfaceMethodrefConstant(clazz, interfaceMethodrefConstant); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpression.java b/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpression.java deleted file mode 100644 index feee5fdb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpression.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.backport; - -import proguard.classfile.ClassConstants; -import proguard.classfile.Clazz; -import proguard.classfile.Method; -import proguard.classfile.ProgramClass; -import proguard.classfile.attribute.BootstrapMethodInfo; -import proguard.classfile.util.ClassUtil; -import proguard.classfile.util.MemberFinder; - -/** - * A small helper class that captures useful information - * about a lambda expression as encountered in a class file. - * - * @author Thomas Neidhart - */ -public class LambdaExpression -{ - // The referenced class of the lambda expression. - public ProgramClass referencedClass; - - // The referenced bootstrap method index. - public int bootstrapMethodIndex; - // The referenced bootstrap method info. - public BootstrapMethodInfo bootstrapMethodInfo; - - // The lambda factory method type. - public String factoryMethodDescriptor; - - // The implemented interfaces of the Lambda expression. - public String[] interfaces; - - // The additional bridge method descriptors to be added. - public String[] bridgeMethodDescriptors; - - // The name and descriptor of the implemented interface method. - public String interfaceMethod; - public String interfaceMethodDescriptor; - - // Information regarding the invoked method. - public int invokedReferenceKind; - public String invokedClassName; - public String invokedMethodName; - public String invokedMethodDesc; - - public Clazz referencedInvokedClass; - public Method referencedInvokedMethod; - - // The created lambda class. - public ProgramClass lambdaClass; - - - /** - * Creates a new initialized LambdaExpression (except for the lambdaClass). - */ - public LambdaExpression(ProgramClass referencedClass, - int bootstrapMethodIndex, - BootstrapMethodInfo bootstrapMethodInfo, - String factoryMethodDescriptor, - String[] interfaces, - String[] bridgeMethodDescriptors, - String interfaceMethod, - String interfaceMethodDescriptor, - int invokedReferenceKind, - String invokedClassName, - String invokedMethodName, - String invokedMethodDesc, - Clazz referencedInvokedClass, - Method referencedInvokedMethod) - { - this.referencedClass = referencedClass; - this.bootstrapMethodIndex = bootstrapMethodIndex; - this.bootstrapMethodInfo = bootstrapMethodInfo; - this.factoryMethodDescriptor = factoryMethodDescriptor; - this.interfaces = interfaces; - this.bridgeMethodDescriptors = bridgeMethodDescriptors; - this.interfaceMethod = interfaceMethod; - this.interfaceMethodDescriptor = interfaceMethodDescriptor; - this.invokedReferenceKind = invokedReferenceKind; - this.invokedClassName = invokedClassName; - this.invokedMethodName = invokedMethodName; - this.invokedMethodDesc = invokedMethodDesc; - this.referencedInvokedClass = referencedInvokedClass; - this.referencedInvokedMethod = referencedInvokedMethod; - } - - - /** - * Returns the class name of the converted anonymous class. - */ - public String getLambdaClassName() - { - return String.format("%s$$Lambda$%d", - referencedClass.getName(), - bootstrapMethodIndex); - } - - - public String getConstructorDescriptor() - { - if (isStateless()) - { - return ClassConstants.METHOD_TYPE_INIT; - } - else - { - int endIndex = factoryMethodDescriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); - - return factoryMethodDescriptor.substring(0, endIndex + 1) + ClassConstants.TYPE_VOID; - } - } - - - /** - * Returns whether the lambda expression is serializable. - */ - public boolean isSerializable() - { - for (String interfaceName : interfaces) - { - if (ClassConstants.NAME_JAVA_IO_SERIALIZABLE.equals(interfaceName)) - { - return true; - } - } - return false; - } - - - /** - * Returns whether the lambda expression is actually a method reference. - */ - public boolean isMethodReference() - { - return !isLambdaMethod(invokedMethodName); - } - - - /** - * Returns whether the lambda expression is stateless. - */ - public boolean isStateless() - { - // The lambda expression is stateless if the factory method does - // not have arguments. - return - ClassUtil.internalMethodParameterCount(factoryMethodDescriptor) == 0; - } - - - /** - * Returns whether the invoked method is a static interface method. - */ - public boolean invokesStaticInterfaceMethod() - { - // We assume unknown classes are not interfaces. - return invokedReferenceKind == ClassConstants.REF_invokeStatic && - referencedInvokedClass != null && - (referencedInvokedClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) != 0; - } - - - /** - * Returns whether an accessor method is needed to access - * the invoked method from the lambda class. - */ - public boolean needsAccessorMethod() - { - // We assume unknown classes don't need an accessor method. - return referencedInvokedClass != null && - new MemberFinder().findMethod(lambdaClass, - referencedInvokedClass, - invokedMethodName, - invokedMethodDesc) == null; - } - - - // Small Utility methods. - - private static final String LAMBDA_METHOD_PREFIX = "lambda$"; - - private static boolean isLambdaMethod(String methodName) - { - return methodName.startsWith(LAMBDA_METHOD_PREFIX); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpressionCollector.java b/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpressionCollector.java deleted file mode 100644 index 21e289ff..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpressionCollector.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.backport; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; -import proguard.util.ArrayUtil; - -import java.util.*; - -/** - * This ClassVisitor collects all lambda expressions that are defined in - * a visited class. - * - * @author Thomas Neidhart - */ -public class LambdaExpressionCollector -extends SimplifiedVisitor -implements ClassVisitor, - - // Implementation interfaces. - ConstantVisitor, - AttributeVisitor, - BootstrapMethodInfoVisitor -{ - private final Map lambdaExpressions; - - private InvokeDynamicConstant referencedInvokeDynamicConstant; - private int referencedBootstrapMethodIndex; - private Clazz referencedInvokedClass; - private Method referencedInvokedMethod; - - - public LambdaExpressionCollector(Map lambdaExpressions) - { - this.lambdaExpressions = lambdaExpressions; - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - // Visit any InvokeDynamic constant. - programClass.constantPoolEntriesAccept( - new ConstantTagFilter(ClassConstants.CONSTANT_InvokeDynamic, - this)); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - referencedInvokeDynamicConstant = invokeDynamicConstant; - referencedBootstrapMethodIndex = invokeDynamicConstant.getBootstrapMethodAttributeIndex(); - clazz.attributesAccept(this); - } - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - referencedInvokedClass = refConstant.referencedClass; - referencedInvokedMethod = (Method) refConstant.referencedMember; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitBootstrapMethodsAttribute(Clazz clazz, - BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - bootstrapMethodsAttribute.bootstrapMethodEntryAccept(clazz, referencedBootstrapMethodIndex, this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - ProgramClass programClass = (ProgramClass) clazz; - - MethodHandleConstant bootstrapMethodHandle = - (MethodHandleConstant) programClass.getConstant(bootstrapMethodInfo.u2methodHandleIndex); - - if (isLambdaMetaFactory(bootstrapMethodHandle.getClassName(clazz))) - { - String factoryMethodDescriptor = - referencedInvokeDynamicConstant.getType(clazz); - - String interfaceClassName = - ClassUtil.internalClassNameFromClassType(ClassUtil.internalMethodReturnType(factoryMethodDescriptor)); - - // Find the actual method that is being invoked. - MethodHandleConstant invokedMethodHandle = - (MethodHandleConstant) programClass.getConstant(bootstrapMethodInfo.u2methodArguments[1]); - - referencedInvokedClass = null; - referencedInvokedMethod = null; - clazz.constantPoolEntryAccept(invokedMethodHandle.u2referenceIndex, this); - - // Collect all the useful information. - LambdaExpression lambdaExpression = - new LambdaExpression(programClass, - referencedBootstrapMethodIndex, - bootstrapMethodInfo, - factoryMethodDescriptor, - new String[] { interfaceClassName }, - new String[0], - referencedInvokeDynamicConstant.getName(clazz), - getMethodTypeConstant(programClass, bootstrapMethodInfo.u2methodArguments[0]).getType(clazz), - invokedMethodHandle.getReferenceKind(), - invokedMethodHandle.getClassName(clazz), - invokedMethodHandle.getName(clazz), - invokedMethodHandle.getType(clazz), - referencedInvokedClass, - referencedInvokedMethod); - - if (isAlternateFactoryMethod(bootstrapMethodHandle.getName(clazz))) - { - int flags = - getIntegerConstant(programClass, - bootstrapMethodInfo.u2methodArguments[3]); - - // For the alternate metafactory, the optional arguments start - // at index 4. - int argumentIndex = 4; - - if ((flags & ClassConstants.FLAG_MARKERS) != 0) - { - int markerInterfaceCount = - getIntegerConstant(programClass, - bootstrapMethodInfo.u2methodArguments[argumentIndex++]); - - for (int i = 0; i < markerInterfaceCount; i++) - { - String interfaceName = - programClass.getClassName(bootstrapMethodInfo.u2methodArguments[argumentIndex++]); - - lambdaExpression.interfaces = - ArrayUtil.add(lambdaExpression.interfaces, - lambdaExpression.interfaces.length, - interfaceName); - } - } - - if ((flags & ClassConstants.FLAG_BRIDGES) != 0) - { - int bridgeMethodCount = - getIntegerConstant(programClass, - bootstrapMethodInfo.u2methodArguments[argumentIndex++]); - - for (int i = 0; i < bridgeMethodCount; i++) - { - MethodTypeConstant methodTypeConstant = - getMethodTypeConstant(programClass, - bootstrapMethodInfo.u2methodArguments[argumentIndex++]); - - lambdaExpression.bridgeMethodDescriptors = - ArrayUtil.add(lambdaExpression.bridgeMethodDescriptors, - lambdaExpression.bridgeMethodDescriptors.length, - methodTypeConstant.getType(programClass)); - } - } - - if ((flags & ClassConstants.FLAG_SERIALIZABLE) != 0) - { - lambdaExpression.interfaces = - ArrayUtil.add(lambdaExpression.interfaces, - lambdaExpression.interfaces.length, - ClassConstants.NAME_JAVA_IO_SERIALIZABLE); - } - } - - lambdaExpressions.put(referencedBootstrapMethodIndex, lambdaExpression); - } - } - - // Small utility methods - - private static final String NAME_JAVA_LANG_INVOKE_LAMBDA_METAFACTORY = "java/lang/invoke/LambdaMetafactory"; - private static final String LAMBDA_ALTERNATE_METAFACTORY_METHOD = "altMetafactory"; - - private static boolean isLambdaMetaFactory(String className) - { - return NAME_JAVA_LANG_INVOKE_LAMBDA_METAFACTORY.equals(className); - } - - private static boolean isAlternateFactoryMethod(String methodName) - { - return LAMBDA_ALTERNATE_METAFACTORY_METHOD.equals(methodName); - } - - private static int getIntegerConstant(ProgramClass programClass, int constantIndex) - { - return ((IntegerConstant) programClass.getConstant(constantIndex)).getValue(); - } - - - private static MethodTypeConstant getMethodTypeConstant(ProgramClass programClass, int constantIndex) - { - return (MethodTypeConstant) programClass.getConstant(constantIndex); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpressionConverter.java b/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpressionConverter.java deleted file mode 100644 index ca68a9a4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/backport/LambdaExpressionConverter.java +++ /dev/null @@ -1,991 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.backport; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.util.*; - -import java.util.*; - -/** - * This ClassVisitor converts all lambda expressions in the visited - * classes to anonymous inner classes. - * - * @author Thomas Neidhart - */ -public class LambdaExpressionConverter -extends SimplifiedVisitor -implements ClassVisitor, - - // Implementation interfaces. - MemberVisitor, - AttributeVisitor, - InstructionVisitor -{ - private static final String LAMBDA_SINGLETON_FIELD_NAME = "INSTANCE"; - - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final MultiValueMap injectedClassNameMap; - private final ClassVisitor extraClassVisitor; - - private final Map lambdaExpressionMap; - private final CodeAttributeEditor codeAttributeEditor; - private final MemberRemover memberRemover; - - - public LambdaExpressionConverter(ClassPool programClassPool, - ClassPool libraryClassPool, - MultiValueMap injectedClassNameMap, - ClassVisitor extraClassVisitor) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.injectedClassNameMap = injectedClassNameMap; - this.extraClassVisitor = extraClassVisitor; - - this.lambdaExpressionMap = new HashMap(); - this.codeAttributeEditor = new CodeAttributeEditor(true, true); - this.memberRemover = new MemberRemover(); - } - - - // Implementations for ClassVisitor. - - @Override - public void visitLibraryClass(LibraryClass libraryClass) {} - - - @Override - public void visitProgramClass(ProgramClass programClass) - { - lambdaExpressionMap.clear(); - programClass.accept(new LambdaExpressionCollector(lambdaExpressionMap)); - - for (LambdaExpression lambdaExpression : lambdaExpressionMap.values()) - { - ProgramClass lambdaClass = createLambdaClass(lambdaExpression); - - // Add the converted lambda class to the program class pool - // and the injected class name map. - programClassPool.addClass(lambdaClass); - injectedClassNameMap.put(programClass.getName(), lambdaClass.getName()); - - if (extraClassVisitor != null) - { - extraClassVisitor.visitProgramClass(lambdaClass); - } - } - - if (!lambdaExpressionMap.isEmpty()) - { - // Replace all InvokeDynamic instructions. - programClass.accept( - new AllMethodVisitor( - new AllAttributeVisitor( - this))); - - // Initialize the hierarchy and references of all lambda classes. - for (LambdaExpression lambdaExpression : lambdaExpressionMap.values()) - { - lambdaExpression.lambdaClass.accept( - new MultiClassVisitor( - new ClassSuperHierarchyInitializer(programClassPool, libraryClassPool), - new ClassSubHierarchyInitializer(), - new ClassReferenceInitializer(programClassPool, libraryClassPool) - )); - } - - // Remove deserialization hooks as they are no longer needed. - programClass.methodsAccept(this); - memberRemover.visitProgramClass(programClass); - } - } - - - // Implementations for AttributeVisitor. - - @Override - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - @Override - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - codeAttribute.instructionsAccept(clazz, method, this); - - if (codeAttributeEditor.isModified()) - { - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - } - - - // Implementations for InstructionVisitor. - - @Override - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - @Override - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_INVOKEDYNAMIC) - { - ProgramClass programClass = (ProgramClass) clazz; - - InvokeDynamicConstant invokeDynamicConstant = - (InvokeDynamicConstant) programClass.getConstant(constantInstruction.constantIndex); - - int bootstrapMethodIndex = invokeDynamicConstant.getBootstrapMethodAttributeIndex(); - if (lambdaExpressionMap.containsKey(bootstrapMethodIndex)) - { - LambdaExpression lambdaExpression = lambdaExpressionMap.get(bootstrapMethodIndex); - String lambdaClassName = lambdaExpression.getLambdaClassName(); - - InstructionSequenceBuilder builder = - new InstructionSequenceBuilder(programClass); - - if (lambdaExpression.isStateless()) - { - builder.getstatic(lambdaClassName, - LAMBDA_SINGLETON_FIELD_NAME, - ClassUtil.internalTypeFromClassName(lambdaClassName)); - } - else - { - int maxLocals = codeAttribute.u2maxLocals; - - String methodDescriptor = - lambdaExpression.getConstructorDescriptor(); - int parameterSize = - ClassUtil.internalMethodParameterSize(methodDescriptor); - - // TODO: the special optimization in case there is only 1 - // parameter has been disabled as the used stack - // manipulation instructions might confuse the class - // converter (testcase 1988). - if (parameterSize == 1 && false) - { - // If only 1 parameter is captured by the lambda expression, - // and it is a Category 1 value, we can avoid storing the - // current stack to variables. - builder.new_(lambdaClassName) - .dup_x1() - .swap() - .invokespecial(lambdaClassName, - ClassConstants.METHOD_NAME_INIT, - methodDescriptor); - } - else - { - // More than 1 (or a Category 2) parameter is captured - // by the lambda expression. We need to store the current - // call stack to variables, create the lambda instance and - // load the call stack again from the temporary variables. - - // Collect the argument types. - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(methodDescriptor); - List types = new ArrayList(); - while(typeEnumeration.hasMoreTypes()) - { - types.add(typeEnumeration.nextType()); - } - - // Store the current call stack in reverse order - // into temporary variables. - int variableIndex = maxLocals; - ListIterator typeIterator = - types.listIterator(types.size()); - while (typeIterator.hasPrevious()) - { - String type = typeIterator.previous(); - - builder.store(variableIndex, type); - variableIndex += ClassUtil.internalTypeSize(type); - } - - // Create the lambda instance. - builder.new_(lambdaClassName); - builder.dup(); - - // Reconstruct the call stack by loading it from - // the temporary variables. - typeIterator = types.listIterator(); - while (typeIterator.hasNext()) - { - String type = typeIterator.next(); - - int variableSize = ClassUtil.internalTypeSize(type); - variableIndex -= variableSize; - builder.load(variableIndex, type); - } - - builder.invokespecial(lambdaClassName, - ClassConstants.METHOD_NAME_INIT, - methodDescriptor); - } - } - - codeAttributeEditor.replaceInstruction(offset, - builder.instructions()); - } - } - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) {} - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (isDeserializationHook(programClass, programMethod)) - { - memberRemover.visitProgramMethod(programClass, programMethod); - } - } - - - // Small utility methods. - - private static final String METHOD_NAME_DESERIALIZE_LAMBDA = "$deserializeLambda$"; - private static final String METHOD_TYPE_DESERIALIZE_LAMBDA = "(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;"; - - private static boolean isDeserializationHook(Clazz clazz, Method method) - { - return method.getName(clazz) .equals(METHOD_NAME_DESERIALIZE_LAMBDA) && - method.getDescriptor(clazz).equals(METHOD_TYPE_DESERIALIZE_LAMBDA) && - hasFlag(method, ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC | - ClassConstants.ACC_SYNTHETIC); - } - - private static boolean hasFlag(Member member, int flag) - { - return (member.getAccessFlags() & flag) == flag; - } - - private ProgramClass createLambdaClass(LambdaExpression lambdaExpression) - { - String lambdaClassName = lambdaExpression.getLambdaClassName(); - - ProgramClass lambdaClass = - new ProgramClass(ClassConstants.CLASS_VERSION_1_5, - 1, - new Constant[10], - 0, - 0, - 0); - - ConstantPoolEditor constantPoolEditor = new ConstantPoolEditor(lambdaClass); - - lambdaClass.u2thisClass = - constantPoolEditor.addClassConstant(lambdaClassName, lambdaClass); - lambdaClass.u2superClass = - constantPoolEditor.addClassConstant(ClassConstants.NAME_JAVA_LANG_OBJECT, - null); - - ClassEditor classEditor = new ClassEditor(lambdaClass); - - String[] interfaces = lambdaExpression.interfaces; - for (String interfaceName : interfaces) - { - classEditor.addInterface(constantPoolEditor.addClassConstant(interfaceName, - null)); - } - - // Store the created lambda class in the LambdaExpression - // data structure for later use. - lambdaExpression.lambdaClass = lambdaClass; - - // Apply some optimizations to the lambda expression to - // avoid creating accessor methods all the time. - //fixAccessFlags(lambdaExpression); - - // In case the invoked method can not be accessed directly - // by the lambda class, add a synthetic accessor method. - if (lambdaExpression.needsAccessorMethod()) - { - addAccessorMethod(lambdaExpression.referencedClass, - lambdaExpression); - } - - if (lambdaExpression.isStateless()) - { - completeStatelessLambdaClass(lambdaClass, lambdaExpression); - } - else - { - completeCapturingLambdaClass(lambdaClass, lambdaExpression); - } - - if (lambdaExpression.bridgeMethodDescriptors.length > 0) - { - addBridgeMethods(lambdaClass, lambdaExpression); - } - - return lambdaClass; - } - - - private void fixAccessFlags(LambdaExpression lambdaExpression) - { - // If the invoked method is private, we can make it package-private - // to be able to access it from the lambda class. Otherwise we would - // need to add an additional accessor method. - if (lambdaExpression.referencedInvokedMethod instanceof ProgramMethod) - { - ProgramMethod invokedProgramMethod = - (ProgramMethod) lambdaExpression.referencedInvokedMethod; - - int currentAccessFlags = invokedProgramMethod.getAccessFlags(); - if ((currentAccessFlags & ClassConstants.ACC_PRIVATE) != 0) - { - invokedProgramMethod.u2accessFlags = - AccessUtil.replaceAccessFlags(currentAccessFlags, - AccessUtil.accessFlags(AccessUtil.PACKAGE_VISIBLE)); - - // In case of instance-capturing lambdas or method references to private - // methods the reference kind is invokeSpecial. After fixing the - // access flags we need to update the reference kind as well. - if (lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeSpecial) - { - lambdaExpression.invokedReferenceKind = ClassConstants.REF_invokeVirtual; - } - } - } - } - - - private void addAccessorMethod(ProgramClass programClass, - LambdaExpression lambdaExpression) - { - SimplifiedClassEditor classEditor = new SimplifiedClassEditor(programClass); - - String className = programClass.getName(); - - // Create accessor method. - String shortClassName = - ClassUtil.externalShortClassName( - ClassUtil.externalClassName(className)); - - String accessorMethodName = - String.format("accessor$%s$lambda%d", - shortClassName, - lambdaExpression.bootstrapMethodIndex); - - String accessorMethodDescriptor = - lambdaExpression.invokedMethodDesc; - int accessFlags = - lambdaExpression.referencedInvokedMethod.getAccessFlags(); - - if ((accessFlags & ClassConstants.ACC_STATIC) == 0) - { - accessorMethodDescriptor = - prependParameterToMethodDescriptor(accessorMethodDescriptor, - ClassUtil.internalTypeFromClassType(className)); - } - - CompactCodeAttributeComposer composer = - classEditor.addMethod(ClassConstants.ACC_STATIC | - ClassConstants.ACC_SYNTHETIC, - accessorMethodName, - accessorMethodDescriptor, - 50); - - // Load the parameters first. - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(accessorMethodDescriptor); - - completeInterfaceMethod(lambdaExpression, - composer, - 0, - typeEnumeration, - null); - - classEditor.finishEditing(); - - // Update the lambda expression to point to the created - // accessor method instead. - lambdaExpression.invokedClassName = programClass.getName(); - lambdaExpression.invokedMethodName = accessorMethodName; - lambdaExpression.invokedMethodDesc = accessorMethodDescriptor; - lambdaExpression.invokedReferenceKind = ClassConstants.REF_invokeStatic; - - lambdaExpression.referencedInvokedClass = programClass; - lambdaExpression.referencedInvokedMethod = programClass.findMethod(accessorMethodName, - accessorMethodDescriptor); - } - - - private void completeStatelessLambdaClass(ProgramClass lambdaClass, - LambdaExpression lambdaExpression) - { - String lambdaClassType = ClassUtil.internalTypeFromClassName(lambdaClass.getName()); - - SimplifiedClassEditor classEditor = new SimplifiedClassEditor(lambdaClass); - - // Add singleton field - classEditor.addField(ClassConstants.ACC_PUBLIC | - ClassConstants.ACC_STATIC | - ClassConstants.ACC_FINAL, - LAMBDA_SINGLETON_FIELD_NAME, - lambdaClassType); - - // Add the constructor. - CompactCodeAttributeComposer composer = - classEditor.addMethod(ClassConstants.ACC_PUBLIC, - ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT, - 10); - - composer.aload_0() - .invokespecial(ClassConstants.NAME_JAVA_LANG_OBJECT, - ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT) - .return_(); - - // Add static initializer. - composer = - classEditor.addMethod(ClassConstants.ACC_STATIC, - ClassConstants.METHOD_NAME_CLINIT, - ClassConstants.METHOD_TYPE_CLINIT, - 30); - - composer.new_(lambdaClass.getName()) - .dup() - .invokespecial(lambdaClass.getName(), - ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT) - .putstatic(lambdaClass.getName(), - LAMBDA_SINGLETON_FIELD_NAME, - lambdaClassType) - .return_(); - - // If the lambda expression is serializable, create a readResolve method - // to return the singleton field. - if (lambdaExpression.isSerializable()) - { - composer = - classEditor.addMethod(ClassConstants.ACC_PRIVATE, - ClassConstants.METHOD_NAME_READ_RESOLVE, - ClassConstants.METHOD_TYPE_READ_RESOLVE, - 10); - - composer.getstatic(lambdaClass.getName(), - LAMBDA_SINGLETON_FIELD_NAME, - lambdaClassType) - .areturn(); - } - - // Add the interface method. - composer = - classEditor.addMethod(ClassConstants.ACC_PUBLIC, - lambdaExpression.interfaceMethod, - lambdaExpression.interfaceMethodDescriptor, - 50); - - if (lambdaExpression.invokedReferenceKind == ClassConstants.REF_newInvokeSpecial) - { - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(lambdaExpression.interfaceMethodDescriptor); - - InternalTypeEnumeration invokedTypeEnumeration = - new InternalTypeEnumeration(lambdaExpression.invokedMethodDesc); - - composer.new_(lambdaExpression.invokedClassName) - .dup(); - - // Convert the remaining parameters if they are present. - completeInterfaceMethod(lambdaExpression, - composer, - 1, - typeEnumeration, - invokedTypeEnumeration); - } - else - { - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(lambdaExpression.interfaceMethodDescriptor); - - InternalTypeEnumeration invokedTypeEnumeration = - new InternalTypeEnumeration(lambdaExpression.invokedMethodDesc); - - boolean isInvokeVirtualOrInterface = - lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeVirtual || - lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeInterface; - - int paramIndex = 1; - - // If we invoke a method on an object, we need to cast it to the invoked type. - if (isInvokeVirtualOrInterface) - { - String type = typeEnumeration.nextType(); - String invokedType = - ClassUtil.internalTypeFromClassName(lambdaExpression.invokedClassName); - - composer.load(paramIndex, type); - paramIndex += ClassUtil.internalTypeSize(type); - - convertToTargetType(type, invokedType, composer); - } - - // Convert the remaining parameters if they are present. - completeInterfaceMethod(lambdaExpression, - composer, - paramIndex, - typeEnumeration, - invokedTypeEnumeration); - } - - classEditor.finishEditing(); - } - - - private void completeCapturingLambdaClass(ProgramClass lambdaClass, - LambdaExpression lambdaExpression) - { - SimplifiedClassEditor classEditor = new SimplifiedClassEditor(lambdaClass); - - // Create constructor. - String ctorDescriptor = lambdaExpression.getConstructorDescriptor(); - CompactCodeAttributeComposer composer = - classEditor.addMethod(ClassConstants.ACC_PUBLIC, - ClassConstants.METHOD_NAME_INIT, - ctorDescriptor, - 50); - - composer.aload_0() - .invokespecial(ClassConstants.NAME_JAVA_LANG_OBJECT, - ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT); - - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(ctorDescriptor); - - int argIndex = 0; - int variableIndex = 1; - while (typeEnumeration.hasMoreTypes()) - { - String type = typeEnumeration.nextType(); - String fieldName = "arg$" + argIndex++; - - classEditor.addField(ClassConstants.ACC_PRIVATE | ClassConstants.ACC_FINAL, - fieldName, - type); - - composer.aload_0(); - composer.load(variableIndex, type); - composer.putfield(lambdaClass.getName(), fieldName, type); - - variableIndex += ClassUtil.internalTypeSize(type); - } - - composer.return_(); - - // Create interface method. - composer = - classEditor.addMethod(ClassConstants.ACC_PUBLIC, - lambdaExpression.interfaceMethod, - lambdaExpression.interfaceMethodDescriptor, - 50); - - // Load the instance fields first. - typeEnumeration = - new InternalTypeEnumeration(ctorDescriptor); - - InternalTypeEnumeration invokedTypeEnumeration = - new InternalTypeEnumeration(lambdaExpression.invokedMethodDesc); - - boolean isInvokeVirtualOrInterface = - lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeVirtual || - lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeInterface; - - argIndex = 0; - while (typeEnumeration.hasMoreTypes()) - { - String type = typeEnumeration.nextType(); - String invokedType = isInvokeVirtualOrInterface && argIndex == 0 ? - null : invokedTypeEnumeration.nextType(); - - String fieldName = "arg$" + argIndex++; - - composer.aload_0() - .getfield(lambdaClass.getName(), fieldName, type); - - if (invokedType != null) - { - convertToTargetType(type, invokedType, composer); - } - } - - // And then the method parameters. - typeEnumeration = - new InternalTypeEnumeration(lambdaExpression.interfaceMethodDescriptor); - - completeInterfaceMethod(lambdaExpression, - composer, - 1, - typeEnumeration, - invokedTypeEnumeration); - - classEditor.finishEditing(); - } - - - private void completeInterfaceMethod(LambdaExpression lambdaExpression, - CompactCodeAttributeComposer composer, - int parameterIndex, - InternalTypeEnumeration typeEnumeration, - InternalTypeEnumeration invokedTypeEnumeration) - { - while (typeEnumeration.hasMoreTypes()) - { - String type = typeEnumeration.nextType(); - String invokedType = - invokedTypeEnumeration != null ? - invokedTypeEnumeration.nextType() : - null; - - composer.load(parameterIndex, type); - parameterIndex += ClassUtil.internalTypeSize(type); - - if (invokedType != null) - { - convertToTargetType(type, invokedType, composer); - } - } - - switch (lambdaExpression.invokedReferenceKind) - { - case ClassConstants.REF_invokeStatic: - if (lambdaExpression.invokesStaticInterfaceMethod()) - { - composer.invokestaticinterface(lambdaExpression.invokedClassName, - lambdaExpression.invokedMethodName, - lambdaExpression.invokedMethodDesc, - lambdaExpression.referencedInvokedClass, - lambdaExpression.referencedInvokedMethod); - } - else - { - composer.invokestatic(lambdaExpression.invokedClassName, - lambdaExpression.invokedMethodName, - lambdaExpression.invokedMethodDesc, - lambdaExpression.referencedInvokedClass, - lambdaExpression.referencedInvokedMethod); - } - break; - - case ClassConstants.REF_invokeVirtual: - composer.invokevirtual(lambdaExpression.invokedClassName, - lambdaExpression.invokedMethodName, - lambdaExpression.invokedMethodDesc, - lambdaExpression.referencedInvokedClass, - lambdaExpression.referencedInvokedMethod); - break; - - case ClassConstants.REF_invokeInterface: - composer.invokeinterface(lambdaExpression.invokedClassName, - lambdaExpression.invokedMethodName, - lambdaExpression.invokedMethodDesc, - lambdaExpression.referencedInvokedClass, - lambdaExpression.referencedInvokedMethod); - break; - - case ClassConstants.REF_newInvokeSpecial: - case ClassConstants.REF_invokeSpecial: - composer.invokespecial(lambdaExpression.invokedClassName, - lambdaExpression.invokedMethodName, - lambdaExpression.invokedMethodDesc, - lambdaExpression.referencedInvokedClass, - lambdaExpression.referencedInvokedMethod); - break; - } - - String methodReturnType = typeEnumeration.returnType(); - - if (invokedTypeEnumeration != null) - { - convertToTargetType(invokedTypeEnumeration.returnType(), - methodReturnType, - composer); - } - - composer.return_(methodReturnType); - } - - - private void addBridgeMethods(ProgramClass lambdaClass, LambdaExpression lambdaExpression) - { - SimplifiedClassEditor classEditor = new SimplifiedClassEditor(lambdaClass); - - String methodName = lambdaExpression.interfaceMethod; - for (String bridgeMethodDescriptor : lambdaExpression.bridgeMethodDescriptors) - { - Method method = lambdaClass.findMethod(methodName, bridgeMethodDescriptor); - if (method != null) - { - continue; - } - - CompactCodeAttributeComposer composer = - classEditor.addMethod(ClassConstants.ACC_PUBLIC | - ClassConstants.ACC_SYNTHETIC | - ClassConstants.ACC_BRIDGE, - methodName, - bridgeMethodDescriptor, - 50); - - composer.aload_0(); - - InternalTypeEnumeration interfaceTypeEnumeration = - new InternalTypeEnumeration(lambdaExpression.interfaceMethodDescriptor); - - InternalTypeEnumeration bridgeTypeEnumeration = - new InternalTypeEnumeration(bridgeMethodDescriptor); - int variableIndex = 1; - while (bridgeTypeEnumeration.hasMoreTypes()) - { - String type = bridgeTypeEnumeration.nextType(); - String interfaceType = interfaceTypeEnumeration.nextType(); - - composer.load(variableIndex, type); - variableIndex += ClassUtil.internalTypeSize(type); - - convertToTargetType(type, interfaceType, composer); - } - - composer.invokevirtual(lambdaClass.getName(), - lambdaExpression.interfaceMethod, - lambdaExpression.interfaceMethodDescriptor); - - String methodReturnType = bridgeTypeEnumeration.returnType(); - - convertToTargetType(interfaceTypeEnumeration.returnType(), - methodReturnType, - composer); - - composer.return_(methodReturnType); - } - - classEditor.finishEditing(); - } - - - private static String prependParameterToMethodDescriptor(String methodDescriptor, - String type) - { - StringBuilder methodDescBuilder = new StringBuilder(); - - methodDescBuilder.append('('); - methodDescBuilder.append(type); - - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(methodDescriptor); - - while (typeEnumeration.hasMoreTypes()) - { - methodDescBuilder.append(typeEnumeration.nextType()); - } - - methodDescBuilder.append(')'); - methodDescBuilder.append(typeEnumeration.returnType()); - return methodDescBuilder.toString(); - } - - - /** - * Adds the required instructions to the provided CodeAttributeComposer - * to convert the current value on the stack to the given targetType. - */ - private static void convertToTargetType(String sourceType, - String targetType, - CompactCodeAttributeComposer composer) - { - if (ClassUtil.isInternalPrimitiveType(sourceType) && - !ClassUtil.isInternalPrimitiveType(targetType)) - { - // Perform auto-boxing. - switch (sourceType.charAt(0)) - { - case ClassConstants.TYPE_INT: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_INTEGER, - "valueOf", - "(I)Ljava/lang/Integer;"); - break; - - case ClassConstants.TYPE_BYTE: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_BYTE, - "valueOf", - "(B)Ljava/lang/Byte;"); - break; - - case ClassConstants.TYPE_CHAR: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_CHARACTER, - "valueOf", - "(C)Ljava/lang/Character;"); - break; - - case ClassConstants.TYPE_SHORT: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_SHORT, - "valueOf", - "(S)Ljava/lang/Short;"); - break; - - case ClassConstants.TYPE_BOOLEAN: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_BOOLEAN, - "valueOf", - "(Z)Ljava/lang/Boolean;"); - break; - - case ClassConstants.TYPE_LONG: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_LONG, - "valueOf", - "(J)Ljava/lang/Long;"); - break; - - case ClassConstants.TYPE_FLOAT: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_FLOAT, - "valueOf", - "(F)Ljava/lang/Float;"); - break; - - case ClassConstants.TYPE_DOUBLE: - composer.invokestatic(ClassConstants.NAME_JAVA_LANG_DOUBLE, - "valueOf", - "(D)Ljava/lang/Double;"); - break; - } - } - else if (!ClassUtil.isInternalPrimitiveType(sourceType) && - ClassUtil.isInternalPrimitiveType(targetType)) - { - boolean castRequired = sourceType.equals(ClassConstants.TYPE_JAVA_LANG_OBJECT); - - // Perform auto-unboxing. - switch (targetType.charAt(0)) - { - case ClassConstants.TYPE_INT: - if (castRequired) - { - composer.checkcast("java/lang/Number"); - } - composer.invokevirtual("java/lang/Number", - "intValue", - "()I"); - break; - - case ClassConstants.TYPE_BYTE: - if (castRequired) - { - composer.checkcast(ClassConstants.NAME_JAVA_LANG_BYTE); - } - composer.invokevirtual(ClassConstants.NAME_JAVA_LANG_BYTE, - "byteValue", - "()B"); - break; - - case ClassConstants.TYPE_CHAR: - if (castRequired) - { - composer.checkcast(ClassConstants.NAME_JAVA_LANG_CHARACTER); - } - composer.invokevirtual(ClassConstants.NAME_JAVA_LANG_CHARACTER, - "charValue", - "()C"); - break; - - case ClassConstants.TYPE_SHORT: - if (castRequired) - { - composer.checkcast(ClassConstants.NAME_JAVA_LANG_SHORT); - } - composer.invokevirtual(ClassConstants.NAME_JAVA_LANG_SHORT, - "shortValue", - "()S"); - break; - - case ClassConstants.TYPE_BOOLEAN: - if (castRequired) - { - composer.checkcast(ClassConstants.NAME_JAVA_LANG_BOOLEAN); - } - composer.invokevirtual(ClassConstants.NAME_JAVA_LANG_BOOLEAN, - "booleanValue", - "()Z"); - break; - - case ClassConstants.TYPE_LONG: - if (castRequired) - { - composer.checkcast("java/lang/Number"); - } - composer.invokevirtual("java/lang/Number", - "longValue", - "()J"); - break; - - case ClassConstants.TYPE_FLOAT: - if (castRequired) - { - composer.checkcast("java/lang/Number"); - } - composer.invokevirtual("java/lang/Number", - "floatValue", - "()F"); - break; - - case ClassConstants.TYPE_DOUBLE: - if (castRequired) - { - composer.checkcast("java/lang/Number"); - } - composer.invokevirtual("java/lang/Number", - "doubleValue", - "()D"); - break; - } - } - else if (ClassUtil.isInternalClassType(sourceType) && - (ClassUtil.isInternalClassType(targetType) || - ClassUtil.isInternalArrayType(targetType)) && - !sourceType.equals(targetType) && - // No need to cast to java/lang/Object. - !ClassConstants.TYPE_JAVA_LANG_OBJECT.equals(targetType)) - { - // Cast to target type. - composer.checkcast(ClassUtil.internalClassTypeFromType(targetType)); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/backport/StaticInterfaceMethodConverter.java b/tools/proguard/proguard6.0.3/core/src/proguard/backport/StaticInterfaceMethodConverter.java deleted file mode 100644 index 7f3db7ab..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/backport/StaticInterfaceMethodConverter.java +++ /dev/null @@ -1,298 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.backport; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AllAttributeVisitor; -import proguard.classfile.attribute.visitor.AttributeToClassVisitor; -import proguard.classfile.attribute.visitor.InstructionToAttributeVisitor; -import proguard.classfile.constant.Constant; -import proguard.classfile.constant.RefConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.ClassReferenceInitializer; -import proguard.classfile.util.ClassSuperHierarchyInitializer; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.optimize.peephole.InstructionSequencesReplacer; -import proguard.optimize.peephole.PeepholeOptimizer; -import proguard.util.MultiValueMap; - -import java.util.HashSet; -import java.util.Set; - -/** - * This ClassVisitor moves all static interface methods in the visited - * interfaces to a separate util class and updates all invocations in - * the program class pool. - * - * @author Thomas Neidhart - */ -public class StaticInterfaceMethodConverter -extends SimplifiedVisitor -implements ClassVisitor -{ - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final MultiValueMap injectedClassNameMap; - private final ClassVisitor modifiedClassVisitor; - private final MemberVisitor extraMemberVisitor; - - - public StaticInterfaceMethodConverter(ClassPool programClassPool, - ClassPool libraryClassPool, - MultiValueMap injectedClassNameMap, - ClassVisitor modifiedClassVisitor, - MemberVisitor extraMemberVisitor) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.injectedClassNameMap = injectedClassNameMap; - this.modifiedClassVisitor = modifiedClassVisitor; - this.extraMemberVisitor = extraMemberVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - // Collect all static methods of the interface class. - Set staticMethods = new HashSet(); - programClass.accept( - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_STATIC, 0, - new InitializerMethodFilter(null, - new MemberCollector(false, true, true, staticMethods))))); - - if (!staticMethods.isEmpty()) - { - ProgramClass utilityClass = createUtilityClass(programClass); - - // Copy all static interface methods to the utility class. - MemberVisitor memberAdder = new MemberAdder(utilityClass); - if (extraMemberVisitor != null) - { - memberAdder = - new MultiMemberVisitor( - memberAdder, - extraMemberVisitor - ); - } - - MemberRemover memberRemover = new MemberRemover(); - - programClass.accept( - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_STATIC, 0, - new InitializerMethodFilter(null, - new MultiMemberVisitor( - // Add the method to the utility class. - memberAdder, - - // Mark the method for removal from the - // interface class. - memberRemover - ) - )))); - - // Add the utility class to the program class pool - // and the injected class name map. - programClassPool.addClass(utilityClass); - injectedClassNameMap.put(programClass.getName(), utilityClass.getName()); - - // Change all invokestatic invocations of the static interface - // methods to use the utility class instead. - replaceInstructions(programClass, utilityClass, staticMethods); - - // Initialize the hierarchy and references of the utility class. - utilityClass.accept( - new MultiClassVisitor( - new ClassSuperHierarchyInitializer(programClassPool, libraryClassPool), - new ClassReferenceInitializer(programClassPool, libraryClassPool) - )); - - // Remove the static methods from the interface class and - // shrink the constant pool of unused constants. - programClass.accept( - new MultiClassVisitor( - memberRemover, - - new ConstantPoolShrinker() - )); - } - } - - - // Small utility methods. - - private ProgramClass createUtilityClass(ProgramClass interfaceClazz) - { - ProgramClass utilityClass = - new ProgramClass(ClassConstants.CLASS_VERSION_1_2, - 1, - new Constant[10], - 0, - 0, - 0); - - String utilityClassName = interfaceClazz.getName() + "$$Util"; - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor(utilityClass, programClassPool, libraryClassPool); - - utilityClass.u2thisClass = - constantPoolEditor.addClassConstant(utilityClassName, - utilityClass); - utilityClass.u2superClass = - constantPoolEditor.addClassConstant(ClassConstants.NAME_JAVA_LANG_OBJECT, - null); - - SimplifiedClassEditor classEditor = - new SimplifiedClassEditor(utilityClass); - - // Add a private constructor. - classEditor.addMethod(ClassConstants.ACC_PRIVATE, - ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT, - 10) - .aload_0() - .invokespecial(ClassConstants.NAME_JAVA_LANG_OBJECT, - ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT) - .return_(); - - classEditor.finishEditing(); - return utilityClass; - } - - - /** - * Replaces all static invocations of the given methods in the given - * interface class by invocations of copies of these methods in the - * given utility class. - */ - private void replaceInstructions(ProgramClass interfaceClass, - ProgramClass utilityClass, - Set staticMethods) - { - InstructionSequenceBuilder ____ = - new InstructionSequenceBuilder(programClassPool, - libraryClassPool); - - Instruction[][][] instructions = - new Instruction[staticMethods.size()][][]; - - int index = 0; - for (String staticMethod : staticMethods) - { - String[] splitArray = staticMethod.split("\\."); - String methodName = splitArray[0]; - String methodDesc = splitArray[1]; - - Instruction[][] replacement = new Instruction[][] - { - ____.invokestatic_interface(interfaceClass.getName(), - methodName, - methodDesc).__(), - - ____.invokestatic(utilityClass.getName(), - methodName, - methodDesc).__(), - }; - - instructions[index++] = replacement; - } - - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - InstructionVisitor updatedClassVisitor = - new InstructionToAttributeVisitor( - new AttributeToClassVisitor( - modifiedClassVisitor)); - - programClassPool.classesAccept( - new MyReferencedClassFilter(interfaceClass, - new AllMethodVisitor( - new AllAttributeVisitor( - new PeepholeOptimizer(codeAttributeEditor, - new InstructionSequencesReplacer(____.constants(), - instructions, - null, - codeAttributeEditor, - updatedClassVisitor)))))); - } - - - /** - * This ClassVisitor delegates its visits to classes that - * reference a given class via any RefConstant. - */ - private static class MyReferencedClassFilter - extends SimplifiedVisitor - implements ClassVisitor, - ConstantVisitor - { - private final Clazz referencedClass; - private final ClassVisitor classVisitor; - - private boolean referenceClassFound; - - public MyReferencedClassFilter(Clazz referencedClass, - ClassVisitor classVisitor) - { - this.referencedClass = referencedClass; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - referenceClassFound = false; - programClass.constantPoolEntriesAccept(this); - - if (referenceClassFound) - { - programClass.accept(classVisitor); - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - if (refConstant.referencedClass == referencedClass) - { - referenceClassFound = true; - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/backport/StringConcatenationConverter.java b/tools/proguard/proguard6.0.3/core/src/proguard/backport/StringConcatenationConverter.java deleted file mode 100644 index 11668bb1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/backport/StringConcatenationConverter.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.backport; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; - -import java.util.*; - -/** - * This InstructionVistor converts all indy String Concatenations in the visited - * classes to StringBuilder-append chains. - * - * @author Tim Van Den Broecke - */ -public class StringConcatenationConverter -extends SimplifiedVisitor -implements InstructionVisitor, - - // Implementation interfaces. - AttributeVisitor, - BootstrapMethodInfoVisitor, - ConstantVisitor -{ - // Constants as per specification - private static final char C_VARIABLE_ARGUMENT = '\u0001'; - private static final char C_CONSTANT_ARGUMENT = '\u0002'; - - private final InstructionVisitor extraInstructionVisitor; - private final CodeAttributeEditor codeAttributeEditor; - - private InstructionSequenceBuilder appendChainComposer; - private int estimatedStringLength; - private int referencedBootstrapMethodIndex; - private String concatenationRecipe; - private int[] concatenationConstants; - - public StringConcatenationConverter(InstructionVisitor extraInstructionVisitor, - CodeAttributeEditor codeAttributeEditor) - { - this.extraInstructionVisitor = extraInstructionVisitor; - this.codeAttributeEditor = codeAttributeEditor; - } - - - // Implementations for InstructionVisitor. - - @Override - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - @Override - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_INVOKEDYNAMIC) - { - ProgramClass programClass = (ProgramClass) clazz; - - InvokeDynamicConstant invokeDynamicConstant = - (InvokeDynamicConstant) programClass.getConstant(constantInstruction.constantIndex); - - // Remember the referenced bootstrap method index and extract the recipe from it. - referencedBootstrapMethodIndex = invokeDynamicConstant.getBootstrapMethodAttributeIndex(); - concatenationRecipe = null; - concatenationConstants = null; - - programClass.attributesAccept(this); - - if (concatenationRecipe != null) - { - //if (isMakeConcatWithConstants(invokeDynamicConstant.getName(programClass))) - String descriptor = invokeDynamicConstant.getType(programClass); - - InstructionSequenceBuilder mainReplacementComposer = new InstructionSequenceBuilder(programClass); - appendChainComposer = new InstructionSequenceBuilder(programClass); - estimatedStringLength = 0; - - // Collect the argument types. - InternalTypeEnumeration typeEnumeration = new InternalTypeEnumeration(descriptor); - List types = new ArrayList(); - while (typeEnumeration.hasMoreTypes()) - { - types.add(typeEnumeration.nextType()); - } - - // Store the correct number of stack values in reverse - // order in local variables - int variableIndex = codeAttribute.u2maxLocals; - ListIterator typeIterator = types.listIterator(types.size()); - while (typeIterator.hasPrevious()) - { - String type = typeIterator.previous(); - - mainReplacementComposer.store(variableIndex, type); - variableIndex += ClassUtil.internalTypeSize(type); - } - - // Loop over the recipe. - // Push the local variables one by one, insert - // constants where necessary and create an append - // instruction chain. - typeIterator = types.listIterator(); - for (int argIndex = 0, constantCounter = 0; argIndex < concatenationRecipe.length(); argIndex++) - { - switch (concatenationRecipe.charAt(argIndex)) - { - case C_VARIABLE_ARGUMENT: - String type = typeIterator.next(); - estimatedStringLength += typicalStringLengthFromType(type); - - int variableSize = ClassUtil.internalTypeSize(type); - variableIndex -= variableSize; - - appendChainComposer.load(variableIndex, type) - .invokevirtual(ClassConstants.NAME_JAVA_LANG_STRING_BUILDER, - ClassConstants.METHOD_NAME_APPEND, - appendDescriptorFromInternalType(type)); - break; - - case C_CONSTANT_ARGUMENT: - int constantIndex = concatenationConstants[constantCounter++]; - - appendChainComposer.ldc_(constantIndex); - // Visit the constant to decide how it needs to be appended. - programClass.constantPoolEntryAccept(constantIndex, this); - break; - - default: - // Find where the String stops and append it - int nextArgIndex = nextArgIndex(concatenationRecipe, argIndex); - estimatedStringLength += nextArgIndex - argIndex; - appendChainComposer.ldc(concatenationRecipe.substring(argIndex, nextArgIndex)) - .invokevirtual(ClassConstants.NAME_JAVA_LANG_STRING_BUILDER, - ClassConstants.METHOD_NAME_APPEND, - ClassConstants.METHOD_TYPE_STRING_STRING_BUILDER); - - // Jump forward to the end of the String - argIndex = nextArgIndex - 1; - break; - } - } - - // Create a StringBuilder with the estimated initial size - mainReplacementComposer.new_( ClassConstants.NAME_JAVA_LANG_STRING_BUILDER) - .dup() - .pushInt( estimatedStringLength) - .invokespecial(ClassConstants.NAME_JAVA_LANG_STRING_BUILDER, - ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INT_VOID); - - // Attach the 'append' instruction chain - mainReplacementComposer.appendInstructions(appendChainComposer.instructions()); - - // Finish with StringBuilder.toString() - mainReplacementComposer.invokevirtual(ClassConstants.NAME_JAVA_LANG_STRING_BUILDER, - ClassConstants.METHOD_NAME_TOSTRING, - ClassConstants.METHOD_TYPE_TOSTRING); - - // Commit the code changes - codeAttributeEditor.replaceInstruction(offset, - mainReplacementComposer.instructions()); - - // Optionally let this instruction be visited some more - if (extraInstructionVisitor != null) - { - extraInstructionVisitor.visitConstantInstruction(clazz, - method, - codeAttribute, - offset, - constantInstruction); - } - } - } - } - - - // Implementations for AttributeVisitor. - - @Override - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - @Override - public void visitBootstrapMethodsAttribute(Clazz clazz, - BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - bootstrapMethodsAttribute.bootstrapMethodEntryAccept(clazz, referencedBootstrapMethodIndex, this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - @Override - public void visitBootstrapMethodInfo(Clazz clazz, - BootstrapMethodInfo bootstrapMethodInfo) - { - ProgramClass programClass = (ProgramClass) clazz; - - MethodHandleConstant bootstrapMethodHandle = - (MethodHandleConstant) programClass.getConstant(bootstrapMethodInfo.u2methodHandleIndex); - - if (isStringConcatFactory(bootstrapMethodHandle.getClassName(clazz))) - { - concatenationRecipe = - ((StringConstant) programClass.getConstant(bootstrapMethodInfo.u2methodArguments[0])).getString(programClass); - concatenationConstants = bootstrapMethodInfo.u2methodArgumentCount > 1 ? - Arrays.copyOfRange(bootstrapMethodInfo.u2methodArguments, 1, bootstrapMethodInfo.u2methodArgumentCount) : - new int[0]; - } - - } - - - // Implementations for ConstantVisitor. - - @Override - public void visitAnyConstant(Clazz clazz, Constant constant) - { - // append as Object by default. Override below if necessary. - estimatedStringLength += 16; - - appendChainComposer.invokevirtual(ClassConstants.NAME_JAVA_LANG_STRING_BUILDER, - ClassConstants.METHOD_NAME_APPEND, - ClassConstants.METHOD_TYPE_OBJECT_STRING_BUILDER); - } - - @Override - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - estimatedStringLength += stringConstant.getString(clazz).length(); - - appendChainComposer.invokevirtual(ClassConstants.NAME_JAVA_LANG_STRING_BUILDER, - ClassConstants.METHOD_NAME_APPEND, - ClassConstants.METHOD_TYPE_STRING_STRING_BUILDER); - } - - - // Small utility methods. - - private static boolean isStringConcatFactory(String className) - { - return ClassConstants.NAME_JAVA_LANG_INVOKE_STRING_CONCAT_FACTORY.equals(className); - } - - private static boolean isMakeConcat(String methodName) - { - return ClassConstants.METHOD_NAME_MAKE_CONCAT.equals(methodName); - } - - private static boolean isMakeConcatWithConstants(String methodName) - { - return ClassConstants.METHOD_NAME_MAKE_CONCAT_WITH_CONSTANTS.equals(methodName); - } - - private static int typicalStringLengthFromType(String internalTypeName) - { - return internalTypeName.equals(ClassConstants.TYPE_BOOLEAN) ? ClassConstants.MAXIMUM_BOOLEAN_AS_STRING_LENGTH : - internalTypeName.equals(ClassConstants.TYPE_CHAR) ? ClassConstants.MAXIMUM_CHAR_AS_STRING_LENGTH : - internalTypeName.equals(ClassConstants.TYPE_INT) ? ClassConstants.MAXIMUM_INT_AS_STRING_LENGTH : - internalTypeName.equals(ClassConstants.TYPE_LONG) ? ClassConstants.MAXIMUM_LONG_AS_STRING_LENGTH : - internalTypeName.equals(ClassConstants.TYPE_FLOAT) ? ClassConstants.MAXIMUM_FLOAT_AS_STRING_LENGTH : - internalTypeName.equals(ClassConstants.TYPE_DOUBLE) ? ClassConstants.MAXIMUM_DOUBLE_AS_STRING_LENGTH : - ClassConstants.DEFAULT_STRINGBUILDER_INIT_SIZE ; - } - - private static String appendDescriptorFromInternalType(String internalTypeName) - { - return internalTypeName.equals(ClassConstants.TYPE_BOOLEAN) ? ClassConstants.METHOD_TYPE_BOOLEAN_STRING_BUILDER : - internalTypeName.equals(ClassConstants.TYPE_CHAR) ? ClassConstants.METHOD_TYPE_CHAR_STRING_BUILDER : - internalTypeName.equals(ClassConstants.TYPE_INT) ? ClassConstants.METHOD_TYPE_INT_STRING_BUILDER : - internalTypeName.equals(ClassConstants.TYPE_LONG) ? ClassConstants.METHOD_TYPE_LONG_STRING_BUILDER : - internalTypeName.equals(ClassConstants.TYPE_FLOAT) ? ClassConstants.METHOD_TYPE_FLOAT_STRING_BUILDER : - internalTypeName.equals(ClassConstants.TYPE_DOUBLE) ? ClassConstants.METHOD_TYPE_DOUBLE_STRING_BUILDER : - internalTypeName.equals(ClassConstants.TYPE_JAVA_LANG_STRING) ? ClassConstants.METHOD_TYPE_STRING_STRING_BUILDER : - ClassConstants.METHOD_TYPE_OBJECT_STRING_BUILDER ; - } - - private static int nextArgIndex(String recipe, int fromIndex) - { - for(int i = fromIndex; i < recipe.length(); i++) - { - char c = recipe.charAt(i); - if (c == C_VARIABLE_ARGUMENT || - c == C_CONSTANT_ARGUMENT) - { - return i; - } - } - return recipe.length(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ClassConstants.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ClassConstants.java deleted file mode 100644 index d31ed16f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ClassConstants.java +++ /dev/null @@ -1,496 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -/** - * Constants used in representing a Java class file (*.class). - * - * @author Eric Lafortune - */ -public class ClassConstants -{ - public static final String WAR_CLASS_FILE_PREFIX = "classes/"; - - public static final byte[] JMOD_HEADER = new byte[] { 'J', 'M', 1, 0 }; - public static final String JMOD_CLASS_FILE_PREFIX = "classes/"; - - public static final String CLASS_FILE_EXTENSION = ".class"; - - public static final int MAGIC = 0xCAFEBABE; - - public static final int CLASS_VERSION_1_0_MAJOR = 45; - public static final int CLASS_VERSION_1_0_MINOR = 3; - public static final int CLASS_VERSION_1_2_MAJOR = 46; - public static final int CLASS_VERSION_1_2_MINOR = 0; - public static final int CLASS_VERSION_1_3_MAJOR = 47; - public static final int CLASS_VERSION_1_3_MINOR = 0; - public static final int CLASS_VERSION_1_4_MAJOR = 48; - public static final int CLASS_VERSION_1_4_MINOR = 0; - public static final int CLASS_VERSION_1_5_MAJOR = 49; - public static final int CLASS_VERSION_1_5_MINOR = 0; - public static final int CLASS_VERSION_1_6_MAJOR = 50; - public static final int CLASS_VERSION_1_6_MINOR = 0; - public static final int CLASS_VERSION_1_7_MAJOR = 51; - public static final int CLASS_VERSION_1_7_MINOR = 0; - public static final int CLASS_VERSION_1_8_MAJOR = 52; - public static final int CLASS_VERSION_1_8_MINOR = 0; - public static final int CLASS_VERSION_1_9_MAJOR = 53; - public static final int CLASS_VERSION_1_9_MINOR = 0; - public static final int CLASS_VERSION_10_MAJOR = 54; - public static final int CLASS_VERSION_10_MINOR = 0; - - public static final int CLASS_VERSION_1_0 = (CLASS_VERSION_1_0_MAJOR << 16) | CLASS_VERSION_1_0_MINOR; - public static final int CLASS_VERSION_1_2 = (CLASS_VERSION_1_2_MAJOR << 16) | CLASS_VERSION_1_2_MINOR; - public static final int CLASS_VERSION_1_3 = (CLASS_VERSION_1_3_MAJOR << 16) | CLASS_VERSION_1_3_MINOR; - public static final int CLASS_VERSION_1_4 = (CLASS_VERSION_1_4_MAJOR << 16) | CLASS_VERSION_1_4_MINOR; - public static final int CLASS_VERSION_1_5 = (CLASS_VERSION_1_5_MAJOR << 16) | CLASS_VERSION_1_5_MINOR; - public static final int CLASS_VERSION_1_6 = (CLASS_VERSION_1_6_MAJOR << 16) | CLASS_VERSION_1_6_MINOR; - public static final int CLASS_VERSION_1_7 = (CLASS_VERSION_1_7_MAJOR << 16) | CLASS_VERSION_1_7_MINOR; - public static final int CLASS_VERSION_1_8 = (CLASS_VERSION_1_8_MAJOR << 16) | CLASS_VERSION_1_8_MINOR; - public static final int CLASS_VERSION_1_9 = (CLASS_VERSION_1_9_MAJOR << 16) | CLASS_VERSION_1_9_MINOR; - public static final int CLASS_VERSION_10 = (CLASS_VERSION_10_MAJOR << 16) | CLASS_VERSION_10_MINOR; - - public static final int ACC_PUBLIC = 0x0001; - public static final int ACC_PRIVATE = 0x0002; - public static final int ACC_PROTECTED = 0x0004; - public static final int ACC_STATIC = 0x0008; - public static final int ACC_FINAL = 0x0010; - public static final int ACC_SUPER = 0x0020; - public static final int ACC_SYNCHRONIZED = 0x0020; - public static final int ACC_VOLATILE = 0x0040; - public static final int ACC_TRANSIENT = 0x0080; - public static final int ACC_BRIDGE = 0x0040; - public static final int ACC_VARARGS = 0x0080; - public static final int ACC_NATIVE = 0x0100; - public static final int ACC_INTERFACE = 0x0200; - public static final int ACC_ABSTRACT = 0x0400; - public static final int ACC_STRICT = 0x0800; - public static final int ACC_SYNTHETIC = 0x1000; - public static final int ACC_ANNOTATION = 0x2000; - public static final int ACC_ENUM = 0x4000; - public static final int ACC_MANDATED = 0x8000; - public static final int ACC_MODULE = 0x8000; - public static final int ACC_OPEN = 0x0020; - public static final int ACC_TRANSITIVE = 0x0020; - public static final int ACC_STATIC_PHASE = 0x0040; - - // Custom flags introduced by ProGuard - public static final int ACC_RENAMED = 0x00010000; // Marks whether a class or class member has been renamed. - public static final int ACC_REMOVED_METHODS = 0x00020000; // Marks whether a class has (at least one) methods removed. - public static final int ACC_REMOVED_FIELDS = 0x00040000; // Marks whether a class has (at least one) fields removed. - - public static final int VALID_ACC_CLASS = ACC_PUBLIC | - ACC_FINAL | - ACC_SUPER | - ACC_INTERFACE | - ACC_ABSTRACT | - ACC_SYNTHETIC | - ACC_ANNOTATION | - ACC_MODULE | - ACC_ENUM; - public static final int VALID_ACC_FIELD = ACC_PUBLIC | - ACC_PRIVATE | - ACC_PROTECTED | - ACC_STATIC | - ACC_FINAL | - ACC_VOLATILE | - ACC_TRANSIENT | - ACC_SYNTHETIC | - ACC_ENUM; - public static final int VALID_ACC_METHOD = ACC_PUBLIC | - ACC_PRIVATE | - ACC_PROTECTED | - ACC_STATIC | - ACC_FINAL | - ACC_SYNCHRONIZED | - ACC_BRIDGE | - ACC_VARARGS | - ACC_NATIVE | - ACC_ABSTRACT | - ACC_STRICT | - ACC_SYNTHETIC; - public static final int VALID_ACC_PARAMETER = ACC_FINAL | - ACC_SYNTHETIC | - ACC_MANDATED; - public static final int VALID_ACC_MODULE = ACC_OPEN | - ACC_SYNTHETIC | - ACC_MANDATED; - public static final int VALID_ACC_REQUIRES = ACC_TRANSITIVE | - ACC_STATIC_PHASE | - ACC_SYNTHETIC | - ACC_MANDATED; - public static final int VALID_ACC_EXPORTS = ACC_SYNTHETIC | - ACC_MANDATED; - public static final int VALID_ACC_OPENS = ACC_SYNTHETIC | - ACC_MANDATED; - - public static final int CONSTANT_Utf8 = 1; - public static final int CONSTANT_Integer = 3; - public static final int CONSTANT_Float = 4; - public static final int CONSTANT_Long = 5; - public static final int CONSTANT_Double = 6; - public static final int CONSTANT_Class = 7; - public static final int CONSTANT_String = 8; - public static final int CONSTANT_Fieldref = 9; - public static final int CONSTANT_Methodref = 10; - public static final int CONSTANT_InterfaceMethodref = 11; - public static final int CONSTANT_NameAndType = 12; - public static final int CONSTANT_MethodHandle = 15; - public static final int CONSTANT_MethodType = 16; - public static final int CONSTANT_InvokeDynamic = 18; - public static final int CONSTANT_Module = 19; - public static final int CONSTANT_Package = 20; - - public static final int CONSTANT_PrimitiveArray = 21; - - public static final int REF_getField = 1; - public static final int REF_getStatic = 2; - public static final int REF_putField = 3; - public static final int REF_putStatic = 4; - public static final int REF_invokeVirtual = 5; - public static final int REF_invokeStatic = 6; - public static final int REF_invokeSpecial = 7; - public static final int REF_newInvokeSpecial = 8; - public static final int REF_invokeInterface = 9; - - public static final int FLAG_BRIDGES = 4; - public static final int FLAG_MARKERS = 2; - public static final int FLAG_SERIALIZABLE = 1; - - public static final String ATTR_BootstrapMethods = "BootstrapMethods"; - public static final String ATTR_SourceFile = "SourceFile"; - public static final String ATTR_SourceDir = "SourceDir"; - public static final String ATTR_InnerClasses = "InnerClasses"; - public static final String ATTR_EnclosingMethod = "EnclosingMethod"; - public static final String ATTR_Deprecated = "Deprecated"; - public static final String ATTR_Synthetic = "Synthetic"; - public static final String ATTR_Signature = "Signature"; - public static final String ATTR_ConstantValue = "ConstantValue"; - public static final String ATTR_MethodParameters = "MethodParameters"; - public static final String ATTR_Exceptions = "Exceptions"; - public static final String ATTR_Code = "Code"; - public static final String ATTR_StackMap = "StackMap"; - public static final String ATTR_StackMapTable = "StackMapTable"; - public static final String ATTR_LineNumberTable = "LineNumberTable"; - public static final String ATTR_LocalVariableTable = "LocalVariableTable"; - public static final String ATTR_LocalVariableTypeTable = "LocalVariableTypeTable"; - public static final String ATTR_RuntimeVisibleAnnotations = "RuntimeVisibleAnnotations"; - public static final String ATTR_RuntimeInvisibleAnnotations = "RuntimeInvisibleAnnotations"; - public static final String ATTR_RuntimeVisibleParameterAnnotations = "RuntimeVisibleParameterAnnotations"; - public static final String ATTR_RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations"; - public static final String ATTR_RuntimeVisibleTypeAnnotations = "RuntimeVisibleTypeAnnotations"; - public static final String ATTR_RuntimeInvisibleTypeAnnotations = "RuntimeInvisibleTypeAnnotations"; - public static final String ATTR_AnnotationDefault = "AnnotationDefault"; - public static final String ATTR_Module = "Module"; - public static final String ATTR_ModuleMainClass = "ModuleMainClass"; - public static final String ATTR_ModulePackages = "ModulePackages"; - // TODO: More attributes. - public static final String ATTR_CharacterRangeTable = "CharacterRangeTable"; - public static final String ATTR_CompilationID = "CompilationID"; - public static final String ATTR_SourceID = "SourceID"; - - public static final int ANNOTATION_TARGET_ParameterGenericClass = 0x00; - public static final int ANNOTATION_TARGET_ParameterGenericMethod = 0x01; - public static final int ANNOTATION_TARGET_Extends = 0x10; - public static final int ANNOTATION_TARGET_BoundGenericClass = 0x11; - public static final int ANNOTATION_TARGET_BoundGenericMethod = 0x12; - public static final int ANNOTATION_TARGET_Field = 0x13; - public static final int ANNOTATION_TARGET_Return = 0x14; - public static final int ANNOTATION_TARGET_Receiver = 0x15; - public static final int ANNOTATION_TARGET_Parameter = 0x16; - public static final int ANNOTATION_TARGET_Throws = 0x17; - public static final int ANNOTATION_TARGET_LocalVariable = 0x40; - public static final int ANNOTATION_TARGET_ResourceVariable = 0x41; - public static final int ANNOTATION_TARGET_Catch = 0x42; - public static final int ANNOTATION_TARGET_InstanceOf = 0x43; - public static final int ANNOTATION_TARGET_New = 0x44; - public static final int ANNOTATION_TARGET_MethodReferenceNew = 0x45; - public static final int ANNOTATION_TARGET_MethodReference = 0x46; - public static final int ANNOTATION_TARGET_Cast = 0x47; - public static final int ANNOTATION_TARGET_ArgumentGenericMethodNew = 0x48; - public static final int ANNOTATION_TARGET_ArgumentGenericMethod = 0x49; - public static final int ANNOTATION_TARGET_ArgumentGenericMethodReferenceNew = 0x4a; - public static final int ANNOTATION_TARGET_ArgumentGenericMethodReference = 0x4b; - - public static final int RESOLUTION_FLAG_DO_NOT_RESOLVE_BY_DEFAULT = 0x0001; - public static final int RESOLUTION_FLAG_WARN_DEPRECATED = 0x0002; - public static final int RESOLUTION_FLAG_WARN_DEPRECATED_FOR_REMOVAL = 0x0004; - public static final int RESOLUTION_FLAG_WARN_INCUBATING = 0x0008; - - public static final char ELEMENT_VALUE_STRING_CONSTANT = 's'; - public static final char ELEMENT_VALUE_ENUM_CONSTANT = 'e'; - public static final char ELEMENT_VALUE_CLASS = 'c'; - public static final char ELEMENT_VALUE_ANNOTATION = '@'; - public static final char ELEMENT_VALUE_ARRAY = '['; - - public static final char PACKAGE_SEPARATOR = '/'; - public static final char INNER_CLASS_SEPARATOR = '$'; - public static final char SPECIAL_CLASS_CHARACTER = '-'; - public static final char SPECIAL_MEMBER_SEPARATOR = '$'; - - public static final char METHOD_ARGUMENTS_OPEN = '('; - public static final char METHOD_ARGUMENTS_CLOSE = ')'; - - public static final String PACKAGE_JAVA_LANG = "java/lang/"; - public static final String NAME_JAVA_LANG_OBJECT = "java/lang/Object"; - public static final String TYPE_JAVA_LANG_OBJECT = "Ljava/lang/Object;"; - public static final String NAME_JAVA_LANG_CLONEABLE = "java/lang/Cloneable"; - public static final String NAME_JAVA_LANG_THROWABLE = "java/lang/Throwable"; - public static final String NAME_JAVA_LANG_EXCEPTION = "java/lang/Exception"; - public static final String NAME_JAVA_LANG_CLASS = "java/lang/Class"; - public static final String TYPE_JAVA_LANG_CLASS = "Ljava/lang/Class;"; - public static final String NAME_JAVA_LANG_CLASS_LOADER = "java/lang/ClassLoader"; - public static final String NAME_JAVA_LANG_STRING = "java/lang/String"; - public static final String TYPE_JAVA_LANG_STRING = "Ljava/lang/String;"; - public static final String NAME_JAVA_LANG_STRING_BUFFER = "java/lang/StringBuffer"; - public static final String NAME_JAVA_LANG_STRING_BUILDER = "java/lang/StringBuilder"; - public static final String NAME_JAVA_LANG_INVOKE_METHOD_HANDLE = "java/lang/invoke/MethodHandle"; - public static final String NAME_JAVA_LANG_INVOKE_METHOD_TYPE = "java/lang/invoke/MethodType"; - public static final String NAME_JAVA_LANG_INVOKE_STRING_CONCAT_FACTORY = "java/lang/invoke/StringConcatFactory"; - public static final String NAME_JAVA_LANG_VOID = "java/lang/Void"; - public static final String NAME_JAVA_LANG_BOOLEAN = "java/lang/Boolean"; - public static final String NAME_JAVA_LANG_BYTE = "java/lang/Byte"; - public static final String NAME_JAVA_LANG_SHORT = "java/lang/Short"; - public static final String NAME_JAVA_LANG_CHARACTER = "java/lang/Character"; - public static final String NAME_JAVA_LANG_INTEGER = "java/lang/Integer"; - public static final String NAME_JAVA_LANG_LONG = "java/lang/Long"; - public static final String NAME_JAVA_LANG_FLOAT = "java/lang/Float"; - public static final String NAME_JAVA_LANG_DOUBLE = "java/lang/Double"; - public static final String NAME_JAVA_LANG_MATH = "java/lang/Math"; - public static final String NAME_JAVA_LANG_SYSTEM = "java/lang/System"; - public static final String NAME_JAVA_LANG_RUNTIME = "java/lang/Runtime"; - public static final String NAME_JAVA_LANG_REFLECT_ARRAY = "java/lang/reflect/Array"; - public static final String NAME_JAVA_LANG_REFLECT_FIELD = "java/lang/reflect/Field"; - public static final String NAME_JAVA_LANG_REFLECT_METHOD = "java/lang/reflect/Method"; - public static final String NAME_JAVA_LANG_REFLECT_CONSTRUCTOR = "java/lang/reflect/Constructor"; - public static final String NAME_JAVA_LANG_REFLECT_ACCESSIBLE_OBJECT = "java/lang/reflect/AccessibleObject"; - public static final String NAME_JAVA_IO_SERIALIZABLE = "java/io/Serializable"; - public static final String NAME_JAVA_IO_BYTE_ARRAY_INPUT_STREAM = "java/io/ByteArrayInputStream"; - public static final String NAME_JAVA_IO_DATA_INPUT_STREAM = "java/io/DataInputStream"; - public static final String NAME_JAVA_IO_INPUT_STREAM = "java/io/InputStream"; - public static final String NAME_JAVA_UTIL_MAP = "java/util/Map"; - public static final String TYPE_JAVA_UTIL_MAP = "Ljava/util/Map;"; - public static final String NAME_JAVA_UTIL_HASH_MAP = "java/util/HashMap"; - - public static final String NAME_ANDROID_UTIL_FLOAT_MATH = "android/util/FloatMath"; - - public static final String NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_INTEGER_FIELD_UPDATER = "java/util/concurrent/atomic/AtomicIntegerFieldUpdater"; - public static final String NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_LONG_FIELD_UPDATER = "java/util/concurrent/atomic/AtomicLongFieldUpdater"; - public static final String NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_REFERENCE_FIELD_UPDATER = "java/util/concurrent/atomic/AtomicReferenceFieldUpdater"; - - public static final String METHOD_NAME_INIT = ""; - public static final String METHOD_TYPE_INIT = "()V"; - public static final String METHOD_NAME_CLINIT = ""; - public static final String METHOD_TYPE_CLINIT = "()V"; - - public static final String METHOD_NAME_OBJECT_GET_CLASS = "getClass"; - public static final String METHOD_TYPE_OBJECT_GET_CLASS = "()Ljava/lang/Class;"; - public static final String METHOD_NAME_CLASS_FOR_NAME = "forName"; - public static final String METHOD_TYPE_CLASS_FOR_NAME = "(Ljava/lang/String;)Ljava/lang/Class;"; - public static final String METHOD_NAME_CLASS_IS_INSTANCE = "isInstance"; - public static final String METHOD_TYPE_CLASS_IS_INSTANCE = "(Ljava/lang/Object;)Z"; - public static final String METHOD_NAME_CLASS_GET_CLASS_LOADER = "getClassLoader"; - public static final String METHOD_NAME_CLASS_GET_COMPONENT_TYPE = "getComponentType"; - public static final String METHOD_TYPE_CLASS_GET_COMPONENT_TYPE = "()Ljava/lang/Class;"; - public static final String METHOD_NAME_CLASS_GET_FIELD = "getField"; - public static final String METHOD_TYPE_CLASS_GET_FIELD = "(Ljava/lang/String;)Ljava/lang/reflect/Field;"; - public static final String METHOD_NAME_CLASS_GET_DECLARED_FIELD = "getDeclaredField"; - public static final String METHOD_TYPE_CLASS_GET_DECLARED_FIELD = "(Ljava/lang/String;)Ljava/lang/reflect/Field;"; - public static final String METHOD_NAME_CLASS_GET_FIELDS = "getFields"; - public static final String METHOD_TYPE_CLASS_GET_FIELDS = "()[Ljava/lang/reflect/Field;"; - public static final String METHOD_NAME_CLASS_GET_DECLARED_FIELDS = "getDeclaredFields"; - public static final String METHOD_TYPE_CLASS_GET_DECLARED_FIELDS = "()[Ljava/lang/reflect/Field;"; - public static final String METHOD_NAME_CLASS_GET_CONSTRUCTOR = "getConstructor"; - public static final String METHOD_TYPE_CLASS_GET_CONSTRUCTOR = "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"; - public static final String METHOD_NAME_CLASS_GET_DECLARED_CONSTRUCTOR = "getDeclaredConstructor"; - public static final String METHOD_TYPE_CLASS_GET_DECLARED_CONSTRUCTOR = "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"; - public static final String METHOD_NAME_CLASS_GET_CONSTRUCTORS = "getConstructors"; - public static final String METHOD_TYPE_CLASS_GET_CONSTRUCTORS = "()[Ljava/lang/reflect/Constructor;"; - public static final String METHOD_NAME_CLASS_GET_DECLARED_CONSTRUCTORS = "getDeclaredConstructors"; - public static final String METHOD_TYPE_CLASS_GET_DECLARED_CONSTRUCTORS = "()[Ljava/lang/reflect/Constructor;"; - public static final String METHOD_NAME_CLASS_GET_METHOD = "getMethod"; - public static final String METHOD_TYPE_CLASS_GET_METHOD = "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"; - public static final String METHOD_NAME_CLASS_GET_DECLARED_METHOD = "getDeclaredMethod"; - public static final String METHOD_TYPE_CLASS_GET_DECLARED_METHOD = "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"; - public static final String METHOD_NAME_CLASS_GET_METHODS = "getMethods"; - public static final String METHOD_TYPE_CLASS_GET_METHODS = "()[Ljava/lang/reflect/Method;"; - public static final String METHOD_NAME_CLASS_GET_DECLARED_METHODS = "getDeclaredMethods"; - public static final String METHOD_TYPE_CLASS_GET_DECLARED_METHODS = "()[Ljava/lang/reflect/Method;"; - public static final String METHOD_NAME_FIND_CLASS = "findClass"; - public static final String METHOD_TYPE_FIND_CLASS = "(Ljava/lang/String;)Ljava/lang/Class;"; - public static final String METHOD_NAME_LOAD_CLASS = "loadClass"; - public static final String METHOD_TYPE_LOAD_CLASS = "(Ljava/lang/String;Z)Ljava/lang/Class;"; - public static final String METHOD_NAME_FIND_LIBRARY = "findLibrary"; - public static final String METHOD_TYPE_FIND_LIBRARY = "(Ljava/lang/String;)Ljava/lang/String;"; - public static final String METHOD_NAME_LOAD_LIBRARY = "loadLibrary"; - public static final String METHOD_TYPE_LOAD_LIBRARY = "(Ljava/lang/String;)V"; - public static final String METHOD_NAME_LOAD = "load"; - public static final String METHOD_NAME_DO_LOAD = "doLoad"; - public static final String METHOD_TYPE_LOAD = "(Ljava/lang/String;)V"; - public static final String METHOD_TYPE_LOAD2 = "(Ljava/lang/String;Ljava/lang/ClassLoader;)V"; - public static final String METHOD_NAME_NATIVE_LOAD = "nativeLoad"; - public static final String METHOD_TYPE_NATIVE_LOAD = "(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/String;"; - public static final String METHOD_NAME_MAP_LIBRARY_NAME = "mapLibraryName"; - public static final String METHOD_TYPE_MAP_LIBRARY_NAME = "(Ljava/lang/String;)Ljava/lang/String;"; - public static final String METHOD_NAME_GET_RUNTIME = "getRuntime"; - public static final String METHOD_TYPE_GET_RUNTIME = "()Ljava/lang/Runtime;"; - public static final String METHOD_NAME_CLASS_GET_DECLARING_CLASS = "getDeclaringClass"; - public static final String METHOD_NAME_CLASS_GET_ENCLOSING_CLASS = "getEnclosingClass"; - public static final String METHOD_NAME_CLASS_GET_ENCLOSING_CONSTRUCTOR = "getEnclosingConstructor"; - public static final String METHOD_NAME_CLASS_GET_ENCLOSING_METHOD = "getEnclosingMethod"; - public static final String METHOD_NAME_GET_ANNOTATION = "getAnnotation"; - public static final String METHOD_NAME_GET_ANNOTATIONS = "getAnnotations"; - public static final String METHOD_NAME_GET_DECLARED_ANNOTATIONS = "getDeclaredAnnotations"; - public static final String METHOD_NAME_GET_PARAMETER_ANNOTATIONS = "getParameterAnnotations"; - public static final String METHOD_NAME_GET_TYPE_PREFIX = "getType"; - public static final String METHOD_NAME_GET_GENERIC_PREFIX = "getGeneric"; - public static final String METHOD_NAME_NEW_UPDATER = "newUpdater"; - public static final String METHOD_TYPE_NEW_INTEGER_UPDATER = "(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;"; - public static final String METHOD_TYPE_NEW_LONG_UPDATER = "(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;"; - public static final String METHOD_TYPE_NEW_REFERENCE_UPDATER = "(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;"; - public static final String METHOD_NAME_FIELD_GET = "get"; - public static final String METHOD_TYPE_FIELD_GET = "(Ljava/lang/Object;)Ljava/lang/Object;"; - public static final String METHOD_NAME_FIELD_SET = "set"; - public static final String METHOD_TYPE_FIELD_SET = "(Ljava/lang/Object;Ljava/lang/Object;)V"; - public static final String METHOD_NAME_METHOD_INVOKE = "invoke"; - public static final String METHOD_TYPE_METHOD_INVOKE = "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;"; - public static final String METHOD_NAME_CONSTRUCTOR_NEW_INSTANCE = "newInstance"; - public static final String METHOD_TYPE_CONSTRUCTOR_NEW_INSTANCE = "([Ljava/lang/Object;)Ljava/lang/Object;"; - public static final String METHOD_NAME_ARRAY_NEW_INSTANCE = "newInstance"; - public static final String METHOD_TYPE_ARRAY_NEW_INSTANCE = "(Ljava/lang/Class;I)Ljava/lang/Object;"; - public static final String METHOD_TYPE_ARRAY_NEW_INSTANCE2 = "(Ljava/lang/Class;[I)Ljava/lang/Object;"; - public static final String METHOD_NAME_ACCESSIBLE_OBJECT_SET_ACCESSIBLE = "setAccessible"; - public static final String METHOD_TYPE_ACCESSIBLE_OBJECT_SET_ACCESSIBLE = "(Z)V"; - public static final String METHOD_NAME_GET_CAUSE = "getCause"; - public static final String METHOD_TYPE_GET_CAUSE = "()Ljava/lang/Throwable;"; - public static final String METHOD_NAME_MAKE_CONCAT = "makeConcat"; - public static final String METHOD_NAME_MAKE_CONCAT_WITH_CONSTANTS = "makeConcatWithConstants"; - - // Serialization methods. - public static final String METHOD_NAME_READ_OBJECT = "readObject"; - public static final String METHOD_TYPE_READ_OBJECT = "(Ljava/io/ObjectInputStream;)V"; - public static final String METHOD_NAME_READ_RESOLVE = "readResolve"; - public static final String METHOD_TYPE_READ_RESOLVE = "()Ljava/lang/Object;"; - public static final String METHOD_NAME_WRITE_OBJECT = "writeObject"; - public static final String METHOD_TYPE_WRITE_OBJECT = "(Ljava/io/ObjectOutputStream;)V"; - public static final String METHOD_NAME_WRITE_REPLACE = "writeReplace"; - public static final String METHOD_TYPE_WRITE_REPLACE = "()Ljava/lang/Object;"; - - public static final String METHOD_NAME_DOT_CLASS_JAVAC = "class$"; - public static final String METHOD_TYPE_DOT_CLASS_JAVAC = "(Ljava/lang/String;)Ljava/lang/Class;"; - public static final String METHOD_NAME_DOT_CLASS_JIKES = "class"; - public static final String METHOD_TYPE_DOT_CLASS_JIKES = "(Ljava/lang/String;Z)Ljava/lang/Class;"; - - public static final String METHOD_TYPE_INIT_ENUM = "(Ljava/lang/String;I)V"; - - public static final String METHOD_NAME_NEW_INSTANCE = "newInstance"; - public static final String METHOD_TYPE_NEW_INSTANCE = "()Ljava/lang/Object;"; - - public static final String METHOD_NAME_VALUE_OF = "valueOf"; - public static final String METHOD_TYPE_VALUE_OF = "(I)Ljava/lang/Integer;"; - - public static final String FIELD_NAME_TYPE = "TYPE"; - public static final String FIELD_TYPE_TYPE = "Ljava/lang/Class;"; - public static final String METHOD_NAME_EQUALS = "equals"; - public static final String METHOD_TYPE_EQUALS = "(Ljava/lang/Object;)Z"; - public static final String METHOD_NAME_LENGTH = "length"; - public static final String METHOD_TYPE_LENGTH = "()I"; - public static final String METHOD_NAME_VALUEOF = "valueOf"; - public static final String METHOD_TYPE_VALUEOF_BOOLEAN = "(Z)Ljava/lang/String;"; - public static final String METHOD_TYPE_VALUEOF_CHAR = "(C)Ljava/lang/String;"; - public static final String METHOD_TYPE_VALUEOF_INT = "(I)Ljava/lang/String;"; - public static final String METHOD_TYPE_VALUEOF_LONG = "(J)Ljava/lang/String;"; - public static final String METHOD_TYPE_VALUEOF_FLOAT = "(F)Ljava/lang/String;"; - public static final String METHOD_TYPE_VALUEOF_DOUBLE = "(D)Ljava/lang/String;"; - public static final String METHOD_TYPE_VALUEOF_OBJECT = "(Ljava/lang/Object;)Ljava/lang/String;"; - public static final String METHOD_NAME_INTERN = "intern"; - public static final String METHOD_TYPE_INTERN = "()Ljava/lang/String;"; - - public static final String METHOD_NAME_APPEND = "append"; - public static final String METHOD_TYPE_INT_VOID = "(I)V"; - public static final String METHOD_TYPE_STRING_VOID = "(Ljava/lang/String;)V"; - public static final String METHOD_TYPE_BYTES_VOID = "([B)V"; - public static final String METHOD_TYPE_BYTES_INT_VOID = "([BI)V"; - public static final String METHOD_TYPE_CHARS_VOID = "([C)V"; - public static final String METHOD_TYPE_BOOLEAN_STRING_BUFFER = "(Z)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_CHAR_STRING_BUFFER = "(C)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_INT_STRING_BUFFER = "(I)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_LONG_STRING_BUFFER = "(J)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_FLOAT_STRING_BUFFER = "(F)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_DOUBLE_STRING_BUFFER = "(D)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_STRING_STRING_BUFFER = "(Ljava/lang/String;)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_OBJECT_STRING_BUFFER = "(Ljava/lang/Object;)Ljava/lang/StringBuffer;"; - public static final String METHOD_TYPE_BOOLEAN_STRING_BUILDER = "(Z)Ljava/lang/StringBuilder;"; - public static final String METHOD_TYPE_CHAR_STRING_BUILDER = "(C)Ljava/lang/StringBuilder;"; - public static final String METHOD_TYPE_INT_STRING_BUILDER = "(I)Ljava/lang/StringBuilder;"; - public static final String METHOD_TYPE_LONG_STRING_BUILDER = "(J)Ljava/lang/StringBuilder;"; - public static final String METHOD_TYPE_FLOAT_STRING_BUILDER = "(F)Ljava/lang/StringBuilder;"; - public static final String METHOD_TYPE_DOUBLE_STRING_BUILDER = "(D)Ljava/lang/StringBuilder;"; - public static final String METHOD_TYPE_STRING_STRING_BUILDER = "(Ljava/lang/String;)Ljava/lang/StringBuilder;"; - public static final String METHOD_TYPE_OBJECT_STRING_BUILDER = "(Ljava/lang/Object;)Ljava/lang/StringBuilder;"; - public static final String METHOD_NAME_TOSTRING = "toString"; - public static final String METHOD_TYPE_TOSTRING = "()Ljava/lang/String;"; - public static final String METHOD_NAME_CLONE = "clone"; - public static final String METHOD_TYPE_CLONE = "()Ljava/lang/Object;"; - - public static final String METHOD_NAME_VALUES = "values"; - public static final String METHOD_NAME_ORDINAL = "ordinal"; - public static final String METHOD_TYPE_ORDINAL = "()I"; - - public static final char TYPE_VOID = 'V'; - public static final char TYPE_BOOLEAN = 'Z'; - public static final char TYPE_BYTE = 'B'; - public static final char TYPE_CHAR = 'C'; - public static final char TYPE_SHORT = 'S'; - public static final char TYPE_INT = 'I'; - public static final char TYPE_LONG = 'J'; - public static final char TYPE_FLOAT = 'F'; - public static final char TYPE_DOUBLE = 'D'; - public static final char TYPE_CLASS_START = 'L'; - public static final char TYPE_CLASS_END = ';'; - public static final char TYPE_ARRAY = '['; - public static final char TYPE_GENERIC_VARIABLE_START = 'T'; - public static final char TYPE_GENERIC_START = '<'; - public static final char TYPE_GENERIC_BOUND = ':'; - public static final char TYPE_GENERIC_END = '>'; - - public static final int TYPICAL_CONSTANT_POOL_SIZE = 256; - public static final int TYPICAL_FIELD_COUNT = 64; - public static final int TYPICAL_METHOD_COUNT = 64; - public static final int TYPICAL_PARAMETER_COUNT = 32; - public static final int TYPICAL_CODE_LENGTH = 8096; - public static final int TYPICAL_LINE_NUMBER_TABLE_LENGTH = 1024; - public static final int TYPICAL_EXCEPTION_TABLE_LENGTH = 16; - public static final int TYPICAL_VARIABLES_SIZE = 64; - public static final int TYPICAL_STACK_SIZE = 16; - public static final int TYPICAL_BOOTSTRAP_METHODS_ATTRIBUTE_SIZE = 16; - - public static final int MAXIMUM_BOOLEAN_AS_STRING_LENGTH = 5; // false - public static final int MAXIMUM_CHAR_AS_STRING_LENGTH = 1; // any char - public static final int MAXIMUM_INT_AS_STRING_LENGTH = 11; //-2147483648 - public static final int MAXIMUM_LONG_AS_STRING_LENGTH = 20; //-9223372036854775808 - public static final int MAXIMUM_FLOAT_AS_STRING_LENGTH = 13; //-3.4028235E38 - public static final int MAXIMUM_DOUBLE_AS_STRING_LENGTH = 23; //-1.7976931348623157E308 - public static final int MAXIMUM_AT_HASHCODE_LENGTH = MAXIMUM_CHAR_AS_STRING_LENGTH + - MAXIMUM_INT_AS_STRING_LENGTH; - public static final int DEFAULT_STRINGBUILDER_INIT_SIZE = 16; - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ClassPool.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ClassPool.java deleted file mode 100644 index 19cd72bc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ClassPool.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.visitor.*; - -import java.util.*; - -/** - * This is a set of representations of classes. They can be enumerated or - * retrieved by name. They can also be accessed by means of class visitors. - * - * @author Eric Lafortune - */ -public class ClassPool -{ - // We're using a sorted tree map instead of a hash map to store the classes, - // in order to make the processing more deterministic. - private final Map classes = new TreeMap(); - - - /** - * Clears the class pool. - */ - public void clear() - { - classes.clear(); - } - - - /** - * Adds the given Clazz to the class pool. - */ - public void addClass(Clazz clazz) - { - classes.put(clazz.getName(), clazz); - } - - - /** - * Removes the given Clazz from the class pool. - */ - public void removeClass(Clazz clazz) - { - removeClass(clazz.getName()); - } - - - /** - * Removes the specified Clazz from the class pool. - */ - public void removeClass(String className) - { - classes.remove(className); - } - - - /** - * Returns a Clazz from the class pool based on its name. Returns - * null if the class with the given name is not in the class - * pool. - */ - public Clazz getClass(String className) - { - return (Clazz)classes.get(className); - } - - - /** - * Returns an Iterator of all class names in the class pool. - */ - public Iterator classNames() - { - return classes.keySet().iterator(); - } - - - /** - * Returns the number of classes in the class pool. - */ - public int size() - { - return classes.size(); - } - - - /** - * Applies the given ClassPoolVisitor to the class pool. - */ - public void accept(ClassPoolVisitor classPoolVisitor) - { - classPoolVisitor.visitClassPool(this); - } - - - /** - * Applies the given ClassVisitor to all classes in the class pool, - * in random order. - */ - public void classesAccept(ClassVisitor classVisitor) - { - Iterator iterator = classes.values().iterator(); - while (iterator.hasNext()) - { - Clazz clazz = (Clazz)iterator.next(); - clazz.accept(classVisitor); - } - } - - - /** - * Applies the given ClassVisitor to all classes in the class pool, - * in sorted order. - */ - public void classesAcceptAlphabetically(ClassVisitor classVisitor) - { - // We're already using a tree map. - //TreeMap sortedClasses = new TreeMap(classes); - //Iterator iterator = sortedClasses.values().iterator(); - - Iterator iterator = classes.values().iterator(); - while (iterator.hasNext()) - { - Clazz clazz = (Clazz)iterator.next(); - clazz.accept(classVisitor); - } - } - - - /** - * Applies the given ClassVisitor to the class with the given name, - * if it is present in the class pool. - */ - public void classAccept(String className, ClassVisitor classVisitor) - { - Clazz clazz = getClass(className); - if (clazz != null) - { - clazz.accept(classVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Clazz.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Clazz.java deleted file mode 100644 index ed4883b1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Clazz.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.*; - - -/** - * This interface provides access to the representation of a Java class. - * - * @author Eric Lafortune - */ -public interface Clazz extends VisitorAccepter -{ - /** - * Returns the access flags of this class. - * @see ClassConstants - */ - public int getAccessFlags(); - - /** - * Returns the full internal name of this class. - */ - public String getName(); - - /** - * Returns the full internal name of the super class of this class, or - * null if this class represents java.lang.Object. - */ - public String getSuperName(); - - /** - * Returns the number of interfaces that this class implements. - */ - public int getInterfaceCount(); - - /** - * Returns the full internal name of the interface at the given index of - * this class. - */ - public String getInterfaceName(int index); - - /** - * Returns the tag value of the Constant at the specified index. - */ - public int getTag(int constantIndex); - - /** - * Returns the String value of the Utf8Constant at the specified index. - */ - public String getString(int constantIndex); - - /** - * Returns the String value of the StringConstant at the specified index. - */ - public String getStringString(int constantIndex); - - /** - * Returns the class name of ClassConstant at the specified index. - */ - public String getClassName(int constantIndex); - - /** - * Returns the name of the NameAndTypeConstant at the specified index. - */ - public String getName(int constantIndex); - - /** - * Returns the type of the NameAndTypeConstant at the specified index. - */ - public String getType(int constantIndex); - - /** - * Returns the class name of the RefConstant at the specified index. - */ - public String getRefClassName(int constantIndex); - - /** - * Returns the name of the RefConstant at the specified index. - */ - public String getRefName(int constantIndex); - - /** - * Returns the type of the RefConstant at the specified index. - */ - public String getRefType(int constantIndex); - - - // Methods pertaining to related classes. - - /** - * Notifies this Clazz that it is being subclassed by another class. - */ - public void addSubClass(Clazz clazz); - - /** - * Returns the super class of this class. - */ - public Clazz getSuperClass(); - - /** - * Returns the interface at the given index. - */ - public Clazz getInterface(int index); - - /** - * Returns whether this class extends the given class. - * A class is always considered to extend itself. - * Interfaces are considered to only extend the root Object class. - */ - public boolean extends_(Clazz clazz); - - /** - * Returns whether this class extends the specified class. - * A class is always considered to extend itself. - * Interfaces are considered to only extend the root Object class. - */ - public boolean extends_(String className); - - /** - * Returns whether this class implements the given class. - * A class is always considered to implement itself. - * Interfaces are considered to implement all their superinterfaces. - */ - public boolean extendsOrImplements(Clazz clazz); - - /** - * Returns whether this class implements the specified class. - * A class is always considered to implement itself. - * Interfaces are considered to implement all their superinterfaces. - */ - public boolean extendsOrImplements(String className); - - - // Methods for getting specific class members. - - /** - * Returns the field with the given name and descriptor. - */ - Field findField(String name, String descriptor); - - /** - * Returns the method with the given name and descriptor. - */ - Method findMethod(String name, String descriptor); - - - // Methods for accepting various types of visitors. - - /** - * Accepts the given class visitor. - */ - public void accept(ClassVisitor classVisitor); - - /** - * Accepts the given class visitor in the class hierarchy. - * @param visitThisClass specifies whether to visit this class. - * @param visitSuperClass specifies whether to visit the super classes. - * @param visitInterfaces specifies whether to visit the interfaces. - * @param visitSubclasses specifies whether to visit the subclasses. - * @param classVisitor the ClassVisitor that will - * visit the class hierarchy. - */ - public void hierarchyAccept(boolean visitThisClass, - boolean visitSuperClass, - boolean visitInterfaces, - boolean visitSubclasses, - ClassVisitor classVisitor); - - /** - * Lets the given class visitor visit all known subclasses. - * @param classVisitor the ClassVisitor that will visit the - * subclasses. - */ - public void subclassesAccept(ClassVisitor classVisitor); - - /** - * Lets the given constant pool entry visitor visit all constant pool entries - * of this class. - */ - public void constantPoolEntriesAccept(ConstantVisitor constantVisitor); - - /** - * Lets the given constant pool entry visitor visit the constant pool entry - * at the specified index. - */ - public void constantPoolEntryAccept(int index, ConstantVisitor constantVisitor); - - /** - * Lets the given constant pool entry visitor visit the class constant pool - * entry of this class. - */ - public void thisClassConstantAccept(ConstantVisitor constantVisitor); - - /** - * Lets the given constant pool entry visitor visit the class constant pool - * entry of the super class of this class, if there is one. - */ - public void superClassConstantAccept(ConstantVisitor constantVisitor); - - /** - * Lets the given constant pool entry visitor visit the class constant pool - * entries for all interfaces of this class. - */ - public void interfaceConstantsAccept(ConstantVisitor constantVisitor); - - /** - * Lets the given member info visitor visit all fields of this class. - */ - public void fieldsAccept(MemberVisitor memberVisitor); - - /** - * Lets the given member info visitor visit the specified field. - */ - public void fieldAccept(String name, String descriptor, MemberVisitor memberVisitor); - - /** - * Lets the given member info visitor visit all methods of this class. - */ - public void methodsAccept(MemberVisitor memberVisitor); - - /** - * Lets the given member info visitor visit the specified method. - */ - public void methodAccept(String name, String descriptor, MemberVisitor memberVisitor); - - /** - * Returns whether the given method may possibly have implementing or - * overriding methods down the class hierarchy. This can only be true - * if the class is not final, and the method is not private, static, or - * final, or a constructor. - * @param method the method that may have implementations. - * @return whether it may have implementations. - */ - public boolean mayHaveImplementations(Method method); - - /** - * Lets the given attribute info visitor visit all attributes of this class. - */ - public void attributesAccept(AttributeVisitor attributeVisitor); - - /** - * Lets the given attribute info visitor visit the specified attribute. - */ - public void attributeAccept(String name, AttributeVisitor attributeVisitor); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Field.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Field.java deleted file mode 100644 index 9ca10c46..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Field.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - - - -/** - * Representation of a field from a class. - * - * @author Eric Lafortune - */ -public interface Field extends Member -{ -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/JavaConstants.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/JavaConstants.java deleted file mode 100644 index ede21420..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/JavaConstants.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -/** - * Constants used in representing a Java source file (*.java). - * - * @author Eric Lafortune - */ -public interface JavaConstants -{ - public static final String JAVA_FILE_EXTENSION = ".java"; - - public static final String CLASS_VERSION_1_0 = "1.0"; - public static final String CLASS_VERSION_1_1 = "1.1"; - public static final String CLASS_VERSION_1_2 = "1.2"; - public static final String CLASS_VERSION_1_3 = "1.3"; - public static final String CLASS_VERSION_1_4 = "1.4"; - public static final String CLASS_VERSION_1_5 = "1.5"; - public static final String CLASS_VERSION_1_6 = "1.6"; - public static final String CLASS_VERSION_1_7 = "1.7"; - public static final String CLASS_VERSION_1_8 = "1.8"; - public static final String CLASS_VERSION_1_9 = "1.9"; - public static final String CLASS_VERSION_1_5_ALIAS = "5"; - public static final String CLASS_VERSION_1_6_ALIAS = "6"; - public static final String CLASS_VERSION_1_7_ALIAS = "7"; - public static final String CLASS_VERSION_1_8_ALIAS = "8"; - public static final String CLASS_VERSION_1_9_ALIAS = "9"; - public static final String CLASS_VERSION_10 = "10"; - - public static final String ACC_PUBLIC = "public"; - public static final String ACC_PRIVATE = "private"; - public static final String ACC_PROTECTED = "protected"; - public static final String ACC_STATIC = "static"; - public static final String ACC_FINAL = "final"; -// public static final String ACC_SUPER = "super"; - public static final String ACC_SYNCHRONIZED = "synchronized"; - public static final String ACC_VOLATILE = "volatile"; - public static final String ACC_TRANSIENT = "transient"; - public static final String ACC_BRIDGE = "bridge"; - public static final String ACC_VARARGS = "varargs"; - public static final String ACC_NATIVE = "native"; - public static final String ACC_INTERFACE = "interface"; - public static final String ACC_ABSTRACT = "abstract"; - public static final String ACC_STRICT = "strictfp"; - public static final String ACC_SYNTHETIC = "synthetic"; - public static final String ACC_ANNOTATION = "@"; - public static final String ACC_ENUM = "enum"; - public static final String ACC_MANDATED = "mandated"; -// public static final String ACC_CONSTRUCTOR = "constructor"; - public static final String ACC_MODULE = "module"; - public static final String ACC_OPEN = "open"; - public static final String ACC_TRANSITIVE = "transitive"; -// public static final String ACC_STATIC_PHASE = "static"; - - public static final char PACKAGE_SEPARATOR = '.'; - public static final char INNER_CLASS_SEPARATOR = '.'; - public static final char SPECIAL_CLASS_CHARACTER = '-'; - public static final char SPECIAL_MEMBER_SEPARATOR = '$'; - - public static final char METHOD_ARGUMENTS_OPEN = '('; - public static final char METHOD_ARGUMENTS_CLOSE = ')'; - public static final char METHOD_ARGUMENTS_SEPARATOR = ','; - - public static final String TYPE_JAVA_LANG_OBJECT = "java.lang.Object"; - public static final String PACKAGE_JAVA_LANG = "java.lang."; - - public static final String TYPE_VOID = "void"; - public static final String TYPE_BOOLEAN = "boolean"; - public static final String TYPE_BYTE = "byte"; - public static final String TYPE_CHAR = "char"; - public static final String TYPE_SHORT = "short"; - public static final String TYPE_INT = "int"; - public static final String TYPE_FLOAT = "float"; - public static final String TYPE_LONG = "long"; - public static final String TYPE_DOUBLE = "double"; - public static final String TYPE_ARRAY = "[]"; -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryClass.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryClass.java deleted file mode 100644 index fa81d671..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryClass.java +++ /dev/null @@ -1,553 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -/** - * This Clazz is a compact representation of the essential data in a Java class. - * - * @author Eric Lafortune - */ -public class LibraryClass implements Clazz -{ - public int u2accessFlags; - public String thisClassName; - public String superClassName; - public String[] interfaceNames; - public LibraryField[] fields; - public LibraryMethod[] methods; - - /** - * An extra field pointing to the superclass of this class. - * This field is filled out by the {@link ClassSuperHierarchyInitializer}. - */ - public Clazz superClass; - - /** - * An extra field pointing to the interfaces of this class. - * This field is filled out by the {@link ClassSuperHierarchyInitializer}. - */ - public Clazz[] interfaceClasses; - - /** - * An extra field pointing to the subclasses of this class. - * This field is filled out by the {@link ClassSubHierarchyInitializer}. - */ - public Clazz[] subClasses; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an empty LibraryClass. - */ - public LibraryClass() {} - - - /** - * Returns whether this library class is visible to the outside world. - */ - boolean isVisible() - { - return (u2accessFlags & ClassConstants.ACC_PUBLIC) != 0; - } - - - // Implementations for Clazz. - - public int getAccessFlags() - { - return u2accessFlags; - } - - public String getName() - { - return thisClassName; - } - - public String getSuperName() - { - // This may be java/lang/Object, in which case there is no super. - return superClassName; - } - - public int getInterfaceCount() - { - return interfaceClasses.length; - } - - public String getInterfaceName(int index) - { - return interfaceNames[index]; - } - - public int getTag(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - public String getString(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - public String getStringString(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - public String getClassName(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - public String getName(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - public String getType(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - - public String getRefClassName(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - public String getRefName(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - public String getRefType(int constantIndex) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); - } - - - public void addSubClass(Clazz clazz) - { - if (subClasses == null) - { - subClasses = new Clazz[1]; - } - else - { - // Copy the old elements into new larger array. - Clazz[] temp = new Clazz[subClasses.length+1]; - System.arraycopy(subClasses, 0, temp, 0, subClasses.length); - subClasses = temp; - } - - subClasses[subClasses.length-1] = clazz; - } - - - public Clazz getSuperClass() - { - return superClass; - } - - - public Clazz getInterface(int index) - { - return interfaceClasses[index]; - } - - - public boolean extends_(Clazz clazz) - { - if (this.equals(clazz)) - { - return true; - } - - return superClass != null && - superClass.extends_(clazz); - } - - - public boolean extends_(String className) - { - if (getName().equals(className)) - { - return true; - } - - return superClass != null && - superClass.extends_(className); - } - - - public boolean extendsOrImplements(Clazz clazz) - { - if (this.equals(clazz)) - { - return true; - } - - if (superClass != null && - superClass.extendsOrImplements(clazz)) - { - return true; - } - - if (interfaceClasses != null) - { - for (int index = 0; index < interfaceClasses.length; index++) - { - Clazz interfaceClass = interfaceClasses[index]; - if (interfaceClass != null && - interfaceClass.extendsOrImplements(clazz)) - { - return true; - } - } - } - - return false; - } - - - public boolean extendsOrImplements(String className) - { - if (getName().equals(className)) - { - return true; - } - - if (superClass != null && - superClass.extendsOrImplements(className)) - { - return true; - } - - if (interfaceClasses != null) - { - for (int index = 0; index < interfaceClasses.length; index++) - { - Clazz interfaceClass = interfaceClasses[index]; - if (interfaceClass != null && - interfaceClass.extendsOrImplements(className)) - { - return true; - } - } - } - - return false; - } - - - public Field findField(String name, String descriptor) - { - for (int index = 0; index < fields.length; index++) - { - Field field = fields[index]; - if (field != null && - (name == null || field.getName(this).equals(name)) && - (descriptor == null || field.getDescriptor(this).equals(descriptor))) - { - return field; - } - } - - return null; - } - - - public Method findMethod(String name, String descriptor) - { - for (int index = 0; index < methods.length; index++) - { - Method method = methods[index]; - if (method != null && - (name == null || method.getName(this).equals(name)) && - (descriptor == null || method.getDescriptor(this).equals(descriptor))) - { - return method; - } - } - - return null; - } - - - public void accept(ClassVisitor classVisitor) - { - classVisitor.visitLibraryClass(this); - } - - - public void hierarchyAccept(boolean visitThisClass, - boolean visitSuperClass, - boolean visitInterfaces, - boolean visitSubclasses, - ClassVisitor classVisitor) - { - // First visit the current classfile. - if (visitThisClass) - { - accept(classVisitor); - } - - // Then visit its superclass, recursively. - if (visitSuperClass) - { - if (superClass != null) - { - superClass.hierarchyAccept(true, - true, - visitInterfaces, - false, - classVisitor); - } - } - - // Then visit its interfaces, recursively. - if (visitInterfaces) - { - // Visit the interfaces of the superclasses, if we haven't done so yet. - if (!visitSuperClass) - { - if (superClass != null) - { - superClass.hierarchyAccept(false, - false, - true, - false, - classVisitor); - } - } - - // Visit the interfaces. - if (interfaceClasses != null) - { - for (int index = 0; index < interfaceClasses.length; index++) - { - Clazz interfaceClass = interfaceClasses[index]; - if (interfaceClass != null) - { - interfaceClass.hierarchyAccept(true, - false, - true, - false, - classVisitor); - } - } - } - } - - // Then visit its subclasses, recursively. - if (visitSubclasses) - { - if (subClasses != null) - { - for (int index = 0; index < subClasses.length; index++) - { - subClasses[index].hierarchyAccept(true, - false, - false, - true, - classVisitor); - } - } - } - } - - - /** - * Lets the given class visitor visit the superclass, if it is known. - * @param classVisitor the ClassVisitor that will visit the - * superclass. - */ - public void superClassAccept(ClassVisitor classVisitor) - { - if (superClass != null) - { - superClass.accept(classVisitor); - } - } - - - /** - * Lets the given class visitor visit all known direct interfaces. - * @param classVisitor the ClassVisitor that will visit the - * interfaces. - */ - public void interfacesAccept(ClassVisitor classVisitor) - { - if (interfaceClasses != null) - { - for (int index = 0; index < interfaceClasses.length; index++) - { - Clazz interfaceClass = interfaceClasses[index]; - if (interfaceClass != null) - { - interfaceClass.accept(classVisitor); - } - } - } - } - - - public void subclassesAccept(ClassVisitor classVisitor) - { - if (subClasses != null) - { - for (int index = 0; index < subClasses.length; index++) - { - subClasses[index].accept(classVisitor); - } - } - } - - - public void constantPoolEntriesAccept(ConstantVisitor constantVisitor) - { - // This class doesn't keep references to its constant pool entries. - } - - - public void constantPoolEntryAccept(int index, ConstantVisitor constantVisitor) - { - // This class doesn't keep references to its constant pool entries. - } - - - public void thisClassConstantAccept(ConstantVisitor constantVisitor) - { - // This class doesn't keep references to its constant pool entries. - } - - - public void superClassConstantAccept(ConstantVisitor constantVisitor) - { - // This class doesn't keep references to its constant pool entries. - } - - - public void interfaceConstantsAccept(ConstantVisitor constantVisitor) - { - // This class doesn't keep references to its constant pool entries. - } - - - public void fieldsAccept(MemberVisitor memberVisitor) - { - for (int index = 0; index < fields.length; index++) - { - Field field = fields[index]; - if (field != null) - { - field.accept(this, memberVisitor); - } - } - } - - - public void fieldAccept(String name, String descriptor, MemberVisitor memberVisitor) - { - Field field = findField(name, descriptor); - if (field != null) - { - field.accept(this, memberVisitor); - } - } - - - public void methodsAccept(MemberVisitor memberVisitor) - { - for (int index = 0; index < methods.length; index++) - { - Method method = methods[index]; - if (method != null) - { - method.accept(this, memberVisitor); - } - } - } - - - public void methodAccept(String name, String descriptor, MemberVisitor memberVisitor) - { - Method method = findMethod(name, descriptor); - if (method != null) - { - method.accept(this, memberVisitor); - } - } - - - public boolean mayHaveImplementations(Method method) - { - return - (u2accessFlags & ClassConstants.ACC_FINAL) == 0 && - (method == null || - ((method.getAccessFlags() & (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC | - ClassConstants.ACC_FINAL)) == 0 && - !method.getName(this).equals(ClassConstants.METHOD_NAME_INIT))); - } - - - public void attributesAccept(AttributeVisitor attributeVisitor) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store attributes"); - } - - - public void attributeAccept(String name, AttributeVisitor attributeVisitor) - { - throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store attributes"); - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } - - - // Implementations for Object. - - public String toString() - { - return "LibraryClass("+getName()+")"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryField.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryField.java deleted file mode 100644 index 9826b806..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryField.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.visitor.*; - -/** - * Representation of a field from a class-file. - * - * @author Eric Lafortune - */ -public class LibraryField extends LibraryMember implements Field -{ - /** - * An extra field pointing to the Clazz object referenced in the - * descriptor string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz referencedClass; - - - /** - * Creates an uninitialized LibraryField. - */ - public LibraryField() - { - } - - - /** - * Creates an initialized LibraryField. - */ - public LibraryField(int u2accessFlags, - String name, - String descriptor) - { - super(u2accessFlags, name, descriptor); - } - - - // Implementations for LibraryMember. - - public void accept(LibraryClass libraryClass, MemberVisitor memberVisitor) - { - memberVisitor.visitLibraryField(libraryClass, this); - } - - - // Implementations for Member. - - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryMember.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryMember.java deleted file mode 100644 index 84016d85..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryMember.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.visitor.MemberVisitor; - -/** - * Representation of a field or method from a library class. - * - * @author Eric Lafortune - */ -public abstract class LibraryMember implements Member -{ - public int u2accessFlags; - public String name; - public String descriptor; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized LibraryMember. - */ - protected LibraryMember() - { - } - - - /** - * Creates an initialized LibraryMember. - */ - protected LibraryMember(int u2accessFlags, - String name, - String descriptor) - { - this.u2accessFlags = u2accessFlags; - this.name = name; - this.descriptor = descriptor; - } - - - /** - * Accepts the given member info visitor. - */ - public abstract void accept(LibraryClass libraryClass, - MemberVisitor memberVisitor); - - - // Implementations for Member. - - public int getAccessFlags() - { - return u2accessFlags; - } - - public String getName(Clazz clazz) - { - return name; - } - - public String getDescriptor(Clazz clazz) - { - return descriptor; - } - - public void accept(Clazz clazz, MemberVisitor memberVisitor) - { - accept((LibraryClass)clazz, memberVisitor); - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryMethod.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryMethod.java deleted file mode 100644 index 3cb9d859..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/LibraryMethod.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.visitor.*; - -/** - * Representation of a method from a class-file. - * - * @author Eric Lafortune - */ -public class LibraryMethod extends LibraryMember implements Method -{ - /** - * An extra field containing all the classes referenced in the - * descriptor string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * The size of the array is the number of classes in the descriptor. - * Primitive types and arrays of primitive types are ignored. - * Unknown classes are represented as null values. - */ - public Clazz[] referencedClasses; - - - /** - * Creates an uninitialized LibraryMethod. - */ - public LibraryMethod() - { - } - - - /** - * Creates an initialized LibraryMethod. - */ - public LibraryMethod(int u2accessFlags, - String name, - String descriptor) - { - super(u2accessFlags, name, descriptor); - } - - - // Implementations for LibraryMember. - - public void accept(LibraryClass libraryClass, MemberVisitor memberVisitor) - { - memberVisitor.visitLibraryMethod(libraryClass, this); - } - - - // Implementations for Member. - - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - if (referencedClasses[index] != null) - { - referencedClasses[index].accept(classVisitor); - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Member.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Member.java deleted file mode 100644 index e47d0782..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Member.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.visitor.*; - -/** - * Representation of a field or method from a class. - * - * @author Eric Lafortune - */ -public interface Member extends VisitorAccepter -{ - /** - * Returns the access flags. - */ - public int getAccessFlags(); - - /** - * Returns the class member name. - */ - public String getName(Clazz clazz); - - /** - * Returns the class member's descriptor. - */ - public String getDescriptor(Clazz clazz); - - /** - * Accepts the given class visitor. - */ - public void accept(Clazz clazz, MemberVisitor memberVisitor); - - /** - * Lets the Clazz objects referenced in the descriptor string - * accept the given visitor. - */ - public void referencedClassesAccept(ClassVisitor classVisitor); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Method.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Method.java deleted file mode 100644 index 22faccbe..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/Method.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - - - -/** - * Representation of a method from a class. - * - * @author Eric Lafortune - */ -public interface Method extends Member -{ -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramClass.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramClass.java deleted file mode 100644 index d561d171..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramClass.java +++ /dev/null @@ -1,656 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.ClassSubHierarchyInitializer; -import proguard.classfile.visitor.*; - -/** - * This Clazz is a complete representation of the data in a Java class. - * - * @author Eric Lafortune - */ -public class ProgramClass implements Clazz -{ - private static final int[] EMPTY_INTERFACES = new int[0]; - private static final ProgramField[] EMPTY_FIELDS = new ProgramField[0]; - private static final ProgramMethod[] EMPTY_METHODS = new ProgramMethod[0]; - private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[0]; - - - // public int u4magic; - public int u4version; - public int u2constantPoolCount; - public Constant[] constantPool; - public int u2accessFlags; - public int u2thisClass; - public int u2superClass; - public int u2interfacesCount; - public int[] u2interfaces; - public int u2fieldsCount; - public ProgramField[] fields; - public int u2methodsCount; - public ProgramMethod[] methods; - public int u2attributesCount; - public Attribute[] attributes; - - /** - * An extra field pointing to the subclasses of this class. - * This field is filled out by the {@link ClassSubHierarchyInitializer}. - */ - public Clazz[] subClasses; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized ProgramClass. - */ - public ProgramClass() {} - - - /** - * Creates an initialized ProgramClass without fields, methods, attributes, - * or subclasses. - */ - public ProgramClass(int u4version, - int u2constantPoolCount, - Constant[] constantPool, - int u2accessFlags, - int u2thisClass, - int u2superClass) - { - this(u4version, - u2constantPoolCount, - constantPool, - u2accessFlags, - u2thisClass, - u2superClass, - 0, - EMPTY_INTERFACES, - 0, - EMPTY_FIELDS, - 0, - EMPTY_METHODS, - 0, - EMPTY_ATTRIBUTES, - null); - } - - - /** - * Creates an initialized ProgramClass. - */ - public ProgramClass(int u4version, - int u2constantPoolCount, - Constant[] constantPool, - int u2accessFlags, - int u2thisClass, - int u2superClass, - int u2interfacesCount, - int[] u2interfaces, - int u2fieldsCount, - ProgramField[] fields, - int u2methodsCount, - ProgramMethod[] methods, - int u2attributesCount, - Attribute[] attributes, - Clazz[] subClasses) - { - this.u4version = u4version; - this.u2constantPoolCount = u2constantPoolCount; - this.constantPool = constantPool; - this.u2accessFlags = u2accessFlags; - this.u2thisClass = u2thisClass; - this.u2superClass = u2superClass; - this.u2interfacesCount = u2interfacesCount; - this.u2interfaces = u2interfaces; - this.u2fieldsCount = u2fieldsCount; - this.fields = fields; - this.u2methodsCount = u2methodsCount; - this.methods = methods; - this.u2attributesCount = u2attributesCount; - this.attributes = attributes; - this.subClasses = subClasses; - } - - - /** - * Returns the Constant at the given index in the constant pool. - */ - public Constant getConstant(int constantIndex) - { - return constantPool[constantIndex]; - } - - - // Implementations for Clazz. - - public int getAccessFlags() - { - return u2accessFlags; - } - - public String getName() - { - return getClassName(u2thisClass); - } - - public String getSuperName() - { - return u2superClass == 0 ? null : getClassName(u2superClass); - } - - public int getInterfaceCount() - { - return u2interfacesCount; - } - - public String getInterfaceName(int index) - { - return getClassName(u2interfaces[index]); - } - - public int getTag(int constantIndex) - { - return constantPool[constantIndex].getTag(); - } - - public String getString(int constantIndex) - { - try - { - return ((Utf8Constant)constantPool[constantIndex]).getString(); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected Utf8Constant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex)); - } - } - - public String getStringString(int constantIndex) - { - try - { - return ((StringConstant)constantPool[constantIndex]).getString(this); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected StringConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex)); - } - } - - public String getClassName(int constantIndex) - { - try - { - return ((ClassConstant)constantPool[constantIndex]).getName(this); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected ClassConstant at index ["+constantIndex+"]").initCause(ex)); - } - } - - public String getName(int constantIndex) - { - try - { - return ((NameAndTypeConstant)constantPool[constantIndex]).getName(this); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected NameAndTypeConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex)); - } - } - - public String getType(int constantIndex) - { - try - { - return ((NameAndTypeConstant)constantPool[constantIndex]).getType(this); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected NameAndTypeConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex)); - } - } - - - public String getRefClassName(int constantIndex) - { - try - { - return ((RefConstant)constantPool[constantIndex]).getClassName(this); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected RefConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex)); - } - } - - public String getRefName(int constantIndex) - { - try - { - return ((RefConstant)constantPool[constantIndex]).getName(this); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected RefConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex)); - } - } - - public String getRefType(int constantIndex) - { - try - { - return ((RefConstant)constantPool[constantIndex]).getType(this); - } - catch (ClassCastException ex) - { - throw ((IllegalStateException)new IllegalStateException("Expected RefConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex)); - } - } - - - public void addSubClass(Clazz clazz) - { - if (subClasses == null) - { - subClasses = new Clazz[1]; - } - else - { - // Copy the old elements into new larger array. - Clazz[] newSubClasses = new Clazz[subClasses.length+1]; - System.arraycopy(subClasses, 0, newSubClasses, 0, subClasses.length); - subClasses = newSubClasses; - } - - subClasses[subClasses.length-1] = clazz; - } - - - public Clazz getSuperClass() - { - return u2superClass != 0 ? - ((ClassConstant)constantPool[u2superClass]).referencedClass : - null; - } - - - public Clazz getInterface(int index) - { - return ((ClassConstant)constantPool[u2interfaces[index]]).referencedClass; - } - - - public boolean extends_(Clazz clazz) - { - if (this.equals(clazz)) - { - return true; - } - - Clazz superClass = getSuperClass(); - return superClass != null && - superClass.extends_(clazz); - } - - - public boolean extends_(String className) - { - if (getName().equals(className)) - { - return true; - } - - Clazz superClass = getSuperClass(); - return superClass != null && - superClass.extends_(className); - } - - - public boolean extendsOrImplements(Clazz clazz) - { - if (this.equals(clazz)) - { - return true; - } - - Clazz superClass = getSuperClass(); - if (superClass != null && - superClass.extendsOrImplements(clazz)) - { - return true; - } - - for (int index = 0; index < u2interfacesCount; index++) - { - Clazz interfaceClass = getInterface(index); - if (interfaceClass != null && - interfaceClass.extendsOrImplements(clazz)) - { - return true; - } - } - - return false; - } - - - public boolean extendsOrImplements(String className) - { - if (getName().equals(className)) - { - return true; - } - - Clazz superClass = getSuperClass(); - if (superClass != null && - superClass.extendsOrImplements(className)) - { - return true; - } - - for (int index = 0; index < u2interfacesCount; index++) - { - Clazz interfaceClass = getInterface(index); - if (interfaceClass != null && - interfaceClass.extendsOrImplements(className)) - { - return true; - } - } - - return false; - } - - - public Field findField(String name, String descriptor) - { - for (int index = 0; index < u2fieldsCount; index++) - { - Field field = fields[index]; - if ((name == null || field.getName(this).equals(name)) && - (descriptor == null || field.getDescriptor(this).equals(descriptor))) - { - return field; - } - } - - return null; - } - - - public Method findMethod(String name, String descriptor) - { - for (int index = 0; index < u2methodsCount; index++) - { - Method method = methods[index]; - if ((name == null || method.getName(this).equals(name)) && - (descriptor == null || method.getDescriptor(this).equals(descriptor))) - { - return method; - } - } - - return null; - } - - - public void accept(ClassVisitor classVisitor) - { - classVisitor.visitProgramClass(this); - } - - - public void hierarchyAccept(boolean visitThisClass, - boolean visitSuperClass, - boolean visitInterfaces, - boolean visitSubclasses, - ClassVisitor classVisitor) - { - // First visit the current classfile. - if (visitThisClass) - { - accept(classVisitor); - } - - // Then visit its superclass, recursively. - if (visitSuperClass) - { - Clazz superClass = getSuperClass(); - if (superClass != null) - { - superClass.hierarchyAccept(true, - true, - visitInterfaces, - false, - classVisitor); - } - } - - // Then visit its interfaces, recursively. - if (visitInterfaces) - { - // Visit the interfaces of the superclasses, if we haven't done so yet. - if (!visitSuperClass) - { - Clazz superClass = getSuperClass(); - if (superClass != null) - { - superClass.hierarchyAccept(false, - false, - true, - false, - classVisitor); - } - } - - // Visit the interfaces. - for (int index = 0; index < u2interfacesCount; index++) - { - Clazz interfaceClass = getInterface(index); - if (interfaceClass != null) - { - interfaceClass.hierarchyAccept(true, - false, - true, - false, - classVisitor); - } - } - } - - // Then visit its subclasses, recursively. - if (visitSubclasses) - { - if (subClasses != null) - { - for (int index = 0; index < subClasses.length; index++) - { - Clazz subClass = subClasses[index]; - subClass.hierarchyAccept(true, - false, - false, - true, - classVisitor); - } - } - } - } - - - public void subclassesAccept(ClassVisitor classVisitor) - { - if (subClasses != null) - { - for (int index = 0; index < subClasses.length; index++) - { - subClasses[index].accept(classVisitor); - } - } - } - - - public void constantPoolEntriesAccept(ConstantVisitor constantVisitor) - { - for (int index = 1; index < u2constantPoolCount; index++) - { - if (constantPool[index] != null) - { - constantPool[index].accept(this, constantVisitor); - } - } - } - - - public void constantPoolEntryAccept(int index, ConstantVisitor constantVisitor) - { - constantPool[index].accept(this, constantVisitor); - } - - - public void thisClassConstantAccept(ConstantVisitor constantVisitor) - { - constantPool[u2thisClass].accept(this, constantVisitor); - } - - - public void superClassConstantAccept(ConstantVisitor constantVisitor) - { - if (u2superClass != 0) - { - constantPool[u2superClass].accept(this, constantVisitor); - } - } - - - public void interfaceConstantsAccept(ConstantVisitor constantVisitor) - { - for (int index = 0; index < u2interfacesCount; index++) - { - constantPool[u2interfaces[index]].accept(this, constantVisitor); - } - } - - - public void fieldsAccept(MemberVisitor memberVisitor) - { - for (int index = 0; index < u2fieldsCount; index++) - { - fields[index].accept(this, memberVisitor); - } - } - - - public void fieldAccept(String name, String descriptor, MemberVisitor memberVisitor) - { - Field field = findField(name, descriptor); - if (field != null) - { - field.accept(this, memberVisitor); - } - } - - - public void methodsAccept(MemberVisitor memberVisitor) - { - for (int index = 0; index < u2methodsCount; index++) - { - methods[index].accept(this, memberVisitor); - } - } - - - public void methodAccept(String name, String descriptor, MemberVisitor memberVisitor) - { - Method method = findMethod(name, descriptor); - if (method != null) - { - method.accept(this, memberVisitor); - } - } - - - public boolean mayHaveImplementations(Method method) - { - return - (u2accessFlags & ClassConstants.ACC_FINAL) == 0 && - (method == null || - ((method.getAccessFlags() & (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC | - ClassConstants.ACC_FINAL)) == 0 && - !method.getName(this).equals(ClassConstants.METHOD_NAME_INIT))); - } - - - public void attributesAccept(AttributeVisitor attributeVisitor) - { - for (int index = 0; index < u2attributesCount; index++) - { - attributes[index].accept(this, attributeVisitor); - } - } - - - public void attributeAccept(String name, AttributeVisitor attributeVisitor) - { - for (int index = 0; index < u2attributesCount; index++) - { - Attribute attribute = attributes[index]; - if (attribute.getAttributeName(this).equals(name)) - { - attribute.accept(this, attributeVisitor); - } - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } - - - // Implementations for Object. - - public String toString() - { - return "ProgramClass("+getName()+")"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramField.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramField.java deleted file mode 100644 index 940314d1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramField.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.visitor.*; - -/** - * Representation of a field from a program class. - * - * @author Eric Lafortune - */ -public class ProgramField extends ProgramMember implements Field -{ - private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[0]; - - - /** - * An extra field pointing to the Clazz object referenced in the - * descriptor string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz referencedClass; - - - /** - * Creates an uninitialized ProgramField. - */ - public ProgramField() - { - } - - - /** - * Creates an initialized ProgramField without attributes. - */ - public ProgramField(int u2accessFlags, - int u2nameIndex, - int u2descriptorIndex, - Clazz referencedClass) - { - this(u2accessFlags, - u2nameIndex, - u2descriptorIndex, - 0, - EMPTY_ATTRIBUTES, - referencedClass); - } - - - /** - * Creates an initialized ProgramField. - */ - public ProgramField(int u2accessFlags, - int u2nameIndex, - int u2descriptorIndex, - int u2attributesCount, - Attribute[] attributes, - Clazz referencedClass) - { - super(u2accessFlags, u2nameIndex, u2descriptorIndex, u2attributesCount, attributes); - - this.referencedClass = referencedClass; - } - - - // Implementations for ProgramMember. - - public void accept(ProgramClass programClass, MemberVisitor memberVisitor) - { - memberVisitor.visitProgramField(programClass, this); - } - - - public void attributesAccept(ProgramClass programClass, AttributeVisitor attributeVisitor) - { - for (int index = 0; index < u2attributesCount; index++) - { - attributes[index].accept(programClass, this, attributeVisitor); - } - } - - - // Implementations for Member. - - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramMember.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramMember.java deleted file mode 100644 index 1a0d9f87..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramMember.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - - -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * Representation of a field or method from a program class. - * - * @author Eric Lafortune - */ -public abstract class ProgramMember implements Member -{ - public int u2accessFlags; - public int u2nameIndex; - public int u2descriptorIndex; - public int u2attributesCount; - public Attribute[] attributes; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized ProgramMember. - */ - protected ProgramMember() - { - } - - - /** - * Creates an initialized ProgramMember. - */ - protected ProgramMember(int u2accessFlags, - int u2nameIndex, - int u2descriptorIndex, - int u2attributesCount, - Attribute[] attributes) - { - this.u2accessFlags = u2accessFlags; - this.u2nameIndex = u2nameIndex; - this.u2descriptorIndex = u2descriptorIndex; - this.u2attributesCount = u2attributesCount; - this.attributes = attributes; - } - - - /** - * Returns the (first) attribute with the given name. - */ - private Attribute getAttribute(Clazz clazz, String name) - { - for (int index = 0; index < u2attributesCount; index++) - { - Attribute attribute = attributes[index]; - if (attribute.getAttributeName(clazz).equals(name)) - { - return attribute; - } - } - - return null; - } - - - /** - * Accepts the given member info visitor. - */ - public abstract void accept(ProgramClass programClass, - MemberVisitor memberVisitor); - - - - /** - * Lets the given attribute info visitor visit all the attributes of - * this member info. - */ - public abstract void attributesAccept(ProgramClass programClass, - AttributeVisitor attributeVisitor); - - - // Implementations for Member. - - public int getAccessFlags() - { - return u2accessFlags; - } - - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - public String getDescriptor(Clazz clazz) - { - return clazz.getString(u2descriptorIndex); - } - - public void accept(Clazz clazz, MemberVisitor memberVisitor) - { - accept((ProgramClass)clazz, memberVisitor); - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramMethod.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramMethod.java deleted file mode 100644 index 8a9a529d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/ProgramMethod.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.visitor.*; - -/** - * Representation of a method from a program class. - * - * @author Eric Lafortune - */ -public class ProgramMethod extends ProgramMember implements Method -{ - private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[0]; - - - /** - * An extra field containing all the classes referenced in the - * descriptor string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * The size of the array is the number of classes in the descriptor. - * Primitive types and arrays of primitive types are ignored. - * Unknown classes are represented as null values. - */ - public Clazz[] referencedClasses; - - - /** - * Creates an uninitialized ProgramMethod. - */ - public ProgramMethod() - { - } - - - /** - * Creates an initialized ProgramMethod without attributes. - */ - public ProgramMethod(int u2accessFlags, - int u2nameIndex, - int u2descriptorIndex, - Clazz[] referencedClasses) - { - this(u2accessFlags, - u2nameIndex, - u2descriptorIndex, - 0, - EMPTY_ATTRIBUTES, - referencedClasses); - } - - - /** - * Creates an initialized ProgramMethod. - */ - public ProgramMethod(int u2accessFlags, - int u2nameIndex, - int u2descriptorIndex, - int u2attributesCount, - Attribute[] attributes, - Clazz[] referencedClasses) - { - super(u2accessFlags, u2nameIndex, u2descriptorIndex, u2attributesCount, attributes); - - this.referencedClasses = referencedClasses; - } - - - // Implementations for ProgramMember. - - public void accept(ProgramClass programClass, MemberVisitor memberVisitor) - { - memberVisitor.visitProgramMethod(programClass, this); - } - - - public void attributesAccept(ProgramClass programClass, AttributeVisitor attributeVisitor) - { - for (int index = 0; index < u2attributesCount; index++) - { - attributes[index].accept(programClass, this, attributeVisitor); - } - } - - - // Implementations for Member. - - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - if (referencedClasses[index] != null) - { - referencedClasses[index].accept(classVisitor); - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/VisitorAccepter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/VisitorAccepter.java deleted file mode 100644 index f4f1efbc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/VisitorAccepter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile; - - - - -/** - * This interface is a base interface for visitor accepters. It allows - * visitors to set and get any temporary information they desire on the - * objects they are visiting. Note that every visitor accepter has only one - * such property, so visitors will have to take care not to overwrite each - * other's information, if it is still required. - * - * @author Eric Lafortune - */ -public interface VisitorAccepter -{ - /** - * Gets the visitor information of the visitor accepter. - */ - public Object getVisitorInfo(); - - - /** - * Sets the visitor information of the visitor accepter. - */ - public void setVisitorInfo(Object visitorInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/Attribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/Attribute.java deleted file mode 100644 index fe0ee5d7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/Attribute.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This abstract class represents an attribute that is attached to a class, - * a class member, or a code attribute. Specific types of attributes are - * subclassed from it. - * - * @author Eric Lafortune - * @noinspection AbstractClassWithoutAbstractMethods - */ -public abstract class Attribute implements VisitorAccepter -{ - public int u2attributeNameIndex; - //public int u4attributeLength; - //public byte info[]; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Create an uninitialized Attribute. - */ - protected Attribute() - { - } - - - /** - * Create an initialized Attribute. - */ - protected Attribute(int u2attributeNameIndex) - { - this.u2attributeNameIndex = u2attributeNameIndex; - } - - - /** - * Returns the String name of the attribute. - */ - public String getAttributeName(Clazz clazz) - { - return clazz.getString(u2attributeNameIndex); - } - - - // Methods to be implemented by extensions, if applicable. - - /** - * Accepts the given visitor. - */ - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - /** - * Accepts the given visitor in the context of the given field. - */ - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - // Delegate to the default invocation if the field is null anyway. - if (field == null) - { - accept(clazz, attributeVisitor); - } - else - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - } - - /** - * Accepts the given visitor in the context of the given method. - */ - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - // Delegate to the default invocation if the method is null anyway. - if (method == null) - { - accept(clazz, (Field)null, attributeVisitor); - } - else - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - } - - /** - * Accepts the given visitor in the context of the given code attribute. - */ - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - // Delegate to the default invocation if the code attribute is null - // anyway. - if (codeAttribute == null) - { - accept(clazz, method, attributeVisitor); - } - else - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/BootstrapMethodInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/BootstrapMethodInfo.java deleted file mode 100644 index 0e1803dc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/BootstrapMethodInfo.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * Representation of a bootstrap method. - * - * @author Eric Lafortune - */ -public class BootstrapMethodInfo implements VisitorAccepter -{ - public int u2methodHandleIndex; - public int u2methodArgumentCount; - public int[] u2methodArguments; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized BootstrapMethodInfo. - */ - public BootstrapMethodInfo() - { - } - - - /** - * Creates an initialized BootstrapMethodInfo. - */ - public BootstrapMethodInfo(int u2methodHandleIndex, - int u2methodArgumentCount, - int[] u2methodArguments) - { - this.u2methodHandleIndex = u2methodHandleIndex; - this.u2methodArgumentCount = u2methodArgumentCount; - this.u2methodArguments = u2methodArguments; - } - - - /** - * Applies the given constant pool visitor to the argument constants of the - * bootstrap method. - */ - public void methodArgumentsAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - for (int index = 0; index < u2methodArgumentCount; index++) - { - clazz.constantPoolEntryAccept(u2methodArguments[index], - constantVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/BootstrapMethodsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/BootstrapMethodsAttribute.java deleted file mode 100644 index 4e62455c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/BootstrapMethodsAttribute.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.visitor.*; - -/** - * This Attribute represents a bootstrap methods attribute. - * - * @author Eric Lafortune - */ -public class BootstrapMethodsAttribute extends Attribute -{ - public int u2bootstrapMethodsCount; - public BootstrapMethodInfo[] bootstrapMethods; - - - /** - * Creates an uninitialized BootstrapMethodsAttribute. - */ - public BootstrapMethodsAttribute() - { - } - - - /** - * Creates an initialized BootstrapMethodsAttribute. - */ - public BootstrapMethodsAttribute(int u2attributeNameIndex, - int u2bootstrapMethodsCount, - BootstrapMethodInfo[] bootstrapMethods) - { - super(u2attributeNameIndex); - - this.u2bootstrapMethodsCount = u2bootstrapMethodsCount; - this.bootstrapMethods = bootstrapMethods; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitBootstrapMethodsAttribute(clazz, this); - } - - - /** - * Applies the given visitor to all bootstrap method info entries. - */ - public void bootstrapMethodEntriesAccept(Clazz clazz, BootstrapMethodInfoVisitor bootstrapMethodInfoVisitor) - { - for (int index = 0; index < u2bootstrapMethodsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of BootstrapMethodInfo. - bootstrapMethodInfoVisitor.visitBootstrapMethodInfo(clazz, bootstrapMethods[index]); - } - } - - - /** - * Applies the given visitor to the specified bootstrap method info - * entry. - */ - public void bootstrapMethodEntryAccept(Clazz clazz, - int bootstrapMethodIndex, - BootstrapMethodInfoVisitor bootstrapMethodInfoVisitor) - { - // We don't need double dispatching here, since there is only one - // type of BootstrapMethodInfo. - bootstrapMethodInfoVisitor.visitBootstrapMethodInfo(clazz, bootstrapMethods[bootstrapMethodIndex]); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/CodeAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/CodeAttribute.java deleted file mode 100644 index 970d0b73..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/CodeAttribute.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -/** - * This Attribute represents a code attribute. - * - * @author Eric Lafortune - */ -public class CodeAttribute extends Attribute -{ - private static final byte[] EMPTY_CODE = new byte[0]; - private static final ExceptionInfo[] EMPTY_EXCEPTION_TABLE = new ExceptionInfo[0]; - private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[0]; - - - public int u2maxStack; - public int u2maxLocals; - public int u4codeLength; - public byte[] code; - public int u2exceptionTableLength; - public ExceptionInfo[] exceptionTable; - public int u2attributesCount; - public Attribute[] attributes; - - - /** - * Creates an uninitialized CodeAttribute. - */ - public CodeAttribute() - { - } - - - /** - * Creates a partially initialized CodeAttribute without code, exceptions, - * or attributes. - */ - public CodeAttribute(int u2attributeNameIndex) - { - this(u2attributeNameIndex, - 0, - 0, - 0, - EMPTY_CODE); - } - - - /** - * Creates an initialized CodeAttribute without exceptions or attributes. - */ - public CodeAttribute(int u2attributeNameIndex, - int u2maxStack, - int u2maxLocals, - int u4codeLength, - byte[] code) - { - this(u2attributeNameIndex, - u2maxStack, - u2maxLocals, - u4codeLength, - code, - 0, - EMPTY_EXCEPTION_TABLE, - 0, - EMPTY_ATTRIBUTES); - } - - - /** - * Creates an initialized CodeAttribute. - */ - public CodeAttribute(int u2attributeNameIndex, - int u2maxStack, - int u2maxLocals, - int u4codeLength, - byte[] code, - int u2exceptionTableLength, - ExceptionInfo[] exceptionTable, - int u2attributesCount, - Attribute[] attributes) - { - super(u2attributeNameIndex); - - this.u2maxStack = u2maxStack; - this.u2maxLocals = u2maxLocals; - this.u4codeLength = u4codeLength; - this.code = code; - this.u2exceptionTableLength = u2exceptionTableLength; - this.exceptionTable = exceptionTable; - this.u2attributesCount = u2attributesCount; - this.attributes = attributes; - } - - - /** - * Returns the (first) attribute with the given name. - */ - public Attribute getAttribute(Clazz clazz, String name) - { - for (int index = 0; index < u2attributesCount; index++) - { - Attribute attribute = attributes[index]; - if (attribute.getAttributeName(clazz).equals(name)) - { - return attribute; - } - } - - return null; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitCodeAttribute(clazz, method, this); - } - - - /** - * Applies the given instruction visitor to all instructions. - */ - public void instructionsAccept(Clazz clazz, Method method, InstructionVisitor instructionVisitor) - { - instructionsAccept(clazz, method, 0, u4codeLength, instructionVisitor); - } - - - /** - * Applies the given instruction visitor to the instruction at the specified - * offset. - */ - public void instructionAccept(Clazz clazz, Method method, int offset, InstructionVisitor instructionVisitor) - { - Instruction instruction = InstructionFactory.create(code, offset); - instruction.accept(clazz, method, this, offset, instructionVisitor); - } - - - /** - * Applies the given instruction visitor to all instructions in the - * specified range of offsets. - */ - public void instructionsAccept(Clazz clazz, Method method, int startOffset, int endOffset, InstructionVisitor instructionVisitor) - { - int offset = startOffset; - - while (offset < endOffset) - { - // Note that the instruction is only volatile. - Instruction instruction = InstructionFactory.create(code, offset); - int instructionLength = instruction.length(offset); - instruction.accept(clazz, method, this, offset, instructionVisitor); - offset += instructionLength; - } - } - - - /** - * Applies the given exception visitor to all exceptions. - */ - public void exceptionsAccept(Clazz clazz, Method method, ExceptionInfoVisitor exceptionInfoVisitor) - { - for (int index = 0; index < u2exceptionTableLength; index++) - { - // We don't need double dispatching here, since there is only one - // type of ExceptionInfo. - exceptionInfoVisitor.visitExceptionInfo(clazz, method, this, exceptionTable[index]); - } - } - - - /** - * Applies the given exception visitor to all exceptions that are applicable - * to the instruction at the specified offset. - */ - public void exceptionsAccept(Clazz clazz, Method method, int offset, ExceptionInfoVisitor exceptionInfoVisitor) - { - for (int index = 0; index < u2exceptionTableLength; index++) - { - ExceptionInfo exceptionInfo = exceptionTable[index]; - if (exceptionInfo.isApplicable(offset)) - { - exceptionInfoVisitor.visitExceptionInfo(clazz, method, this, exceptionInfo); - } - } - } - - - /** - * Applies the given exception visitor to all exceptions that are applicable - * to any of the instructions in the specified range of offsets. - */ - public void exceptionsAccept(Clazz clazz, Method method, int startOffset, int endOffset, ExceptionInfoVisitor exceptionInfoVisitor) - { - for (int index = 0; index < u2exceptionTableLength; index++) - { - ExceptionInfo exceptionInfo = exceptionTable[index]; - if (exceptionInfo.isApplicable(startOffset, endOffset)) - { - exceptionInfoVisitor.visitExceptionInfo(clazz, method, this, exceptionInfo); - } - } - } - - - /** - * Applies the given attribute visitor to all attributes. - */ - public void attributesAccept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - for (int index = 0; index < u2attributesCount; index++) - { - attributes[index].accept(clazz, method, this, attributeVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ConstantValueAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ConstantValueAttribute.java deleted file mode 100644 index 66fa84aa..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ConstantValueAttribute.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a constant value attribute. - * - * @author Eric Lafortune - */ -public class ConstantValueAttribute extends Attribute -{ - public int u2constantValueIndex; - - - /** - * Creates an uninitialized ConstantValueAttribute. - */ - public ConstantValueAttribute() - { - } - - - /** - * Creates an initialized ConstantValueAttribute. - */ - public ConstantValueAttribute(int u2attributeNameIndex, - int u2constantValueIndex) - { - super(u2attributeNameIndex); - - this.u2constantValueIndex = u2constantValueIndex; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitConstantValueAttribute(clazz, field, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/DeprecatedAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/DeprecatedAttribute.java deleted file mode 100644 index 326a7e59..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/DeprecatedAttribute.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a deprecated attribute. - * - * @author Eric Lafortune - */ -public class DeprecatedAttribute extends Attribute -{ - /** - * Creates an uninitialized DeprecatedAttribute. - */ - public DeprecatedAttribute() - { - } - - - /** - * Creates an initialized DeprecatedAttribute. - */ - public DeprecatedAttribute(int u2attributeNameIndex) - { - super(u2attributeNameIndex); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitDeprecatedAttribute(clazz, this); - } - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitDeprecatedAttribute(clazz, field, this); - } - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitDeprecatedAttribute(clazz, method, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/EnclosingMethodAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/EnclosingMethodAttribute.java deleted file mode 100644 index 75c0e76d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/EnclosingMethodAttribute.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.visitor.*; - -/** - * This Attribute represents an enclosing method attribute. - * - * @author Eric Lafortune - */ -public class EnclosingMethodAttribute extends Attribute -{ - public int u2classIndex; - public int u2nameAndTypeIndex; - - /** - * An extra field pointing to the referenced Clazz object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - */ - public Clazz referencedClass; - - /** - * An extra field optionally pointing to the referenced Method object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - */ - public Method referencedMethod; - - - /** - * Creates an uninitialized EnclosingMethodAttribute. - */ - public EnclosingMethodAttribute() - { - } - - - /** - * Creates an initialized EnclosingMethodAttribute. - */ - public EnclosingMethodAttribute(int u2attributeNameIndex, - int u2classIndex, - int u2nameAndTypeIndex) - { - super(u2attributeNameIndex); - - this.u2classIndex = u2classIndex; - this.u2nameAndTypeIndex = u2nameAndTypeIndex; - } - - - /** - * Returns the class name. - */ - public String getClassName(Clazz clazz) - { - return clazz.getClassName(u2classIndex); - } - - /** - * Returns the method/field name. - */ - public String getName(Clazz clazz) - { - return clazz.getName(u2nameAndTypeIndex); - } - - /** - * Returns the type. - */ - public String getType(Clazz clazz) - { - return clazz.getType(u2nameAndTypeIndex); - } - - - /** - * Lets the referenced class accept the given visitor. - */ - public void referencedClassAccept(ClassVisitor classVisitor) - { - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - - - /** - * Lets the referenced class member accept the given visitor. - */ - public void referencedMethodAccept(MemberVisitor memberVisitor) - { - if (referencedMethod != null) - { - referencedMethod.accept(referencedClass, - memberVisitor); - } - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitEnclosingMethodAttribute(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExceptionInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExceptionInfo.java deleted file mode 100644 index d0550b78..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExceptionInfo.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.VisitorAccepter; - -/** - * Representation of an Exception table entry. - * - * @author Eric Lafortune - */ -public class ExceptionInfo implements VisitorAccepter -{ - public int u2startPC; - public int u2endPC; - public int u2handlerPC; - public int u2catchType; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized ExceptionInfo. - */ - public ExceptionInfo() - { - } - - - /** - * Creates an initialized ExceptionInfo. - */ - public ExceptionInfo(int u2startPC, - int u2endPC, - int u2handlerPC, - int u2catchType) - { - this.u2startPC = u2startPC; - this.u2endPC = u2endPC; - this.u2handlerPC = u2handlerPC; - this.u2catchType = u2catchType; - } - - - /** - * Returns whether the exception's try block contains the instruction at the - * given offset. - */ - public boolean isApplicable(int instructionOffset) - { - return instructionOffset >= u2startPC && - instructionOffset < u2endPC; - } - - - /** - * Returns whether the exception's try block overlaps with the specified - * block of instructions. - */ - public boolean isApplicable(int startOffset, int endOffset) - { - return u2startPC < endOffset && - u2endPC > startOffset; - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExceptionsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExceptionsAttribute.java deleted file mode 100644 index e2487ee5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExceptionsAttribute.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Attribute represents an exceptions attribute. - * - * @author Eric Lafortune - */ -public class ExceptionsAttribute extends Attribute -{ - public int u2exceptionIndexTableLength; - public int[] u2exceptionIndexTable; - - - /** - * Creates an uninitialized ExceptionsAttribute. - */ - public ExceptionsAttribute() - { - } - - - /** - * Creates an initialized ExceptionsAttribute. - */ - public ExceptionsAttribute(int u2attributeNameIndex, - int u2exceptionIndexTableLength, - int[] u2exceptionIndexTable) - { - super(u2attributeNameIndex); - - this.u2exceptionIndexTableLength = u2exceptionIndexTableLength; - this.u2exceptionIndexTable = u2exceptionIndexTable; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitExceptionsAttribute(clazz, method, this); - } - - - /** - * Applies the given constant pool visitor to all exception class pool info - * entries. - */ - public void exceptionEntriesAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - for (int index = 0; index < u2exceptionIndexTableLength; index++) - { - clazz.constantPoolEntryAccept(u2exceptionIndexTable[index], - constantVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExtendedLineNumberInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExtendedLineNumberInfo.java deleted file mode 100644 index ff902ecf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ExtendedLineNumberInfo.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -/** - * This line number table entry contains additional information about its - * source. This information can not be represented in class files, but it - * can be used internally to represent lines in inlined or merged code. - * - * @author Eric Lafortune - */ -public class ExtendedLineNumberInfo -extends LineNumberInfo -{ - public String source; - - - /** - * Creates an uninitialized ExtendedLineNumberInfo. - */ - public ExtendedLineNumberInfo() - { - } - - - /** - * Creates an initialized ExtendedLineNumberInfo. - */ - public ExtendedLineNumberInfo(int u2startPC, - int u2lineNumber, - String source) - { - super(u2startPC, u2lineNumber); - - this.source = source; - } - - - // Implementations for LineNumberInfo. - - public String getSource() - { - return source; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/InnerClassesAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/InnerClassesAttribute.java deleted file mode 100644 index eb493de0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/InnerClassesAttribute.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.visitor.*; - -/** - * This Attribute represents an inner classes attribute. - * - * @author Eric Lafortune - */ -public class InnerClassesAttribute extends Attribute -{ - public int u2classesCount; - public InnerClassesInfo[] classes; - - - /** - * Creates an uninitialized InnerClassesAttribute. - */ - public InnerClassesAttribute() - { - } - - - /** - * Creates an initialized InnerClassesAttribute. - */ - public InnerClassesAttribute(int u2attributeNameIndex, - int u2classesCount, - InnerClassesInfo[] classes) - { - super(u2attributeNameIndex); - - this.u2classesCount = u2classesCount; - this.classes = classes; - } - - // - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitInnerClassesAttribute(clazz, this); - } - - - /** - * Applies the given visitor to all inner classes. - */ - public void innerClassEntriesAccept(Clazz clazz, InnerClassesInfoVisitor innerClassesInfoVisitor) - { - for (int index = 0; index < u2classesCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of InnerClassesInfo. - innerClassesInfoVisitor.visitInnerClassesInfo(clazz, classes[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/InnerClassesInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/InnerClassesInfo.java deleted file mode 100644 index 10a8f32e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/InnerClassesInfo.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * Representation of an Inner Classes table entry. - * - * @author Eric Lafortune - */ -public class InnerClassesInfo implements VisitorAccepter -{ - public int u2innerClassIndex; - public int u2outerClassIndex; - public int u2innerNameIndex; - public int u2innerClassAccessFlags; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Applies the given constant pool visitor to the class constant of the - * inner class, if any. - */ - public void innerClassConstantAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2innerClassIndex != 0) - { - clazz.constantPoolEntryAccept(u2innerClassIndex, constantVisitor); - } - } - - - /** - * Applies the given constant pool visitor to the class constant of the - * outer class, if any. - */ - public void outerClassConstantAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2outerClassIndex != 0) - { - clazz.constantPoolEntryAccept(u2outerClassIndex, constantVisitor); - } - } - - - /** - * Applies the given constant pool visitor to the Utf8 constant of the - * inner name, if any. - */ - public void innerNameConstantAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2innerNameIndex != 0) - { - clazz.constantPoolEntryAccept(u2innerNameIndex, constantVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LineNumberInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LineNumberInfo.java deleted file mode 100644 index 0d6786bd..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LineNumberInfo.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -/** - * Representation of an Line Number table entry. - * - * @author Eric Lafortune - */ -public class LineNumberInfo -{ - public int u2startPC; - public int u2lineNumber; - - - /** - * Creates an uninitialized LineNumberInfo. - */ - public LineNumberInfo() - { - } - - - /** - * Creates an initialized LineNumberInfo. - */ - public LineNumberInfo(int u2startPC, int u2lineNumber) - { - this.u2startPC = u2startPC; - this.u2lineNumber = u2lineNumber; - } - - - /** - * Returns a description of the source of the line, if known, or null - * otherwise. Standard line number entries don't contain information - * about their source; it is assumed to be the same source file. - */ - public String getSource() - { - return null; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LineNumberTableAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LineNumberTableAttribute.java deleted file mode 100644 index 99b538ff..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LineNumberTableAttribute.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; - -/** - * This Attribute represents a line number table attribute. - * - * @author Eric Lafortune - */ -public class LineNumberTableAttribute extends Attribute -{ - public int u2lineNumberTableLength; - public LineNumberInfo[] lineNumberTable; - - - /** - * Creates an uninitialized LineNumberTableAttribute. - */ - public LineNumberTableAttribute() - { - } - - - /** - * Creates an initialized LineNumberTableAttribute. - */ - public LineNumberTableAttribute(int u2attributeNameIndex, - int u2lineNumberTableLength, - LineNumberInfo[] lineNumberTable) - { - super(u2attributeNameIndex); - - this.u2lineNumberTableLength = u2lineNumberTableLength; - this.lineNumberTable = lineNumberTable; - } - - - /** - * Returns the line number corresponding to the given byte code program - * counter. - */ - public int getLineNumber(int pc) - { - LineNumberInfo info = getLineNumberInfo(pc); - - return info == null ? 0 : info.u2lineNumber; - } - - - /** - * Returns the source corresponding to the given byte code program - * counter. - */ - public String getSource(int pc) - { - LineNumberInfo info = getLineNumberInfo(pc); - - return info == null ? null : info.getSource(); - } - - - /** - * Returns the line number info corresponding to the given byte code - * program counter. - */ - public LineNumberInfo getLineNumberInfo(int pc) - { - for (int index = u2lineNumberTableLength-1; index >= 0; index--) - { - LineNumberInfo info = lineNumberTable[index]; - if (pc >= info.u2startPC) - { - return info; - } - } - - return u2lineNumberTableLength > 0 ? - lineNumberTable[0] : - null; - } - - - /** - * Returns the lowest line number with the default null source, - * or 0 if there aren't any such line numbers. - */ - public int getLowestLineNumber() - { - int lowestLineNumber = Integer.MAX_VALUE; - - for (int index = 0; index < u2lineNumberTableLength; index++) - { - LineNumberInfo info = lineNumberTable[index]; - if (info.getSource() == null) - { - int lineNumber = info.u2lineNumber; - if (lineNumber < lowestLineNumber) - { - lowestLineNumber = lineNumber; - } - } - } - - return lowestLineNumber == Integer.MAX_VALUE ? 0 : lowestLineNumber; - } - - - /** - * Returns the highest line number with the default null source, - * or 0 if there aren't any such line numbers. - */ - public int getHighestLineNumber() - { - int highestLineNumber = 0; - - for (int index = 0; index < u2lineNumberTableLength; index++) - { - LineNumberInfo info = lineNumberTable[index]; - if (info.getSource() == null) - { - int lineNumber = info.u2lineNumber; - if (lineNumber > highestLineNumber) - { - highestLineNumber = lineNumber; - } - } - } - - return highestLineNumber; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, this); - } - - - /** - * Applies the given visitor to all line numbers. - */ - public void lineNumbersAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfoVisitor lineNumberInfoVisitor) - { - for (int index = 0; index < u2lineNumberTableLength; index++) - { - // We don't need double dispatching here, since there is only one - // type of LineNumberInfo. - lineNumberInfoVisitor.visitLineNumberInfo(clazz, method, codeAttribute, lineNumberTable[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableInfo.java deleted file mode 100644 index 274b3fea..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableInfo.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * Representation of an Local Variable table entry. - * - * @author Eric Lafortune - */ -public class LocalVariableInfo implements VisitorAccepter, Comparable -{ - public int u2startPC; - public int u2length; - public int u2nameIndex; - public int u2descriptorIndex; - public int u2index; - - /** - * An extra field pointing to the referenced Clazz object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - */ - public Clazz referencedClass; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized LocalVariableInfo. - */ - public LocalVariableInfo() - { - } - - - /** - * Creates an initialized LocalVariableInfo. - */ - public LocalVariableInfo(int u2startPC, - int u2length, - int u2nameIndex, - int u2descriptorIndex, - int u2index) - { - this.u2startPC = u2startPC; - this.u2length = u2length; - this.u2nameIndex = u2nameIndex; - this.u2descriptorIndex = u2descriptorIndex; - this.u2index = u2index; - } - - - /** - * Returns the name. - */ - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - - /** - * Returns the descriptor. - */ - public String getDescriptor(Clazz clazz) - { - return clazz.getString(u2descriptorIndex); - } - - - /** - * Lets the referenced class accept the given visitor. - */ - public void referencedClassAccept(ClassVisitor classVisitor) - { - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } - - - // Implementations for Comparable. - - public int compareTo(Object object) - { - LocalVariableInfo other = (LocalVariableInfo)object; - - return - this.u2startPC < other.u2startPC ? -1 : this.u2startPC > other.u2startPC ? 1 : - this.u2index < other.u2index ? -1 : this.u2index > other.u2index ? 1 : - this.u2length < other.u2length ? -1 : this.u2length > other.u2length ? 1 : - this.u2descriptorIndex < other.u2descriptorIndex ? -1 : this.u2descriptorIndex > other.u2descriptorIndex ? 1 : - this.u2nameIndex < other.u2nameIndex ? -1 : this.u2nameIndex > other.u2nameIndex ? 1 : - 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTableAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTableAttribute.java deleted file mode 100644 index 0338208c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTableAttribute.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; - -/** - * This Attribute represents a local variable table attribute. - * - * @author Eric Lafortune - */ -public class LocalVariableTableAttribute extends Attribute -{ - public int u2localVariableTableLength; - public LocalVariableInfo[] localVariableTable; - - - /** - * Creates an uninitialized LocalVariableTableAttribute. - */ - public LocalVariableTableAttribute() - { - } - - - /** - * Creates an initialized LocalVariableTableAttribute. - */ - public LocalVariableTableAttribute(int u2attributeNameIndex, - int u2localVariableTableLength, - LocalVariableInfo[] localVariableTable) - { - super(u2attributeNameIndex); - - this.u2localVariableTableLength = u2localVariableTableLength; - this.localVariableTable = localVariableTable; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, this); - } - - - /** - * Applies the given visitor to all local variables. - */ - public void localVariablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfoVisitor localVariableInfoVisitor) - { - for (int index = 0; index < u2localVariableTableLength; index++) - { - // We don't need double dispatching here, since there is only one - // type of LocalVariableInfo. - localVariableInfoVisitor.visitLocalVariableInfo(clazz, method, codeAttribute, localVariableTable[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTypeInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTypeInfo.java deleted file mode 100644 index e0604942..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTypeInfo.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * Representation of an Local Variable table entry. - * - * @author Eric Lafortune - */ -public class LocalVariableTypeInfo implements VisitorAccepter, Comparable -{ - public int u2startPC; - public int u2length; - public int u2nameIndex; - public int u2signatureIndex; - public int u2index; - - /** - * An extra field pointing to the Clazz objects referenced in the - * type string. This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz[] referencedClasses; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized LocalVariableTypeInfo. - */ - public LocalVariableTypeInfo() - { - } - - - /** - * Creates an initialized LocalVariableTypeInfo. - */ - public LocalVariableTypeInfo(int u2startPC, - int u2length, - int u2nameIndex, - int u2signatureIndex, - int u2index) - { - this.u2startPC = u2startPC; - this.u2length = u2length; - this.u2nameIndex = u2nameIndex; - this.u2signatureIndex = u2signatureIndex; - this.u2index = u2index; - } - - - /** - * Returns the name. - */ - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - - /** - * Returns the signature. - */ - public String getSignature(Clazz clazz) - { - return clazz.getString(u2signatureIndex); - } - - - /** - * Applies the given visitor to all referenced classes. - */ - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - Clazz referencedClass = referencedClasses[index]; - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } - - - // Implementations for Comparable. - - public int compareTo(Object object) - { - LocalVariableTypeInfo other = (LocalVariableTypeInfo)object; - - return - this.u2startPC < other.u2startPC ? -1 : this.u2startPC > other.u2startPC ? 1 : - this.u2length < other.u2length ? -1 : this.u2length > other.u2length ? 1 : - this.u2index < other.u2index ? -1 : this.u2index > other.u2index ? 1 : - this.u2signatureIndex < other.u2signatureIndex ? -1 : this.u2signatureIndex > other.u2signatureIndex ? 1 : - this.u2nameIndex < other.u2nameIndex ? -1 : this.u2nameIndex > other.u2nameIndex ? 1 : - 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTypeTableAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTypeTableAttribute.java deleted file mode 100644 index db9f488a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/LocalVariableTypeTableAttribute.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; - -/** - * This Attribute represents a local variable table type attribute. - * - * @author Eric Lafortune - */ -public class LocalVariableTypeTableAttribute extends Attribute -{ - public int u2localVariableTypeTableLength; - public LocalVariableTypeInfo[] localVariableTypeTable; - - - /** - * Creates an uninitialized LocalVariableTypeTableAttribute. - */ - public LocalVariableTypeTableAttribute() - { - } - - - /** - * Creates an initialized LocalVariableTypeTableAttribute. - */ - public LocalVariableTypeTableAttribute(int u2attributeNameIndex, - int u2localVariableTypeTableLength, - LocalVariableTypeInfo[] localVariableTypeTable) - { - super(u2attributeNameIndex); - - this.u2localVariableTypeTableLength = u2localVariableTypeTableLength; - this.localVariableTypeTable = localVariableTypeTable; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, this); - } - - - /** - * Applies the given visitor to all local variable types. - */ - public void localVariablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfoVisitor localVariableTypeInfoVisitor) - { - for (int index = 0; index < u2localVariableTypeTableLength; index++) - { - // We don't need double dispatching here, since there is only one - // type of LocalVariableTypeInfo. - localVariableTypeInfoVisitor.visitLocalVariableTypeInfo(clazz, method, codeAttribute, localVariableTypeTable[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/MethodParametersAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/MethodParametersAttribute.java deleted file mode 100644 index 079d3bd8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/MethodParametersAttribute.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; - -/** - * This Attribute represents a method parameters attribute. - * - * @author Eric Lafortune - */ -public class MethodParametersAttribute extends Attribute -{ - public int u1parametersCount; - public ParameterInfo[] parameters; - - - /** - * Creates an uninitialized MethodParametersAttribute. - */ - public MethodParametersAttribute() - { - } - - - /** - * Creates an initialized MethodParametersAttribute. - */ - public MethodParametersAttribute(int u2attributeNameIndex, - int u1parametersCount, - ParameterInfo[] parameters) - { - super(u2attributeNameIndex); - - this.u1parametersCount = u1parametersCount; - this.parameters = parameters; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitMethodParametersAttribute(clazz, method, this); - } - - - /** - * Applies the given visitor to all parameters. - */ - public void parametersAccept(Clazz clazz, Method method, ParameterInfoVisitor parameterInfoVisitor) - { - // Loop over all parameters. - for (int index = 0; index < u1parametersCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of ParameterInfo. - parameterInfoVisitor.visitParameterInfo(clazz, method, index, parameters[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ParameterInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ParameterInfo.java deleted file mode 100644 index 4f1200d5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/ParameterInfo.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * Representation of a parameter, as defined in a method parameters - * attribute. - * - * @author Eric Lafortune - */ -public class ParameterInfo implements VisitorAccepter -{ - public int u2nameIndex; - public int u2accessFlags; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized ParameterInfo. - */ - public ParameterInfo() - { - } - - - /** - * Creates an initialized ParameterInfo. - */ - public ParameterInfo(int u2nameIndex, - int u2accessFlags) - { - this.u2nameIndex = u2nameIndex; - this.u2accessFlags = u2accessFlags; - } - - - /** - * Returns the parameter name. - */ - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - - /** - * Applies the given constant pool visitor to the Utf8 constant that - * represents the name of the parameter, if any. - */ - public void nameConstantAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2nameIndex != 0) - { - clazz.constantPoolEntryAccept(u2nameIndex, constantVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SignatureAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SignatureAttribute.java deleted file mode 100644 index 20ec26bb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SignatureAttribute.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This Attribute represents a signature attribute. - * - * @author Eric Lafortune - */ -public class SignatureAttribute extends Attribute -{ - public int u2signatureIndex; - - /** - * An extra field containing all the classes referenced in the - * signature string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * The size of the array is the number of classes in the signature. - * Primitive types and arrays of primitive types are ignored. - * Unknown classes are represented as null values. - */ - public Clazz[] referencedClasses; - - - /** - * Creates an uninitialized SignatureAttribute. - */ - public SignatureAttribute() - { - } - - - /** - * Creates an initialized SignatureAttribute. - */ - public SignatureAttribute(int u2attributeNameIndex, - int u2signatureIndex) - { - super(u2attributeNameIndex); - - this.u2signatureIndex = u2signatureIndex; - } - - - /** - * Returns the signature. - */ - public String getSignature(Clazz clazz) - { - return clazz.getString(u2signatureIndex); - } - - - /** - * Lets the Clazz objects referenced in the signature string accept the - * given visitor. - */ - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - if (referencedClasses[index] != null) - { - referencedClasses[index].accept(classVisitor); - } - } - } - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSignatureAttribute(clazz, this); - } - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSignatureAttribute(clazz, field, this); - } - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSignatureAttribute(clazz, method, this); - } - } diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SourceDirAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SourceDirAttribute.java deleted file mode 100644 index cc46f593..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SourceDirAttribute.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a source directory attribute. - * - * @author Eric Lafortune - */ -public class SourceDirAttribute extends Attribute -{ - public int u2sourceDirIndex; - - - /** - * Creates an uninitialized SourceDirAttribute. - */ - public SourceDirAttribute() - { - } - - - /** - * Creates an initialized SourceDirAttribute. - */ - public SourceDirAttribute(int u2attributeNameIndex, - int u2sourceDirIndex) - { - super(u2attributeNameIndex); - - this.u2sourceDirIndex = u2sourceDirIndex; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSourceDirAttribute(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SourceFileAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SourceFileAttribute.java deleted file mode 100644 index a3c5cd0a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SourceFileAttribute.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a source file attribute. - * - * @author Eric Lafortune - */ -public class SourceFileAttribute extends Attribute -{ - public int u2sourceFileIndex; - - - /** - * Creates an uninitialized SourceFileAttribute. - */ - public SourceFileAttribute() - { - } - - - /** - * Creates an initialized SourceFileAttribute. - */ - public SourceFileAttribute(int u2attributeNameIndex, - int u2sourceFileIndex) - { - super(u2attributeNameIndex); - - this.u2sourceFileIndex = u2sourceFileIndex; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSourceFileAttribute(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SyntheticAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SyntheticAttribute.java deleted file mode 100644 index fbfb80cc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/SyntheticAttribute.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a synthetic attribute. - * - * @author Eric Lafortune - */ -public class SyntheticAttribute extends Attribute -{ - /** - * Creates an uninitialized SyntheticAttribute. - */ - public SyntheticAttribute() - { - } - - - /** - * Creates an initialized SyntheticAttribute. - */ - public SyntheticAttribute(int u2attributeNameIndex) - { - super(u2attributeNameIndex); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSyntheticAttribute(clazz, this); - } - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSyntheticAttribute(clazz, field, this); - } - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitSyntheticAttribute(clazz, method, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/UnknownAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/UnknownAttribute.java deleted file mode 100644 index 41dfccc4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/UnknownAttribute.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute; - - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents an unknown attribute. - * - * @author Eric Lafortune - */ -public class UnknownAttribute extends Attribute -{ - public final int u4attributeLength; - public byte[] info; - - - /** - * Creates an uninitialized UnknownAttribute with the specified name and - * length. - */ - public UnknownAttribute(int u2attributeNameIndex, - int attributeLength) - { - this(u2attributeNameIndex, attributeLength, null); - } - - - /** - * Creates an initialized UnknownAttribute. - */ - public UnknownAttribute(int u2attributeNameIndex, - int u4attributeLength, - byte[] info) - { - super(u2attributeNameIndex); - - this.u4attributeLength = u4attributeLength; - this.info = info; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitUnknownAttribute(clazz, this); - } - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitUnknownAttribute(clazz, this); - } - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitUnknownAttribute(clazz, this); - } - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitUnknownAttribute(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/Annotation.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/Annotation.java deleted file mode 100644 index 19ed8b19..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/Annotation.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * Representation of an annotation. - * - * @author Eric Lafortune - */ -public class Annotation implements VisitorAccepter -{ - public int u2typeIndex; - public int u2elementValuesCount; - public ElementValue[] elementValues; - - /** - * An extra field pointing to the Clazz objects referenced in the - * type string. This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz[] referencedClasses; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized Annotation. - */ - public Annotation() - { - } - - - /** - * Creates an initialized Annotation. - */ - public Annotation(int u2typeIndex, - int u2elementValuesCount, - ElementValue[] elementValues) - { - this.u2typeIndex = u2typeIndex; - this.u2elementValuesCount = u2elementValuesCount; - this.elementValues = elementValues; - } - - - /** - * Returns the type. - */ - public String getType(Clazz clazz) - { - return clazz.getString(u2typeIndex); - } - - - - /** - * Applies the given visitor to the first referenced class. This is the - * main annotation class. - */ - public void referencedClassAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - Clazz referencedClass = referencedClasses[0]; - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - } - - - /** - * Applies the given visitor to all referenced classes. - */ - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - Clazz referencedClass = referencedClasses[index]; - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - } - } - - - /** - * Applies the given visitor to all element value pairs. - */ - public void elementValuesAccept(Clazz clazz, ElementValueVisitor elementValueVisitor) - { - for (int index = 0; index < u2elementValuesCount; index++) - { - elementValues[index].accept(clazz, this, elementValueVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationDefaultAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationDefaultAttribute.java deleted file mode 100644 index 8895419d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationDefaultAttribute.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents an annotation default attribute. - * - * @author Eric Lafortune - */ -public class AnnotationDefaultAttribute extends Attribute -{ - public ElementValue defaultValue; - - - /** - * Creates an uninitialized AnnotationDefaultAttribute. - */ - public AnnotationDefaultAttribute() - { - } - - - /** - * Creates an initialized AnnotationDefaultAttribute. - */ - public AnnotationDefaultAttribute(int u2attributeNameIndex, - ElementValue defaultValue) - { - super(u2attributeNameIndex); - - this.defaultValue = defaultValue; - } - - - /** - * Applies the given visitor to the default element value. - */ - public void defaultValueAccept(Clazz clazz, ElementValueVisitor elementValueVisitor) - { - defaultValue.accept(clazz, null, elementValueVisitor); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationElementValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationElementValue.java deleted file mode 100644 index 25d52170..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationElementValue.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.*; - -/** - * This ElementValue represents an annotation element value. - * - * @author Eric Lafortune - */ -public class AnnotationElementValue extends ElementValue -{ - public Annotation annotationValue; - - - /** - * Creates an uninitialized AnnotationElementValue. - */ - public AnnotationElementValue() - { - } - - - /** - * Creates an initialized AnnotationElementValue. - */ - public AnnotationElementValue(int u2elementNameIndex, - Annotation annotationValue) - { - super(u2elementNameIndex); - - this.annotationValue = annotationValue; - } - - - /** - * Applies the given visitor to the annotation. - */ - public void annotationAccept(Clazz clazz, AnnotationVisitor annotationVisitor) - { - annotationVisitor.visitAnnotation(clazz, annotationValue); - } - - - // Implementations for ElementValue. - - public char getTag() - { - return ClassConstants.ELEMENT_VALUE_ANNOTATION; - } - - public void accept(Clazz clazz, Annotation annotation, ElementValueVisitor elementValueVisitor) - { - elementValueVisitor.visitAnnotationElementValue(clazz, annotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationsAttribute.java deleted file mode 100644 index 6aba0aee..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/AnnotationsAttribute.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.visitor.AnnotationVisitor; - -/** - * This Attribute represents an annotations attribute. - * - * @author Eric Lafortune - */ -public abstract class AnnotationsAttribute extends Attribute -{ - public int u2annotationsCount; - public Annotation[] annotations; - - - /** - * Creates an uninitialized AnnotationsAttribute. - */ - protected AnnotationsAttribute() - { - } - - - /** - * Creates an initialized AnnotationsAttribute. - */ - protected AnnotationsAttribute(int u2attributeNameIndex, - int u2annotationsCount, - Annotation[] annotations) - { - super(u2attributeNameIndex); - - this.u2annotationsCount = u2annotationsCount; - this.annotations = annotations; - } - - - /** - * Applies the given visitor to all class annotations. - */ - public void annotationsAccept(Clazz clazz, AnnotationVisitor annotationVisitor) - { - for (int index = 0; index < u2annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - annotationVisitor.visitAnnotation(clazz, annotations[index]); - } - } - - - /** - * Applies the given visitor to all field annotations. - */ - public void annotationsAccept(Clazz clazz, Field field, AnnotationVisitor annotationVisitor) - { - for (int index = 0; index < u2annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - annotationVisitor.visitAnnotation(clazz, field, annotations[index]); - } - } - - - /** - * Applies the given visitor to all method annotations. - */ - public void annotationsAccept(Clazz clazz, Method method, AnnotationVisitor annotationVisitor) - { - for (int index = 0; index < u2annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - annotationVisitor.visitAnnotation(clazz, method, annotations[index]); - } - } - - - /** - * Applies the given visitor to all code attribute annotations. - */ - public void annotationsAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, AnnotationVisitor annotationVisitor) - { - for (int index = 0; index < u2annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - annotationVisitor.visitAnnotation(clazz, method, codeAttribute, annotations[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ArrayElementValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ArrayElementValue.java deleted file mode 100644 index 589f12ac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ArrayElementValue.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; - -/** - * This ElementValue represents an array element value. - * - * @author Eric Lafortune - */ -public class ArrayElementValue extends ElementValue -{ - public int u2elementValuesCount; - public ElementValue[] elementValues; - - - /** - * Creates an uninitialized ArrayElementValue. - */ - public ArrayElementValue() - { - } - - - /** - * Creates an initialized ArrayElementValue. - */ - public ArrayElementValue(int u2elementNameIndex, - int u2elementValuesCount, - ElementValue[] elementValues) - { - super(u2elementNameIndex); - - this.u2elementValuesCount = u2elementValuesCount; - this.elementValues = elementValues; - } - - - // Implementations for ElementValue. - - public char getTag() - { - return ClassConstants.ELEMENT_VALUE_ARRAY; - } - - public void accept(Clazz clazz, Annotation annotation, ElementValueVisitor elementValueVisitor) - { - elementValueVisitor.visitArrayElementValue(clazz, annotation, this); - } - - - /** - * Applies the given visitor to all nested element values. - */ - public void elementValuesAccept(Clazz clazz, Annotation annotation, ElementValueVisitor elementValueVisitor) - { - for (int index = 0; index < u2elementValuesCount; index++) - { - elementValues[index].accept(clazz, annotation, elementValueVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ClassElementValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ClassElementValue.java deleted file mode 100644 index 1a60974f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ClassElementValue.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ElementValue represents a class element value. - * - * @author Eric Lafortune - */ -public class ClassElementValue extends ElementValue -{ - public int u2classInfoIndex; - - /** - * An extra field pointing to the Clazz objects referenced in the - * type name string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz[] referencedClasses; - - - /** - * Creates an uninitialized ClassElementValue. - */ - public ClassElementValue() - { - } - - - /** - * Creates an initialized ClassElementValue. - */ - public ClassElementValue(int u2elementNameIndex, - int u2classInfoIndex) - { - super(u2elementNameIndex); - - this.u2classInfoIndex = u2classInfoIndex; - } - - - /** - * Returns the class info name. - */ - public String getClassName(Clazz clazz) - { - return clazz.getString(u2classInfoIndex); - } - - - /** - * Applies the given visitor to all referenced classes. - */ - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - Clazz referencedClass = referencedClasses[index]; - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - } - } - - - // Implementations for ElementValue. - - public char getTag() - { - return ClassConstants.ELEMENT_VALUE_CLASS; - } - - public void accept(Clazz clazz, Annotation annotation, ElementValueVisitor elementValueVisitor) - { - elementValueVisitor.visitClassElementValue(clazz, annotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ConstantElementValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ConstantElementValue.java deleted file mode 100644 index 86b3c47e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ConstantElementValue.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; - -/** - * This ElementValue represents a constant element value. - * - * @author Eric Lafortune - */ -public class ConstantElementValue extends ElementValue -{ - public final char u1tag; - public int u2constantValueIndex; - - - /** - * Creates an uninitialized ConstantElementValue. - */ - public ConstantElementValue(char u1tag) - { - this.u1tag = u1tag; - } - - - /** - * Creates an initialized ConstantElementValue. - */ - public ConstantElementValue(char u1tag, - int u2elementNameIndex, - int u2constantValueIndex) - { - super(u2elementNameIndex); - - this.u1tag = u1tag; - this.u2constantValueIndex = u2constantValueIndex; - } - - - // Implementations for ElementValue. - - public char getTag() - { - return u1tag; - } - - public void accept(Clazz clazz, Annotation annotation, ElementValueVisitor elementValueVisitor) - { - elementValueVisitor.visitConstantElementValue(clazz, annotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ElementValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ElementValue.java deleted file mode 100644 index c252c0ff..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ElementValue.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This abstract class represents an element value that is attached to an - * annotation or an annotation default. Specific types of element values are - * subclassed from it. - * - * @author Eric Lafortune - */ -public abstract class ElementValue implements VisitorAccepter -{ - /** - * An extra field for the optional element name. It is used in element value - * pairs of annotations. Otherwise, it is 0. - */ - public int u2elementNameIndex; - - /** - * An extra field pointing to the referenced Clazz - * object, if applicable. This field is typically filled out by the - * {@link proguard.classfile.util.ClassReferenceInitializer}. - */ - public Clazz referencedClass; - - /** - * An extra field pointing to the referenced Method - * object, if applicable. This field is typically filled out by the - * {@link proguard.classfile.util.ClassReferenceInitializer}. - */ - public Method referencedMethod; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized ElementValue. - */ - protected ElementValue() - { - } - - - /** - * Creates an initialized ElementValue. - */ - protected ElementValue(int u2elementNameIndex) - { - this.u2elementNameIndex = u2elementNameIndex; - } - - - /** - * Returns the element name. - */ - public String getMethodName(Clazz clazz) - { - return clazz.getString(u2elementNameIndex); - } - - - // Abstract methods to be implemented by extensions. - - /** - * Returns the tag of this element value. - */ - public abstract char getTag(); - - - /** - * Accepts the given visitor. - */ - public abstract void accept(Clazz clazz, Annotation annotation, ElementValueVisitor elementValueVisitor); - - - - /** - * Applies the given visitor to the referenced method. - */ - public void referencedMethodAccept(MemberVisitor memberVisitor) - { - if (referencedMethod != null) - { - referencedMethod.accept(referencedClass, memberVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/EnumConstantElementValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/EnumConstantElementValue.java deleted file mode 100644 index fe1d5dc9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/EnumConstantElementValue.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.visitor.*; - -/** - * This ElementValue represents an enumeration constant element value. - * - * @author Eric Lafortune - */ -public class EnumConstantElementValue extends ElementValue -{ - public int u2typeNameIndex; - public int u2constantNameIndex; - - /** - * An extra field pointing to the Clazz objects referenced in the - * type name string. This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz[] referencedClasses; - - /** - * An extra field optionally pointing to the referenced enum Field object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - */ - public Field referencedField; - - - /** - * Creates an uninitialized EnumConstantElementValue. - */ - public EnumConstantElementValue() - { - } - - - /** - * Creates an initialized EnumConstantElementValue. - */ - public EnumConstantElementValue(int u2elementNameIndex, - int u2typeNameIndex, - int u2constantNameIndex) - { - super(u2elementNameIndex); - - this.u2typeNameIndex = u2typeNameIndex; - this.u2constantNameIndex = u2constantNameIndex; - } - - - /** - * Returns the enumeration type name. - */ - public String getTypeName(Clazz clazz) - { - return clazz.getString(u2typeNameIndex); - } - - - /** - * Returns the constant name. - */ - public String getConstantName(Clazz clazz) - { - return clazz.getString(u2constantNameIndex); - } - - - /** - * Applies the given visitor to all referenced classes. - */ - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - Clazz referencedClass = referencedClasses[index]; - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - } - } - - - /** - * Applies the given visitor to the referenced field. - */ - public void referencedFieldAccept(MemberVisitor memberVisitor) - { - if (referencedField != null) - { - referencedField.accept(referencedClasses[0], - memberVisitor); - } - } - - - // Implementations for ElementValue. - - public char getTag() - { - return ClassConstants.ELEMENT_VALUE_ENUM_CONSTANT; - } - - public void accept(Clazz clazz, Annotation annotation, ElementValueVisitor elementValueVisitor) - { - elementValueVisitor.visitEnumConstantElementValue(clazz, annotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ParameterAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ParameterAnnotationsAttribute.java deleted file mode 100644 index 177c7f2a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/ParameterAnnotationsAttribute.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.annotation.visitor.AnnotationVisitor; - -/** - * This Attribute represents a parameter annotations attribute. - * - * @author Eric Lafortune - */ -public abstract class ParameterAnnotationsAttribute extends Attribute -{ - public int u1parametersCount; - public int[] u2parameterAnnotationsCount; - public Annotation[][] parameterAnnotations; - - - /** - * Creates an uninitialized ParameterAnnotationsAttribute. - */ - protected ParameterAnnotationsAttribute() - { - } - - - /** - * Creates an initialized ParameterAnnotationsAttribute. - */ - protected ParameterAnnotationsAttribute(int u2attributeNameIndex, - int u1parametersCount, - int[] u2parameterAnnotationsCount, - Annotation[][] parameterAnnotations) - { - super(u2attributeNameIndex); - - this.u1parametersCount = u1parametersCount; - this.u2parameterAnnotationsCount = u2parameterAnnotationsCount; - this.parameterAnnotations = parameterAnnotations; - } - - - /** - * Applies the given visitor to all annotations. - */ - public void annotationsAccept(Clazz clazz, Method method, AnnotationVisitor annotationVisitor) - { - // Loop over all parameters. - for (int parameterIndex = 0; parameterIndex < u1parametersCount; parameterIndex++) - { - int annotationsCount = u2parameterAnnotationsCount[parameterIndex]; - Annotation[] annotations = parameterAnnotations[parameterIndex]; - - // Loop over all parameter annotations. - for (int index = 0; index < annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - annotationVisitor.visitAnnotation(clazz, method, parameterIndex, annotations[index]); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleAnnotationsAttribute.java deleted file mode 100644 index 5a0160f9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleAnnotationsAttribute.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a runtime invisible annotations attribute. - * - * @author Eric Lafortune - */ -public class RuntimeInvisibleAnnotationsAttribute extends AnnotationsAttribute -{ - /** - * Creates an uninitialized RuntimeInvisibleAnnotationsAttribute. - */ - public RuntimeInvisibleAnnotationsAttribute() - { - } - - - /** - * Creates an initialized RuntimeInvisibleAnnotationsAttribute. - */ - public RuntimeInvisibleAnnotationsAttribute(int u2attributeNameIndex, - int u2annotationsCount, - Annotation[] annotations) - { - super(u2attributeNameIndex, u2annotationsCount, annotations); - } - - -// Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, this); - } - - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, this); - } - - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleParameterAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleParameterAnnotationsAttribute.java deleted file mode 100644 index ce920b67..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleParameterAnnotationsAttribute.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a runtime invisible parameter annotations attribute. - * - * @author Eric Lafortune - */ -public class RuntimeInvisibleParameterAnnotationsAttribute extends ParameterAnnotationsAttribute -{ - /** - * Creates an uninitialized RuntimeInvisibleParameterAnnotationsAttribute. - */ - public RuntimeInvisibleParameterAnnotationsAttribute() - { - } - - - /** - * Creates an initialized RuntimeInvisibleParameterAnnotationsAttribute. - */ - public RuntimeInvisibleParameterAnnotationsAttribute(int u2attributeNameIndex, - int u1parametersCount, - int[] u2parameterAnnotationsCount, - Annotation[][] parameterAnnotations) - { - super(u2attributeNameIndex, - u1parametersCount, - u2parameterAnnotationsCount, - parameterAnnotations); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleTypeAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleTypeAnnotationsAttribute.java deleted file mode 100644 index d265ceda..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeInvisibleTypeAnnotationsAttribute.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a runtime invisible type annotations attribute. - * - * @author Eric Lafortune - */ -public class RuntimeInvisibleTypeAnnotationsAttribute extends TypeAnnotationsAttribute -{ - /** - * Creates an uninitialized RuntimeInvisibleTypeAnnotationsAttribute. - */ - public RuntimeInvisibleTypeAnnotationsAttribute() - { - } - - - /** - * Creates an initialized RuntimeInvisibleTypeAnnotationsAttribute. - */ - public RuntimeInvisibleTypeAnnotationsAttribute(int u2attributeNameIndex, - int u2annotationsCount, - TypeAnnotation[] annotations) - { - super(u2attributeNameIndex, u2annotationsCount, annotations); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, this); - } - - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, this); - } - - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, this); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleAnnotationsAttribute.java deleted file mode 100644 index ceeca398..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleAnnotationsAttribute.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a runtime visible annotations attribute. - * - * @author Eric Lafortune - */ -public class RuntimeVisibleAnnotationsAttribute extends AnnotationsAttribute -{ - /** - * Creates an uninitialized RuntimeVisibleAnnotationsAttribute. - */ - public RuntimeVisibleAnnotationsAttribute() - { - } - - - /** - * Creates an initialized RuntimeVisibleAnnotationsAttribute. - */ - public RuntimeVisibleAnnotationsAttribute(int u2attributeNameIndex, - int u2annotationsCount, - Annotation[] annotations) - { - super(u2attributeNameIndex, u2annotationsCount, annotations); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, this); - } - - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, this); - } - - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleParameterAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleParameterAnnotationsAttribute.java deleted file mode 100644 index b2d3330a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleParameterAnnotationsAttribute.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a runtime visible parameter annotations attribute. - * - * @author Eric Lafortune - */ -public class RuntimeVisibleParameterAnnotationsAttribute extends ParameterAnnotationsAttribute -{ - /** - * Creates an uninitialized RuntimeVisibleParameterAnnotationsAttribute. - */ - public RuntimeVisibleParameterAnnotationsAttribute() - { - } - - - /** - * Creates an initialized RuntimeVisibleParameterAnnotationsAttribute. - */ - public RuntimeVisibleParameterAnnotationsAttribute(int u2attributeNameIndex, - int u1parametersCount, - int[] u2parameterAnnotationsCount, - Annotation[][] parameterAnnotations) - { - super(u2attributeNameIndex, - u1parametersCount, - u2parameterAnnotationsCount, - parameterAnnotations); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleTypeAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleTypeAnnotationsAttribute.java deleted file mode 100644 index 66c049e8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/RuntimeVisibleTypeAnnotationsAttribute.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a runtime visible type annotations attribute. - * - * @author Eric Lafortune - */ -public class RuntimeVisibleTypeAnnotationsAttribute extends TypeAnnotationsAttribute -{ - /** - * Creates an uninitialized RuntimeVisibleTypeAnnotationsAttribute. - */ - public RuntimeVisibleTypeAnnotationsAttribute() - { - } - - - /** - * Creates an initialized RuntimeVisibleTypeAnnotationsAttribute. - */ - public RuntimeVisibleTypeAnnotationsAttribute(int u2attributeNameIndex, - int u2annotationsCount, - TypeAnnotation[] annotations) - { - super(u2attributeNameIndex, u2annotationsCount, annotations); - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, this); - } - - - public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, this); - } - - - public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, this); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypeAnnotation.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypeAnnotation.java deleted file mode 100644 index 45861905..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypeAnnotation.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.target.TargetInfo; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; -import proguard.classfile.attribute.annotation.visitor.*; - -/** - * Representation of a type annotation. - * - * @author Eric Lafortune - */ -public class TypeAnnotation extends Annotation -{ - public TargetInfo targetInfo; - public TypePathInfo[] typePath; - - - /** - * Creates an uninitialized TypeAnnotation. - */ - public TypeAnnotation() - { - } - - - /** - * Creates an initialized TypeAnnotation. - */ - public TypeAnnotation(int u2typeIndex, - int u2elementValuesCount, - ElementValue[] elementValues, - TargetInfo targetInfo, - TypePathInfo[] typePath) - { - super(u2typeIndex, u2elementValuesCount, elementValues); - - this.targetInfo = targetInfo; - this.typePath = typePath; - } - - - /** - * Applies the given visitor to the target info. - */ - public void targetInfoAccept(Clazz clazz, TargetInfoVisitor targetInfoVisitor) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - targetInfo.accept(clazz, this, targetInfoVisitor); - } - - - /** - * Applies the given visitor to the target info. - */ - public void targetInfoAccept(Clazz clazz, Field field, TargetInfoVisitor targetInfoVisitor) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - targetInfo.accept(clazz, field, this, targetInfoVisitor); - } - - - /** - * Applies the given visitor to the target info. - */ - public void targetInfoAccept(Clazz clazz, Method method, TargetInfoVisitor targetInfoVisitor) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - targetInfo.accept(clazz, method, this, targetInfoVisitor); - } - - - /** - * Applies the given visitor to the target info. - */ - public void targetInfoAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, TargetInfoVisitor targetInfoVisitor) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - targetInfo.accept(clazz, method, codeAttribute, this, targetInfoVisitor); - } - - - /** - * Applies the given visitor to all type path elements. - */ - public void typePathInfosAccept(Clazz clazz, TypePathInfoVisitor typePathVisitor) - { - for (int index = 0; index < typePath.length; index++) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - typePathVisitor.visitTypePathInfo(clazz, this, typePath[index]); - } - } - - - /** - * Applies the given visitor to all type path elements. - */ - public void typePathInfosAccept(Clazz clazz, Field field, TypePathInfoVisitor typePathVisitor) - { - for (int index = 0; index < typePath.length; index++) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - typePathVisitor.visitTypePathInfo(clazz, field, this, typePath[index]); - } - } - - - /** - * Applies the given visitor to all type path elements. - */ - public void typePathInfosAccept(Clazz clazz, Method method, TypePathInfoVisitor typePathVisitor) - { - for (int index = 0; index < typePath.length; index++) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - typePathVisitor.visitTypePathInfo(clazz, method, this, typePath[index]); - } - } - - - /** - * Applies the given visitor to all type path elements. - */ - public void typePathInfosAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypePathInfoVisitor typePathVisitor) - { - for (int index = 0; index < typePath.length; index++) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - typePathVisitor.visitTypePathInfo(clazz, method, codeAttribute, typeAnnotation, typePath[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypeAnnotationsAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypeAnnotationsAttribute.java deleted file mode 100644 index 6423ab94..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypeAnnotationsAttribute.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.visitor.*; - -/** - * This Attribute represents a type annotations attribute. - * - * @author Eric Lafortune - */ -public abstract class TypeAnnotationsAttribute extends AnnotationsAttribute -{ - /** - * Creates an uninitialized TypeAnnotationsAttribute. - */ - protected TypeAnnotationsAttribute() - { - } - - - /** - * Creates an initialized TypeAnnotationsAttribute. - */ - protected TypeAnnotationsAttribute(int u2attributeNameIndex, - int u2annotationsCount, - TypeAnnotation[] annotations) - { - super(u2attributeNameIndex, u2annotationsCount, annotations); - } - - - /** - * Applies the given visitor to all class annotations. - */ - public void typeAnnotationsAccept(Clazz clazz, TypeAnnotationVisitor typeAnnotationVisitor) - { - TypeAnnotation[] annotations = (TypeAnnotation[])this.annotations; - - for (int index = 0; index < u2annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - typeAnnotationVisitor.visitTypeAnnotation(clazz, annotations[index]); - } - } - - - /** - * Applies the given visitor to all field annotations. - */ - public void typeAnnotationsAccept(Clazz clazz, Field field, TypeAnnotationVisitor typeAnnotationVisitor) - { - TypeAnnotation[] annotations = (TypeAnnotation[])this.annotations; - - for (int index = 0; index < u2annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - typeAnnotationVisitor.visitTypeAnnotation(clazz, field, annotations[index]); - } - } - - - /** - * Applies the given visitor to all method annotations. - */ - public void typeAnnotationsAccept(Clazz clazz, Method method, TypeAnnotationVisitor typeAnnotationVisitor) - { - TypeAnnotation[] annotations = (TypeAnnotation[])this.annotations; - - for (int index = 0; index < u2annotationsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of Annotation. - typeAnnotationVisitor.visitTypeAnnotation(clazz, method, annotations[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypePathInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypePathInfo.java deleted file mode 100644 index f5669623..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/TypePathInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation; - -/** - * Representation of a path element in a type annotation. - * - * @author Eric Lafortune - */ -public class TypePathInfo -{ - public int u1typePathKind; - public int u1typeArgumentIndex; - - - /** - * Creates an uninitialized TypePathInfo. - */ - public TypePathInfo() - { - } - - - /** - * Creates an initialized TypePathInfo. - */ - public TypePathInfo(int u1typePathKind, int u1typeArgumentIndex) - { - this.u1typePathKind = u1typePathKind; - this.u1typeArgumentIndex = u1typeArgumentIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/package.html deleted file mode 100644 index 6aacff3e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains classes to represent the annotation attributes inside -class files. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/CatchTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/CatchTargetInfo.java deleted file mode 100644 index 44bd4e4c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/CatchTargetInfo.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of a 'catch' annotation target. - * - * @author Eric Lafortune - */ -public class CatchTargetInfo extends TargetInfo -{ - public int u2exceptionTableIndex; - - - /** - * Creates an uninitialized CatchTargetInfo. - */ - public CatchTargetInfo() - { - } - - - /** - * Creates a partially initialized CatchTargetInfo. - */ - public CatchTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized CatchTargetInfo. - */ - public CatchTargetInfo(byte u1targetType, - int u2exceptionTableIndex) - { - super(u1targetType); - - this.u2exceptionTableIndex = u2exceptionTableIndex; - } - - - // Implementations for TargetInfo. - - /** - * Lets the visitor visit, with Method and CodeAttribute null. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitCatchTargetInfo(clazz, null, null, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitCatchTargetInfo(clazz, method, codeAttribute, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/EmptyTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/EmptyTargetInfo.java deleted file mode 100644 index 940b97b0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/EmptyTargetInfo.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of an empty annotation target. - * - * @author Eric Lafortune - */ -public class EmptyTargetInfo extends TargetInfo -{ - /** - * Creates an uninitialized EmptyTargetInfo. - */ - public EmptyTargetInfo() - { - } - - - /** - * Creates an initialized EmptyTargetInfo. - */ - public EmptyTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - // Implementations for TargetInfo. - - /** - * Lets the visitor visit, with Field null. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitEmptyTargetInfo(clazz, (Field)null, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitEmptyTargetInfo(clazz, field, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitEmptyTargetInfo(clazz, method, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/FormalParameterTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/FormalParameterTargetInfo.java deleted file mode 100644 index 0a621e2d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/FormalParameterTargetInfo.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of a formal parameter annotation target. - * - * @author Eric Lafortune - */ -public class FormalParameterTargetInfo extends TargetInfo -{ - public int u1formalParameterIndex; - - - /** - * Creates an uninitialized FormalParameterTargetInfo. - */ - public FormalParameterTargetInfo() - { - } - - - /** - * Creates a partially initialized FormalParameterTargetInfo. - */ - public FormalParameterTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized FormalParameterTargetInfo. - */ - public FormalParameterTargetInfo(byte u1targetType, - int u1formalParameterIndex) - { - super(u1targetType); - - this.u1formalParameterIndex = u1formalParameterIndex; - } - - - // Implementations for TargetInfo. - - /** - * Lets the visitor visit, with Method null. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitFormalParameterTargetInfo(clazz, null, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitFormalParameterTargetInfo(clazz, method, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetElement.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetElement.java deleted file mode 100644 index 89d48fd2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetElement.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -/** - * Representation of an local variable target table entry. - * - * @author Eric Lafortune - */ -public class LocalVariableTargetElement -{ - public int u2startPC; - public int u2length; - public int u2index; - - /** - * Creates an uninitialized LocalVariableTargetElement. - */ - public LocalVariableTargetElement() - { - } - - - /** - * Creates an initialized LocalVariableTargetElement. - */ - public LocalVariableTargetElement(int u2startPC, - int u2length, - int u2index) - { - this.u2startPC = u2startPC; - this.u2length = u2length; - this.u2index = u2index; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetInfo.java deleted file mode 100644 index 5c4520e2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetInfo.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.*; - -/** - * Representation of a local variable annotation target. - * - * @author Eric Lafortune - */ -public class LocalVariableTargetInfo extends TargetInfo -{ - public int u2tableLength; - public LocalVariableTargetElement[] table; - - - /** - * Creates an uninitialized LocalVariableTargetInfo. - */ - public LocalVariableTargetInfo() - { - } - - - /** - * Creates a partially initialized LocalVariableTargetInfo. - */ - public LocalVariableTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized LocalVariableTargetInfo. - */ - public LocalVariableTargetInfo(byte u1targetType, - int u2tableLength, - LocalVariableTargetElement[] table) - { - super(u1targetType); - - this.u2tableLength = u2tableLength; - this.table = table; - } - - - /** - * Applies the given visitor to all target elements. - */ - public void targetElementsAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetElementVisitor localVariableTargetElementVisitor) - { - for (int index = 0; index < u2tableLength; index++) - { - // We don't need double dispatching here, since there is only one - // type of TypePathInfo. - localVariableTargetElementVisitor.visitLocalVariableTargetElement(clazz, method, codeAttribute, typeAnnotation, this, table[index]); - } - } - - - // Implementations for TargetInfo. - - /** - * Lets the visitor visit, with Method and CodeAttribute null. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitLocalVariableTargetInfo(clazz, null, null, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitLocalVariableTargetInfo(clazz, method, codeAttribute, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/OffsetTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/OffsetTargetInfo.java deleted file mode 100644 index 026978ca..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/OffsetTargetInfo.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of an offset annotation target. - * - * @author Eric Lafortune - */ -public class OffsetTargetInfo extends TargetInfo -{ - public int u2offset; - - - /** - * Creates an uninitialized OffsetTargetInfo. - */ - public OffsetTargetInfo() - { - } - - - /** - * Creates a partially initialized OffsetTargetInfo. - */ - public OffsetTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized OffsetTargetInfo. - */ - public OffsetTargetInfo(byte u1targetType, - int u2offset) - { - super(u1targetType); - - this.u2offset = u2offset; - } - - - // Implementations for TargetInfo. - - /** - * Lets the visitor visit, with Method and CodeAttribute null. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitOffsetTargetInfo(clazz, null, null, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitOffsetTargetInfo(clazz, method, codeAttribute, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/SuperTypeTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/SuperTypeTargetInfo.java deleted file mode 100644 index e3e9fc4d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/SuperTypeTargetInfo.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of a super type annotation target. - * - * @author Eric Lafortune - */ -public class SuperTypeTargetInfo extends TargetInfo -{ - public final int EXTENDS_INDEX = 65535; - - - public int u2superTypeIndex; - - - /** - * Creates an uninitialized SuperTypeTargetInfo. - */ - public SuperTypeTargetInfo() - { - } - - - /** - * Creates a partially initialized SuperTypeTargetInfo. - */ - public SuperTypeTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized SuperTypeTargetInfo. - */ - public SuperTypeTargetInfo(byte u1targetType, - int u2superTypeIndex) - { - super(u1targetType); - - this.u2superTypeIndex = u2superTypeIndex; - } - - - // Implementations for TargetInfo. - - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitSuperTypeTargetInfo(clazz, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TargetInfo.java deleted file mode 100644 index fa0e34f0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TargetInfo.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of an annotation target. - * - * @author Eric Lafortune - */ -public abstract class TargetInfo -{ - public byte u1targetType; - - - /** - * Creates an uninitialized TargetInfo. - */ - protected TargetInfo() - { - } - - - /** - * Creates an initialized TargetInfo. - */ - protected TargetInfo(byte u1targetType) - { - this.u1targetType = u1targetType; - } - - - /** - * Returns the type of the target. - */ - public byte getTargetType() - { - return u1targetType; - } - - - // Methods to be implemented by extensions. - - /** - * Accepts the given visitor, in the context of a type annotation on a class. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on a class"); - } - - /** - * Accepts the given visitor, in the context of a type annotation on a field. - */ - public void accept(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on a field"); - } - - /** - * Accepts the given visitor, in the context of a type annotation on a method. - */ - public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on a method"); - } - - /** - * Accepts the given visitor, in the context of a type annotation code. - */ - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on code"); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/ThrowsTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/ThrowsTargetInfo.java deleted file mode 100644 index 725d3d93..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/ThrowsTargetInfo.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of a 'throws' annotation target. - * - * @author Eric Lafortune - */ -public class ThrowsTargetInfo extends TargetInfo -{ - public int u2throwsTypeIndex; - - - /** - * Creates an uninitialized ThrowsTargetInfo. - */ - public ThrowsTargetInfo() - { - } - - - /** - * Creates a partially initialized ThrowsTargetInfo. - */ - public ThrowsTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized ThrowsTargetInfo. - */ - public ThrowsTargetInfo(byte u1targetType, - int u2throwsTypeIndex) - { - super(u1targetType); - - this.u2throwsTypeIndex = u2throwsTypeIndex; - } - - - // Implementations for TargetInfo. - - /** - * Lets the visitor visit, with Method null. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitThrowsTargetInfo(clazz, null, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitThrowsTargetInfo(clazz, method, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeArgumentTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeArgumentTargetInfo.java deleted file mode 100644 index bf4df774..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeArgumentTargetInfo.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of an offset annotation target. - * - * @author Eric Lafortune - */ -public class TypeArgumentTargetInfo extends TargetInfo -{ - public int u2offset; - public int u1typeArgumentIndex; - - - /** - * Creates an uninitialized TypeArgumentTargetInfo. - */ - public TypeArgumentTargetInfo() - { - } - - - /** - * Creates a partially initialized TypeArgumentTargetInfo. - */ - public TypeArgumentTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized TypeArgumentTargetInfo. - */ - public TypeArgumentTargetInfo(byte u1targetType, - int u2offset, - int u1typeArgumentIndex) - { - super(u1targetType); - - this.u2offset = u2offset; - this.u1typeArgumentIndex = u1typeArgumentIndex; - } - - - // Implementations for TargetInfo. - - /** - * Lets the visitor visit, with Method and CodeAttribute null. - */ - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitTypeArgumentTargetInfo(clazz, null, null, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitTypeArgumentTargetInfo(clazz, method, codeAttribute, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeParameterBoundTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeParameterBoundTargetInfo.java deleted file mode 100644 index 36e63613..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeParameterBoundTargetInfo.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of a type parameter bound annotation target. - * - * @author Eric Lafortune - */ -public class TypeParameterBoundTargetInfo extends TargetInfo -{ - public int u1typeParameterIndex; - public int u1boundIndex; - - - /** - * Creates an uninitialized TypeParameterBoundTargetInfo. - */ - public TypeParameterBoundTargetInfo() - { - } - - - /** - * Creates a partially initialized TypeParameterBoundTargetInfo. - */ - public TypeParameterBoundTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized TypeParameterBoundTargetInfo. - */ - public TypeParameterBoundTargetInfo(byte u1targetType, - int u1typeParameterIndex, - int u1boundIndex) - { - super(u1targetType); - - this.u1typeParameterIndex = u1typeParameterIndex; - this.u1boundIndex = u1boundIndex; - } - - - // Implementations for TargetInfo. - - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitTypeParameterBoundTargetInfo(clazz, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitTypeParameterBoundTargetInfo(clazz, field, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitTypeParameterBoundTargetInfo(clazz, method, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeParameterTargetInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeParameterTargetInfo.java deleted file mode 100644 index c08a67a6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/TypeParameterTargetInfo.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; - -/** - * Representation of a type parameter annotation target. - * - * @author Eric Lafortune - */ -public class TypeParameterTargetInfo extends TargetInfo -{ - public int u1typeParameterIndex; - - - /** - * Creates an uninitialized TypeParameterTargetInfo. - */ - public TypeParameterTargetInfo() - { - } - - - /** - * Creates a partially initialized TypeParameterTargetInfo. - */ - public TypeParameterTargetInfo(byte u1targetType) - { - super(u1targetType); - } - - - /** - * Creates an initialized TypeParameterTargetInfo. - */ - public TypeParameterTargetInfo(byte u1targetType, - int u1typeParameterIndex) - { - super(u1targetType); - - this.u1typeParameterIndex = u1typeParameterIndex; - } - - - // Implementations for TargetInfo. - - public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitTypeParameterTargetInfo(clazz, typeAnnotation, this); - } - - - public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor) - { - targetInfoVisitor.visitTypeParameterTargetInfo(clazz, method, typeAnnotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/visitor/LocalVariableTargetElementVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/visitor/LocalVariableTargetElementVisitor.java deleted file mode 100644 index 43b05072..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/visitor/LocalVariableTargetElementVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.*; - -/** - * This interface specifies the methods for a visitor of LocalVariableTargetElement - * instances. - * - * @author Eric Lafortune - */ -public interface LocalVariableTargetElementVisitor -{ - public void visitLocalVariableTargetElement(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo, LocalVariableTargetElement localVariableTargetElement); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/visitor/TargetInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/visitor/TargetInfoVisitor.java deleted file mode 100644 index 29e56064..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/target/visitor/TargetInfoVisitor.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.target.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.*; - -/** - * This interface specifies the methods for a visitor of TargetInfo - * objects. - * - * @author Eric Lafortune - */ -public interface TargetInfoVisitor -{ - public void visitTypeParameterTargetInfo( Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo); - public void visitTypeParameterTargetInfo( Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo); - public void visitSuperTypeTargetInfo( Clazz clazz, TypeAnnotation typeAnnotation, SuperTypeTargetInfo superTypeTargetInfo); - public void visitTypeParameterBoundTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo); - public void visitTypeParameterBoundTargetInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo); - public void visitTypeParameterBoundTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo); - public void visitEmptyTargetInfo( Clazz clazz, Field field, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo); - public void visitEmptyTargetInfo( Clazz clazz, Method method, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo); - public void visitFormalParameterTargetInfo( Clazz clazz, Method method, TypeAnnotation typeAnnotation, FormalParameterTargetInfo formalParameterTargetInfo); - public void visitThrowsTargetInfo( Clazz clazz, Method method, TypeAnnotation typeAnnotation, ThrowsTargetInfo throwsTargetInfo); - public void visitLocalVariableTargetInfo( Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo); - public void visitCatchTargetInfo( Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo catchTargetInfo); - public void visitOffsetTargetInfo( Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo); - public void visitTypeArgumentTargetInfo( Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo typeArgumentTargetInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AllAnnotationVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AllAnnotationVisitor.java deleted file mode 100644 index cd52e020..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AllAnnotationVisitor.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given AnnotationVisitor visit all Annotation - * objects of the attributes it visits. - * - * @author Eric Lafortune - */ -public class AllAnnotationVisitor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final AnnotationVisitor annotationVisitor; - - - /** - * Creates a new AllAnnotationVisitor. - * @param annotationVisitor the AnnotationVisitor to which visits will be - * delegated. - */ - public AllAnnotationVisitor(AnnotationVisitor annotationVisitor) - { - this.annotationVisitor = annotationVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, annotationVisitor); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, field, annotationVisitor); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, annotationVisitor); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, field, annotationVisitor); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Visit the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, annotationVisitor); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, field, annotationVisitor); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, codeAttribute, annotationVisitor); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, annotationVisitor); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, field, annotationVisitor); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, codeAttribute, annotationVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AllElementValueVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AllElementValueVisitor.java deleted file mode 100644 index 18478561..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AllElementValueVisitor.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor and AnnotationVisitor lets a given ElementValueVisitor - * visit all ElementValue objects of the attributes or annotations that it - * visits. - * - * @author Eric Lafortune - */ -public class AllElementValueVisitor -extends SimplifiedVisitor -implements AttributeVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - private final boolean deep; - private final ElementValueVisitor elementValueVisitor; - - - /** - * Creates a new AllElementValueVisitor. - * @param elementValueVisitor the AllElementValueVisitor to which visits - * will be delegated. - */ - public AllElementValueVisitor(ElementValueVisitor elementValueVisitor) - { - this(false, elementValueVisitor); - } - - - /** - * Creates a new AllElementValueVisitor. - * @param deep specifies whether the element values - * further down the hierarchy should be - * visited too. - * @param elementValueVisitor the AllElementValueVisitor to which visits - * will be delegated. - */ - public AllElementValueVisitor(boolean deep, - ElementValueVisitor elementValueVisitor) - { - this.deep = deep; - this.elementValueVisitor = elementValueVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, field, this); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, field, this); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - // Visit the annotations. - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Visit the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Visit the default element value. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - annotation.elementValuesAccept(clazz, this); - } - - - public void visitAnnotation(Clazz clazz, Field field, Annotation annotation) - { - annotation.elementValuesAccept(clazz, this); - } - - - public void visitAnnotation(Clazz clazz, Method method, Annotation annotation) - { - annotation.elementValuesAccept(clazz, this); - } - - - public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation) - { - annotation.elementValuesAccept(clazz, this); - } - - - public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation) - { - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - elementValueVisitor.visitConstantElementValue(clazz, annotation, constantElementValue); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - elementValueVisitor.visitEnumConstantElementValue(clazz, annotation, enumConstantElementValue); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - elementValueVisitor.visitClassElementValue(clazz, annotation, classElementValue); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - elementValueVisitor.visitAnnotationElementValue(clazz, annotation, annotationElementValue); - - if (deep) - { - annotationElementValue.annotationAccept(clazz, this); - } - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - elementValueVisitor.visitArrayElementValue(clazz, annotation, arrayElementValue); - - if (deep) - { - arrayElementValue.elementValuesAccept(clazz, annotation, elementValueVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationToAnnotatedClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationToAnnotatedClassVisitor.java deleted file mode 100644 index 5703b711..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationToAnnotatedClassVisitor.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.annotation.Annotation; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - - -/** - * This AnnotationVisitor delegates all visits to a given ClassVisitor. - * The latter visits the class of each visited annotation, although - * never twice in a row. - * - * @author Eric Lafortune - */ -public class AnnotationToAnnotatedClassVisitor -extends SimplifiedVisitor -implements AnnotationVisitor -{ - private final ClassVisitor classVisitor; - - private Clazz lastVisitedClass; - - - public AnnotationToAnnotatedClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - if (!clazz.equals(lastVisitedClass)) - { - clazz.accept(classVisitor); - - lastVisitedClass = clazz; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationToAnnotatedMemberVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationToAnnotatedMemberVisitor.java deleted file mode 100644 index 1a30c79f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationToAnnotatedMemberVisitor.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.Annotation; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - - -/** - * This AnnotationVisitor delegates all visits to a given MemberVisitor. - * The latter visits the class member of each visited class member annotation - * or method parameter annotation, although never twice in a row. - * - * @author Eric Lafortune - */ -public class AnnotationToAnnotatedMemberVisitor -extends SimplifiedVisitor -implements AnnotationVisitor -{ - private final MemberVisitor memberVisitor; - - private Member lastVisitedMember; - - - public AnnotationToAnnotatedMemberVisitor(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Member member, Annotation annotation) - { - if (!member.equals(lastVisitedMember)) - { - member.accept(clazz, memberVisitor); - - lastVisitedMember = member; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationTypeFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationTypeFilter.java deleted file mode 100644 index d5247f8c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationTypeFilter.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.Annotation; -import proguard.util.*; - -import java.util.List; - -/** - * This AnnotationVisitor delegates its visits to another given - * AnnotationVisitor, but only when the visited annotation has - * a type that matches a given regular expression. - * - * @author Eric Lafortune - */ -public class AnnotationTypeFilter -implements AnnotationVisitor -{ - private final StringMatcher regularExpressionMatcher; - private final AnnotationVisitor annotationVisitor; - - - /** - * Creates a new AnnotationTypeFilter. - * @param regularExpression the regular expression against which - * annotation type names will be matched. - * @param annotationVisitor the annotation visitor to which visits - * will be delegated. - */ - public AnnotationTypeFilter(String regularExpression, - AnnotationVisitor annotationVisitor) - { - this(regularExpression, null, annotationVisitor); - } - - - /** - * Creates a new AnnotationTypeFilter. - * @param regularExpression the regular expression against which - * annotation type names will be matched. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - * @param annotationVisitor the annotation visitor to which visits - * will be delegated. - */ - public AnnotationTypeFilter(String regularExpression, - List variableStringMatchers, - AnnotationVisitor annotationVisitor) - { - this(new ListParser(new ClassNameParser()).parse(regularExpression), - annotationVisitor); - } - - - /** - * Creates a new AnnotationTypeFilter. - * @param regularExpressionMatcher the string matcher against which - * class names will be matched. - * @param annotationVisitor the annotation visitor to which visits - * will be delegated. - */ - public AnnotationTypeFilter(StringMatcher regularExpressionMatcher, - AnnotationVisitor annotationVisitor) - { - this.regularExpressionMatcher = regularExpressionMatcher; - this.annotationVisitor = annotationVisitor; - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - if (accepted(annotation.getType(clazz))) - { - annotationVisitor.visitAnnotation(clazz, annotation); - } - } - - - public void visitAnnotation(Clazz clazz, Field field, Annotation annotation) - { - if (accepted(annotation.getType(clazz))) - { - annotationVisitor.visitAnnotation(clazz, field, annotation); - } - } - - - public void visitAnnotation(Clazz clazz, Method method, Annotation annotation) - { - if (accepted(annotation.getType(clazz))) - { - annotationVisitor.visitAnnotation(clazz, method, annotation); - } - } - - - public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation) - { - if (accepted(annotation.getType(clazz))) - { - annotationVisitor.visitAnnotation(clazz, method, parameterIndex, annotation); - } - } - - - public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation) - { - if (accepted(annotation.getType(clazz))) - { - annotationVisitor.visitAnnotation(clazz, method, codeAttribute, annotation); - } - } - - - // Small utility methods. - - private boolean accepted(String name) - { - return regularExpressionMatcher.matches(name); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationVisitor.java deleted file mode 100644 index e1c3a8fa..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/AnnotationVisitor.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.Annotation; - -/** - * This interface specifies the methods for a visitor of - * Annotation objects. Note that there is only a single - * implementation of Annotation, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface AnnotationVisitor -{ - public void visitAnnotation(Clazz clazz, Annotation annotation); - public void visitAnnotation(Clazz clazz, Field field, Annotation annotation); - public void visitAnnotation(Clazz clazz, Method method, Annotation annotation); - public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation); - public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/ElementValueVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/ElementValueVisitor.java deleted file mode 100644 index 7864b213..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/ElementValueVisitor.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.annotation.*; - -/** - * This interface specifies the methods for a visitor of ElementValue - * objects. - * - * @author Eric Lafortune - */ -public interface ElementValueVisitor -{ - public void visitConstantElementValue( Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue); - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue); - public void visitClassElementValue( Clazz clazz, Annotation annotation, ClassElementValue classElementValue); - public void visitAnnotationElementValue( Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue); - public void visitArrayElementValue( Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue); - -// public void visitConstantElementValue( Clazz clazz, Field field, Annotation annotation, ConstantElementValue constantElementValue); -// public void visitEnumConstantElementValue(Clazz clazz, Field field, Annotation annotation, EnumConstantElementValue enumConstantElementValue); -// public void visitClassElementValue( Clazz clazz, Field field, Annotation annotation, ClassElementValue classElementValue); -// public void visitAnnotationElementValue( Clazz clazz, Field field, Annotation annotation, AnnotationElementValue annotationElementValue); -// public void visitArrayElementValue( Clazz clazz, Field field, Annotation annotation, ArrayElementValue arrayElementValue); -// -// public void visitConstantElementValue( Clazz clazz, Method method, Annotation annotation, ConstantElementValue constantElementValue); -// public void visitEnumConstantElementValue(Clazz clazz, Method method, Annotation annotation, EnumConstantElementValue enumConstantElementValue); -// public void visitClassElementValue( Clazz clazz, Method method, Annotation annotation, ClassElementValue classElementValue); -// public void visitAnnotationElementValue( Clazz clazz, Method method, Annotation annotation, AnnotationElementValue annotationElementValue); -// public void visitArrayElementValue( Clazz clazz, Method method, Annotation annotation, ArrayElementValue arrayElementValue); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/TypeAnnotationVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/TypeAnnotationVisitor.java deleted file mode 100644 index c7c63fa8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/TypeAnnotationVisitor.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.*; - -/** - * This interface specifies the methods for a visitor of - * TypeAnnotation instances. Note that there is only a single - * implementation of TypeAnnotation, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface TypeAnnotationVisitor -{ - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation); - public void visitTypeAnnotation(Clazz clazz, Field field, TypeAnnotation typeAnnotation); - public void visitTypeAnnotation(Clazz clazz, Method method, TypeAnnotation typeAnnotation); - public void visitTypeAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/TypePathInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/TypePathInfoVisitor.java deleted file mode 100644 index 62c04ef5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/TypePathInfoVisitor.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.annotation.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.*; - -/** - * This interface specifies the methods for a visitor of - * TypePathInfo instances. Note that there is only a single - * implementation of TypePathInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface TypePathInfoVisitor -{ - public void visitTypePathInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo); - public void visitTypePathInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo); - public void visitTypePathInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo); - public void visitTypePathInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/package.html deleted file mode 100644 index 10d06485..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/annotation/visitor/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains visitors for annotation attributes and their components. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ExportsInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ExportsInfo.java deleted file mode 100644 index 6599c278..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ExportsInfo.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * Representation of a Exports entry in a Module attribute. - * - * @author Joachim Vandersmissen - */ -public class ExportsInfo implements VisitorAccepter -{ - public int u2exportsIndex; - public int u2exportsFlags; - public int u2exportsToCount; - public int[] u2exportsToIndex; - - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized ExportsInfo. - */ - public ExportsInfo() - { - } - - - /** - * Creates an initialized ExportsInfo. - */ - public ExportsInfo(int u2exportsIndex, - int u2exportsFlags, - int u2exportsToCount, - int[] u2exportsToIndex) - { - this.u2exportsIndex = u2exportsIndex; - this.u2exportsFlags = u2exportsFlags; - this.u2exportsToCount = u2exportsToCount; - this.u2exportsToIndex = u2exportsToIndex; - } - - - /** - * Applies the given constant pool visitor to the package constant of the - * package, if any. - */ - public void packageAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2exportsIndex != 0) - { - clazz.constantPoolEntryAccept(u2exportsIndex, constantVisitor); - } - } - - - /** - * Applies the given constant pool visitor to all exportsToIndex. - */ - public void exportsToIndexAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - // Loop over all exportsToIndex. - for (int index = 0; index < u2exportsToCount; index++) - { - clazz.constantPoolEntryAccept(u2exportsToIndex[index], constantVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModuleAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModuleAttribute.java deleted file mode 100644 index 84a9efb5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModuleAttribute.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.module.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Attribute represents a module attribute. - * - * @author Joachim Vandersmissen - */ -public class ModuleAttribute extends Attribute -{ - public int u2moduleNameIndex; - public int u2moduleFlags; - public int u2moduleVersionIndex; - public int u2requiresCount; - public RequiresInfo[] requires; - public int u2exportsCount; - public ExportsInfo[] exports; - public int u2opensCount; - public OpensInfo[] opens; - public int u2usesCount; - public int[] u2uses; - public int u2providesCount; - public ProvidesInfo[] provides; - - - /** - * Creates an uninitialized ModuleAttribute. - */ - public ModuleAttribute() - { - } - - - /** - * Creates an initialized ModuleAttribute. - */ - public ModuleAttribute(int u2attributeNameIndex, - int u2moduleNameIndex, - int u2moduleFlags, - int u2moduleVersionIndex, - int u2requiresCount, - RequiresInfo[] requires, - int u2exportsCount, - ExportsInfo[] exports, - int u2opensCount, - OpensInfo[] opens, - int u2usesCount, - int[] u2uses, - int u2ProvidesCount, - ProvidesInfo[] provides) - { - super(u2attributeNameIndex); - - this.u2moduleNameIndex = u2moduleNameIndex; - this.u2moduleFlags = u2moduleFlags; - this.u2moduleVersionIndex = u2moduleVersionIndex; - this.u2requiresCount = u2requiresCount; - this.requires = requires; - this.u2exportsCount = u2exportsCount; - this.exports = exports; - this.u2opensCount = u2opensCount; - this.opens = opens; - this.u2usesCount = u2usesCount; - this.u2uses = u2uses; - this.u2providesCount = u2ProvidesCount; - this.provides = provides; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitModuleAttribute(clazz, this); - } - - - /** - * Applies the given constant pool visitor to the Utf8 constant of the name, - * if any. - */ - public void nameAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2moduleNameIndex != 0) - { - clazz.constantPoolEntryAccept(u2moduleNameIndex, constantVisitor); - } - } - - - /** - * Applies the given constant pool visitor to the Utf8 constant of the - * version, if any. - */ - public void versionAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2moduleVersionIndex != 0) - { - clazz.constantPoolEntryAccept(u2moduleVersionIndex, constantVisitor); - } - } - - - /** - * Applies the given visitor to all requires. - */ - public void requiresAccept(Clazz clazz, RequiresInfoVisitor requiresInfoVisitor) - { - for (int index = 0; index < u2requiresCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of RequiresInfo. - requiresInfoVisitor.visitRequiresInfo(clazz, requires[index]); - } - } - - - /** - * Applies the given visitor to all exports. - */ - public void exportsAccept(Clazz clazz, ExportsInfoVisitor exportsInfoVisitor) - { - for (int index = 0; index < u2exportsCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of ExportsInfo. - exportsInfoVisitor.visitExportsInfo(clazz, exports[index]); - } - } - - - /** - * Applies the given visitor to all exports. - */ - public void opensAccept(Clazz clazz, OpensInfoVisitor opensInfoVisitor) - { - for (int index = 0; index < u2opensCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of OpensInfo. - opensInfoVisitor.visitOpensInfo(clazz, opens[index]); - } - } - - - /** - * Applies the given constant pool visitor to all uses. - */ - public void usesAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - for (int index = 0; index < u2usesCount; index++) - { - clazz.constantPoolEntryAccept(u2uses[index], constantVisitor); - } - } - - - /** - * Applies the given visitor to all provides. - */ - public void providesAccept(Clazz clazz, ProvidesInfoVisitor providesInfoVisitor) - { - for (int index = 0; index < u2providesCount; index++) - { - // We don't need double dispatching here, since there is only one - // type of ProvidesInfo. - providesInfoVisitor.visitProvidesInfo(clazz, provides[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModuleMainClassAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModuleMainClassAttribute.java deleted file mode 100644 index c929c391..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModuleMainClassAttribute.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This Attribute represents a main class attribute. - * - * @author Joachim Vandersmissen - */ -public class ModuleMainClassAttribute extends Attribute -{ - public int u2mainClass; - - - /** - * Creates an uninitialized ModuleMainClassAttribute. - */ - public ModuleMainClassAttribute() - { - } - - - /** - * Creates an initialized ModuleMainClassAttribute. - */ - public ModuleMainClassAttribute(int u2attributeNameIndex, int u2mainClass) - { - super(u2attributeNameIndex); - this.u2mainClass = u2mainClass; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitModuleMainClassAttribute(clazz, this); - } - - - /** - * Applies the given constant pool visitor to the class constant of the - * main class, if any. - */ - public void mainClassAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2mainClass != 0) - { - clazz.constantPoolEntryAccept(u2mainClass, constantVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModulePackagesAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModulePackagesAttribute.java deleted file mode 100644 index 6a01f366..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ModulePackagesAttribute.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Attribute represents a module packages attribute. - * - * @author Joachim Vandersmissen - */ -public class ModulePackagesAttribute extends Attribute -{ - public int u2packagesCount; - public int[] u2packages; - - - /** - * Creates an uninitialized ModulePackagesAttribute. - */ - public ModulePackagesAttribute() - { - } - - - /** - * Creates an initialized ModulePackagesAttribute. - */ - public ModulePackagesAttribute(int u2attributeNameIndex, - int u2packagesCount, - int[] u2packages) - { - super(u2attributeNameIndex); - this.u2packagesCount = u2packagesCount; - this.u2packages = u2packages; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitModulePackagesAttribute(clazz, this); - } - - - /** - * Applies the given constant pool visitor to all packages. - */ - public void packagesAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - // Loop over all packages. - for (int index = 0; index < u2packagesCount; index++) - { - clazz.constantPoolEntryAccept(u2packages[index], constantVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/OpensInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/OpensInfo.java deleted file mode 100644 index 70eb402c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/OpensInfo.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * Representation of a Opens entry in a Module attribute. - * - * @author Joachim Vandersmissen - */ -public class OpensInfo implements VisitorAccepter -{ - public int u2opensIndex; - public int u2opensFlags; - public int u2opensToCount; - public int[] u2opensToIndex; - - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized OpensInfo. - */ - public OpensInfo() - { - } - - - /** - * Creates an initialized OpensInfo. - */ - public OpensInfo(int u2opensIndex, - int u2opensFlags, - int u2opensToCount, - int[] u2opensToIndex) - { - this.u2opensIndex = u2opensIndex; - this.u2opensFlags = u2opensFlags; - this.u2opensToCount = u2opensToCount; - this.u2opensToIndex = u2opensToIndex; - } - - - /** - * Applies the given constant pool visitor to the package constant of the - * package, if any. - */ - public void packageAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2opensIndex != 0) - { - clazz.constantPoolEntryAccept(u2opensIndex, constantVisitor); - } - } - - - /** - * Applies the given constant pool visitor to all targets. - */ - public void targetsAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - // Loop over all targets. - for (int index = 0; index < u2opensToCount; index++) - { - clazz.constantPoolEntryAccept(u2opensToIndex[index], constantVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ProvidesInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ProvidesInfo.java deleted file mode 100644 index c1a04274..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/ProvidesInfo.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * Representation of a Provides entry in a Module attribute. - * - * @author Joachim Vandersmissen - */ -public class ProvidesInfo implements VisitorAccepter -{ - public int u2providesIndex; - public int u2providesWithCount; - public int[] u2providesWithIndex; - - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized ProvidesInfo. - */ - public ProvidesInfo() - { - } - - - /** - * Creates an initialized ProvidesInfo. - */ - public ProvidesInfo(int u2providesIndex, - int u2providesWithCount, - int[] u2providesWithIndex) - { - this.u2providesIndex = u2providesIndex; - this.u2providesWithCount = u2providesWithCount; - this.u2providesWithIndex = u2providesWithIndex; - } - - - /** - * Applies the given constant pool visitor to the class constant of the - * provides, if any. - */ - public void providesAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2providesIndex != 0) - { - clazz.constantPoolEntryAccept(u2providesIndex, constantVisitor); - } - } - - - /** - * Applies the given constant pool visitor to all with entries. - */ - public void withAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - // Loop over all u2providesWithIndex entries. - for (int index = 0; index < u2providesWithCount; index++) - { - clazz.constantPoolEntryAccept(u2providesWithIndex[index], constantVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/RequiresInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/RequiresInfo.java deleted file mode 100644 index b3b86ca8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/RequiresInfo.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * Representation of a Requires entry in a Module attribute. - * - * @author Joachim Vandersmissen - */ -public class RequiresInfo implements VisitorAccepter -{ - public int u2requiresIndex; - public int u2requiresFlags; - public int u2requiresVersionIndex; - - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Creates an uninitialized RequiresInfo. - */ - public RequiresInfo() - { - } - - - /** - * Creates an uninitialized RequiresInfo. - */ - public RequiresInfo(int u2requiresIndex, - int u2requiresFlags, - int u2requiresVersionIndex) - { - this.u2requiresIndex = u2requiresIndex; - this.u2requiresFlags = u2requiresFlags; - this.u2requiresVersionIndex = u2requiresVersionIndex; - } - - - /** - * Applies the given constant pool visitor to the module constant of the - * module, if any. - */ - public void moduleAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2requiresIndex != 0) - { - clazz.constantPoolEntryAccept(u2requiresIndex, constantVisitor); - } - } - - /** - * Applies the given constant pool visitor to the Utf8 constant of the - * version, if any. - */ - public void versionAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - if (u2requiresVersionIndex != 0) - { - clazz.constantPoolEntryAccept(u2requiresVersionIndex, constantVisitor); - } - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/package.html deleted file mode 100644 index 1e5d11b0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains classes to represent the module attributes inside class -files. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllExportsInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllExportsInfoVisitor.java deleted file mode 100644 index 5eef7d90..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllExportsInfoVisitor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.module.ModuleAttribute; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given ExportsInfoVisitor visit all - * ExportsInfo objects of the ModuleAttribute objects it visits. - * - * @author Joachim Vandersmissen - */ -public class AllExportsInfoVisitor -extends SimplifiedVisitor - implements AttributeVisitor -{ - private final ExportsInfoVisitor exportsInfoVisitor; - - - public AllExportsInfoVisitor(ExportsInfoVisitor exportsInfoVisitor) - { - this.exportsInfoVisitor = exportsInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - moduleAttribute.exportsAccept(clazz, exportsInfoVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllOpensInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllOpensInfoVisitor.java deleted file mode 100644 index 65fe4f2f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllOpensInfoVisitor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.module.ModuleAttribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given OpensInfoVisitor visit all - * OpensInfo objects of the ModuleAttribute objects it visits. - * - * @author Joachim Vandersmissen - */ -public class AllOpensInfoVisitor -extends SimplifiedVisitor - implements AttributeVisitor -{ - private final OpensInfoVisitor opensInfoVisitor; - - - public AllOpensInfoVisitor(OpensInfoVisitor opensInfoVisitor) - { - this.opensInfoVisitor = opensInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - moduleAttribute.opensAccept(clazz, opensInfoVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllProvidesInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllProvidesInfoVisitor.java deleted file mode 100644 index fd7834cc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllProvidesInfoVisitor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.module.ModuleAttribute; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given ProvidesInfoVisitor visit all - * ProvidesInfo objects of the ModuleAttribute objects it visits. - * - * @author Joachim Vandersmissen - */ -public class AllProvidesInfoVisitor -extends SimplifiedVisitor - implements AttributeVisitor -{ - private final ProvidesInfoVisitor providesInfoVisitor; - - - public AllProvidesInfoVisitor(ProvidesInfoVisitor providesInfoVisitor) - { - this.providesInfoVisitor = providesInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - moduleAttribute.providesAccept(clazz, providesInfoVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllRequiresInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllRequiresInfoVisitor.java deleted file mode 100644 index 1dbe261c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/AllRequiresInfoVisitor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.module.ModuleAttribute; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given RequiresInfoVisitor visit all - * RequiresInfo objects of the ModuleAttribute objects it visits. - * - * @author Joachim Vandersmissen - */ -public class AllRequiresInfoVisitor -extends SimplifiedVisitor - implements AttributeVisitor -{ - private final RequiresInfoVisitor requiresInfoVisitor; - - - public AllRequiresInfoVisitor(RequiresInfoVisitor requiresInfoVisitor) - { - this.requiresInfoVisitor = requiresInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - moduleAttribute.requiresAccept(clazz, requiresInfoVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/ExportsInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/ExportsInfoVisitor.java deleted file mode 100644 index a57a6d4d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/ExportsInfoVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.module.ExportsInfo; - -/** - * This interface specifies the methods for a visitor of - * ExportsInfo objects. Note that there is only a single - * implementation of ExportsInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Joachim Vandersmissen - */ -public interface ExportsInfoVisitor -{ - public void visitExportsInfo(Clazz clazz, ExportsInfo exportsInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/OpensInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/OpensInfoVisitor.java deleted file mode 100644 index 551ee5ba..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/OpensInfoVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.module.*; - -/** - * This interface specifies the methods for a visitor of - * OpensInfo objects. Note that there is only a single - * implementation of OpensInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Joachim Vandersmissen - */ -public interface OpensInfoVisitor -{ - public void visitOpensInfo(Clazz clazz, OpensInfo opensInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/ProvidesInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/ProvidesInfoVisitor.java deleted file mode 100644 index 50e3e645..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/ProvidesInfoVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.module.ProvidesInfo; - -/** - * This interface specifies the methods for a visitor of - * ProvidesInfo objects. Note that there is only a single - * implementation of ProvidesInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Joachim Vandersmissen - */ -public interface ProvidesInfoVisitor -{ - public void visitProvidesInfo(Clazz clazz, ProvidesInfo providesInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/RequiresInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/RequiresInfoVisitor.java deleted file mode 100644 index 4bad50c6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/RequiresInfoVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.module.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.module.RequiresInfo; - -/** - * This interface specifies the methods for a visitor of - * RequiresInfo objects. Note that there is only a single - * implementation of RequiresInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Joachim Vandersmissen - */ -public interface RequiresInfoVisitor -{ - public void visitRequiresInfo(Clazz clazz, RequiresInfo requiresInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/package.html deleted file mode 100644 index 01537ff1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/module/visitor/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains visitors for module attributes and their components. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/package.html deleted file mode 100644 index d17caaaf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains classes to represent the attributes inside class files. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/DoubleType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/DoubleType.java deleted file mode 100644 index d76086c5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/DoubleType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a Double type. - * - * @author Eric Lafortune - */ -public class DoubleType extends VerificationType -{ - // Implementations for VerificationType. - - public int getTag() - { - return DOUBLE_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitDoubleType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackDoubleType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesDoubleType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public String toString() - { - return "d"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/FloatType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/FloatType.java deleted file mode 100644 index 8cb66a88..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/FloatType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a Float type. - * - * @author Eric Lafortune - */ -public class FloatType extends VerificationType -{ - // Implementations for VerificationType. - - public int getTag() - { - return FLOAT_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitFloatType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackFloatType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesFloatType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public String toString() - { - return "f"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/FullFrame.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/FullFrame.java deleted file mode 100644 index fe3c64f8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/FullFrame.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.*; - -/** - * This StackMapFrame represents a "full frame". - * - * @author Eric Lafortune - */ -public class FullFrame extends StackMapFrame -{ - public int variablesCount; - public VerificationType[] variables; - public int stackCount; - public VerificationType[] stack; - - - /** - * Creates an uninitialized FullFrame. - */ - public FullFrame() - { - } - - - /** - * Creates a FullFrame with the given variables and stack. - */ - public FullFrame(int offsetDelta, - VerificationType[] variables, - VerificationType[] stack) - { - this(offsetDelta, - variables.length, - variables, - stack.length, - stack); - } - - - /** - * Creates a FullFrame with the given variables and stack. - */ - public FullFrame(int offsetDelta, - int variablesCount, - VerificationType[] variables, - int stackCount, - VerificationType[] stack) - { - this.u2offsetDelta = offsetDelta; - this.variablesCount = variablesCount; - this.variables = variables; - this.stackCount = stackCount; - this.stack = stack; - } - - - /** - * Applies the given verification type visitor to all variables. - */ - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationTypeVisitor verificationTypeVisitor) - { - for (int index = 0; index < variablesCount; index++) - { - variables[index].variablesAccept(clazz, method, codeAttribute, offset, index, verificationTypeVisitor); - } - } - - - /** - * Applies the given verification type visitor to all stack. - */ - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationTypeVisitor verificationTypeVisitor) - { - for (int index = 0; index < stackCount; index++) - { - stack[index].stackAccept(clazz, method, codeAttribute, offset, index, verificationTypeVisitor); - } - } - - - // Implementations for StackMapFrame. - - public int getTag() - { - return FULL_FRAME; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrameVisitor stackMapFrameVisitor) - { - stackMapFrameVisitor.visitFullFrame(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (!super.equals(object)) - { - return false; - } - - FullFrame other = (FullFrame)object; - - if (this.u2offsetDelta != other.u2offsetDelta || - this.variablesCount != other.variablesCount || - this.stackCount != other.stackCount) - { - return false; - } - - for (int index = 0; index < variablesCount; index++) - { - VerificationType thisType = this.variables[index]; - VerificationType otherType = other.variables[index]; - - if (!thisType.equals(otherType)) - { - return false; - } - } - - for (int index = 0; index < stackCount; index++) - { - VerificationType thisType = this.stack[index]; - VerificationType otherType = other.stack[index]; - - if (!thisType.equals(otherType)) - { - return false; - } - } - - return true; - } - - - public int hashCode() - { - int hashCode = super.hashCode(); - - for (int index = 0; index < variablesCount; index++) - { - hashCode ^= variables[index].hashCode(); - } - - for (int index = 0; index < stackCount; index++) - { - hashCode ^= stack[index].hashCode(); - } - - return hashCode; - } - - - public String toString() - { - StringBuffer buffer = new StringBuffer(super.toString()).append("Var: "); - - for (int index = 0; index < variablesCount; index++) - { - buffer = buffer.append('[') - .append(variables[index].toString()) - .append(']'); - } - - buffer.append(", Stack: "); - - for (int index = 0; index < stackCount; index++) - { - buffer = buffer.append('[') - .append(stack[index].toString()) - .append(']'); - } - - return buffer.toString(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/IntegerType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/IntegerType.java deleted file mode 100644 index ebdfb4cf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/IntegerType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a Integer type. - * - * @author Eric Lafortune - */ -public class IntegerType extends VerificationType -{ - // Implementations for VerificationType. - - public int getTag() - { - return INTEGER_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitIntegerType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackIntegerType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesIntegerType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public String toString() - { - return "i"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/LessZeroFrame.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/LessZeroFrame.java deleted file mode 100644 index 055fcce1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/LessZeroFrame.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.StackMapFrameVisitor; - -/** - * This StackMapFrame represents an "chop frame". - * - * @author Eric Lafortune - */ -public class LessZeroFrame extends StackMapFrame -{ - public int choppedVariablesCount; - - - /** - * Creates an uninitialized LessZeroFrame. - */ - public LessZeroFrame() - { - } - - - /** - * Creates a LessZeroFrame with the given tag. - */ - public LessZeroFrame(int tag) - { - choppedVariablesCount = LESS_ZERO_FRAME + 3 - tag; - } - - - /** - * Creates a LessZeroFrame with the given number of chopped variables. - */ - public LessZeroFrame(byte choppedVariablesCount) - { - this.choppedVariablesCount = (int)choppedVariablesCount; - } - - - // Implementations for StackMapFrame. - - public int getTag() - { - return LESS_ZERO_FRAME + 3 - choppedVariablesCount; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrameVisitor stackMapFrameVisitor) - { - stackMapFrameVisitor.visitLessZeroFrame(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (!super.equals(object)) - { - return false; - } - - LessZeroFrame other = (LessZeroFrame)object; - - return this.u2offsetDelta == other.u2offsetDelta && - this.choppedVariablesCount != other.choppedVariablesCount; - } - - - public int hashCode() - { - return super.hashCode() ^ choppedVariablesCount; - } - - - public String toString() - { - return super.toString()+"Var: (chopped "+choppedVariablesCount+"), Stack: (empty)"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/LongType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/LongType.java deleted file mode 100644 index 5cd4ae05..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/LongType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a Long type. - * - * @author Eric Lafortune - */ -public class LongType extends VerificationType -{ - // Implementations for VerificationType. - - public int getTag() - { - return LONG_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitLongType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackLongType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesLongType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public String toString() - { - return "l"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/MoreZeroFrame.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/MoreZeroFrame.java deleted file mode 100644 index fef29c70..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/MoreZeroFrame.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.*; - -/** - * This StackMapFrame represents an "append frame". - * - * @author Eric Lafortune - */ -public class MoreZeroFrame extends StackMapFrame -{ - public int additionalVariablesCount; - public VerificationType[] additionalVariables; - - - /** - * Creates an uninitialized MoreZeroFrame. - */ - public MoreZeroFrame() - { - } - - - /** - * Creates a MoreZeroFrame with the given tag. - */ - public MoreZeroFrame(int tag) - { - additionalVariablesCount = tag + 1 - MORE_ZERO_FRAME; - } - - - /** - * Creates a MoreZeroFrame with the given additional variables. - */ - public MoreZeroFrame(VerificationType[] additionalVariables) - { - this(additionalVariables.length, additionalVariables); - } - - - /** - * Creates a MoreZeroFrame with the given additional variables. - */ - public MoreZeroFrame(int additionalVariablesCount, - VerificationType[] additionalVariables) - { - this.additionalVariablesCount = additionalVariablesCount; - this.additionalVariables = additionalVariables; - } - - - /** - * Applies the given verification type visitor to all variables. - */ - public void additionalVariablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationTypeVisitor verificationTypeVisitor) - { - for (int index = 0; index < additionalVariablesCount; index++) - { - additionalVariables[index].accept(clazz, method, codeAttribute, offset, verificationTypeVisitor); - } - } - - - // Implementations for StackMapFrame. - - public int getTag() - { - return MORE_ZERO_FRAME + additionalVariablesCount - 1; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrameVisitor stackMapFrameVisitor) - { - stackMapFrameVisitor.visitMoreZeroFrame(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (!super.equals(object)) - { - return false; - } - - MoreZeroFrame other = (MoreZeroFrame)object; - - if (this.u2offsetDelta != other.u2offsetDelta || - this.additionalVariablesCount != other.additionalVariablesCount) - { - return false; - } - - for (int index = 0; index < additionalVariablesCount; index++) - { - VerificationType thisType = this.additionalVariables[index]; - VerificationType otherType = other.additionalVariables[index]; - - if (!thisType.equals(otherType)) - { - return false; - } - } - - return true; - } - - - public int hashCode() - { - int hashCode = super.hashCode(); - - for (int index = 0; index < additionalVariablesCount; index++) - { - hashCode ^= additionalVariables[index].hashCode(); - } - - return hashCode; - } - - - public String toString() - { - StringBuffer buffer = new StringBuffer(super.toString()).append("Var: ..."); - - for (int index = 0; index < additionalVariablesCount; index++) - { - buffer = buffer.append('[') - .append(additionalVariables[index].toString()) - .append(']'); - } - - buffer.append(", Stack: (empty)"); - - return buffer.toString(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/NullType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/NullType.java deleted file mode 100644 index 658ca623..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/NullType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a Null type. - * - * @author Eric Lafortune - */ -public class NullType extends VerificationType -{ - // Implementations for VerificationType. - - public int getTag() - { - return NULL_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitNullType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackNullType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesNullType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public String toString() - { - return "n"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/ObjectType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/ObjectType.java deleted file mode 100644 index 8d6f3849..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/ObjectType.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents an Object type. - * - * @author Eric Lafortune - */ -public class ObjectType extends VerificationType -{ - public int u2classIndex; - - - - /** - * Creates an uninitialized ObjectType. - */ - public ObjectType() - { - } - - - /** - * Creates an ObjectType that points to the given class constant. - */ - public ObjectType(int u2classIndex) - { - this.u2classIndex = u2classIndex; - } - - - // Implementations for VerificationType. - - public int getTag() - { - return OBJECT_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitObjectType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackObjectType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesObjectType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (!super.equals(object)) - { - return false; - } - - ObjectType other = (ObjectType)object; - - return this.u2classIndex == other.u2classIndex; - } - - - public int hashCode() - { - return super.hashCode() ^ - u2classIndex; - } - - - public String toString() - { - return "a:" + u2classIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/SameOneFrame.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/SameOneFrame.java deleted file mode 100644 index d9f0b17e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/SameOneFrame.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.*; - -/** - * This StackMapFrame represents a "same locals 1 stack item frame" or a - * "same locals 1 stack item frame extended". - * - * @author Eric Lafortune - */ -public class SameOneFrame extends StackMapFrame -{ - public VerificationType stackItem; - - - /** - * Creates an uninitialized SameOneFrame. - */ - public SameOneFrame() - { - } - - - /** - * Creates a SameOneFrame with the given tag. - */ - public SameOneFrame(int tag) - { - u2offsetDelta = tag - SAME_ONE_FRAME; - } - - - /** - * Creates a SameOneFrame with the given stack verification type. - */ - public SameOneFrame(VerificationType stackItem) - { - this.stackItem = stackItem; - } - - - /** - * Applies the given verification type visitor to the stack item. - */ - public void stackItemAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationTypeVisitor verificationTypeVisitor) - { - stackItem.accept(clazz, method, codeAttribute, offset, verificationTypeVisitor); - } - - - // Implementations for StackMapFrame. - - public int getTag() - { - return u2offsetDelta < 64 ? - SAME_ONE_FRAME + u2offsetDelta : - SAME_ONE_FRAME_EXTENDED; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrameVisitor stackMapFrameVisitor) - { - stackMapFrameVisitor.visitSameOneFrame(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (!super.equals(object)) - { - return false; - } - - SameOneFrame other = (SameOneFrame)object; - - return this.u2offsetDelta == other.u2offsetDelta && - this.stackItem.equals(other.stackItem); - } - - - public int hashCode() - { - return super.hashCode() ^ stackItem.hashCode(); - } - - - public String toString() - { - return super.toString()+"Var: ..., Stack: ["+stackItem.toString()+"]"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/SameZeroFrame.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/SameZeroFrame.java deleted file mode 100644 index 82df6aca..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/SameZeroFrame.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.StackMapFrameVisitor; - -/** - * This StackMapFrame represents a "same frame" or a "same frame extended". - * - * @author Eric Lafortune - * @noinspection PointlessArithmeticExpression - */ -public class SameZeroFrame extends StackMapFrame -{ - /** - * Creates an uninitialized SameZeroFrame. - */ - public SameZeroFrame() - { - } - - - /** - * Creates a SameZeroFrame with the given tag. - */ - public SameZeroFrame(int tag) - { - u2offsetDelta = tag - SAME_ZERO_FRAME; - } - - - // Implementations for StackMapFrame. - - public int getTag() - { - return u2offsetDelta < 64 ? - SAME_ZERO_FRAME + u2offsetDelta : - SAME_ZERO_FRAME_EXTENDED; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrameVisitor stackMapFrameVisitor) - { - stackMapFrameVisitor.visitSameZeroFrame(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for Object. - - public String toString() - { - return super.toString()+"Var: ..., Stack: (empty)"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapAttribute.java deleted file mode 100644 index 3757c7c4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapAttribute.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.preverification.visitor.StackMapFrameVisitor; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents an exceptions attribute. - * - * @author Eric Lafortune - */ -public class StackMapAttribute extends Attribute -{ - public int u2stackMapFramesCount; - public FullFrame[] stackMapFrames; - - - /** - * Creates an uninitialized ExceptionsAttribute. - */ - public StackMapAttribute() - { - } - - - /** - * Creates a StackMapTableAttribute with the given stack map frames. - */ - public StackMapAttribute(FullFrame[] stackMapFrames) - { - this(stackMapFrames.length, stackMapFrames); - } - - - /** - * Creates a StackMapTableAttribute with the given stack map frames. - */ - public StackMapAttribute(int stackMapFramesCount, - FullFrame[] stackMapFrames) - { - this.u2stackMapFramesCount = stackMapFramesCount; - this.stackMapFrames = stackMapFrames; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, this); - } - - - /** - * Applies the given stack map frame visitor to all stack map frames. - */ - public void stackMapFramesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapFrameVisitor stackMapFrameVisitor) - { - for (int index = 0; index < u2stackMapFramesCount; index++) - { - FullFrame stackMapFrame = stackMapFrames[index]; - - // We don't need double dispatching here, since there is only one - // type of StackMapFrame. - stackMapFrameVisitor.visitFullFrame(clazz, method, codeAttribute, stackMapFrame.getOffsetDelta(), stackMapFrame); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapFrame.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapFrame.java deleted file mode 100644 index 62168fa6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapFrame.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.StackMapFrameVisitor; - -/** - * This abstract class represents a stack map frame. Specific types - * of entries are subclassed from it. - * - * @author Eric Lafortune - */ -public abstract class StackMapFrame implements VisitorAccepter -{ - public static final int SAME_ZERO_FRAME = 0; - public static final int SAME_ONE_FRAME = 64; - public static final int SAME_ONE_FRAME_EXTENDED = 247; - public static final int LESS_ZERO_FRAME = 248; - public static final int SAME_ZERO_FRAME_EXTENDED = 251; - public static final int MORE_ZERO_FRAME = 252; - public static final int FULL_FRAME = 255; - - - public int u2offsetDelta; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - - /** - * Returns the bytecode offset delta relative to the previous stack map - * frame. - */ - public int getOffsetDelta() - { - return u2offsetDelta; - } - - - // Abstract methods to be implemented by extensions. - - /** - * Returns the stack map frame tag that specifies the entry type. - */ - public abstract int getTag(); - - - /** - * Accepts the given visitor. - */ - public abstract void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrameVisitor stackMapFrameVisitor); - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - StackMapFrame other = (StackMapFrame)object; - - return this.u2offsetDelta == other.u2offsetDelta; - } - - - public int hashCode() - { - return getClass().hashCode() ^ - u2offsetDelta; - } - - - public String toString() - { - return "[" + u2offsetDelta + "] "; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapTableAttribute.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapTableAttribute.java deleted file mode 100644 index 4daf61ea..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/StackMapTableAttribute.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.preverification.visitor.StackMapFrameVisitor; -import proguard.classfile.attribute.visitor.AttributeVisitor; - -/** - * This Attribute represents a stack map table attribute. - * - * @author Eric Lafortune - */ -public class StackMapTableAttribute extends Attribute -{ - public int u2stackMapFramesCount; - public StackMapFrame[] stackMapFrames; - - - /** - * Creates an uninitialized StackMapTableAttribute. - */ - public StackMapTableAttribute() - { - } - - - /** - * Creates a StackMapTableAttribute with the given stack map frames. - */ - public StackMapTableAttribute(StackMapFrame[] stackMapFrames) - { - this(stackMapFrames.length, stackMapFrames); - } - - - /** - * Creates a StackMapTableAttribute with the given stack map frames. - */ - public StackMapTableAttribute(int stackMapFramesCount, - StackMapFrame[] stackMapFrames) - { - this.u2stackMapFramesCount = stackMapFramesCount; - this.stackMapFrames = stackMapFrames; - } - - - // Implementations for Attribute. - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) - { - attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, this); - } - - - /** - * Applies the given stack map frame visitor to all stack map frames. - */ - public void stackMapFramesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapFrameVisitor stackMapFrameVisitor) - { - int offset = 0; - - for (int index = 0; index < u2stackMapFramesCount; index++) - { - StackMapFrame stackMapFrame = stackMapFrames[index]; - - // Note that the byte code offset is computed differently for the - // first stack map frame. - offset += stackMapFrame.getOffsetDelta() + (index == 0 ? 0 : 1); - - stackMapFrame.accept(clazz, method, codeAttribute, offset, stackMapFrameVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/TopType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/TopType.java deleted file mode 100644 index 8258f275..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/TopType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a Top type. - * - * @author Eric Lafortune - */ -public class TopType extends VerificationType -{ - // Implementations for VerificationType. - - public int getTag() - { - return TOP_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitTopType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackTopType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesTopType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public String toString() - { - return "T"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/UninitializedThisType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/UninitializedThisType.java deleted file mode 100644 index c19e4391..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/UninitializedThisType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a UninitializedThis type. - * - * @author Eric Lafortune - */ -public class UninitializedThisType extends VerificationType -{ - // Implementations for VerificationType. - - public int getTag() - { - return UNINITIALIZED_THIS_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitUninitializedThisType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackUninitializedThisType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesUninitializedThisType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public String toString() - { - return "u:this"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/UninitializedType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/UninitializedType.java deleted file mode 100644 index 4cba4489..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/UninitializedType.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This VerificationType represents a Uninitialized type. - * - * @author Eric Lafortune - */ -public class UninitializedType extends VerificationType -{ - public int u2newInstructionOffset; - - - /** - * Creates an uninitialized UninitializedType. - */ - public UninitializedType() - { - } - - - /** - * Creates an UninitializedType pointing to the given 'new' instruction. - */ - public UninitializedType(int u2newInstructionOffset) - { - this.u2newInstructionOffset = u2newInstructionOffset; - } - - - // Implementations for VerificationType. - - public int getTag() - { - return UNINITIALIZED_TYPE; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitUninitializedType(clazz, method, codeAttribute, instructionOffset, this); - } - - - public void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitStackUninitializedType(clazz, method, codeAttribute, instructionOffset, stackIndex, this); - } - - - public void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor) - { - verificationTypeVisitor.visitVariablesUninitializedType(clazz, method, codeAttribute, instructionOffset, variableIndex, this); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (!super.equals(object)) - { - return false; - } - - UninitializedType other = (UninitializedType)object; - - return this.u2newInstructionOffset == other.u2newInstructionOffset; - } - - - public int hashCode() - { - return super.hashCode() ^ - u2newInstructionOffset; - } - - - public String toString() - { - return "u:" + u2newInstructionOffset; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/VerificationType.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/VerificationType.java deleted file mode 100644 index fcf977ef..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/VerificationType.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.visitor.VerificationTypeVisitor; - -/** - * This abstract class represents a verification type of a local variable or - * a stack element. Specific verification types are subclassed from it. - * - * @author Eric Lafortune - */ -public abstract class VerificationType implements VisitorAccepter -{ - public static final int TOP_TYPE = 0; - public static final int INTEGER_TYPE = 1; - public static final int FLOAT_TYPE = 2; - public static final int DOUBLE_TYPE = 3; - public static final int LONG_TYPE = 4; - public static final int NULL_TYPE = 5; - public static final int UNINITIALIZED_THIS_TYPE = 6; - public static final int OBJECT_TYPE = 7; - public static final int UNINITIALIZED_TYPE = 8; - - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - /** - * Returns the tag of the verification type. - */ - public abstract int getTag(); - - - /** - * Accepts the given visitor in the context of a method's code, either on - * a stack or as a variable. - */ - public abstract void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, VerificationTypeVisitor verificationTypeVisitor); - - - /** - * Accepts the given visitor in the context of a stack in a method's code . - */ - public abstract void stackAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int stackIndex, VerificationTypeVisitor verificationTypeVisitor); - - - /** - * Accepts the given visitor in the context of a variable in a method's code. - */ - public abstract void variablesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, int instructionOffset, int variableIndex, VerificationTypeVisitor verificationTypeVisitor); - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/VerificationTypeFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/VerificationTypeFactory.java deleted file mode 100644 index 4e142d42..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/VerificationTypeFactory.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification; - -/** - * This class provides methods to create and reuse IntegerType objects. - * - * @author Eric Lafortune - */ -public class VerificationTypeFactory -{ - // Shared copies of Type objects, to avoid creating a lot of objects. - static final IntegerType INTEGER_TYPE = new IntegerType(); - static final LongType LONG_TYPE = new LongType(); - static final FloatType FLOAT_TYPE = new FloatType(); - static final DoubleType DOUBLE_TYPE = new DoubleType(); - static final TopType TOP_TYPE = new TopType(); - static final NullType NULL_TYPE = new NullType(); - static final UninitializedThisType UNINITIALIZED_THIS_TYPE = new UninitializedThisType(); - - - /** - * Creates a new IntegerType. - */ - public static IntegerType createIntegerType() - { - return INTEGER_TYPE; - } - - /** - * Creates a new LongType. - */ - public static LongType createLongType() - { - return LONG_TYPE; - } - - /** - * Creates a new FloatType. - */ - public static FloatType createFloatType() - { - return FLOAT_TYPE; - } - - /** - * Creates a new DoubleType. - */ - public static DoubleType createDoubleType() - { - return DOUBLE_TYPE; - } - - /** - * Creates a new TopType. - */ - public static TopType createTopType() - { - return TOP_TYPE; - } - - /** - * Creates a new NullType. - */ - public static NullType createNullType() - { - return NULL_TYPE; - } - - /** - * Creates a new UninitializedThisType. - */ - public static UninitializedThisType createUninitializedThisType() - { - return UNINITIALIZED_THIS_TYPE; - } - - /** - * Creates a new UninitializedType for an instance that was created at - * the given offset. - */ - public static UninitializedType createUninitializedType(int newInstructionOffset) - { - return new UninitializedType(newInstructionOffset); - } - - /** - * Creates a new ObjectType of the given type. - */ - public static ObjectType createObjectType(int classIndex) - { - return new ObjectType(classIndex); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/visitor/StackMapFrameVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/visitor/StackMapFrameVisitor.java deleted file mode 100644 index cd98800d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/visitor/StackMapFrameVisitor.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.*; - -/** - * This interface specifies the methods for a visitor of - * StackMapFrame objects. - * - * @author Eric Lafortune - */ -public interface StackMapFrameVisitor -{ - public void visitSameZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameZeroFrame sameZeroFrame); - public void visitSameOneFrame( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame); - public void visitLessZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LessZeroFrame lessZeroFrame); - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame); - public void visitFullFrame( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/visitor/VerificationTypeVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/visitor/VerificationTypeVisitor.java deleted file mode 100644 index dab527fa..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/preverification/visitor/VerificationTypeVisitor.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.preverification.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.preverification.*; - -/** - * This interface specifies the methods for a visitor of - * VerificationType objects. There a methods for stack entries - * and methods for variable entries. - * - * @author Eric Lafortune - */ -public interface VerificationTypeVisitor -{ - public void visitIntegerType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, IntegerType integerType); - public void visitFloatType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FloatType floatType); - public void visitLongType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LongType longType); - public void visitDoubleType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, DoubleType doubleType); - public void visitTopType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TopType topType); - public void visitObjectType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType); - public void visitNullType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, NullType nullType); - public void visitUninitializedType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType); - public void visitUninitializedThisType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedThisType uninitializedThisType); - - public void visitStackIntegerType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, IntegerType integerType); - public void visitStackFloatType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, FloatType floatType); - public void visitStackLongType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, LongType longType); - public void visitStackDoubleType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, DoubleType doubleType); - public void visitStackTopType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, TopType topType); - public void visitStackObjectType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, ObjectType objectType); - public void visitStackNullType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, NullType nullType); - public void visitStackUninitializedType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedType uninitializedType); - public void visitStackUninitializedThisType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedThisType uninitializedThisType); - - public void visitVariablesIntegerType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, IntegerType integerType); - public void visitVariablesFloatType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, FloatType floatType); - public void visitVariablesLongType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, LongType longType); - public void visitVariablesDoubleType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, DoubleType doubleType); - public void visitVariablesTopType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, TopType topType); - public void visitVariablesObjectType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, ObjectType objectType); - public void visitVariablesNullType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, NullType nullType); - public void visitVariablesUninitializedType( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedType uninitializedType); - public void visitVariablesUninitializedThisType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedThisType uninitializedThisType); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllAttributeVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllAttributeVisitor.java deleted file mode 100644 index 4e8b6270..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllAttributeVisitor.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor, MemberVisitor, and AttributeVisitor lets a given - * AttributeVisitor visit all Attribute objects of the program classes, - * program class members, or code attributes, respectively, that it visits. - * - * @author Eric Lafortune - */ -public class AllAttributeVisitor -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - private final boolean deep; - private final AttributeVisitor attributeVisitor; - - - /** - * Creates a new shallow AllAttributeVisitor. - * @param attributeVisitor the AttributeVisitor to which visits will be - * delegated. - */ - public AllAttributeVisitor(AttributeVisitor attributeVisitor) - { - this(false, attributeVisitor); - } - - - /** - * Creates a new optionally deep AllAttributeVisitor. - * @param deep specifies whether the attributes contained - * further down the class structure should be - * visited too. - * @param attributeVisitor the AttributeVisitor to which visits will be - * delegated. - */ - public AllAttributeVisitor(boolean deep, - AttributeVisitor attributeVisitor) - { - this.deep = deep; - this.attributeVisitor = attributeVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.attributesAccept(attributeVisitor); - - // Visit the attributes further down the class structure, if required. - if (deep) - { - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - programClass.attributesAccept(this); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - programMember.attributesAccept(programClass, attributeVisitor); - - // Visit the attributes further down the member structure, if required. - if (deep) - { - programMember.attributesAccept(programClass, this); - } - } - - - public void visitLibraryMember(LibraryClass programClass, LibraryMember programMember) {} - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.attributesAccept(clazz, method, attributeVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllBootstrapMethodInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllBootstrapMethodInfoVisitor.java deleted file mode 100644 index e97510de..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllBootstrapMethodInfoVisitor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given BootstrapMethodInfoVisitor visit all - * bootstrap method objects of the BootstrapMethodsAttribute objects it visits. - * - * @author Eric Lafortune - */ -public class AllBootstrapMethodInfoVisitor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final BootstrapMethodInfoVisitor bootstrapMethodInfoVisitor; - - - public AllBootstrapMethodInfoVisitor(BootstrapMethodInfoVisitor bootstrapMethodInfoVisitor) - { - this.bootstrapMethodInfoVisitor = bootstrapMethodInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - bootstrapMethodsAttribute.bootstrapMethodEntriesAccept(clazz, bootstrapMethodInfoVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllExceptionInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllExceptionInfoVisitor.java deleted file mode 100644 index 6bfff5f9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllExceptionInfoVisitor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given ExceptionInfoVisitor visit all exceptions - * objects of the CodeAttribute objects it visits. - * - * @author Eric Lafortune - */ -public class AllExceptionInfoVisitor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final ExceptionInfoVisitor exceptionInfoVisitor; - - - public AllExceptionInfoVisitor(ExceptionInfoVisitor exceptionInfoVisitor) - { - this.exceptionInfoVisitor = exceptionInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.exceptionsAccept(clazz, method, exceptionInfoVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllInnerClassesInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllInnerClassesInfoVisitor.java deleted file mode 100644 index c31195ff..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllInnerClassesInfoVisitor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given InnerClassesInfoVisitor visit all - * InnerClassessInfo objects of the InnerClassesAttribute objects it visits. - * - * @author Eric Lafortune - */ -public class AllInnerClassesInfoVisitor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final InnerClassesInfoVisitor innerClassesInfoVisitor; - - - public AllInnerClassesInfoVisitor(InnerClassesInfoVisitor innerClassesInfoVisitor) - { - this.innerClassesInfoVisitor = innerClassesInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - innerClassesAttribute.innerClassEntriesAccept(clazz, innerClassesInfoVisitor); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllLineNumberInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllLineNumberInfoVisitor.java deleted file mode 100644 index df128813..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AllLineNumberInfoVisitor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given LineNumberInfoVisitor visit all line numbers - * of the LineNumberTableAttribute objects it visits. - * - * @author Eric Lafortune - */ -public class AllLineNumberInfoVisitor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final LineNumberInfoVisitor lineNumberInfoVisitor; - - - public AllLineNumberInfoVisitor(LineNumberInfoVisitor lineNumberInfoVisitor) - { - this.lineNumberInfoVisitor = lineNumberInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, lineNumberInfoVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeCounter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeCounter.java deleted file mode 100644 index febdccd0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeCounter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.util.Counter; - -/** - * This AttributeVisitor counts the number of attributes that have been visited. - * - * @author Thomas Neidhart - */ -public class AttributeCounter -extends SimplifiedVisitor -implements AttributeVisitor, - Counter -{ - private int count; - - - // Implementations for Counter. - - /** - * Returns the number of class members that has been visited so far. - */ - public int getCount() - { - return count; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - count++; - } - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeNameFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeNameFilter.java deleted file mode 100644 index 81f61f9e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeNameFilter.java +++ /dev/null @@ -1,495 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; -import proguard.util.*; - -import java.util.List; - -/** - * This AttributeVisitor delegates its visits another AttributeVisitor, but - * only when the visited attribute has a name that that matches a given regular - * expression. - * - * @author Eric Lafortune - */ -public class AttributeNameFilter -implements AttributeVisitor -{ - private final StringMatcher regularExpressionMatcher; - private final AttributeVisitor attributeVisitor; - - - /** - * Creates a new AttributeNameFilter. - * @param regularExpression the regular expression against which attribute - * names will be matched. - * @param attributeVisitor the AttributeVisitor to which - * visits will be delegated. - */ - public AttributeNameFilter(String regularExpression, - AttributeVisitor attributeVisitor) - { - this(new ListParser(new NameParser()).parse(regularExpression), - attributeVisitor); - } - - - /** - * Creates a new AttributeNameFilter. - * @param regularExpression the regular expression against which attribute - * names will be matched. - * @param attributeVisitor the AttributeVisitor to which - * visits will be delegated. - */ - public AttributeNameFilter(List regularExpression, - AttributeVisitor attributeVisitor) - { - this(new ListParser(new NameParser()).parse(regularExpression), - attributeVisitor); - } - - - /** - * Creates a new AttributeNameFilter. - * @param regularExpressionMatcher the string matcher against which - * attribute names will be matched. - * @param attributeVisitor the AttributeVisitor to - * which visits will be delegated. - */ - public AttributeNameFilter(StringMatcher regularExpressionMatcher, - AttributeVisitor attributeVisitor) - { - this.regularExpressionMatcher = regularExpressionMatcher; - this.attributeVisitor = attributeVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - if (accepted(clazz, unknownAttribute)) - { - attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); - } - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - if (accepted(clazz, bootstrapMethodsAttribute)) - { - attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); - } - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - if (accepted(clazz, sourceFileAttribute)) - { - attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); - } - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - if (accepted(clazz, sourceDirAttribute)) - { - attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); - } - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - if (accepted(clazz, innerClassesAttribute)) - { - attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); - } - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - if (accepted(clazz, enclosingMethodAttribute)) - { - attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); - } - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - if (accepted(clazz, moduleAttribute)) - { - attributeVisitor.visitModuleAttribute(clazz, moduleAttribute); - } - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - if (accepted(clazz, moduleMainClassAttribute)) - { - attributeVisitor.visitModuleMainClassAttribute(clazz, moduleMainClassAttribute); - } - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - if (accepted(clazz, modulePackagesAttribute)) - { - attributeVisitor.visitModulePackagesAttribute(clazz, modulePackagesAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - if (accepted(clazz, deprecatedAttribute)) - { - attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) - { - if (accepted(clazz, deprecatedAttribute)) - { - attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) - { - if (accepted(clazz, deprecatedAttribute)) - { - attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - if (accepted(clazz, syntheticAttribute)) - { - attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) - { - if (accepted(clazz, syntheticAttribute)) - { - attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) - { - if (accepted(clazz, syntheticAttribute)) - { - attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - if (accepted(clazz, signatureAttribute)) - { - attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) - { - if (accepted(clazz, signatureAttribute)) - { - attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) - { - if (accepted(clazz, signatureAttribute)) - { - attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute); - } - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - if (accepted(clazz, constantValueAttribute)) - { - attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); - } - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute) - { - if (accepted(clazz, exceptionsAttribute)) - { - attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute); - } - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - if (accepted(clazz, exceptionsAttribute)) - { - attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (accepted(clazz, codeAttribute)) - { - attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); - } - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - if (accepted(clazz, stackMapAttribute)) - { - attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); - } - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - if (accepted(clazz, stackMapTableAttribute)) - { - attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); - } - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - if (accepted(clazz, lineNumberTableAttribute)) - { - attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); - } - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - if (accepted(clazz, localVariableTableAttribute)) - { - attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - if (accepted(clazz, localVariableTypeTableAttribute)) - { - attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleParameterAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleParameterAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - if (accepted(clazz, annotationDefaultAttribute)) - { - attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); - } - } - - - // Small utility methods. - - private boolean accepted(Clazz clazz, Attribute attribute) - { - return regularExpressionMatcher.matches(attribute.getAttributeName(clazz)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeToClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeToClassVisitor.java deleted file mode 100644 index 6f1087f1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeToClassVisitor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This AttributeVisitor delegates to a given ClassVisitor. - * - * @author Eric Lafortune - */ -public class AttributeToClassVisitor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new AttributeToClassVisitor. - */ - public AttributeToClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - clazz.accept(classVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeVisitor.java deleted file mode 100644 index e2c1c381..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/AttributeVisitor.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; - -/** - * This interface specifies the methods for a visitor of Attribute - * objects. - * - * @author Eric Lafortune - */ -public interface AttributeVisitor -{ - // Attributes that are attached to classes. - - public void visitUnknownAttribute( Clazz clazz, UnknownAttribute unknownAttribute); - public void visitBootstrapMethodsAttribute( Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute); - public void visitSourceFileAttribute( Clazz clazz, SourceFileAttribute sourceFileAttribute); - public void visitSourceDirAttribute( Clazz clazz, SourceDirAttribute sourceDirAttribute); - public void visitInnerClassesAttribute( Clazz clazz, InnerClassesAttribute innerClassesAttribute); - public void visitEnclosingMethodAttribute( Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute); - public void visitModuleAttribute( Clazz clazz, ModuleAttribute moduleAttribute); - public void visitModuleMainClassAttribute( Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute); - public void visitModulePackagesAttribute( Clazz clazz, ModulePackagesAttribute modulePackagesAttribute); - public void visitDeprecatedAttribute( Clazz clazz, DeprecatedAttribute deprecatedAttribute); - public void visitDeprecatedAttribute( Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute); - public void visitDeprecatedAttribute( Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute); - - public void visitSyntheticAttribute( Clazz clazz, SyntheticAttribute syntheticAttribute); - public void visitSyntheticAttribute( Clazz clazz, Field field, SyntheticAttribute syntheticAttribute); - public void visitSyntheticAttribute( Clazz clazz, Method method, SyntheticAttribute syntheticAttribute); - - public void visitSignatureAttribute( Clazz clazz, SignatureAttribute signatureAttribute); - public void visitSignatureAttribute( Clazz clazz, Field field, SignatureAttribute signatureAttribute); - public void visitSignatureAttribute( Clazz clazz, Method method, SignatureAttribute signatureAttribute); - - // Attributes that are attached to fields. - - public void visitConstantValueAttribute( Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute); - - // Attributes that are attached to methods. - - public void visitMethodParametersAttribute( Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute); - public void visitExceptionsAttribute( Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute); - public void visitCodeAttribute( Clazz clazz, Method method, CodeAttribute codeAttribute); - - // Attributes that are attached to code attributes. - - public void visitStackMapAttribute( Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute); - public void visitStackMapTableAttribute( Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute); - public void visitLineNumberTableAttribute( Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute); - public void visitLocalVariableTableAttribute( Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute); - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute); - - // Annotation attributes. - - public void visitRuntimeVisibleAnnotationsAttribute( Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute); - public void visitRuntimeVisibleAnnotationsAttribute( Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute); - public void visitRuntimeVisibleAnnotationsAttribute( Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute); - - public void visitRuntimeInvisibleAnnotationsAttribute( Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute); - public void visitRuntimeInvisibleAnnotationsAttribute( Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute); - public void visitRuntimeInvisibleAnnotationsAttribute( Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute); - - public void visitRuntimeVisibleParameterAnnotationsAttribute( Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute); - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute); - - public void visitRuntimeVisibleTypeAnnotationsAttribute( Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute); - public void visitRuntimeVisibleTypeAnnotationsAttribute( Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute); - public void visitRuntimeVisibleTypeAnnotationsAttribute( Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute); - public void visitRuntimeVisibleTypeAnnotationsAttribute( Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute); - - public void visitRuntimeInvisibleTypeAnnotationsAttribute( Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute); - public void visitRuntimeInvisibleTypeAnnotationsAttribute( Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute); - public void visitRuntimeInvisibleTypeAnnotationsAttribute( Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute); - public void visitRuntimeInvisibleTypeAnnotationsAttribute( Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute); - - public void visitAnnotationDefaultAttribute( Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute); -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/BootstrapMethodInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/BootstrapMethodInfoVisitor.java deleted file mode 100644 index d7a63a59..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/BootstrapMethodInfoVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.BootstrapMethodInfo; - -/** - * This interface specifies the methods for a visitor of - * BootstrapMethodInfo objects. Note that there is only a single - * implementation of BootstrapMethodInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface BootstrapMethodInfoVisitor -{ - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/DebugAttributeVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/DebugAttributeVisitor.java deleted file mode 100644 index d6e198a2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/DebugAttributeVisitor.java +++ /dev/null @@ -1,591 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.visitor.SimpleClassPrinter; - -/** - * This AttributeVisitor delegates to a given AttributeVisitor, timing the - * invocations and printing out warnings when the timings exceed a given - * threshold. - * - * @author Eric Lafortune - */ -public class DebugAttributeVisitor -implements AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = System.getProperty("dav") != null; - //*/ - - - private final String message; - private final long maximumTime; - private final AttributeVisitor attributeVisitor; - - - /** - * Creates a new DebugAttributeVisitor. - * @param attributeVisitor the AttributeVisitor to which visits will be - * delegated. - */ - public DebugAttributeVisitor(AttributeVisitor attributeVisitor) - { - this(attributeVisitor.getClass().getName(), - attributeVisitor); - } - - - /** - * Creates a new DebugAttributeVisitor. - * @param message the message to be printed when the maximum - * invocation time is exceeded. - * @param attributeVisitor the AttributeVisitor to which visits will be - * delegated. - */ - public DebugAttributeVisitor(String message, - AttributeVisitor attributeVisitor) - { - this(message, - 10000L, - attributeVisitor); - } - - - /** - * Creates a new DebugAttributeVisitor. - * @param message the message to be printed when the maximum - * invocation time is exceeded. - * @param maximumTime the maximum invocation time. - * @param attributeVisitor the AttributeVisitor to which visits will be - * delegated. - */ - public DebugAttributeVisitor(String message, - long maximumTime, - AttributeVisitor attributeVisitor) - { - String debugTime = System.getProperty("debug.time"); - - this.message = message; - this.maximumTime = debugTime != null ? Long.valueOf(debugTime) : maximumTime; - this.attributeVisitor = attributeVisitor; - } - - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); - - checkTime(clazz, unknownAttribute, startTime); - } - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); - - checkTime(clazz, bootstrapMethodsAttribute, startTime); - } - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); - - checkTime(clazz, sourceFileAttribute, startTime); - } - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); - - checkTime(clazz, sourceDirAttribute, startTime); - } - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); - - checkTime(clazz, innerClassesAttribute, startTime); - } - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); - - checkTime(clazz, enclosingMethodAttribute, startTime); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitModuleAttribute(clazz, moduleAttribute); - - checkTime(clazz, moduleAttribute, startTime); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitModuleMainClassAttribute(clazz, moduleMainClassAttribute); - - checkTime(clazz, moduleMainClassAttribute, startTime); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitModulePackagesAttribute(clazz, modulePackagesAttribute); - - checkTime(clazz, modulePackagesAttribute, startTime); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); - - checkTime(clazz, deprecatedAttribute, startTime); - } - - public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); - - checkTime(clazz, field, deprecatedAttribute, startTime); - } - - public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); - - checkTime(clazz, method, deprecatedAttribute, startTime); - } - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); - - checkTime(clazz, syntheticAttribute, startTime); - } - - public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); - - checkTime(clazz, field, syntheticAttribute, startTime); - } - - public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); - - checkTime(clazz, method, syntheticAttribute, startTime); - } - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute); - - checkTime(clazz, signatureAttribute, startTime); - } - - public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute); - - checkTime(clazz, field, signatureAttribute, startTime); - } - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute); - - checkTime(clazz, method, signatureAttribute, startTime); - } - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); - - checkTime(clazz, field, constantValueAttribute, startTime); - } - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitMethodParametersAttribute(clazz, method, methodParametersAttribute); - - checkTime(clazz, method, methodParametersAttribute, startTime); - } - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); - - checkTime(clazz, method, exceptionsAttribute, startTime); - } - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); - - checkTime(clazz, method, codeAttribute, startTime); - } - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); - - checkTime(clazz, method, codeAttribute, startTime); - } - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); - - checkTime(clazz, method, codeAttribute, startTime); - } - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); - - checkTime(clazz, method, codeAttribute, startTime); - } - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); - - checkTime(clazz, method, codeAttribute, startTime); - } - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); - - checkTime(clazz, method, codeAttribute, startTime); - } - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - - checkTime(clazz, runtimeVisibleAnnotationsAttribute, startTime); - } - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); - - checkTime(clazz, field, runtimeVisibleAnnotationsAttribute, startTime); - } - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); - - checkTime(clazz, method, runtimeVisibleAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - - checkTime(clazz, runtimeInvisibleAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); - - checkTime(clazz, field, runtimeInvisibleAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); - - checkTime(clazz, method, runtimeInvisibleAnnotationsAttribute, startTime); - } - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); - - checkTime(clazz, method, runtimeVisibleParameterAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); - - checkTime(clazz, method, runtimeInvisibleParameterAnnotationsAttribute, startTime); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - - checkTime(clazz, runtimeVisibleTypeAnnotationsAttribute, startTime); - } - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); - - checkTime(clazz, field, runtimeVisibleTypeAnnotationsAttribute, startTime); - } - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); - - checkTime(clazz, method, runtimeVisibleTypeAnnotationsAttribute, startTime); - } - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); - - checkTime(clazz, method, runtimeVisibleTypeAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - - checkTime(clazz, runtimeInvisibleTypeAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); - - checkTime(clazz, field, runtimeInvisibleTypeAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); - - checkTime(clazz, method, runtimeInvisibleTypeAnnotationsAttribute, startTime); - } - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); - - checkTime(clazz, method, runtimeInvisibleTypeAnnotationsAttribute, startTime); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - long startTime = startTime(); - - attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); - - checkTime(clazz, method, annotationDefaultAttribute, startTime); - } - - - // Small utility methods. - - /** - * Returns the current time. - */ - private long startTime() - { - return DEBUG ? System.currentTimeMillis() : 0L; - } - - - /** - * Checks the time after having visited the given attribute, and prints - * out a message if necessary. - */ - private void checkTime(Clazz clazz, - Attribute attribute, - long startTime) - { - if (DEBUG) - { - long endTime = startTime(); - - long deltaTime = endTime - startTime; - - if (deltaTime > maximumTime) - { - System.err.println("=== " + message + " took "+((double)deltaTime/1000.)+" seconds ==="); - //attribute.accept(clazz, new ClassPrinter()); - System.err.println(); - } - } - } - - - /** - * Checks the time after having visited the given attribute, and prints - * out a message if necessary. - */ - private void checkTime(Clazz clazz, - Field field, - Attribute attribute, - long startTime) - { - if (DEBUG) - { - long endTime = startTime(); - - long deltaTime = endTime - startTime; - - if (deltaTime > maximumTime) - { - System.err.println("=== " + message + " took "+((double)deltaTime/1000.)+" seconds ==="); - field.accept(clazz, new SimpleClassPrinter(true)); - System.err.println(); - } - } - } - - - /** - * Checks the time after having visited the given attribute, and prints - * out a message if necessary. - */ - private void checkTime(Clazz clazz, - Method method, - Attribute attribute, - long startTime) - { - if (DEBUG) - { - long endTime = startTime(); - - long deltaTime = endTime - startTime; - - if (deltaTime > maximumTime) - { - System.err.println("=== " + message + " took "+((double)deltaTime/1000.)+" seconds ==="); - method.accept(clazz, new SimpleClassPrinter(true)); - System.err.println(); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/ExceptionInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/ExceptionInfoVisitor.java deleted file mode 100644 index 80bbb7ce..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/ExceptionInfoVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; - -/** - * This interface specifies the methods for a visitor of - * ExceptionInfo objects. Note that there is only a single - * implementation of ExceptionInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface ExceptionInfoVisitor -{ - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/InnerClassesInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/InnerClassesInfoVisitor.java deleted file mode 100644 index 49dfc75c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/InnerClassesInfoVisitor.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.InnerClassesInfo; - - -/** - * This interface specifies the methods for a visitor of - * InnerClassesInfo objects. Note that there is only a single - * implementation of InnerClassesInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface InnerClassesInfoVisitor -{ - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/InstructionToAttributeVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/InstructionToAttributeVisitor.java deleted file mode 100644 index c2b80c79..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/InstructionToAttributeVisitor.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor delegates to a given AttributeVisitor. - * - * @author Johan Leys - */ -public class InstructionToAttributeVisitor -extends SimplifiedVisitor -implements InstructionVisitor -{ - private final AttributeVisitor attributeVisitor; - - - /** - * Creates a new InstructionToAttributeVisitor. - */ - public InstructionToAttributeVisitor(AttributeVisitor attributeVisitor) - { - this.attributeVisitor = attributeVisitor; - } - - - // Implementations for InstructionVisitor. - - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - codeAttribute.accept(clazz, method, attributeVisitor); - } -} - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LineNumberInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LineNumberInfoVisitor.java deleted file mode 100644 index 323cf193..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LineNumberInfoVisitor.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; - - -/** - * This interface specifies the methods for a visitor of - * LineNumberInfo objects. Note that there is only a single - * implementation of LineNumberInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface LineNumberInfoVisitor -{ - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LineNumberRangeFinder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LineNumberRangeFinder.java deleted file mode 100644 index e7ebc243..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LineNumberRangeFinder.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; - -/** - * This LineNumberInfoVisitor remembers the lowest and the highest line - * numbers that it finds in all the line numbers that it visits. It - * ignores the sources of the line numbers. - */ -public class LineNumberRangeFinder -implements LineNumberInfoVisitor -{ - private int lowestLineNumber = Integer.MAX_VALUE; - private int highestLineNumber = 0; - private boolean hasSource; - - - /** - * Returns the lowest line number that has been visited so far. - */ - public int getLowestLineNumber() - { - return lowestLineNumber; - } - - - /** - * Returns the highest line number that has been visited so far. - */ - public int getHighestLineNumber() - { - return highestLineNumber; - } - - - /** - * Returns whether any of the visited line numbers has a non-null source. - */ - public boolean hasSource() - { - return hasSource; - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - int lineNumber = lineNumberInfo.u2lineNumber; - - // Remember the lowest line number. - if (lowestLineNumber > lineNumber) - { - lowestLineNumber = lineNumber; - } - - // Remember the highest line number. - if (highestLineNumber < lineNumber) - { - highestLineNumber = lineNumber; - } - - if (lineNumberInfo.getSource() != null) - { - hasSource = true; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LocalVariableInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LocalVariableInfoVisitor.java deleted file mode 100644 index 96c4d81a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LocalVariableInfoVisitor.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; - - -/** - * This interface specifies the methods for a visitor of - * LocalVariableInfo objects. Note that there is only a single - * implementation of LocalVariableInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface LocalVariableInfoVisitor -{ - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LocalVariableTypeInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LocalVariableTypeInfoVisitor.java deleted file mode 100644 index 07b25183..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/LocalVariableTypeInfoVisitor.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; - - -/** - * This interface specifies the methods for a visitor of - * LocalVariableTypeInfo objects. Note that there is only a single - * implementation of LocalVariableTypeInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface LocalVariableTypeInfoVisitor -{ - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/MultiAttributeVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/MultiAttributeVisitor.java deleted file mode 100644 index 58bef799..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/MultiAttributeVisitor.java +++ /dev/null @@ -1,461 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; -import proguard.util.ArrayUtil; - -/** - * This AttributeVisitor delegates all visits to each AttributeVisitor - * in a given list. - * - * @author Eric Lafortune - */ -public class MultiAttributeVisitor implements AttributeVisitor -{ - private AttributeVisitor[] attributeVisitors; - private int attributeVisitorCount; - - - public MultiAttributeVisitor() - { - this.attributeVisitors = new AttributeVisitor[16]; - } - - - public MultiAttributeVisitor(AttributeVisitor... attributeVisitors) - { - this.attributeVisitors = attributeVisitors; - this.attributeVisitorCount = attributeVisitors.length; - } - - - public void addAttributeVisitor(AttributeVisitor attributeVisitor) - { - attributeVisitors = - ArrayUtil.add(attributeVisitors, - attributeVisitorCount++, - attributeVisitor); - } - - - // Implementations for AttributeVisitor. - - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitUnknownAttribute(clazz, unknownAttribute); - } - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); - } - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSourceFileAttribute(clazz, sourceFileAttribute); - } - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSourceDirAttribute(clazz, sourceDirAttribute); - } - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitInnerClassesAttribute(clazz, innerClassesAttribute); - } - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); - } - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitModuleAttribute(clazz, moduleAttribute); - } - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitModuleMainClassAttribute(clazz, moduleMainClassAttribute); - } - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitModulePackagesAttribute(clazz, modulePackagesAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitDeprecatedAttribute(clazz, deprecatedAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSyntheticAttribute(clazz, syntheticAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute syntheticAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSignatureAttribute(clazz, syntheticAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitDeprecatedAttribute(clazz, field, deprecatedAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSyntheticAttribute(clazz, field, syntheticAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute syntheticAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSignatureAttribute(clazz, field, syntheticAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitDeprecatedAttribute(clazz, method, deprecatedAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSyntheticAttribute(clazz, method, syntheticAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute syntheticAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitSignatureAttribute(clazz, method, syntheticAttribute); - } - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitConstantValueAttribute(clazz, field, constantValueAttribute); - } - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitMethodParametersAttribute(clazz, method, methodParametersAttribute); - } - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitExceptionsAttribute(clazz, method, exceptionsAttribute); - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitCodeAttribute(clazz, method, codeAttribute); - } - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); - } - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); - } - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); - } - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - for (int index = 0; index < attributeVisitors.length; index++) - { - attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - for (int index = 0; index < attributeVisitorCount; index++) - { - attributeVisitors[index].visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/NonEmptyAttributeFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/NonEmptyAttributeFilter.java deleted file mode 100644 index d04f3ca1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/NonEmptyAttributeFilter.java +++ /dev/null @@ -1,402 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; - -/** - * This AttributeVisitor delegates its visits another AttributeVisitor, but - * only when the visited attribute is not empty. For instance, a local variable - * table without variables is empty. - * - * @author Eric Lafortune - */ -public class NonEmptyAttributeFilter -implements AttributeVisitor -{ - private final AttributeVisitor attributeVisitor; - - - /** - * Creates a new NonEmptyAttributeFilter. - * @param attributeVisitor the AttributeVisitor to which - * visits will be delegated. - */ - public NonEmptyAttributeFilter(AttributeVisitor attributeVisitor) - { - this.attributeVisitor = attributeVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - if (bootstrapMethodsAttribute.u2bootstrapMethodsCount > 0) - { - attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); - } - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - if (innerClassesAttribute.u2classesCount > 0) - { - attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); - } - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - if (moduleAttribute.u2requiresCount > 0 || - moduleAttribute.u2exportsCount > 0 || - moduleAttribute.u2opensCount > 0 || - moduleAttribute.u2usesCount > 0 || - moduleAttribute.u2providesCount > 0) - { - attributeVisitor.visitModuleAttribute(clazz, moduleAttribute); - } - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - attributeVisitor.visitModuleMainClassAttribute(clazz, moduleMainClassAttribute); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - if (modulePackagesAttribute.u2packagesCount > 0) - { - attributeVisitor.visitModulePackagesAttribute(clazz, modulePackagesAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) - { - attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) - { - attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) - { - attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) - { - attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) - { - attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) - { - attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute) - { - if (exceptionsAttribute.u1parametersCount > 0) - { - attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute); - } - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - if (exceptionsAttribute.u2exceptionIndexTableLength > 0) - { - attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - if (stackMapAttribute.u2stackMapFramesCount > 0) - { - attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); - } - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - if (stackMapTableAttribute.u2stackMapFramesCount > 0) - { - attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); - } - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - if (lineNumberTableAttribute.u2lineNumberTableLength > 0) - { - attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); - } - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - if (localVariableTableAttribute.u2localVariableTableLength > 0) - { - attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - if (localVariableTypeTableAttribute.u2localVariableTypeTableLength > 0) - { - attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - if (runtimeVisibleParameterAnnotationsAttribute.u1parametersCount > 0) - { - attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - if (runtimeInvisibleParameterAnnotationsAttribute.u1parametersCount > 0) - { - attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/ParameterInfoVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/ParameterInfoVisitor.java deleted file mode 100644 index f55d19a4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/ParameterInfoVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.ParameterInfo; - -/** - * This interface specifies the method for a visitor of - * ParameterInfo objects. Note that there is only a single - * implementation of ParameterInfo, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface ParameterInfoVisitor -{ - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/RequiredAttributeFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/RequiredAttributeFilter.java deleted file mode 100644 index 0b2c8fc9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/RequiredAttributeFilter.java +++ /dev/null @@ -1,471 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; -import proguard.obfuscate.AttributeShrinker; - -/** - * This AttributeVisitor delegates its visits to one of two other - * AttributeVisitor instances, depending on whether the visited attribute - * is strictly required or not. - * - * Stack map attributes and stack map table attributes are treated as optional. - * - * @see AttributeShrinker - * - * @author Eric Lafortune - */ -public class RequiredAttributeFilter -implements AttributeVisitor -{ - private final AttributeVisitor requiredAttributeVisitor; - private final AttributeVisitor optionalAttributeVisitor; - - - /** - * Creates a new RequiredAttributeFilter for visiting required attributes. - * @param requiredAttributeVisitor the visitor that will visit required - * attributes. - */ - public RequiredAttributeFilter(AttributeVisitor requiredAttributeVisitor) - { - this(requiredAttributeVisitor, null); - } - - - /** - * Creates a new RequiredAttributeFilter for visiting required and - * optional attributes. - * @param requiredAttributeVisitor the visitor that will visit required - * attributes. - * @param optionalAttributeVisitor the visitor that will visit optional - * attributes. - */ - public RequiredAttributeFilter(AttributeVisitor requiredAttributeVisitor, - AttributeVisitor optionalAttributeVisitor) - { - this.requiredAttributeVisitor = requiredAttributeVisitor; - this.optionalAttributeVisitor = optionalAttributeVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); - } - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - if (requiredAttributeVisitor != null) - { - requiredAttributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); - } - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); - } - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); - } - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); - } - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); - } - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitModuleAttribute(clazz, moduleAttribute); - } - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitModuleMainClassAttribute(clazz, moduleMainClassAttribute); - } - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitModulePackagesAttribute(clazz, modulePackagesAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); - } - } - - - public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSignatureAttribute(clazz, signatureAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute); - } - } - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute); - } - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - if (requiredAttributeVisitor != null) - { - requiredAttributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); - } - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute); - } - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (requiredAttributeVisitor != null) - { - requiredAttributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); - } - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); - } - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); - } - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); - } - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); - } - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - if (optionalAttributeVisitor != null) - { - optionalAttributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/StackSizeComputer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/StackSizeComputer.java deleted file mode 100644 index a2cf434d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/StackSizeComputer.java +++ /dev/null @@ -1,389 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.attribute.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassPrinter; -import proguard.util.ArrayUtil; - -/** - * This AttributeVisitor computes the stack sizes at all instruction offsets - * of the code attributes that it visits. - * - * @author Eric Lafortune - */ -public class StackSizeComputer -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ExceptionInfoVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - - private boolean[] evaluated = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - private int[] stackSizesBefore = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - private int[] stackSizesAfter = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - - private boolean exitInstructionBlock; - - private int stackSize; - private int maxStackSize; - - - /** - * Returns whether the instruction at the given offset is reachable in the - * most recently visited code attribute. - */ - public boolean isReachable(int instructionOffset) - { - return evaluated[instructionOffset]; - } - - - /** - * Returns the stack size before the given instruction offset of the most - * recently visited code attribute. - */ - public int getStackSizeBefore(int instructionOffset) - { - if (!evaluated[instructionOffset]) - { - throw new IllegalArgumentException("Unknown stack size before unreachable instruction offset ["+instructionOffset+"]"); - } - - return stackSizesBefore[instructionOffset]; - } - - - /** - * Returns the stack size after the given instruction offset of the most - * recently visited code attribute. - */ - public int getStackSizeAfter(int instructionOffset) - { - if (!evaluated[instructionOffset]) - { - throw new IllegalArgumentException("Unknown stack size after unreachable instruction offset ["+instructionOffset+"]"); - } - - return stackSizesAfter[instructionOffset]; - } - - - /** - * Returns the maximum stack size of the most recently visited code attribute. - */ - public int getMaxStackSize() - { - return maxStackSize; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // TODO: Remove this when the code has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while computing stack sizes:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - if (DEBUG) - { - method.accept(clazz, new ClassPrinter()); - } - - throw ex; - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("StackSizeComputer: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - int codeLength = codeAttribute.u4codeLength; - - // Make sure the global arrays are sufficiently large. - evaluated = ArrayUtil.ensureArraySize(evaluated, codeLength, false); - stackSizesBefore = ArrayUtil.ensureArraySize(stackSizesBefore, codeLength, 0); - stackSizesAfter = ArrayUtil.ensureArraySize(stackSizesAfter, codeLength, 0); - - // The initial stack is always empty. - stackSize = 0; - maxStackSize = 0; - - // Evaluate the instruction block starting at the entry point of the method. - evaluateInstructionBlock(clazz, method, codeAttribute, 0); - - // Evaluate the exception handlers. - codeAttribute.exceptionsAccept(clazz, method, this); - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - byte opcode = simpleInstruction.opcode; - - // Some simple instructions exit from the current instruction block. - exitInstructionBlock = - opcode == InstructionConstants.OP_IRETURN || - opcode == InstructionConstants.OP_LRETURN || - opcode == InstructionConstants.OP_FRETURN || - opcode == InstructionConstants.OP_DRETURN || - opcode == InstructionConstants.OP_ARETURN || - opcode == InstructionConstants.OP_RETURN || - opcode == InstructionConstants.OP_ATHROW; - } - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Constant pool instructions never end the current instruction block. - exitInstructionBlock = false; - } - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - byte opcode = variableInstruction.opcode; - - // The ret instruction end the current instruction block. - exitInstructionBlock = - opcode == InstructionConstants.OP_RET; - } - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - byte opcode = branchInstruction.opcode; - - // Evaluate the target instruction blocks. - evaluateInstructionBlock(clazz, - method, - codeAttribute, - offset + - branchInstruction.branchOffset); - - // Evaluate the instructions after a subroutine branch. - if (opcode == InstructionConstants.OP_JSR || - opcode == InstructionConstants.OP_JSR_W) - { - // We assume subroutine calls (jsr and jsr_w instructions) don't - // change the stack, other than popping the return value. - stackSize -= 1; - - evaluateInstructionBlock(clazz, - method, - codeAttribute, - offset + branchInstruction.length(offset)); - } - - // Some branch instructions always end the current instruction block. - exitInstructionBlock = - opcode == InstructionConstants.OP_GOTO || - opcode == InstructionConstants.OP_GOTO_W || - opcode == InstructionConstants.OP_JSR || - opcode == InstructionConstants.OP_JSR_W; - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - // Evaluate the target instruction blocks. - - // Loop over all jump offsets. - int[] jumpOffsets = switchInstruction.jumpOffsets; - - for (int index = 0; index < jumpOffsets.length; index++) - { - // Evaluate the jump instruction block. - evaluateInstructionBlock(clazz, - method, - codeAttribute, - offset + jumpOffsets[index]); - } - - // Also evaluate the default instruction block. - evaluateInstructionBlock(clazz, - method, - codeAttribute, - offset + switchInstruction.defaultOffset); - - // The switch instruction always ends the current instruction block. - exitInstructionBlock = true; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - if (DEBUG) - { - System.out.println("Exception:"); - } - - // The stack size when entering the exception handler is always 1. - stackSize = 1; - - // Evaluate the instruction block starting at the entry point of the - // exception handler. - evaluateInstructionBlock(clazz, - method, - codeAttribute, - exceptionInfo.u2handlerPC); - } - - - // Small utility methods. - - /** - * Evaluates a block of instructions that hasn't been handled before, - * starting at the given offset and ending at a branch instruction, a return - * instruction, or a throw instruction. Branch instructions are handled - * recursively. - */ - private void evaluateInstructionBlock(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int instructionOffset) - { - if (DEBUG) - { - if (evaluated[instructionOffset]) - { - System.out.println("-- (instruction block at "+instructionOffset+" already evaluated)"); - } - else - { - System.out.println("-- instruction block:"); - } - } - - // Remember the initial stack size. - int initialStackSize = stackSize; - - // Remember the maximum stack size. - if (maxStackSize < stackSize) - { - maxStackSize = stackSize; - } - - // Evaluate any instructions that haven't been evaluated before. - while (!evaluated[instructionOffset]) - { - // Mark the instruction as evaluated. - evaluated[instructionOffset] = true; - stackSizesBefore[instructionOffset] = stackSize; - - Instruction instruction = InstructionFactory.create(codeAttribute.code, - instructionOffset); - - if (DEBUG) - { - int stackPushCount = instruction.stackPushCount(clazz); - int stackPopCount = instruction.stackPopCount(clazz); - System.out.println("["+instructionOffset+"]: "+ - stackSize+" - "+ - stackPopCount+" + "+ - stackPushCount+" = "+ - (stackSize+stackPushCount-stackPopCount)+": "+ - instruction.toString(instructionOffset)); - } - - // Compute the instruction's effect on the stack size. - stackSize -= instruction.stackPopCount(clazz); - - if (stackSize < 0) - { - throw new IllegalArgumentException("Stack size becomes negative after instruction "+ - instruction.toString(instructionOffset)+" in ["+ - clazz.getName()+"."+ - method.getName(clazz)+ - method.getDescriptor(clazz)+"]"); - } - - stackSize += instruction.stackPushCount(clazz); - stackSizesAfter[instructionOffset] = stackSize; - - // Remember the maximum stack size. - if (maxStackSize < stackSize) - { - maxStackSize = stackSize; - } - - // Remember the next instruction offset. - int nextInstructionOffset = instructionOffset + - instruction.length(instructionOffset); - - // Visit the instruction, in order to handle branches. - instruction.accept(clazz, method, codeAttribute, instructionOffset, this); - - // Stop evaluating after a branch. - if (exitInstructionBlock) - { - break; - } - - // Continue with the next instruction. - instructionOffset = nextInstructionOffset; - - if (DEBUG) - { - if (evaluated[instructionOffset]) - { - System.out.println("-- (instruction at "+instructionOffset+" already evaluated)"); - } - } - } - - // Restore the stack size for possible subsequent instruction blocks. - this.stackSize = initialStackSize; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/package.html deleted file mode 100644 index 056244af..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/attribute/visitor/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains visitors for attributes and their components. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/ClassConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/ClassConstant.java deleted file mode 100644 index a3d07909..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/ClassConstant.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This Constant represents a class constant in the constant pool. - * - * @author Eric Lafortune - */ -public class ClassConstant extends Constant -{ - public int u2nameIndex; - - /** - * An extra field pointing to the referenced Clazz object. - * This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - */ - public Clazz referencedClass; - - /** - * An extra field pointing to the java.lang.Class Clazz object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}.. - */ - public Clazz javaLangClassClass; - - - /** - * Creates an uninitialized ClassConstant. - */ - public ClassConstant() - { - } - - - /** - * Creates a new ClassConstant with the given name index. - * @param u2nameIndex the index of the name in the constant pool. - * @param referencedClass the referenced class. - */ - public ClassConstant(int u2nameIndex, - Clazz referencedClass) - { - this.u2nameIndex = u2nameIndex; - this.referencedClass = referencedClass; - } - - - /** - * Returns the name. - */ - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Class; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitClassConstant(clazz, this); - } - - - /** - * Lets the referenced class accept the given visitor. - */ - public void referencedClassAccept(ClassVisitor classVisitor) - { - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/Constant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/Constant.java deleted file mode 100644 index 44eb3c3c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/Constant.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This abstract class represents an entry in the ConstantPool. Specific types - * of entries are subclassed from it. - * - * @author Eric Lafortune - */ -public abstract class Constant implements VisitorAccepter -{ - //public int u1tag; - //public byte info[]; - - /** - * An extra field in which visitors can store information. - */ - public Object visitorInfo; - - - // Abstract methods to be implemented by extensions. - - /** - * Returns the constant pool info tag that specifies the entry type. - */ - public abstract int getTag(); - - - /** - * Accepts the given visitor. - */ - public abstract void accept(Clazz clazz, ConstantVisitor constantVisitor); - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return visitorInfo; - } - - public void setVisitorInfo(Object visitorInfo) - { - this.visitorInfo = visitorInfo; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/DoubleConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/DoubleConstant.java deleted file mode 100644 index 45e0abe3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/DoubleConstant.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a double constant in the constant pool. - * - * @author Eric Lafortune - */ -public class DoubleConstant extends Constant -{ - public double f8value; - - - /** - * Creates an uninitialized DoubleConstant. - */ - public DoubleConstant() - { - } - - - /** - * Creates a new DoubleConstant with the given double value. - */ - public DoubleConstant(double value) - { - f8value = value; - } - - - /** - * Returns the double value of this DoubleConstant. - */ - public double getValue() - { - return f8value; - } - - - /** - * Sets the double value of this DoubleConstant. - */ - public void setValue(double value) - { - f8value = value; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Double; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitDoubleConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/FieldrefConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/FieldrefConstant.java deleted file mode 100644 index 6e35254e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/FieldrefConstant.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a field reference constant in the constant pool. - * - * @author Eric Lafortune - */ -public class FieldrefConstant extends RefConstant -{ - /** - * Creates an uninitialized FieldrefConstant. - */ - public FieldrefConstant() - { - } - - - /** - * Creates a new FieldrefConstant with the given name and type indices. - * @param u2classIndex the index of the class in the constant pool. - * @param u2nameAndTypeIndex the index of the name and type entry in the constant pool. - * @param referencedClass the referenced class. - * @param referencedMember the referenced member info. - */ - public FieldrefConstant(int u2classIndex, - int u2nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - this.u2classIndex = u2classIndex; - this.u2nameAndTypeIndex = u2nameAndTypeIndex; - this.referencedClass = referencedClass; - this.referencedMember = referencedMember; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Fieldref; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitFieldrefConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/FloatConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/FloatConstant.java deleted file mode 100644 index 2406b1db..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/FloatConstant.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a float constant in the constant pool. - * - * @author Eric Lafortune - */ -public class FloatConstant extends Constant -{ - public float f4value; - - - /** - * Creates an uninitialized FloatConstant. - */ - public FloatConstant() - { - } - - - /** - * Creates a new FloatConstant with the given float value. - */ - public FloatConstant(float value) - { - f4value = value; - } - - - /** - * Returns the float value of this FloatConstant. - */ - public float getValue() - { - return f4value; - } - - - /** - * Sets the float value of this FloatConstant. - */ - public void setValue(float value) - { - f4value = value; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Float; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitFloatConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/IntegerConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/IntegerConstant.java deleted file mode 100644 index 28ffbe74..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/IntegerConstant.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a integer constant in the constant pool. - * - * @author Eric Lafortune - */ -public class IntegerConstant extends Constant -{ - public int u4value; - - - /** - * Creates an uninitialized IntegerConstant. - */ - public IntegerConstant() - { - } - - - /** - * Creates a new IntegerConstant with the given integer value. - */ - public IntegerConstant(int value) - { - u4value = value; - } - - - /** - * Returns the integer value of this IntegerConstant. - */ - public int getValue() - { - return u4value; - } - - - /** - * Sets the integer value of this IntegerConstant. - */ - public void setValue(int value) - { - u4value = value; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Integer; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitIntegerConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/InterfaceMethodrefConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/InterfaceMethodrefConstant.java deleted file mode 100644 index 7e6ae6e8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/InterfaceMethodrefConstant.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a interface method reference constant in the constant pool. - * - * @author Eric Lafortune - */ -public class InterfaceMethodrefConstant extends RefConstant -{ - /** - * Creates an uninitialized InterfaceMethodrefConstant. - */ - public InterfaceMethodrefConstant() - { - } - - - /** - * Creates a new InterfaceMethodrefConstant with the given name and type indices. - * @param u2classIndex the index of the class in the constant pool. - * @param u2nameAndTypeIndex the index of the name and type entry in the constant pool. - * @param referencedClass the referenced class. - * @param referencedMember the referenced member info. - */ - public InterfaceMethodrefConstant(int u2classIndex, - int u2nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - this.u2classIndex = u2classIndex; - this.u2nameAndTypeIndex = u2nameAndTypeIndex; - this.referencedClass = referencedClass; - this.referencedMember = referencedMember; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_InterfaceMethodref; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitInterfaceMethodrefConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/InvokeDynamicConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/InvokeDynamicConstant.java deleted file mode 100644 index e98e67e0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/InvokeDynamicConstant.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This Constant represents an invoke dynamic constant in the constant pool. - * - * @author Eric Lafortune - */ -public class InvokeDynamicConstant extends Constant -{ - public int u2bootstrapMethodAttributeIndex; - public int u2nameAndTypeIndex; - - /** - * An extra field pointing to the Clazz objects referenced in the - * descriptor string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz[] referencedClasses; - - - /** - * Creates an uninitialized InvokeDynamicConstant. - */ - public InvokeDynamicConstant() - { - } - - - /** - * Creates a new InvokeDynamicConstant with the given bootstrap method - * and name-and-type indices. - * @param u2bootstrapMethodAttributeIndex the index of the bootstrap method - * entry in the bootstrap methods - * attribute. - * @param u2nameAndTypeIndex the index of the name and type - * entry in the constant pool. - * @param referencedClasses the classes referenced by the - * type. - */ - public InvokeDynamicConstant(int u2bootstrapMethodAttributeIndex, - int u2nameAndTypeIndex, - Clazz[] referencedClasses) - { - this.u2bootstrapMethodAttributeIndex = u2bootstrapMethodAttributeIndex; - this.u2nameAndTypeIndex = u2nameAndTypeIndex; - this.referencedClasses = referencedClasses; - } - - - /** - * Returns the index of the bootstrap method in the bootstrap methods - * attribute of the class. - */ - public int getBootstrapMethodAttributeIndex() - { - return u2bootstrapMethodAttributeIndex; - } - - /** - * Returns the name-and-type index. - */ - public int getNameAndTypeIndex() - { - return u2nameAndTypeIndex; - } - - /** - * Returns the method name. - */ - public String getName(Clazz clazz) - { - return clazz.getName(u2nameAndTypeIndex); - } - - /** - * Returns the method type. - */ - public String getType(Clazz clazz) - { - return clazz.getType(u2nameAndTypeIndex); - } - - - /** - * Lets the Clazz objects referenced in the descriptor string - * accept the given visitor. - */ - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - if (referencedClasses[index] != null) - { - referencedClasses[index].accept(classVisitor); - } - } - } - } - - - /** - * Lets the bootstrap method handle constant accept the given visitor. - */ - public void bootstrapMethodHandleAccept(Clazz clazz, ConstantVisitor constantVisitor) - { - new BootstrapMethodHandleTraveler(constantVisitor).visitInvokeDynamicConstant(clazz, this); - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_InvokeDynamic; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitInvokeDynamicConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/LongConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/LongConstant.java deleted file mode 100644 index 7795495e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/LongConstant.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a long constant in the constant pool. - * - * @author Eric Lafortune - */ -public class LongConstant extends Constant -{ - public long u8value; - - - /** - * Creates an uninitialized LongConstant. - */ - public LongConstant() - { - } - - - /** - * Creates a new LongConstant with the given long value. - */ - public LongConstant(long value) - { - u8value = value; - } - - - /** - * Returns the long value of this LongConstant. - */ - public long getValue() - { - return u8value; - } - - - /** - * Sets the long value of this LongConstant. - */ - public void setValue(long value) - { - u8value = value; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Long; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitLongConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodHandleConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodHandleConstant.java deleted file mode 100644 index b8234170..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodHandleConstant.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a method handle constant in the constant pool. - * - * @author Eric Lafortune - */ -public class MethodHandleConstant extends Constant -{ - public int u1referenceKind; - public int u2referenceIndex; - - - /** - * An extra field pointing to the java.lang.invoke.MethodHandle Clazz object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - */ - public Clazz javaLangInvokeMethodHandleClass; - - - /** - * Creates an uninitialized MethodHandleConstant. - */ - public MethodHandleConstant() - { - } - - - /** - * Creates a new MethodHandleConstant with the given type and method ref - * index. - * @param u1referenceKind the reference kind. - * @param u2referenceIndex the index of the field ref constant, interface - * method ref constant, or method ref constant in - * the constant pool. - */ - public MethodHandleConstant(int u1referenceKind, int u2referenceIndex) - { - this.u1referenceKind = u1referenceKind; - this.u2referenceIndex = u2referenceIndex; - } - - - /** - * Returns the kind of reference to which this constant is pointing. - * @return One of - * {@link ClassConstants#REF_getField }, - * {@link ClassConstants#REF_getStatic }, - * {@link ClassConstants#REF_putField }, - * {@link ClassConstants#REF_putStatic }, - * {@link ClassConstants#REF_invokeVirtual }, - * {@link ClassConstants#REF_invokeStatic }, - * {@link ClassConstants#REF_invokeSpecial }, - * {@link ClassConstants#REF_newInvokeSpecial}, or - * {@link ClassConstants#REF_invokeInterface }. - */ - public int getReferenceKind() - { - return u1referenceKind; - } - - /** - * Returns the field ref, interface method ref, or method ref index. - */ - public int getReferenceIndex() - { - return u2referenceIndex; - } - - - /** - * Returns the class name. - */ - public String getClassName(Clazz clazz) - { - return clazz.getRefClassName(u2referenceIndex); - } - - /** - * Returns the method/field name. - */ - public String getName(Clazz clazz) - { - return clazz.getRefName(u2referenceIndex); - } - - /** - * Returns the type. - */ - public String getType(Clazz clazz) - { - return clazz.getRefType(u2referenceIndex); - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_MethodHandle; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitMethodHandleConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodTypeConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodTypeConstant.java deleted file mode 100644 index 2edabc55..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodTypeConstant.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This Constant represents a method handle constant in the constant pool. - * - * @author Eric Lafortune - */ -public class MethodTypeConstant extends Constant -{ - public int u2descriptorIndex; - - - /** - * An extra field pointing to the java.lang.invoke.MethodType Clazz object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}.. - */ - public Clazz javaLangInvokeMethodTypeClass; - - - /** - * An extra field pointing to the Clazz objects referenced in the - * descriptor string. This field is filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer ClassReferenceInitializer}. - * References to primitive types are ignored. - */ - public Clazz[] referencedClasses; - - - /** - * Creates an uninitialized MethodTypeConstant. - */ - public MethodTypeConstant() - { - } - - - /** - * Creates a new MethodTypeConstant with the given descriptor index. - * @param u2descriptorIndex the index of the descriptor in the constant - * pool. - * @param referencedClasses the classes referenced by the descriptor. - */ - public MethodTypeConstant(int u2descriptorIndex, - Clazz[] referencedClasses) - { - this.u2descriptorIndex = u2descriptorIndex; - this.referencedClasses = referencedClasses; - } - - - /** - * Returns the descriptor index. - */ - public int getDescriptorIndex() - { - return u2descriptorIndex; - } - - - /** - * Returns the type. - */ - public String getType(Clazz clazz) - { - return clazz.getString(u2descriptorIndex); - } - - - /** - * Lets the Clazz objects referenced in the descriptor string - * accept the given visitor. - */ - public void referencedClassesAccept(ClassVisitor classVisitor) - { - if (referencedClasses != null) - { - for (int index = 0; index < referencedClasses.length; index++) - { - if (referencedClasses[index] != null) - { - referencedClasses[index].accept(classVisitor); - } - } - } - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_MethodType; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitMethodTypeConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodrefConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodrefConstant.java deleted file mode 100644 index 899747e0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/MethodrefConstant.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a method reference constant in the constant pool. - * - * @author Eric Lafortune - */ -public class MethodrefConstant extends RefConstant -{ - /** - * Creates an uninitialized MethodrefConstant. - */ - public MethodrefConstant() - { - } - - - /** - * Creates a new MethodrefConstant with the given name and type indices. - * @param u2classIndex the index of the class in the constant pool. - * @param u2nameAndTypeIndex the index of the name and type entry in the constant pool. - * @param referencedClass the referenced class. - * @param referencedMember the referenced member info. - */ - public MethodrefConstant(int u2classIndex, - int u2nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - this.u2classIndex = u2classIndex; - this.u2nameAndTypeIndex = u2nameAndTypeIndex; - this.referencedClass = referencedClass; - this.referencedMember = referencedMember; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Methodref; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitMethodrefConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/ModuleConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/ModuleConstant.java deleted file mode 100644 index 6340286d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/ModuleConstant.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a module constant in the constant pool. - * - * @author Joachim Vandersmissen - */ -public class ModuleConstant extends Constant -{ - public int u2nameIndex; - - - /** - * Creates an uninitialized ModuleConstant. - */ - public ModuleConstant() - { - } - - - /** - * Creates a new ModuleConstant with the given name index. - * @param u2nameIndex the index of the name in the constant pool. - */ - public ModuleConstant(int u2nameIndex) - { - this.u2nameIndex = u2nameIndex; - } - - - /** - * Returns the name. - */ - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Module; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitModuleConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/NameAndTypeConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/NameAndTypeConstant.java deleted file mode 100644 index 4c3218a2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/NameAndTypeConstant.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a name and type constant in the constant pool. - * - * @author Eric Lafortune - */ -public class NameAndTypeConstant extends Constant -{ - public int u2nameIndex; - public int u2descriptorIndex; - - - /** - * Creates an uninitialized NameAndTypeConstant. - */ - public NameAndTypeConstant() - { - } - - - /** - * Creates a new NameAndTypeConstant with the given name and type indices. - * @param u2nameIndex the index of the name in the constant pool. - * @param u2descriptorIndex the index of the descriptor in the constant - * pool. - */ - public NameAndTypeConstant(int u2nameIndex, - int u2descriptorIndex) - { - this.u2nameIndex = u2nameIndex; - this.u2descriptorIndex = u2descriptorIndex; - } - - - /** - * Returns the name index. - */ - protected int getNameIndex() - { - return u2nameIndex; - } - - /** - * Sets the name index. - */ - protected void setNameIndex(int index) - { - u2nameIndex = index; - } - - /** - * Returns the descriptor index. - */ - protected int getDescriptorIndex() - { - return u2descriptorIndex; - } - - /** - * Sets the descriptor index. - */ - protected void setDescriptorIndex(int index) - { - u2descriptorIndex = index; - } - - /** - * Returns the name. - */ - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - /** - * Returns the type. - */ - public String getType(Clazz clazz) - { - return clazz.getString(u2descriptorIndex); - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_NameAndType; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitNameAndTypeConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/PackageConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/PackageConstant.java deleted file mode 100644 index 362fedfb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/PackageConstant.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This Constant represents a package constant in the constant pool. - * - * @author Joachim Vandersmissen - */ -public class PackageConstant extends Constant -{ - public int u2nameIndex; - - - /** - * Creates an uninitialized PackageConstant. - */ - public PackageConstant() - { - } - - - /** - * Creates a new PackageConstant with the given name index. - * @param u2nameIndex the index of the name in the constant pool. - */ - public PackageConstant(int u2nameIndex) - { - this.u2nameIndex = u2nameIndex; - } - - - /** - * Returns the name. - */ - public String getName(Clazz clazz) - { - return clazz.getString(u2nameIndex); - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Package; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitPackageConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/PrimitiveArrayConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/PrimitiveArrayConstant.java deleted file mode 100644 index 1bb60293..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/PrimitiveArrayConstant.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.classfile.constant; - -import proguard.classfile.ClassConstants; -import proguard.classfile.Clazz; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.constant.visitor.PrimitiveArrayConstantElementVisitor; -import proguard.classfile.constant.visitor.PrimitiveArrayConstantVisitor; - -/** - * This unofficial Constant represents an array of primitives in the constant - * pool. It is not supported by any Java specification and therefore only for - * internal use. - * - * @author Eric Lafortune - */ -public class PrimitiveArrayConstant extends Constant -{ - public Object values; - - - /** - * Creates an uninitialized PrimitiveArrayConstant. - */ - public PrimitiveArrayConstant() - { - } - - - /** - * Creates a new PrimitiveArrayConstant with the given array of values. - */ - public PrimitiveArrayConstant(Object values) - { - this.values = values; - } - - - /** - * Returns the type of the elements of the primitive array. - */ - public char getPrimitiveType() - { - return values instanceof boolean[] ? ClassConstants.TYPE_BOOLEAN : - values instanceof byte[] ? ClassConstants.TYPE_BYTE : - values instanceof char[] ? ClassConstants.TYPE_CHAR : - values instanceof short[] ? ClassConstants.TYPE_SHORT : - values instanceof int[] ? ClassConstants.TYPE_INT : - values instanceof float[] ? ClassConstants.TYPE_FLOAT : - values instanceof long[] ? ClassConstants.TYPE_LONG : - values instanceof double[] ? ClassConstants.TYPE_DOUBLE : - 0; - } - - - /** - * Returns the length of the primitive array. - */ - public int getLength() - { - return values instanceof boolean[] ? ((boolean[])values).length : - values instanceof byte[] ? ((byte[] )values).length : - values instanceof char[] ? ((char[] )values).length : - values instanceof short[] ? ((short[] )values).length : - values instanceof int[] ? ((int[] )values).length : - values instanceof float[] ? ((float[] )values).length : - values instanceof long[] ? ((long[] )values).length : - values instanceof double[] ? ((double[] )values).length : - 0; - } - - - /** - * Returns the values. - */ - public Object getValues() - { - return values; - } - - - /** - * Applies the given PrimitiveArrayConstantVisitor to the primitive array. - */ - public void primitiveArrayAccept(Clazz clazz, PrimitiveArrayConstantVisitor primitiveArrayConstantVisitor) - { - // The primitive arrays themselves don't accept visitors, so we have to - // use instanceof tests. - if (values instanceof boolean[]) - { - primitiveArrayConstantVisitor.visitBooleanArrayConstant(clazz, this, (boolean[])values); - } - else if (values instanceof byte[]) - { - primitiveArrayConstantVisitor.visitByteArrayConstant(clazz, this, (byte[])values); - } - else if (values instanceof char[]) - { - primitiveArrayConstantVisitor.visitCharArrayConstant(clazz, this, (char[])values); - } - else if (values instanceof short[]) - { - primitiveArrayConstantVisitor.visitShortArrayConstant(clazz, this, (short[])values); - } - else if (values instanceof int[]) - { - primitiveArrayConstantVisitor.visitIntArrayConstant(clazz, this, (int[])values); - } - else if (values instanceof float[]) - { - primitiveArrayConstantVisitor.visitFloatArrayConstant(clazz, this, (float[])values); - } - else if (values instanceof long[]) - { - primitiveArrayConstantVisitor.visitLongArrayConstant(clazz, this, (long[])values); - } - else if (values instanceof double[]) - { - primitiveArrayConstantVisitor.visitDoubleArrayConstant(clazz, this, (double[])values); - } - } - - - /** - * Applies the given PrimitiveArrayConstantElementVisitor to all elements - * of the primitive array. - */ - public void primitiveArrayElementsAccept(Clazz clazz, PrimitiveArrayConstantElementVisitor primitiveArrayConstantElementVisitor) - { - // The primitive arrays themselves don't accept visitors, so we have to - // use instanceof tests. - if (values instanceof boolean[]) - { - boolean[] booleanValues = (boolean[])this.values; - for (int index = 0; index < booleanValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitBooleanArrayConstantElement(clazz, this, index, booleanValues[index]); - } - } - else if (values instanceof byte[]) - { - byte[] byteValues = (byte[])this.values; - for (int index = 0; index < byteValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitByteArrayConstantElement(clazz, this, index, byteValues[index]); - } - } - else if (values instanceof char[]) - { - char[] charValues = (char[])this.values; - for (int index = 0; index < charValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitCharArrayConstantElement(clazz, this, index, charValues[index]); - } - } - else if (values instanceof short[]) - { - short[] shortValues = (short[])this.values; - for (int index = 0; index < shortValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitShortArrayConstantElement(clazz, this, index, shortValues[index]); - } - } - else if (values instanceof int[]) - { - int[] intValues = (int[])this.values; - for (int index = 0; index < intValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitIntArrayConstantElement(clazz, this, index, intValues[index]); - } - } - else if (values instanceof float[]) - { - float[] floatValues = (float[])this.values; - for (int index = 0; index < floatValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitFloatArrayConstantElement(clazz, this, index, floatValues[index]); - } - } - else if (values instanceof long[]) - { - long[] longValues = (long[])this.values; - for (int index = 0; index < longValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitLongArrayConstantElement(clazz, this, index, longValues[index]); - } - } - else if (values instanceof double[]) - { - double[] doubleValues = (double[])this.values; - for (int index = 0; index < doubleValues.length; index++) - { - primitiveArrayConstantElementVisitor.visitDoubleArrayConstantElement(clazz, this, index, doubleValues[index]); - } - } - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_PrimitiveArray; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitPrimitiveArrayConstant(clazz, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/RefConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/RefConstant.java deleted file mode 100644 index 599c763d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/RefConstant.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; - -/** - * This Constant represents a ref constant in the constant pool. - * - * @author Eric Lafortune - */ -public abstract class RefConstant extends Constant -{ - public int u2classIndex; - public int u2nameAndTypeIndex; - - /** - * An extra field pointing to the referenced Clazz object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - */ - public Clazz referencedClass; - - /** - * An extra field optionally pointing to the referenced Member object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}. - */ - public Member referencedMember; - - - protected RefConstant() - { - } - - - /** - * Returns the class index. - */ - public int getClassIndex() - { - return u2classIndex; - } - - /** - * Returns the name-and-type index. - */ - public int getNameAndTypeIndex() - { - return u2nameAndTypeIndex; - } - - /** - * Sets the name-and-type index. - */ - public void setNameAndTypeIndex(int index) - { - u2nameAndTypeIndex = index; - } - - /** - * Returns the class name. - */ - public String getClassName(Clazz clazz) - { - return clazz.getClassName(u2classIndex); - } - - /** - * Returns the method/field name. - */ - public String getName(Clazz clazz) - { - return clazz.getName(u2nameAndTypeIndex); - } - - /** - * Returns the type. - */ - public String getType(Clazz clazz) - { - return clazz.getType(u2nameAndTypeIndex); - } - - - /** - * Lets the referenced class accept the given visitor. - */ - public void referencedClassAccept(ClassVisitor classVisitor) - { - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - - - /** - * Lets the referenced class member accept the given visitor. - */ - public void referencedMemberAccept(MemberVisitor memberVisitor) - { - if (referencedMember != null) - { - referencedMember.accept(referencedClass, - memberVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/StringConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/StringConstant.java deleted file mode 100644 index ec7f7c93..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/StringConstant.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.*; - -/** - * This Constant represents a string constant in the constant pool. - * - * @author Eric Lafortune - */ -public class StringConstant extends Constant -{ - public int u2stringIndex; - - /** - * An extra field pointing to the referenced Clazz object, if this - * string is being used in Class.forName(), .class, or - * Class.getDeclaredField/Method constructs. - * This field is typically filled out by the {@link - * proguard.classfile.util.DynamicClassReferenceInitializer - * DynamicClassReferenceInitializer} or by the {@link - * proguard.classfile.util.DynamicMemberReferenceInitializer - * DynamicMemberReferenceInitializer}. - */ - public Clazz referencedClass; - - /** - * An extra field pointing to the referenced Member object, if this - * string is being used in Class.getDeclaredField/Method constructs. - * This field is typically filled out by the {@link - * proguard.classfile.util.DynamicMemberReferenceInitializer - * DynamicMemberReferenceInitializer}. - */ - public Member referencedMember; - - /** - * An extra field pointing to the java.lang.String Clazz object. - * This field is typically filled out by the {@link - * proguard.classfile.util.ClassReferenceInitializer - * ClassReferenceInitializer}.. - */ - public Clazz javaLangStringClass; - - - /** - * Creates an uninitialized StringConstant. - */ - public StringConstant() - { - } - - - /** - * Creates a new StringConstant with the given string index. - * @param u2stringIndex the index of the string in the constant pool. - * @param referencedClass the referenced class, if any. - * @param referenceMember the referenced class member, if any. - */ - public StringConstant(int u2stringIndex, - Clazz referencedClass, - Member referenceMember) - { - this.u2stringIndex = u2stringIndex; - this.referencedClass = referencedClass; - this.referencedMember = referenceMember; - } - - - /** - * Returns the string value. - */ - public String getString(Clazz clazz) - { - return clazz.getString(u2stringIndex); - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_String; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitStringConstant(clazz, this); - } - - - /** - * Lets the referenced class accept the given visitor. - */ - public void referencedClassAccept(ClassVisitor classVisitor) - { - if (referencedClass != null && - referencedMember == null) - { - referencedClass.accept(classVisitor); - } - } - - - /** - * Lets the referenced member accept the given visitor. - */ - public void referencedMemberAccept(MemberVisitor memberVisitor) - { - if (referencedMember != null) - { - referencedMember.accept(referencedClass, memberVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/Utf8Constant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/Utf8Constant.java deleted file mode 100644 index ecc6da5a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/Utf8Constant.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant; - -import proguard.classfile.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -import java.io.UnsupportedEncodingException; - -/** - * This Constant represents a UTF-8 constant in the constant pool. - * - * @author Eric Lafortune - */ -public class Utf8Constant extends Constant -{ - private static final char TWO_BYTE_LIMIT = 0x80; - private static final int TWO_BYTE_CONSTANT1 = 0xc0; - private static final int TWO_BYTE_CONSTANT2 = 0x80; - private static final int TWO_BYTE_SHIFT1 = 6; - private static final int TWO_BYTE_MASK1 = 0x1f; - private static final int TWO_BYTE_MASK2 = 0x3f; - - private static final char THREE_BYTE_LIMIT = 0x800; - private static final int THREE_BYTE_CONSTANT1 = 0xe0; - private static final int THREE_BYTE_CONSTANT2 = 0x80; - private static final int THREE_BYTE_CONSTANT3 = 0x80; - private static final int THREE_BYTE_SHIFT1 = 12; - private static final int THREE_BYTE_SHIFT2 = 6; - private static final int THREE_BYTE_MASK1 = 0x0f; - private static final int THREE_BYTE_MASK2 = 0x3f; - private static final int THREE_BYTE_MASK3 = 0x3f; - - - // There are a lot of Utf8Constant objects, so we're optimising their storage. - // Initially, we're storing the UTF-8 bytes in a byte array. - // When the corresponding String is requested, we ditch the array and just - // store the String. - - //private int u2length; - private byte[] bytes; - - private String string; - - - /** - * Creates an uninitialized Utf8Constant. - * - */ - public Utf8Constant() - { - } - - - /** - * Creates a Utf8Constant containing the given string. - */ - public Utf8Constant(String string) - { - this.bytes = null; - this.string = string; - } - - - /** - * Initializes the UTF-8 data with an array of bytes. - */ - public void setBytes(byte[] bytes) - { - this.bytes = bytes; - this.string = null; - } - - - /** - * Returns the UTF-8 data as an array of bytes. - */ - public byte[] getBytes() - { - try - { - switchToByteArrayRepresentation(); - } - catch (UnsupportedEncodingException ex) - { - throw new RuntimeException(ex.getMessage()); - } - - return bytes; - } - - - /** - * Initializes the UTF-8 data with a String. - */ - public void setString(String utf8String) - { - this.bytes = null; - this.string = utf8String; - } - - - /** - * Returns the UTF-8 data as a String. - */ - public String getString() - { - try - { - switchToStringRepresentation(); - } - catch (UnsupportedEncodingException ex) - { - throw new RuntimeException(ex.getMessage()); - } - - return string; - } - - - // Implementations for Constant. - - public int getTag() - { - return ClassConstants.CONSTANT_Utf8; - } - - public void accept(Clazz clazz, ConstantVisitor constantVisitor) - { - constantVisitor.visitUtf8Constant(clazz, this); - } - - - // Small utility methods. - - /** - * Switches to a byte array representation of the UTF-8 data. - */ - private void switchToByteArrayRepresentation() throws UnsupportedEncodingException - { - if (bytes == null) - { - bytes = getByteArrayRepresentation(string); - string = null; - } - } - - - /** - * Switches to a String representation of the UTF-8 data. - */ - private void switchToStringRepresentation() throws UnsupportedEncodingException - { - if (string == null) - { - string = getStringRepresentation(bytes); - bytes = null; - } - } - - - /** - * Returns the modified UTF-8 byte array representation of the given string. - */ - private byte[] getByteArrayRepresentation(String string) throws UnsupportedEncodingException - { - // We're computing the byte array ourselves, because the implementation - // of String.getBytes("UTF-8") has a bug, at least up to JRE 1.4.2. - // Also note the special treatment of the 0 character. - - // Compute the byte array length. - int byteLength = 0; - int stringLength = string.length(); - for (int stringIndex = 0; stringIndex < stringLength; stringIndex++) - { - char c = string.charAt(stringIndex); - - // The character is represented by one, two, or three bytes. - byteLength += c == 0 ? 2 : - c < TWO_BYTE_LIMIT ? 1 : - c < THREE_BYTE_LIMIT ? 2 : - 3; - } - - // Allocate the byte array with the computed length. - byte[] bytes = new byte[byteLength]; - - // Fill out the array. - int byteIndex = 0; - for (int stringIndex = 0; stringIndex < stringLength; stringIndex++) - { - char c = string.charAt(stringIndex); - if (c == 0) - { - // The 0 character gets a two-byte representation in classes. - bytes[byteIndex++] = (byte)TWO_BYTE_CONSTANT1; - bytes[byteIndex++] = (byte)TWO_BYTE_CONSTANT2; - } - else if (c < TWO_BYTE_LIMIT) - { - // The character is represented by a single byte. - bytes[byteIndex++] = (byte)c; - } - else if (c < THREE_BYTE_LIMIT) - { - // The character is represented by two bytes. - bytes[byteIndex++] = (byte)(TWO_BYTE_CONSTANT1 | ((c >>> TWO_BYTE_SHIFT1) & TWO_BYTE_MASK1)); - bytes[byteIndex++] = (byte)(TWO_BYTE_CONSTANT2 | ( c & TWO_BYTE_MASK2)); - } - else - { - // The character is represented by three bytes. - bytes[byteIndex++] = (byte)(THREE_BYTE_CONSTANT1 | ((c >>> THREE_BYTE_SHIFT1) & THREE_BYTE_MASK1)); - bytes[byteIndex++] = (byte)(THREE_BYTE_CONSTANT2 | ((c >>> THREE_BYTE_SHIFT2) & THREE_BYTE_MASK2)); - bytes[byteIndex++] = (byte)(THREE_BYTE_CONSTANT3 | ( c & THREE_BYTE_MASK3)); - } - } - - return bytes; - } - - - /** - * Returns the String representation of the given modified UTF-8 byte array. - */ - private String getStringRepresentation(byte[] bytes) throws UnsupportedEncodingException - { - // We're computing the string ourselves, because the implementation - // of "new String(bytes)" doesn't honor the special treatment of - // the 0 character in JRE 1.6_u11. - - // Allocate the byte array with the computed length. - char[] chars = new char[bytes.length]; - - // Fill out the array. - int charIndex = 0; - int byteIndex = 0; - while (byteIndex < bytes.length) - { - - int b = bytes[byteIndex++] & 0xff; - - // Depending on the flag bits in the first byte, the character - // is represented by a single byte, by two bytes, or by three - // bytes. We're not checking the redundant flag bits in the - // second byte and the third byte. - try - { - chars[charIndex++] = - (char)(b < TWO_BYTE_CONSTANT1 ? b : - - b < THREE_BYTE_CONSTANT1 ? ((b & TWO_BYTE_MASK1) << TWO_BYTE_SHIFT1) | - ((bytes[byteIndex++] & TWO_BYTE_MASK2) ) : - - ((b & THREE_BYTE_MASK1) << THREE_BYTE_SHIFT1) | - ((bytes[byteIndex++] & THREE_BYTE_MASK2) << THREE_BYTE_SHIFT2) | - ((bytes[byteIndex++] & THREE_BYTE_MASK3) )); - } - catch (ArrayIndexOutOfBoundsException e) - { - throw new UnsupportedEncodingException("Missing UTF-8 bytes after initial byte [0x"+Integer.toHexString(b)+"] in string ["+new String(chars, 0, charIndex)+"]"); - } - } - - return new String(chars, 0, charIndex); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/AllBootstrapMethodArgumentVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/AllBootstrapMethodArgumentVisitor.java deleted file mode 100644 index c417925a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/AllBootstrapMethodArgumentVisitor.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.BootstrapMethodInfo; -import proguard.classfile.attribute.visitor.BootstrapMethodInfoVisitor; - -/** - * This BootstrapMethodInfoVisitor lets a given ConstantVisitor visit all - * constant pool entries of the bootstrap methods it visits. - * - * @author Eric Lafortune - */ -public class AllBootstrapMethodArgumentVisitor -implements BootstrapMethodInfoVisitor -{ - private ConstantVisitor constantVisitor; - - /** - * Creates a new AllBootstrapMethodArgumentVisitor that will delegate to - * the given constant visitor. - */ - public AllBootstrapMethodArgumentVisitor(ConstantVisitor constantVisitor) - { - this.constantVisitor = constantVisitor; - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - bootstrapMethodInfo.methodArgumentsAccept(clazz, constantVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/AllConstantVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/AllConstantVisitor.java deleted file mode 100644 index 54971514..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/AllConstantVisitor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - - -/** - * This ClassVisitor lets a given ConstantVisitor visit all constant pool - * entries of the program classes it visits. - * - * @author Eric Lafortune - */ -public class AllConstantVisitor implements ClassVisitor -{ - private final ConstantVisitor constantVisitor; - - - public AllConstantVisitor(ConstantVisitor constantVisitor) - { - this.constantVisitor = constantVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.constantPoolEntriesAccept(constantVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) {} -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/BootstrapMethodHandleTraveler.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/BootstrapMethodHandleTraveler.java deleted file mode 100644 index 080b7d86..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/BootstrapMethodHandleTraveler.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor and BootstrapMethodInfoVisitor travels from any invoke - * dynamic constants or bootstrap method info entries that it visits to their - * bootstrap method handle constants, and applies a given constant visitor. - * - * @author Eric Lafortune - */ -public class BootstrapMethodHandleTraveler -extends SimplifiedVisitor -implements ConstantVisitor, - AttributeVisitor, - BootstrapMethodInfoVisitor -{ - private ConstantVisitor bootstrapMethodHandleVisitor; - - // Field serving as a method argument. - int bootstrapMethodAttributeIndex; - - - /** - * Creates a new BootstrapMethodHandleVisitor that will delegate to the - * given constant visitor. - */ - public BootstrapMethodHandleTraveler(ConstantVisitor bootstrapMethodHandleVisitor) - { - this.bootstrapMethodHandleVisitor = bootstrapMethodHandleVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Pass the method index. - bootstrapMethodAttributeIndex = - invokeDynamicConstant.u2bootstrapMethodAttributeIndex; - - // Delegate to the bootstrap method. - clazz.attributesAccept(this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - // Check bootstrap methods. - bootstrapMethodsAttribute.bootstrapMethodEntryAccept(clazz, - bootstrapMethodAttributeIndex, - this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - // Check bootstrap method. - clazz.constantPoolEntryAccept(bootstrapMethodInfo.u2methodHandleIndex, - bootstrapMethodHandleVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantCounter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantCounter.java deleted file mode 100644 index 34337909..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantCounter.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.util.Counter; - -/** - * This ConstantVisitor counts the number of constants that have been visited. - * - * @author Eric Lafortune - */ -public class ConstantCounter -extends SimplifiedVisitor -implements ConstantVisitor, - Counter -{ - private int count; - - - // Implementations for Counter. - - /** - * Returns the number of class members that has been visited so far. - */ - public int getCount() - { - return count; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - count++; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantTagFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantTagFilter.java deleted file mode 100644 index 6c774e23..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantTagFilter.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.Constant; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor delegates its visits to one or more - * specified types of constants. - * - * @author Eric Lafortune - */ -public class ConstantTagFilter -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final int constantTagMask; - private final ConstantVisitor constantVisitor; - - - /** - * Creates a new ConstantTagFilter. - * @param constantTag the type of constants for which visits will be - * delegated. - * @param constantVisitor the ConstantVisitor to which visits - * will be delegated. - */ - public ConstantTagFilter(int constantTag, - ConstantVisitor constantVisitor) - { - this.constantTagMask = 1 << constantTag; - this.constantVisitor = constantVisitor; - } - - - /** - * Creates a new ConstantTagFilter. - * @param constantTags the types of constants for which visits will be - * delegated. - * @param constantVisitor the ConstantVisitor to which visits - * will be delegated. - */ - public ConstantTagFilter(int[] constantTags, - ConstantVisitor constantVisitor) - { - int constantTagMask = 0; - for (int index = 0; index < constantTags.length; index++) - { - constantTagMask |= 1 << constantTags[index]; - } - - this.constantTagMask = constantTagMask; - this.constantVisitor = constantVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - if (((1 << constant.getTag()) & constantTagMask) != 0) - { - constant.accept(clazz, constantVisitor); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantVisitor.java deleted file mode 100644 index 19b0e891..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ConstantVisitor.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.*; - - -/** - * This interface specifies the methods for a visitor of Constant - * objects. - * - * @author Eric Lafortune - */ -public interface ConstantVisitor -{ - public void visitIntegerConstant( Clazz clazz, IntegerConstant integerConstant); - public void visitLongConstant( Clazz clazz, LongConstant longConstant); - public void visitFloatConstant( Clazz clazz, FloatConstant floatConstant); - public void visitDoubleConstant( Clazz clazz, DoubleConstant doubleConstant); - public void visitPrimitiveArrayConstant( Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant); - public void visitStringConstant( Clazz clazz, StringConstant stringConstant); - public void visitUtf8Constant( Clazz clazz, Utf8Constant utf8Constant); - public void visitInvokeDynamicConstant( Clazz clazz, InvokeDynamicConstant invokeDynamicConstant); - public void visitMethodHandleConstant( Clazz clazz, MethodHandleConstant methodHandleConstant); - public void visitFieldrefConstant( Clazz clazz, FieldrefConstant fieldrefConstant); - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant); - public void visitMethodrefConstant( Clazz clazz, MethodrefConstant methodrefConstant); - public void visitClassConstant( Clazz clazz, ClassConstant classConstant); - public void visitMethodTypeConstant( Clazz clazz, MethodTypeConstant methodTypeConstant); - public void visitNameAndTypeConstant( Clazz clazz, NameAndTypeConstant nameAndTypeConstant); - public void visitModuleConstant( Clazz clazz, ModuleConstant moduleConstant); - public void visitPackageConstant( Clazz clazz, PackageConstant packageConstant); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ExceptClassConstantFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ExceptClassConstantFilter.java deleted file mode 100644 index 609bc5d9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/ExceptClassConstantFilter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor delegates its visits to class constants - * to another given ConstantVisitor, except for one given class. - * - * @author Eric Lafortune - */ -public class ExceptClassConstantFilter -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final String exceptClassName; - private final ConstantVisitor constantVisitor; - - - /** - * Creates a new ExceptClassConstantFilter. - * @param exceptClassName the name of the class that will not be visited. - * @param constantVisitor the ConstantVisitor to which visits - * will be delegated. - */ - public ExceptClassConstantFilter(String exceptClassName, - ConstantVisitor constantVisitor) - { - this.exceptClassName = exceptClassName; - this.constantVisitor = constantVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - if (!classConstant.getName(clazz).equals(exceptClassName)) - { - constantVisitor.visitClassConstant(clazz, classConstant); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/MethodrefTraveler.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/MethodrefTraveler.java deleted file mode 100644 index 17135ceb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/MethodrefTraveler.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor travels from any method handle constants that it visits - * to their methodref constants, and applies a given constant visitor. - * - * @author Eric Lafortune - */ -public class MethodrefTraveler -extends SimplifiedVisitor -implements ConstantVisitor -{ - private ConstantVisitor methodrefConstantVisitor; - - - /** - * Creates a new v that will delegate to the given constant visitor. - */ - public MethodrefTraveler(ConstantVisitor methodrefConstantVisitor) - { - this.methodrefConstantVisitor = methodrefConstantVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - clazz.constantPoolEntryAccept(methodHandleConstant.u2referenceIndex, - methodrefConstantVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/PrimitiveArrayConstantElementVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/PrimitiveArrayConstantElementVisitor.java deleted file mode 100644 index 0dd58f2c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/PrimitiveArrayConstantElementVisitor.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.PrimitiveArrayConstant; - -/** - * This interface specifies the methods for a visitor of primitive elements - * of the array of a PrimitiveArrayConstant. - * - * @author Eric Lafortune - */ -public interface PrimitiveArrayConstantElementVisitor -{ - public void visitBooleanArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, boolean value); - public void visitByteArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, byte value); - public void visitCharArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, char value); - public void visitShortArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, short value); - public void visitIntArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, int value); - public void visitFloatArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, float value); - public void visitLongArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, long value); - public void visitDoubleArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, double value); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/PrimitiveArrayConstantVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/PrimitiveArrayConstantVisitor.java deleted file mode 100644 index 79d015d9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/PrimitiveArrayConstantVisitor.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.PrimitiveArrayConstant; - -/** - * This interface specifies the methods for a visitor of PrimitiveArrayConstant - * instances containing different types of arrays. - * - * @author Eric Lafortune - */ -public interface PrimitiveArrayConstantVisitor -{ - public void visitBooleanArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, boolean[] values); - public void visitByteArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, byte[] values); - public void visitCharArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, char[] values); - public void visitShortArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, short[] values); - public void visitIntArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int[] values); - public void visitFloatArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, float[] values); - public void visitLongArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, long[] values); - public void visitDoubleArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, double[] values); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/SuperClassConstantVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/SuperClassConstantVisitor.java deleted file mode 100644 index 90ce7265..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/SuperClassConstantVisitor.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.constant.visitor; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor lets a given ConstantVisitor visit all the constant pool - * entries of the super class and interfaces of the program classes it visits. - * - * @author Eric Lafortune - */ -public class SuperClassConstantVisitor implements ClassVisitor -{ - private final boolean visitSuperClassConstants; - private final boolean visitInterfaceConstants; - private final ConstantVisitor constantVisitor; - - - /** - * Creates a new SuperClassConstantVisitor. - */ - public SuperClassConstantVisitor(boolean visitSuperClassConstants, - boolean visitInterfaceConstants, - ConstantVisitor constantVisitor) - { - this.visitSuperClassConstants = visitSuperClassConstants; - this.visitInterfaceConstants = visitInterfaceConstants; - this.constantVisitor = constantVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (visitSuperClassConstants) - { - programClass.superClassConstantAccept(constantVisitor); - } - - if (visitInterfaceConstants) - { - programClass.interfaceConstantsAccept(constantVisitor); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) {} -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/package.html deleted file mode 100644 index e20f48e5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/constant/visitor/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains visitors for class constants. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AccessFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AccessFixer.java deleted file mode 100644 index ea69f2e0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AccessFixer.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.AllElementValueVisitor; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor fixes the access modifiers of all classes and class - * members that are referenced by the classes that it visits. - * - * @author Eric Lafortune - */ -public class AccessFixer -implements ClassVisitor -{ - private final ClassVisitor referencedClassFixer = - new ReferencedClassVisitor( - new MyReferencedClassAccessFixer()); - - private final ClassVisitor referencedMemberFixer = - new AllMethodVisitor( - new AllAttributeVisitor( - new AllInstructionVisitor( - new MyReferencedMemberVisitor( - new MyReferencedMemberAccessFixer())))); - - private final ClassVisitor referencedAnnotationMethodFixer = - new AllAttributeVisitor(true, - new AllElementValueVisitor( - new MyReferencedMemberVisitor( - new MyReferencedMemberAccessFixer()))); - - private final ClassVisitor methodHierarchyFixer = - new AllMethodVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC, - new InitializerMethodFilter(null, - new SimilarMemberVisitor(false, true, false, true, - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC, - new MyReferencedMemberAccessFixer()))))); - - - // Fields acting as parameters for the visitors. - - private Clazz referencingClass; - private int referencingMethodAccessFlags; - private Clazz referencedClass; - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - // Remember the referencing class. - referencingClass = programClass; - - // Fix the referenced classes. - referencedClassFixer.visitProgramClass(programClass); - - // Fix the referenced class members. - referencedMemberFixer.visitProgramClass(programClass); - - // Fix the referenced annotation methods. - referencedAnnotationMethodFixer.visitProgramClass(programClass); - - // Fix overridden and overriding methods up and down the hierarchy. - // They are referenced implicitly and need to be accessible too. - referencingMethodAccessFlags = 0; - referencedClass = null; - - methodHierarchyFixer.visitProgramClass(programClass); - } - - - /** - * This ReferencedMemberVisitor is an InstructionVisitor that also - * remembers the access flags of the referencing methods, and the - * referenced class. - */ - private class MyReferencedMemberVisitor - extends ReferencedMemberVisitor - implements InstructionVisitor - { - public MyReferencedMemberVisitor(MemberVisitor memberVisitor) - { - super(memberVisitor); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Remember the access flags. - referencingMethodAccessFlags = method.getAccessFlags(); - - // Fix the referenced classes and class members. - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - - - // Overridden methods for ConstantVisitor. - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - // Remember the referenced class. Note that we're interested in the - // class of the invocation, not in the class in which the member was - // actually found, unless it is an array type. - if (ClassUtil.isInternalArrayType(refConstant.getClassName(clazz))) - { - // For an array type, the class will be java.lang.Object. - referencedClass = refConstant.referencedClass; - } - else - { - // Remember the referenced class. - clazz.constantPoolEntryAccept(refConstant.u2classIndex, this); - } - - // Fix the access flags of referenced class member. - super.visitAnyRefConstant(clazz, refConstant); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Remember the referenced class. - referencedClass = classConstant.referencedClass; - } - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) - { - // Set the referencing access flags and set the referenced class. - referencingMethodAccessFlags = ClassConstants.ACC_STATIC; - referencedClass = elementValue.referencedClass; - - // Fix the access flags of referenced annotation method. - super.visitAnyElementValue(clazz, annotation, elementValue); - } - } - - - /** - * This ClassVisitor fixes the access flags of the classes that it visits, - * relative to the referencing class. - */ - private class MyReferencedClassAccessFixer - extends SimplifiedVisitor - implements ClassVisitor, - AttributeVisitor, - InnerClassesInfoVisitor - { - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - // Do we need to update the access flags? - int currentAccessFlags = programClass.getAccessFlags(); - int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); - if (currentAccessLevel < AccessUtil.PUBLIC) - { - // Compute the required access level. - int requiredAccessLevel = - inSamePackage(programClass, referencingClass) ? - AccessUtil.PACKAGE_VISIBLE : - AccessUtil.PUBLIC; - - // Fix the class access flags if necessary. - if (currentAccessLevel < requiredAccessLevel) - { - programClass.u2accessFlags = - AccessUtil.replaceAccessFlags(currentAccessFlags, - AccessUtil.accessFlags(requiredAccessLevel)); - } - } - - // Also check the InnerClasses attribute, if any. - programClass.attributesAccept(this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - // Is this an inner class? - int innerClassIndex = innerClassesInfo.u2innerClassIndex; - if (innerClassIndex != 0) - { - String innerClassName = clazz.getClassName(innerClassIndex); - if (innerClassName.equals(clazz.getName())) - { - // Do we need to update the access flags? - int currentAccessFlags = innerClassesInfo.u2innerClassAccessFlags; - int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); - if (currentAccessLevel < AccessUtil.PUBLIC) - { - // Compute the required access level. - int requiredAccessLevel = - inSamePackage(clazz, referencingClass) ? - AccessUtil.PACKAGE_VISIBLE : - AccessUtil.PUBLIC; - - // Fix the inner class access flags if necessary. - if (currentAccessLevel < requiredAccessLevel) - { - innerClassesInfo.u2innerClassAccessFlags = - AccessUtil.replaceAccessFlags(currentAccessFlags, - AccessUtil.accessFlags(requiredAccessLevel)); - } - } - } - } - } - } - - - /** - * This MemberVisitor fixes the access flags of the class members that it - * visits, relative to the referencing class and method. - */ - private class MyReferencedMemberAccessFixer - extends SimplifiedVisitor - implements MemberVisitor - { - // Implementations for MemberVisitor. - - public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) {} - - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Do we need to update the access flags? - int currentAccessFlags = programMember.getAccessFlags(); - int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); - if (currentAccessLevel < AccessUtil.PUBLIC) - { - // Compute the required access level. - // For protected access, the referencing method may not be - // static. We're also taking into account the class in the - // invocation and the class that actually contains the member. - int requiredAccessLevel = - programClass.equals(referencingClass) ? AccessUtil.PRIVATE : - inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : - (referencingMethodAccessFlags & ClassConstants.ACC_STATIC) == 0 && - (referencedClass == null || - referencingClass.extends_(referencedClass)) && - referencingClass.extends_(programClass) ? AccessUtil.PROTECTED : - AccessUtil.PUBLIC; - - // Fix the class member access flags if necessary. - if (currentAccessLevel < requiredAccessLevel) - { - programMember.u2accessFlags = - AccessUtil.replaceAccessFlags(currentAccessFlags, - AccessUtil.accessFlags(requiredAccessLevel)); - } - } - } - } - - - // Small utility methods. - - /** - * Returns whether the two given classes are in the same package. - */ - private boolean inSamePackage(Clazz class1, Clazz class2) - { - return ClassUtil.internalPackageName(class1.getName()).equals( - ClassUtil.internalPackageName(class2.getName())); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AnnotationAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AnnotationAdder.java deleted file mode 100644 index 89430c58..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AnnotationAdder.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.AnnotationVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AnnotationVisitor adds all annotations that it visits to the given - * target annotation element value, target annotation attribute, or target - * parameter annotation attribute. - * - * @author Eric Lafortune - */ -public class AnnotationAdder -extends SimplifiedVisitor -implements AnnotationVisitor -{ - private static final ElementValue[] EMPTY_ELEMENT_VALUES = new ElementValue[0]; - - - private final ProgramClass targetClass; - private final AnnotationElementValue targetAnnotationElementValue; - private final AnnotationsAttributeEditor annotationsAttributeEditor; - private final ParameterAnnotationsAttributeEditor parameterAnnotationsAttributeEditor; - - private final ConstantAdder constantAdder; - - - /** - * Creates a new AnnotationAdder that will copy annotations into the given - * target annotation element value. - */ - public AnnotationAdder(ProgramClass targetClass, - AnnotationElementValue targetAnnotationElementValue) - { - this.targetClass = targetClass; - this.targetAnnotationElementValue = targetAnnotationElementValue; - this.annotationsAttributeEditor = null; - this.parameterAnnotationsAttributeEditor = null; - - constantAdder = new ConstantAdder(targetClass); - } - - - /** - * Creates a new AnnotationAdder that will copy annotations into the given - * target annotations attribute. - */ - public AnnotationAdder(ProgramClass targetClass, - AnnotationsAttribute targetAnnotationsAttribute) - { - this.targetClass = targetClass; - this.targetAnnotationElementValue = null; - this.annotationsAttributeEditor = new AnnotationsAttributeEditor(targetAnnotationsAttribute); - this.parameterAnnotationsAttributeEditor = null; - - constantAdder = new ConstantAdder(targetClass); - } - - - /** - * Creates a new AnnotationAdder that will copy annotations into the given - * target parameter annotations attribute. - */ - public AnnotationAdder(ProgramClass targetClass, - ParameterAnnotationsAttribute targetParameterAnnotationsAttribute) - { - this.targetClass = targetClass; - this.targetAnnotationElementValue = null; - this.annotationsAttributeEditor = null; - this.parameterAnnotationsAttributeEditor = new ParameterAnnotationsAttributeEditor(targetParameterAnnotationsAttribute); - - constantAdder = new ConstantAdder(targetClass); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - Annotation newAnnotation = - new Annotation(constantAdder.addConstant(clazz, annotation.u2typeIndex), - 0, - annotation.u2elementValuesCount > 0 ? - new ElementValue[annotation.u2elementValuesCount] : - EMPTY_ELEMENT_VALUES); - - // TODO: Clone array. - newAnnotation.referencedClasses = annotation.referencedClasses; - - // Add the element values. - annotation.elementValuesAccept(clazz, - new ElementValueAdder(targetClass, - newAnnotation, - false)); - - // What's the target? - if (targetAnnotationElementValue != null) - { - // Simply set the completed annotation. - targetAnnotationElementValue.annotationValue = newAnnotation; - } - else - { - // Add the completed annotation. - annotationsAttributeEditor.addAnnotation(newAnnotation); - } - } - - - public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation) - { - Annotation newAnnotation = - new Annotation(constantAdder.addConstant(clazz, annotation.u2typeIndex), - 0, - annotation.u2elementValuesCount > 0 ? - new ElementValue[annotation.u2elementValuesCount] : - EMPTY_ELEMENT_VALUES); - - // TODO: Clone array. - newAnnotation.referencedClasses = annotation.referencedClasses; - - // Add the element values. - annotation.elementValuesAccept(clazz, - new ElementValueAdder(targetClass, - newAnnotation, - false)); - - // Add the completed annotation. - parameterAnnotationsAttributeEditor.addAnnotation(parameterIndex, newAnnotation); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AnnotationsAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AnnotationsAttributeEditor.java deleted file mode 100644 index 35114c3e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AnnotationsAttributeEditor.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.annotation.*; - -/** - * This class can add annotations to a given annotations attribute. - * Annotations to be added must have been filled out beforehand. - * - * @author Eric Lafortune - */ -public class AnnotationsAttributeEditor -{ - private AnnotationsAttribute targetAnnotationsAttribute; - - - /** - * Creates a new AnnotationsAttributeEditor that will edit annotations in - * the given annotations attribute. - */ - public AnnotationsAttributeEditor(AnnotationsAttribute targetAnnotationsAttribute) - { - this.targetAnnotationsAttribute = targetAnnotationsAttribute; - } - - - /** - * Adds a given annotation to the annotations attribute. - */ - public void addAnnotation(Annotation annotation) - { - int annotationsCount = targetAnnotationsAttribute.u2annotationsCount; - Annotation[] annotations = targetAnnotationsAttribute.annotations; - - // Make sure there is enough space for the new annotation. - if (annotations.length <= annotationsCount) - { - targetAnnotationsAttribute.annotations = new Annotation[annotationsCount+1]; - System.arraycopy(annotations, 0, - targetAnnotationsAttribute.annotations, 0, - annotationsCount); - annotations = targetAnnotationsAttribute.annotations; - } - - // Add the annotation. - annotations[targetAnnotationsAttribute.u2annotationsCount++] = annotation; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributeAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributeAdder.java deleted file mode 100644 index bb189ca0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributeAdder.java +++ /dev/null @@ -1,536 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Arrays; - -/** - * This AttributeVisitor adds all attributes that it visits to the given - * target class, class member, or attribute. - * - * @author Eric Lafortune - */ -public class AttributeAdder -extends SimplifiedVisitor -implements AttributeVisitor -{ - private static final byte[] EMPTY_BYTES = new byte[0]; - private static final int[] EMPTY_INTS = new int[0]; - private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[0]; - private static final ExceptionInfo[] EMPTY_EXCEPTIONS = new ExceptionInfo[0]; - private static final Annotation[] EMPTY_ANNOTATIONS = new Annotation[0]; - - - private final ProgramClass targetClass; - private final ProgramMember targetMember; - private final CodeAttribute targetCodeAttribute; - private final boolean replaceAttributes; - - private final ConstantAdder constantAdder; - private final AttributesEditor attributesEditor; - - - /** - * Creates a new AttributeAdder that will copy attributes into the given - * target class. - */ - public AttributeAdder(ProgramClass targetClass, - boolean replaceAttributes) - { - this(targetClass, null, null, replaceAttributes); - } - - - /** - * Creates a new AttributeAdder that will copy attributes into the given - * target class member. - */ - public AttributeAdder(ProgramClass targetClass, - ProgramMember targetMember, - boolean replaceAttributes) - { - this(targetClass, targetMember, null, replaceAttributes); - } - - - /** - * Creates a new AttributeAdder that will copy attributes into the given - * target attribute. - */ - public AttributeAdder(ProgramClass targetClass, - ProgramMember targetMember, - CodeAttribute targetCodeAttribute, - boolean replaceAttributes) - { - this.targetClass = targetClass; - this.targetMember = targetMember; - this.targetCodeAttribute = targetCodeAttribute; - this.replaceAttributes = replaceAttributes; - - constantAdder = new ConstantAdder(targetClass); - attributesEditor = new AttributesEditor(targetClass, - targetMember, - targetCodeAttribute, - replaceAttributes); - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - // Create a copy of the attribute. - UnknownAttribute newUnknownAttribute = - new UnknownAttribute(constantAdder.addConstant(clazz, unknownAttribute.u2attributeNameIndex), - unknownAttribute.u4attributeLength, - unknownAttribute.info); - - // Add it to the target class. - attributesEditor.addAttribute(newUnknownAttribute); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - // Create a copy of the attribute. - SourceFileAttribute newSourceFileAttribute = - new SourceFileAttribute(constantAdder.addConstant(clazz, sourceFileAttribute.u2attributeNameIndex), - constantAdder.addConstant(clazz, sourceFileAttribute.u2sourceFileIndex)); - - // Add it to the target class. - attributesEditor.addAttribute(newSourceFileAttribute); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - // Create a copy of the attribute. - SourceDirAttribute newSourceDirAttribute = - new SourceDirAttribute(constantAdder.addConstant(clazz, sourceDirAttribute.u2attributeNameIndex), - constantAdder.addConstant(clazz, sourceDirAttribute.u2sourceDirIndex)); - - // Add it to the target class. - attributesEditor.addAttribute(newSourceDirAttribute); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Create a copy of the attribute. - InnerClassesAttribute newInnerClassesAttribute = - new InnerClassesAttribute(constantAdder.addConstant(clazz, innerClassesAttribute.u2attributeNameIndex), - 0, - null); - - // Add it to the target class. - attributesEditor.addAttribute(newInnerClassesAttribute); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - // Create a copy of the attribute. - EnclosingMethodAttribute newEnclosingMethodAttribute = - new EnclosingMethodAttribute(constantAdder.addConstant(clazz, enclosingMethodAttribute.u2attributeNameIndex), - constantAdder.addConstant(clazz, enclosingMethodAttribute.u2classIndex), - enclosingMethodAttribute.u2nameAndTypeIndex == 0 ? 0 : - constantAdder.addConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex)); - - newEnclosingMethodAttribute.referencedClass = enclosingMethodAttribute.referencedClass; - newEnclosingMethodAttribute.referencedMethod = enclosingMethodAttribute.referencedMethod; - - // Add it to the target class. - attributesEditor.addAttribute(newEnclosingMethodAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - // Create a copy of the attribute. - DeprecatedAttribute newDeprecatedAttribute = - new DeprecatedAttribute(constantAdder.addConstant(clazz, deprecatedAttribute.u2attributeNameIndex)); - - // Add it to the target. - attributesEditor.addAttribute(newDeprecatedAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - // Create a copy of the attribute. - SyntheticAttribute newSyntheticAttribute = - new SyntheticAttribute(constantAdder.addConstant(clazz, syntheticAttribute.u2attributeNameIndex)); - - // Add it to the target. - attributesEditor.addAttribute(newSyntheticAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - // Create a copy of the attribute. - SignatureAttribute newSignatureAttribute = - new SignatureAttribute(constantAdder.addConstant(clazz, signatureAttribute.u2attributeNameIndex), - constantAdder.addConstant(clazz, signatureAttribute.u2signatureIndex)); - - newSignatureAttribute.referencedClasses = signatureAttribute.referencedClasses; - - // Add it to the target. - attributesEditor.addAttribute(newSignatureAttribute); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - // Create a copy of the attribute. - ConstantValueAttribute newConstantValueAttribute = - new ConstantValueAttribute(constantAdder.addConstant(clazz, constantValueAttribute.u2attributeNameIndex), - constantAdder.addConstant(clazz, constantValueAttribute.u2constantValueIndex)); - - // Add it to the target field. - attributesEditor.addAttribute(newConstantValueAttribute); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - // Create a new local variable table attribute. - MethodParametersAttribute newMethodParametersAttribute = - new MethodParametersAttribute(constantAdder.addConstant(clazz, methodParametersAttribute.u2attributeNameIndex), - methodParametersAttribute.u1parametersCount, - new ParameterInfo[methodParametersAttribute.u1parametersCount]); - - // Add the local variables. - methodParametersAttribute.parametersAccept(clazz, - method, - new ParameterInfoAdder(targetClass, newMethodParametersAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newMethodParametersAttribute); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - // Create a new exceptions attribute. - ExceptionsAttribute newExceptionsAttribute = - new ExceptionsAttribute(constantAdder.addConstant(clazz, exceptionsAttribute.u2attributeNameIndex), - 0, - exceptionsAttribute.u2exceptionIndexTableLength > 0 ? - new int[exceptionsAttribute.u2exceptionIndexTableLength] : - EMPTY_INTS); - - // Add the exceptions. - exceptionsAttribute.exceptionEntriesAccept((ProgramClass)clazz, - new ExceptionAdder(targetClass, - newExceptionsAttribute)); - - // Add it to the target method. - attributesEditor.addAttribute(newExceptionsAttribute); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Create a new code attribute. - CodeAttribute newCodeAttribute = - new CodeAttribute(constantAdder.addConstant(clazz, codeAttribute.u2attributeNameIndex), - codeAttribute.u2maxStack, - codeAttribute.u2maxLocals, - 0, - EMPTY_BYTES, - 0, - codeAttribute.u2exceptionTableLength > 0 ? - new ExceptionInfo[codeAttribute.u2exceptionTableLength] : - EMPTY_EXCEPTIONS, - 0, - codeAttribute.u2attributesCount > 0 ? - new Attribute[codeAttribute.u2attributesCount] : - EMPTY_ATTRIBUTES); - - CodeAttributeComposer codeAttributeComposer = new CodeAttributeComposer(); - - codeAttributeComposer.beginCodeFragment(codeAttribute.u4codeLength + 32); - - // Add the instructions. - codeAttribute.instructionsAccept(clazz, - method, - new InstructionAdder(targetClass, - codeAttributeComposer)); - - // Append a label just after the code. - codeAttributeComposer.appendLabel(codeAttribute.u4codeLength); - - // Add the exceptions. - codeAttribute.exceptionsAccept(clazz, - method, - new ExceptionInfoAdder(targetClass, - codeAttributeComposer)); - - // Add a line number if there wasn't a line number table before, - // so we keep track of the source. - if (codeAttribute.getAttribute(clazz, ClassConstants.ATTR_LineNumberTable) == null) - { - String source = - clazz.getName() + '.' + - method.getName(clazz) + - method.getDescriptor(clazz) + - ":0:0"; - - codeAttributeComposer.insertLineNumber( - new ExtendedLineNumberInfo(0, 0, source)); - } - - codeAttributeComposer.endCodeFragment(); - - // Add the attributes. - codeAttribute.attributesAccept(clazz, - method, - new AttributeAdder(targetClass, - targetMember, - newCodeAttribute, - replaceAttributes)); - - // Apply these changes to the new code attribute. - codeAttributeComposer.visitCodeAttribute(targetClass, - (Method)targetMember, - newCodeAttribute); - - // Add the completed code attribute to the target method. - attributesEditor.addAttribute(newCodeAttribute); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - // TODO: Implement method. - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - // TODO: Implement method. - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - // Create a new line number table attribute. - LineNumberTableAttribute newLineNumberTableAttribute = - new LineNumberTableAttribute(constantAdder.addConstant(clazz, lineNumberTableAttribute.u2attributeNameIndex), - 0, - new LineNumberInfo[lineNumberTableAttribute.u2lineNumberTableLength]); - - // Add the line numbers. - lineNumberTableAttribute.accept(clazz, - method, - codeAttribute, - new LineNumberInfoAdder(newLineNumberTableAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newLineNumberTableAttribute); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Create a new local variable table attribute. - LocalVariableTableAttribute newLocalVariableTableAttribute = - new LocalVariableTableAttribute(constantAdder.addConstant(clazz, localVariableTableAttribute.u2attributeNameIndex), - 0, - new LocalVariableInfo[localVariableTableAttribute.u2localVariableTableLength]); - - // Add the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, - method, - codeAttribute, - new LocalVariableInfoAdder(targetClass, newLocalVariableTableAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newLocalVariableTableAttribute); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Create a new local variable type table attribute. - LocalVariableTypeTableAttribute newLocalVariableTypeTableAttribute = - new LocalVariableTypeTableAttribute(constantAdder.addConstant(clazz, localVariableTypeTableAttribute.u2attributeNameIndex), - 0, - new LocalVariableTypeInfo[localVariableTypeTableAttribute.u2localVariableTypeTableLength]); - - // Add the local variable types. - localVariableTypeTableAttribute.localVariablesAccept(clazz, - method, - codeAttribute, - new LocalVariableTypeInfoAdder(targetClass, newLocalVariableTypeTableAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newLocalVariableTypeTableAttribute); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - // Create a new annotations attribute. - RuntimeVisibleAnnotationsAttribute newAnnotationsAttribute = - new RuntimeVisibleAnnotationsAttribute(constantAdder.addConstant(clazz, runtimeVisibleAnnotationsAttribute.u2attributeNameIndex), - 0, - new Annotation[runtimeVisibleAnnotationsAttribute.u2annotationsCount]); - - // Add the annotations. - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, - new AnnotationAdder(targetClass, - newAnnotationsAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - // Create a new annotations attribute. - RuntimeInvisibleAnnotationsAttribute newAnnotationsAttribute = - new RuntimeInvisibleAnnotationsAttribute(constantAdder.addConstant(clazz, runtimeInvisibleAnnotationsAttribute.u2attributeNameIndex), - 0, - new Annotation[runtimeInvisibleAnnotationsAttribute.u2annotationsCount]); - - // Add the annotations. - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, - new AnnotationAdder(targetClass, - newAnnotationsAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newAnnotationsAttribute); - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - // Create a new annotations attribute. - Annotation[][] parameterAnnotations = - new Annotation[runtimeVisibleParameterAnnotationsAttribute.u1parametersCount][]; - - Arrays.fill(parameterAnnotations, EMPTY_ANNOTATIONS); - - RuntimeVisibleParameterAnnotationsAttribute newParameterAnnotationsAttribute = - new RuntimeVisibleParameterAnnotationsAttribute(constantAdder.addConstant(clazz, runtimeVisibleParameterAnnotationsAttribute.u2attributeNameIndex), - 0, - new int[runtimeVisibleParameterAnnotationsAttribute.u1parametersCount], - parameterAnnotations); - - // Add the annotations. - runtimeVisibleParameterAnnotationsAttribute.annotationsAccept(clazz, - method, - new AnnotationAdder(targetClass, - newParameterAnnotationsAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newParameterAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - // Create a new annotations attribute. - Annotation[][] parameterAnnotations = - new Annotation[runtimeInvisibleParameterAnnotationsAttribute.u1parametersCount][]; - - Arrays.fill(parameterAnnotations, EMPTY_ANNOTATIONS); - - RuntimeInvisibleParameterAnnotationsAttribute newParameterAnnotationsAttribute = - new RuntimeInvisibleParameterAnnotationsAttribute(constantAdder.addConstant(clazz, runtimeInvisibleParameterAnnotationsAttribute.u2attributeNameIndex), - 0, - new int[runtimeInvisibleParameterAnnotationsAttribute.u1parametersCount], - parameterAnnotations); - - // Add the annotations. - runtimeInvisibleParameterAnnotationsAttribute.annotationsAccept(clazz, - method, - new AnnotationAdder(targetClass, - newParameterAnnotationsAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newParameterAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - // Create a new type annotations attribute. - RuntimeVisibleTypeAnnotationsAttribute newTypeAnnotationsAttribute = - new RuntimeVisibleTypeAnnotationsAttribute(constantAdder.addConstant(clazz, runtimeVisibleTypeAnnotationsAttribute.u2attributeNameIndex), - 0, - new TypeAnnotation[runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount]); - - // Add the annotations. - runtimeVisibleTypeAnnotationsAttribute.typeAnnotationsAccept(clazz, - new TypeAnnotationAdder(targetClass, - newTypeAnnotationsAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - // Create a new type annotations attribute. - RuntimeInvisibleTypeAnnotationsAttribute newTypeAnnotationsAttribute = - new RuntimeInvisibleTypeAnnotationsAttribute(constantAdder.addConstant(clazz, runtimeInvisibleTypeAnnotationsAttribute.u2attributeNameIndex), - 0, - new TypeAnnotation[runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount]); - - // Add the annotations. - runtimeInvisibleTypeAnnotationsAttribute.typeAnnotationsAccept(clazz, - new TypeAnnotationAdder(targetClass, - newTypeAnnotationsAttribute)); - - // Add it to the target. - attributesEditor.addAttribute(newTypeAnnotationsAttribute); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Create a new annotation default attribute. - AnnotationDefaultAttribute newAnnotationDefaultAttribute = - new AnnotationDefaultAttribute(constantAdder.addConstant(clazz, annotationDefaultAttribute.u2attributeNameIndex), - null); - - // Add the annotations. - annotationDefaultAttribute.defaultValueAccept(clazz, - new ElementValueAdder(targetClass, - newAnnotationDefaultAttribute, - false)); - - // Add it to the target. - attributesEditor.addAttribute(newAnnotationDefaultAttribute); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributeSorter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributeSorter.java deleted file mode 100644 index ce444ac0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributeSorter.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -import java.util.*; - -/** - * This ClassVisitor sorts the attributes of the classes that it visits. - * The sorting order is based on the types of the attributes. - * - * @author Eric Lafortune - */ -public class AttributeSorter -extends SimplifiedVisitor -implements ClassVisitor, MemberVisitor, AttributeVisitor, Comparator -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Sort the attributes. - Arrays.sort(programClass.attributes, 0, programClass.u2attributesCount, this); - - // Sort the attributes of the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Sort the attributes. - Arrays.sort(programMember.attributes, 0, programMember.u2attributesCount, this); - - // Sort the attributes of the attributes. - programMember.attributesAccept(programClass, this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Sort the attributes. - Arrays.sort(codeAttribute.attributes, 0, codeAttribute.u2attributesCount, this); - } - - - // Implementations for Comparator. - - public int compare(Object object1, Object object2) - { - Attribute attribute1 = (Attribute)object1; - Attribute attribute2 = (Attribute)object2; - - return attribute1.u2attributeNameIndex < attribute2.u2attributeNameIndex ? -1 : - attribute1.u2attributeNameIndex > attribute2.u2attributeNameIndex ? 1 : - 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributesEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributesEditor.java deleted file mode 100644 index 8471854a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/AttributesEditor.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; - -/** - * This class can add and delete attributes to and from classes, fields, - * methods, and code attributes. Attributes to be added must be filled out - * beforehand, including their references to the constant pool. Existing - * attributes of the same type are always replaced. - * - * @author Eric Lafortune - */ -public class AttributesEditor -{ - private final ProgramClass targetClass; - private final ProgramMember targetMember; - private final CodeAttribute targetAttribute; - private final boolean replaceAttributes; - - - /** - * Creates a new AttributeAdder that will edit attributes in the given - * target class. - */ - public AttributesEditor(ProgramClass targetClass, - boolean replaceAttributes) - { - this(targetClass, null, null, replaceAttributes); - } - - - /** - * Creates a new AttributeAdder that will edit attributes in the given - * target class member. - */ - public AttributesEditor(ProgramClass targetClass, - ProgramMember targetMember, - boolean replaceAttributes) - { - this(targetClass, targetMember, null, replaceAttributes); - } - - - /** - * Creates a new AttributeAdder that will edit attributes in the given - * target code attribute. - */ - public AttributesEditor(ProgramClass targetClass, - ProgramMember targetMember, - CodeAttribute targetAttribute, - boolean replaceAttributes) - { - this.targetClass = targetClass; - this.targetMember = targetMember; - this.targetAttribute = targetAttribute; - this.replaceAttributes = replaceAttributes; - } - - - /** - * Finds the specified attribute in the target. - */ - public Attribute findAttribute(String attributeName) - { - // What's the target? - return - targetAttribute != null ? - findAttribute(targetAttribute.u2attributesCount, - targetAttribute.attributes, - attributeName) : - targetMember != null ? - findAttribute(targetMember.u2attributesCount, - targetMember.attributes, - attributeName) : - findAttribute(targetClass.u2attributesCount, - targetClass.attributes, - attributeName); - } - - - /** - * Adds the given attribute to the target. - */ - public void addAttribute(Attribute attribute) - { - // What's the target? - if (targetAttribute != null) - { - // Try to replace an existing attribute. - if (!replaceAttributes || - !replaceAttribute(targetAttribute.u2attributesCount, - targetAttribute.attributes, - attribute)) - { - // Otherwise append the attribute. - targetAttribute.attributes = - addAttribute(targetAttribute.u2attributesCount, - targetAttribute.attributes, - attribute); - - targetAttribute.u2attributesCount++; - } - } - else if (targetMember != null) - { - // Try to replace an existing attribute. - if (!replaceAttributes || - !replaceAttribute(targetMember.u2attributesCount, - targetMember.attributes, - attribute)) - { - // Otherwise append the attribute. - targetMember.attributes = - addAttribute(targetMember.u2attributesCount, - targetMember.attributes, - attribute); - - targetMember.u2attributesCount++; - } - } - else - { - // Try to replace an existing attribute. - if (!replaceAttributes || - !replaceAttribute(targetClass.u2attributesCount, - targetClass.attributes, - attribute)) - { - // Otherwise append the attribute. - targetClass.attributes = - addAttribute(targetClass.u2attributesCount, - targetClass.attributes, - attribute); - - targetClass.u2attributesCount++; - } - } - } - - - /** - * Deletes the specified attribute from the target. - */ - public void deleteAttribute(String attributeName) - { - // What's the target? - if (targetAttribute != null) - { - targetAttribute.u2attributesCount = - deleteAttribute(targetAttribute.u2attributesCount, - targetAttribute.attributes, - attributeName); - } - else if (targetMember != null) - { - targetMember.u2attributesCount = - deleteAttribute(targetMember.u2attributesCount, - targetMember.attributes, - attributeName); - } - else - { - targetClass.u2attributesCount = - deleteAttribute(targetClass.u2attributesCount, - targetClass.attributes, - attributeName); - } - } - - - // Small utility methods. - - /** - * Tries to put the given attribute in place of an existing attribute of - * the same name, returning whether it was present. - */ - private boolean replaceAttribute(int attributesCount, - Attribute[] attributes, - Attribute attribute) - { - // Find the attribute with the same name. - int index = findAttributeIndex(attributesCount, - attributes, - attribute.getAttributeName(targetClass)); - if (index < 0) - { - return false; - } - - attributes[index] = attribute; - - return true; - } - - - /** - * Appends the given attribute to the given array of attributes, creating a - * new array if necessary. - */ - private Attribute[] addAttribute(int attributesCount, - Attribute[] attributes, - Attribute attribute) - { - // Is the array too small to contain the additional attribute? - if (attributes.length <= attributesCount) - { - // Create a new array and copy the attributes into it. - Attribute[] newAttributes = new Attribute[attributesCount + 1]; - System.arraycopy(attributes, 0, - newAttributes, 0, - attributesCount); - attributes = newAttributes; - } - - // Append the attribute. - attributes[attributesCount] = attribute; - - return attributes; - } - - - /** - * Deletes the attributes with the given name from the given array of - * attributes, returning the new number of attributes. - */ - private int deleteAttribute(int attributesCount, - Attribute[] attributes, - String attributeName) - { - // Find the attribute. - int index = findAttributeIndex(attributesCount, - attributes, - attributeName); - if (index < 0) - { - return attributesCount; - } - - // Shift the other attributes in the array. - System.arraycopy(attributes, index + 1, - attributes, index, - attributesCount - index - 1); - - // Clear the last entry in the array. - attributes[--attributesCount] = null; - - return attributesCount; - } - - - /** - * Finds the index of the attribute with the given name in the given - * array of attributes. - */ - private int findAttributeIndex(int attributesCount, - Attribute[] attributes, - String attributeName) - { - for (int index = 0; index < attributesCount; index++) - { - Attribute attribute = attributes[index]; - - if (attribute.getAttributeName(targetClass).equals(attributeName)) - { - return index; - } - } - - return -1; - } - - - /** - * Finds the attribute with the given name in the given - * array of attributes. - */ - private Attribute findAttribute(int attributesCount, - Attribute[] attributes, - String attributeName) - { - for (int index = 0; index < attributesCount; index++) - { - Attribute attribute = attributes[index]; - - if (attribute.getAttributeName(targetClass).equals(attributeName)) - { - return attribute; - } - } - - return null; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodInfoAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodInfoAdder.java deleted file mode 100644 index 003c4d82..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodInfoAdder.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.BootstrapMethodInfoVisitor; - -/** - * This BootstrapMethodInfoVisitor adds all bootstrap methods that it visits to - * the given target bootstrap methods attribute. - */ -public class BootstrapMethodInfoAdder -implements BootstrapMethodInfoVisitor -{ - private final ConstantAdder constantAdder; - private final BootstrapMethodsAttributeEditor bootstrapMethodsAttributeEditor; - - private int bootstrapMethodIndex; - - - /** - * Creates a new BootstrapMethodInfoAdder that will copy bootstrap methods - * into the given bootstrap methods attribute. - */ - public BootstrapMethodInfoAdder(ProgramClass targetClass, - BootstrapMethodsAttribute targetBootstrapMethodsAttribute) - { - this.constantAdder = new ConstantAdder(targetClass); - this.bootstrapMethodsAttributeEditor = new BootstrapMethodsAttributeEditor(targetBootstrapMethodsAttribute); - } - - - /** - * Returns the index of the most recently added bootstrap method. - */ - public int getBootstrapMethodIndex() - { - return bootstrapMethodIndex; - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - // Copy the method arguments. - int methodArgumentCount = bootstrapMethodInfo.u2methodArgumentCount; - int[] methodArguments = bootstrapMethodInfo.u2methodArguments; - int[] newMethodArguments = new int[methodArgumentCount]; - - for (int index = 0; index < methodArgumentCount; index++) - { - newMethodArguments[index] = - constantAdder.addConstant(clazz, methodArguments[index]); - } - - // Create a new bootstrap method. - BootstrapMethodInfo newBootstrapMethodInfo = - new BootstrapMethodInfo(constantAdder.addConstant(clazz, bootstrapMethodInfo.u2methodHandleIndex), - methodArgumentCount, - newMethodArguments); - - // Add it to the target. - bootstrapMethodIndex = - bootstrapMethodsAttributeEditor.addBootstrapMethodInfo(newBootstrapMethodInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodRemapper.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodRemapper.java deleted file mode 100644 index a9785107..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodRemapper.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor remaps all possible indices of bootstrap methods - * of the constants that it visits, based on a given index map. - * - * @author Eric Lafortune - */ -public class BootstrapMethodRemapper -extends SimplifiedVisitor -implements ConstantVisitor -{ - private int[] bootstrapMethodIndexMap; - - // Ignore (skip) lingering InvokeDynamic constants that - // refer to removed bootstrap methods. - private final boolean ignoreDanglingConstants; - - public BootstrapMethodRemapper() - { - this(false); - } - - public BootstrapMethodRemapper(boolean ignoreDanglingConstants) - { - this.ignoreDanglingConstants = ignoreDanglingConstants; - } - - - /** - * Sets the given mapping of old constant pool entry indexes to their new - * indexes. - */ - public void setBootstrapMethodIndexMap(int[] bootstrapMethodIndexMap) - { - this.bootstrapMethodIndexMap = bootstrapMethodIndexMap; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - invokeDynamicConstant.u2bootstrapMethodAttributeIndex = - remapConstantIndex(invokeDynamicConstant.u2bootstrapMethodAttributeIndex); - } - - - // Small utility methods. - - /** - * Returns the latest bootstrap method index of the entry at the - * given index. - */ - private int remapConstantIndex(int constantIndex) - { - int remappedConstantIndex = bootstrapMethodIndexMap[constantIndex]; - if (remappedConstantIndex < 0) - { - if (ignoreDanglingConstants) - { - return constantIndex; - } - else - { - throw new IllegalArgumentException("Can't remap bootstrap method index ["+constantIndex+"]"); - } - } - - return remappedConstantIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeAdder.java deleted file mode 100644 index 9f64885a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeAdder.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.BootstrapMethodInfoVisitor; - -/** - * This BootstrapMethodInfoVisitor adds all bootstrap methods that it visits to - * the given target class, creating a bootstrap methods attribute if necessary. - */ -public class BootstrapMethodsAttributeAdder -implements BootstrapMethodInfoVisitor -{ - private final ProgramClass targetClass; - private final ConstantPoolEditor constantPoolEditor; - private BootstrapMethodInfoAdder bootstrapMethodInfoAdder; - - - /** - * Creates a new BootstrapMethodsAttributeAdder that will copy bootstrap - * methods into the given target class/ - */ - public BootstrapMethodsAttributeAdder(ProgramClass targetClass) - { - this.targetClass = targetClass; - this.constantPoolEditor = new ConstantPoolEditor(targetClass); - } - - - /** - * Returns the index of the most recently added bootstrap method. - */ - public int getBootstrapMethodIndex() - { - return bootstrapMethodInfoAdder.getBootstrapMethodIndex(); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - // Make sure we have a bootstrap methods attribute adder. - if (bootstrapMethodInfoAdder == null) - { - // Make sure we have a target bootstrap methods attribute. - AttributesEditor attributesEditor = - new AttributesEditor(targetClass, false); - - BootstrapMethodsAttribute targetBootstrapMethodsAttribute = - (BootstrapMethodsAttribute)attributesEditor.findAttribute(ClassConstants.ATTR_BootstrapMethods); - - if (targetBootstrapMethodsAttribute == null) - { - targetBootstrapMethodsAttribute = - new BootstrapMethodsAttribute(constantPoolEditor.addUtf8Constant(ClassConstants.ATTR_BootstrapMethods), - 0, - new BootstrapMethodInfo[0]); - - attributesEditor.addAttribute(targetBootstrapMethodsAttribute); - } - - // Create a bootstrap method adder for it. - bootstrapMethodInfoAdder = new BootstrapMethodInfoAdder(targetClass, - targetBootstrapMethodsAttribute); - } - - // Delegate to the bootstrap method adder. - bootstrapMethodInfoAdder.visitBootstrapMethodInfo(clazz, bootstrapMethodInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeEditor.java deleted file mode 100644 index 870762ba..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeEditor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.*; -import proguard.util.ArrayUtil; - -/** - * This class can add/remove bootstrap methods to/from a given bootstrap methods - * attribute. Bootstrap methods to be added must have been filled out beforehand. - * - * @author Eric Lafortune - */ -public class BootstrapMethodsAttributeEditor -{ - private BootstrapMethodsAttribute targetBootstrapMethodsAttribute; - - - /** - * Creates a new BootstrapMethodsAttributeEditor that will edit bootstrap - * methods in the given bootstrap methods attribute. - */ - public BootstrapMethodsAttributeEditor(BootstrapMethodsAttribute targetBootstrapMethodsAttribute) - { - this.targetBootstrapMethodsAttribute = targetBootstrapMethodsAttribute; - } - - - /** - * Adds a given bootstrap method to the bootstrap methods attribute. - * @return the index of the bootstrap method. - */ - public int addBootstrapMethodInfo(BootstrapMethodInfo bootstrapMethodInfo) - { - targetBootstrapMethodsAttribute.bootstrapMethods = - ArrayUtil.add(targetBootstrapMethodsAttribute.bootstrapMethods, - targetBootstrapMethodsAttribute.u2bootstrapMethodsCount, - bootstrapMethodInfo); - - return targetBootstrapMethodsAttribute.u2bootstrapMethodsCount++; - } - - - /** - * Removes the given bootstrap method from the bootstrap method attribute. - */ - public void removeBootstrapMethodInfo(BootstrapMethodInfo bootstrapMethodInfo) - { - ArrayUtil.remove(targetBootstrapMethodsAttribute.bootstrapMethods, - targetBootstrapMethodsAttribute.u2bootstrapMethodsCount--, - findBootstrapMethodInfoIndex(bootstrapMethodInfo)); - } - - - /** - * Finds the index of the given bootstrap method info in the target attribute. - */ - private int findBootstrapMethodInfoIndex(BootstrapMethodInfo bootstrapMethodInfo) - { - int methodsCount = targetBootstrapMethodsAttribute.u2bootstrapMethodsCount; - BootstrapMethodInfo[] methodInfos = targetBootstrapMethodsAttribute.bootstrapMethods; - - for (int index = 0; index < methodsCount; index++) - { - if (methodInfos[index].equals(bootstrapMethodInfo)) - { - return index; - } - } - - return methodsCount; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeShrinker.java deleted file mode 100644 index 7020f507..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BootstrapMethodsAttributeShrinker.java +++ /dev/null @@ -1,339 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.classfile.VisitorAccepter; - -import java.util.Arrays; - -/** - * This ClassVisitor removes all unused entries from the bootstrap method attribute. - * - * If all bootstrap methods are removed, it also removes the BootstrapMethodsAttribute from - * the visited class. Additionally, the java/lang/MethodHandles$Lookup class will be - * removed from the InnerClasses attribute and the InnerClassesAttribute will be removed if - * it was the only entry. - * - * @author Tim Van Den Broecke - */ -public class BootstrapMethodsAttributeShrinker -extends SimplifiedVisitor -implements ClassVisitor, - - // Implementation interfaces. - MemberVisitor, - AttributeVisitor, - InstructionVisitor, - BootstrapMethodInfoVisitor -{ - // A visitor info flag to indicate the bootstrap method is being used. - private static final Object USED = new Object(); - - private int[] bootstrapMethodIndexMap = new int[ClassConstants.TYPICAL_BOOTSTRAP_METHODS_ATTRIBUTE_SIZE]; - private final BootstrapMethodRemapper bootstrapMethodRemapper = new BootstrapMethodRemapper(true); - - private int referencedBootstrapMethodIndex = -1; - private boolean modified = false; - - - // Implementations for ClassVisitor. - - @Override - public void visitLibraryClass(LibraryClass libaryClass) {} - - - @Override - public void visitProgramClass(ProgramClass programClass) - { - // Clear the fields from any previous runs. - modified = false; - bootstrapMethodIndexMap = new int[ClassConstants.TYPICAL_BOOTSTRAP_METHODS_ATTRIBUTE_SIZE]; - - // Remove any previous visitor info. - programClass.accept(new ClassCleaner()); - - // Mark the bootstrap methods referenced by invokeDynamic instructions. - programClass.methodsAccept(this); - - // Shrink the bootstrap methods attribute - programClass.attributesAccept(this); - - if (modified) - { - // Clean up dangling and freed up constants - programClass.accept(new ConstantPoolShrinker()); - } - } - - - // Implementations for MemberVisitor. - - @Override - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - programMethod.attributesAccept(programClass, this); - } - - - // Implementations for AttributeVisitor. - - @Override - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - @Override - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.instructionsAccept(clazz, method, this); - } - - - @Override - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - if (referencedBootstrapMethodIndex > -1) - { - // We're marking bootstrap methods - bootstrapMethodsAttribute.bootstrapMethodEntryAccept(clazz, referencedBootstrapMethodIndex, this); - } - else - { - // The bootstrap methods have been marked, so now we shrink the array of BootstrapMethodInfo objects. - int newBootstrapMethodsCount = - shrinkBootstrapMethodArray(bootstrapMethodsAttribute.bootstrapMethods, - bootstrapMethodsAttribute.u2bootstrapMethodsCount); - - if (newBootstrapMethodsCount < bootstrapMethodsAttribute.u2bootstrapMethodsCount) - { - modified = true; - - bootstrapMethodsAttribute.u2bootstrapMethodsCount = newBootstrapMethodsCount; - - if (bootstrapMethodsAttribute.u2bootstrapMethodsCount == 0) - { - // Remove the entire attribute. - AttributesEditor attributesEditor = new AttributesEditor((ProgramClass)clazz, false); - attributesEditor.deleteAttribute(ClassConstants.ATTR_BootstrapMethods); - - // Only bootstrap methods require the java/lang/MethodHandles$Lookup - // inner class, so we can remove it. - clazz.attributesAccept(new MethodHandlesLookupInnerClassRemover(attributesEditor)); - } - else - { - // Remap all constant pool references to remaining bootstrap methods. - bootstrapMethodRemapper.setBootstrapMethodIndexMap(bootstrapMethodIndexMap); - clazz.constantPoolEntriesAccept(bootstrapMethodRemapper); - } - } - } - } - - - // Implementations for InstructionVisitor. - - @Override - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - @Override - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_INVOKEDYNAMIC) - { - ProgramClass programClass = (ProgramClass)clazz; - - InvokeDynamicConstant invokeDynamicConstant = - (InvokeDynamicConstant)programClass.getConstant(constantInstruction.constantIndex); - - referencedBootstrapMethodIndex = invokeDynamicConstant.getBootstrapMethodAttributeIndex(); - - programClass.attributesAccept(this); - - referencedBootstrapMethodIndex = -1; - } - } - - - // Implementations for BootstrapMethodInfoVisitor. - - @Override - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - markAsUsed(bootstrapMethodInfo); - } - - - // Small utility methods. - - /** - * Marks the given visitor accepter as being used. - */ - private void markAsUsed(BootstrapMethodInfo bootstrapMethodInfo) - { - bootstrapMethodInfo.setVisitorInfo(USED); - } - - - /** - * Returns whether the given visitor accepter has been marked as being used. - */ - private boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } - - - /** - * Removes all entries that are not marked as being used from the given - * array of bootstrap methods. Creates a map from the old indices to the - * new indices as a side effect. - * @return the new number of entries. - */ - private int shrinkBootstrapMethodArray(BootstrapMethodInfo[] bootstrapMethods, int length) - { - if (bootstrapMethodIndexMap.length < length) - { - bootstrapMethodIndexMap = new int[length]; - } - - int counter = 0; - - // Shift the used bootstrap methods together. - for (int index = 0; index < length; index++) - { - BootstrapMethodInfo bootstrapMethod = bootstrapMethods[index]; - - // Is the entry being used? - if (isUsed(bootstrapMethod)) - { - // Remember the new index. - bootstrapMethodIndexMap[index] = counter; - - // Shift the entry. - bootstrapMethods[counter++] = bootstrapMethod; - } - else - { - // Remember an invalid index. - bootstrapMethodIndexMap[index] = -1; - } - } - - // Clear the remaining bootstrap methods. - Arrays.fill(bootstrapMethods, counter, length, null); - - return counter; - } - - private class MethodHandlesLookupInnerClassRemover - extends SimplifiedVisitor - implements AttributeVisitor, - - // Implementation interfaces. - InnerClassesInfoVisitor - { - private static final String METHOD_HANDLES_CLASS = "java/lang/invoke/MethodHandles"; - - private final Object methodHandleLookupMarker = new Object(); - - private final AttributesEditor attributesEditor; - - public MethodHandlesLookupInnerClassRemover(AttributesEditor attributesEditor) - { - this.attributesEditor = attributesEditor; - } - - // Implementations for AttributeVisitor - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Mark inner class infos that refer to Lookup. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - - // Remove all marked inner classes. - InnerClassesAttributeEditor editor = - new InnerClassesAttributeEditor(innerClassesAttribute); - for (int index = innerClassesAttribute.u2classesCount - 1; index >= 0; index--) - { - InnerClassesInfo innerClassesInfo = innerClassesAttribute.classes[index]; - if (shouldBeRemoved(innerClassesInfo)) - { - editor.removeInnerClassesInfo(innerClassesInfo); - } - } - - // Remove the attribute if it is empty. - if (innerClassesAttribute.u2classesCount == 0) - { - attributesEditor.deleteAttribute(ClassConstants.ATTR_InnerClasses); - } - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - ProgramClass programClass = (ProgramClass) clazz; - - ClassConstant innerClass = - (ClassConstant) programClass.getConstant(innerClassesInfo.u2innerClassIndex); - ClassConstant outerClass = - (ClassConstant) programClass.getConstant(innerClassesInfo.u2outerClassIndex); - - if (isMethodHandleClass(innerClass, clazz) || - isMethodHandleClass(outerClass, clazz)) - { - markForRemoval(innerClassesInfo); - } - } - - - // Small utility methods. - - private void markForRemoval(InnerClassesInfo innerClassesInfo) - { - innerClassesInfo.setVisitorInfo(methodHandleLookupMarker); - } - - private boolean shouldBeRemoved(InnerClassesInfo innerClassesInfo) - { - return innerClassesInfo.getVisitorInfo() == methodHandleLookupMarker; - } - - public boolean isMethodHandleClass(ClassConstant classConstant, Clazz clazz) - { - return classConstant != null && - classConstant.getName(clazz).startsWith(METHOD_HANDLES_CLASS); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BridgeMethodFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BridgeMethodFixer.java deleted file mode 100644 index e11eea4f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/BridgeMethodFixer.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.RefConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor fixes all inappropriate bridge access flags of the - * program methods that it visits, checking whether the methods to which they - * bridge have the same name. Some compilers, like in Eclipse and in later - * versions of JDK 1.6, complain if they can't find the method with the same - * name. - * - * @author Eric Lafortune - */ -public class BridgeMethodFixer -extends SimplifiedVisitor -implements MemberVisitor, - AttributeVisitor, - InstructionVisitor, - ConstantVisitor -{ - private static final boolean DEBUG = false; - - - // Return values for the visitor methods. - private String bridgedMethodName; - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if ((programMethod.getAccessFlags() & ClassConstants.ACC_BRIDGE) != 0) - { - programMethod.attributesAccept(programClass, this); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Go over the instructions of the bridge method. - codeAttribute.instructionsAccept(clazz, method, this); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - // Get the name of the bridged method. - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - - // Check if the name is different. - if (!method.getName(clazz).equals(bridgedMethodName)) - { - if (DEBUG) - { - System.out.println("BridgeMethodFixer: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] does not bridge to ["+bridgedMethodName+"]"); - } - - // Clear the bridge flag. - ((ProgramMethod)method).u2accessFlags &= ~ClassConstants.ACC_BRIDGE; - } - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - bridgedMethodName = refConstant.getName(clazz); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassEditor.java deleted file mode 100644 index aa0b82de..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassEditor.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; - -/** - * This class can add interfaces and class members to a given class. - * Elements to be added must be filled out beforehand, including their - * references to the constant pool. - * - * @author Eric Lafortune - */ -public class ClassEditor -{ - private static final boolean DEBUG = false; - - private ProgramClass targetClass; - - - /** - * Creates a new ClassEditor that will edit elements in the given - * target class. - */ - public ClassEditor(ProgramClass targetClass) - { - this.targetClass = targetClass; - } - - - /** - * Adds the given interface. - */ - public void addInterface(int interfaceConstantIndex) - { - int interfacesCount = targetClass.u2interfacesCount; - int[] interfaces = targetClass.u2interfaces; - - // Make sure there is enough space for the new interface. - if (interfaces.length <= interfacesCount) - { - targetClass.u2interfaces = new int[interfacesCount+1]; - System.arraycopy(interfaces, 0, - targetClass.u2interfaces, 0, - interfacesCount); - interfaces = targetClass.u2interfaces; - } - - if (DEBUG) - { - System.out.println(targetClass.getName()+": adding interface ["+targetClass.getClassName(interfaceConstantIndex)+"]"); - } - - // Add the interface. - interfaces[targetClass.u2interfacesCount++] = interfaceConstantIndex; - } - - /** - * Removes the given interface. - */ - public void removeInterface(int interfaceConstantIndex) - { - int interfacesCount = targetClass.u2interfacesCount; - int[] interfaces = targetClass.u2interfaces; - - int interfaceIndex = findInterfaceIndex(interfaceConstantIndex); - - // Shift the interface entries. - System.arraycopy(interfaces, interfaceIndex+1, - interfaces, interfaceIndex, - interfacesCount - interfaceIndex - 1); - - // Clear the last entry. - interfaces[--targetClass.u2interfacesCount] = 0; - } - - - /** - * Finds the index of the given interface in the target class. - */ - - private int findInterfaceIndex(int interfaceConstantIndex) - { - int interfacesCount = targetClass.u2interfacesCount; - int[] interfaces = targetClass.u2interfaces; - - for (int index = 0; index < interfacesCount; index++) - { - if (interfaces[index] == interfaceConstantIndex) - { - return index; - } - } - - return interfacesCount; - } - - - /** - * Adds the given field. - */ - public void addField(Field field) - { - int fieldsCount = targetClass.u2fieldsCount; - Field[] fields = targetClass.fields; - - // Make sure there is enough space for the new field. - if (fields.length <= fieldsCount) - { - targetClass.fields = new ProgramField[fieldsCount+1]; - System.arraycopy(fields, 0, - targetClass.fields, 0, - fieldsCount); - fields = targetClass.fields; - } - - if (DEBUG) - { - System.out.println(targetClass.getName()+": adding field ["+field.getName(targetClass)+" "+field.getDescriptor(targetClass)+"]"); - } - - // Add the field. - fields[targetClass.u2fieldsCount++] = field; - } - - - /** - * Removes the given field. Note that removing a field that is still being - * referenced can cause unpredictable effects. - */ - public void removeField(Field field) - { - int fieldsCount = targetClass.u2fieldsCount; - Field[] fields = targetClass.fields; - - int fieldIndex = findFieldIndex(field); - - // Shift the field entries. - System.arraycopy(fields, fieldIndex+1, - fields, fieldIndex, - fieldsCount - fieldIndex - 1); - - // Clear the last entry. - fields[--targetClass.u2fieldsCount] = null; - } - - - /** - * Finds the index of the given field in the target class. - */ - - private int findFieldIndex(Field field) - { - int fieldsCount = targetClass.u2fieldsCount; - Field[] fields = targetClass.fields; - - for (int index = 0; index < fieldsCount; index++) - { - if (fields[index].equals(field)) - { - return index; - } - } - - return fieldsCount; - } - - - /** - * Adds the given method. - */ - public void addMethod(Method method) - { - int methodsCount = targetClass.u2methodsCount; - Method[] methods = targetClass.methods; - - // Make sure there is enough space for the new method. - if (methods.length <= methodsCount) - { - targetClass.methods = new ProgramMethod[methodsCount+1]; - System.arraycopy(methods, 0, - targetClass.methods, 0, - methodsCount); - methods = targetClass.methods; - } - - if (DEBUG) - { - System.out.println(targetClass.getName()+": adding method ["+method.getName(targetClass)+method.getDescriptor(targetClass)+"]"); - } - - // Add the method. - methods[targetClass.u2methodsCount++] = method; - } - - - /** - * Removes the given method. Note that removing a method that is still being - * referenced can cause unpredictable effects. - */ - public void removeMethod(Method method) - { - int methodsCount = targetClass.u2methodsCount; - Method[] methods = targetClass.methods; - - int methodIndex = findMethodIndex(method); - - // Shift the method entries. - System.arraycopy(methods, methodIndex+1, - methods, methodIndex, - methodsCount - methodIndex - 1); - - // Clear the last entry. - methods[--targetClass.u2methodsCount] = null; - } - - - /** - * Finds the index of the given method in the target class. - */ - - private int findMethodIndex(Method method) - { - int methodsCount = targetClass.u2methodsCount; - Method[] methods = targetClass.methods; - - for (int index = 0; index < methodsCount; index++) - { - if (methods[index].equals(method)) - { - return index; - } - } - - return methodsCount; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassElementSorter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassElementSorter.java deleted file mode 100644 index 24924537..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassElementSorter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.ProgramClass; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor sorts the various elements of the classes that it visits: - * interfaces, constants, fields, methods, and attributes. - * - * @author Eric Lafortune - */ -public class ClassElementSorter -extends SimplifiedVisitor -implements ClassVisitor -{ - private final ClassVisitor interfaceSorter = new InterfaceSorter(); - private final ClassVisitor constantPoolSorter = new ConstantPoolSorter(); -// private ClassVisitor classMemberSorter = new ClassMemberSorter(); - private final ClassVisitor attributeSorter = new AttributeSorter(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.accept(constantPoolSorter); - programClass.accept(interfaceSorter); -// programClass.accept(classMemberSorter); - programClass.accept(attributeSorter); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassMemberSorter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassMemberSorter.java deleted file mode 100644 index 281466b2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassMemberSorter.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.*; - -/** - * This ClassVisitor sorts the class members of the classes that it visits. - * The sorting order is based on the access flags, the names, and the - * descriptors. - * - * @author Eric Lafortune - */ -public class ClassMemberSorter implements ClassVisitor, Comparator -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Sort the fields. - Arrays.sort(programClass.fields, 0, programClass.u2fieldsCount, this); - - // Sort the methods. - Arrays.sort(programClass.methods, 0, programClass.u2methodsCount, this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - } - - - // Implementations for Comparator. - - public int compare(Object object1, Object object2) - { - ProgramMember member1 = (ProgramMember)object1; - ProgramMember member2 = (ProgramMember)object2; - - return member1.u2accessFlags < member2.u2accessFlags ? -1 : - member1.u2accessFlags > member2.u2accessFlags ? 1 : - member1.u2nameIndex < member2.u2nameIndex ? -1 : - member1.u2nameIndex > member2.u2nameIndex ? 1 : - member1.u2descriptorIndex < member2.u2descriptorIndex ? -1 : - member1.u2descriptorIndex > member2.u2descriptorIndex ? 1 : - 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassReferenceFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassReferenceFixer.java deleted file mode 100644 index fb68461c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ClassReferenceFixer.java +++ /dev/null @@ -1,591 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor fixes references of constant pool entries, fields, - * methods, and attributes to classes whose names have changed. Descriptors - * of member references are not updated yet. - * - * @see MemberReferenceFixer - * @author Eric Lafortune - */ -public class ClassReferenceFixer -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor, - AttributeVisitor, - InnerClassesInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - private final boolean ensureUniqueMemberNames; - - - /** - * Creates a new ClassReferenceFixer. - * @param ensureUniqueMemberNames specifies whether class members whose - * descriptor changes should get new, unique - * names, in order to avoid naming conflicts - * with similar methods. - */ - public ClassReferenceFixer(boolean ensureUniqueMemberNames) - { - this.ensureUniqueMemberNames = ensureUniqueMemberNames; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Fix the constant pool. - programClass.constantPoolEntriesAccept(this); - - // Fix class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Fix the attributes. - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Fix class members. - libraryClass.fieldsAccept(this); - libraryClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Has the descriptor changed? - String descriptor = programField.getDescriptor(programClass); - String newDescriptor = newDescriptor(descriptor, - programField.referencedClass); - - if (!descriptor.equals(newDescriptor)) - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor(programClass); - - // Update the descriptor. - programField.u2descriptorIndex = - constantPoolEditor.addUtf8Constant(newDescriptor); - - // Update the name, if requested. - if (ensureUniqueMemberNames) - { - String name = programField.getName(programClass); - String newName = newUniqueMemberName(name, descriptor); - programField.u2nameIndex = - constantPoolEditor.addUtf8Constant(newName); - } - } - - // Fix the attributes. - programField.attributesAccept(programClass, this); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Has the descriptor changed? - String descriptor = programMethod.getDescriptor(programClass); - String newDescriptor = newDescriptor(descriptor, - programMethod.referencedClasses); - - if (!descriptor.equals(newDescriptor)) - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor(programClass); - - // Update the descriptor. - programMethod.u2descriptorIndex = - constantPoolEditor.addUtf8Constant(newDescriptor); - - // Update the name, if requested. - if (ensureUniqueMemberNames) - { - String name = programMethod.getName(programClass); - String newName = newUniqueMemberName(name, descriptor); - programMethod.u2nameIndex = - constantPoolEditor.addUtf8Constant(newName); - } - } - - // Fix the attributes. - programMethod.attributesAccept(programClass, this); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - // Has the descriptor changed? - String descriptor = libraryField.getDescriptor(libraryClass); - String newDescriptor = newDescriptor(descriptor, - libraryField.referencedClass); - - // Update the descriptor. - libraryField.descriptor = newDescriptor; - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - // Has the descriptor changed? - String descriptor = libraryMethod.getDescriptor(libraryClass); - String newDescriptor = newDescriptor(descriptor, - libraryMethod.referencedClasses); - - if (!descriptor.equals(newDescriptor)) - { - // Update the descriptor. - libraryMethod.descriptor = newDescriptor; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Does the string refer to a class, due to a Class.forName construct? - Clazz referencedClass = stringConstant.referencedClass; - Member referencedMember = stringConstant.referencedMember; - if (referencedClass != null && - referencedMember == null) - { - // Reconstruct the new class name. - String externalClassName = stringConstant.getString(clazz); - String internalClassName = ClassUtil.internalClassName(externalClassName); - String newInternalClassName = newClassName(internalClassName, - referencedClass); - - // Update the String entry if required. - if (!newInternalClassName.equals(internalClassName)) - { - // Only convert to an external class name if the original was - // an external class name too. - String newExternalClassName = - externalClassName.indexOf(JavaConstants.PACKAGE_SEPARATOR) >= 0 ? - ClassUtil.externalClassName(newInternalClassName) : - newInternalClassName; - - // Refer to a new Utf8 entry. - stringConstant.u2stringIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newExternalClassName); - } - } - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Has the descriptor changed? - String descriptor = invokeDynamicConstant.getType(clazz); - String newDescriptor = newDescriptor(descriptor, - invokeDynamicConstant.referencedClasses); - - if (!descriptor.equals(newDescriptor)) - { - String name = invokeDynamicConstant.getName(clazz); - - // Refer to a new NameAndType entry. - invokeDynamicConstant.u2nameAndTypeIndex = - new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(name, newDescriptor); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Do we know the referenced class? - Clazz referencedClass = classConstant.referencedClass; - if (referencedClass != null) - { - // Has the class name changed? - String className = classConstant.getName(clazz); - String newClassName = newClassName(className, referencedClass); - if (!className.equals(newClassName)) - { - // Refer to a new Utf8 entry. - classConstant.u2nameIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newClassName); - } - } - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - // Has the descriptor changed? - String descriptor = methodTypeConstant.getType(clazz); - String newDescriptor = newDescriptor(descriptor, - methodTypeConstant.referencedClasses); - - if (!descriptor.equals(newDescriptor)) - { - // Update the descriptor. - methodTypeConstant.u2descriptorIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newDescriptor); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Fix the inner class names. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Fix the attributes. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Fix the types of the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Fix the signatures of the local variables. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - // Has the signature changed? - String signature = signatureAttribute.getSignature(clazz); - String newSignature = newDescriptor(signature, - signatureAttribute.referencedClasses); - - if (!signature.equals(newSignature)) - { - // Update the signature. - signatureAttribute.u2signatureIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSignature); - } - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Fix the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Fix the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Fix the annotation. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - // Fix the inner class name. - int innerClassIndex = innerClassesInfo.u2innerClassIndex; - int innerNameIndex = innerClassesInfo.u2innerNameIndex; - if (innerClassIndex != 0 && - innerNameIndex != 0) - { - String newInnerName = clazz.getClassName(innerClassIndex); - int index = newInnerName.lastIndexOf(ClassConstants.INNER_CLASS_SEPARATOR); - if (index >= 0) - { - innerClassesInfo.u2innerNameIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newInnerName.substring(index + 1)); - } - } - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Has the descriptor changed? - String descriptor = localVariableInfo.getDescriptor(clazz); - String newDescriptor = newDescriptor(descriptor, - localVariableInfo.referencedClass); - - if (!descriptor.equals(newDescriptor)) - { - // Refer to a new Utf8 entry. - localVariableInfo.u2descriptorIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newDescriptor); - } - } - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Has the signature changed? - String signature = localVariableTypeInfo.getSignature(clazz); - String newSignature = newDescriptor(signature, - localVariableTypeInfo.referencedClasses); - - if (!signature.equals(newSignature)) - { - // Update the signature. - localVariableTypeInfo.u2signatureIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSignature); - } - } - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - // Has the type changed? - String typeName = annotation.getType(clazz); - String newTypeName = newDescriptor(typeName, - annotation.referencedClasses); - - if (!typeName.equals(newTypeName)) - { - // Update the type. - annotation.u2typeIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newTypeName); - } - - // Fix the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - // Has the type name chamged? - String typeName = enumConstantElementValue.getTypeName(clazz); - String newTypeName = newDescriptor(typeName, - enumConstantElementValue.referencedClasses); - - if (!typeName.equals(newTypeName)) - { - // Update the type name. - enumConstantElementValue.u2typeNameIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newTypeName); - } - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - // Has the class info changed? - String className = classElementValue.getClassName(clazz); - String newClassName = newDescriptor(className, - classElementValue.referencedClasses); - - if (!className.equals(newClassName)) - { - // Update the class info. - classElementValue.u2classInfoIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newClassName); - } - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - // Fix the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - // Fix the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - // Small utility methods. - - private static String newDescriptor(String descriptor, - Clazz referencedClass) - { - // If there is no referenced class, the descriptor won't change. - if (referencedClass == null) - { - return descriptor; - } - - // Unravel and reconstruct the class element of the descriptor. - DescriptorClassEnumeration descriptorClassEnumeration = - new DescriptorClassEnumeration(descriptor); - - StringBuffer newDescriptorBuffer = new StringBuffer(descriptor.length()); - newDescriptorBuffer.append(descriptorClassEnumeration.nextFluff()); - - // Only if the descriptor contains a class name (e.g. with an array of - // primitive types), the descriptor can change. - if (descriptorClassEnumeration.hasMoreClassNames()) - { - String className = descriptorClassEnumeration.nextClassName(); - String fluff = descriptorClassEnumeration.nextFluff(); - - String newClassName = newClassName(className, - referencedClass); - - newDescriptorBuffer.append(newClassName); - newDescriptorBuffer.append(fluff); - } - - return newDescriptorBuffer.toString(); - } - - - private static String newDescriptor(String descriptor, - Clazz[] referencedClasses) - { - // If there are no referenced classes, the descriptor won't change. - if (referencedClasses == null || - referencedClasses.length == 0) - { - return descriptor; - } - - // Unravel and reconstruct the class elements of the descriptor. - DescriptorClassEnumeration descriptorClassEnumeration = - new DescriptorClassEnumeration(descriptor); - - StringBuffer newDescriptorBuffer = new StringBuffer(descriptor.length()); - newDescriptorBuffer.append(descriptorClassEnumeration.nextFluff()); - - int index = 0; - while (descriptorClassEnumeration.hasMoreClassNames()) - { - String className = descriptorClassEnumeration.nextClassName(); - boolean isInnerClassName = descriptorClassEnumeration.isInnerClassName(); - String fluff = descriptorClassEnumeration.nextFluff(); - - String newClassName = newClassName(className, - referencedClasses[index++]); - - // Strip the outer class name again, if it's an inner class. - if (isInnerClassName) - { - newClassName = - newClassName.substring(newClassName.lastIndexOf(ClassConstants.INNER_CLASS_SEPARATOR)+1); - } - - newDescriptorBuffer.append(newClassName); - newDescriptorBuffer.append(fluff); - } - - return newDescriptorBuffer.toString(); - } - - - /** - * Returns a unique class member name, based on the given name and descriptor. - */ - private String newUniqueMemberName(String name, String descriptor) - { - return name.equals(ClassConstants.METHOD_NAME_INIT) ? - ClassConstants.METHOD_NAME_INIT : - name + ClassConstants.SPECIAL_MEMBER_SEPARATOR + Long.toHexString(Math.abs((descriptor).hashCode())); - } - - - /** - * Returns the new class name based on the given class name and the new - * name of the given referenced class. Class names of array types - * are handled properly. - */ - private static String newClassName(String className, - Clazz referencedClass) - { - // If there is no referenced class, the class name won't change. - if (referencedClass == null) - { - return className; - } - - // Reconstruct the class name. - String newClassName = referencedClass.getName(); - - // Is it an array type? - if (className.charAt(0) == ClassConstants.TYPE_ARRAY) - { - // Add the array prefixes and suffix "[L...;". - newClassName = - className.substring(0, className.indexOf(ClassConstants.TYPE_CLASS_START)+1) + - newClassName + - ClassConstants.TYPE_CLASS_END; - } - - return newClassName; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeComposer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeComposer.java deleted file mode 100644 index f8977f97..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeComposer.java +++ /dev/null @@ -1,1069 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassPrinter; -import proguard.util.ArrayUtil; - -import java.util.Arrays; - -/** - * This AttributeVisitor accumulates instructions and exceptions, and then - * copies them into code attributes that it visits. - * - * @author Eric Lafortune - */ -public class CodeAttributeComposer -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ExceptionInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - LineNumberInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = false; - //*/ - - - private static final int MAXIMUM_LEVELS = 32; - private static final int INVALID = -1; - - - private final boolean allowExternalBranchTargets; - private final boolean allowExternalExceptionHandlers; - private final boolean shrinkInstructions; - - private int maximumCodeLength; - private int codeLength; - private int exceptionTableLength; - private int lineNumberTableLength; - private int level = -1; - - private byte[] code = new byte[ClassConstants.TYPICAL_CODE_LENGTH]; - private int[] oldInstructionOffsets = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - - private final int[] codeFragmentOffsets = new int[MAXIMUM_LEVELS]; - private final int[] codeFragmentLengths = new int[MAXIMUM_LEVELS]; - private final int[][] instructionOffsetMap = new int[MAXIMUM_LEVELS][ClassConstants.TYPICAL_CODE_LENGTH + 1]; - - private ExceptionInfo[] exceptionTable = new ExceptionInfo[ClassConstants.TYPICAL_EXCEPTION_TABLE_LENGTH]; - private LineNumberInfo[] lineNumberTable = new LineNumberInfo[ClassConstants.TYPICAL_LINE_NUMBER_TABLE_LENGTH]; - - private int expectedStackMapFrameOffset; - - private final StackSizeUpdater stackSizeUpdater = new StackSizeUpdater(); - private final VariableSizeUpdater variableSizeUpdater = new VariableSizeUpdater(); - private final InstructionWriter instructionWriter = new InstructionWriter(); - - - /** - * Creates a new CodeAttributeComposer that doesn't allow external branch - * targets or exception handlers and that automatically shrinks - * instructions. - */ - public CodeAttributeComposer() - { - this(false, false, true); - } - - - /** - * Creates a new CodeAttributeComposer. - * @param allowExternalBranchTargets specifies whether branch targets - * can lie outside the code fragment - * of the branch instructions. - * @param allowExternalExceptionHandlers specifies whether exception - * handlers can lie outside the code - * fragment in which exceptions are - * defined. - * @param shrinkInstructions specifies whether instructions - * should automatically be shrunk - * before being written. - */ - public CodeAttributeComposer(boolean allowExternalBranchTargets, - boolean allowExternalExceptionHandlers, - boolean shrinkInstructions) - { - this.allowExternalBranchTargets = allowExternalBranchTargets; - this.allowExternalExceptionHandlers = allowExternalExceptionHandlers; - this.shrinkInstructions = shrinkInstructions; - } - - - /** - * Starts a new code definition. - */ - public void reset() - { - maximumCodeLength = 0; - codeLength = 0; - exceptionTableLength = 0; - lineNumberTableLength = 0; - level = -1; - - // Make sure the instruction writer has at least the same buffer size - // as the local arrays. - instructionWriter.reset(code.length); - } - - - /** - * Starts a new code fragment. Branch instructions that are added are - * assumed to be relative within such code fragments. - * @param maximumCodeFragmentLength the maximum length of the code that will - * be added as part of this fragment (more - * precisely, the maximum old instruction - * offset or label that is specified, plus - * one). - */ - public void beginCodeFragment(int maximumCodeFragmentLength) - { - level++; - - if (level >= MAXIMUM_LEVELS) - { - throw new IllegalArgumentException("Maximum number of code fragment levels exceeded ["+level+"]"); - } - - // Make sure there is sufficient space for adding the code fragment. - // It's only a rough initial estimate for the code length, not even - // necessarily a length expressed in bytes. - maximumCodeLength += maximumCodeFragmentLength; - - ensureCodeLength(maximumCodeLength); - - // Try to reuse the previous array for this code fragment. - if (instructionOffsetMap[level].length <= maximumCodeFragmentLength) - { - instructionOffsetMap[level] = new int[maximumCodeFragmentLength + 1]; - } - - // Initialize the offset map. - for (int index = 0; index <= maximumCodeFragmentLength; index++) - { - instructionOffsetMap[level][index] = INVALID; - } - - // Remember the location of the code fragment. - codeFragmentOffsets[level] = codeLength; - codeFragmentLengths[level] = maximumCodeFragmentLength; - } - - - /** - * Appends the given instruction with the given old offset. - * Branch instructions must fit, for instance by enabling automatic - * shrinking of instructions. - * @param oldInstructionOffset the old offset of the instruction, to which - * branches and other references in the current - * code fragment are pointing. - * @param instruction the instruction to be appended. - */ - public void appendInstruction(int oldInstructionOffset, - Instruction instruction) - { - if (shrinkInstructions) - { - instruction = instruction.shrink(); - } - - if (DEBUG) - { - println("["+codeLength+"] <- ", instruction.toString(oldInstructionOffset)); - } - - // Make sure the code and offset arrays are large enough. - int newCodeLength = codeLength + instruction.length(codeLength); - - ensureCodeLength(newCodeLength); - - // Remember the old offset of the appended instruction. - oldInstructionOffsets[codeLength] = oldInstructionOffset; - - // Fill out the new offset of the appended instruction. - instructionOffsetMap[level][oldInstructionOffset] = codeLength; - - // Write the instruction. The instruction writer may widen it later on, - // if necessary. - instruction.accept(null, - null, - new CodeAttribute(0, 0, 0, 0, code, 0, null, 0, null), - codeLength, - instructionWriter); - //instruction.write(code, codeLength); - - // Continue appending at the next instruction offset. - codeLength = newCodeLength; - } - - - /** - * Appends the given label with the given old offset. - * @param oldInstructionOffset the old offset of the label, to which - * branches and other references in the current - * code fragment are pointing. - */ - public void appendLabel(int oldInstructionOffset) - { - if (DEBUG) - { - println("["+codeLength+"] <- ", "[" + oldInstructionOffset + "] (label)"); - } - - // Make sure the code and offset arrays are large enough. - ensureCodeLength(codeLength + 1); - - // Remember the old offset of the following instruction. - oldInstructionOffsets[codeLength] = oldInstructionOffset; - - // Fill out the new offset of the following instruction. - instructionOffsetMap[level][oldInstructionOffset] = codeLength; - } - - - /** - * Appends the given instruction without defined offsets. - * @param instructions the instructions to be appended. - */ - public void appendInstructions(Instruction[] instructions) - { - for (int index = 0; index < instructions.length; index++) - { - appendInstruction(instructions[index]); - } - } - - - /** - * Appends the given instruction without a defined offset. - * Branch instructions should have a label, to allow computing the - * new relative offset. - * Branch instructions must fit, for instance by enabling automatic - * shrinking of instructions. - * @param instruction the instruction to be appended. - */ - public void appendInstruction(Instruction instruction) - { - if (shrinkInstructions) - { - instruction = instruction.shrink(); - } - - if (DEBUG) - { - println("["+codeLength+"] <- ", instruction.toString()); - } - - // Make sure the code array is large enough. - int newCodeLength = codeLength + instruction.length(codeLength); - - ensureCodeLength(newCodeLength); - - // Write the instruction. The instruction writer may widen it later on, - // if necessary. - instruction.accept(null, - null, - new CodeAttribute(0, 0, 0, 0, code, 0, null, 0, null), - codeLength, - instructionWriter); - //instruction.write(code, codeLength); - - // Continue appending at the next instruction offset. - codeLength = newCodeLength; - } - - - /** - * Appends the given exception to the exception table. - * @param exceptionInfo the exception to be appended. - */ - public void appendException(ExceptionInfo exceptionInfo) - { - if (DEBUG) - { - print(" ", "Exception ["+exceptionInfo.u2startPC+" -> "+exceptionInfo.u2endPC+": "+exceptionInfo.u2handlerPC+"]"); - } - - // Remap the exception right away. - visitExceptionInfo(null, null, null, exceptionInfo); - - if (DEBUG) - { - System.out.println(" -> ["+exceptionInfo.u2startPC+" -> "+exceptionInfo.u2endPC+": "+exceptionInfo.u2handlerPC+"]"); - } - - // Don't add the exception if its instruction range is empty. - if (exceptionInfo.u2startPC == exceptionInfo.u2endPC) - { - if (DEBUG) - { - println(" ", " (not added because of empty instruction range)"); - } - - return; - } - - // Add the exception. - exceptionTable = - (ExceptionInfo[])ArrayUtil.add(exceptionTable, - exceptionTableLength++, - exceptionInfo); - } - - - /** - * Inserts the given line number at the appropriate position in the line - * number table. - * @param lineNumberInfo the line number to be inserted. - * @return the index where the line number was actually inserted. - */ - public int insertLineNumber(LineNumberInfo lineNumberInfo) - { - return insertLineNumber(0, lineNumberInfo); - } - - - /** - * Inserts the given line number at the appropriate position in the line - * number table. - * @param minimumIndex the minimum index where the line number may be - * inserted. - * @param lineNumberInfo the line number to be inserted. - * @return the index where the line number was inserted. - */ - public int insertLineNumber(int minimumIndex, LineNumberInfo lineNumberInfo) - { - if (DEBUG) - { - print(" ", "Line number ["+lineNumberInfo.u2startPC+"]"); - } - - // Remap the line number right away. - visitLineNumberInfo(null, null, null, lineNumberInfo); - - if (DEBUG) - { - System.out.println(" -> ["+lineNumberInfo.u2startPC+"] line "+lineNumberInfo.u2lineNumber+(lineNumberInfo.getSource()==null ? "":" ["+lineNumberInfo.getSource()+"]")); - } - - lineNumberTable = - (LineNumberInfo[])ArrayUtil.extendArray(lineNumberTable, - lineNumberTableLength + 1); - - // Find the insertion index, starting from the end. - // Don't insert before a negative line number, in case of a tie. - int index = lineNumberTableLength++; - while (index > minimumIndex && - (lineNumberTable[index - 1].u2startPC > lineNumberInfo.u2startPC || - lineNumberTable[index - 1].u2startPC >= lineNumberInfo.u2startPC && - lineNumberTable[index - 1].u2lineNumber >= 0)) - { - lineNumberTable[index] = lineNumberTable[--index]; - } - - lineNumberTable[index] = lineNumberInfo; - - return index; - } - - - /** - * Appends the given line number to the line number table. - * @param lineNumberInfo the line number to be appended. - */ - public void appendLineNumber(LineNumberInfo lineNumberInfo) - { - if (DEBUG) - { - print(" ", "Line number ["+lineNumberInfo.u2startPC+"]"); - } - - // Remap the line number right away. - visitLineNumberInfo(null, null, null, lineNumberInfo); - - if (DEBUG) - { - System.out.println(" -> ["+lineNumberInfo.u2startPC+"] line "+lineNumberInfo.u2lineNumber+(lineNumberInfo.getSource()==null ? "":" ["+lineNumberInfo.getSource()+"]")); - } - - // Add the line number. - lineNumberTable = - (LineNumberInfo[])ArrayUtil.add(lineNumberTable, - lineNumberTableLength++, - lineNumberInfo); - } - - - /** - * Wraps up the current code fragment, continuing with the previous one on - * the stack. - */ - public void endCodeFragment() - { - if (level < 0) - { - throw new IllegalArgumentException("Code fragment not begun ["+level+"]"); - } - - // Remap the instructions of the code fragment. - int instructionOffset = codeFragmentOffsets[level]; - while (instructionOffset < codeLength) - { - // Get the next instruction. - Instruction instruction = InstructionFactory.create(code, instructionOffset); - - // Does this instruction still have to be remapped? - if (oldInstructionOffsets[instructionOffset] >= 0) - { - // Adapt the instruction for its new offset. - instruction.accept(null, null, null, instructionOffset, this); - - // Write the instruction back. The instruction writer may still - // widen it later on, if necessary. - instruction.accept(null, - null, - new CodeAttribute(0, 0, 0, 0, code, 0, null, 0, null), - instructionOffset, - instructionWriter); - //instruction.write(code, codeLength); - } - - // Continue remapping at the next instruction offset. - instructionOffset += instruction.length(instructionOffset); - } - - // Correct the estimated maximum code length, now that we know the - // actual length of this code fragment. - maximumCodeLength += codeLength - codeFragmentOffsets[level] - - codeFragmentLengths[level]; - - // Try to remap the exception handlers that couldn't be remapped before. - if (allowExternalExceptionHandlers) - { - for (int index = 0; index < exceptionTableLength; index++) - { - ExceptionInfo exceptionInfo = exceptionTable[index]; - - // Unmapped exception handlers are still negated. - int handlerPC = -exceptionInfo.u2handlerPC; - if (handlerPC > 0) - { - if (remappableExceptionHandler(handlerPC)) - { - exceptionInfo.u2handlerPC = newInstructionOffset(handlerPC); - } - else if (level == 0) - { - throw new IllegalStateException("Couldn't remap exception handler offset ["+handlerPC+"]"); - } - } - } - } - - level--; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("CodeAttributeComposer: putting results in ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - } - - if (level != -1) - { - throw new IllegalArgumentException("Code fragment not ended ["+level+"]"); - } - - level++; - - // Make sure the code attribute has sufficient space for the composed - // code. - if (codeAttribute.u4codeLength < codeLength) - { - codeAttribute.code = new byte[codeLength]; - } - - // Copy the composed code over into the code attribute. - codeAttribute.u4codeLength = codeLength; - System.arraycopy(code, 0, codeAttribute.code, 0, codeLength); - - // Remove exceptions with empty code blocks (done before). - //exceptionTableLength = - // removeEmptyExceptions(exceptionTable, exceptionTableLength); - - // Make sure the exception table has sufficient space for the composed - // exceptions. - if (codeAttribute.exceptionTable.length < exceptionTableLength) - { - codeAttribute.exceptionTable = new ExceptionInfo[exceptionTableLength]; - } - - // Copy the exception table. - codeAttribute.u2exceptionTableLength = exceptionTableLength; - System.arraycopy(exceptionTable, 0, codeAttribute.exceptionTable, 0, exceptionTableLength); - - // Update the maximum stack size and local variable frame size. - stackSizeUpdater.visitCodeAttribute(clazz, method, codeAttribute); - variableSizeUpdater.visitCodeAttribute(clazz, method, codeAttribute); - - // Add a new line number table for the line numbers, if necessary. - if (lineNumberTableLength > 0 && - codeAttribute.getAttribute(clazz, ClassConstants.ATTR_LineNumberTable) == null) - { - int attributeNameIndex = - new ConstantPoolEditor((ProgramClass)clazz) - .addUtf8Constant(ClassConstants.ATTR_LineNumberTable); - - new AttributesEditor((ProgramClass)clazz, (ProgramMember)method, codeAttribute, false) - .addAttribute(new LineNumberTableAttribute(attributeNameIndex, 0, null)); - } - - // Copy the line number table and the local variable table. - codeAttribute.attributesAccept(clazz, method, this); - - // Remap the exception table (done before). - //codeAttribute.exceptionsAccept(clazz, method, this); - - // Remove exceptions with empty code blocks (done before). - //codeAttribute.u2exceptionTableLength = - // removeEmptyExceptions(codeAttribute.exceptionTable, - // codeAttribute.u2exceptionTableLength); - - // Make sure instructions are widened if necessary. - instructionWriter.visitCodeAttribute(clazz, method, codeAttribute); - - level--; - - if (DEBUG) - { - codeAttribute.accept(clazz, method, new ClassPrinter()); - } - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - // Remap all stack map entries. - expectedStackMapFrameOffset = -1; - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - // Remap all stack map table entries. - expectedStackMapFrameOffset = 0; - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - // Didn't we get line number new definitions? - if (lineNumberTableLength == 0) - { - // Remap all line number table entries of the existing table. - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this); - } - else - { - // Remove line numbers with empty code blocks. - // Actually, we'll do this elsewhere, to allow processing the - // line numbers of inlined methods. - //lineNumberTableLength = - // removeEmptyLineNumbers(lineNumberTable, - // lineNumberTableLength, - // codeAttribute.u4codeLength); - - // Copy the line number table. - lineNumberTableAttribute.lineNumberTable = new LineNumberInfo[lineNumberTableLength]; - lineNumberTableAttribute.u2lineNumberTableLength = lineNumberTableLength; - System.arraycopy(lineNumberTable, 0, lineNumberTableAttribute.lineNumberTable, 0, lineNumberTableLength); - } - } - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Remap all local variable table entries. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - - // Remove local variables with empty code blocks. - localVariableTableAttribute.u2localVariableTableLength = - removeEmptyLocalVariables(localVariableTableAttribute.localVariableTable, - localVariableTableAttribute.u2localVariableTableLength, - codeAttribute.u2maxLocals); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Remap all local variable table entries. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - - // Remove local variables with empty code blocks. - localVariableTypeTableAttribute.u2localVariableTypeTableLength = - removeEmptyLocalVariableTypes(localVariableTypeTableAttribute.localVariableTypeTable, - localVariableTypeTableAttribute.u2localVariableTypeTableLength, - codeAttribute.u2maxLocals); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - try - { - // Adjust the branch offset. - branchInstruction.branchOffset = - newBranchOffset(offset, branchInstruction.branchOffset); - - // Don't remap this instruction again. - oldInstructionOffsets[offset] = -1; - } - catch (IllegalArgumentException e) - { - if (level == 0 || !allowExternalBranchTargets) - { - throw e; - } - } - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - try - { - // TODO: We're assuming we can adjust no offsets or all offsets at once. - // Adjust the default jump offset. - switchInstruction.defaultOffset = - newBranchOffset(offset, switchInstruction.defaultOffset); - - // Adjust the jump offsets. - updateJumpOffsets(offset, - switchInstruction.jumpOffsets); - - // Don't remap this instruction again. - oldInstructionOffsets[offset] = -1; - } - catch (IllegalArgumentException e) - { - if (level == 0 || !allowExternalBranchTargets) - { - throw e; - } - } - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - // Remap the code offsets. Note that the instruction offset map also has - // an entry for the first offset after the code, for u2endPC. - exceptionInfo.u2startPC = newInstructionOffset(exceptionInfo.u2startPC); - exceptionInfo.u2endPC = newInstructionOffset(exceptionInfo.u2endPC); - - // See if we can remap the handler right away. Unmapped exception - // handlers are negated, in order to mark them as external. - int handlerPC = exceptionInfo.u2handlerPC; - exceptionInfo.u2handlerPC = - !allowExternalExceptionHandlers || - remappableExceptionHandler(handlerPC) ? - newInstructionOffset(handlerPC) : - -handlerPC; - } - - - // Implementations for StackMapFrameVisitor. - - public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) - { - // Remap the stack map frame offset. - int stackMapFrameOffset = newInstructionOffset(offset); - - int offsetDelta = stackMapFrameOffset; - - // Compute the offset delta if the frame is part of a stack map frame - // table (for JDK 6.0) instead of a stack map (for Java Micro Edition). - if (expectedStackMapFrameOffset >= 0) - { - offsetDelta -= expectedStackMapFrameOffset; - - expectedStackMapFrameOffset = stackMapFrameOffset + 1; - } - - stackMapFrame.u2offsetDelta = offsetDelta; - } - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - // Remap the stack map frame offset. - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, sameOneFrame); - - // Remap the verification type offset. - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - // Remap the stack map frame offset. - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, moreZeroFrame); - - // Remap the verification type offsets. - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - // Remap the stack map frame offset. - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, fullFrame); - - // Remap the verification type offsets. - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) {} - - - public void visitUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType) - { - // Remap the offset of the 'new' instruction. - uninitializedType.u2newInstructionOffset = newInstructionOffset(uninitializedType.u2newInstructionOffset); - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - // Remap the code offset. - lineNumberInfo.u2startPC = newInstructionOffset(lineNumberInfo.u2startPC); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Remap the code offset and length. - // TODO: The local variable frame might not be strictly preserved. - int startPC = newInstructionOffset(localVariableInfo.u2startPC); - int endPC = newInstructionOffset(localVariableInfo.u2startPC + - localVariableInfo.u2length); - - localVariableInfo.u2startPC = startPC; - localVariableInfo.u2length = endPC - startPC; - } - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Remap the code offset and length. - // TODO: The local variable frame might not be strictly preserved. - int startPC = newInstructionOffset(localVariableTypeInfo.u2startPC); - int endPC = newInstructionOffset(localVariableTypeInfo.u2startPC + - localVariableTypeInfo.u2length); - - localVariableTypeInfo.u2startPC = startPC; - localVariableTypeInfo.u2length = endPC - startPC; - } - - - // Small utility methods. - - /** - * Make sure the code arrays have at least the given size. - */ - private void ensureCodeLength(int newCodeLength) - { - if (code.length < newCodeLength) - { - // Add 20% to avoid extending the arrays too often. - newCodeLength = newCodeLength * 6 / 5; - - code = ArrayUtil.extendArray(code, newCodeLength); - oldInstructionOffsets = ArrayUtil.extendArray(oldInstructionOffsets, newCodeLength); - - instructionWriter.extend(newCodeLength); - } - } - - - /** - * Adjusts the given jump offsets for the instruction at the given offset. - */ - private void updateJumpOffsets(int offset, int[] jumpOffsets) - { - for (int index = 0; index < jumpOffsets.length; index++) - { - jumpOffsets[index] = newBranchOffset(offset, jumpOffsets[index]); - } - } - - - /** - * Computes the new branch offset for the instruction at the given new offset - * with the given old branch offset. - */ - private int newBranchOffset(int newInstructionOffset, int oldBranchOffset) - { - if (newInstructionOffset < 0 || - newInstructionOffset > codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+newInstructionOffset +"] in code with length ["+codeLength+"]"); - } - - int oldInstructionOffset = oldInstructionOffsets[newInstructionOffset]; - - // For ordinary branch instructions, we can compute the offset - // relative to the instruction itself. - return newInstructionOffset(oldInstructionOffset + oldBranchOffset) - - newInstructionOffset; - } - - - /** - * Computes the new instruction offset for the instruction at the given old - * offset. - */ - private int newInstructionOffset(int oldInstructionOffset) - { - if (oldInstructionOffset < 0 || - oldInstructionOffset > codeFragmentLengths[level]) - { - throw new IllegalArgumentException("Instruction offset ["+oldInstructionOffset +"] out of range in code fragment with length ["+codeFragmentLengths[level]+"] at level "+level); - } - - int newInstructionOffset = instructionOffsetMap[level][oldInstructionOffset]; - if (newInstructionOffset == INVALID) - { - throw new IllegalArgumentException("Invalid instruction offset ["+oldInstructionOffset +"] in code fragment at level "+level); - } - - return newInstructionOffset; - } - - - /** - * Returns whether the given old exception handler can be remapped in the - * current code fragment. - */ - private boolean remappableExceptionHandler(int oldInstructionOffset) - { - // Can we index in the array? - if (oldInstructionOffset > codeFragmentLengths[level]) - { - return false; - } - - // Do we have a valid new instruction offset, but not yet right after - // the code? That offset is only labeled for mapping try blocks, not - // for mapping handlers. - int newInstructionOffset = - instructionOffsetMap[level][oldInstructionOffset]; - - return newInstructionOffset > INVALID && - newInstructionOffset < codeLength; - } - - - /** - * Returns the given list of exceptions, without the ones that have empty - * code blocks. - */ - private int removeEmptyExceptions(ExceptionInfo[] exceptionInfos, - int exceptionInfoCount) - { - // Overwrite all empty exceptions. - int newIndex = 0; - for (int index = 0; index < exceptionInfoCount; index++) - { - ExceptionInfo exceptionInfo = exceptionInfos[index]; - if (exceptionInfo.u2startPC < exceptionInfo.u2endPC) - { - exceptionInfos[newIndex++] = exceptionInfo; - } - } - - // Clear the unused array entries. - Arrays.fill(exceptionInfos, newIndex, exceptionInfoCount, null); - - return newIndex; - } - - - /** - * Returns the given list of line numbers, without the ones that have empty - * code blocks or that exceed the code size. - */ - private int removeEmptyLineNumbers(LineNumberInfo[] lineNumberInfos, - int lineNumberInfoCount, - int codeLength) - { - // Overwrite all empty line number entries. - int newIndex = 0; - for (int index = 0; index < lineNumberInfoCount; index++) - { - LineNumberInfo lineNumberInfo = lineNumberInfos[index]; - int startPC = lineNumberInfo.u2startPC; - if (startPC < codeLength && - (index == 0 || startPC > lineNumberInfos[index-1].u2startPC)) - { - lineNumberInfos[newIndex++] = lineNumberInfo; - } - } - - // Clear the unused array entries. - Arrays.fill(lineNumberInfos, newIndex, lineNumberInfoCount, null); - - return newIndex; - } - - - /** - * Returns the given list of local variables, without the ones that have empty - * code blocks or that exceed the actual number of local variables. - */ - private int removeEmptyLocalVariables(LocalVariableInfo[] localVariableInfos, - int localVariableInfoCount, - int maxLocals) - { - // Overwrite all empty local variable entries. - int newIndex = 0; - for (int index = 0; index < localVariableInfoCount; index++) - { - LocalVariableInfo localVariableInfo = localVariableInfos[index]; - if (localVariableInfo.u2length > 0 && - localVariableInfo.u2index < maxLocals) - { - localVariableInfos[newIndex++] = localVariableInfo; - } - } - - // Clear the unused array entries. - Arrays.fill(localVariableInfos, newIndex, localVariableInfoCount, null); - - return newIndex; - } - - - /** - * Returns the given list of local variable types, without the ones that - * have empty code blocks or that exceed the actual number of local variables. - */ - private int removeEmptyLocalVariableTypes(LocalVariableTypeInfo[] localVariableTypeInfos, - int localVariableTypeInfoCount, - int maxLocals) - { - // Overwrite all empty local variable type entries. - int newIndex = 0; - for (int index = 0; index < localVariableTypeInfoCount; index++) - { - LocalVariableTypeInfo localVariableTypeInfo = localVariableTypeInfos[index]; - if (localVariableTypeInfo.u2length > 0 && - localVariableTypeInfo.u2index < maxLocals) - { - localVariableTypeInfos[newIndex++] = localVariableTypeInfo; - } - } - - // Clear the unused array entries. - Arrays.fill(localVariableTypeInfos, newIndex, localVariableTypeInfoCount, null); - - return newIndex; - } - - - private void println(String string1, String string2) - { - print(string1, string2); - - System.out.println(); - } - - private void print(String string1, String string2) - { - System.out.print(string1); - - for (int index = 0; index < level; index++) - { - System.out.print(" "); - } - - System.out.print(string2); - } - - - public static void main(String[] args) - { - CodeAttributeComposer composer = new CodeAttributeComposer(); - - composer.beginCodeFragment(4); - composer.appendInstruction(0, new SimpleInstruction(InstructionConstants.OP_ICONST_0)); - composer.appendInstruction(1, new VariableInstruction(InstructionConstants.OP_ISTORE, 0)); - composer.appendInstruction(2, new BranchInstruction(InstructionConstants.OP_GOTO, 1)); - - composer.beginCodeFragment(4); - composer.appendInstruction(0, new VariableInstruction(InstructionConstants.OP_IINC, 0, 1)); - composer.appendInstruction(1, new VariableInstruction(InstructionConstants.OP_ILOAD, 0)); - composer.appendInstruction(2, new SimpleInstruction(InstructionConstants.OP_ICONST_5)); - composer.appendInstruction(3, new BranchInstruction(InstructionConstants.OP_IFICMPLT, -3)); - composer.endCodeFragment(); - - composer.appendInstruction(3, new SimpleInstruction(InstructionConstants.OP_RETURN)); - composer.endCodeFragment(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeEditor.java deleted file mode 100644 index 1d4ba36f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeEditor.java +++ /dev/null @@ -1,1671 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.*; -import proguard.classfile.attribute.annotation.target.visitor.*; -import proguard.classfile.attribute.annotation.visitor.TypeAnnotationVisitor; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.util.ArrayUtil; - -import java.util.*; - -/** - * This AttributeVisitor accumulates specified changes to code, and then applies - * these accumulated changes to the code attributes that it visits. - * - * The class also supports labels ({@link #label()}) and exception handlers - * ({@link #catch_(int,int,int)}) in replacement sequences. They provide - * local branch offsets inside the replacement sequences - * ({@link Label#offset()}). For example, creating a replacement sequence - * with the help of {@link InstructionSequenceBuilder}: - * - * final CodeAttributeEditor.Label TRY_START = codeAttributeEditor.label(); - * final CodeAttributeEditor.Label TRY_END = codeAttributeEditor.label(); - * final CodeAttributeEditor.Label CATCH_END = codeAttributeEditor.label(); - * - * final CodeAttributeEditor.Label CATCH_EXCEPTION = - * codeAttributeEditor.catch_(TRY_START.offset(), - * TRY_END.offset(), - * constantPoolEditor.addClassConstant("java/lang/Exception", null)); - * - * Instructions[] replacementInstructions = builder - * .label(TRY_START) - * ...... - * .label(TRY_END) - * .goto_(CATCH_END.offset()) - * .catch_(CATCH_EXCEPTION) - * ...... - * .athrow() - * .label(CATCH_END) - * ...... - * .instructions(); - * - * - * @author Eric Lafortune - */ -public class CodeAttributeEditor -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ExceptionInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - LineNumberInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - TypeAnnotationVisitor, - TargetInfoVisitor, - LocalVariableTargetElementVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = System.getProperty("cae") != null; - //*/ - - private static final int LABEL_FLAG = 0x20000000; - - - private final boolean updateFrameSizes; - private final boolean shrinkInstructions; - - private int codeLength; - private boolean modified; - private boolean simple; - - private Map labels = new HashMap(); - - /*private*/public Instruction[] preOffsetInsertions = new Instruction[ClassConstants.TYPICAL_CODE_LENGTH]; - /*private*/public Instruction[] preInsertions = new Instruction[ClassConstants.TYPICAL_CODE_LENGTH]; - /*private*/public Instruction[] replacements = new Instruction[ClassConstants.TYPICAL_CODE_LENGTH]; - /*private*/public Instruction[] postInsertions = new Instruction[ClassConstants.TYPICAL_CODE_LENGTH]; - /*private*/public boolean[] deleted = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - - - private int[] newInstructionOffsets = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - private int newOffset; - private boolean lengthIncreased; - - private int expectedStackMapFrameOffset; - - private final StackSizeUpdater stackSizeUpdater = new StackSizeUpdater(); - private final VariableSizeUpdater variableSizeUpdater = new VariableSizeUpdater(); - private final InstructionWriter instructionWriter = new InstructionWriter(); - - - /** - * Creates a new CodeAttributeEditor that automatically updates frame - * sizes and shrinks instructions. - */ - public CodeAttributeEditor() - { - this(true, true); - } - - - /** - * Creates a new CodeAttributeEditor. - * @param updateFrameSizes specifies whether frame sizes of edited code - * should be updated. - * @param shrinkInstructions specifies whether added instructions should - * automatically be shrunk before being written. - */ - public CodeAttributeEditor(boolean updateFrameSizes, - boolean shrinkInstructions) - { - this.updateFrameSizes = updateFrameSizes; - this.shrinkInstructions = shrinkInstructions; - } - - - /** - * Resets the accumulated code changes for a given anticipated maximum - * code length. If necessary, the size may still be extended while - * editing the code, with {@link #extend(int)}. - * @param codeLength the length of the code that will be edited next. - */ - public void reset(int codeLength) - { - labels.clear(); - - // Try to reuse the previous arrays. - if (preInsertions.length < codeLength) - { - preOffsetInsertions = new Instruction[codeLength]; - preInsertions = new Instruction[codeLength]; - replacements = new Instruction[codeLength]; - postInsertions = new Instruction[codeLength]; - deleted = new boolean[codeLength]; - } - else - { - Arrays.fill(preOffsetInsertions, 0, codeLength, null); - Arrays.fill(preInsertions, 0, codeLength, null); - Arrays.fill(replacements, 0, codeLength, null); - Arrays.fill(postInsertions, 0, codeLength, null); - Arrays.fill(deleted, 0, codeLength, false); - } - - this.codeLength = codeLength; - - modified = false; - simple = true; - } - - - /** - * Extends the size of the accumulated code changes. - * @param codeLength the length of the code that will be edited next. - */ - public void extend(int codeLength) - { - // Try to reuse the previous arrays. - if (preInsertions.length < codeLength) - { - preOffsetInsertions = ArrayUtil.extendArray(preOffsetInsertions, codeLength); - preInsertions = ArrayUtil.extendArray(preInsertions, codeLength); - replacements = ArrayUtil.extendArray(replacements, codeLength); - postInsertions = ArrayUtil.extendArray(postInsertions, codeLength); - deleted = ArrayUtil.extendArray(deleted, codeLength); - } - else - { - Arrays.fill(preOffsetInsertions, this.codeLength, codeLength, null); - Arrays.fill(preInsertions, this.codeLength, codeLength, null); - Arrays.fill(replacements, this.codeLength, codeLength, null); - Arrays.fill(postInsertions, this.codeLength, codeLength, null); - Arrays.fill(deleted, this.codeLength, codeLength, false); - } - - this.codeLength = codeLength; - } - - - /** - * Remembers to place the given instruction right before the instruction - * at the given offset. Any branches to the existing instruction will - * land after the new instruction. Similarly, any try blocks that start at - * the existing instruction will not include the new instruction. However, - * any try blocks that end right before the existing instruction wil now - * include the new instruction. - * @param instructionOffset the offset of the instruction. - * @param instruction the new instruction. - */ - public void insertBeforeOffset(int instructionOffset, Instruction instruction) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - preOffsetInsertions[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - simple = false; - } - - - /** - * Remembers to place the given instruction right before the instruction - * at the given offset. Any branches to the existing instruction will - * also go to the new instruction. Similarly, any try blocks that include - * the existing instruction will also include the new instruction. - * @param instructionOffset the offset of the instruction. - * @param instruction the new instruction. - */ - public void insertBeforeInstruction(int instructionOffset, Instruction instruction) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - preInsertions[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - simple = false; - } - - - /** - * Remembers to place the given instructions right before the instruction - * at the given offset. Any branches to the existing instruction will - * land after the new instructions. Similarly, any try blocks that start at - * the existing instruction will not include the new instructions. However, - * any try blocks that end right before the existing instruction wil now - * include the new instructions. - * @param instructionOffset the offset of the instruction. - * @param instructions the new instructions. - */ - public void insertBeforeOffset(int instructionOffset, Instruction[] instructions) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - CompositeInstruction instruction = - new CompositeInstruction(instructions); - - preOffsetInsertions[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - simple = false; - } - - - /** - * Remembers to place the given instructions right before the instruction - * at the given offset. Any branches to the existing instruction will - * also go to the new instructions. Similarly, any try blocks that include - * the existing instruction will also include the new instructions. - * @param instructionOffset the offset of the instruction. - * @param instructions the new instructions. - */ - public void insertBeforeInstruction(int instructionOffset, Instruction[] instructions) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - CompositeInstruction instruction = - new CompositeInstruction(instructions); - - preInsertions[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - simple = false; - } - - - /** - * Remembers to replace the instruction at the given offset by the given - * instruction. - * @param instructionOffset the offset of the instruction to be replaced. - * @param instruction the new instruction. - */ - public void replaceInstruction(int instructionOffset, Instruction instruction) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - replacements[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - } - - - /** - * Remembers to replace the instruction at the given offset by the given - * instructions. - * @param instructionOffset the offset of the instruction to be replaced. - * @param instructions the new instructions. - */ - public void replaceInstruction(int instructionOffset, Instruction[] instructions) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - CompositeInstruction instruction = - new CompositeInstruction(instructions); - - replacements[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - } - - - /** - * Remembers to place the given instruction right after the instruction - * at the given offset. - * @param instructionOffset the offset of the instruction. - * @param instruction the new instruction. - */ - public void insertAfterInstruction(int instructionOffset, Instruction instruction) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - postInsertions[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - simple = false; - } - - - /** - * Remembers to place the given instructions right after the instruction - * at the given offset. - * @param instructionOffset the offset of the instruction. - * @param instructions the new instructions. - */ - public void insertAfterInstruction(int instructionOffset, Instruction[] instructions) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - CompositeInstruction instruction = - new CompositeInstruction(instructions); - - postInsertions[instructionOffset] = shrinkInstructions ? - instruction.shrink() : - instruction; - - modified = true; - simple = false; - } - - - /** - * Remembers to delete the instruction at the given offset. - * @param instructionOffset the offset of the instruction to be deleted. - */ - public void deleteInstruction(int instructionOffset) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - deleted[instructionOffset] = true; - - modified = true; - simple = false; - } - - - /** - * Remembers not to delete the instruction at the given offset. - * @param instructionOffset the offset of the instruction not to be deleted. - */ - public void undeleteInstruction(int instructionOffset) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - deleted[instructionOffset] = false; - } - - - /** - * Clears all modifications of the instruction at the given offset. - * @param instructionOffset the offset of the instruction to be deleted. - */ - public void clearModifications(int instructionOffset) - { - if (instructionOffset < 0 || - instructionOffset >= codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+instructionOffset+"] in code with length ["+codeLength+"]"); - } - - preOffsetInsertions[instructionOffset] = null; - preInsertions[instructionOffset] = null; - replacements[instructionOffset] = null; - postInsertions[instructionOffset] = null; - deleted[instructionOffset] = false; - } - - - /** - * Returns whether the code has been modified in any way. - */ - public boolean isModified() - { - return modified; - } - - - /** - * Returns whether the instruction at the given offset has been modified - * in any way. - */ - public boolean isModified(int instructionOffset) - { - return preOffsetInsertions[instructionOffset] != null || - preInsertions[instructionOffset] != null || - replacements[instructionOffset] != null || - postInsertions[instructionOffset] != null || - deleted[instructionOffset]; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // TODO: Remove this when the code has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while editing code:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - throw ex; - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Do we have to update the code? - if (modified) - { - if (DEBUG) - { - System.out.println("CodeAttributeEditor: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - // Can we perform a faster simple replacement of instructions? - if (canPerformSimpleReplacements(codeAttribute)) - { - if (DEBUG) - { - System.out.println(" Simple editing"); - } - - // Simply overwrite the instructions. - performSimpleReplacements(codeAttribute); - } - else - { - if (DEBUG) - { - System.out.println(" Full editing"); - } - - // Move and remap the instructions. - codeAttribute.u4codeLength = - updateInstructions(clazz, method, codeAttribute); - - // Update the exception table. - codeAttribute.exceptionsAccept(clazz, method, this); - - // Remove exceptions with empty code blocks. - codeAttribute.u2exceptionTableLength = - removeEmptyExceptions(codeAttribute.exceptionTable, - codeAttribute.u2exceptionTableLength); - - // Update the line number table and the local variable tables. - codeAttribute.attributesAccept(clazz, method, this); - } - - // Make sure instructions are widened if necessary. - instructionWriter.visitCodeAttribute(clazz, method, codeAttribute); - } - - // Update the maximum stack size and local variable frame size. - if (updateFrameSizes) - { - stackSizeUpdater.visitCodeAttribute(clazz, method, codeAttribute); - variableSizeUpdater.visitCodeAttribute(clazz, method, codeAttribute); - } - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - // Update all stack map entries. - expectedStackMapFrameOffset = -1; - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - // Update all stack map table entries. - expectedStackMapFrameOffset = 0; - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - // Update all line number table entries. - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this); - - // Remove line numbers with empty code blocks. -// lineNumberTableAttribute.u2lineNumberTableLength = -// removeEmptyLineNumbers(lineNumberTableAttribute.lineNumberTable, -// lineNumberTableAttribute.u2lineNumberTableLength, -// codeAttribute.u4codeLength); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Update all local variable table entries. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Update all local variable table entries. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyTypeAnnotationsAttribute(Clazz clazz, TypeAnnotationsAttribute typeAnnotationsAttribute) - { - typeAnnotationsAttribute.typeAnnotationsAccept(clazz, this); - } - - - /** - * Checks if it is possible to modifies the given code without having to - * update any offsets. - * @param codeAttribute the code to be changed. - * @return the new code length. - */ - private boolean canPerformSimpleReplacements(CodeAttribute codeAttribute) - { - if (!simple) - { - return false; - } - - byte[] code = codeAttribute.code; - int codeLength = codeAttribute.u4codeLength; - - // Go over all replacement instructions. - for (int offset = 0; offset < codeLength; offset++) - { - // Check if the replacement instruction, if any, has a different - // length than the original instruction. - Instruction replacementInstruction = replacements[offset]; - if (replacementInstruction != null && - replacementInstruction.length(offset) != - InstructionFactory.create(code, offset).length(offset)) - { - return false; - } - } - - return true; - } - - - /** - * Modifies the given code without updating any offsets. - * @param codeAttribute the code to be changed. - */ - private void performSimpleReplacements(CodeAttribute codeAttribute) - { - int codeLength = codeAttribute.u4codeLength; - - // Go over all replacement instructions. - for (int offset = 0; offset < codeLength; offset++) - { - // Overwrite the original instruction with the replacement - // instruction if any. - Instruction replacementInstruction = replacements[offset]; - if (replacementInstruction != null) - { - replacementInstruction.write(codeAttribute, offset); - - if (DEBUG) - { - System.out.println(" Replaced "+replacementInstruction.toString(offset)); - } - } - } - } - - - /** - * Modifies the given code based on the previously specified changes. - * @param clazz the class file of the code to be changed. - * @param method the method of the code to be changed. - * @param codeAttribute the code to be changed. - * @return the new code length. - */ - private int updateInstructions(Clazz clazz, - Method method, - CodeAttribute codeAttribute) - { - byte[] oldCode = codeAttribute.code; - int oldLength = codeAttribute.u4codeLength; - - // Make sure there is a sufficiently large instruction offset map. - if (newInstructionOffsets.length < oldLength + 1) - { - newInstructionOffsets = new int[oldLength + 1]; - } - - // Fill out the instruction offset map. - int newLength = mapInstructions(oldCode, - oldLength); - - // Create a new code array if necessary. - if (lengthIncreased) - { - codeAttribute.code = new byte[newLength]; - } - - // Prepare for possible widening of instructions. - instructionWriter.reset(newLength); - - // Move the instructions into the new code array. - moveInstructions(clazz, - method, - codeAttribute, - oldCode, - oldLength); - - // We can return the new length. - return newLength; - } - - - /** - * Fills out the instruction offset map for the given code block. - * @param oldCode the instructions to be moved. - * @param oldLength the code length. - * @return the new code length. - */ - private int mapInstructions(byte[] oldCode, int oldLength) - { - // Start mapping instructions at the beginning. - newOffset = 0; - lengthIncreased = false; - - int oldOffset = 0; - do - { - // Get the next instruction. - Instruction instruction = InstructionFactory.create(oldCode, oldOffset); - - // Compute the mapping of the instruction. - mapInstruction(oldOffset, instruction); - - oldOffset += instruction.length(oldOffset); - - if (newOffset > oldOffset) - { - lengthIncreased = true; - } - } - while (oldOffset < oldLength); - - // Also add an entry for the first offset after the code. - newInstructionOffsets[oldOffset] = newOffset; - - return newOffset; - } - - - /** - * Fills out the instruction offset map for the given instruction. - * @param oldOffset the instruction's old offset. - * @param instruction the instruction to be moved. - */ - private void mapInstruction(int oldOffset, - Instruction instruction) - { - // Account for the pre-offset-inserted instruction, if any. - Instruction preOffsetInstruction = preOffsetInsertions[oldOffset]; - if (preOffsetInstruction != null) - { - newOffset += preOffsetInstruction.length(newOffset); - } - - newInstructionOffsets[oldOffset] = newOffset; - - // Account for the pre-inserted instruction, if any. - Instruction preInstruction = preInsertions[oldOffset]; - if (preInstruction != null) - { - newOffset += preInstruction.length(newOffset); - } - - // Account for the replacement instruction, or for the current - // instruction, if it shouldn't be deleted. - Instruction replacementInstruction = replacements[oldOffset]; - if (replacementInstruction != null) - { - newOffset += replacementInstruction.length(newOffset); - } - else if (!deleted[oldOffset]) - { - // Note that the instruction's length may change at its new offset, - // e.g. if it is a switch instruction. - newOffset += instruction.length(newOffset); - } - - // Account for the post-inserted instruction, if any. - Instruction postInstruction = postInsertions[oldOffset]; - if (postInstruction != null) - { - newOffset += postInstruction.length(newOffset); - } - } - - - /** - * Moves the given code block to the new offsets. - * @param clazz the class file of the code to be changed. - * @param method the method of the code to be changed. - * @param codeAttribute the code to be changed. - * @param oldCode the original code to be moved. - * @param oldLength the original code length. - */ - private void moveInstructions(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - byte[] oldCode, - int oldLength) - { - // Start writing instructions at the beginning. - newOffset = 0; - - int oldOffset = 0; - do - { - // Get the next instruction. - Instruction instruction = InstructionFactory.create(oldCode, oldOffset); - - // Move the instruction to its new offset. - moveInstruction(clazz, - method, - codeAttribute, - oldOffset, - instruction); - - oldOffset += instruction.length(oldOffset); - } - while (oldOffset < oldLength); - } - - - /** - * Moves the given instruction to its new offset. - * @param clazz the class file of the code to be changed. - * @param method the method of the code to be changed. - * @param codeAttribute the code to be changed. - * @param oldOffset the original instruction offset. - * @param instruction the original instruction. - */ - private void moveInstruction(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int oldOffset, - Instruction instruction) - { - // Update and insert the pre-inserted instruction, if any. - Instruction preOffsetInstruction = preOffsetInsertions[oldOffset]; - if (preOffsetInstruction != null) - { - if (DEBUG) - { - System.out.println(" Pre-inserted ["+oldOffset+"] -> "+preOffsetInstruction.toString(newOffset)); - } - - // Update the instruction. - preOffsetInstruction.accept(clazz, method, codeAttribute, oldOffset, this); - } - - // Update and insert the pre-inserted instruction, if any. - Instruction preInstruction = preInsertions[oldOffset]; - if (preInstruction != null) - { - if (DEBUG) - { - System.out.println(" Pre-inserted ["+oldOffset+"] -> "+preInstruction.toString(newOffset)); - } - - // Update the instruction. - preInstruction.accept(clazz, method, codeAttribute, oldOffset, this); - } - - // Update and insert the replacement instruction, or the current - // instruction, if it shouldn't be deleted. - Instruction replacementInstruction = replacements[oldOffset]; - if (replacementInstruction != null) - { - if (DEBUG) - { - System.out.println(" Replaced ["+oldOffset+"] -> "+replacementInstruction.toString(newOffset)); - } - - // Update the instruction. - replacementInstruction.accept(clazz, method, codeAttribute, oldOffset, this); - } - else if (!deleted[oldOffset]) - { - if (DEBUG) - { - System.out.println(" Copied ["+oldOffset+"] -> "+instruction.toString(newOffset)); - } - - // Update the instruction. - instruction.accept(clazz, method, codeAttribute, oldOffset, this); - } - - // Update and insert the post-inserted instruction, if any. - Instruction postInstruction = postInsertions[oldOffset]; - if (postInstruction != null) - { - if (DEBUG) - { - System.out.println(" Post-inserted ["+oldOffset+"] -> "+postInstruction.toString(newOffset)); - } - - // Update the instruction. - postInstruction.accept(clazz, method, codeAttribute, oldOffset, this); - } - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - // Write out the instruction. - instructionWriter.visitSimpleInstruction(clazz, - method, - codeAttribute, - newOffset, - simpleInstruction); - - newOffset += simpleInstruction.length(newOffset); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Write out the instruction. - instructionWriter.visitConstantInstruction(clazz, - method, - codeAttribute, - newOffset, - constantInstruction); - - newOffset += constantInstruction.length(newOffset); - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - // Write out the instruction. - instructionWriter.visitVariableInstruction(clazz, - method, - codeAttribute, - newOffset, - variableInstruction); - - newOffset += variableInstruction.length(newOffset); - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - // Update the branch offset, relative to the precise new offset. - branchInstruction.branchOffset = - newBranchOffset(offset, branchInstruction.branchOffset, newOffset); - - // Write out the instruction. - instructionWriter.visitBranchInstruction(clazz, - method, - codeAttribute, - newOffset, - branchInstruction); - - newOffset += branchInstruction.length(newOffset); - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - // Update the default jump offset, relative to the precise new offset. - tableSwitchInstruction.defaultOffset = - newBranchOffset(offset, tableSwitchInstruction.defaultOffset, newOffset); - - // Update the jump offsets, relative to the precise new offset. - newJumpOffsets(offset, - tableSwitchInstruction.jumpOffsets, - newOffset); - - // Write out the instruction. - instructionWriter.visitTableSwitchInstruction(clazz, - method, - codeAttribute, - newOffset, - tableSwitchInstruction); - - newOffset += tableSwitchInstruction.length(newOffset); - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - // Update the default jump offset, relative to the precise new offset. - lookUpSwitchInstruction.defaultOffset = - newBranchOffset(offset, lookUpSwitchInstruction.defaultOffset, newOffset); - - // Update the jump offsets, relative to the precise new offset. - newJumpOffsets(offset, - lookUpSwitchInstruction.jumpOffsets, - newOffset); - - // Write out the instruction. - instructionWriter.visitLookUpSwitchInstruction(clazz, - method, - codeAttribute, - newOffset, - lookUpSwitchInstruction); - - newOffset += lookUpSwitchInstruction.length(newOffset); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - // Update the code offsets. Note that the instruction offset map also - // has an entry for the first offset after the code, for u2endPC. - exceptionInfo.u2startPC = newInstructionOffset(exceptionInfo.u2startPC); - exceptionInfo.u2endPC = newInstructionOffset(exceptionInfo.u2endPC); - exceptionInfo.u2handlerPC = newInstructionOffset(exceptionInfo.u2handlerPC); - } - - - // Implementations for StackMapFrameVisitor. - - public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) - { - // Update the stack map frame offset. - int stackMapFrameOffset = newInstructionOffset(offset); - - int offsetDelta = stackMapFrameOffset; - - // Compute the offset delta if the frame is part of a stack map frame - // table (for JDK 6.0) instead of a stack map (for Java Micro Edition). - if (expectedStackMapFrameOffset >= 0) - { - offsetDelta -= expectedStackMapFrameOffset; - - expectedStackMapFrameOffset = stackMapFrameOffset + 1; - } - - stackMapFrame.u2offsetDelta = offsetDelta; - } - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - // Update the stack map frame offset. - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, sameOneFrame); - - // Update the verification type offset. - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - // Update the stack map frame offset. - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, moreZeroFrame); - - // Update the verification type offsets. - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - // Update the stack map frame offset. - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, fullFrame); - - // Update the verification type offsets. - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) {} - - - public void visitUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType) - { - // Update the offset of the 'new' instruction. - uninitializedType.u2newInstructionOffset = newInstructionOffset(uninitializedType.u2newInstructionOffset); - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - // Update the code offset. - lineNumberInfo.u2startPC = newInstructionOffset(lineNumberInfo.u2startPC); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Update the code offset and length. - // Be careful to update the length first. - localVariableInfo.u2length = newBranchOffset(localVariableInfo.u2startPC, localVariableInfo.u2length); - localVariableInfo.u2startPC = newInstructionOffset(localVariableInfo.u2startPC); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Update the code offset and length. - // Be careful to update the length first. - localVariableTypeInfo.u2length = newBranchOffset(localVariableTypeInfo.u2startPC, localVariableTypeInfo.u2length); - localVariableTypeInfo.u2startPC = newInstructionOffset(localVariableTypeInfo.u2startPC); - } - - - // Implementations for TypeAnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - // Update all local variable targets. - typeAnnotation.targetInfoAccept(clazz, this); - } - - - // Implementations for TargetInfoVisitor. - - public void visitAnyTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfo targetInfo) {} - - - public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) - { - // Update the offsets of the variables. - localVariableTargetInfo.targetElementsAccept(clazz, method, codeAttribute, typeAnnotation, this); - } - - - public void visitOffsetTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo) - { - // Update the offset. - offsetTargetInfo.u2offset = newInstructionOffset(offsetTargetInfo.u2offset); - } - - - // Implementations for LocalVariableTargetElementVisitor. - - public void visitLocalVariableTargetElement(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo, LocalVariableTargetElement localVariableTargetElement) - { - // Update the variable start offset and length. - // Be careful to update the length first. - localVariableTargetElement.u2length = newBranchOffset(localVariableTargetElement.u2startPC, localVariableTargetElement.u2length); - localVariableTargetElement.u2startPC = newInstructionOffset(localVariableTargetElement.u2startPC); - } - - - // Small utility methods. - - /** - * Updates the given jump offsets for the instruction at the given offset, - * relative to the given new offset. - */ - private void newJumpOffsets(int oldInstructionOffset, - int[] oldJumpOffsets, - int newInstructionOffset) - { - for (int index = 0; index < oldJumpOffsets.length; index++) - { - oldJumpOffsets[index] = newBranchOffset(oldInstructionOffset, - oldJumpOffsets[index], - newInstructionOffset); - } - } - - - /** - * Computes the new branch offset for the instruction at the given offset - * with the given branch offset, relative to the new instruction (block) - * offset. - */ - private int newBranchOffset(int oldInstructionOffset, - int oldBranchOffset) - { - return newInstructionOffset(oldInstructionOffset + oldBranchOffset) - - newInstructionOffset(oldInstructionOffset); - } - - - /** - * Computes the new branch offset for the instruction at the given offset - * with the given branch offset, relative to the given new offset. - */ - private int newBranchOffset(int oldInstructionOffset, - int oldBranchOffset, - int newInstructionOffset) - { - // Compute the old branch target. - // Pass a label offset unchanged. - int oldBranchTargetOffset = isLabel(oldBranchOffset) ? oldBranchOffset : - oldInstructionOffset + oldBranchOffset; - - return newInstructionOffset(oldBranchTargetOffset) - - newInstructionOffset; - } - - - /** - * Computes the new instruction offset for the instruction at the given - * offset. - */ - private int newInstructionOffset(int oldInstructionOffset) - { - // Special case: is it actually a label? - if (isLabel(oldInstructionOffset)) - { - // Retrieve the new offset from the label. - int labelIdentifier = labelIdentifier(oldInstructionOffset); - Label label = (Label)labels.get(labelIdentifier); - if (label == null) - { - throw new IllegalArgumentException("Reference to unknown label identifier ["+labelIdentifier+"]"); - } - - return label.newOffset; - } - - // Otherwise retrieve the new instruction offset. - if (oldInstructionOffset < 0 || - oldInstructionOffset > codeLength) - { - throw new IllegalArgumentException("Invalid instruction offset ["+oldInstructionOffset+"] in code with length ["+codeLength+"]"); - } - - return newInstructionOffsets[oldInstructionOffset]; - } - - - /** - * Returns the given list of exceptions, without the ones that have empty - * code blocks. - */ - private int removeEmptyExceptions(ExceptionInfo[] exceptionInfos, - int exceptionInfoCount) - { - // Overwrite all empty exceptions. - int newIndex = 0; - for (int index = 0; index < exceptionInfoCount; index++) - { - ExceptionInfo exceptionInfo = exceptionInfos[index]; - if (exceptionInfo.u2startPC < exceptionInfo.u2endPC) - { - exceptionInfos[newIndex++] = exceptionInfo; - } - } - - return newIndex; - } - - - /** - * Returns the given list of line numbers, without the ones that have empty - * code blocks or that exceed the code size. - */ - private int removeEmptyLineNumbers(LineNumberInfo[] lineNumberInfos, - int lineNumberInfoCount, - int codeLength) - { - // Overwrite all empty line number entries. - int newIndex = 0; - for (int index = 0; index < lineNumberInfoCount; index++) - { - LineNumberInfo lineNumberInfo = lineNumberInfos[index]; - int startPC = lineNumberInfo.u2startPC; - if (startPC < codeLength && - (index == 0 || startPC > lineNumberInfos[index-1].u2startPC)) - { - lineNumberInfos[newIndex++] = lineNumberInfo; - } - } - - return newIndex; - } - - - /** - * This pseudo-instruction is a composite of other instructions, for local - * use inside the editor class only. - */ - private class CompositeInstruction - extends Instruction - { - private Instruction[] instructions; - - - private CompositeInstruction(Instruction[] instructions) - { - this.instructions = instructions; - } - - - // Implementations for Instruction. - - public Instruction shrink() - { - for (int index = 0; index < instructions.length; index++) - { - instructions[index] = instructions[index].shrink(); - } - - return this; - } - - - public void write(byte[] code, int offset) - { - for (int index = 0; index < instructions.length; index++) - { - Instruction instruction = instructions[index]; - - instruction.write(code, offset); - - offset += instruction.length(offset); - } - } - - - protected void readInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't read composite instruction"); - } - - - protected void writeInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't write composite instruction"); - } - - - public int length(int offset) - { - int newOffset = offset; - - for (int index = 0; index < instructions.length; index++) - { - newOffset += instructions[index].length(newOffset); - } - - return newOffset - offset; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - if (instructionVisitor != CodeAttributeEditor.this) - { - throw new UnsupportedOperationException("Unexpected visitor ["+instructionVisitor+"]"); - } - - for (int index = 0; index < instructions.length; index++) - { - Instruction instruction = instructions[index]; - - instruction.accept(clazz, method, codeAttribute, offset, CodeAttributeEditor.this); - } - } - - - // Implementations for Object. - - public String toString() - { - StringBuffer stringBuffer = new StringBuffer(); - - for (int index = 0; index < instructions.length; index++) - { - stringBuffer.append(instructions[index].toString()).append("; "); - } - - return stringBuffer.toString(); - } - } - - - // For convenience, we also define two pseudo-instructions, to conveniently - // mark local labels and create new exceptions handlers. - - /** - * Creates a new label that can be used as a pseudo-instruction to mark - * a local offset. Its offset can be used as a branch target in - * replacement instructions ({@link Label#offset()}). - */ - public Label label() - { - return label(labels.size()); - } - - - /** - * Creates a new label that can be used as a pseudo-instruction to mark - * a local offset. Its offset can be used as a branch target in - * replacement instructions ({@link Label#offset()}). - */ - public Label label(int identifier) - { - Label label = new Label(identifier); - - // Remember the label, so we can retrieve its offset later on. - labels.put(new Integer(identifier), label); - - return label; - } - - - /** - * Creates a new catch instance that can be used as a pseudo-instruction - * to mark the start of an exception handler. Its offset can be used as - * a branch target in replacement instructions ({@link Label#offset()}). - */ - public Label catch_(int startOffset, - int endOffset, - int catchType) - { - return catch_(labels.size(), - startOffset, - endOffset, - catchType); - } - - - /** - * Creates a new catch instance that can be used as a pseudo-instruction - * to mark the start of an exception handler. Its offset can be used as - * a branch target in replacement instructions ({@link Label#offset()}). - */ - public Label catch_(int identifier, - int startOffset, - int endOffset, - int catchType) - { - Label catch_ = new Catch(identifier, startOffset, endOffset, catchType); - - // Remember the label, so we can retrieve its offset later on. - labels.put(new Integer(identifier), catch_); - - return catch_; - } - - - /** - * Returns whether the given instruction offset actually represents a - * label (which contains the actual offset). - */ - private static boolean isLabel(int instructionOffset) - { - return (instructionOffset & 0xff000000) == LABEL_FLAG; - } - - - /** - * Returns the label identifier that corrresponds to the given - * instruction offset. - */ - private static int labelIdentifier(int instructionOffset) - { - return instructionOffset & ~LABEL_FLAG; - } - - - /** - * This pseudo-instruction represents a label that marks an instruction - * offset, for use in the context of the code attribute editor only. - */ - private static class Label - extends Instruction - { - protected final int identifier; - - private int newOffset; - - - /** - * Creates a new Label. - * @param identifier an identifier that can be chosen freely. - */ - public Label(int identifier) - { - this.identifier = identifier; - } - - - /** - * Returns the offset that can then be used as a branch target in - * other replacement instructions. - */ - public int offset() - { - return LABEL_FLAG | identifier; - } - - - // Implementations for Instruction. - - public Instruction shrink() - { - return this; - } - - - public void write(byte[] code, int offset) - { - } - - - protected void readInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't read label instruction"); - } - - - protected void writeInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't write label instruction"); - } - - - public int length(int offset) - { - // Remember the offset, so we can retrieve it later on. - newOffset = offset; - - return 0; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - if (instructionVisitor.getClass() != CodeAttributeEditor.class) - { - throw new UnsupportedOperationException("Unexpected visitor ["+instructionVisitor+"]"); - } - } - - - // Implementations for Object. - - public String toString() - { - return "label_"+offset(); - } - } - - - /** - * This pseudo-instruction represents an exception handler, - * for use in the context of the code attribute editor only. - */ - private static class Catch - extends Label - { - private final int startOfffset; - private final int endOffset; - private final int catchType; - - - /** - * Creates a new Catch instance. - * @param identifier an identifier that can be chosen freely. - * @param startOffset the start offset of the catch block. - * @param endOffset the end offset of the catch block. - * @param catchType the index of the catch type in the constant pool. - */ - public Catch(int identifier, - int startOffset, - int endOffset, - int catchType) - { - super(identifier); - - this.startOfffset = startOffset; - this.endOffset = endOffset; - this.catchType = catchType; - } - - - // Implementations for Instruction. - - public Instruction shrink() - { - return this; - } - - - public void write(byte[] code, int offset) - { - } - - - protected void readInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't read catch instruction"); - } - - - protected void writeInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't write catch instruction"); - } - - - public int length(int offset) - { - return super.length(offset); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - if (instructionVisitor.getClass() != CodeAttributeEditor.class) - { - throw new UnsupportedOperationException("Unexpected visitor ["+instructionVisitor+"]"); - } - - // Add the exception. Its offsets will still be updated later on, - // like any other exception. - new ExceptionInfoEditor(codeAttribute).prependException( - new ExceptionInfo(startOfffset, - endOffset, - offset(), - catchType)); - } - - - // Implementations for Object. - - public String toString() - { - return "catch " + - (isLabel(startOfffset) ? "label_" : "") + startOfffset + ", " + - (isLabel(endOffset) ? "label_" : "") + endOffset + ", #" + - catchType; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeEditorResetter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeEditorResetter.java deleted file mode 100644 index 1d0e6920..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CodeAttributeEditorResetter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor resets it CodeAttributeEditor whenever it visits a - * code attribute. - * - * @author Eric Lafortune - */ -public class CodeAttributeEditorResetter -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final CodeAttributeEditor codeAttributeEditor; - - - /** - * Creates a new CodeAttributeEditorResetter. - * @param codeAttributeEditor the code attribute editor that will be reset. - */ - public CodeAttributeEditorResetter(CodeAttributeEditor codeAttributeEditor) - { - this.codeAttributeEditor = codeAttributeEditor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttributeEditor.reset(codeAttribute.u4codeLength); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CompactCodeAttributeComposer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CompactCodeAttributeComposer.java deleted file mode 100644 index 03f82e77..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/CompactCodeAttributeComposer.java +++ /dev/null @@ -1,2075 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.Constant; -import proguard.classfile.instruction.*; -import proguard.classfile.util.*; - -import static proguard.classfile.ClassConstants.*; - -/** - * This AttributeVisitor accumulates instructions and exceptions, and then - * copies them into code attributes that it visits. - * - * @see CodeAttributeComposer - * - * @author Eric Lafortune - */ -public class CompactCodeAttributeComposer -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final ConstantPoolEditor constantPoolEditor; - private final CodeAttributeComposer codeAttributeComposer; - - - /** - * Creates a new CompactCodeAttributeComposer that doesn't allow external - * branch targets or exception handlers and that automatically shrinks - * instructions. - */ - public CompactCodeAttributeComposer(ProgramClass targetClass) - { - this(targetClass, false, false, true); - } - - - /** - * Creates a new CompactCodeAttributeComposer. - * @param allowExternalBranchTargets specifies whether branch targets - * can lie outside the code fragment - * of the branch instructions. - * @param allowExternalExceptionHandlers specifies whether exception - * handlers can lie outside the code - * fragment in which exceptions are - * defined. - * @param shrinkInstructions specifies whether instructions - * should automatically be shrunk - * before being written. - */ - public CompactCodeAttributeComposer(ProgramClass targetClass, - boolean allowExternalBranchTargets, - boolean allowExternalExceptionHandlers, - boolean shrinkInstructions) - { - constantPoolEditor = - new ConstantPoolEditor(targetClass); - - codeAttributeComposer = - new CodeAttributeComposer(allowExternalBranchTargets, - allowExternalExceptionHandlers, - shrinkInstructions); - } - - - /** - * Starts a new code definition. - */ - public CompactCodeAttributeComposer reset() - { - codeAttributeComposer.reset(); - - return this; - } - - - /** - * Starts a new code fragment. Branch instructions that are added are - * assumed to be relative within such code fragments. - * @param maximumCodeFragmentLength the maximum length of the code that will - * be added as part of this fragment (more - * precisely, the maximum old instruction - * offset or label that is specified, plus - * one). - */ - public CompactCodeAttributeComposer beginCodeFragment(int maximumCodeFragmentLength) - { - codeAttributeComposer.beginCodeFragment(maximumCodeFragmentLength); - - return this; - } - - - /** - * Appends the given instruction with the given old offset. - * Branch instructions must fit, for instance by enabling automatic - * shrinking of instructions. - * @param oldInstructionOffset the old offset of the instruction, to which - * branches and other references in the current - * code fragment are pointing. - * @param instruction the instruction to be appended. - */ - public CompactCodeAttributeComposer appendInstruction(int oldInstructionOffset, - Instruction instruction) - { - codeAttributeComposer.appendInstruction(oldInstructionOffset, instruction); - - return this; - } - - - /** - * Appends the given label with the given old offset. - * @param oldInstructionOffset the old offset of the label, to which - * branches and other references in the current - * code fragment are pointing. - */ - public CompactCodeAttributeComposer appendLabel(int oldInstructionOffset) - { - codeAttributeComposer.appendLabel(oldInstructionOffset); - - return this; - } - - - /** - * Appends the given instruction without defined offsets. - * @param instructions the instructions to be appended. - */ - public CompactCodeAttributeComposer appendInstructions(Instruction[] instructions) - { - codeAttributeComposer.appendInstructions(instructions); - - return this; - } - - - /** - * Appends the given instruction without a defined offset. - * Branch instructions should have a label, to allow computing the - * new relative offset. - * Branch instructions must fit, for instance by enabling automatic - * shrinking of instructions. - * @param instruction the instruction to be appended. - */ - public CompactCodeAttributeComposer appendInstruction(Instruction instruction) - { - codeAttributeComposer.appendInstruction(instruction); - - return this; - } - - - /** - * Appends the given exception to the exception table. - * @param exceptionInfo the exception to be appended. - */ - public CompactCodeAttributeComposer appendException(ExceptionInfo exceptionInfo) - { - codeAttributeComposer.appendException(exceptionInfo); - - return this; - } - - - /** - * Inserts the given line number at the appropriate position in the line - * number table. - * @param lineNumberInfo the line number to be inserted. - * @return the index where the line number was actually inserted. - */ - public int insertLineNumber(LineNumberInfo lineNumberInfo) - { - return codeAttributeComposer.insertLineNumber(lineNumberInfo); - } - - - /** - * Inserts the given line number at the appropriate position in the line - * number table. - * @param minimumIndex the minimum index where the line number may be - * inserted. - * @param lineNumberInfo the line number to be inserted. - * @return the index where the line number was inserted. - */ - public int insertLineNumber(int minimumIndex, LineNumberInfo lineNumberInfo) - { - return codeAttributeComposer.insertLineNumber(minimumIndex, lineNumberInfo); - } - - - /** - * Appends the given line number to the line number table. - * @param lineNumberInfo the line number to be appended. - */ - public CompactCodeAttributeComposer appendLineNumber(LineNumberInfo lineNumberInfo) - { - codeAttributeComposer.appendLineNumber(lineNumberInfo); - - return this; - } - - - /** - * Wraps up the current code fragment, continuing with the previous one on - * the stack. - */ - public CompactCodeAttributeComposer endCodeFragment() - { - codeAttributeComposer.endCodeFragment(); - - return this; - } - - - // Methods corresponding to the bytecode opcodes. - - public CompactCodeAttributeComposer nop() - { - return add(new SimpleInstruction(InstructionConstants.OP_NOP)); - } - - public CompactCodeAttributeComposer aconst_null() - { - return add(new SimpleInstruction(InstructionConstants.OP_ACONST_NULL)); - } - - public CompactCodeAttributeComposer iconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_0, constant)); - } - - public CompactCodeAttributeComposer iconst_m1() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_M1)); - } - - public CompactCodeAttributeComposer iconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_0)); - } - - public CompactCodeAttributeComposer iconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_1)); - } - - public CompactCodeAttributeComposer iconst_2() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_2)); - } - - public CompactCodeAttributeComposer iconst_3() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_3)); - } - - public CompactCodeAttributeComposer iconst_4() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_4)); - } - - public CompactCodeAttributeComposer iconst_5() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_5)); - } - - public CompactCodeAttributeComposer lconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_LCONST_0, constant)); - } - - public CompactCodeAttributeComposer lconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_LCONST_0)); - } - - public CompactCodeAttributeComposer lconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_LCONST_1)); - } - - public CompactCodeAttributeComposer fconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_0, constant)); - } - - public CompactCodeAttributeComposer fconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_0)); - } - - public CompactCodeAttributeComposer fconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_1)); - } - - public CompactCodeAttributeComposer fconst_2() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_2)); - } - - public CompactCodeAttributeComposer dconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_DCONST_0, constant)); - } - - public CompactCodeAttributeComposer dconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCONST_0)); - } - - public CompactCodeAttributeComposer dconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCONST_1)); - } - - public CompactCodeAttributeComposer bipush(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_BIPUSH, constant)); - } - - public CompactCodeAttributeComposer sipush(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_SIPUSH, constant)); - } - - public CompactCodeAttributeComposer ldc(int value) - { - return ldc_(constantPoolEditor.addIntegerConstant(value)); - } - - public CompactCodeAttributeComposer ldc(float value) - { - return ldc_(constantPoolEditor.addFloatConstant(value)); - } - - public CompactCodeAttributeComposer ldc(String string) - { - return ldc(string, null, null); - } - - public CompactCodeAttributeComposer ldc(Object primitiveArray) - { - return ldc_(constantPoolEditor.addPrimitiveArrayConstant(primitiveArray)); - } - - public CompactCodeAttributeComposer ldc(String string, Clazz referencedClass, Method referencedMember) - { - return ldc_(constantPoolEditor.addStringConstant(string, referencedClass, referencedMember)); - } - - public CompactCodeAttributeComposer ldc(String className, Clazz referencedClass) - { - return ldc_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public CompactCodeAttributeComposer ldc_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_LDC, constantIndex)); - } - - public CompactCodeAttributeComposer ldc_w(int value) - { - return ldc_w_(constantPoolEditor.addIntegerConstant(value)); - } - - public CompactCodeAttributeComposer ldc_w(float value) - { - return ldc_w_(constantPoolEditor.addFloatConstant(value)); - } - - public CompactCodeAttributeComposer ldc_w(String string) - { - return ldc_w(string, null, null); - } - - public CompactCodeAttributeComposer ldc_w(String string, Clazz referencedClass, Method referencedMember) - { - return ldc_w_(constantPoolEditor.addStringConstant(string, referencedClass, referencedMember)); - } - - public CompactCodeAttributeComposer ldc_w(String className, Clazz referencedClass) - { - return ldc_w_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public CompactCodeAttributeComposer ldc_w_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_LDC_W, constantIndex)); - } - - public CompactCodeAttributeComposer ldc2_w(long value) - { - return ldc2_w(constantPoolEditor.addLongConstant(value)); - } - - public CompactCodeAttributeComposer ldc2_w(double value) - { - return ldc2_w(constantPoolEditor.addDoubleConstant(value)); - } - - public CompactCodeAttributeComposer ldc2_w(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_LDC2_W, constantIndex)); - } - - public CompactCodeAttributeComposer iload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD, variableIndex)); - } - - public CompactCodeAttributeComposer lload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD, variableIndex)); - } - - public CompactCodeAttributeComposer fload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD, variableIndex)); - } - - public CompactCodeAttributeComposer dload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD, variableIndex)); - } - - public CompactCodeAttributeComposer aload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD, variableIndex)); - } - - public CompactCodeAttributeComposer iload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_0)); - } - - public CompactCodeAttributeComposer iload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_1)); - } - - public CompactCodeAttributeComposer iload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_2)); - } - - public CompactCodeAttributeComposer iload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_3)); - } - - public CompactCodeAttributeComposer lload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_0)); - } - - public CompactCodeAttributeComposer lload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_1)); - } - - public CompactCodeAttributeComposer lload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_2)); - } - - public CompactCodeAttributeComposer lload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_3)); - } - - public CompactCodeAttributeComposer fload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_0)); - } - - public CompactCodeAttributeComposer fload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_1)); - } - - public CompactCodeAttributeComposer fload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_2)); - } - - public CompactCodeAttributeComposer fload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_3)); - } - - public CompactCodeAttributeComposer dload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_0)); - } - - public CompactCodeAttributeComposer dload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_1)); - } - - public CompactCodeAttributeComposer dload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_2)); - } - - public CompactCodeAttributeComposer dload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_3)); - } - - public CompactCodeAttributeComposer aload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_0)); - } - - public CompactCodeAttributeComposer aload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_1)); - } - - public CompactCodeAttributeComposer aload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_2)); - } - - public CompactCodeAttributeComposer aload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_3)); - } - - public CompactCodeAttributeComposer iaload() - { - return add(new SimpleInstruction(InstructionConstants.OP_IALOAD)); - } - - public CompactCodeAttributeComposer laload() - { - return add(new SimpleInstruction(InstructionConstants.OP_LALOAD)); - } - - public CompactCodeAttributeComposer faload() - { - return add(new SimpleInstruction(InstructionConstants.OP_FALOAD)); - } - - public CompactCodeAttributeComposer daload() - { - return add(new SimpleInstruction(InstructionConstants.OP_DALOAD)); - } - - public CompactCodeAttributeComposer aaload() - { - return add(new SimpleInstruction(InstructionConstants.OP_AALOAD)); - } - - public CompactCodeAttributeComposer baload() - { - return add(new SimpleInstruction(InstructionConstants.OP_BALOAD)); - } - - public CompactCodeAttributeComposer caload() - { - return add(new SimpleInstruction(InstructionConstants.OP_CALOAD)); - } - - public CompactCodeAttributeComposer saload() - { - return add(new SimpleInstruction(InstructionConstants.OP_SALOAD)); - } - - public CompactCodeAttributeComposer istore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE, variableIndex)); - } - - public CompactCodeAttributeComposer lstore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE, variableIndex)); - } - - public CompactCodeAttributeComposer fstore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE, variableIndex)); - } - - public CompactCodeAttributeComposer dstore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE, variableIndex)); - } - - public CompactCodeAttributeComposer astore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE, variableIndex)); - } - - public CompactCodeAttributeComposer istore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_0)); - } - - public CompactCodeAttributeComposer istore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_1)); - } - - public CompactCodeAttributeComposer istore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_2)); - } - - public CompactCodeAttributeComposer istore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_3)); - } - - public CompactCodeAttributeComposer lstore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_0)); - } - - public CompactCodeAttributeComposer lstore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_1)); - } - - public CompactCodeAttributeComposer lstore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_2)); - } - - public CompactCodeAttributeComposer lstore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_3)); - } - - public CompactCodeAttributeComposer fstore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_0)); - } - - public CompactCodeAttributeComposer fstore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_1)); - } - - public CompactCodeAttributeComposer fstore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_2)); - } - - public CompactCodeAttributeComposer fstore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_3)); - } - - public CompactCodeAttributeComposer dstore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_0)); - } - - public CompactCodeAttributeComposer dstore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_1)); - } - - public CompactCodeAttributeComposer dstore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_2)); - } - - public CompactCodeAttributeComposer dstore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_3)); - } - - public CompactCodeAttributeComposer astore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_0)); - } - - public CompactCodeAttributeComposer astore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_1)); - } - - public CompactCodeAttributeComposer astore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_2)); - } - - public CompactCodeAttributeComposer astore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_3)); - } - - public CompactCodeAttributeComposer iastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_IASTORE)); - } - - public CompactCodeAttributeComposer lastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_LASTORE)); - } - - public CompactCodeAttributeComposer fastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_FASTORE)); - } - - public CompactCodeAttributeComposer dastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_DASTORE)); - } - - public CompactCodeAttributeComposer aastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_AASTORE)); - } - - public CompactCodeAttributeComposer bastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_BASTORE)); - } - - public CompactCodeAttributeComposer castore() - { - return add(new SimpleInstruction(InstructionConstants.OP_CASTORE)); - } - - public CompactCodeAttributeComposer sastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_SASTORE)); - } - - public CompactCodeAttributeComposer pop() - { - return add(new SimpleInstruction(InstructionConstants.OP_POP)); - } - - public CompactCodeAttributeComposer pop2() - { - return add(new SimpleInstruction(InstructionConstants.OP_POP2)); - } - - public CompactCodeAttributeComposer dup() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP)); - } - - public CompactCodeAttributeComposer dup_x1() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP_X1)); - } - - public CompactCodeAttributeComposer dup_x2() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP_X2)); - } - - public CompactCodeAttributeComposer dup2() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP2)); - } - - public CompactCodeAttributeComposer dup2_x1() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP2_X1)); - } - - public CompactCodeAttributeComposer dup2_x2() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP2_X2)); - } - - public CompactCodeAttributeComposer swap() - { - return add(new SimpleInstruction(InstructionConstants.OP_SWAP)); - } - - public CompactCodeAttributeComposer iadd() - { - return add(new SimpleInstruction(InstructionConstants.OP_IADD)); - } - - public CompactCodeAttributeComposer ladd() - { - return add(new SimpleInstruction(InstructionConstants.OP_LADD)); - } - - public CompactCodeAttributeComposer fadd() - { - return add(new SimpleInstruction(InstructionConstants.OP_FADD)); - } - - public CompactCodeAttributeComposer dadd() - { - return add(new SimpleInstruction(InstructionConstants.OP_DADD)); - } - - public CompactCodeAttributeComposer isub() - { - return add(new SimpleInstruction(InstructionConstants.OP_ISUB)); - } - - public CompactCodeAttributeComposer lsub() - { - return add(new SimpleInstruction(InstructionConstants.OP_LSUB)); - } - - public CompactCodeAttributeComposer fsub() - { - return add(new SimpleInstruction(InstructionConstants.OP_FSUB)); - } - - public CompactCodeAttributeComposer dsub() - { - return add(new SimpleInstruction(InstructionConstants.OP_DSUB)); - } - - public CompactCodeAttributeComposer imul() - { - return add(new SimpleInstruction(InstructionConstants.OP_IMUL)); - } - - public CompactCodeAttributeComposer lmul() - { - return add(new SimpleInstruction(InstructionConstants.OP_LMUL)); - } - - public CompactCodeAttributeComposer fmul() - { - return add(new SimpleInstruction(InstructionConstants.OP_FMUL)); - } - - public CompactCodeAttributeComposer dmul() - { - return add(new SimpleInstruction(InstructionConstants.OP_DMUL)); - } - - public CompactCodeAttributeComposer idiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_IDIV)); - } - - public CompactCodeAttributeComposer ldiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_LDIV)); - } - - public CompactCodeAttributeComposer fdiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_FDIV)); - } - - public CompactCodeAttributeComposer ddiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_DDIV)); - } - - public CompactCodeAttributeComposer irem() - { - return add(new SimpleInstruction(InstructionConstants.OP_IREM)); - } - - public CompactCodeAttributeComposer lrem() - { - return add(new SimpleInstruction(InstructionConstants.OP_LREM)); - } - - public CompactCodeAttributeComposer frem() - { - return add(new SimpleInstruction(InstructionConstants.OP_FREM)); - } - - public CompactCodeAttributeComposer drem() - { - return add(new SimpleInstruction(InstructionConstants.OP_DREM)); - } - - public CompactCodeAttributeComposer ineg() - { - return add(new SimpleInstruction(InstructionConstants.OP_INEG)); - } - - public CompactCodeAttributeComposer lneg() - { - return add(new SimpleInstruction(InstructionConstants.OP_LNEG)); - } - - public CompactCodeAttributeComposer fneg() - { - return add(new SimpleInstruction(InstructionConstants.OP_FNEG)); - } - - public CompactCodeAttributeComposer dneg() - { - return add(new SimpleInstruction(InstructionConstants.OP_DNEG)); - } - - public CompactCodeAttributeComposer ishl() - { - return add(new SimpleInstruction(InstructionConstants.OP_ISHL)); - } - - public CompactCodeAttributeComposer lshl() - { - return add(new SimpleInstruction(InstructionConstants.OP_LSHL)); - } - - public CompactCodeAttributeComposer ishr() - { - return add(new SimpleInstruction(InstructionConstants.OP_ISHR)); - } - - public CompactCodeAttributeComposer lshr() - { - return add(new SimpleInstruction(InstructionConstants.OP_LSHR)); - } - - public CompactCodeAttributeComposer iushr() - { - return add(new SimpleInstruction(InstructionConstants.OP_IUSHR)); - } - - public CompactCodeAttributeComposer lushr() - { - return add(new SimpleInstruction(InstructionConstants.OP_LUSHR)); - } - - public CompactCodeAttributeComposer iand() - { - return add(new SimpleInstruction(InstructionConstants.OP_IAND)); - } - - public CompactCodeAttributeComposer land() - { - return add(new SimpleInstruction(InstructionConstants.OP_LAND)); - } - - public CompactCodeAttributeComposer ior() - { - return add(new SimpleInstruction(InstructionConstants.OP_IOR)); - } - - public CompactCodeAttributeComposer lor() - { - return add(new SimpleInstruction(InstructionConstants.OP_LOR)); - } - - public CompactCodeAttributeComposer ixor() - { - return add(new SimpleInstruction(InstructionConstants.OP_IXOR)); - } - - public CompactCodeAttributeComposer lxor() - { - return add(new SimpleInstruction(InstructionConstants.OP_LXOR)); - } - - public CompactCodeAttributeComposer iinc(int variableIndex, - int constant) - { - return add(new VariableInstruction(InstructionConstants.OP_IINC, variableIndex, constant)); - } - - public CompactCodeAttributeComposer i2l() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2L)); - } - - public CompactCodeAttributeComposer i2f() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2F)); - } - - public CompactCodeAttributeComposer i2d() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2D)); - } - - public CompactCodeAttributeComposer l2i() - { - return add(new SimpleInstruction(InstructionConstants.OP_L2I)); - } - - public CompactCodeAttributeComposer l2f() - { - return add(new SimpleInstruction(InstructionConstants.OP_L2F)); - } - - public CompactCodeAttributeComposer l2d() - { - return add(new SimpleInstruction(InstructionConstants.OP_L2D)); - } - - public CompactCodeAttributeComposer f2i() - { - return add(new SimpleInstruction(InstructionConstants.OP_F2I)); - } - - public CompactCodeAttributeComposer f2l() - { - return add(new SimpleInstruction(InstructionConstants.OP_F2L)); - } - - public CompactCodeAttributeComposer f2d() - { - return add(new SimpleInstruction(InstructionConstants.OP_F2D)); - } - - public CompactCodeAttributeComposer d2i() - { - return add(new SimpleInstruction(InstructionConstants.OP_D2I)); - } - - public CompactCodeAttributeComposer d2l() - { - return add(new SimpleInstruction(InstructionConstants.OP_D2L)); - } - - public CompactCodeAttributeComposer d2f() - { - return add(new SimpleInstruction(InstructionConstants.OP_D2F)); - } - - public CompactCodeAttributeComposer i2b() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2B)); - } - - public CompactCodeAttributeComposer i2c() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2C)); - } - - public CompactCodeAttributeComposer i2s() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2S)); - } - - public CompactCodeAttributeComposer lcmp() - { - return add(new SimpleInstruction(InstructionConstants.OP_LCMP)); - } - - public CompactCodeAttributeComposer fcmpl() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCMPL)); - } - - public CompactCodeAttributeComposer fcmpg() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCMPG)); - } - - public CompactCodeAttributeComposer dcmpl() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCMPL)); - } - - public CompactCodeAttributeComposer dcmpg() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCMPG)); - } - - public CompactCodeAttributeComposer ifeq(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFEQ, branchOffset)); - } - - public CompactCodeAttributeComposer ifne(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFNE, branchOffset)); - } - - public CompactCodeAttributeComposer iflt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFLT, branchOffset)); - } - - public CompactCodeAttributeComposer ifge(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFGE, branchOffset)); - } - - public CompactCodeAttributeComposer ifgt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFGT, branchOffset)); - } - - public CompactCodeAttributeComposer ifle(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFLE, branchOffset)); - } - - public CompactCodeAttributeComposer ificmpeq(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPEQ, branchOffset)); - } - - public CompactCodeAttributeComposer ificmpne(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPNE, branchOffset)); - } - - public CompactCodeAttributeComposer ificmplt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPLT, branchOffset)); - } - - public CompactCodeAttributeComposer ificmpge(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPGE, branchOffset)); - } - - public CompactCodeAttributeComposer ificmpgt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPGT, branchOffset)); - } - - public CompactCodeAttributeComposer ificmple(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPLE, branchOffset)); - } - - public CompactCodeAttributeComposer ifacmpeq(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFACMPEQ, branchOffset)); - } - - public CompactCodeAttributeComposer ifacmpne(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFACMPNE, branchOffset)); - } - - public CompactCodeAttributeComposer goto_(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_GOTO, branchOffset)); - } - - public CompactCodeAttributeComposer jsr(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_JSR, branchOffset)); - } - - public CompactCodeAttributeComposer ret(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_RET, variableIndex)); - } - - public CompactCodeAttributeComposer tableswitch(int defaultOffset, - int lowCase, - int highCase, - int[] jumpOffsets) - { - return add(new TableSwitchInstruction(InstructionConstants.OP_TABLESWITCH, - defaultOffset, - lowCase, - highCase, - jumpOffsets)); - } - - public CompactCodeAttributeComposer lookupswitch(int defaultOffset, - int[] cases, - int[] jumpOffsets) - { - return add(new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, - defaultOffset, - cases, - jumpOffsets)); - } - - public CompactCodeAttributeComposer ireturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_IRETURN)); - } - - public CompactCodeAttributeComposer lreturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_LRETURN)); - } - - public CompactCodeAttributeComposer freturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_FRETURN)); - } - - public CompactCodeAttributeComposer dreturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_DRETURN)); - } - - public CompactCodeAttributeComposer areturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_ARETURN)); - } - - public CompactCodeAttributeComposer return_() - { - return add(new SimpleInstruction(InstructionConstants.OP_RETURN)); - } - - public CompactCodeAttributeComposer getstatic(Clazz referencedClass, - Member referencedMember) - { - return getstatic(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public CompactCodeAttributeComposer getstatic(String className, - String name, - String descriptor) - { - return getstatic(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer getstatic(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return getstatic(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer getstatic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_GETSTATIC, constantIndex)); - } - - public CompactCodeAttributeComposer putstatic(Clazz referencedClass, - Member referencedMember) - { - return putstatic(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public CompactCodeAttributeComposer putstatic(String className, - String name, - String descriptor) - { - return putstatic(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer putstatic(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return putstatic(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer putstatic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, constantIndex)); - } - - public CompactCodeAttributeComposer getfield(String className, - String name, - String descriptor) - { - return getfield(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer getfield(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return getfield(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer getfield(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_GETFIELD, constantIndex)); - } - - public CompactCodeAttributeComposer putfield(String className, - String name, - String descriptor) - { - return putfield(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer putfield(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return putfield(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer putfield(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_PUTFIELD, constantIndex)); - } - - public CompactCodeAttributeComposer invokevirtual(String className, - String name, - String descriptor) - { - return invokevirtual(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer invokevirtual(Clazz referencedClass, - Member referencedMember) - { - return invokevirtual(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public CompactCodeAttributeComposer invokevirtual(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokevirtual(constantPoolEditor.addMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer invokevirtual(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, constantIndex)); - } - - public CompactCodeAttributeComposer invokespecial(String className, - String name, - String descriptor) - { - return invokespecial(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer invokespecial(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokespecial(constantPoolEditor.addMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer invokespecial(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, constantIndex)); - } - - public CompactCodeAttributeComposer invokestatic(String className, - String name, - String descriptor) - { - return invokestatic(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer invokestatic(Clazz referencedClass, - Member referencedMember) - { - return invokestatic(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public CompactCodeAttributeComposer invokestatic(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokestatic(constantPoolEditor.addMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer invokestaticinterface(String className, - String name, - String descriptor) - { - return invokestaticinterface(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer invokestaticinterface(Clazz referencedClass, - Member referencedMember) - { - return invokestaticinterface(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public CompactCodeAttributeComposer invokestaticinterface(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokestatic(constantPoolEditor.addInterfaceMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public CompactCodeAttributeComposer invokestatic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, constantIndex)); - } - - public CompactCodeAttributeComposer invokeinterface(String className, - String name, - String descriptor) - { - return invokeinterface(className, name, descriptor, null, null); - } - - public CompactCodeAttributeComposer invokeinterface(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - int invokeinterfaceConstant = - (ClassUtil.internalMethodParameterSize(descriptor, false)) << 8; - - return invokeinterface(constantPoolEditor.addInterfaceMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember), - invokeinterfaceConstant); - } - - public CompactCodeAttributeComposer invokeinterface(int constantIndex, - int constant) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKEINTERFACE, constantIndex, constant)); - } - - public CompactCodeAttributeComposer invokedynamic(int bootStrapMethodIndex, - String name, - String descriptor, - Clazz[] referencedClasses) - { - return invokedynamic(constantPoolEditor.addInvokeDynamicConstant(bootStrapMethodIndex, - name, - descriptor, - referencedClasses)); - } - - public CompactCodeAttributeComposer invokedynamic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKEDYNAMIC, constantIndex)); - } - - public CompactCodeAttributeComposer new_(String className) - { - return new_(className, null); - } - - public CompactCodeAttributeComposer new_(String className, Clazz referencedClass) - { - return new_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public CompactCodeAttributeComposer new_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_NEW, constantIndex)); - } - - public CompactCodeAttributeComposer newarray(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_NEWARRAY, constant)); - } - - public CompactCodeAttributeComposer anewarray(String className, Clazz referencedClass) - { - return anewarray(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public CompactCodeAttributeComposer anewarray(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_ANEWARRAY, constantIndex)); - } - - public CompactCodeAttributeComposer arraylength() - { - return add(new SimpleInstruction(InstructionConstants.OP_ARRAYLENGTH)); - } - - public CompactCodeAttributeComposer athrow() - { - return add(new SimpleInstruction(InstructionConstants.OP_ATHROW)); - } - - public CompactCodeAttributeComposer checkcast(String className) - { - return checkcast(className, null); - } - - public CompactCodeAttributeComposer checkcast(String className, Clazz referencedClass) - { - return checkcast(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public CompactCodeAttributeComposer checkcast(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_CHECKCAST, constantIndex)); - } - - public CompactCodeAttributeComposer instanceof_(String className, Clazz referencedClass) - { - return instanceof_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public CompactCodeAttributeComposer instanceof_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INSTANCEOF, constantIndex)); - } - - public CompactCodeAttributeComposer monitorenter() - { - return add(new SimpleInstruction(InstructionConstants.OP_MONITORENTER)); - } - - public CompactCodeAttributeComposer monitorexit() - { - return add(new SimpleInstruction(InstructionConstants.OP_MONITOREXIT)); - } - - public CompactCodeAttributeComposer wide() - { - return add(new SimpleInstruction(InstructionConstants.OP_WIDE)); - } - - public CompactCodeAttributeComposer multianewarray(String className, Clazz referencedClass) - { - return multianewarray(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public CompactCodeAttributeComposer multianewarray(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_MULTIANEWARRAY, constantIndex)); - } - - public CompactCodeAttributeComposer ifnull(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFNULL, branchOffset)); - } - - public CompactCodeAttributeComposer ifnonnull(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFNONNULL, branchOffset)); - } - - public CompactCodeAttributeComposer goto_w(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_GOTO_W, branchOffset)); - } - - public CompactCodeAttributeComposer jsr_w(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_JSR_W, branchOffset)); - } - - - // Additional convenience methods. - - /** - * Pushes the given primitive value on the stack. - * - * Operand stack: - * ... -> ..., value - * - * @param primitive the primitive value to be pushed - should never be null. - * @param internalType the internal type of the primitive ('Z','B','I',...) - */ - public CompactCodeAttributeComposer pushPrimitive(Object primitive, - char internalType) - { - switch (internalType) - { - case TYPE_BOOLEAN: return ((Boolean)primitive).booleanValue() ? iconst_1() : iconst_0(); - case TYPE_BYTE: return bipush((Byte)primitive); - case TYPE_CHAR: return ldc(((Character)primitive).charValue()); - case TYPE_SHORT: return sipush((Short)primitive); - case TYPE_INT: return ldc(((Integer)primitive).intValue()); - case TYPE_LONG: return ldc2_w((Long)primitive); - case TYPE_FLOAT: return ldc(((Float)primitive).floatValue()); - case TYPE_DOUBLE: return ldc2_w((Double)primitive); - default: throw new IllegalArgumentException(primitive.toString()); - } - } - - - /** - * Pushes the given primitive int on the stack in the most efficient way - * (as an iconst, bipush, sipush, or ldc instruction). - * - * @param value the int value to be pushed. - */ - public CompactCodeAttributeComposer pushInt(int value) - { - return - value >= -1 && - value <= 5 ? iconst(value) : - value == (byte)value ? bipush(value) : - value == (short)value ? sipush(value) : - ldc(value); - } - - - /** - * Pushes the given primitive float on the stack in the most efficient way - * (as an fconst or ldc instruction). - * - * @param value the int value to be pushed. - */ - public CompactCodeAttributeComposer pushFloat(float value) - { - return - value == 0f || - value == 1f ? fconst((int)value) : - ldc(value); - } - - - /** - * Pushes the given primitive long on the stack in the most efficient way - * (as an lconst or ldc instruction). - * - * @param value the int value to be pushed. - */ - public CompactCodeAttributeComposer pushLong(long value) - { - return - value == 0L || - value == 1L ? lconst((int)value) : - ldc2_w(value); - } - - - /** - * Pushes the given primitive double on the stack in the most efficient way - * (as a dconst or ldc instruction). - * - * @param value the int value to be pushed. - */ - public CompactCodeAttributeComposer pushDouble(double value) - { - return - value == 0. || - value == 1. ? dconst((int)value) : - ldc2_w(value); - } - - - /** - * Pushes a new array on the stack. - * - * Operand stack: - * ... -> ..., array - * - * @param elementTypeOrClassName the array element type (or class name in case of objects). - * @param size the size of the array to be created. - */ - public CompactCodeAttributeComposer pushNewArray(String elementTypeOrClassName, - int size) - { - // Create new array. - pushInt(size); - - return ClassUtil.isInternalPrimitiveType(elementTypeOrClassName) ? - newarray(InstructionUtil.arrayTypeFromInternalType(elementTypeOrClassName.charAt(0))) : - anewarray(elementTypeOrClassName, null); - } - - - /** - * Loads the given variable onto the stack. - * - * Operand stack: - * ... -> ..., value - * - * @param variableIndex the index of the variable to be loaded. - * @param internalType the type of the variable to be loaded. - */ - public CompactCodeAttributeComposer load(int variableIndex, - String internalType) - { - return load(variableIndex, internalType.charAt(0)); - } - - - /** - * Loads the given variable of primitive type onto the stack. - * - * Operand stack: - * ... -> ..., value - * - * @param variableIndex the index of the variable to be loaded. - * @param internalType the primitive type of the variable to be loaded. - */ - public CompactCodeAttributeComposer load(int variableIndex, - char internalType) - { - switch (internalType) - { - case TYPE_BOOLEAN: - case TYPE_BYTE: - case TYPE_CHAR: - case TYPE_SHORT: - case TYPE_INT: return iload(variableIndex); - case TYPE_LONG: return lload(variableIndex); - case TYPE_FLOAT: return fload(variableIndex); - case TYPE_DOUBLE: return dload(variableIndex); - default: return aload(variableIndex); - } - } - - - /** - * Stores the value on top of the stack in the variable with given index. - * - * Operand stsack: - * ..., value -> ... - * - * @param variableIndex the index of the variable where to store the - * value. - * @param internalType the type of the value to be stored. - */ - public CompactCodeAttributeComposer store(int variableIndex, - String internalType) - { - return store(variableIndex, internalType.charAt(0)); - } - - - /** - * Stores the primitve value on top of the stack in the variable with given - * index. - * - * Operand stack: - * ..., value -> ... - * - * @param variableIndex the index of the variable where to store the - * value. - * @param internalType the primitive type of the value to be stored. - */ - public CompactCodeAttributeComposer store(int variableIndex, - char internalType) - { - switch (internalType) - { - case TYPE_BOOLEAN: - case TYPE_BYTE: - case TYPE_CHAR: - case TYPE_SHORT: - case TYPE_INT: return istore(variableIndex); - case TYPE_LONG: return lstore(variableIndex); - case TYPE_FLOAT: return fstore(variableIndex); - case TYPE_DOUBLE: return dstore(variableIndex); - default: return astore(variableIndex); - } - } - - - /** - * Stores an element to an array. - * - * Operand stack: - * ..., array, index, value -> ... - * - * @param elementType the type of the value to be stored. - */ - public CompactCodeAttributeComposer storeToArray(String elementType) - { - switch (elementType.charAt(0)) - { - case TYPE_BOOLEAN: - case TYPE_BYTE: return bastore(); - case TYPE_CHAR: return castore(); - case TYPE_SHORT: return sastore(); - case TYPE_INT: return iastore(); - case TYPE_LONG: return lastore(); - case TYPE_FLOAT: return fastore(); - case TYPE_DOUBLE: return dastore(); - default: return aastore(); - } - } - - - /** - * Appends the proper return statement for the given internal type. - * - * @param internalType the return type. - */ - public CompactCodeAttributeComposer return_(String internalType) - { - switch (internalType.charAt(0)) - { - case TYPE_BOOLEAN: - case TYPE_BYTE: - case TYPE_CHAR: - case TYPE_SHORT: - case TYPE_INT: return ireturn(); - case TYPE_LONG: return lreturn(); - case TYPE_FLOAT: return freturn(); - case TYPE_DOUBLE: return dreturn(); - case TYPE_VOID: return return_(); - default: return areturn(); - } - } - - - /** - * Appends instructions to print out the given message and the top int on - * the stack. - */ - public CompactCodeAttributeComposer appendPrintIntegerInstructions(String message) - { - appendPrintInstructions(message); - appendPrintIntegerInstructions(); - return this; - } - - /** - * Appends instructions to print out the given message and the top int on - * the stack as a hexadecimal value. - */ - public CompactCodeAttributeComposer appendPrintIntegerHexInstructions(String message) - { - appendPrintInstructions(message); - appendPrintIntegerHexInstructions(); - return this; - } - - /** - * Appends instructions to print out the given message and the top long on - * the stack. - */ - public CompactCodeAttributeComposer appendPrintLongInstructions(String message) - { - appendPrintInstructions(message); - appendPrintLongInstructions(); - return this; - } - - /** - * Appends instructions to print out the given message and the top String on - * the stack. - */ - public CompactCodeAttributeComposer appendPrintStringInstructions(String message) - { - appendPrintInstructions(message); - appendPrintStringInstructions(); - return this; - } - - /** - * Appends instructions to print out the given message and the top Object on - * the stack. - */ - public CompactCodeAttributeComposer appendPrintObjectInstructions(String message) - { - appendPrintInstructions(message); - appendPrintObjectInstructions(); - return this; - } - - /** - * Appends instructions to print out the given message and the stack trace - * of the top Throwable on the stack. - */ - public CompactCodeAttributeComposer appendPrintStackTraceInstructions(String message) - { - appendPrintInstructions(message); - appendPrintStackTraceInstructions(); - return this; - } - - /** - * Appends instructions to print out the given message. - */ - public CompactCodeAttributeComposer appendPrintInstructions(String message) - { - getstatic("java/lang/System", "err", "Ljava/io/PrintStream;"); - ldc(message); - invokevirtual("java/io/PrintStream", "println", "(Ljava/lang/String;)V"); - return this; - } - - /** - * Appends instructions to print out the top int on the stack. - */ - public CompactCodeAttributeComposer appendPrintIntegerInstructions() - { - dup(); - getstatic("java/lang/System", "err", "Ljava/io/PrintStream;"); - swap(); - invokevirtual("java/io/PrintStream", "println", "(I)V"); - return this; - } - - /** - * Appends instructions to print out the top integer on the stack as a - * hexadecimal value. - */ - public CompactCodeAttributeComposer appendPrintIntegerHexInstructions() - { - dup(); - getstatic("java/lang/System", "err", "Ljava/io/PrintStream;"); - swap(); - invokestatic("java/lang/Integer", "toHexString", "(I)Ljava/lang/String;"); - invokevirtual("java/io/PrintStream", "println", "(Ljava/lang/String;)V"); - return this; - } - - /** - * Appends instructions to print out the top long on the stack. - */ - public CompactCodeAttributeComposer appendPrintLongInstructions() - { - dup2(); - getstatic("java/lang/System", "err", "Ljava/io/PrintStream;"); - dup_x2(); - pop(); - invokevirtual("java/io/PrintStream", "println", "(J)V"); - return this; - } - - /** - * Appends instructions to print out the top String on the stack. - */ - public CompactCodeAttributeComposer appendPrintStringInstructions() - { - dup(); - getstatic("java/lang/System", "err", "Ljava/io/PrintStream;"); - swap(); - invokevirtual("java/io/PrintStream", "println", "(Ljava/lang/String;)V"); - return this; - } - - /** - * Appends instructions to print out the top Object on the stack. - */ - public CompactCodeAttributeComposer appendPrintObjectInstructions() - { - dup(); - getstatic("java/lang/System", "err", "Ljava/io/PrintStream;"); - swap(); - invokevirtual("java/io/PrintStream", "println", "(Ljava/lang/Object;)V"); - return this; - } - - /** - * Appends instructions to print out the stack trace of the top Throwable - * on the stack. - */ - public CompactCodeAttributeComposer appendPrintStackTraceInstructions() - { - dup(); - invokevirtual("java/lang/Throwable", "printStackTrace", "()V"); - return this; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttributeComposer.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Small utility methods. - - /** - * Adds the given instruction, shrinking it if necessary. - */ - private CompactCodeAttributeComposer add(Instruction instruction) - { - codeAttributeComposer.appendInstruction(instruction); - - return this; - } - - - public static void main(String[] args) - { - ProgramClass targetClass = new ProgramClass(0, 0, new Constant[32], 0, 0, 0); - - CompactCodeAttributeComposer composer = new CompactCodeAttributeComposer(targetClass); - - composer.beginCodeFragment(4); - composer.appendInstruction(0, new SimpleInstruction(InstructionConstants.OP_ICONST_0)); - composer.appendInstruction(1, new VariableInstruction(InstructionConstants.OP_ISTORE, 0)); - composer.appendInstruction(2, new BranchInstruction(InstructionConstants.OP_GOTO, 1)); - - composer.beginCodeFragment(4); - composer.appendInstruction(0, new VariableInstruction(InstructionConstants.OP_IINC, 0, 1)); - composer.appendInstruction(1, new VariableInstruction(InstructionConstants.OP_ILOAD, 0)); - composer.appendInstruction(2, new SimpleInstruction(InstructionConstants.OP_ICONST_5)); - composer.appendInstruction(3, new BranchInstruction(InstructionConstants.OP_IFICMPLT, -3)); - composer.endCodeFragment(); - - composer.appendInstruction(3, new SimpleInstruction(InstructionConstants.OP_RETURN)); - composer.endCodeFragment(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ComparableConstant.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ComparableConstant.java deleted file mode 100644 index 53312782..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ComparableConstant.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.util.ArrayUtil; - - -/** - * This class is a Comparable wrapper of Constant - * objects. It can store an index, in order to identify the constant pool - * entry after it has been sorted. The comparison is primarily based on the - * types of the constant pool entries, and secondarily on the contents of - * the constant pool entries. - * - * @author Eric Lafortune - */ -class ComparableConstant -extends SimplifiedVisitor -implements Comparable, ConstantVisitor -{ - private static final int[] PRIORITIES = new int[22]; - static - { - PRIORITIES[ClassConstants.CONSTANT_Integer] = 0; // Possibly byte index (ldc). - PRIORITIES[ClassConstants.CONSTANT_Float] = 1; - PRIORITIES[ClassConstants.CONSTANT_String] = 2; - PRIORITIES[ClassConstants.CONSTANT_Class] = 3; - PRIORITIES[ClassConstants.CONSTANT_Long] = 4; // Always wide index (ldc2_w). - PRIORITIES[ClassConstants.CONSTANT_Double] = 5; // Always wide index (ldc2_w). - PRIORITIES[ClassConstants.CONSTANT_Fieldref] = 6; // Always wide index (getfield,...). - PRIORITIES[ClassConstants.CONSTANT_Methodref] = 7; // Always wide index (invokespecial,...). - PRIORITIES[ClassConstants.CONSTANT_InterfaceMethodref] = 8; // Always wide index (invokeinterface). - PRIORITIES[ClassConstants.CONSTANT_InvokeDynamic] = 9; // Always wide index (invokedynamic). - PRIORITIES[ClassConstants.CONSTANT_MethodHandle] = 10; - PRIORITIES[ClassConstants.CONSTANT_NameAndType] = 11; - PRIORITIES[ClassConstants.CONSTANT_MethodType] = 12; - PRIORITIES[ClassConstants.CONSTANT_Module] = 13; - PRIORITIES[ClassConstants.CONSTANT_Package] = 14; - PRIORITIES[ClassConstants.CONSTANT_Utf8] = 15; - PRIORITIES[ClassConstants.CONSTANT_PrimitiveArray] = 16; - } - - private final Clazz clazz; - private final int thisIndex; - private final Constant thisConstant; - - private Constant otherConstant; - private int result; - - - public ComparableConstant(Clazz clazz, int index, Constant constant) - { - this.clazz = clazz; - this.thisIndex = index; - this.thisConstant = constant; - } - - - public int getIndex() - { - return thisIndex; - } - - - public Constant getConstant() - { - return thisConstant; - } - - - // Implementations for Comparable. - - public int compareTo(Object other) - { - ComparableConstant otherComparableConstant = (ComparableConstant)other; - - otherConstant = otherComparableConstant.thisConstant; - - // Compare based on the original indices, if the actual constant pool - // entries are the same. - if (thisConstant == otherConstant) - { - int otherIndex = otherComparableConstant.thisIndex; - - return thisIndex < otherIndex ? -1 : - thisIndex == otherIndex ? 0 : - 1; - } - - // Compare based on the tags, if they are different. - int thisTag = thisConstant.getTag(); - int otherTag = otherConstant.getTag(); - - if (thisTag != otherTag) - { - return PRIORITIES[thisTag] < PRIORITIES[otherTag] ? -1 : 1; - } - - // Otherwise compare based on the contents of the Constant objects. - thisConstant.accept(clazz, this); - - return result; - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - int value = integerConstant.getValue(); - int otherValue = ((IntegerConstant)otherConstant).getValue(); - result = value < otherValue ? -1 : - value == otherValue ? 0 : - 1; - } - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - long value = longConstant.getValue(); - long otherValue = ((LongConstant)otherConstant).getValue(); - result = value < otherValue ? -1 : - value == otherValue ? 0 : - 1; - } - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - result = Float.compare(floatConstant.getValue(), - ((FloatConstant)otherConstant).getValue()); - } - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - result = Double.compare(doubleConstant.getValue(), - ((DoubleConstant)otherConstant).getValue()); - } - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - PrimitiveArrayConstant otherPrimitiveArrayConstant = - (PrimitiveArrayConstant)otherConstant; - - char primitiveType = primitiveArrayConstant.getPrimitiveType(); - char otherPrimitiveType = otherPrimitiveArrayConstant.getPrimitiveType(); - - if (primitiveType != otherPrimitiveType) - { - result = primitiveType < otherPrimitiveType ? -1 : 1; - } - else - { - Object values = primitiveArrayConstant.getValues(); - Object otherValues = otherPrimitiveArrayConstant.getValues(); - - result = - values instanceof boolean[] ? ArrayUtil.compare((boolean[])values, ((boolean[])values).length, (boolean[])otherValues, ((boolean[])otherValues).length) : - values instanceof byte[] ? ArrayUtil.compare((byte[]) values, ((byte[]) values).length, (byte[]) otherValues, ((byte[]) otherValues).length) : - values instanceof char[] ? ArrayUtil.compare((char[]) values, ((char[]) values).length, (char[]) otherValues, ((char[]) otherValues).length) : - values instanceof short[] ? ArrayUtil.compare((short[]) values, ((short[]) values).length, (short[]) otherValues, ((short[]) otherValues).length) : - values instanceof int[] ? ArrayUtil.compare((int[]) values, ((int[]) values).length, (int[]) otherValues, ((int[]) otherValues).length) : - values instanceof float[] ? ArrayUtil.compare((float[]) values, ((float[]) values).length, (float[]) otherValues, ((float[]) otherValues).length) : - values instanceof long[] ? ArrayUtil.compare((long[]) values, ((long[]) values).length, (long[]) otherValues, ((long[]) otherValues).length) : - /*values instanceof double[] */ ArrayUtil.compare((double[]) values, ((double[]) values).length, (double[]) otherValues, ((double[]) otherValues).length); - } - } - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - result = stringConstant.getString(clazz).compareTo(((StringConstant)otherConstant).getString(clazz)); - } - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - result = utf8Constant.getString().compareTo(((Utf8Constant)otherConstant).getString()); - } - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - InvokeDynamicConstant otherInvokeDynamicConstant = (InvokeDynamicConstant)otherConstant; - - int index = invokeDynamicConstant.getBootstrapMethodAttributeIndex(); - int otherIndex = otherInvokeDynamicConstant.getBootstrapMethodAttributeIndex(); - - result = index < otherIndex ? -1 : - index > otherIndex ? 1 : - compare(invokeDynamicConstant.getName(clazz), - invokeDynamicConstant.getType(clazz), - otherInvokeDynamicConstant.getName(clazz), - otherInvokeDynamicConstant.getType(clazz)); - } - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - MethodHandleConstant otherMethodHandleConstant = (MethodHandleConstant)otherConstant; - - int kind = methodHandleConstant.getReferenceKind(); - int otherKind = otherMethodHandleConstant.getReferenceKind(); - - result = kind < otherKind ? -1 : - kind > otherKind ? 1 : - compare(methodHandleConstant.getClassName(clazz), - methodHandleConstant.getName(clazz), - methodHandleConstant.getType(clazz), - otherMethodHandleConstant.getClassName(clazz), - otherMethodHandleConstant.getName(clazz), - otherMethodHandleConstant.getType(clazz)); - } - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - RefConstant otherRefConstant = (RefConstant)otherConstant; - result = compare(refConstant.getClassName(clazz), - refConstant.getName(clazz), - refConstant.getType(clazz), - otherRefConstant.getClassName(clazz), - otherRefConstant.getName(clazz), - otherRefConstant.getType(clazz)); - } - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - result = classConstant.getName(clazz).compareTo(((ClassConstant)otherConstant).getName(clazz)); - } - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant MethodTypeConstant) - { - MethodTypeConstant otherMethodTypeConstant = (MethodTypeConstant)otherConstant; - result = MethodTypeConstant.getType(clazz) - .compareTo - (otherMethodTypeConstant.getType(clazz)); - } - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - NameAndTypeConstant otherNameAndTypeConstant = (NameAndTypeConstant)otherConstant; - result = compare(nameAndTypeConstant.getName(clazz), - nameAndTypeConstant.getType(clazz), - otherNameAndTypeConstant.getName(clazz), - otherNameAndTypeConstant.getType(clazz)); - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - result = moduleConstant.getName(clazz).compareTo(((ModuleConstant)otherConstant).getName(clazz)); - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - result = packageConstant.getName(clazz).compareTo(((PackageConstant)otherConstant).getName(clazz)); - } - - // Implementations for Object. - - public boolean equals(Object other) - { - return other != null && - this.getClass().equals(other.getClass()) && - this.getConstant().getClass().equals(((ComparableConstant)other).getConstant().getClass()) && - this.compareTo(other) == 0; - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } - - - // Small utility methods. - - /** - * Compares the given two pairs of strings. - */ - private int compare(String string1a, String string1b, - String string2a, String string2b) - { - int comparison; - return - (comparison = string1a.compareTo(string2a)) != 0 ? comparison : - string1b.compareTo(string2b); - } - - - /** - * Compares the given two triplets of strings. - */ - private int compare(String string1a, String string1b, String string1c, - String string2a, String string2b, String string2c) - { - int comparison; - return - (comparison = string1a.compareTo(string2a)) != 0 ? comparison : - (comparison = string1b.compareTo(string2b)) != 0 ? comparison : - string1c.compareTo(string2c); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantAdder.java deleted file mode 100644 index 3d15b71a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantAdder.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This ConstantVisitor adds all constants that it visits to the constant pool - * of a given target class. - * - * Bootstrap methods attributes are automatically updated for invokedynamic - * constants. - * - * @author Eric Lafortune - */ -public class ConstantAdder -implements ConstantVisitor -{ - private final ConstantPoolEditor constantPoolEditor; - private final BootstrapMethodsAttributeAdder bootstrapMethodsAttributeAdder; - - private int constantIndex; - - - /** - * Creates a new ConstantAdder that will copy constants into the given - * target class. - */ - public ConstantAdder(ProgramClass targetClass) - { - constantPoolEditor = new ConstantPoolEditor(targetClass); - bootstrapMethodsAttributeAdder = new BootstrapMethodsAttributeAdder(targetClass); - } - - - /** - * Adds a copy of the specified constant in the given class and returns - * its index. If the specified index is 0, the returned value is 0 too. - */ - public int addConstant(Clazz clazz, int constantIndex) - { - clazz.constantPoolEntryAccept(constantIndex, this); - - return this.constantIndex; - } - - - /** - * Adds a copy of the given constant in the given class and returns - * its index. - */ - public int addConstant(Clazz clazz, Constant constant) - { - constant.accept(clazz, this); - - return this.constantIndex; - } - - - /** - * Returns the index of the most recently created constant in the constant - * pool of the target class. - */ - public int getConstantIndex() - { - return constantIndex; - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - constantIndex = - constantPoolEditor.addIntegerConstant(integerConstant.getValue()); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - constantIndex = - constantPoolEditor.addLongConstant(longConstant.getValue()); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - constantIndex = - constantPoolEditor.addFloatConstant(floatConstant.getValue()); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - constantIndex = - constantPoolEditor.addDoubleConstant(doubleConstant.getValue()); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - constantIndex = - constantPoolEditor.addPrimitiveArrayConstant(primitiveArrayConstant.getValues()); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - constantIndex = - constantPoolEditor.addStringConstant(stringConstant.getString(clazz), - stringConstant.referencedClass, - stringConstant.referencedMember); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - constantIndex = - constantPoolEditor.addUtf8Constant(utf8Constant.getString()); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Find the bootstrap methods attribute. - AttributesEditor attributesEditor = - new AttributesEditor((ProgramClass)clazz, false); - - BootstrapMethodsAttribute bootstrapMethodsAttribute = - (BootstrapMethodsAttribute)attributesEditor.findAttribute(ClassConstants.ATTR_BootstrapMethods); - - // Add the name and type constant. - clazz.constantPoolEntryAccept(invokeDynamicConstant.u2nameAndTypeIndex, this); - - // Copy the referenced classes. - Clazz[] referencedClasses = invokeDynamicConstant.referencedClasses; - Clazz[] referencedClassesCopy = null; - if (referencedClasses != null) - { - referencedClassesCopy = new Clazz[referencedClasses.length]; - System.arraycopy(referencedClasses, 0, - referencedClassesCopy, 0, - referencedClasses.length); - } - - bootstrapMethodsAttribute.bootstrapMethodEntryAccept(clazz, - invokeDynamicConstant.getBootstrapMethodAttributeIndex(), - bootstrapMethodsAttributeAdder); - - // Then add the actual invoke dynamic constant. - constantIndex = - constantPoolEditor.addInvokeDynamicConstant(bootstrapMethodsAttributeAdder.getBootstrapMethodIndex(), - constantIndex, - referencedClassesCopy); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - // First add the field ref, interface method ref, or method ref - // constant. - clazz.constantPoolEntryAccept(methodHandleConstant.u2referenceIndex, this); - - // Then add the actual method handle constant. - constantIndex = - constantPoolEditor.addMethodHandleConstant(methodHandleConstant.getReferenceKind(), - constantIndex); - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - constantIndex = - constantPoolEditor.addModuleConstant(moduleConstant.getName(clazz)); - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - constantIndex = - constantPoolEditor.addPackageConstant(packageConstant.getName(clazz)); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - // First add the referenced class constant, with its own referenced class. - clazz.constantPoolEntryAccept(fieldrefConstant.u2classIndex, this); - - // Then add the actual field reference constant, with its referenced - // class and class member. - constantIndex = - constantPoolEditor.addFieldrefConstant(constantIndex, - fieldrefConstant.getName(clazz), - fieldrefConstant.getType(clazz), - fieldrefConstant.referencedClass, - fieldrefConstant.referencedMember); - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - // First add the referenced class constant, with its own referenced class. - clazz.constantPoolEntryAccept(interfaceMethodrefConstant.u2classIndex, this); - - // Then add the actual interface method reference constant, with its - // referenced class and class member. - constantIndex = - constantPoolEditor.addInterfaceMethodrefConstant(constantIndex, - interfaceMethodrefConstant.getName(clazz), - interfaceMethodrefConstant.getType(clazz), - interfaceMethodrefConstant.referencedClass, - interfaceMethodrefConstant.referencedMember); - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - // First add the referenced class constant, with its own referenced class. - clazz.constantPoolEntryAccept(methodrefConstant.u2classIndex, this); - - // Then add the actual method reference constant, with its referenced - // class and class member. - constantIndex = - constantPoolEditor.addMethodrefConstant(constantIndex, - methodrefConstant.getName(clazz), - methodrefConstant.getType(clazz), - methodrefConstant.referencedClass, - methodrefConstant.referencedMember); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Add the class constant, with its referenced class.. - constantIndex = - constantPoolEditor.addClassConstant(classConstant.getName(clazz), - classConstant.referencedClass); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - constantIndex = - constantPoolEditor.addMethodTypeConstant(methodTypeConstant.getType(clazz), - methodTypeConstant.referencedClasses); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - constantIndex = - constantPoolEditor.addNameAndTypeConstant(nameAndTypeConstant.getName(clazz), - nameAndTypeConstant.getType(clazz)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolEditor.java deleted file mode 100644 index bc7bd0e6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolEditor.java +++ /dev/null @@ -1,908 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.ClassReferenceInitializer; -import proguard.optimize.peephole.WildcardConstantFilter; - -/** - * This class can add constant pool entries to a given class. - * - * @author Eric Lafortune - */ -public class ConstantPoolEditor -{ - private static final boolean DEBUG = false; - - private final ProgramClass targetClass; - private final ConstantVisitor constantReferenceInitializer; - - - /** - * Creates a new ConstantPoolEditor. - * @param targetClass the target class in which constants are to be edited. - */ - public ConstantPoolEditor(ProgramClass targetClass) - { - this(targetClass, null, null); - } - - - /** - * Creates a new ConstantPoolEditor that automatically initializes class - * references and class member references in new constants. - * @param targetClass the target class in which constants are to be - * edited. - * @param programClassPool the program class pool from which new constants - * can be initialized. - * @param libraryClassPool the library class pool from which new constants - * can be initialized. - */ - public ConstantPoolEditor(ProgramClass targetClass, - ClassPool programClassPool, - ClassPool libraryClassPool) - { - this.targetClass = targetClass; - - constantReferenceInitializer = programClassPool == null ? null : - new WildcardConstantFilter( - new ClassReferenceInitializer(programClassPool, libraryClassPool)); - } - - - /** - * Returns the target class in which constants are edited. - */ - public ProgramClass getTargetClass() - { - return targetClass; - } - - - /** - * Finds or creates a IntegerConstant constant pool entry with the given - * value. - * @return the constant pool index of the Utf8Constant. - */ - public int addIntegerConstant(int value) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Integer) - { - IntegerConstant integerConstant = (IntegerConstant)constant; - if (integerConstant.getValue() == value) - { - return index; - } - } - } - - return addConstant(new IntegerConstant(value)); - } - - - /** - * Finds or creates a LongConstant constant pool entry with the given value. - * @return the constant pool index of the LongConstant. - */ - public int addLongConstant(long value) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Long) - { - LongConstant longConstant = (LongConstant)constant; - if (longConstant.getValue() == value) - { - return index; - } - } - } - - return addConstant(new LongConstant(value)); - } - - - /** - * Finds or creates a FloatConstant constant pool entry with the given - * value. - * @return the constant pool index of the FloatConstant. - */ - public int addFloatConstant(float value) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Float) - { - FloatConstant floatConstant = (FloatConstant)constant; - if (floatConstant.getValue() == value) - { - return index; - } - } - } - - return addConstant(new FloatConstant(value)); - } - - - /** - * Finds or creates a DoubleConstant constant pool entry with the given - * value. - * @return the constant pool index of the DoubleConstant. - */ - public int addDoubleConstant(double value) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Double) - { - DoubleConstant doubleConstant = (DoubleConstant)constant; - if (doubleConstant.getValue() == value) - { - return index; - } - } - } - - return addConstant(new DoubleConstant(value)); - } - - - /** - * Finds or creates a PrimitiveArrayConstant constant pool entry with the - * given values. - * @return the constant pool index of the PrimitiveArrayConstant. - */ - public int addPrimitiveArrayConstant(Object values) - { - return addConstant(new PrimitiveArrayConstant(values)); - } - - - /** - * Finds or creates a StringConstant constant pool entry with the given - * value. - * @return the constant pool index of the StringConstant. - */ - public int addStringConstant(String string, - Clazz referencedClass, - Member referencedMember) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_String) - { - StringConstant stringConstant = (StringConstant)constant; - if (stringConstant.u2stringIndex < constantPoolCount && - stringConstant.getString(targetClass).equals(string) && - stringConstant.referencedClass == referencedClass && - stringConstant.referencedMember == referencedMember) - { - return index; - } - } - } - - return addConstant(new StringConstant(addUtf8Constant(string), - referencedClass, - referencedMember)); - } - - - /** - * Finds or creates a InvokeDynamicConstant constant pool entry with the - * given bootstrap method constant pool entry index, method name, and - * descriptor. - * @return the constant pool index of the InvokeDynamicConstant. - */ - public int addInvokeDynamicConstant(int bootstrapMethodIndex, - String name, - String descriptor, - Clazz[] referencedClasses) - { - return addInvokeDynamicConstant(bootstrapMethodIndex, - addNameAndTypeConstant(name, descriptor), - referencedClasses); - } - - - /** - * Finds or creates a InvokeDynamicConstant constant pool entry with the given - * class constant pool entry index and name and type constant pool entry - * index. - * @return the constant pool index of the InvokeDynamicConstant. - */ - public int addInvokeDynamicConstant(int bootstrapMethodIndex, - int nameAndTypeIndex, - Clazz[] referencedClasses) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_InvokeDynamic) - { - InvokeDynamicConstant invokeDynamicConstant = (InvokeDynamicConstant)constant; - if (invokeDynamicConstant.u2bootstrapMethodAttributeIndex == bootstrapMethodIndex && - invokeDynamicConstant.u2nameAndTypeIndex == nameAndTypeIndex) - { - return index; - } - } - } - - return addConstant(new InvokeDynamicConstant(bootstrapMethodIndex, - nameAndTypeIndex, - referencedClasses)); - } - - - /** - * Finds or creates a MethodHandleConstant constant pool entry of the - * specified kind and with the given field ref, interface method ref, - * or method ref constant pool entry index. - * @return the constant pool index of the MethodHandleConstant. - */ - public int addMethodHandleConstant(int referenceKind, - int referenceIndex) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_MethodHandle) - { - MethodHandleConstant methodHandleConstant = (MethodHandleConstant)constant; - if (methodHandleConstant.u1referenceKind == referenceKind && - methodHandleConstant.u2referenceIndex == referenceIndex) - { - return index; - } - } - } - - return addConstant(new MethodHandleConstant(referenceKind, - referenceIndex)); - } - - /** - * Finds or creates a ModuleConstant constant pool entry with the given name. - * @return the constant pool index of the ModuleConstant. - */ - public int addModuleConstant(String name) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Module) - { - ModuleConstant moduleConstant = (ModuleConstant)constant; - if (moduleConstant.getName(targetClass).equals(name)) - { - return index; - } - } - } - - int nameIndex = addUtf8Constant(name); - - return addConstant(new ModuleConstant(nameIndex)); - } - - /** - * Finds or creates a PackageConstant constant pool entry with the given name. - * @return the constant pool index of the PackageConstant. - */ - public int addPackageConstant(String name) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Package) - { - PackageConstant packageConstant = (PackageConstant)constant; - if (packageConstant.getName(targetClass).equals(name)) - { - return index; - } - } - } - - int nameIndex = addUtf8Constant(name); - - return addConstant(new PackageConstant(nameIndex)); - } - - - /** - * Finds or creates a FieldrefConstant constant pool entry for the given - * class and field. - * @return the constant pool index of the FieldrefConstant. - */ - public int addFieldrefConstant(Clazz referencedClass, - Member referencedMember) - { - return addFieldrefConstant(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a FieldrefConstant constant pool entry with the given - * class name, field name, and descriptor. - * @return the constant pool index of the FieldrefConstant. - */ - public int addFieldrefConstant(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return addFieldrefConstant(className, - addNameAndTypeConstant(name, descriptor), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a FieldrefConstant constant pool entry with the given - * class name, field name, and descriptor. - * @return the constant pool index of the FieldrefConstant. - */ - public int addFieldrefConstant(String className, - int nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - return addFieldrefConstant(addClassConstant(className, referencedClass), - nameAndTypeIndex, - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a FieldrefConstant constant pool entry with the given - * class constant pool entry index, field name, and descriptor. - * @return the constant pool index of the FieldrefConstant. - */ - public int addFieldrefConstant(int classIndex, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return addFieldrefConstant(classIndex, - addNameAndTypeConstant(name, descriptor), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a FieldrefConstant constant pool entry with the given - * class constant pool entry index and name and type constant pool entry - * index. - * @return the constant pool index of the FieldrefConstant. - */ - public int addFieldrefConstant(int classIndex, - int nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Fieldref) - { - FieldrefConstant fieldrefConstant = (FieldrefConstant)constant; - if (fieldrefConstant.u2classIndex == classIndex && - fieldrefConstant.u2nameAndTypeIndex == nameAndTypeIndex) - { - return index; - } - } - } - - return addConstant(new FieldrefConstant(classIndex, - nameAndTypeIndex, - referencedClass, - referencedMember)); - } - - - /** - * Finds or creates a InterfaceMethodrefConstant constant pool entry with the - * given class name, method name, and descriptor. - * @return the constant pool index of the InterfaceMethodrefConstant. - */ - public int addInterfaceMethodrefConstant(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return addInterfaceMethodrefConstant(className, - addNameAndTypeConstant(name, descriptor), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a InterfaceMethodrefConstant constant pool entry with the - * given class name, method name, and descriptor. - * @return the constant pool index of the InterfaceMethodrefConstant. - */ - public int addInterfaceMethodrefConstant(String className, - int nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - return addInterfaceMethodrefConstant(addClassConstant(className, referencedClass), - nameAndTypeIndex, - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a InterfaceMethodrefConstant constant pool entry for the - * given class and method. - * @return the constant pool index of the InterfaceMethodrefConstant. - */ - public int addInterfaceMethodrefConstant(Clazz referencedClass, - Member referencedMember) - { - return addInterfaceMethodrefConstant(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a InterfaceMethodrefConstant constant pool entry with the - * given class constant pool entry index, method name, and descriptor. - * @return the constant pool index of the InterfaceMethodrefConstant. - */ - public int addInterfaceMethodrefConstant(int classIndex, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return addInterfaceMethodrefConstant(classIndex, - addNameAndTypeConstant(name, descriptor), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a InterfaceMethodrefConstant constant pool entry with the - * given class constant pool entry index and name and type constant pool - * entry index. - * @return the constant pool index of the InterfaceMethodrefConstant. - */ - public int addInterfaceMethodrefConstant(int classIndex, - int nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_InterfaceMethodref) - { - InterfaceMethodrefConstant methodrefConstant = (InterfaceMethodrefConstant)constant; - if (methodrefConstant.u2classIndex == classIndex && - methodrefConstant.u2nameAndTypeIndex == nameAndTypeIndex) - { - return index; - } - } - } - - return addConstant(new InterfaceMethodrefConstant(classIndex, - nameAndTypeIndex, - referencedClass, - referencedMember)); - } - - - /** - * Finds or creates a MethodrefConstant constant pool entry for the given - * class and method. - * @return the constant pool index of the MethodrefConstant. - */ - public int addMethodrefConstant(Clazz referencedClass, - Member referencedMember) - { - return addMethodrefConstant(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a MethodrefConstant constant pool entry with the given - * class name, method name, and descriptor. - * @return the constant pool index of the MethodrefConstant. - */ - public int addMethodrefConstant(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return addMethodrefConstant(className, - addNameAndTypeConstant(name, descriptor), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a MethodrefConstant constant pool entry with the given - * class name, method name, and descriptor. - * @return the constant pool index of the MethodrefConstant. - */ - public int addMethodrefConstant(String className, - int nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - return addMethodrefConstant(addClassConstant(className, referencedClass), - nameAndTypeIndex, - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a MethodrefConstant constant pool entry with the given - * class constant pool entry index, method name, and descriptor. - * @return the constant pool index of the MethodrefConstant. - */ - public int addMethodrefConstant(int classIndex, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return addMethodrefConstant(classIndex, - addNameAndTypeConstant(name, descriptor), - referencedClass, - referencedMember); - } - - - /** - * Finds or creates a MethodrefConstant constant pool entry with the given - * class constant pool entry index and name and type constant pool entry - * index. - * @return the constant pool index of the MethodrefConstant. - */ - public int addMethodrefConstant(int classIndex, - int nameAndTypeIndex, - Clazz referencedClass, - Member referencedMember) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Methodref) - { - MethodrefConstant methodrefConstant = (MethodrefConstant)constant; - if (methodrefConstant.u2classIndex == classIndex && - methodrefConstant.u2nameAndTypeIndex == nameAndTypeIndex) - { - return index; - } - } - } - - return addConstant(new MethodrefConstant(classIndex, - nameAndTypeIndex, - referencedClass, - referencedMember)); - } - - - /** - * Finds or creates a ClassConstant constant pool entry for the given class. - * @return the constant pool index of the ClassConstant. - */ - public int addClassConstant(Clazz referencedClass) - { - return addClassConstant(referencedClass.getName(), - referencedClass); - } - - - /** - * Finds or creates a ClassConstant constant pool entry with the given name. - * @return the constant pool index of the ClassConstant. - */ - public int addClassConstant(String name, - Clazz referencedClass) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Class) - { - ClassConstant classConstant = (ClassConstant)constant; - if (classConstant.u2nameIndex < constantPoolCount && - classConstant.getName(targetClass).equals(name)) - { - return index; - } - } - } - - int nameIndex = addUtf8Constant(name); - - return addConstant(new ClassConstant(nameIndex, referencedClass)); - } - - - /** - * Finds or creates a MethodTypeConstant constant pool entry with the given - * type. - * @return the constant pool index of the MethodTypeConstant. - */ - public int addMethodTypeConstant(String type, - Clazz[] referencedClasses) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_MethodType) - { - MethodTypeConstant methodTypeConstant = (MethodTypeConstant)constant; - if (methodTypeConstant.u2descriptorIndex < constantPoolCount && - methodTypeConstant.getType(targetClass).equals(type)) - { - return index; - } - } - } - - return addConstant(new MethodTypeConstant(addUtf8Constant(type), - referencedClasses)); - } - - - /** - * Finds or creates a NameAndTypeConstant constant pool entry with the given - * name and type. - * @return the constant pool index of the NameAndTypeConstant. - */ - public int addNameAndTypeConstant(String name, - String type) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_NameAndType) - { - NameAndTypeConstant nameAndTypeConstant = (NameAndTypeConstant)constant; - if (nameAndTypeConstant.u2nameIndex < constantPoolCount && - nameAndTypeConstant.u2descriptorIndex < constantPoolCount && - nameAndTypeConstant.getName(targetClass).equals(name) && - nameAndTypeConstant.getType(targetClass).equals(type)) - { - return index; - } - } - } - - return addConstant(new NameAndTypeConstant(addUtf8Constant(name), - addUtf8Constant(type))); - } - - - /** - * Finds or creates a Utf8Constant constant pool entry for the given string. - * @return the constant pool index of the Utf8Constant. - */ - public int addUtf8Constant(String string) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Check if the entry already exists. - for (int index = 1; index < constantPoolCount; index++) - { - Constant constant = constantPool[index]; - - if (constant != null && - constant.getTag() == ClassConstants.CONSTANT_Utf8) - { - Utf8Constant utf8Constant = (Utf8Constant)constant; - if (utf8Constant.getString().equals(string)) - { - return index; - } - } - } - - return addConstant(new Utf8Constant(string)); - } - - - /** - * Adds a given constant pool entry to the end of the constant pool. - * @return the constant pool index for the added entry. - */ - public int addConstant(Constant constant) - { - int constantPoolCount = targetClass.u2constantPoolCount; - Constant[] constantPool = targetClass.constantPool; - - // Make sure there is enough space for another constant pool entry. - if (constantPool.length < constantPoolCount+2) - { - Constant[] newConstantPool = new Constant[constantPoolCount+2]; - System.arraycopy(constantPool, 0, - newConstantPool, 0, - constantPoolCount); - - // Assign the newly created constant pool after all entries - // have been copied to avoid race-conditions. - targetClass.constantPool = newConstantPool; - constantPool = targetClass.constantPool; - } - - if (DEBUG) - { - System.out.println("ConstantPoolEditor: ["+(targetClass.u2thisClass > 0 ? targetClass.getName() : "(dummy)")+"] adding ["+constant.getClass().getName()+"] at index "+targetClass.u2constantPoolCount); - } - - // Add the new entry to the end of the constant pool. - constantPool[targetClass.u2constantPoolCount++] = constant; - - // Long constants and double constants take up two entries in the - // constant pool. - int tag = constant.getTag(); - if (tag == ClassConstants.CONSTANT_Long || - tag == ClassConstants.CONSTANT_Double) - { - constantPool[targetClass.u2constantPoolCount++] = null; - } - - // Initialize the class references and class member references in the - // constant, if necessary. - if (constantReferenceInitializer != null) - { - constant.accept(targetClass, constantReferenceInitializer); - } - - return constantPoolCount; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolRemapper.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolRemapper.java deleted file mode 100644 index f794fdaa..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolRemapper.java +++ /dev/null @@ -1,791 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.module.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -import java.util.Arrays; - -/** - * This ClassVisitor remaps all possible references to constant pool entries - * of the classes that it visits, based on a given index map. It is assumed that - * the constant pool entries themselves have already been remapped. - * - * @author Eric Lafortune - */ -public class ConstantPoolRemapper -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor, - AttributeVisitor, - BootstrapMethodInfoVisitor, - InnerClassesInfoVisitor, - ExceptionInfoVisitor, - InstructionVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - RequiresInfoVisitor, - ExportsInfoVisitor, - OpensInfoVisitor, - ProvidesInfoVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(false, true); - - private int[] constantIndexMap; - - - /** - * Sets the given mapping of old constant pool entry indexes to their new - * indexes. - */ - public void setConstantIndexMap(int[] constantIndexMap) - { - this.constantIndexMap = constantIndexMap; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Remap the local constant pool references. - programClass.u2thisClass = remapConstantIndex(programClass.u2thisClass); - programClass.u2superClass = remapConstantIndex(programClass.u2superClass); - - remapConstantIndexArray(programClass.u2interfaces, - programClass.u2interfacesCount); - - // Remap the references of the constant pool entries themselves. - programClass.constantPoolEntriesAccept(this); - - // Remap the references in all fields, methods, and attributes. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - // Nothing to do. - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - // Nothing to do. - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - // Nothing to do. - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - // Nothing to do. - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - // Nothing to do. - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - stringConstant.u2stringIndex = - remapConstantIndex(stringConstant.u2stringIndex); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - // Nothing to do. - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - invokeDynamicConstant.u2nameAndTypeIndex = - remapConstantIndex(invokeDynamicConstant.u2nameAndTypeIndex); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - methodHandleConstant.u2referenceIndex = - remapConstantIndex(methodHandleConstant.u2referenceIndex); - } - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - moduleConstant.u2nameIndex = - remapConstantIndex(moduleConstant.u2nameIndex); - } - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - packageConstant.u2nameIndex = - remapConstantIndex(packageConstant.u2nameIndex); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - fieldrefConstant.u2classIndex = - remapConstantIndex(fieldrefConstant.u2classIndex); - fieldrefConstant.u2nameAndTypeIndex = - remapConstantIndex(fieldrefConstant.u2nameAndTypeIndex); - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - interfaceMethodrefConstant.u2classIndex = - remapConstantIndex(interfaceMethodrefConstant.u2classIndex); - interfaceMethodrefConstant.u2nameAndTypeIndex = - remapConstantIndex(interfaceMethodrefConstant.u2nameAndTypeIndex); - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - methodrefConstant.u2classIndex = - remapConstantIndex(methodrefConstant.u2classIndex); - methodrefConstant.u2nameAndTypeIndex = - remapConstantIndex(methodrefConstant.u2nameAndTypeIndex); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.u2nameIndex = - remapConstantIndex(classConstant.u2nameIndex); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - methodTypeConstant.u2descriptorIndex = - remapConstantIndex(methodTypeConstant.u2descriptorIndex); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - nameAndTypeConstant.u2nameIndex = - remapConstantIndex(nameAndTypeConstant.u2nameIndex); - nameAndTypeConstant.u2descriptorIndex = - remapConstantIndex(nameAndTypeConstant.u2descriptorIndex); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - visitMember(programClass, programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - visitMember(programClass, programMethod); - } - - - private void visitMember(ProgramClass programClass, ProgramMember programMember) - { - // Remap the local constant pool references. - programMember.u2nameIndex = - remapConstantIndex(programMember.u2nameIndex); - programMember.u2descriptorIndex = - remapConstantIndex(programMember.u2descriptorIndex); - - // Remap the constant pool references of the remaining attributes. - programMember.attributesAccept(programClass, this); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - // Library classes are left unchanged. - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - // Library classes are left unchanged. - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - unknownAttribute.u2attributeNameIndex = - remapConstantIndex(unknownAttribute.u2attributeNameIndex); - - // There's not much else we can do with unknown attributes. - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - bootstrapMethodsAttribute.u2attributeNameIndex = - remapConstantIndex(bootstrapMethodsAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the bootstrap method entries. - bootstrapMethodsAttribute.bootstrapMethodEntriesAccept(clazz, this); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - sourceFileAttribute.u2attributeNameIndex = - remapConstantIndex(sourceFileAttribute.u2attributeNameIndex); - sourceFileAttribute.u2sourceFileIndex = - remapConstantIndex(sourceFileAttribute.u2sourceFileIndex); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - sourceDirAttribute.u2attributeNameIndex = - remapConstantIndex(sourceDirAttribute.u2attributeNameIndex); - sourceDirAttribute.u2sourceDirIndex = - remapConstantIndex(sourceDirAttribute.u2sourceDirIndex); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - innerClassesAttribute.u2attributeNameIndex = - remapConstantIndex(innerClassesAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the inner classes. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - enclosingMethodAttribute.u2attributeNameIndex = - remapConstantIndex(enclosingMethodAttribute.u2attributeNameIndex); - enclosingMethodAttribute.u2classIndex = - remapConstantIndex(enclosingMethodAttribute.u2classIndex); - enclosingMethodAttribute.u2nameAndTypeIndex = - remapConstantIndex(enclosingMethodAttribute.u2nameAndTypeIndex); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - moduleAttribute.u2attributeNameIndex = - remapConstantIndex(moduleAttribute.u2attributeNameIndex); - moduleAttribute.u2moduleNameIndex = - remapConstantIndex(moduleAttribute.u2moduleNameIndex); - - if (moduleAttribute.u2moduleVersionIndex != 0) - { - moduleAttribute.u2moduleVersionIndex = - remapConstantIndex(moduleAttribute.u2moduleVersionIndex); - } - moduleAttribute.requiresAccept(clazz, this); - moduleAttribute.exportsAccept(clazz, this); - moduleAttribute.opensAccept(clazz, this); - remapConstantIndexArray(moduleAttribute.u2uses, moduleAttribute.u2usesCount); - moduleAttribute.providesAccept(clazz, this); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - moduleMainClassAttribute.u2attributeNameIndex = - remapConstantIndex(moduleMainClassAttribute.u2attributeNameIndex); - moduleMainClassAttribute.u2mainClass = - remapConstantIndex(moduleMainClassAttribute.u2mainClass); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - modulePackagesAttribute.u2attributeNameIndex = - remapConstantIndex(modulePackagesAttribute.u2attributeNameIndex); - remapConstantIndexArray(modulePackagesAttribute.u2packages, modulePackagesAttribute.u2packagesCount); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - deprecatedAttribute.u2attributeNameIndex = - remapConstantIndex(deprecatedAttribute.u2attributeNameIndex); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - syntheticAttribute.u2attributeNameIndex = - remapConstantIndex(syntheticAttribute.u2attributeNameIndex); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - signatureAttribute.u2attributeNameIndex = - remapConstantIndex(signatureAttribute.u2attributeNameIndex); - signatureAttribute.u2signatureIndex = - remapConstantIndex(signatureAttribute.u2signatureIndex); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - constantValueAttribute.u2attributeNameIndex = - remapConstantIndex(constantValueAttribute.u2attributeNameIndex); - constantValueAttribute.u2constantValueIndex = - remapConstantIndex(constantValueAttribute.u2constantValueIndex); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - methodParametersAttribute.u2attributeNameIndex = - remapConstantIndex(methodParametersAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the parameter information. - methodParametersAttribute.parametersAccept(clazz, method, this); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - exceptionsAttribute.u2attributeNameIndex = - remapConstantIndex(exceptionsAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the exceptions. - remapConstantIndexArray(exceptionsAttribute.u2exceptionIndexTable, - exceptionsAttribute.u2exceptionIndexTableLength); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.u2attributeNameIndex = - remapConstantIndex(codeAttribute.u2attributeNameIndex); - - // Initially, the code attribute editor doesn't contain any changes. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Remap the constant pool references of the instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Apply the code atribute editor. It will only contain any changes if - // the code length is changing at any point. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - - // Remap the constant pool references of the exceptions and attributes. - codeAttribute.exceptionsAccept(clazz, method, this); - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - stackMapAttribute.u2attributeNameIndex = - remapConstantIndex(stackMapAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the stack map frames. - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - stackMapTableAttribute.u2attributeNameIndex = - remapConstantIndex(stackMapTableAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the stack map frames. - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - lineNumberTableAttribute.u2attributeNameIndex = - remapConstantIndex(lineNumberTableAttribute.u2attributeNameIndex); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - localVariableTableAttribute.u2attributeNameIndex = - remapConstantIndex(localVariableTableAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - localVariableTypeTableAttribute.u2attributeNameIndex = - remapConstantIndex(localVariableTypeTableAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the local variables. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - annotationsAttribute.u2attributeNameIndex = - remapConstantIndex(annotationsAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - parameterAnnotationsAttribute.u2attributeNameIndex = - remapConstantIndex(parameterAnnotationsAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - annotationDefaultAttribute.u2attributeNameIndex = - remapConstantIndex(annotationDefaultAttribute.u2attributeNameIndex); - - // Remap the constant pool references of the annotations. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - bootstrapMethodInfo.u2methodHandleIndex = - remapConstantIndex(bootstrapMethodInfo.u2methodHandleIndex); - - // Remap the constant pool references of the bootstrap methods.. - remapConstantIndexArray(bootstrapMethodInfo.u2methodArguments, - bootstrapMethodInfo.u2methodArgumentCount); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - if (innerClassesInfo.u2innerClassIndex != 0) - { - innerClassesInfo.u2innerClassIndex = - remapConstantIndex(innerClassesInfo.u2innerClassIndex); - } - - if (innerClassesInfo.u2outerClassIndex != 0) - { - innerClassesInfo.u2outerClassIndex = - remapConstantIndex(innerClassesInfo.u2outerClassIndex); - } - - if (innerClassesInfo.u2innerNameIndex != 0) - { - innerClassesInfo.u2innerNameIndex = - remapConstantIndex(innerClassesInfo.u2innerNameIndex); - } - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - if (exceptionInfo.u2catchType != 0) - { - exceptionInfo.u2catchType = - remapConstantIndex(exceptionInfo.u2catchType); - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Is the new constant pool index different from the original one? - int newConstantIndex = remapConstantIndex(constantInstruction.constantIndex); - if (newConstantIndex != constantInstruction.constantIndex) - { - // Replace the instruction. - Instruction replacementInstruction = - new ConstantInstruction(constantInstruction.opcode, - newConstantIndex, - constantInstruction.constant); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - } - } - - - // Implementations for StackMapFrameVisitor. - - public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) {} - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - // Remap the constant pool references of the verification types. - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - // Remap the constant pool references of the verification types. - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - // Remap the constant pool references of the verification types. - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) {} - - - public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) - { - objectType.u2classIndex = - remapConstantIndex(objectType.u2classIndex); - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - parameterInfo.u2nameIndex = - remapConstantIndex(parameterInfo.u2nameIndex); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - localVariableInfo.u2nameIndex = - remapConstantIndex(localVariableInfo.u2nameIndex); - localVariableInfo.u2descriptorIndex = - remapConstantIndex(localVariableInfo.u2descriptorIndex); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - localVariableTypeInfo.u2nameIndex = - remapConstantIndex(localVariableTypeInfo.u2nameIndex); - localVariableTypeInfo.u2signatureIndex = - remapConstantIndex(localVariableTypeInfo.u2signatureIndex); - } - - - // Implementations for RequiresInfoVisitor. - - public void visitRequiresInfo(Clazz clazz, RequiresInfo requiresInfo) - { - requiresInfo.u2requiresIndex = - remapConstantIndex(requiresInfo.u2requiresIndex); - requiresInfo.u2requiresVersionIndex = - remapConstantIndex(requiresInfo.u2requiresVersionIndex); - } - - - // Implementations for ExportsInfoVisitor. - - public void visitExportsInfo(Clazz clazz, ExportsInfo exportsInfo) - { - exportsInfo.u2exportsIndex = - remapConstantIndex(exportsInfo.u2exportsIndex); - remapConstantIndexArray(exportsInfo.u2exportsToIndex, exportsInfo.u2exportsToCount); - } - - - // Implementations for OpensInfoVisitor. - - public void visitOpensInfo(Clazz clazz, OpensInfo opensInfo) - { - opensInfo.u2opensIndex = - remapConstantIndex(opensInfo.u2opensIndex); - remapConstantIndexArray(opensInfo.u2opensToIndex, opensInfo.u2opensToCount); - } - - - // Implementations for ProvidesInfoVisitor. - - public void visitProvidesInfo(Clazz clazz, ProvidesInfo providesInfo) - { - providesInfo.u2providesIndex = - remapConstantIndex(providesInfo.u2providesIndex); - remapConstantIndexArray(providesInfo.u2providesWithIndex, providesInfo.u2providesWithCount); - } - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - annotation.u2typeIndex = - remapConstantIndex(annotation.u2typeIndex); - - // Remap the constant pool references of the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - constantElementValue.u2elementNameIndex = - remapConstantIndex(constantElementValue.u2elementNameIndex); - constantElementValue.u2constantValueIndex = - remapConstantIndex(constantElementValue.u2constantValueIndex); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - enumConstantElementValue.u2elementNameIndex = - remapConstantIndex(enumConstantElementValue.u2elementNameIndex); - enumConstantElementValue.u2typeNameIndex = - remapConstantIndex(enumConstantElementValue.u2typeNameIndex); - enumConstantElementValue.u2constantNameIndex = - remapConstantIndex(enumConstantElementValue.u2constantNameIndex); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - classElementValue.u2elementNameIndex = - remapConstantIndex(classElementValue.u2elementNameIndex); - classElementValue.u2classInfoIndex = - remapConstantIndex(classElementValue.u2classInfoIndex); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - annotationElementValue.u2elementNameIndex = - remapConstantIndex(annotationElementValue.u2elementNameIndex); - - // Remap the constant pool references of the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - arrayElementValue.u2elementNameIndex = - remapConstantIndex(arrayElementValue.u2elementNameIndex); - - // Remap the constant pool references of the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - /** - * Remaps all constant pool indices in the given array. - */ - private void remapConstantIndexArray(int[] array, int length) - { - for (int index = 0; index < length; index++) - { - array[index] = remapConstantIndex(array[index]); - } - } - - // Small utility methods. - - - /** - * Returns the new constant pool index of the entry at the - * given index. - */ - private int remapConstantIndex(int constantIndex) - { - int remappedConstantIndex = constantIndexMap[constantIndex]; - if (remappedConstantIndex < 0) - { - throw new IllegalArgumentException("Can't remap constant index ["+constantIndex+"]"); - } - - return remappedConstantIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolShrinker.java deleted file mode 100644 index 9bad8e7f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolShrinker.java +++ /dev/null @@ -1,720 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.module.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -import java.util.Arrays; - -/** - * This ClassVisitor removes all unused entries from the constant pool. - * - * @author Eric Lafortune - */ -public class ConstantPoolShrinker -extends SimplifiedVisitor -implements ClassVisitor, - - // Implementation interfaces. - MemberVisitor, - ConstantVisitor, - AttributeVisitor, - BootstrapMethodInfoVisitor, - InnerClassesInfoVisitor, - ExceptionInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - RequiresInfoVisitor, - ExportsInfoVisitor, - OpensInfoVisitor, - ProvidesInfoVisitor, - AnnotationVisitor, - ElementValueVisitor, - InstructionVisitor -{ - // A visitor info flag to indicate that the constant is being used. - // Don't make a static instance, so we don't need to clear any old flags. - private final Object USED = new Object(); - - private int[] constantIndexMap = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Mark this class's name. - markConstant(programClass, programClass.u2thisClass); - - // Mark the superclass class constant. - programClass.superClassConstantAccept(this); - - // Mark the interface class constants. - programClass.interfaceConstantsAccept(this); - - // Mark the constants referenced by the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Mark the attributes. - programClass.attributesAccept(this); - - // Shift the used constant pool entries together, filling out the - // index map. - int newConstantPoolCount = - shrinkConstantPool(programClass.constantPool, - programClass.u2constantPoolCount); - - // Remap the references to the constant pool if it has shrunk. - if (newConstantPoolCount < programClass.u2constantPoolCount) - { - programClass.u2constantPoolCount = newConstantPoolCount; - - // Remap all constant pool references. - constantPoolRemapper.setConstantIndexMap(constantIndexMap); - constantPoolRemapper.visitProgramClass(programClass); - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Mark the name and descriptor. - markConstant(programClass, programMember.u2nameIndex); - markConstant(programClass, programMember.u2descriptorIndex); - - // Mark the attributes. - programMember.attributesAccept(programClass, this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - markAsUsed(constant); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - markAsUsed(stringConstant); - - markConstant(clazz, stringConstant.u2stringIndex); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - markAsUsed(invokeDynamicConstant); - - markConstant(clazz, invokeDynamicConstant.u2nameAndTypeIndex); - - // Mark the bootstrap methods attribute. - clazz.attributesAccept(this); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - markAsUsed(methodHandleConstant); - - markConstant(clazz, methodHandleConstant.u2referenceIndex); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - markAsUsed(refConstant); - - markConstant(clazz, refConstant.u2classIndex); - markConstant(clazz, refConstant.u2nameAndTypeIndex); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - markAsUsed(classConstant); - - markConstant(clazz, classConstant.u2nameIndex); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - markAsUsed(methodTypeConstant); - - markConstant(clazz, methodTypeConstant.u2descriptorIndex); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - markAsUsed(nameAndTypeConstant); - - markConstant(clazz, nameAndTypeConstant.u2nameIndex); - markConstant(clazz, nameAndTypeConstant.u2descriptorIndex); - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - markAsUsed(moduleConstant); - - markConstant(clazz, moduleConstant.u2nameIndex); - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - markAsUsed(packageConstant); - - markConstant(clazz, packageConstant.u2nameIndex); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - markConstant(clazz, attribute.u2attributeNameIndex); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - markConstant(clazz, bootstrapMethodsAttribute.u2attributeNameIndex); - - // Mark the bootstrap method entries. - bootstrapMethodsAttribute.bootstrapMethodEntriesAccept(clazz, this); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - markConstant(clazz, sourceFileAttribute.u2attributeNameIndex); - markConstant(clazz, sourceFileAttribute.u2sourceFileIndex); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - markConstant(clazz, sourceDirAttribute.u2attributeNameIndex); - markConstant(clazz, sourceDirAttribute.u2sourceDirIndex); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - markConstant(clazz, innerClassesAttribute.u2attributeNameIndex); - - // Mark the outer class entries. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - markConstant(clazz, enclosingMethodAttribute.u2attributeNameIndex); - markConstant(clazz, enclosingMethodAttribute.u2classIndex); - - if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) - { - markConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex); - } - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - markConstant(clazz, moduleAttribute.u2attributeNameIndex); - markConstant(clazz, moduleAttribute.u2moduleNameIndex); - - if (moduleAttribute.u2moduleVersionIndex != 0) - { - markConstant(clazz, moduleAttribute.u2moduleVersionIndex); - } - moduleAttribute.requiresAccept(clazz, this); - moduleAttribute.exportsAccept(clazz, this); - moduleAttribute.opensAccept(clazz, this); - - for (int index = 0; index < moduleAttribute.u2usesCount; index++) - { - markConstant(clazz, moduleAttribute.u2uses[index]); - } - - moduleAttribute.providesAccept(clazz, this); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - markConstant(clazz, moduleMainClassAttribute.u2attributeNameIndex); - markConstant(clazz, moduleMainClassAttribute.u2mainClass); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - markConstant(clazz, modulePackagesAttribute.u2attributeNameIndex); - - for (int index = 0; index < modulePackagesAttribute.u2packagesCount; index++) - { - markConstant(clazz, modulePackagesAttribute.u2packages[index]); - } - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - markConstant(clazz, signatureAttribute.u2attributeNameIndex); - markConstant(clazz, signatureAttribute.u2signatureIndex); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - markConstant(clazz, constantValueAttribute.u2attributeNameIndex); - markConstant(clazz, constantValueAttribute.u2constantValueIndex); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - markConstant(clazz, methodParametersAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the parameter information. - methodParametersAttribute.parametersAccept(clazz, method, this); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - markConstant(clazz, exceptionsAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the exceptions. - exceptionsAttribute.exceptionEntriesAccept((ProgramClass)clazz, this); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - markConstant(clazz, codeAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the instructions, - // by the exceptions, and by the attributes. - codeAttribute.instructionsAccept(clazz, method, this); - codeAttribute.exceptionsAccept(clazz, method, this); - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - markConstant(clazz, stackMapAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the stack map frames. - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - markConstant(clazz, stackMapTableAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the stack map frames. - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - markConstant(clazz, localVariableTableAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - markConstant(clazz, localVariableTypeTableAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the local variable types. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - markConstant(clazz, annotationsAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - markConstant(clazz, parameterAnnotationsAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - markConstant(clazz, annotationDefaultAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the element value. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - markConstant(clazz, bootstrapMethodInfo.u2methodHandleIndex); - - // Mark the constant pool entries referenced by the arguments. - bootstrapMethodInfo.methodArgumentsAccept(clazz, this); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - innerClassesInfo.innerClassConstantAccept(clazz, this); - innerClassesInfo.outerClassConstantAccept(clazz, this); - innerClassesInfo.innerNameConstantAccept(clazz, this); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - if (exceptionInfo.u2catchType != 0) - { - markConstant(clazz, exceptionInfo.u2catchType); - } - } - - - // Implementations for StackMapFrameVisitor. - - public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) {} - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - // Mark the constant pool entries referenced by the verification types. - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - // Mark the constant pool entries referenced by the verification types. - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - // Mark the constant pool entries referenced by the verification types. - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) {} - - - public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) - { - markConstant(clazz, objectType.u2classIndex); - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - if (parameterInfo.u2nameIndex != 0) - { - markConstant(clazz, parameterInfo.u2nameIndex); - } - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - markConstant(clazz, localVariableInfo.u2nameIndex); - markConstant(clazz, localVariableInfo.u2descriptorIndex); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - markConstant(clazz, localVariableTypeInfo.u2nameIndex); - markConstant(clazz, localVariableTypeInfo.u2signatureIndex); - } - - - // Implementations for RequiresInfoVisitor. - - public void visitRequiresInfo(Clazz clazz, RequiresInfo requiresInfo) - { - markConstant(clazz, requiresInfo.u2requiresIndex); - markConstant(clazz, requiresInfo.u2requiresVersionIndex); - } - - - // Implementations for ExportsInfoVisitor. - - public void visitExportsInfo(Clazz clazz, ExportsInfo exportsInfo) - { - markConstant(clazz, exportsInfo.u2exportsIndex); - - for (int index = 0; index < exportsInfo.u2exportsToCount; index++) - { - markConstant(clazz, exportsInfo.u2exportsToIndex[index]); - } - } - - - // Implementations for OpensInfoVisitor. - - public void visitOpensInfo(Clazz clazz, OpensInfo opensInfo) - { - markConstant(clazz, opensInfo.u2opensIndex); - - for (int index = 0; index < opensInfo.u2opensToCount; index++) - { - markConstant(clazz, opensInfo.u2opensToIndex[index]); - } - } - - - // Implementations for ProvidesInfoVisitor. - - public void visitProvidesInfo(Clazz clazz, ProvidesInfo providesInfo) - { - markConstant(clazz, providesInfo.u2providesIndex); - - for (int index = 0; index < providesInfo.u2providesWithCount; index++) - { - markConstant(clazz, providesInfo.u2providesWithIndex[index]); - } - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - markConstant(clazz, annotation.u2typeIndex); - - // Mark the constant pool entries referenced by the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - if (constantElementValue.u2elementNameIndex != 0) - { - markConstant(clazz, constantElementValue.u2elementNameIndex); - } - - markConstant(clazz, constantElementValue.u2constantValueIndex); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - if (enumConstantElementValue.u2elementNameIndex != 0) - { - markConstant(clazz, enumConstantElementValue.u2elementNameIndex); - } - - markConstant(clazz, enumConstantElementValue.u2typeNameIndex); - markConstant(clazz, enumConstantElementValue.u2constantNameIndex); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - if (classElementValue.u2elementNameIndex != 0) - { - markConstant(clazz, classElementValue.u2elementNameIndex); - } - - markConstant(clazz, classElementValue.u2classInfoIndex); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - if (annotationElementValue.u2elementNameIndex != 0) - { - markConstant(clazz, annotationElementValue.u2elementNameIndex); - } - - // Mark the constant pool entries referenced by the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - if (arrayElementValue.u2elementNameIndex != 0) - { - markConstant(clazz, arrayElementValue.u2elementNameIndex); - } - - // Mark the constant pool entries referenced by the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - markConstant(clazz, constantInstruction.constantIndex); - } - - - // Small utility methods. - - /** - * Marks the given constant pool entry of the given class. This includes - * visiting any referenced objects. - */ - private void markConstant(Clazz clazz, int index) - { - clazz.constantPoolEntryAccept(index, this); - } - - - /** - * Marks the given visitor accepter as being used. - */ - private void markAsUsed(Constant constant) - { - constant.setVisitorInfo(USED); - } - - - /** - * Returns whether the given visitor accepter has been marked as being used. - */ - private boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } - - - /** - * Removes all constants that are not marked as being used from the given - * constant pool. - * @return the new number of entries. - */ - private int shrinkConstantPool(Constant[] constantPool, int length) - { - // Create a new index map, if necessary. - if (constantIndexMap.length < length) - { - constantIndexMap = new int[length]; - } - - int counter = 1; - boolean isUsed = false; - - // Shift the used constant pool entries together. - for (int index = 1; index < length; index++) - { - Constant constant = constantPool[index]; - - // Is the constant being used? Don't update the flag if this is the - // second half of a long entry. - if (constant != null) - { - isUsed = isUsed(constant); - } - - if (isUsed) - { - // Remember the new index. - constantIndexMap[index] = counter; - - // Shift the constant pool entry. - constantPool[counter++] = constant; - } - else - { - // Remember an invalid index. - constantIndexMap[index] = -1; - } - } - - // Clear the remaining constant pool elements. - Arrays.fill(constantPool, counter, length, null); - - return counter; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolSorter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolSorter.java deleted file mode 100644 index ea2f4e19..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ConstantPoolSorter.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.Arrays; - -/** - * This ClassVisitor sorts the constant pool entries of the program classes - * that it visits. The sorting order is based on the types of the constant pool - * entries in the first place, and on their contents in the second place. - * - * @author Eric Lafortune - */ -public class ConstantPoolSorter -extends SimplifiedVisitor -implements ClassVisitor -{ - private int[] constantIndexMap = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - private ComparableConstant[] comparableConstantPool = new ComparableConstant[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - private Constant[] newConstantPool = new Constant[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - - private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - int constantPoolCount = programClass.u2constantPoolCount; - - // Sort the constant pool and set up an index map. - if (constantIndexMap.length < constantPoolCount) - { - constantIndexMap = new int[constantPoolCount]; - comparableConstantPool = new ComparableConstant[constantPoolCount]; - newConstantPool = new Constant[constantPoolCount]; - } - - // Initialize an array whose elements can be compared. - int sortLength = 0; - for (int oldIndex = 1; oldIndex < constantPoolCount; oldIndex++) - { - Constant constant = programClass.constantPool[oldIndex]; - if (constant != null) - { - comparableConstantPool[sortLength++] = - new ComparableConstant(programClass, oldIndex, constant); - } - } - - // Sort the array. - Arrays.sort(comparableConstantPool, 0, sortLength); - - // Save the sorted elements. - int newLength = 1; - int newIndex = 1; - ComparableConstant previousComparableConstant = null; - for (int sortIndex = 0; sortIndex < sortLength; sortIndex++) - { - ComparableConstant comparableConstant = comparableConstantPool[sortIndex]; - - // Isn't this a duplicate of the previous constant? - if (!comparableConstant.equals(previousComparableConstant)) - { - // Remember the index of the new entry. - newIndex = newLength; - - // Copy the sorted constant pool entry over to the constant pool. - Constant constant = comparableConstant.getConstant(); - - newConstantPool[newLength++] = constant; - - // Long entries take up two slots, the second of which is null. - int tag = constant.getTag(); - if (tag == ClassConstants.CONSTANT_Long || - tag == ClassConstants.CONSTANT_Double) - { - newConstantPool[newLength++] = null; - } - - previousComparableConstant = comparableConstant; - } - - // Fill out the map array. - constantIndexMap[comparableConstant.getIndex()] = newIndex; - } - - // Copy the new constant pool over. - System.arraycopy(newConstantPool, 0, programClass.constantPool, 0, newLength); - - // Clear any remaining entries. - Arrays.fill(programClass.constantPool, newLength, constantPoolCount, null); - - programClass.u2constantPoolCount = newLength; - - // Remap all constant pool references. - constantPoolRemapper.setConstantIndexMap(constantIndexMap); - constantPoolRemapper.visitProgramClass(programClass); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ElementValueAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ElementValueAdder.java deleted file mode 100644 index 54d2a849..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ElementValueAdder.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; - -/** - * This AnnotationVisitor adds all element values that it visits to the given - * target annotation default attribute, annotation, or element value. - * - * @author Eric Lafortune - */ -public class ElementValueAdder -implements ElementValueVisitor -{ - private static final ElementValue[] EMPTY_ELEMENT_VALUES = new ElementValue[0]; - - - private final ProgramClass targetClass; - private final AnnotationDefaultAttribute targetAnnotationDefaultAttribute; - - private final ConstantAdder constantAdder; - private final ElementValuesEditor elementValuesEditor; - - - /** - * Creates a new ElementValueAdder that will copy element values into the - * given target annotation default attribute value. - */ - public ElementValueAdder(ProgramClass targetClass, - AnnotationDefaultAttribute targetAnnotationDefaultAttribute, - boolean replaceElementValues) - { - this.targetClass = targetClass; - this.targetAnnotationDefaultAttribute = targetAnnotationDefaultAttribute; - - constantAdder = new ConstantAdder(targetClass); - elementValuesEditor = null; - } - - - /** - * Creates a new ElementValueAdder that will copy element values into the - * given target annotation. - */ - public ElementValueAdder(ProgramClass targetClass, - Annotation targetAnnotation, - boolean replaceElementValues) - { - this.targetClass = targetClass; - this.targetAnnotationDefaultAttribute = null; - - constantAdder = new ConstantAdder(targetClass); - elementValuesEditor = new ElementValuesEditor(targetClass, - targetAnnotation, - replaceElementValues); - } - - - /** - * Creates a new ElementValueAdder that will copy element values into the - * given target element value. - */ - public ElementValueAdder(ProgramClass targetClass, - ArrayElementValue targetArrayElementValue, - boolean replaceElementValues) - { - this.targetClass = targetClass; - this.targetAnnotationDefaultAttribute = null; - - constantAdder = new ConstantAdder(targetClass); - elementValuesEditor = new ElementValuesEditor(targetClass, - targetArrayElementValue, - replaceElementValues); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - // Create a copy of the element value. - ConstantElementValue newConstantElementValue = - new ConstantElementValue(constantElementValue.u1tag, - constantElementValue.u2elementNameIndex == 0 ? 0 : - constantAdder.addConstant(clazz, constantElementValue.u2elementNameIndex), - constantAdder.addConstant(clazz, constantElementValue.u2constantValueIndex)); - - newConstantElementValue.referencedClass = constantElementValue.referencedClass; - newConstantElementValue.referencedMethod = constantElementValue.referencedMethod; - - // Add it to the target. - addElementValue(newConstantElementValue); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - // Create a copy of the element value. - EnumConstantElementValue newEnumConstantElementValue = - new EnumConstantElementValue(enumConstantElementValue.u2elementNameIndex == 0 ? 0 : - constantAdder.addConstant(clazz, enumConstantElementValue.u2elementNameIndex), - constantAdder.addConstant(clazz, enumConstantElementValue.u2typeNameIndex), - constantAdder.addConstant(clazz, enumConstantElementValue.u2constantNameIndex)); - - newEnumConstantElementValue.referencedClass = enumConstantElementValue.referencedClass; - newEnumConstantElementValue.referencedMethod = enumConstantElementValue.referencedMethod; - - // TODO: Clone array. - newEnumConstantElementValue.referencedClasses = enumConstantElementValue.referencedClasses; - - // Add it to the target. - addElementValue(newEnumConstantElementValue); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - // Create a copy of the element value. - ClassElementValue newClassElementValue = - new ClassElementValue(classElementValue.u2elementNameIndex == 0 ? 0 : - constantAdder.addConstant(clazz, classElementValue.u2elementNameIndex), - constantAdder.addConstant(clazz, classElementValue.u2classInfoIndex)); - - newClassElementValue.referencedClass = classElementValue.referencedClass; - newClassElementValue.referencedMethod = classElementValue.referencedMethod; - - // TODO: Clone array. - newClassElementValue.referencedClasses = classElementValue.referencedClasses; - - // Add it to the target. - addElementValue(newClassElementValue); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - // Create a copy of the element value. - AnnotationElementValue newAnnotationElementValue = - new AnnotationElementValue(annotationElementValue.u2elementNameIndex == 0 ? 0 : - constantAdder.addConstant(clazz, annotationElementValue.u2elementNameIndex), - new Annotation()); - - newAnnotationElementValue.referencedClass = annotationElementValue.referencedClass; - newAnnotationElementValue.referencedMethod = annotationElementValue.referencedMethod; - - annotationElementValue.annotationAccept(clazz, - new AnnotationAdder(targetClass, - newAnnotationElementValue)); - - // Add it to the target. - addElementValue(newAnnotationElementValue); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - // Create a copy of the element value. - ArrayElementValue newArrayElementValue = - new ArrayElementValue(arrayElementValue.u2elementNameIndex == 0 ? 0 : - constantAdder.addConstant(clazz, arrayElementValue.u2elementNameIndex), - 0, - arrayElementValue.u2elementValuesCount > 0 ? - new ElementValue[arrayElementValue.u2elementValuesCount] : - EMPTY_ELEMENT_VALUES); - - newArrayElementValue.referencedClass = arrayElementValue.referencedClass; - newArrayElementValue.referencedMethod = arrayElementValue.referencedMethod; - - arrayElementValue.elementValuesAccept(clazz, - annotation, - new ElementValueAdder(targetClass, - newArrayElementValue, - false)); - - // Add it to the target. - addElementValue(newArrayElementValue); - } - - - // Small utility methods. - - private void addElementValue(ElementValue newElementValue) - { - // What's the target? - if (targetAnnotationDefaultAttribute != null) - { - // Simply set the completed element value. - targetAnnotationDefaultAttribute.defaultValue = newElementValue; - } - else - { - // Add it to the target. - elementValuesEditor.addElementValue(newElementValue); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ElementValuesEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ElementValuesEditor.java deleted file mode 100644 index 69c1d89f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ElementValuesEditor.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.ProgramClass; -import proguard.classfile.attribute.annotation.*; - -/** - * This class can add and delete element values to and from a given target - * annotation default attribute, annotation, or array element value. Element - * values to be added must be filled out beforehand, including their references - * to the constant pool. - * - * @author Eric Lafortune - */ -public class ElementValuesEditor -{ - private final ProgramClass targetClass; - private final Annotation targetAnnotation; - private final ArrayElementValue targetArrayElementValue; - private final boolean replaceElementValues; - - - /** - * Creates a new ElementValuesEditor that will edit element values in the - * given target annotation. - */ - public ElementValuesEditor(ProgramClass targetClass, - Annotation targetAnnotation, - boolean replaceElementValues) - { - this.targetClass = targetClass; - this.targetAnnotation = targetAnnotation; - this.targetArrayElementValue = null; - this.replaceElementValues = replaceElementValues; - } - - - /** - * Creates a new ElementValuesEditor that will edit element values in the - * given target array element value. - */ - public ElementValuesEditor(ProgramClass targetClass, - ArrayElementValue targetArrayElementValue, - boolean replaceElementValues) - { - this.targetClass = targetClass; - this.targetAnnotation = null; - this.targetArrayElementValue = targetArrayElementValue; - this.replaceElementValues = replaceElementValues; - } - - - /** - * Adds the given elementValue to the target. - */ - public void addElementValue(ElementValue elementValue) - { - // What's the target? - if (targetAnnotation != null) - { - // Try to replace an existing element value. - if (!replaceElementValues || - !replaceElementValue(targetAnnotation.u2elementValuesCount, - targetAnnotation.elementValues, - elementValue)) - { - // Otherwise append the element value. - targetAnnotation.elementValues = - addElementValue(targetAnnotation.u2elementValuesCount, - targetAnnotation.elementValues, - elementValue); - - targetAnnotation.u2elementValuesCount++; - } - } - else - { - // Try to replace an existing element value. - if (!replaceElementValues || - !replaceElementValue(targetArrayElementValue.u2elementValuesCount, - targetArrayElementValue.elementValues, - elementValue)) - { - // Otherwise append the element value. - targetArrayElementValue.elementValues = - addElementValue(targetArrayElementValue.u2elementValuesCount, - targetArrayElementValue.elementValues, - elementValue); - - targetArrayElementValue.u2elementValuesCount++; - } - } - } - - - /** - * Deletes the given elementValue to the target. - */ - public void deleteElementValue(String elementValueMethodName) - { - // What's the target? - if (targetAnnotation != null) - { - // Delete the element value to the target annotation. - targetAnnotation.u2elementValuesCount = - deleteElementValue(targetAnnotation.u2elementValuesCount, - targetAnnotation.elementValues, - elementValueMethodName); - } - else - { - // Delete the element value to the target array element value. - targetArrayElementValue.u2elementValuesCount = - deleteElementValue(targetArrayElementValue.u2elementValuesCount, - targetArrayElementValue.elementValues, - elementValueMethodName); - } - } - - - // Small utility methods. - - /** - * Tries put the given element value in place of an existing element value - * of the same name, returning whether it was present. - */ - private boolean replaceElementValue(int elementValuesCount, - ElementValue[] elementValues, - ElementValue elementValue) - { - // Find the element value with the same name. - int index = findElementValue(elementValuesCount, - elementValues, - elementValue.getMethodName(targetClass)); - if (index < 0) - { - return false; - } - - elementValues[index] = elementValue; - - return true; - } - - - /** - * Appends the given element value to the given array of element values, - * creating a new array if necessary. - */ - private ElementValue[] addElementValue(int elementValuesCount, - ElementValue[] elementValues, - ElementValue elementValue) - { - // Is the array too small to contain the additional elementValue? - if (elementValues.length <= elementValuesCount) - { - // Create a new array and copy the elementValues into it. - ElementValue[] newElementValues = new ElementValue[elementValuesCount + 1]; - System.arraycopy(elementValues, 0, - newElementValues, 0, - elementValuesCount); - elementValues = newElementValues; - } - - // Append the elementValue. - elementValues[elementValuesCount] = elementValue; - - return elementValues; - } - - - /** - * Deletes the element values with the given name from the given array of - * element values, returning the new number of element values. - */ - private int deleteElementValue(int elementValuesCount, - ElementValue[] elementValues, - String elementValueMethodName) - { - // Find the element value. - int index = findElementValue(elementValuesCount, - elementValues, - elementValueMethodName); - if (index < 0) - { - return elementValuesCount; - } - - // Shift the other element values in the array. - System.arraycopy(elementValues, index + 1, - elementValues, index, - elementValuesCount - index - 1); - - // Clear the last entry in the array. - elementValues[--elementValuesCount] = null; - - return elementValuesCount; - } - - - /** - * Finds the index of the element value with the given name in the given - * array of element values. - */ - private int findElementValue(int elementValuesCount, - ElementValue[] elementValues, - String elementValueName) - { - for (int index = 0; index < elementValuesCount; index++) - { - if (elementValues[index].getMethodName(targetClass).equals(elementValueName)) - { - return index; - } - } - - return -1; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionAdder.java deleted file mode 100644 index af08c68c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionAdder.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.ExceptionsAttribute; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor adds all class constants that it visits to the given - * target exceptions attribute. - * - * @author Eric Lafortune - */ -public class ExceptionAdder -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final ConstantAdder constantAdder; - private final ExceptionsAttributeEditor exceptionsAttributeEditor; - - - /** - * Creates a new ExceptionAdder that will copy classes into the given - * target exceptions attribute. - */ - public ExceptionAdder(ProgramClass targetClass, - ExceptionsAttribute targetExceptionsAttribute) - { - constantAdder = new ConstantAdder(targetClass); - exceptionsAttributeEditor = new ExceptionsAttributeEditor(targetExceptionsAttribute); - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Add a class constant to the constant pool. - constantAdder.visitClassConstant(clazz, classConstant); - - // Add the index of the class constant to the list of exceptions. - exceptionsAttributeEditor.addException(constantAdder.getConstantIndex()); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionInfoAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionInfoAdder.java deleted file mode 100644 index e51efe48..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionInfoAdder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ExceptionInfoVisitor; - -/** - * This ExceptionInfoVisitor adds all exception information that it visits to - * the given target code attribute. - * - * @author Eric Lafortune - */ -public class ExceptionInfoAdder -implements ExceptionInfoVisitor -{ - private final ConstantAdder constantAdder; - private final CodeAttributeComposer codeAttributeComposer; - - - /** - * Creates a new ExceptionAdder that will copy exceptions into the given - * target code attribute. - */ - public ExceptionInfoAdder(ProgramClass targetClass, - CodeAttributeComposer targetComposer) - { - constantAdder = new ConstantAdder(targetClass); - codeAttributeComposer = targetComposer; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - // Create a copy of the exception info. - ExceptionInfo newExceptionInfo = - new ExceptionInfo(exceptionInfo.u2startPC, - exceptionInfo.u2endPC, - exceptionInfo.u2handlerPC, - exceptionInfo.u2catchType == 0 ? 0 : - constantAdder.addConstant(clazz, exceptionInfo.u2catchType)); - - // Add the completed exception info. - codeAttributeComposer.appendException(newExceptionInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionInfoEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionInfoEditor.java deleted file mode 100644 index 8fd1a635..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionInfoEditor.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.*; -import proguard.util.ArrayUtil; - -/** - * This class can add exceptions to the exception table of a given code - * attribute. The exceptions must have been filled out beforehand. - * - * @author Eric Lafortune - */ -public class ExceptionInfoEditor -{ - private final CodeAttribute codeAttribute; - - - /** - * Creates a new ExceptionInfoEditor that can add exceptions to the - * given code attribute. - */ - public ExceptionInfoEditor(CodeAttribute codeAttribute) - { - this.codeAttribute = codeAttribute; - } - - - /** - * Prepends the given exception to the exception table. - */ - void prependException(ExceptionInfo exceptionInfo) - { - ExceptionInfo[] exceptionTable = codeAttribute.exceptionTable; - int exceptionTableLength = codeAttribute.u2exceptionTableLength; - - int newExceptionTableLength = exceptionTableLength + 1; - - // Is the exception table large enough? - if (exceptionTable.length < newExceptionTableLength) - { - ExceptionInfo[] newExceptionTable = - new ExceptionInfo[newExceptionTableLength]; - - System.arraycopy(exceptionTable, 0, - newExceptionTable, 1, - exceptionTableLength); - newExceptionTable[0] = exceptionInfo; - - codeAttribute.exceptionTable = newExceptionTable; - } - else - { - System.arraycopy(exceptionTable, 0, - exceptionTable, 1, - exceptionTableLength); - exceptionTable[0] = exceptionInfo; - } - - codeAttribute.u2exceptionTableLength = newExceptionTableLength; - } - - - /** - * Appends the given exception to the exception table. - */ - void appendException(ExceptionInfo exceptionInfo) - { - codeAttribute.exceptionTable = - ArrayUtil.add(codeAttribute.exceptionTable, - codeAttribute.u2exceptionTableLength++, - exceptionInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionsAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionsAttributeEditor.java deleted file mode 100644 index 5c3a49ea..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ExceptionsAttributeEditor.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.ExceptionsAttribute; - -/** - * This class can add exceptions to a given exceptions attribute. - * Exceptions to be added must have been added to the constant pool and filled - * out beforehand. - * - * @author Eric Lafortune - */ -public class ExceptionsAttributeEditor -{ - private ExceptionsAttribute targetExceptionsAttribute; - - - /** - * Creates a new ExceptionsAttributeEditor that will edit exceptions in the - * given exceptions attribute. - */ - public ExceptionsAttributeEditor(ExceptionsAttribute targetExceptionsAttribute) - { - this.targetExceptionsAttribute = targetExceptionsAttribute; - } - - - /** - * Adds a given exception to the exceptions attribute. - */ - public void addException(int exceptionIndex) - { - int exceptionIndexTableLength = targetExceptionsAttribute.u2exceptionIndexTableLength; - int[] exceptionIndexTable = targetExceptionsAttribute.u2exceptionIndexTable; - - // Make sure there is enough space for the new exception. - if (exceptionIndexTable.length <= exceptionIndexTableLength) - { - targetExceptionsAttribute.u2exceptionIndexTable = new int[exceptionIndexTableLength+1]; - System.arraycopy(exceptionIndexTable, 0, - targetExceptionsAttribute.u2exceptionIndexTable, 0, - exceptionIndexTableLength); - exceptionIndexTable = targetExceptionsAttribute.u2exceptionIndexTable; - } - - // Add the exception. - exceptionIndexTable[targetExceptionsAttribute.u2exceptionIndexTableLength++] = exceptionIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InnerClassesAccessFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InnerClassesAccessFixer.java deleted file mode 100644 index e520bc71..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InnerClassesAccessFixer.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.InnerClassesInfo; -import proguard.classfile.attribute.visitor.InnerClassesInfoVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This InnerClassesInfoVisitor fixes the inner class access flags of the - * inner classes information that it visits. - * - * @author Eric Lafortune - */ -public class InnerClassesAccessFixer -extends SimplifiedVisitor -implements InnerClassesInfoVisitor, - ConstantVisitor, - ClassVisitor -{ - private int innerClassAccessFlags; - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - // The current access flags are the default. - innerClassAccessFlags = innerClassesInfo.u2innerClassAccessFlags; - - // See if we can find new access flags. - innerClassesInfo.innerClassConstantAccept(clazz, this); - - // Update the access flags. - innerClassesInfo.u2innerClassAccessFlags = innerClassAccessFlags; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.referencedClassAccept(this); - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - innerClassAccessFlags = - AccessUtil.replaceAccessFlags(innerClassAccessFlags, - programClass.u2accessFlags); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InnerClassesAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InnerClassesAttributeEditor.java deleted file mode 100644 index e26d3ac3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InnerClassesAttributeEditor.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.*; -import proguard.util.ArrayUtil; - -/** - * This class can add/remove bootstrap methods to/from a given inner classes - * attribute. Inner classes to be added must have been filled out beforehand. - * - * @author Thomas Neidhart - */ -public class InnerClassesAttributeEditor -{ - private InnerClassesAttribute targetInnerClassesAttribute; - - - /** - * Creates a new InnerClassesAttributeEditor that will edit inner - * classes in the given inner classes attribute. - */ - public InnerClassesAttributeEditor(InnerClassesAttribute targetInnerClassesAttribute) - { - this.targetInnerClassesAttribute = targetInnerClassesAttribute; - } - - - /** - * Adds a given inner class to the inner classes attribute. - * @return the index of the inner class. - */ - public int addInnerClassesInfo(InnerClassesInfo innerClassesInfo) - { - targetInnerClassesAttribute.classes = - ArrayUtil.add(targetInnerClassesAttribute.classes, - targetInnerClassesAttribute.u2classesCount, - innerClassesInfo); - - return targetInnerClassesAttribute.u2classesCount++; - } - - - /** - * Removes the given inner class from the inner classes attribute. - */ - public void removeInnerClassesInfo(InnerClassesInfo innerClassesInfo) - { - ArrayUtil.remove(targetInnerClassesAttribute.classes, - targetInnerClassesAttribute.u2classesCount--, - findInnerClassesInfoIndex(innerClassesInfo)); - } - - - /** - * Finds the index of the given bootstrap method info in the target attribute. - */ - private int findInnerClassesInfoIndex(InnerClassesInfo innerClassesInfo) - { - int innerClassesCount = targetInnerClassesAttribute.u2classesCount; - InnerClassesInfo[] innerClassesInfos = targetInnerClassesAttribute.classes; - - for (int index = 0; index < innerClassesCount; index++) - { - if (innerClassesInfos[index].equals(innerClassesInfo)) - { - return index; - } - } - - return innerClassesCount; - } - -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionAdder.java deleted file mode 100644 index e059379d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionAdder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor adds all instructions that it visits to the given - * target code attribute. - * - * @author Eric Lafortune - */ -public class InstructionAdder -extends SimplifiedVisitor -implements InstructionVisitor -{ - private final ConstantAdder constantAdder; - private final CodeAttributeComposer codeAttributeComposer; - - - /** - * Creates a new InstructionAdder that will copy classes into the given - * target code attribute. - */ - public InstructionAdder(ProgramClass targetClass, - CodeAttributeComposer targetComposer) - { - constantAdder = new ConstantAdder(targetClass); - codeAttributeComposer = targetComposer; - } - - - // Implementations for InstructionVisitor. - - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Add the instruction. - codeAttributeComposer.appendInstruction(offset, instruction); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Create a copy of the instruction. - Instruction newConstantInstruction = - new ConstantInstruction(constantInstruction.opcode, - constantAdder.addConstant(clazz, constantInstruction.constantIndex), - constantInstruction.constant); - - // Add the instruction. - codeAttributeComposer.appendInstruction(offset, newConstantInstruction); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionSequenceBuilder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionSequenceBuilder.java deleted file mode 100644 index 17be6a0b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionSequenceBuilder.java +++ /dev/null @@ -1,1981 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.instruction.*; -import proguard.classfile.util.ClassUtil; -import proguard.optimize.peephole.InstructionSequenceReplacer; - -import java.util.*; - -/** - * This utility class allows to construct sequences of instructions and - * their constants. - * - * @author Eric Lafortune - */ -public class InstructionSequenceBuilder -{ - private final ConstantPoolEditor constantPoolEditor; - - private final List instructions = new ArrayList(256); - - - /** - * Creates a new InstructionSequenceBuilder. - */ - public InstructionSequenceBuilder() - { - this(null, null); - } - - - /** - * Creates a new InstructionSequenceBuilder that automatically initializes - * class references and class member references in new constants. - * @param programClassPool the program class pool from which new - * constants can be initialized. - * @param libraryClassPool the library class pool from which new - * constants can be initialized. - */ - public InstructionSequenceBuilder(ClassPool programClassPool, - ClassPool libraryClassPool) - { - this(new MyDummyClass(), - programClassPool, - libraryClassPool); - } - - - /** - * Creates a new InstructionSequenceBuilder. - * @param targetClass the target class for the instruction - * constants. - */ - public InstructionSequenceBuilder(ProgramClass targetClass) - { - this(new ConstantPoolEditor(targetClass)); - } - - - /** - * Creates a new InstructionSequenceBuilder that automatically initializes - * class references and class member references in new constants. - * @param targetClass the target class for the instruction - * constants. - * @param programClassPool the program class pool from which new - * constants can be initialized. - * @param libraryClassPool the library class pool from which new - * constants can be initialized. - */ - public InstructionSequenceBuilder(ProgramClass targetClass, - ClassPool programClassPool, - ClassPool libraryClassPool) - { - this(new ConstantPoolEditor(targetClass, programClassPool, libraryClassPool)); - } - - - /** - * Creates a new InstructionSequenceBuilder. - * @param constantPoolEditor the editor to use for creating any constants - * for the instructions. - */ - public InstructionSequenceBuilder(ConstantPoolEditor constantPoolEditor) - { - this.constantPoolEditor = constantPoolEditor; - } - - - /** - * Returns the ConstantPoolEditor used by this builder to - * create constants. - * - * @return the ConstantPoolEditor used by this builder to - * create constants. - */ - public ConstantPoolEditor getConstantPoolEditor() - { - return constantPoolEditor; - } - - - /** - * Short for {@link #appendInstruction(Instruction)}. - * - * @see InstructionSequenceReplacer#label() - */ - public InstructionSequenceBuilder label(Instruction instruction) - { - return appendInstruction(instruction); - } - - - /** - * Short for {@link #appendInstruction(Instruction)}. - * - * @see InstructionSequenceReplacer#catch_(int,int,int) - */ - public InstructionSequenceBuilder catch_(Instruction instruction) - { - return appendInstruction(instruction); - } - - - /** - * Appends the given instruction. - * @param instruction the instruction to be appended. - * @return the builder itself. - */ - public InstructionSequenceBuilder appendInstruction(Instruction instruction) - { - return add(instruction); - } - - - /** - * Appends the given instructions. - * @param instructions the instructions to be appended. - * @return the builder itself. - */ - public InstructionSequenceBuilder appendInstructions(Instruction[] instructions) - { - for (Instruction instruction : instructions) - { - add(instruction); - } - - return this; - } - - - /** - * Short for {@link #instructions()}. - */ - public Instruction[] __() - { - return instructions(); - } - - - /** - * Returns the accumulated sequence of instructions - * and resets the sequence in the builder. - */ - public Instruction[] instructions() - { - Instruction[] instructions_array = new Instruction[instructions.size()]; - instructions.toArray(instructions_array); - - instructions.clear(); - - return instructions_array; - } - - - /** - * Returns the accumulated set of constants - * and resets the set in the builder. - */ - public Constant[] constants() - { - ProgramClass targetClass = constantPoolEditor.getTargetClass(); - - Constant[] constantPool = new Constant[targetClass.u2constantPoolCount]; - System.arraycopy(targetClass.constantPool, - 0, - constantPool, - 0, - targetClass.u2constantPoolCount); - - targetClass.u2constantPoolCount = 0; - - return constantPool; - } - - - // Methods corresponding to the bytecode opcodes. - - public InstructionSequenceBuilder nop() - { - return add(new SimpleInstruction(InstructionConstants.OP_NOP)); - } - - public InstructionSequenceBuilder aconst_null() - { - return add(new SimpleInstruction(InstructionConstants.OP_ACONST_NULL)); - } - - public InstructionSequenceBuilder iconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_0, constant)); - } - - public InstructionSequenceBuilder iconst_m1() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_M1)); - } - - public InstructionSequenceBuilder iconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_0)); - } - - public InstructionSequenceBuilder iconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_1)); - } - - public InstructionSequenceBuilder iconst_2() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_2)); - } - - public InstructionSequenceBuilder iconst_3() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_3)); - } - - public InstructionSequenceBuilder iconst_4() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_4)); - } - - public InstructionSequenceBuilder iconst_5() - { - return add(new SimpleInstruction(InstructionConstants.OP_ICONST_5)); - } - - public InstructionSequenceBuilder lconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_LCONST_0, constant)); - } - - public InstructionSequenceBuilder lconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_LCONST_0)); - } - - public InstructionSequenceBuilder lconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_LCONST_1)); - } - - public InstructionSequenceBuilder fconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_0, constant)); - } - - public InstructionSequenceBuilder fconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_0)); - } - - public InstructionSequenceBuilder fconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_1)); - } - - public InstructionSequenceBuilder fconst_2() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCONST_2)); - } - - public InstructionSequenceBuilder dconst(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_DCONST_0, constant)); - } - - public InstructionSequenceBuilder dconst_0() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCONST_0)); - } - - public InstructionSequenceBuilder dconst_1() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCONST_1)); - } - - public InstructionSequenceBuilder bipush(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_BIPUSH, constant)); - } - - public InstructionSequenceBuilder sipush(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_SIPUSH, constant)); - } - - public InstructionSequenceBuilder ldc(int value) - { - return ldc_(constantPoolEditor.addIntegerConstant(value)); - } - - public InstructionSequenceBuilder ldc(float value) - { - return ldc_(constantPoolEditor.addFloatConstant(value)); - } - - public InstructionSequenceBuilder ldc(Object primitiveArray) - { - return ldc_(constantPoolEditor.addPrimitiveArrayConstant(primitiveArray)); - } - - public InstructionSequenceBuilder ldc(String string) - { - return ldc(string, null, null); - } - - public InstructionSequenceBuilder ldc(String string, Clazz referencedClass, Method referencedMember) - { - return ldc_(constantPoolEditor.addStringConstant(string, referencedClass, referencedMember)); - } - - public InstructionSequenceBuilder ldc(String className, Clazz referencedClass) - { - return ldc_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public InstructionSequenceBuilder ldc_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_LDC, constantIndex)); - } - - public InstructionSequenceBuilder ldc_w(int value) - { - return ldc_w_(constantPoolEditor.addIntegerConstant(value)); - } - - public InstructionSequenceBuilder ldc_w(float value) - { - // If we can shrink the instruction, we may not need to create a constant. - return ldc_w_(constantPoolEditor.addFloatConstant(value)); - } - - public InstructionSequenceBuilder ldc_w(String string) - { - return ldc_w(string, null, null); - } - - public InstructionSequenceBuilder ldc_w(String string, Clazz referencedClass, Method referencedMember) - { - return ldc_w_(constantPoolEditor.addStringConstant(string, referencedClass, referencedMember)); - } - - public InstructionSequenceBuilder ldc_w(String className, Clazz referencedClass) - { - return ldc_w_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public InstructionSequenceBuilder ldc_w_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_LDC_W, constantIndex)); - } - - public InstructionSequenceBuilder ldc2_w(long value) - { - // If we can shrink the instruction, we may not need to create a constant. - return ldc2_w(constantPoolEditor.addLongConstant(value)); - } - - public InstructionSequenceBuilder ldc2_w(double value) - { - // If we can shrink the instruction, we may not need to create a constant. - return ldc2_w(constantPoolEditor.addDoubleConstant(value)); - } - - public InstructionSequenceBuilder ldc2_w(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_LDC2_W, constantIndex)); - } - - public InstructionSequenceBuilder iload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD, variableIndex)); - } - - public InstructionSequenceBuilder lload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD, variableIndex)); - } - - public InstructionSequenceBuilder fload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD, variableIndex)); - } - - public InstructionSequenceBuilder dload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD, variableIndex)); - } - - public InstructionSequenceBuilder aload(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD, variableIndex)); - } - - public InstructionSequenceBuilder iload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_0)); - } - - public InstructionSequenceBuilder iload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_1)); - } - - public InstructionSequenceBuilder iload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_2)); - } - - public InstructionSequenceBuilder iload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ILOAD_3)); - } - - public InstructionSequenceBuilder lload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_0)); - } - - public InstructionSequenceBuilder lload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_1)); - } - - public InstructionSequenceBuilder lload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_2)); - } - - public InstructionSequenceBuilder lload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_LLOAD_3)); - } - - public InstructionSequenceBuilder fload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_0)); - } - - public InstructionSequenceBuilder fload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_1)); - } - - public InstructionSequenceBuilder fload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_2)); - } - - public InstructionSequenceBuilder fload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_FLOAD_3)); - } - - public InstructionSequenceBuilder dload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_0)); - } - - public InstructionSequenceBuilder dload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_1)); - } - - public InstructionSequenceBuilder dload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_2)); - } - - public InstructionSequenceBuilder dload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_DLOAD_3)); - } - - public InstructionSequenceBuilder aload_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_0)); - } - - public InstructionSequenceBuilder aload_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_1)); - } - - public InstructionSequenceBuilder aload_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_2)); - } - - public InstructionSequenceBuilder aload_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ALOAD_3)); - } - - public InstructionSequenceBuilder iaload() - { - return add(new SimpleInstruction(InstructionConstants.OP_IALOAD)); - } - - public InstructionSequenceBuilder laload() - { - return add(new SimpleInstruction(InstructionConstants.OP_LALOAD)); - } - - public InstructionSequenceBuilder faload() - { - return add(new SimpleInstruction(InstructionConstants.OP_FALOAD)); - } - - public InstructionSequenceBuilder daload() - { - return add(new SimpleInstruction(InstructionConstants.OP_DALOAD)); - } - - public InstructionSequenceBuilder aaload() - { - return add(new SimpleInstruction(InstructionConstants.OP_AALOAD)); - } - - public InstructionSequenceBuilder baload() - { - return add(new SimpleInstruction(InstructionConstants.OP_BALOAD)); - } - - public InstructionSequenceBuilder caload() - { - return add(new SimpleInstruction(InstructionConstants.OP_CALOAD)); - } - - public InstructionSequenceBuilder saload() - { - return add(new SimpleInstruction(InstructionConstants.OP_SALOAD)); - } - - public InstructionSequenceBuilder istore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE, variableIndex)); - } - - public InstructionSequenceBuilder lstore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE, variableIndex)); - } - - public InstructionSequenceBuilder fstore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE, variableIndex)); - } - - public InstructionSequenceBuilder dstore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE, variableIndex)); - } - - public InstructionSequenceBuilder astore(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE, variableIndex)); - } - - public InstructionSequenceBuilder istore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_0)); - } - - public InstructionSequenceBuilder istore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_1)); - } - - public InstructionSequenceBuilder istore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_2)); - } - - public InstructionSequenceBuilder istore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ISTORE_3)); - } - - public InstructionSequenceBuilder lstore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_0)); - } - - public InstructionSequenceBuilder lstore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_1)); - } - - public InstructionSequenceBuilder lstore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_2)); - } - - public InstructionSequenceBuilder lstore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_LSTORE_3)); - } - - public InstructionSequenceBuilder fstore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_0)); - } - - public InstructionSequenceBuilder fstore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_1)); - } - - public InstructionSequenceBuilder fstore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_2)); - } - - public InstructionSequenceBuilder fstore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_FSTORE_3)); - } - - public InstructionSequenceBuilder dstore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_0)); - } - - public InstructionSequenceBuilder dstore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_1)); - } - - public InstructionSequenceBuilder dstore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_2)); - } - - public InstructionSequenceBuilder dstore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_DSTORE_3)); - } - - public InstructionSequenceBuilder astore_0() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_0)); - } - - public InstructionSequenceBuilder astore_1() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_1)); - } - - public InstructionSequenceBuilder astore_2() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_2)); - } - - public InstructionSequenceBuilder astore_3() - { - return add(new VariableInstruction(InstructionConstants.OP_ASTORE_3)); - } - - public InstructionSequenceBuilder iastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_IASTORE)); - } - - public InstructionSequenceBuilder lastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_LASTORE)); - } - - public InstructionSequenceBuilder fastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_FASTORE)); - } - - public InstructionSequenceBuilder dastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_DASTORE)); - } - - public InstructionSequenceBuilder aastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_AASTORE)); - } - - public InstructionSequenceBuilder bastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_BASTORE)); - } - - public InstructionSequenceBuilder castore() - { - return add(new SimpleInstruction(InstructionConstants.OP_CASTORE)); - } - - public InstructionSequenceBuilder sastore() - { - return add(new SimpleInstruction(InstructionConstants.OP_SASTORE)); - } - - public InstructionSequenceBuilder pop() - { - return add(new SimpleInstruction(InstructionConstants.OP_POP)); - } - - public InstructionSequenceBuilder pop2() - { - return add(new SimpleInstruction(InstructionConstants.OP_POP2)); - } - - public InstructionSequenceBuilder dup() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP)); - } - - public InstructionSequenceBuilder dup_x1() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP_X1)); - } - - public InstructionSequenceBuilder dup_x2() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP_X2)); - } - - public InstructionSequenceBuilder dup2() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP2)); - } - - public InstructionSequenceBuilder dup2_x1() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP2_X1)); - } - - public InstructionSequenceBuilder dup2_x2() - { - return add(new SimpleInstruction(InstructionConstants.OP_DUP2_X2)); - } - - public InstructionSequenceBuilder swap() - { - return add(new SimpleInstruction(InstructionConstants.OP_SWAP)); - } - - public InstructionSequenceBuilder iadd() - { - return add(new SimpleInstruction(InstructionConstants.OP_IADD)); - } - - public InstructionSequenceBuilder ladd() - { - return add(new SimpleInstruction(InstructionConstants.OP_LADD)); - } - - public InstructionSequenceBuilder fadd() - { - return add(new SimpleInstruction(InstructionConstants.OP_FADD)); - } - - public InstructionSequenceBuilder dadd() - { - return add(new SimpleInstruction(InstructionConstants.OP_DADD)); - } - - public InstructionSequenceBuilder isub() - { - return add(new SimpleInstruction(InstructionConstants.OP_ISUB)); - } - - public InstructionSequenceBuilder lsub() - { - return add(new SimpleInstruction(InstructionConstants.OP_LSUB)); - } - - public InstructionSequenceBuilder fsub() - { - return add(new SimpleInstruction(InstructionConstants.OP_FSUB)); - } - - public InstructionSequenceBuilder dsub() - { - return add(new SimpleInstruction(InstructionConstants.OP_DSUB)); - } - - public InstructionSequenceBuilder imul() - { - return add(new SimpleInstruction(InstructionConstants.OP_IMUL)); - } - - public InstructionSequenceBuilder lmul() - { - return add(new SimpleInstruction(InstructionConstants.OP_LMUL)); - } - - public InstructionSequenceBuilder fmul() - { - return add(new SimpleInstruction(InstructionConstants.OP_FMUL)); - } - - public InstructionSequenceBuilder dmul() - { - return add(new SimpleInstruction(InstructionConstants.OP_DMUL)); - } - - public InstructionSequenceBuilder idiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_IDIV)); - } - - public InstructionSequenceBuilder ldiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_LDIV)); - } - - public InstructionSequenceBuilder fdiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_FDIV)); - } - - public InstructionSequenceBuilder ddiv() - { - return add(new SimpleInstruction(InstructionConstants.OP_DDIV)); - } - - public InstructionSequenceBuilder irem() - { - return add(new SimpleInstruction(InstructionConstants.OP_IREM)); - } - - public InstructionSequenceBuilder lrem() - { - return add(new SimpleInstruction(InstructionConstants.OP_LREM)); - } - - public InstructionSequenceBuilder frem() - { - return add(new SimpleInstruction(InstructionConstants.OP_FREM)); - } - - public InstructionSequenceBuilder drem() - { - return add(new SimpleInstruction(InstructionConstants.OP_DREM)); - } - - public InstructionSequenceBuilder ineg() - { - return add(new SimpleInstruction(InstructionConstants.OP_INEG)); - } - - public InstructionSequenceBuilder lneg() - { - return add(new SimpleInstruction(InstructionConstants.OP_LNEG)); - } - - public InstructionSequenceBuilder fneg() - { - return add(new SimpleInstruction(InstructionConstants.OP_FNEG)); - } - - public InstructionSequenceBuilder dneg() - { - return add(new SimpleInstruction(InstructionConstants.OP_DNEG)); - } - - public InstructionSequenceBuilder ishl() - { - return add(new SimpleInstruction(InstructionConstants.OP_ISHL)); - } - - public InstructionSequenceBuilder lshl() - { - return add(new SimpleInstruction(InstructionConstants.OP_LSHL)); - } - - public InstructionSequenceBuilder ishr() - { - return add(new SimpleInstruction(InstructionConstants.OP_ISHR)); - } - - public InstructionSequenceBuilder lshr() - { - return add(new SimpleInstruction(InstructionConstants.OP_LSHR)); - } - - public InstructionSequenceBuilder iushr() - { - return add(new SimpleInstruction(InstructionConstants.OP_IUSHR)); - } - - public InstructionSequenceBuilder lushr() - { - return add(new SimpleInstruction(InstructionConstants.OP_LUSHR)); - } - - public InstructionSequenceBuilder iand() - { - return add(new SimpleInstruction(InstructionConstants.OP_IAND)); - } - - public InstructionSequenceBuilder land() - { - return add(new SimpleInstruction(InstructionConstants.OP_LAND)); - } - - public InstructionSequenceBuilder ior() - { - return add(new SimpleInstruction(InstructionConstants.OP_IOR)); - } - - public InstructionSequenceBuilder lor() - { - return add(new SimpleInstruction(InstructionConstants.OP_LOR)); - } - - public InstructionSequenceBuilder ixor() - { - return add(new SimpleInstruction(InstructionConstants.OP_IXOR)); - } - - public InstructionSequenceBuilder lxor() - { - return add(new SimpleInstruction(InstructionConstants.OP_LXOR)); - } - - public InstructionSequenceBuilder iinc(int variableIndex, - int constant) - { - return add(new VariableInstruction(InstructionConstants.OP_IINC, variableIndex, constant)); - } - - public InstructionSequenceBuilder i2l() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2L)); - } - - public InstructionSequenceBuilder i2f() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2F)); - } - - public InstructionSequenceBuilder i2d() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2D)); - } - - public InstructionSequenceBuilder l2i() - { - return add(new SimpleInstruction(InstructionConstants.OP_L2I)); - } - - public InstructionSequenceBuilder l2f() - { - return add(new SimpleInstruction(InstructionConstants.OP_L2F)); - } - - public InstructionSequenceBuilder l2d() - { - return add(new SimpleInstruction(InstructionConstants.OP_L2D)); - } - - public InstructionSequenceBuilder f2i() - { - return add(new SimpleInstruction(InstructionConstants.OP_F2I)); - } - - public InstructionSequenceBuilder f2l() - { - return add(new SimpleInstruction(InstructionConstants.OP_F2L)); - } - - public InstructionSequenceBuilder f2d() - { - return add(new SimpleInstruction(InstructionConstants.OP_F2D)); - } - - public InstructionSequenceBuilder d2i() - { - return add(new SimpleInstruction(InstructionConstants.OP_D2I)); - } - - public InstructionSequenceBuilder d2l() - { - return add(new SimpleInstruction(InstructionConstants.OP_D2L)); - } - - public InstructionSequenceBuilder d2f() - { - return add(new SimpleInstruction(InstructionConstants.OP_D2F)); - } - - public InstructionSequenceBuilder i2b() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2B)); - } - - public InstructionSequenceBuilder i2c() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2C)); - } - - public InstructionSequenceBuilder i2s() - { - return add(new SimpleInstruction(InstructionConstants.OP_I2S)); - } - - public InstructionSequenceBuilder lcmp() - { - return add(new SimpleInstruction(InstructionConstants.OP_LCMP)); - } - - public InstructionSequenceBuilder fcmpl() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCMPL)); - } - - public InstructionSequenceBuilder fcmpg() - { - return add(new SimpleInstruction(InstructionConstants.OP_FCMPG)); - } - - public InstructionSequenceBuilder dcmpl() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCMPL)); - } - - public InstructionSequenceBuilder dcmpg() - { - return add(new SimpleInstruction(InstructionConstants.OP_DCMPG)); - } - - public InstructionSequenceBuilder ifeq(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFEQ, branchOffset)); - } - - public InstructionSequenceBuilder ifne(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFNE, branchOffset)); - } - - public InstructionSequenceBuilder iflt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFLT, branchOffset)); - } - - public InstructionSequenceBuilder ifge(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFGE, branchOffset)); - } - - public InstructionSequenceBuilder ifgt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFGT, branchOffset)); - } - - public InstructionSequenceBuilder ifle(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFLE, branchOffset)); - } - - public InstructionSequenceBuilder ificmpeq(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPEQ, branchOffset)); - } - - public InstructionSequenceBuilder ificmpne(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPNE, branchOffset)); - } - - public InstructionSequenceBuilder ificmplt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPLT, branchOffset)); - } - - public InstructionSequenceBuilder ificmpge(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPGE, branchOffset)); - } - - public InstructionSequenceBuilder ificmpgt(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPGT, branchOffset)); - } - - public InstructionSequenceBuilder ificmple(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFICMPLE, branchOffset)); - } - - public InstructionSequenceBuilder ifacmpeq(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFACMPEQ, branchOffset)); - } - - public InstructionSequenceBuilder ifacmpne(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFACMPNE, branchOffset)); - } - - public InstructionSequenceBuilder goto_(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_GOTO, branchOffset)); - } - - public InstructionSequenceBuilder jsr(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_JSR, branchOffset)); - } - - public InstructionSequenceBuilder ret(int variableIndex) - { - return add(new VariableInstruction(InstructionConstants.OP_RET, variableIndex)); - } - - public InstructionSequenceBuilder tableswitch(int defaultOffset, - int lowCase, - int highCase, - int[] jumpOffsets) - { - return add(new TableSwitchInstruction(InstructionConstants.OP_TABLESWITCH, - defaultOffset, - lowCase, - highCase, - jumpOffsets)); - } - - public InstructionSequenceBuilder lookupswitch(int defaultOffset, - int[] cases, - int[] jumpOffsets) - { - return add(new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, - defaultOffset, - cases, - jumpOffsets)); - } - - public InstructionSequenceBuilder ireturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_IRETURN)); - } - - public InstructionSequenceBuilder lreturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_LRETURN)); - } - - public InstructionSequenceBuilder freturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_FRETURN)); - } - - public InstructionSequenceBuilder dreturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_DRETURN)); - } - - public InstructionSequenceBuilder areturn() - { - return add(new SimpleInstruction(InstructionConstants.OP_ARETURN)); - } - - public InstructionSequenceBuilder return_() - { - return add(new SimpleInstruction(InstructionConstants.OP_RETURN)); - } - - public InstructionSequenceBuilder getstatic(Clazz referencedClass, - Member referencedMember) - { - return getstatic(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder getstatic(String className, - String name, - String descriptor) - { - return getstatic(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder getstatic(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return getstatic(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder getstatic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_GETSTATIC, constantIndex)); - } - - public InstructionSequenceBuilder putstatic(Clazz referencedClass, - Member referencedMember) - { - return putstatic(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder putstatic(String className, - String name, - String descriptor) - { - return putstatic(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder putstatic(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return putstatic(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder putstatic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, constantIndex)); - } - - public InstructionSequenceBuilder getfield(Clazz referencedClass, - Member referencedMember) - { - return getfield(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder getfield(String className, - String name, - String descriptor) - { - return getfield(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder getfield(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return getfield(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder getfield(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_GETFIELD, constantIndex)); - } - - public InstructionSequenceBuilder putfield(Clazz referencedClass, - Member referencedMember) - { - return putfield(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder putfield(String className, - String name, - String descriptor) - { - return putfield(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder putfield(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return putfield(constantPoolEditor.addFieldrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder putfield(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_PUTFIELD, constantIndex)); - } - - public InstructionSequenceBuilder invokevirtual(Clazz referencedClass, - Member referencedMember) - { - return invokevirtual(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder invokevirtual(String className, - String name, - String descriptor) - { - return invokevirtual(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder invokevirtual(int classIndex, - String name, - String descriptor) - { - return invokevirtual(constantPoolEditor.addMethodrefConstant(classIndex, - name, - descriptor, - null, - null)); - } - - public InstructionSequenceBuilder invokevirtual(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokevirtual(constantPoolEditor.addMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder invokevirtual(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, constantIndex)); - } - - public InstructionSequenceBuilder invokespecial(String className, - String name, - String descriptor) - { - return invokespecial(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder invokespecial(Clazz referencedClass, - Member referencedMember) - { - return invokespecial(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder invokespecial(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokespecial(constantPoolEditor.addMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder invokespecial_interface(String className, - String name, - String descriptor) - { - return invokespecial_interface(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder invokespecial_interface(Clazz referencedClass, - Member referencedMember) - { - return invokespecial_interface(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder invokespecial_interface(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokespecial(constantPoolEditor.addInterfaceMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder invokespecial(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, constantIndex)); - } - - public InstructionSequenceBuilder invokestatic(Clazz referencedClass, - Member referencedMember) - { - return invokestatic(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder invokestatic(String className, - String name, - String descriptor) - { - return invokestatic(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder invokestatic(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokestatic(constantPoolEditor.addMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder invokestatic_interface(String className, - String name, - String descriptor) - { - return invokestatic_interface(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder invokestatic_interface(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - return invokestatic(constantPoolEditor.addInterfaceMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember)); - } - - public InstructionSequenceBuilder invokestatic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, constantIndex)); - } - - public InstructionSequenceBuilder invokeinterface(Clazz referencedClass, - Member referencedMember) - { - return invokeinterface(referencedClass.getName(), - referencedMember.getName(referencedClass), - referencedMember.getDescriptor(referencedClass), - referencedClass, - referencedMember); - } - - public InstructionSequenceBuilder invokeinterface(String className, - String name, - String descriptor) - { - return invokeinterface(className, name, descriptor, null, null); - } - - public InstructionSequenceBuilder invokeinterface(String className, - String name, - String descriptor, - Clazz referencedClass, - Member referencedMember) - { - int invokeinterfaceConstant = - (ClassUtil.internalMethodParameterSize(descriptor, false)) << 8; - - return invokeinterface(constantPoolEditor.addInterfaceMethodrefConstant(className, - name, - descriptor, - referencedClass, - referencedMember), - invokeinterfaceConstant); - } - - public InstructionSequenceBuilder invokeinterface(int constantIndex, int constant) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKEINTERFACE, constantIndex, constant)); - } - - public InstructionSequenceBuilder invokedynamic(int bootStrapMethodIndex, - String name, - String descriptor) - { - return invokedynamic(bootStrapMethodIndex, name, descriptor, null); - } - - public InstructionSequenceBuilder invokedynamic(int bootStrapMethodIndex, - String name, - String descriptor, - Clazz[] referencedClasses) - { - return invokedynamic(constantPoolEditor.addInvokeDynamicConstant(bootStrapMethodIndex, - name, - descriptor, - referencedClasses)); - } - - public InstructionSequenceBuilder invokedynamic(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INVOKEDYNAMIC, constantIndex)); - } - - public InstructionSequenceBuilder new_(String className) - { - return new_(className, null); - } - - public InstructionSequenceBuilder new_(String className, Clazz referencedClass) - { - return new_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public InstructionSequenceBuilder new_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_NEW, constantIndex)); - } - - public InstructionSequenceBuilder newarray(int constant) - { - return add(new SimpleInstruction(InstructionConstants.OP_NEWARRAY, constant)); - } - - public InstructionSequenceBuilder anewarray(String className, Clazz referencedClass) - { - return anewarray(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public InstructionSequenceBuilder anewarray(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_ANEWARRAY, constantIndex)); - } - - public InstructionSequenceBuilder arraylength() - { - return add(new SimpleInstruction(InstructionConstants.OP_ARRAYLENGTH)); - } - - public InstructionSequenceBuilder athrow() - { - return add(new SimpleInstruction(InstructionConstants.OP_ATHROW)); - } - - public InstructionSequenceBuilder checkcast(String className) - { - return checkcast(className, null); - } - - public InstructionSequenceBuilder checkcast(String className, Clazz referencedClass) - { - return checkcast(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public InstructionSequenceBuilder checkcast(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_CHECKCAST, constantIndex)); - } - - public InstructionSequenceBuilder instanceof_(String className, Clazz referencedClass) - { - return instanceof_(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public InstructionSequenceBuilder instanceof_(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_INSTANCEOF, constantIndex)); - } - - public InstructionSequenceBuilder monitorenter() - { - return add(new SimpleInstruction(InstructionConstants.OP_MONITORENTER)); - } - - public InstructionSequenceBuilder monitorexit() - { - return add(new SimpleInstruction(InstructionConstants.OP_MONITOREXIT)); - } - - public InstructionSequenceBuilder wide() - { - return add(new SimpleInstruction(InstructionConstants.OP_WIDE)); - } - - public InstructionSequenceBuilder multianewarray(String className, Clazz referencedClass) - { - return multianewarray(constantPoolEditor.addClassConstant(className, referencedClass)); - } - - public InstructionSequenceBuilder multianewarray(int constantIndex) - { - return add(new ConstantInstruction(InstructionConstants.OP_MULTIANEWARRAY, constantIndex)); - } - - public InstructionSequenceBuilder ifnull(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFNULL, branchOffset)); - } - - public InstructionSequenceBuilder ifnonnull(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_IFNONNULL, branchOffset)); - } - - public InstructionSequenceBuilder goto_w(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_GOTO_W, branchOffset)); - } - - public InstructionSequenceBuilder jsr_w(int branchOffset) - { - return add(new BranchInstruction(InstructionConstants.OP_JSR_W, branchOffset)); - } - - - // Additional convenience methods. - - /** - * Pushes the given primitive value on the stack. - * - * Operand stack: - * ... -> ..., value - * - * @param value the primitive value to be pushed - should never be null. - * @param type the internal type of the primitive ('Z','B','I',...) - */ - public InstructionSequenceBuilder pushPrimitive(Object value, - char type) - { - switch (type) - { - case ClassConstants.TYPE_BOOLEAN: return ((Boolean)value).booleanValue() ? iconst_1() : iconst_0(); - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: return pushInt(((Number)value).intValue()); - case ClassConstants.TYPE_CHAR: return ldc(((Character)value).charValue()); - case ClassConstants.TYPE_LONG: return ldc2_w((Long)value); - case ClassConstants.TYPE_FLOAT: return ldc(((Float)value).floatValue()); - case ClassConstants.TYPE_DOUBLE: return ldc2_w((Double)value); - default: throw new IllegalArgumentException("" + type); - } - } - - - /** - * Pushes the given primitive int on the stack in the most efficient way - * (as an iconst, bipush, sipush, or ldc instruction). - * - * @param value the int value to be pushed. - */ - public InstructionSequenceBuilder pushInt(int value) - { - return - value >= -1 && - value <= 5 ? iconst(value) : - value == (byte)value ? bipush(value) : - value == (short)value ? sipush(value) : - ldc(value); - } - - - /** - * Pushes the given primitive float on the stack in the most efficient way - * (as an fconst or ldc instruction). - * - * @param value the int value to be pushed. - */ - public InstructionSequenceBuilder pushFloat(float value) - { - return - value == 0f || - value == 1f ? fconst((int)value) : - ldc(value); - } - - - /** - * Pushes the given primitive long on the stack in the most efficient way - * (as an lconst or ldc instruction). - * - * @param value the int value to be pushed. - */ - public InstructionSequenceBuilder pushLong(long value) - { - return - value == 0L || - value == 1L ? lconst((int)value) : - ldc2_w(value); - } - - - /** - * Pushes the given primitive double on the stack in the most efficient way - * (as a dconst or ldc instruction). - * - * @param value the int value to be pushed. - */ - public InstructionSequenceBuilder pushDouble(double value) - { - return - value == 0. || - value == 1. ? dconst((int)value) : - ldc2_w(value); - } - - - /** - * Pushes a new array on the stack. - * - * Operand stack: - * ... -> ..., array - * - * @param type the array element type (or class name in case of objects). - * @param size the size of the array to be created. - */ - public InstructionSequenceBuilder pushNewArray(String type, - int size) - { - // Create new array. - pushInt(size); - - return ClassUtil.isInternalPrimitiveType(type) ? - newarray(InstructionUtil.arrayTypeFromInternalType(type.charAt(0))) : - anewarray(type, null); - } - - - /** - * Loads the given variable onto the stack. - * - * Operand stack: - * ... -> ..., value - * - * @param variableIndex the index of the variable to be loaded. - * @param type the type of the variable to be loaded. - */ - public InstructionSequenceBuilder load(int variableIndex, - String type) - { - return load(variableIndex, type.charAt(0)); - } - - - /** - * Loads the given variable of primitive type onto the stack. - * - * Operand stack: - * ... -> ..., value - * - * @param variableIndex the index of the variable to be loaded. - * @param type the type of the variable to be loaded. - */ - public InstructionSequenceBuilder load(int variableIndex, - char type) - { - switch (type) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: return iload(variableIndex); - case ClassConstants.TYPE_LONG: return lload(variableIndex); - case ClassConstants.TYPE_FLOAT: return fload(variableIndex); - case ClassConstants.TYPE_DOUBLE: return dload(variableIndex); - default: return aload(variableIndex); - } - } - - - /** - * Stores the value on top of the stack in the variable with given index. - * - * Operand stsack: - * ..., value -> ... - * - * @param variableIndex the index of the variable where to store the - * value. - * @param type the type of the value to be stored. - */ - public InstructionSequenceBuilder store(int variableIndex, - String type) - { - return store(variableIndex, type.charAt(0)); - } - - - /** - * Stores the primitve value on top of the stack in the variable with given - * index. - * - * Operand stack: - * ..., value -> ... - * - * @param variableIndex the index of the variable where to store the - * value. - * @param type the type of the value to be stored. - */ - public InstructionSequenceBuilder store(int variableIndex, - char type) - { - switch (type) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: return istore(variableIndex); - case ClassConstants.TYPE_LONG: return lstore(variableIndex); - case ClassConstants.TYPE_FLOAT: return fstore(variableIndex); - case ClassConstants.TYPE_DOUBLE: return dstore(variableIndex); - default: return astore(variableIndex); - } - } - - - /** - * Stores an element to an array. - * - * Operand stack: - * ..., array, index, value -> ... - * - * @param elementType the type of the value to be stored. - */ - public InstructionSequenceBuilder storeToArray(String elementType) - { - // Store element on stack in array. - switch (elementType.charAt(0)) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: return bastore(); - case ClassConstants.TYPE_CHAR: return castore(); - case ClassConstants.TYPE_SHORT: return sastore(); - case ClassConstants.TYPE_INT: return iastore(); - case ClassConstants.TYPE_LONG: return lastore(); - case ClassConstants.TYPE_FLOAT: return fastore(); - case ClassConstants.TYPE_DOUBLE: return dastore(); - default: return aastore(); - } - } - - - // Small utility methods. - - /** - * Adds the given instruction, shrinking it if necessary. - */ - private InstructionSequenceBuilder add(Instruction instruction) - { - instructions.add(instruction); - - return this; - } - - - /** - * This main method tests the class. - */ - public static void main(String[] args) - { - InstructionSequenceBuilder builder = new InstructionSequenceBuilder(); - - Instruction[] instructions = builder - .iconst_2() - .istore_0() - .iinc(0, 2) - .iload_0() - .ldc(12) - .iadd() - .putstatic("com/example/SomeClass", "someField", "I", null, null) - .instructions(); - - Constant[] constants = builder.constants(); - - for (Instruction instruction : instructions) - { - System.out.println(instruction); - } - - System.out.println(); - - for (int index = 0; index < constants.length; index++) - { - System.out.println("#"+index+": " + constants[index]); - } - } - - - /** - * This ProgramClass is a dummy container for a constant pool, with a null name. - */ - private static class MyDummyClass - extends ProgramClass - { - public MyDummyClass() - { - super(ClassConstants.CLASS_VERSION_1_0, 1, new Constant[256], 0, 0, 0); - } - - - // Overriding methods for Claaz. - - public String getName() - { - return null; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionWriter.java deleted file mode 100644 index 98ac6222..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InstructionWriter.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor writes out the instructions that it visits, - * collecting instructions that have to be widened. As an AttributeVisitor, - * it then applies the collected changes. The process will be repeated - * recursively, if necessary. The caller still has to update the frame sizes. - * - * @author Eric Lafortune - */ -public class InstructionWriter -extends SimplifiedVisitor -implements InstructionVisitor, - AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = false; - //*/ - - - private int codeLength; - - private CodeAttributeEditor codeAttributeEditor; - - - /** - * Resets the accumulated code. - * @param codeLength the length of the code that will be edited next. - */ - public void reset(int codeLength) - { - this.codeLength = codeLength; - - if (codeAttributeEditor != null) - { - codeAttributeEditor.reset(codeLength); - } - } - - - /** - * Extends the size of the accumulated code. - * @param codeLength the length of the code that will be edited next. - */ - public void extend(int codeLength) - { - this.codeLength = codeLength; - - if (codeAttributeEditor != null) - { - codeAttributeEditor.extend(codeLength); - } - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - // Try to write out the instruction. - // Simple instructions should always fit. - simpleInstruction.write(codeAttribute, offset); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - try - { - // Try to write out the instruction. - constantInstruction.write(codeAttribute, offset); - } - catch (IllegalArgumentException exception) - { - // Create a new constant instruction that will fit. - Instruction replacementInstruction = - new ConstantInstruction(constantInstruction.opcode, - constantInstruction.constantIndex, - constantInstruction.constant); - - if (DEBUG) - { - System.out.println(" "+constantInstruction.toString(offset)+" will be widened to "+replacementInstruction.toString()); - } - - replaceInstruction(offset, replacementInstruction); - - // Write out a dummy constant instruction for now. - constantInstruction.constantIndex = 0; - constantInstruction.constant = 0; - constantInstruction.write(codeAttribute, offset); - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - try - { - // Try to write out the instruction. - variableInstruction.write(codeAttribute, offset); - } - catch (IllegalArgumentException exception) - { - // Create a new variable instruction that will fit. - Instruction replacementInstruction = - new VariableInstruction(variableInstruction.opcode, - variableInstruction.variableIndex, - variableInstruction.constant); - - replaceInstruction(offset, replacementInstruction); - - if (DEBUG) - { - System.out.println(" "+variableInstruction.toString(offset)+" will be widened to "+replacementInstruction.toString()); - } - - // Write out a dummy variable instruction for now. - variableInstruction.variableIndex = 0; - variableInstruction.constant = 0; - variableInstruction.write(codeAttribute, offset); - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - try - { - // Try to write out the instruction. - branchInstruction.write(codeAttribute, offset); - } - catch (IllegalArgumentException exception) - { - // Create a new unconditional branch that will fit. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO_W, - branchInstruction.branchOffset); - - // Create a new instruction that will fit. - switch (branchInstruction.opcode) - { - default: - { - // Create a new branch instruction that will fit. - replacementInstruction = - new BranchInstruction(branchInstruction.opcode, - branchInstruction.branchOffset); - - break; - } - - // Some special cases, for which a wide branch doesn't exist. - case InstructionConstants.OP_IFEQ: - case InstructionConstants.OP_IFNE: - case InstructionConstants.OP_IFLT: - case InstructionConstants.OP_IFGE: - case InstructionConstants.OP_IFGT: - case InstructionConstants.OP_IFLE: - case InstructionConstants.OP_IFICMPEQ: - case InstructionConstants.OP_IFICMPNE: - case InstructionConstants.OP_IFICMPLT: - case InstructionConstants.OP_IFICMPGE: - case InstructionConstants.OP_IFICMPGT: - case InstructionConstants.OP_IFICMPLE: - case InstructionConstants.OP_IFACMPEQ: - case InstructionConstants.OP_IFACMPNE: - { - // Insert the complementary conditional branch. - Instruction complementaryConditionalBranch = - new BranchInstruction((byte)(((branchInstruction.opcode+1) ^ 1) - 1), - (1+2) + (1+4)); - - insertBeforeInstruction(offset, complementaryConditionalBranch); - - // Create a new unconditional branch that will fit. - break; - } - - case InstructionConstants.OP_IFNULL: - case InstructionConstants.OP_IFNONNULL: - { - // Insert the complementary conditional branch. - Instruction complementaryConditionalBranch = - new BranchInstruction((byte)(branchInstruction.opcode ^ 1), - (1+2) + (1+4)); - - insertBeforeInstruction(offset, complementaryConditionalBranch); - - // Create a new unconditional branch that will fit. - break; - } - } - - if (DEBUG) - { - System.out.println(" "+branchInstruction.toString(offset)+" will be widened to "+replacementInstruction.toString()); - } - - replaceInstruction(offset, replacementInstruction); - - // Write out a dummy branch instruction for now. - branchInstruction.branchOffset = 0; - branchInstruction.write(codeAttribute, offset); - } - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - // Try to write out the instruction. - // Switch instructions should always fit. - switchInstruction.write(codeAttribute, offset); - } - - - // Implementations for AttributeVisitor. - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Avoid doing any work if nothing is changing anyway. - if (codeAttributeEditor != null) - { - if (DEBUG) - { - System.out.println("InstructionWriter: widening instructions in "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - // Apply the collected expansions. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - - // Don't keep the editor around. We're assuming it won't be needed - // very often, so we don't want to be resetting it all the time. - codeAttributeEditor = null; - } - } - - - // Small utility methods. - - /** - * Remembers to place the given instruction right before the instruction - * at the given offset. - */ - private void insertBeforeInstruction(int instructionOffset, Instruction instruction) - { - ensureCodeAttributeEditor(); - - // Replace the instruction. - codeAttributeEditor.insertBeforeInstruction(instructionOffset, instruction); - } - - - /** - * Remembers to replace the instruction at the given offset by the given - * instruction. - */ - private void replaceInstruction(int instructionOffset, Instruction instruction) - { - ensureCodeAttributeEditor(); - - // Replace the instruction. - codeAttributeEditor.replaceInstruction(instructionOffset, instruction); - } - - - /** - * Remembers to place the given instruction right after the instruction - * at the given offset. - */ - private void insertAfterInstruction(int instructionOffset, Instruction instruction) - { - ensureCodeAttributeEditor(); - - // Replace the instruction. - codeAttributeEditor.insertAfterInstruction(instructionOffset, instruction); - } - - - /** - * Makes sure there is a code attribute editor for the given code attribute. - */ - private void ensureCodeAttributeEditor() - { - if (codeAttributeEditor == null) - { - codeAttributeEditor = new CodeAttributeEditor(false, true); - codeAttributeEditor.reset(codeLength); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceAdder.java deleted file mode 100644 index 4b634fd9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceAdder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor adds all interfaces that it visits to the given - * target class. - * - * @author Eric Lafortune - */ -public class InterfaceAdder -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final ConstantAdder constantAdder; - private final InterfacesEditor interfacesEditor; - - - /** - * Creates a new InterfaceAdder that will add interfaces to the given - * target class. - */ - public InterfaceAdder(ProgramClass targetClass) - { - constantAdder = new ConstantAdder(targetClass); - interfacesEditor = new InterfacesEditor(targetClass); - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - interfacesEditor.addInterface(constantAdder.addConstant(clazz, classConstant)); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceDeleter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceDeleter.java deleted file mode 100644 index 5260a258..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceDeleter.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.Utf8Constant; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.Arrays; - -/** - * This ClassVisitor removes specified interfaces from the classes and class - * signatures that it visits. - * - * @author Eric Lafortune - */ -public class InterfaceDeleter -extends SimplifiedVisitor -implements ClassVisitor, - AttributeVisitor -{ - private static final boolean DEBUG = false; - - - private final boolean[] delete; - - - /** - * Creates a new InterfaceDeleter to remove the specified interfaces. - * @param delete an array that corresponds to the interfaces of a class - * and that specifies the ones to be removed. - */ - public InterfaceDeleter(boolean[] delete) - { - this.delete = delete; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - int[] interfaces = programClass.u2interfaces; - int interfacesCount = programClass.u2interfacesCount; - - if (DEBUG) - { - System.out.println("InterfaceDeleter: "+programClass.getName()+" ("+interfacesCount+" interfaces)"); - } - - // Copy the interfaces that aren't deleted. - int newInterfacesCount = 0; - for (int index = 0; index < interfacesCount; index++) - { - if (DEBUG) - { - System.out.println("InterfaceDeleter: "+(delete[index]?"- ":"+ ")+programClass.getInterfaceName(index)); - } - - if (!delete[index]) - { - interfaces[newInterfacesCount++] = interfaces[index]; - } - } - - // Update the signature. - if (newInterfacesCount < interfacesCount) - { - programClass.u2interfacesCount = newInterfacesCount; - - programClass.attributesAccept(this); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - Clazz[] referencedClasses = signatureAttribute.referencedClasses; - if (referencedClasses != null) - { - // Process the generic definitions, superclass, and implemented - // interfaces. - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(signatureAttribute.getSignature(clazz)); - - // Recompose the signature types in a string buffer. - StringBuffer newSignatureBuffer = new StringBuffer(); - - // Also update the array with referenced classes. - int referencedClassIndex = 0; - int newReferencedClassIndex = 0; - - // Copy the variable type declarations. - if (internalTypeEnumeration.hasFormalTypeParameters()) - { - String type = internalTypeEnumeration.formalTypeParameters(); - - // Append the type. - newSignatureBuffer.append(type); - - // Copy any referenced classes. - int classCount = - new DescriptorClassEnumeration(type).classCount(); - - for (int counter = 0; counter < classCount; counter++) - { - referencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - - if (DEBUG) - { - System.out.println("InterfaceDeleter: type parameters = " + type); - } - } - - // Copy the super class type. - if (internalTypeEnumeration.hasMoreTypes()) - { - String type = internalTypeEnumeration.nextType(); - - // Append the type. - newSignatureBuffer.append(type); - - // Copy any referenced classes. - int classCount = - new DescriptorClassEnumeration(type).classCount(); - - for (int counter = 0; counter < classCount; counter++) - { - referencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - - if (DEBUG) - { - System.out.println("InterfaceDeleter: super class type = " + type); - } - } - - // Copy the interface types. - int index = 0; - while (internalTypeEnumeration.hasMoreTypes()) - { - String type = internalTypeEnumeration.nextType(); - - int classCount = - new DescriptorClassEnumeration(type).classCount(); - - if (DEBUG) - { - System.out.println("InterfaceDeleter: interface type " + (delete[index] ? "- " : "+ ") + type + " (" + classCount + " referenced classes)"); - } - - if (!delete[index++]) - { - // Append the type. - newSignatureBuffer.append(type); - - // Copy any referenced classes. - for (int counter = 0; counter < classCount; counter++) - { - referencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - } - else - { - referencedClassIndex += classCount; - } - } - - // Update the signature. - ((Utf8Constant)((ProgramClass)clazz).constantPool[signatureAttribute.u2signatureIndex]).setString(newSignatureBuffer.toString()); - - // Clear the remaining referenced classes. - Arrays.fill(referencedClasses, - newReferencedClassIndex, - referencedClassIndex, - null); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceSorter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceSorter.java deleted file mode 100644 index e4a29613..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfaceSorter.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.Utf8Constant; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.Arrays; - -/** - * This ClassVisitor sorts the interfaces of the program classes that it visits. - * - * @author Eric Lafortune - */ -public class InterfaceSorter -extends SimplifiedVisitor -implements ClassVisitor, - AttributeVisitor -{ - private static final boolean DEBUG = false; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - int[] interfaces = programClass.u2interfaces; - int interfacesCount = programClass.u2interfacesCount; - - if (interfacesCount > 1) - { - // Sort the interfaces. - Arrays.sort(interfaces, 0, interfacesCount); - - // Update the signature. - programClass.attributesAccept(this); - - // Remove any duplicate entries. - boolean[] delete = null; - for (int index = 1; index < interfacesCount; index++) - { - if (interfaces[index] == interfaces[index - 1]) - { - // Lazily create the array. - if (delete == null) - { - delete = new boolean[interfacesCount]; - } - - delete[index] = true; - } - } - - if (delete != null) - { - new InterfaceDeleter(delete).visitProgramClass(programClass); - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - Clazz[] referencedClasses = signatureAttribute.referencedClasses; - Clazz[] newReferencedClasses = referencedClasses == null ? null : - new Clazz[referencedClasses.length]; - - // Recompose the signature types in a string buffer. - StringBuffer newSignatureBuffer = new StringBuffer(); - - // Also update the array with referenced classes. - int referencedClassIndex = 0; - int newReferencedClassIndex = 0; - - // Process the generic definitions and superclass. - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(signatureAttribute.getSignature(clazz)); - - // Copy the variable type declarations. - if (internalTypeEnumeration.hasFormalTypeParameters()) - { - String type = internalTypeEnumeration.formalTypeParameters(); - - // Append the type. - newSignatureBuffer.append(type); - - // Copy any referenced classes. - if (newReferencedClasses != null) - { - int classCount = - new DescriptorClassEnumeration(type).classCount(); - - for (int counter = 0; counter < classCount; counter++) - { - newReferencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - } - - if (DEBUG) - { - System.out.println("InterfaceDeleter: type parameters = " + type); - } - } - - // Copy the super class type. - if (internalTypeEnumeration.hasMoreTypes()) - { - String type = internalTypeEnumeration.nextType(); - - // Append the type. - newSignatureBuffer.append(type); - - // Copy any referenced classes. - if (newReferencedClasses != null) - { - int classCount = - new DescriptorClassEnumeration(type).classCount(); - - for (int counter = 0; counter < classCount; counter++) - { - newReferencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - } - - if (DEBUG) - { - System.out.println("InterfaceSorter: super class type = " + type); - } - } - - int firstReferencedInterfaceIndex = referencedClassIndex; - - // Copy the interface types, based on the sorted interface classes. - // This has the advantage that we will disregard any interface types - // that are not in the interface classes, like in some versions of - // the Scala runtime library. - for (int interfaceIndex = 0; interfaceIndex < clazz.getInterfaceCount(); interfaceIndex++) - { - // Consider the interface class name. - String interfaceName = clazz.getInterfaceName(interfaceIndex); - - referencedClassIndex = firstReferencedInterfaceIndex; - - // Find the corresponding interface type. - InternalTypeEnumeration internalInterfaceTypeEnumeration = - new InternalTypeEnumeration(signatureAttribute.getSignature(clazz)); - - // Skip the superclass type. - internalInterfaceTypeEnumeration.nextType(); - - while (internalInterfaceTypeEnumeration.hasMoreTypes()) - { - String type = internalInterfaceTypeEnumeration.nextType(); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(type); - - int classCount = - classEnumeration.classCount(); - - classEnumeration.nextFluff(); - - if (interfaceName.equals(classEnumeration.nextClassName())) - { - // Append the type. - newSignatureBuffer.append(type); - - // Copy any referenced classes. - if (newReferencedClasses != null) - { - for (int counter = 0; counter < classCount; counter++) - { - newReferencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - } - - if (DEBUG) - { - System.out.println("InterfaceSorter: interface type = " + type); - } - } - else - { - // Skip all referenced classes. - referencedClassIndex += classCount; - } - } - } - - String newSignature = newSignatureBuffer.toString(); - - // Did the signature change? - if (!newSignature.equals(signatureAttribute.getSignature(clazz))) - { - // Update the signature. - ((Utf8Constant)((ProgramClass)clazz).constantPool[signatureAttribute.u2signatureIndex]).setString(newSignatureBuffer.toString()); - - // Update the referenced classes. - signatureAttribute.referencedClasses = newReferencedClasses; - - if (DEBUG) - { - System.out.println("InterfaceSorter: result = "+newSignature); - System.out.println("InterfaceSorter: referenced classes:"); - - if (newReferencedClasses != null) - { - for (int index = 0; index < newReferencedClasses.length; index++) - { - System.out.println(" #"+index+" "+newReferencedClasses[index]); - } - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfacesEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfacesEditor.java deleted file mode 100644 index a9874992..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/InterfacesEditor.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.ProgramClass; -import proguard.util.ArrayUtil; - -/** - * This class can add and delete interfaces to and from classes. References to - * the constant pool must be filled out beforehand. - * - * @author Eric Lafortune - */ -public class InterfacesEditor -{ - private final ProgramClass targetClass; - - - /** - * Creates a new InterfacesEditor that will edit interfaces in the given - * target class. - */ - public InterfacesEditor(ProgramClass targetClass) - { - this.targetClass = targetClass; - } - - - /** - * Adds the specified interface to the target class, if it isn't present yet. - */ - public void addInterface(int interfaceConstantIndex) - { - // Is the interface not yet present? - if (findInterfaceIndex(interfaceConstantIndex) < 0) - { - // Append the interface. - targetClass.u2interfaces = - ArrayUtil.add(targetClass.u2interfaces, - targetClass.u2interfacesCount++, - interfaceConstantIndex); - } - } - - - /** - * Deletes the given interface from the target class, if it is present. - */ - public void deleteInterface(int interfaceConstantIndex) - { - // Is the interface already present? - int interfaceIndex = findInterfaceIndex(interfaceConstantIndex); - if (interfaceIndex >= 0) - { - int interfacesCount = --targetClass.u2interfacesCount; - int[] interfaces = targetClass.u2interfaces; - - // Shift the other interfaces in the array. - for (int index = interfaceIndex; index < interfacesCount; index++) - { - interfaces[index] = interfaces[index + 1]; - } - - // Clear the remaining entry in the array. - interfaces[interfacesCount] = 0; - } - } - - - // Small utility methods. - - /** - * Finds the index of the specified interface in the list of interfaces of - * the target class. - */ - private int findInterfaceIndex(int interfaceConstantIndex) - { - int interfacesCount = targetClass.u2interfacesCount; - int[] interfaces = targetClass.u2interfaces; - - for (int index = 0; index < interfacesCount; index++) - { - if (interfaces[index] == interfaceConstantIndex) - { - return index; - } - } - - return -1; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberInfoAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberInfoAdder.java deleted file mode 100644 index c85aa9a8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberInfoAdder.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor adds the line numbers of all line number attributes - * that it visits to the given target line number attribute. It ensures that - * the sources of the line numbers are preserved or set. - */ -public class LineNumberInfoAdder -extends SimplifiedVisitor -implements AttributeVisitor, - LineNumberInfoVisitor -{ - private final LineNumberTableAttributeEditor lineNumberTableAttributeEditor; - - private String source; - - - /** - * Creates a new LineNumberInfoAdder that will copy line numbers into the - * given target line number table. - */ - public LineNumberInfoAdder(LineNumberTableAttribute targetLineNumberTableAttribute) - { - this.lineNumberTableAttributeEditor = new LineNumberTableAttributeEditor(targetLineNumberTableAttribute); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - // Remember the source. - source = - clazz.getName() + '.' + - method.getName(clazz) + - method.getDescriptor(clazz) + ':' + - lineNumberTableAttribute.getLowestLineNumber() + ':' + - lineNumberTableAttribute.getHighestLineNumber(); - - // Copy all line numbers. - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this); - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - // Make sure we have a source. - String newSource = lineNumberInfo.getSource() != null ? - lineNumberInfo.getSource() : - source; - - // Create a new line number. - LineNumberInfo newLineNumberInfo = - new ExtendedLineNumberInfo(lineNumberInfo.u2startPC, - lineNumberInfo.u2lineNumber, - newSource); - - // Add it to the target. - lineNumberTableAttributeEditor.addLineNumberInfo(newLineNumberInfo); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberTableAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberTableAttributeEditor.java deleted file mode 100644 index 023ff2d1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberTableAttributeEditor.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.*; - -/** - * This class can add line numbers to a given line number table attribute. - * Line numbers to be added must have been filled out beforehand. - * - * @author Eric Lafortune - */ -public class LineNumberTableAttributeEditor -{ - private LineNumberTableAttribute targetLineNumberTableAttribute; - - - /** - * Creates a new LineNumberTableAttributeEditor that will edit line numbers - * in the given line number table attribute. - */ - public LineNumberTableAttributeEditor(LineNumberTableAttribute targetLineNumberTableAttribute) - { - this.targetLineNumberTableAttribute = targetLineNumberTableAttribute; - } - - - /** - * Adds a given line number to the line number table attribute. - */ - public void addLineNumberInfo(LineNumberInfo lineNumberInfo) - { - int lineNumberTableLength = targetLineNumberTableAttribute.u2lineNumberTableLength; - LineNumberInfo[] lineNumberTable = targetLineNumberTableAttribute.lineNumberTable; - - // Make sure there is enough space for the new lineNumberInfo. - if (lineNumberTable.length <= lineNumberTableLength) - { - targetLineNumberTableAttribute.lineNumberTable = new LineNumberInfo[lineNumberTableLength+1]; - System.arraycopy(lineNumberTable, 0, - targetLineNumberTableAttribute.lineNumberTable, 0, - lineNumberTableLength); - lineNumberTable = targetLineNumberTableAttribute.lineNumberTable; - } - - // Add the lineNumberInfo. - lineNumberTable[targetLineNumberTableAttribute.u2lineNumberTableLength++] = lineNumberInfo; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberTableAttributeTrimmer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberTableAttributeTrimmer.java deleted file mode 100644 index 0421bbf5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LineNumberTableAttributeTrimmer.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Arrays; - -/** - * This AttributeVisitor trims the line number table attributes that it visits. - * - * @author Eric Lafortune - */ -public class LineNumberTableAttributeTrimmer -extends SimplifiedVisitor -implements AttributeVisitor -{ - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - LineNumberInfo[] lineNumberTable = lineNumberTableAttribute.lineNumberTable; - int lineNumberTableLength = lineNumberTableAttribute.u2lineNumberTableLength; - - // Overwrite all empty line number entries. - int newIndex = 0; - for (int index = 0; index < lineNumberTableLength; index++) - { - LineNumberInfo lineNumberInfo = lineNumberTable[index]; - - int startPC = lineNumberInfo.u2startPC; - int lineNumber = lineNumberInfo.u2lineNumber; - - // The offset must lie inside the code. - // The offset must be smaller than the next one. - // The line number should be different from the previous one. - if (startPC < codeAttribute.u4codeLength && - - (index == lineNumberTableLength - 1 || - startPC < lineNumberTable[index + 1].u2startPC) && - - (index == 0 || - lineNumber != lineNumberTable[index - 1].u2lineNumber)) - { - lineNumberTable[newIndex++] = lineNumberInfo; - } - } - - // Clear the unused array entries. - Arrays.fill(lineNumberTable, newIndex, lineNumberTableAttribute.u2lineNumberTableLength, null); - - lineNumberTableAttribute.u2lineNumberTableLength = newIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableInfoAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableInfoAdder.java deleted file mode 100644 index 459abef8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableInfoAdder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.LocalVariableInfoVisitor; - -/** - * This LocalVariableInfoVisitor adds all local variables that it visits to the - * given target local variable table attribute. - */ -public class LocalVariableInfoAdder -implements LocalVariableInfoVisitor -{ - private final ConstantAdder constantAdder; - private final LocalVariableTableAttributeEditor localVariableTableAttributeEditor; - - - /** - * Creates a new LocalVariableInfoAdder that will copy local variables - * into the given target local variable table. - */ - public LocalVariableInfoAdder(ProgramClass targetClass, - LocalVariableTableAttribute targetLocalVariableTableAttribute) - { - this.constantAdder = new ConstantAdder(targetClass); - this.localVariableTableAttributeEditor = new LocalVariableTableAttributeEditor(targetLocalVariableTableAttribute); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Create a new local variable. - LocalVariableInfo newLocalVariableInfo = - new LocalVariableInfo(localVariableInfo.u2startPC, - localVariableInfo.u2length, - constantAdder.addConstant(clazz, localVariableInfo.u2nameIndex), - constantAdder.addConstant(clazz, localVariableInfo.u2descriptorIndex), - localVariableInfo.u2index); - - newLocalVariableInfo.referencedClass = localVariableInfo.referencedClass; - - // Add it to the target. - localVariableTableAttributeEditor.addLocalVariableInfo(newLocalVariableInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTableAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTableAttributeEditor.java deleted file mode 100644 index ba26663f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTableAttributeEditor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.*; -import proguard.util.ArrayUtil; - -/** - * This class can add local variables to a given local variable table attribute. - * Local variables to be added must have been filled out beforehand. - * - * @author Eric Lafortune - */ -public class LocalVariableTableAttributeEditor -{ - private final LocalVariableTableAttribute targetLocalVariableTableAttribute; - - - /** - * Creates a new LocalVariableTableAttributeEditor that will edit local - * variables in the given local variable table attribute. - */ - public LocalVariableTableAttributeEditor(LocalVariableTableAttribute targetLocalVariableTableAttribute) - { - this.targetLocalVariableTableAttribute = targetLocalVariableTableAttribute; - } - - - /** - * Adds a given line number to the line number table attribute. - */ - public void addLocalVariableInfo(LocalVariableInfo localVariableInfo) - { - targetLocalVariableTableAttribute.localVariableTable = - (LocalVariableInfo[])ArrayUtil.add(targetLocalVariableTableAttribute.localVariableTable, - targetLocalVariableTableAttribute.u2localVariableTableLength++, - localVariableInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTypeInfoAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTypeInfoAdder.java deleted file mode 100644 index 549477b3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTypeInfoAdder.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.LocalVariableTypeInfoVisitor; - -/** - * This LocalVariableTypeInfoVisitor adds all local variable types that it - * visits to the given target local variable type attribute. - */ -public class LocalVariableTypeInfoAdder -implements LocalVariableTypeInfoVisitor -{ - private final ConstantAdder constantAdder; - private final LocalVariableTypeTableAttributeEditor localVariableTypeTableAttributeEditor; - - - /** - * Creates a new LocalVariableTypeInfoAdder that will copy local variable - * types into the given target local variable type table. - */ - public LocalVariableTypeInfoAdder(ProgramClass targetClass, - LocalVariableTypeTableAttribute targetLocalVariableTypeTableAttribute) - { - this.constantAdder = new ConstantAdder(targetClass); - this.localVariableTypeTableAttributeEditor = new LocalVariableTypeTableAttributeEditor(targetLocalVariableTypeTableAttribute); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Create a new local variable type. - LocalVariableTypeInfo newLocalVariableTypeInfo = - new LocalVariableTypeInfo(localVariableTypeInfo.u2startPC, - localVariableTypeInfo.u2length, - constantAdder.addConstant(clazz, localVariableTypeInfo.u2nameIndex), - constantAdder.addConstant(clazz, localVariableTypeInfo.u2signatureIndex), - localVariableTypeInfo.u2index); - - // TODO: Clone array. - newLocalVariableTypeInfo.referencedClasses = localVariableTypeInfo.referencedClasses; - - // Add it to the target. - localVariableTypeTableAttributeEditor.addLocalVariableTypeInfo(newLocalVariableTypeInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTypeTableAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTypeTableAttributeEditor.java deleted file mode 100644 index abaae01c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/LocalVariableTypeTableAttributeEditor.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.*; -import proguard.util.ArrayUtil; - -/** - * This class can add local variables to a given local variable type table - * attribute. - * Local variable types to be added must have been filled out beforehand. - * - * @author Eric Lafortune - */ -public class LocalVariableTypeTableAttributeEditor -{ - private final LocalVariableTypeTableAttribute targetLocalVariableTypeTableAttribute; - - - /** - * Creates a new LocalVariableTypeTableAttributeEditor that will edit local - * variable types in the given local variable type table attribute. - */ - public LocalVariableTypeTableAttributeEditor(LocalVariableTypeTableAttribute targetLocalVariableTypeTableAttribute) - { - this.targetLocalVariableTypeTableAttribute = targetLocalVariableTypeTableAttribute; - } - - - /** - * Adds a given local variable type to the local variable type table attribute. - */ - public void addLocalVariableTypeInfo(LocalVariableTypeInfo localVariableTypeInfo) - { - targetLocalVariableTypeTableAttribute.localVariableTypeTable = - (LocalVariableTypeInfo[])ArrayUtil.add(targetLocalVariableTypeTableAttribute.localVariableTypeTable, - targetLocalVariableTypeTableAttribute.u2localVariableTypeTableLength++, - localVariableTypeInfo); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberAdder.java deleted file mode 100644 index 4da4c561..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberAdder.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; -import proguard.util.*; - -/** - * This MemberVisitor copies all class members that it visits to the given - * target class. Their visitor info is set to the class members from which they - * were copied. - * - * @author Eric Lafortune - */ -public class MemberAdder -extends SimplifiedVisitor -implements MemberVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - - private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[0]; - - - private final ProgramClass targetClass; - private final StringTransformer nameTransformer; - private final MemberVisitor extraMemberVisitor; - - private final ClassEditor classEditor; - private final ConstantPoolEditor constantPoolEditor; - - - /** - * Creates a new MemberAdder that will copy methods into the given target - * class. - * @param targetClass the class to which all visited class members will be - * added. - */ - public MemberAdder(ProgramClass targetClass) - { - this(targetClass, null); - } - - - /** - * Creates a new MemberAdder that will copy methods into the given target - * class. - * @param targetClass the class to which all visited class members - * will be added. - * @param extraMemberVisitor an optional member visitor that visits each - * new member right after it has been added. This - * allows changing the visitor info, for instance. - */ - public MemberAdder(ProgramClass targetClass, - MemberVisitor extraMemberVisitor) - { - this(targetClass, null, extraMemberVisitor); - } - - /** - * Creates a new MemberAdder that will copy methods into the given target - * class. - * @param targetClass the class to which all visited class members - * will be added. - * @param nameTransformer the transformer to be applied to each member's - * name before copying. If null, the original - * name will be used. - * @param extraMemberVisitor an optional member visitor that visits each - * new member right after it has been added. This - * allows changing the visitor info, for instance. - */ - public MemberAdder(ProgramClass targetClass, - StringTransformer nameTransformer, - MemberVisitor extraMemberVisitor) - { - this.targetClass = targetClass; - this.nameTransformer = nameTransformer; - this.extraMemberVisitor = extraMemberVisitor; - - classEditor = new ClassEditor(targetClass); - constantPoolEditor = new ConstantPoolEditor(targetClass); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - String name = programField.getName(programClass); - String descriptor = programField.getDescriptor(programClass); - int accessFlags = programField.getAccessFlags(); - - if (nameTransformer != null) - { - name = nameTransformer.transform(name); - } - - // TODO: Handle field with the same name and descriptor in the target class. - // We currently avoid this case, since renaming the identical field - // still causes confused field references. - //// Does the target class already have such a field? - //ProgramField targetField = (ProgramField)targetClass.findField(name, descriptor); - //if (targetField != null) - //{ - // // Is the field private or static? - // int targetAccessFlags = targetField.getAccessFlags(); - // if ((targetAccessFlags & - // (ClassConstants.ACC_PRIVATE | - // ClassConstants.ACC_STATIC)) != 0) - // { - // // Rename the private or static field. - // String newName = newUniqueMemberName(name, targetClass.getName()); - // - // if (DEBUG) - // { - // System.out.println("MemberAdder: renaming field ["+targetClass.getName()+"."+name+" "+descriptor+"] to ["+newName+"]"); - // } - // - // targetField.u2nameIndex = constantPoolEditor.addUtf8Constant(newName); - // } - // else - // { - // // Keep the non-private and non-static field, but update its - // // contents, in order to keep any references to it valid. - // if (DEBUG) - // { - // System.out.println("MemberAdder: updating field ["+programClass+"."+programField.getName(programClass)+" "+programField.getDescriptor(programClass)+"] into ["+targetClass.getName()+"]"); - // } - // - // // Combine the access flags. - // targetField.u2accessFlags = accessFlags | targetAccessFlags; - // - // // Add and replace any attributes. - // programField.attributesAccept(programClass, - // new AttributeAdder(targetClass, - // targetField, - // true)); - // - // // Don't add a new field. - // return; - // } - //} - - if (DEBUG) - { - System.out.println("MemberAdder: copying field ["+programClass+"."+programField.getName(programClass)+" "+programField.getDescriptor(programClass)+"] into ["+targetClass.getName()+"]"); - } - - // Create a copy of the field. - ProgramField newProgramField = - new ProgramField(accessFlags, - constantPoolEditor.addUtf8Constant(name), - constantPoolEditor.addUtf8Constant(descriptor), - 0, - programField.u2attributesCount > 0 ? - new Attribute[programField.u2attributesCount] : - EMPTY_ATTRIBUTES, - programField.referencedClass); - - // Link to its visitor info. - newProgramField.setVisitorInfo(programField); - - // Copy its attributes. - programField.attributesAccept(programClass, - new AttributeAdder(targetClass, - newProgramField, - false)); - - // Add the completed field. - classEditor.addField(newProgramField); - - // Visit the newly added field, if necessary. - if (extraMemberVisitor != null) - { - extraMemberVisitor.visitProgramField(targetClass, newProgramField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - String name = programMethod.getName(programClass); - String descriptor = programMethod.getDescriptor(programClass); - int accessFlags = programMethod.getAccessFlags(); - - if (nameTransformer != null) - { - name = nameTransformer.transform(name); - } - - // Does the target class already have such a method? - ProgramMethod targetMethod = (ProgramMethod)targetClass.findMethod(name, descriptor); - if (targetMethod != null) - { - // is this source method abstract? - if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) - { - // Keep the target method. - if (DEBUG) - { - System.out.println("MemberAdder: skipping abstract method ["+programClass.getName()+"."+name+descriptor+"] into ["+targetClass.getName()+"]"); - } - - // Don't add a new method. - return; - } - - // Is the target method abstract? - int targetAccessFlags = targetMethod.getAccessFlags(); - if ((targetAccessFlags & ClassConstants.ACC_ABSTRACT) != 0) - { - // Keep the abstract method, but update its contents, in order - // to keep any references to it valid. - if (DEBUG) - { - System.out.println("MemberAdder: updating method ["+programClass.getName()+"."+name+descriptor+"] into ["+targetClass.getName()+"]"); - } - - // Replace the access flags. - targetMethod.u2accessFlags = - accessFlags & ~ClassConstants.ACC_FINAL; - - // Add and replace the attributes. - programMethod.attributesAccept(programClass, - new AttributeAdder(targetClass, - targetMethod, - true)); - - // Don't add a new method. - return; - } - - if (DEBUG) - { - System.out.println("MemberAdder: renaming method ["+targetClass.getName()+"."+name+descriptor+"]"); - } - - // TODO: Handle non-abstract method with the same name and descriptor in the target class. - // We currently avoid this case, since renaming the identical method - // still causes confused method references. - //// Rename the private (non-abstract) or static method. - //targetMethod.u2nameIndex = - // constantPoolEditor.addUtf8Constant(newUniqueMemberName(name, descriptor)); - } - - if (DEBUG) - { - System.out.println("MemberAdder: copying method ["+programClass.getName()+"."+name+descriptor+"] into ["+targetClass.getName()+"]"); - } - - // Create a copy of the method. - ProgramMethod newProgramMethod = - new ProgramMethod(accessFlags & ~ClassConstants.ACC_FINAL, - constantPoolEditor.addUtf8Constant(name), - constantPoolEditor.addUtf8Constant(descriptor), - 0, - programMethod.u2attributesCount > 0 ? - new Attribute[programMethod.u2attributesCount] : - EMPTY_ATTRIBUTES, - ArrayUtil.cloneOrNull(programMethod.referencedClasses)); - - // Link to its visitor info. - newProgramMethod.setVisitorInfo(programMethod); - - // Copy its attributes. - programMethod.attributesAccept(programClass, - new AttributeAdder(targetClass, - newProgramMethod, - false)); - - // Add the completed method. - classEditor.addMethod(newProgramMethod); - - // Visit the newly added method, if necessary. - if (extraMemberVisitor != null) - { - extraMemberVisitor.visitProgramMethod(targetClass, newProgramMethod); - } - } - - - // Small utility methods. - - /** - * Returns a unique class member name, based on the given name and descriptor. - */ - private String newUniqueMemberName(String name, String descriptor) - { - return name.equals(ClassConstants.METHOD_NAME_INIT) ? - ClassConstants.METHOD_NAME_INIT : - name + ClassConstants.SPECIAL_MEMBER_SEPARATOR + Long.toHexString(Math.abs((descriptor).hashCode())); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberReferenceFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberReferenceFixer.java deleted file mode 100644 index 4c8324f7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberReferenceFixer.java +++ /dev/null @@ -1,447 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor fixes constant pool field and method references to fields - * and methods whose names or descriptors have changed. - * - * @author Eric Lafortune - */ -public class MemberReferenceFixer -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor, - AttributeVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - private static final boolean DEBUG = false; - - - private final StackSizeUpdater stackSizeUpdater = new StackSizeUpdater(); - - // Parameter for the visitor methods. - private int constantIndex; - - // Return values for the visitor methods. - private boolean isInterfaceMethod; - private boolean stackSizesMayHaveChanged; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - stackSizesMayHaveChanged = false; - - // Fix the constant pool entries. - for (int index = 1; index < programClass.u2constantPoolCount; index++) - { - Constant constant = programClass.constantPool[index]; - if (constant != null) - { - // Fix the entry, replacing it entirely if needed. - this.constantIndex = index; - - constant.accept(programClass, this); - } - } - - // Fix the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Fix the attributes. - programClass.attributesAccept(this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Does the string refer to a class member, due to a - // Class.get[Declared]{Field,Method} construct? - Member referencedMember = stringConstant.referencedMember; - if (referencedMember != null) - { - Clazz referencedClass = stringConstant.referencedClass; - - // Does it have a new name? - String newName = referencedMember.getName(referencedClass); - - if (!stringConstant.getString(clazz).equals(newName)) - { - if (DEBUG) - { - debug(clazz, stringConstant, referencedClass, referencedMember); - } - - // Update the name. - stringConstant.u2stringIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newName); - } - } - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - // Do we know the referenced field? - Member referencedMember = fieldrefConstant.referencedMember; - if (referencedMember != null) - { - Clazz referencedClass = fieldrefConstant.referencedClass; - - // Does it have a new name or type? - String newName = referencedMember.getName(referencedClass); - String newType = referencedMember.getDescriptor(referencedClass); - - if (!fieldrefConstant.getName(clazz).equals(newName) || - !fieldrefConstant.getType(clazz).equals(newType)) - { - if (DEBUG) - { - debug(clazz, fieldrefConstant, referencedClass, referencedMember); - } - - // Update the name and type index. - fieldrefConstant.u2nameAndTypeIndex = - new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(newName, newType); - } - } - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - // Do we know the referenced interface method? - Member referencedMember = interfaceMethodrefConstant.referencedMember; - if (referencedMember != null) - { - Clazz referencedClass = interfaceMethodrefConstant.referencedClass; - - // Does it have a new name or type? - String newName = referencedMember.getName(referencedClass); - String newType = referencedMember.getDescriptor(referencedClass); - - if (!interfaceMethodrefConstant.getName(clazz).equals(newName) || - !interfaceMethodrefConstant.getType(clazz).equals(newType)) - { - if (DEBUG) - { - debug(clazz, interfaceMethodrefConstant, referencedClass, referencedMember); - } - - // Update the name and type index. - interfaceMethodrefConstant.u2nameAndTypeIndex = - new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(newName, newType); - - // Remember that the stack sizes of the methods in this class - // may have changed. - stackSizesMayHaveChanged = true; - } - - // Check if this is an interface method. - isInterfaceMethod = true; - clazz.constantPoolEntryAccept(interfaceMethodrefConstant.u2classIndex, this); - - // Has the method become a non-interface method? - if (!isInterfaceMethod) - { - if (DEBUG) - { - System.out.println("MemberReferenceFixer:"); - System.out.println(" Class file = "+clazz.getName()); - System.out.println(" Ref class = "+referencedClass.getName()); - System.out.println(" Ref method = "+interfaceMethodrefConstant.getName(clazz)+interfaceMethodrefConstant.getType(clazz)); - System.out.println(" -> ordinary method"); - } - - // Replace the interface method reference by a method reference. - ((ProgramClass)clazz).constantPool[this.constantIndex] = - new MethodrefConstant(interfaceMethodrefConstant.u2classIndex, - interfaceMethodrefConstant.u2nameAndTypeIndex, - referencedClass, - referencedMember); - } - } - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - // Do we know the referenced method? - Member referencedMember = methodrefConstant.referencedMember; - if (referencedMember != null) - { - Clazz referencedClass = methodrefConstant.referencedClass; - - // Does it have a new name or type? - String newName = referencedMember.getName(referencedClass); - String newType = referencedMember.getDescriptor(referencedClass); - - if (!methodrefConstant.getName(clazz).equals(newName) || - !methodrefConstant.getType(clazz).equals(newType)) - { - if (DEBUG) - { - debug(clazz, methodrefConstant, referencedClass, referencedMember); - } - - // Update the name and type index. - methodrefConstant.u2nameAndTypeIndex = - new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(newName, newType); - - // Remember that the stack sizes of the methods in this class - // may have changed. - stackSizesMayHaveChanged = true; - } - - // Check if this is an interface method. - isInterfaceMethod = false; - clazz.constantPoolEntryAccept(methodrefConstant.u2classIndex, this); - - // Has the method become an interface method? - if (isInterfaceMethod) - { - if (DEBUG) - { - System.out.println("MemberReferenceFixer:"); - System.out.println(" Class file = "+clazz.getName()); - System.out.println(" Ref class = "+referencedClass.getName()); - System.out.println(" Ref method = "+methodrefConstant.getName(clazz)+methodrefConstant.getType(clazz)); - System.out.println(" -> interface method"); - } - - // Replace the method reference by an interface method reference. - ((ProgramClass)clazz).constantPool[this.constantIndex] = - new InterfaceMethodrefConstant(methodrefConstant.u2classIndex, - methodrefConstant.u2nameAndTypeIndex, - referencedClass, - referencedMember); - } - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Check if this class entry is an array type. - if (ClassUtil.isInternalArrayType(classConstant.getName(clazz))) - { - isInterfaceMethod = false; - } - else - { - // Check if this class entry refers to an interface class. - Clazz referencedClass = classConstant.referencedClass; - if (referencedClass != null) - { - isInterfaceMethod = (referencedClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) != 0; - } - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Fix the attributes. - programMember.attributesAccept(programClass, this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - Member referencedMember = enclosingMethodAttribute.referencedMethod; - if (referencedMember != null) - { - Clazz referencedClass = enclosingMethodAttribute.referencedClass; - - // Does it have a new name or type? - String newName = referencedMember.getName(referencedClass); - String newType = referencedMember.getDescriptor(referencedClass); - - if (!enclosingMethodAttribute.getName(clazz).equals(newName) || - !enclosingMethodAttribute.getType(clazz).equals(newType)) - { - // Update the name and type index. - enclosingMethodAttribute.u2nameAndTypeIndex = - new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(newName, - newType); - } - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Recompute the maximum stack size if necessary. - if (stackSizesMayHaveChanged) - { - stackSizeUpdater.visitCodeAttribute(clazz, method, codeAttribute); - } - - // Fix the nested attributes. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Fix the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Fix the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Fix the annotation. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - // Fix the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - fixElementValue(clazz, annotation, constantElementValue); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - fixElementValue(clazz, annotation, enumConstantElementValue); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - fixElementValue(clazz, annotation, classElementValue); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - fixElementValue(clazz, annotation, annotationElementValue); - - // Fix the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - fixElementValue(clazz, annotation, arrayElementValue); - - // Fix the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - // Small utility methods. - - /** - * Fixes the method reference of the element value, if any. - */ - private void fixElementValue(Clazz clazz, - Annotation annotation, - ElementValue elementValue) - { - // Do we know the referenced method? - Member referencedMember = elementValue.referencedMethod; - if (referencedMember != null) - { - // Does it have a new name or type? - String methodName = elementValue.getMethodName(clazz); - String newMethodName = referencedMember.getName(elementValue.referencedClass); - - if (!methodName.equals(newMethodName)) - { - // Update the element name index. - elementValue.u2elementNameIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newMethodName); - } - } - } - - - private void debug(Clazz clazz, - StringConstant stringConstant, - Clazz referencedClass, - Member referencedMember) - { - System.out.println("MemberReferenceFixer:"); - System.out.println(" ["+clazz.getName()+"]: String ["+ - stringConstant.getString(clazz)+"] -> ["+ - referencedClass.getName()+"."+referencedMember.getName(referencedClass)+" "+referencedMember.getDescriptor(referencedClass)+"]"); - } - - - private void debug(Clazz clazz, - RefConstant refConstant, - Clazz referencedClass, - Member referencedMember) - { - System.out.println("MemberReferenceFixer:"); - System.out.println(" ["+clazz.getName()+"]: ["+ - refConstant.getClassName(clazz)+"."+refConstant.getName(clazz)+" "+refConstant.getType(clazz)+"] -> ["+ - referencedClass.getName()+"."+referencedMember.getName(referencedClass)+" "+referencedMember.getDescriptor(referencedClass)+"]"); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberRemover.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberRemover.java deleted file mode 100644 index ebb2d1dc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MemberRemover.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -import java.util.*; - - -/** - * This visitor removes all members it visits in a ProgramClass. - * - * It should be used in two steps: - * - in the first step, the collection step, all program fields to be removed - * should be visited. - * - in the second step, the removal step, the program class containing the - * program fields should be visited. This will actually delete all - * collected fields. - * - * For example, to remove all fields in a program class: - * - * MemberRemover remover = new MemberRemover(); - * programClass.fieldsAccept(remover); - * programClass.accept(remover); - * - * @author Johan Leys - */ -public class MemberRemover -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor -{ - private Set methodsToRemove = new HashSet(); - private Set fieldsToRemove = new HashSet(); - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) {} - - - public void visitProgramClass(ProgramClass programClass) - { - ClassEditor classEditor = new ClassEditor(programClass); - - // Remove all collected methods. - for (Method method : methodsToRemove) { - classEditor.removeMethod(method); - } - methodsToRemove.clear(); - - // Remove all collected fields. - for (Field field : fieldsToRemove) { - classEditor.removeField(field); - } - fieldsToRemove.clear(); - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) {} - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - fieldsToRemove.add(programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - methodsToRemove.add(programMethod); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MethodInvocationFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MethodInvocationFixer.java deleted file mode 100644 index 0dce15cc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/MethodInvocationFixer.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; - -/** - * This AttributeVisitor fixes all inappropriate special/virtual/static/interface - * invocations of the code attributes that it visits. - * - * @author Eric Lafortune - */ -public class MethodInvocationFixer -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor -{ - private static final boolean DEBUG = false; - - - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - // Return values for the visitor methods. - private Clazz referencedClass; - private Clazz referencedMethodClass; - private Member referencedMethod; - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Reset the code attribute editor. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Remap the variables of the instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Apply the code atribute editor. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - int constantIndex = constantInstruction.constantIndex; - - // Get information on the called class and method, if present. - referencedMethod = null; - - clazz.constantPoolEntryAccept(constantIndex, this); - - // Did we find the called class and method? - if (referencedClass != null && - referencedMethod != null) - { - // Do we need to update the opcode? - byte opcode = constantInstruction.opcode; - - // Is the method static? - if ((referencedMethod.getAccessFlags() & ClassConstants.ACC_STATIC) != 0) - { - // But is it not a static invocation? - if (opcode != InstructionConstants.OP_INVOKESTATIC) - { - // Replace the invocation by an invokestatic instruction. - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, - constantIndex); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - - if (DEBUG) - { - debug(clazz, method, offset, constantInstruction, replacementInstruction); - } - } - } - - // Is the method private, or an instance initializer? - else if ((referencedMethod.getAccessFlags() & ClassConstants.ACC_PRIVATE) != 0 || - referencedMethod.getName(referencedMethodClass).equals(ClassConstants.METHOD_NAME_INIT)) - { - // But is it not a special invocation? - if (opcode != InstructionConstants.OP_INVOKESPECIAL) - { - // Replace the invocation by an invokespecial instruction. - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, - constantIndex); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - - if (DEBUG) - { - debug(clazz, method, offset, constantInstruction, replacementInstruction); - } - } - } - - // Is the method an interface method? - else if ((referencedClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) != 0) - { - int invokeinterfaceConstant = - (ClassUtil.internalMethodParameterSize(referencedMethod.getDescriptor(referencedMethodClass), false)) << 8; - - if (opcode == InstructionConstants.OP_INVOKESPECIAL && - (referencedMethod.getAccessFlags() & ClassConstants.ACC_ABSTRACT) == 0) - { - // Explicit calls to default interface methods *must* be preserved. - } - // But is it not an interface invocation, or is the parameter - // size incorrect? - else if (opcode != InstructionConstants.OP_INVOKEINTERFACE || - constantInstruction.constant != invokeinterfaceConstant) - { - // Fix the parameter size of the interface invocation. - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_INVOKEINTERFACE, - constantIndex, - invokeinterfaceConstant); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - - if (DEBUG) - { - debug(clazz, method, offset, constantInstruction, replacementInstruction); - } - } - } - - // The method is not static, private, an instance initializer, or - // an interface method. - else - { - // But is it not a virtual invocation? - if (opcode != InstructionConstants.OP_INVOKEVIRTUAL && - (// Replace any non-invokespecial. - opcode != InstructionConstants.OP_INVOKESPECIAL || - // For invokespecial, replace invocations from the same - // class, and invocations to non-superclasses. - clazz.equals(referencedClass) || - !clazz.extends_(referencedClass))) - { - // Replace the invocation by an invokevirtual instruction. - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, - constantIndex); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - - if (DEBUG) - { - debug(clazz, method, offset, constantInstruction, replacementInstruction); - } - } - } - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - // Remember the referenced class. Note that we're interested in the - // class of the method reference, not in the class in which the - // method was actually found, unless it is an array type. - if (ClassUtil.isInternalArrayType(refConstant.getClassName(clazz))) - { - // For an array type, the class will be java.lang.Object. - referencedClass = refConstant.referencedClass; - } - else - { - clazz.constantPoolEntryAccept(refConstant.u2classIndex, this); - } - - // Remember the referenced method. - referencedMethodClass = refConstant.referencedClass; - referencedMethod = refConstant.referencedMember; - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Remember the referenced class. - referencedClass = classConstant.referencedClass; - } - - - // Small utility methods. - - private void debug(Clazz clazz, - Method method, - int offset, - ConstantInstruction constantInstruction, - Instruction replacementInstruction) - { - System.out.println("MethodInvocationFixer ["+clazz.getName()+"."+ - method.getName(clazz)+method.getDescriptor(clazz)+"] "+ - constantInstruction.toString(offset)+" -> "+ - replacementInstruction.toString(offset)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/NameAndTypeShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/NameAndTypeShrinker.java deleted file mode 100644 index 6333a25e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/NameAndTypeShrinker.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.Arrays; - - -/** - * This ClassVisitor removes NameAndType constant pool entries that are not - * used. - * - * @author Eric Lafortune - */ -public class NameAndTypeShrinker -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - AttributeVisitor -{ - // A visitor info flag to indicate the NameAndType constant pool entry is being used. - private static final Object USED = new Object(); - - private int[] constantIndexMap; - private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Mark the NameAndType entries referenced by all other constant pool - // entries. - programClass.constantPoolEntriesAccept(this); - - // Mark the NameAndType entries referenced by all EnclosingMethod - // attributes. - programClass.attributesAccept(this); - - // Shift the used constant pool entries together, filling out the - // index map. - int newConstantPoolCount = - shrinkConstantPool(programClass.constantPool, - programClass.u2constantPoolCount); - - // Remap the references to the constant pool if it has shrunk. - if (newConstantPoolCount < programClass.u2constantPoolCount) - { - programClass.u2constantPoolCount = newConstantPoolCount; - - // Remap all constant pool references. - constantPoolRemapper.setConstantIndexMap(constantIndexMap); - constantPoolRemapper.visitProgramClass(programClass); - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - markNameAndTypeConstant(clazz, invokeDynamicConstant.u2nameAndTypeIndex); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - markNameAndTypeConstant(clazz, refConstant.u2nameAndTypeIndex); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) - { - markNameAndTypeConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex); - } - } - - - // Small utility methods. - - /** - * Marks the given UTF-8 constant pool entry of the given class. - */ - private void markNameAndTypeConstant(Clazz clazz, int index) - { - markAsUsed((NameAndTypeConstant)((ProgramClass)clazz).getConstant(index)); - } - - - /** - * Marks the given VisitorAccepter as being used. - * In this context, the VisitorAccepter will be a NameAndTypeConstant object. - */ - private void markAsUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(USED); - } - - - /** - * Returns whether the given VisitorAccepter has been marked as being used. - * In this context, the VisitorAccepter will be a NameAndTypeConstant object. - */ - private boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } - - - /** - * Removes all NameAndType entries that are not marked as being used - * from the given constant pool. - * @return the new number of entries. - */ - private int shrinkConstantPool(Constant[] constantPool, int length) - { - // Create a new index map, if necessary. - if (constantIndexMap == null || - constantIndexMap.length < length) - { - constantIndexMap = new int[length]; - } - - int counter = 1; - boolean isUsed = false; - - // Shift the used constant pool entries together. - for (int index = 1; index < length; index++) - { - Constant constant = constantPool[index]; - - // Is the constant being used? Don't update the flag if this is the - // second half of a long entry. - if (constant != null) - { - isUsed = constant.getTag() != ClassConstants.CONSTANT_NameAndType || - isUsed(constant); - } - - if (isUsed) - { - // Remember the new index. - constantIndexMap[index] = counter; - - // Shift the constant pool entry. - constantPool[counter++] = constant; - } - else - { - // Remember an invalid index. - constantIndexMap[index] = -1; - } - } - - // Clear the remaining constant pool elements. - Arrays.fill(constantPool, counter, length, null); - - return counter; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/NamedAttributeDeleter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/NamedAttributeDeleter.java deleted file mode 100644 index 0f9b947f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/NamedAttributeDeleter.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - - -/** - * This ClassVisitor deletes attributes with a given name in the program - * classes, fields, methods, or code attributes that it visits. - * - * @author Eric Lafortune - */ -public class NamedAttributeDeleter -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - private final String attributeName; - - - public NamedAttributeDeleter(String attributeName) - { - this.attributeName = attributeName; - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - new AttributesEditor(programClass, false).deleteAttribute(attributeName); - } - - - // Implementations for MemberVisitor. - - public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) {} - - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - new AttributesEditor(programClass, programMember, false).deleteAttribute(attributeName); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - new AttributesEditor((ProgramClass)clazz, (ProgramMember)method, codeAttribute, false).deleteAttribute(attributeName); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ParameterAnnotationsAttributeEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ParameterAnnotationsAttributeEditor.java deleted file mode 100644 index dc5ac497..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ParameterAnnotationsAttributeEditor.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.attribute.annotation.*; -import proguard.util.ArrayUtil; - -/** - * This class can add annotations to a given parameter annotations attribute. - * Annotations to be added must have been filled out beforehand. - * - * @author Eric Lafortune - */ -public class ParameterAnnotationsAttributeEditor -{ - private ParameterAnnotationsAttribute targetParameterAnnotationsAttribute; - - - /** - * Creates a new ParameterAnnotationsAttributeEditor that will edit - * annotations in the given parameter annotations attribute. - */ - public ParameterAnnotationsAttributeEditor(ParameterAnnotationsAttribute targetParameterAnnotationsAttribute) - { - this.targetParameterAnnotationsAttribute = targetParameterAnnotationsAttribute; - } - - - /** - * Adds a given annotation to the annotations attribute. - */ - public void addAnnotation(int parameterIndex, Annotation annotation) - { - ArrayUtil.add(targetParameterAnnotationsAttribute.parameterAnnotations[parameterIndex], - targetParameterAnnotationsAttribute.u2parameterAnnotationsCount[parameterIndex]++, - annotation); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ParameterInfoAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ParameterInfoAdder.java deleted file mode 100644 index 22e399b5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/ParameterInfoAdder.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ParameterInfoVisitor; - -/** - * This ParameterInfoVisitor adds all parameter information that it visits to - * the given target method parameters attribute. - */ -public class ParameterInfoAdder -implements ParameterInfoVisitor -{ - private final ConstantAdder constantAdder; - private final MethodParametersAttribute targetMethodParametersAttribute; - - - /** - * Creates a new ParameterInfoAdder that will copy parameter information - * into the given target method parameters attribute. - */ - public ParameterInfoAdder(ProgramClass targetClass, - MethodParametersAttribute targetMethodParametersAttribute) - { - this.constantAdder = new ConstantAdder(targetClass); - this.targetMethodParametersAttribute = targetMethodParametersAttribute; - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - // Create a new parameter. - int newNameIndex = parameterInfo.u2nameIndex == 0 ? 0 : - constantAdder.addConstant(clazz, parameterInfo.u2nameIndex); - - ParameterInfo newParameterInfo = - new ParameterInfo(newNameIndex, parameterInfo.u2accessFlags); - - // Add it to the target. - targetMethodParametersAttribute.parameters[parameterIndex] = newParameterInfo; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SimplifiedClassEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SimplifiedClassEditor.java deleted file mode 100644 index 90bca8f7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SimplifiedClassEditor.java +++ /dev/null @@ -1,517 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.instruction.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.obfuscate.*; - -import java.util.*; - -import static proguard.classfile.ClassConstants.*; - -/** - * This editor allows to build and/or edit classes (ProgramClass instances). - * It provides methods to easily add fields and methods to classes. - * - * @author Johan Leys - */ -public class SimplifiedClassEditor -extends SimplifiedVisitor -implements - // Implementation interfaces. - AttributeVisitor -{ - private static final String EXTRA_INIT_METHOD_NAME = "init$"; - private static final String EXTRA_INIT_METHOD_DESCRIPTOR = "()V"; - - private final ProgramClass programClass; - private final ClassEditor classEditor; - private final ConstantPoolEditor constantPoolEditor; - private final NameFactory nameFactory; - - private String superClassName; - - private final List methodComposers = new ArrayList(); - - private Instruction[] instructions; - - /** - * Creates a new SimplifiedClassEditor for the Java class with the given - * name. - * - * @param u2accessFlags access flags for the new class. - * @param className the fully qualified name of the new class. - * - * @see ClassConstants - */ - public SimplifiedClassEditor(int u2accessFlags, String className) - { - this(u2accessFlags, className, null); - } - - - /** - * Creates a new SimplifiedClassEditor for the Java class with the given - * name and super class. - * - * @param u2accessFlags access flags for the new class. - * @param className the fully qualified name of the new class. - * @param superclassName the fully qualified name of the super class. - * - * @see ClassConstants - */ - public SimplifiedClassEditor(int u2accessFlags, - String className, - String superclassName) - { - this(new ProgramClass(ClassConstants.CLASS_VERSION_1_2, - 1, - new Constant[10], - u2accessFlags, - 0, - 0)); - - programClass.u2thisClass = - constantPoolEditor.addClassConstant(className, programClass); - - if (superclassName != null) - { - programClass.u2superClass = - constantPoolEditor.addClassConstant(superclassName, null); - this.superClassName = superclassName; - } - } - - - /** - * Creates a new SimplifiedClassEditor for the given class. - * - * @param programClass the class to be edited. - */ - public SimplifiedClassEditor(ProgramClass programClass) - { - this.programClass = programClass; - classEditor = new ClassEditor(programClass); - constantPoolEditor = new ConstantPoolEditor(programClass); - nameFactory = UniqueMemberNameFactory.newInjectedMemberNameFactory(programClass); - } - - - /** - * Finalizes the editing of the class. This method does not initialize - * references to/from related classes. - * At least one of the finishEditing methods should be called before - * calling {@link #getProgramClass}. - * - * @see #finishEditing(ClassPool, ClassPool) - */ - public void finishEditing() { - for (CodeComposer composer : methodComposers) { - composer.finishEditing(); - } - } - - /** - * Finalizes the editing of the class, and initializes all references - * of the edited class w.r.t. the given program and library class pool. - * At least one of the finishEditing methods should be called before - * calling {@link #getProgramClass}. - * - * @param programClassPool the program class pool - * @param libraryClassPool the library class pool - */ - public void finishEditing(ClassPool programClassPool, - ClassPool libraryClassPool) { - for (CodeComposer composer : methodComposers) { - composer.finishEditing(); - } - - // Initialize all references to/from the edited class. - if (superClassName != null) - { - new ClassSuperHierarchyInitializer(programClassPool, libraryClassPool, null, null).visitProgramClass(programClass); - new ClassSubHierarchyInitializer().visitProgramClass(programClass); - } - new ClassReferenceInitializer(programClassPool, libraryClassPool).visitProgramClass(programClass); - } - - /** - * Returns the edited ProgramClass instance. - * Make sure to call one of the finishEditing methods after finishing editing, - * before calling this method. - * - * @return the edited ProgramClass instance. - * - * @see #finishEditing() - * @see #finishEditing(ClassPool, ClassPool) - */ - public ProgramClass getProgramClass() - { - return programClass; - } - - - /** - * Adds the given class constant to the edited class. - * - * @param name the class name to be added. - * @param referencedClass the corresponding referenced class. - * - * @return the constant pool index of the ClassConstant. - */ - public int addClassConstant(String name, - Clazz referencedClass) { - return constantPoolEditor.addClassConstant(name, referencedClass); - } - - /** - * Adds a new field to the edited class. - * - * @param u2accessFlags acces flags for the new field. - * @param fieldName name of the new field. - * @param fieldDescriptor descriptor of the new field. - * - * @return this SimpleClassEditor. - */ - public SimplifiedClassEditor addField(int u2accessFlags, - String fieldName, - String fieldDescriptor) - { - Field field = new ProgramField(u2accessFlags, - constantPoolEditor.addUtf8Constant(fieldName), - constantPoolEditor.addUtf8Constant(fieldDescriptor), - null); - classEditor.addField(field); - return this; - } - - - /** - * Adds a new method to the edited class. The returned composer can be used - * to attach code to the method. - * - * @param u2accessFlags acces flags for the new method. - * @param methodName name of the new method. - * @param methodDescriptor descriptor of the new method. - * @param maxCodeFragmentLength maximum length for the code fragment of the - * new method. - * - * @return the composer for adding code to the created method. - */ - public CompactCodeAttributeComposer addMethod(int u2accessFlags, - String methodName, - String methodDescriptor, - int maxCodeFragmentLength) - { - return addMethod(u2accessFlags, methodName, methodDescriptor, null, maxCodeFragmentLength); - } - - /** - * Adds a new method to the edited class. The returned composer can be used - * to attach code to the method. - * - * @param u2accessFlags acces flags for the new method. - * @param methodName name of the new method. - * @param methodDescriptor descriptor of the new method. - * @param referencedClasses the classes referenced by the method descriptor. - * @param maxCodeFragmentLength maximum length for the code fragment of the - * new method. - * - * @return the composer for adding code to the created method. - */ - public CompactCodeAttributeComposer addMethod(int u2accessFlags, - String methodName, - String methodDescriptor, - Clazz[] referencedClasses, - int maxCodeFragmentLength) - { - ProgramMethod method = new ProgramMethod(u2accessFlags, - constantPoolEditor.addUtf8Constant(methodName), - constantPoolEditor.addUtf8Constant(methodDescriptor), - referencedClasses); - CodeComposer composer = new CodeComposer(method, maxCodeFragmentLength); - methodComposers.add(composer); - return composer; - } - - - /** - * Adds a new method to the edited class, with the given instructions array. - * - * @param u2accessFlags acces flags for the new method. - * @param methodName name of the new method. - * @param methodDescriptor descriptor of the new method. - * @param instructions the instructions of the new method. - */ - public ProgramMethod addMethod(int u2accessFlags, - String methodName, - String methodDescriptor, - Instruction[] instructions) - { - return addMethod(u2accessFlags, methodName, methodDescriptor, instructions, null, null); - } - - - /** - * Adds the given static initializer instructions to the edited class. - * If the class already contains a static initializer, the new instructions - * will be appended to the existing initializer. - * - * @param instructions the instructions to be added. - * @param mergeIntoExistingInitializer indicates whether the instructions should - * be added to the existing static initializer - * (if it exists), or if a new method should - * be created, which is then called from the - * existing initializer. - */ - public void addStaticInitializerInstructions(Instruction[] instructions, - boolean mergeIntoExistingInitializer) - { - Method method = programClass.findMethod(METHOD_NAME_CLINIT, METHOD_TYPE_CLINIT); - - if (method == null) { - addMethod(ACC_STATIC, METHOD_NAME_CLINIT, METHOD_TYPE_CLINIT, - instructions, null, - new SimpleInstruction(InstructionConstants.OP_RETURN)); - } - else { - if (!mergeIntoExistingInitializer) - { - // Create a new static initializer. - ProgramMethod newMethod = - addMethod(ACC_STATIC, - nameFactory.nextName(), "()V", - instructions, - null, - new SimpleInstruction(InstructionConstants.OP_RETURN)); - - // Call the new initializer from the existing one. - InstructionSequenceBuilder builder = new InstructionSequenceBuilder(programClass); - builder.invokestatic(programClass.getName(), - newMethod.getName(programClass), - "()V", - programClass, - newMethod); - instructions = builder.instructions(); - } - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - ((ProgramMethod) method).attributesAccept(programClass, - new CodeAttributeEditorResetter(codeAttributeEditor)); - codeAttributeEditor.insertBeforeOffset(0, instructions); - ((ProgramMethod) method).attributesAccept(programClass, - codeAttributeEditor); - } - } - - /** - * Adds the given initialization instructions to the edited class. - * - * - If the class doesn't contain a constructor yet, it will be created, - * and the instructions will be added to this constructor. - * - If there is a single super-calling constructor, the instructions will - * be added at the beginning of it's code attribute. - * - If there are multiple super-calling constructors, a new private - * parameterless helper method will be created, to which the instructions - * will be added. An invocation to this new method will be added at the - * beginning of the code attribute of all super-calling constructors. - * - * @param instructions the instructions to be added. - */ - public void addInitializerInstructions(Instruction[] instructions) - { - Method method = programClass.findMethod(METHOD_NAME_INIT, null); - - if (method == null) { - // First call the super constructor. - Instruction[] firstInstruction = { - new VariableInstruction(InstructionConstants.OP_ALOAD_0), - new ConstantInstruction( - InstructionConstants.OP_INVOKESPECIAL, - constantPoolEditor.addMethodrefConstant(programClass.getSuperClass().getName(), METHOD_NAME_INIT, METHOD_TYPE_INIT, null, null)) - }; - - // End by calling return. - SimpleInstruction lastInstruction = - new SimpleInstruction(InstructionConstants.OP_RETURN); - - addMethod(ACC_PUBLIC, METHOD_NAME_INIT, METHOD_TYPE_INIT, - instructions, - firstInstruction, - lastInstruction); - } - else { - // Find all super-calling constructors. - Set constructors = new HashSet(); - programClass.methodsAccept( - new ConstructorMethodFilter( - new MethodCollector(constructors), null, null)); - - if (constructors.size() == 1) - { - // There is only one supper-calling constructor. - // Add the code to this constructor. - this.instructions = instructions; - constructors.iterator().next().accept(programClass, - new AllAttributeVisitor( - this)); - } - else - { - // There are multiple super-calling constructors. Add the - // instructions to a separate, parameterless initialization - // method, and invoke this method from all super-calling - // constructors. - ProgramMethod initMethod = (ProgramMethod) programClass.findMethod(EXTRA_INIT_METHOD_NAME, - EXTRA_INIT_METHOD_DESCRIPTOR); - if (initMethod == null) - { - // There is no init$ method yet. Create it now, and add the - // given instructions to it. - initMethod = addMethod(ACC_PRIVATE, - EXTRA_INIT_METHOD_NAME, - EXTRA_INIT_METHOD_DESCRIPTOR, - instructions, - null, - new SimpleInstruction(InstructionConstants.OP_RETURN)); - - // Insert a call to the new init$ method in all super-calling constructors. - InstructionSequenceBuilder builder = new InstructionSequenceBuilder(programClass); - builder.aload_0(); - builder.invokespecial(programClass.getName(), - EXTRA_INIT_METHOD_NAME, - EXTRA_INIT_METHOD_DESCRIPTOR, - programClass, - initMethod); - this.instructions = builder.instructions(); - programClass.methodsAccept( - new ConstructorMethodFilter( - new AllAttributeVisitor( - this), null, null)); - } - else { - // There is already an init$ method. Add the instructions to this method. - this.instructions = instructions; - initMethod.accept(programClass, - new AllAttributeVisitor( - this)); - } - } - } - } - - - /** - * Adds a new method to the edited class, with the given instructions array. - * - * @param u2accessFlags acces flags for the new method. - * @param methodName name of the new method. - * @param methodDescriptor descriptor of the new method. - * @param instructions the instructions of the new method. - * @param firstInstructions extra instructions to add in front of the - * new method. - * @param lastInstruction extra instruction to add at the end of the - * new method. - */ - private ProgramMethod addMethod(int u2accessFlags, - String methodName, - String methodDescriptor, - Instruction[] instructions, - Instruction[] firstInstructions, - Instruction lastInstruction) - { - ProgramMethod method = new ProgramMethod(u2accessFlags, - constantPoolEditor.addUtf8Constant(methodName), - constantPoolEditor.addUtf8Constant(methodDescriptor), - null); - - CodeAttribute codeAttribute = - new CodeAttribute(constantPoolEditor.addUtf8Constant(ClassConstants.ATTR_Code)); - - CodeAttributeComposer composer = new CodeAttributeComposer(); - composer.reset(); - composer.beginCodeFragment(0); - composer.appendInstructions(instructions); - if (firstInstructions != null) { - for (Instruction instruction : firstInstructions) { - composer.appendInstruction(instruction); - } - } - if (lastInstruction != null) { - composer.appendInstruction(lastInstruction); - } - composer.endCodeFragment(); - composer.visitCodeAttribute(programClass, method, codeAttribute); - - new AttributesEditor(programClass, method, false).addAttribute(codeAttribute); - - classEditor.addMethod(method); - - return method; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - ((ProgramMethod) method).attributesAccept(programClass, new CodeAttributeEditorResetter(codeAttributeEditor)); - codeAttributeEditor.insertBeforeOffset(0, instructions); - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - - } - - - private class CodeComposer extends CompactCodeAttributeComposer { - - private final ProgramMethod method; - - public CodeComposer(ProgramMethod method, - int maxCodeFragmentLength) - { - super(programClass); - this.method = method; - beginCodeFragment(maxCodeFragmentLength); - } - - public void finishEditing() { - endCodeFragment(); - - CodeAttribute codeAttribute = - new CodeAttribute(constantPoolEditor.addUtf8Constant(ClassConstants.ATTR_Code)); - - visitCodeAttribute(programClass, method, codeAttribute); - - new AttributesEditor(programClass, method, false).addAttribute(codeAttribute); - - classEditor.addMethod(method); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/StackSizeUpdater.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/StackSizeUpdater.java deleted file mode 100644 index 64a177b3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/StackSizeUpdater.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor computes and updates the maximum stack size of the - * code attributes that it visits. - * - * @author Eric Lafortune - */ -public class StackSizeUpdater -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final StackSizeComputer stackSizeComputer = new StackSizeComputer(); - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Compute the stack sizes. - stackSizeComputer.visitCodeAttribute(clazz, method, codeAttribute); - - // Update the maximum stack size. - codeAttribute.u2maxStack = stackSizeComputer.getMaxStackSize(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SubclassAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SubclassAdder.java deleted file mode 100644 index d07cc6e4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SubclassAdder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor adds the given class to the list of subclasses of the - * classes that it visits. - * - * @author Eric Lafortune - */ -public class SubclassAdder -implements ClassVisitor -{ - private final Clazz subclass; - - - /** - * Creates a new SubclassAdder that will add the given subclass. - */ - public SubclassAdder(Clazz subclass) - { - this.subclass = subclass; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.addSubClass(subclass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.addSubClass(subclass); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SubclassToAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SubclassToAdder.java deleted file mode 100644 index 2085399b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/SubclassToAdder.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor adds all classes that it visits to the list of subclasses - * of the given target class. - * - * @author Eric Lafortune - */ -public class SubclassToAdder -implements ClassVisitor -{ - private final Clazz targetClass; - - - /** - * Creates a new SubclassAdder that will add subclasses to the given - * target class. - */ - public SubclassToAdder(Clazz targetClass) - { - this.targetClass = targetClass; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - targetClass.addSubClass(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - targetClass.addSubClass(libraryClass); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/TargetInfoCopier.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/TargetInfoCopier.java deleted file mode 100644 index f07164cf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/TargetInfoCopier.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.TypeAnnotation; -import proguard.classfile.attribute.annotation.target.*; -import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This TargetInfoVisitor copies the target info instances that it visits to - * the given type annotation (each time overwriting any previous target info). - * - * @author Eric Lafortune - */ -public class TargetInfoCopier -extends SimplifiedVisitor -implements TargetInfoVisitor -{ - private final ProgramClass targetClass; - private final TypeAnnotation targetTypeAnnotation; - - - /** - * Creates a new TargetInfoCopier that will copy target info instances - * to the given target type annotation. - */ - public TargetInfoCopier(ProgramClass targetClass, - TypeAnnotation targetTypeAnnotation) - { - this.targetClass = targetClass; - this.targetTypeAnnotation = targetTypeAnnotation; - } - - - // Implementations for TargetInfoVisitor. - - public void visitTypeParameterTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) - { - targetTypeAnnotation.targetInfo = - new TypeParameterTargetInfo(typeParameterTargetInfo.u1targetType, - typeParameterTargetInfo.u1typeParameterIndex); - } - - - public void visitSuperTypeTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, SuperTypeTargetInfo superTypeTargetInfo) - { - // TODO: The supertype index (= interface number) is probably different in the target class. - targetTypeAnnotation.targetInfo = - new SuperTypeTargetInfo(superTypeTargetInfo.u1targetType, - superTypeTargetInfo.u2superTypeIndex); - } - - - public void visitTypeParameterBoundTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - targetTypeAnnotation.targetInfo = - new TypeParameterBoundTargetInfo(typeParameterBoundTargetInfo.u1targetType, - typeParameterBoundTargetInfo.u1typeParameterIndex, - typeParameterBoundTargetInfo.u1boundIndex); - } - - - public void visitEmptyTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) - { - targetTypeAnnotation.targetInfo = - new EmptyTargetInfo(); - } - - - public void visitFormalParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, FormalParameterTargetInfo formalParameterTargetInfo) - { - targetTypeAnnotation.targetInfo = - new FormalParameterTargetInfo(formalParameterTargetInfo.u1targetType, - formalParameterTargetInfo.u1formalParameterIndex); - } - - - public void visitThrowsTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, ThrowsTargetInfo throwsTargetInfo) - { - targetTypeAnnotation.targetInfo = - new ThrowsTargetInfo(throwsTargetInfo.u1targetType, - throwsTargetInfo.u2throwsTypeIndex); - } - - - public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) - { - LocalVariableTargetElement[] table = - localVariableTargetInfo.table; - - LocalVariableTargetElement[] newTable = - new LocalVariableTargetElement[localVariableTargetInfo.u2tableLength]; - - LocalVariableTargetInfo newLocalVariableTargetInfo = - new LocalVariableTargetInfo(localVariableTargetInfo.u1targetType, - localVariableTargetInfo.u2tableLength, - newTable); - - for (int index = 0; index < localVariableTargetInfo.u2tableLength; index++) - { - LocalVariableTargetElement element = - localVariableTargetInfo.table[index]; - - LocalVariableTargetElement newElement = - new LocalVariableTargetElement(element.u2startPC, - element.u2length, - element.u2index); - - newTable[index] = newElement; - } - - newLocalVariableTargetInfo.table = newTable; - - targetTypeAnnotation.targetInfo = newLocalVariableTargetInfo; - } - - - public void visitCatchTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo catchTargetInfo) - { - targetTypeAnnotation.targetInfo = - new CatchTargetInfo(catchTargetInfo.u1targetType, - catchTargetInfo.u2exceptionTableIndex); - } - - - public void visitOffsetTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo) - { - targetTypeAnnotation.targetInfo = - new OffsetTargetInfo(offsetTargetInfo.u1targetType, - offsetTargetInfo.u2offset); - } - - - public void visitTypeArgumentTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo typeArgumentTargetInfo) - { - targetTypeAnnotation.targetInfo = - new TypeArgumentTargetInfo(typeArgumentTargetInfo.u1targetType, - typeArgumentTargetInfo.u2offset, - typeArgumentTargetInfo.u1typeArgumentIndex); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/TypeAnnotationAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/TypeAnnotationAdder.java deleted file mode 100644 index f0426ef7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/TypeAnnotationAdder.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.TargetInfo; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This TypeAnnotationVisitor adds all type annotations that it visits to the given - * target annotation element value, target annotation attribute, or target - * parameter annotation attribute. - * - * @author Eric Lafortune - */ -public class TypeAnnotationAdder -extends SimplifiedVisitor -implements TypeAnnotationVisitor -{ - private static final ElementValue[] EMPTY_ELEMENT_VALUES = new ElementValue[0]; - - - private final ProgramClass targetClass; - private final AnnotationElementValue targetAnnotationElementValue; - private final AnnotationsAttributeEditor annotationsAttributeEditor; - - private final ConstantAdder constantAdder; - - - /** - * Creates a new TypeAnnotationAdder that will copy annotations into the given - * target annotation element value. - */ - public TypeAnnotationAdder(ProgramClass targetClass, - AnnotationElementValue targetAnnotationElementValue) - { - this.targetClass = targetClass; - this.targetAnnotationElementValue = targetAnnotationElementValue; - this.annotationsAttributeEditor = null; - - constantAdder = new ConstantAdder(targetClass); - } - - - /** - * Creates a new TypeAnnotationAdder that will copy annotations into the given - * target annotations attribute. - */ - public TypeAnnotationAdder(ProgramClass targetClass, - AnnotationsAttribute targetAnnotationsAttribute) - { - this.targetClass = targetClass; - this.targetAnnotationElementValue = null; - this.annotationsAttributeEditor = new AnnotationsAttributeEditor(targetAnnotationsAttribute); - - constantAdder = new ConstantAdder(targetClass); - } - - - // Implementations for AnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - TypePathInfo[] typePath = typeAnnotation.typePath; - TypePathInfo[] newTypePath = new TypePathInfo[typePath.length]; - - TypeAnnotation newTypeAnnotation = - new TypeAnnotation(constantAdder.addConstant(clazz, typeAnnotation.u2typeIndex), - 0, - typeAnnotation.u2elementValuesCount > 0 ? - new ElementValue[typeAnnotation.u2elementValuesCount] : - EMPTY_ELEMENT_VALUES, - null, - newTypePath); - - // TODO: Clone array. - newTypeAnnotation.referencedClasses = typeAnnotation.referencedClasses; - - // Add the element values. - typeAnnotation.elementValuesAccept(clazz, - new ElementValueAdder(targetClass, - newTypeAnnotation, - false)); - - // Set the target info. - typeAnnotation.targetInfo.accept(clazz, - typeAnnotation, - new TargetInfoCopier(targetClass, newTypeAnnotation)); - - // Copy the type path. - for (int index = 0; index < typePath.length; index++) - { - TypePathInfo typePathInfo = typePath[index]; - TypePathInfo newTypePathInfo = new TypePathInfo(typePathInfo.u1typePathKind, - typePathInfo.u1typeArgumentIndex); - - newTypePath[index] = newTypePathInfo; - } - - // What's the target? - if (targetAnnotationElementValue != null) - { - // Simply set the completed annotation. - targetAnnotationElementValue.annotationValue = newTypeAnnotation; - } - else - { - // Add the completed annotation. - annotationsAttributeEditor.addAnnotation(newTypeAnnotation); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/Utf8Shrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/Utf8Shrinker.java deleted file mode 100644 index 9575c3a5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/Utf8Shrinker.java +++ /dev/null @@ -1,486 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -import java.util.Arrays; - - -/** - * This ClassVisitor removes UTF-8 constant pool entries that are not used. - * - * @author Eric Lafortune - */ -public class Utf8Shrinker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor, - AttributeVisitor, - InnerClassesInfoVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - // A visitor info flag to indicate the UTF-8 constant pool entry is being used. - private static final Object USED = new Object(); - - private int[] constantIndexMap = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Mark the UTF-8 entries referenced by the other constant pool entries. - programClass.constantPoolEntriesAccept(this); - - // Mark the UTF-8 entries referenced by the fields and methods. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Mark the UTF-8 entries referenced by the attributes. - programClass.attributesAccept(this); - - // Shift the used constant pool entries together, filling out the - // index map. - int newConstantPoolCount = - shrinkConstantPool(programClass.constantPool, - programClass.u2constantPoolCount); - - // Remap the references to the constant pool if it has shrunk. - if (newConstantPoolCount < programClass.u2constantPoolCount) - { - programClass.u2constantPoolCount = newConstantPoolCount; - - // Remap all constant pool references. - constantPoolRemapper.setConstantIndexMap(constantIndexMap); - constantPoolRemapper.visitProgramClass(programClass); - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Mark the name and descriptor UTF-8 entries. - markCpUtf8Entry(programClass, programMember.u2nameIndex); - markCpUtf8Entry(programClass, programMember.u2descriptorIndex); - - // Mark the UTF-8 entries referenced by the attributes. - programMember.attributesAccept(programClass, this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - markCpUtf8Entry(clazz, stringConstant.u2stringIndex); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - markCpUtf8Entry(clazz, classConstant.u2nameIndex); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - markCpUtf8Entry(clazz, nameAndTypeConstant.u2nameIndex); - markCpUtf8Entry(clazz, nameAndTypeConstant.u2descriptorIndex); - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - // This is the best we can do for unknown attributes. - markCpUtf8Entry(clazz, unknownAttribute.u2attributeNameIndex); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - markCpUtf8Entry(clazz, sourceFileAttribute.u2attributeNameIndex); - - markCpUtf8Entry(clazz, sourceFileAttribute.u2sourceFileIndex); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - markCpUtf8Entry(clazz, sourceDirAttribute.u2attributeNameIndex); - - markCpUtf8Entry(clazz, sourceDirAttribute.u2sourceDirIndex); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - markCpUtf8Entry(clazz, innerClassesAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the inner classes. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - markCpUtf8Entry(clazz, enclosingMethodAttribute.u2attributeNameIndex); - - // These entries have already been marked in the constant pool. - //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2classIndex); - //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2nameAndTypeIndex); - } - - - - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - markCpUtf8Entry(clazz, deprecatedAttribute.u2attributeNameIndex); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - markCpUtf8Entry(clazz, syntheticAttribute.u2attributeNameIndex); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - markCpUtf8Entry(clazz, signatureAttribute.u2attributeNameIndex); - - markCpUtf8Entry(clazz, signatureAttribute.u2signatureIndex); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - markCpUtf8Entry(clazz, constantValueAttribute.u2attributeNameIndex); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - markCpUtf8Entry(clazz, methodParametersAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the parameter information. - methodParametersAttribute.parametersAccept(clazz, method, this); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - markCpUtf8Entry(clazz, exceptionsAttribute.u2attributeNameIndex); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - markCpUtf8Entry(clazz, codeAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the attributes. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - markCpUtf8Entry(clazz, stackMapAttribute.u2attributeNameIndex); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - markCpUtf8Entry(clazz, stackMapTableAttribute.u2attributeNameIndex); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - markCpUtf8Entry(clazz, lineNumberTableAttribute.u2attributeNameIndex); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - markCpUtf8Entry(clazz, localVariableTableAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - markCpUtf8Entry(clazz, localVariableTypeTableAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the local variable types. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - markCpUtf8Entry(clazz, annotationsAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - markCpUtf8Entry(clazz, parameterAnnotationsAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - markCpUtf8Entry(clazz, annotationDefaultAttribute.u2attributeNameIndex); - - // Mark the UTF-8 entries referenced by the element value. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - if (innerClassesInfo.u2innerNameIndex != 0) - { - markCpUtf8Entry(clazz, innerClassesInfo.u2innerNameIndex); - } - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - if (parameterInfo.u2nameIndex != 0) - { - markCpUtf8Entry(clazz, parameterInfo.u2nameIndex); - } - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - markCpUtf8Entry(clazz, localVariableInfo.u2nameIndex); - markCpUtf8Entry(clazz, localVariableInfo.u2descriptorIndex); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - markCpUtf8Entry(clazz, localVariableTypeInfo.u2nameIndex); - markCpUtf8Entry(clazz, localVariableTypeInfo.u2signatureIndex); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - markCpUtf8Entry(clazz, annotation.u2typeIndex); - - // Mark the UTF-8 entries referenced by the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - if (constantElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, constantElementValue.u2elementNameIndex); - } - - // Only the string constant element value refers to a UTF-8 entry. - if (constantElementValue.u1tag == ClassConstants.ELEMENT_VALUE_STRING_CONSTANT) - { - markCpUtf8Entry(clazz, constantElementValue.u2constantValueIndex); - } - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - if (enumConstantElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, enumConstantElementValue.u2elementNameIndex); - } - - markCpUtf8Entry(clazz, enumConstantElementValue.u2typeNameIndex); - markCpUtf8Entry(clazz, enumConstantElementValue.u2constantNameIndex); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - if (classElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, classElementValue.u2elementNameIndex); - } - - markCpUtf8Entry(clazz, classElementValue.u2classInfoIndex); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - if (annotationElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, annotationElementValue.u2elementNameIndex); - } - - // Mark the UTF-8 entries referenced by the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - if (arrayElementValue.u2elementNameIndex != 0) - { - markCpUtf8Entry(clazz, arrayElementValue.u2elementNameIndex); - } - - // Mark the UTF-8 entries referenced by the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - // Small utility methods. - - /** - * Marks the given UTF-8 constant pool entry of the given class. - */ - private void markCpUtf8Entry(Clazz clazz, int index) - { - markAsUsed((Utf8Constant)((ProgramClass)clazz).getConstant(index)); - } - - - /** - * Marks the given VisitorAccepter as being used. - * In this context, the VisitorAccepter will be a Utf8Constant object. - */ - private void markAsUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(USED); - } - - - /** - * Returns whether the given VisitorAccepter has been marked as being used. - * In this context, the VisitorAccepter will be a Utf8Constant object. - */ - private boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } - - - /** - * Removes all UTF-8 entries that are not marked as being used - * from the given constant pool. - * @return the new number of entries. - */ - private int shrinkConstantPool(Constant[] constantPool, int length) - { - // Create a new index map, if necessary. - if (constantIndexMap.length < length) - { - constantIndexMap = new int[length]; - } - - int counter = 1; - boolean isUsed = false; - - // Shift the used constant pool entries together. - for (int index = 1; index < length; index++) - { - Constant constant = constantPool[index]; - - // Is the constant being used? Don't update the flag if this is the - // second half of a long entry. - if (constant != null) - { - isUsed = constant.getTag() != ClassConstants.CONSTANT_Utf8 || - isUsed(constant); - } - - if (isUsed) - { - // Remember the new index. - constantIndexMap[index] = counter; - - // Shift the constant pool entry. - constantPool[counter++] = constant; - } - else - { - // Remember an invalid index. - constantIndexMap[index] = -1; - } - } - - // Clear the remaining constant pool elements. - Arrays.fill(constantPool, counter, length, null); - - return counter; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableCleaner.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableCleaner.java deleted file mode 100644 index abb2b7de..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableCleaner.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Arrays; - -/** - * This AttributeVisitor cleans up variable tables in all code attributes that - * it visits. It trims overlapping local variables. It removes empty local - * variables and empty local variable tables. - * - * @author Eric Lafortune - */ -public class VariableCleaner -extends SimplifiedVisitor -implements AttributeVisitor -{ - private boolean deleteLocalVariableTableAttribute; - private boolean deleteLocalVariableTypeTableAttribute; - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - deleteLocalVariableTableAttribute = false; - deleteLocalVariableTypeTableAttribute = false; - - // Trim the local variable table and the local variable type table. - codeAttribute.attributesAccept(clazz, method, this); - - // Delete the local variable table if it ended up empty. - if (deleteLocalVariableTableAttribute) - { - AttributesEditor editor = - new AttributesEditor((ProgramClass)clazz, - (ProgramMember)method, - codeAttribute, - true); - - editor.deleteAttribute(ClassConstants.ATTR_LocalVariableTable); - } - - // Delete the local variable type table if it ended up empty. - if (deleteLocalVariableTypeTableAttribute) - { - AttributesEditor editor = - new AttributesEditor((ProgramClass)clazz, - (ProgramMember)method, - codeAttribute, - true); - - editor.deleteAttribute(ClassConstants.ATTR_LocalVariableTypeTable); - } - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Clean up local variables that aren't used. - localVariableTableAttribute.u2localVariableTableLength = - removeUnusedLocalVariables(localVariableTableAttribute.localVariableTable, - localVariableTableAttribute.u2localVariableTableLength, - codeAttribute.u2maxLocals); - - // Trim the code blocks of the local variables. - trimLocalVariables(localVariableTableAttribute.localVariableTable, - localVariableTableAttribute.u2localVariableTableLength, - codeAttribute.u2maxLocals); - - // Delete the attribute in a moment, if it is empty. - if (localVariableTableAttribute.u2localVariableTableLength == 0) - { - deleteLocalVariableTableAttribute = true; - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Clean up local variables that aren't used. - localVariableTypeTableAttribute.u2localVariableTypeTableLength = - removeUnusedLocalVariableTypes(localVariableTypeTableAttribute.localVariableTypeTable, - localVariableTypeTableAttribute.u2localVariableTypeTableLength, - codeAttribute.u2maxLocals); - - // Trim the code blocks of the local variables. - trimLocalVariableTypes(localVariableTypeTableAttribute.localVariableTypeTable, - localVariableTypeTableAttribute.u2localVariableTypeTableLength, - codeAttribute.u2maxLocals); - - // Delete the attribute in a moment, if it is empty. - if (localVariableTypeTableAttribute.u2localVariableTypeTableLength == 0) - { - deleteLocalVariableTypeTableAttribute = true; - } - } - - - // Small utility methods. - - /** - * Returns the given list of local variables, without the ones that aren't - * used. - */ - private int removeUnusedLocalVariables(LocalVariableInfo[] localVariableInfos, - int localVariableInfoCount, - int maxLocals) - { - // Overwrite all empty local variable entries. - // Do keep parameter entries. - int newIndex = 0; - for (int index = 0; index < localVariableInfoCount; index++) - { - LocalVariableInfo localVariableInfo = localVariableInfos[index]; - - if (localVariableInfo.u2index >= 0 && - localVariableInfo.u2index < maxLocals && - (localVariableInfo.u2startPC == 0 || - localVariableInfo.u2length > 0)) - { - localVariableInfos[newIndex++] = localVariableInfos[index]; - } - } - - // Clean up any remaining array elements. - Arrays.fill(localVariableInfos, newIndex, localVariableInfoCount, null); - - return newIndex; - } - - - /** - * Returns the given list of local variable types, without the ones that - * aren't used. - */ - private int removeUnusedLocalVariableTypes(LocalVariableTypeInfo[] localVariableTypeInfos, - int localVariableTypeInfoCount, - int maxLocals) - { - // Overwrite all empty local variable type entries. - // Do keep parameter entries. - int newIndex = 0; - for (int index = 0; index < localVariableTypeInfoCount; index++) - { - LocalVariableTypeInfo localVariableTypeInfo = localVariableTypeInfos[index]; - - if (localVariableTypeInfo.u2index >= 0 && - localVariableTypeInfo.u2index < maxLocals && - (localVariableTypeInfo.u2startPC == 0 || - localVariableTypeInfo.u2length > 0)) - { - localVariableTypeInfos[newIndex++] = localVariableTypeInfos[index]; - } - } - - // Clean up any remaining array elements. - Arrays.fill(localVariableTypeInfos, newIndex, localVariableTypeInfoCount, null); - - return newIndex; - } - - - /** - * Sorts the given list of local variables and trims their code blocks - * when necessary. The block is trimmed at the end, which is a bit - * arbitrary. - */ - private void trimLocalVariables(LocalVariableInfo[] localVariableInfos, - int localVariableInfoCount, - int maxLocals) - { - // Sort the local variable entries. - Arrays.sort(localVariableInfos, 0, localVariableInfoCount); - - int[] startPCs = createMaxArray(maxLocals); - - // Trim the local variable entries, starting at the last one. - for (int index = localVariableInfoCount-1; index >= 0; index--) - { - LocalVariableInfo localVariableInfo = localVariableInfos[index]; - - // Make sure the variable's code block doesn't overlap with the - // next one for the same variable. - int maxLength = startPCs[localVariableInfo.u2index] - - localVariableInfo.u2startPC; - - if (localVariableInfo.u2length > maxLength) - { - localVariableInfo.u2length = maxLength; - } - - startPCs[localVariableInfo.u2index] = localVariableInfo.u2startPC; - } - } - - - /** - * Sorts the given list of local variable types and trims their code blocks - * when necessary. The block is trimmed at the end, which is a bit - * arbitrary. - */ - private void trimLocalVariableTypes(LocalVariableTypeInfo[] localVariableTypeInfos, - int localVariableTypeInfoCount, - int maxLocals) - { - // Sort the local variable entries. - Arrays.sort(localVariableTypeInfos, 0, localVariableTypeInfoCount); - - int[] startPCs = createMaxArray(maxLocals); - - // Trim the local variable entries, starting at the last one. - for (int index = localVariableTypeInfoCount-1; index >= 0; index--) - { - LocalVariableTypeInfo localVariableTypeInfo = localVariableTypeInfos[index]; - - // Make sure the variable's code block doesn't overlap with the - // next one for the same variable. - int maxLength = startPCs[localVariableTypeInfo.u2index] - - localVariableTypeInfo.u2startPC; - - if (localVariableTypeInfo.u2length > maxLength) - { - localVariableTypeInfo.u2length = maxLength; - } - - startPCs[localVariableTypeInfo.u2index] = localVariableTypeInfo.u2startPC; - } - } - - - /** - * Creates an integer array of the given length, initialized with - * Integer.MAX_VALUE. - */ - private int[] createMaxArray(int length) - { - int[] startPCs = new int[length]; - for (int index = 0; index < length; index++) - { - startPCs[index] = Integer.MAX_VALUE; - } - return startPCs; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableEditor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableEditor.java deleted file mode 100644 index 73e8197a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableEditor.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Arrays; - -/** - * This AttributeVisitor accumulates specified changes to local variables, and - * then applies these accumulated changes to the code attributes that it visits. - * - * @author Eric Lafortune - */ -public class VariableEditor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private boolean modified; - - private boolean[] deleted = new boolean[ClassConstants.TYPICAL_VARIABLES_SIZE]; - private int[] variableMap = new int[ClassConstants.TYPICAL_VARIABLES_SIZE]; - - private final VariableRemapper variableRemapper = new VariableRemapper(); - - - /** - * Resets the accumulated code changes. - * @param maxLocals the length of the local variable frame that will be - * edited next. - */ - public void reset(int maxLocals) - { - // Try to reuse the previous array. - if (deleted.length < maxLocals) - { - // Create a new array. - deleted = new boolean[maxLocals]; - } - else - { - // Reset the array. - Arrays.fill(deleted, 0, maxLocals, false); - } - - modified = false; - } - - - /** - * Remembers to delete the given variable. - * @param variableIndex the index of the variable to be deleted. - */ - public void deleteVariable(int variableIndex) - { - deleted[variableIndex] = true; - - modified = true; - } - - - /** - * Returns whether the given variable at the given offset will be deleted. - */ - public boolean isDeleted(int instructionOffset) - { - return deleted[instructionOffset]; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Avoid doing any work if nothing is changing anyway. - if (!modified) - { - return; - } - - int oldMaxLocals = codeAttribute.u2maxLocals; - - // Make sure there is a sufficiently large variable map. - if (variableMap.length < oldMaxLocals) - { - variableMap = new int[oldMaxLocals]; - } - - // Fill out the variable map. - int newVariableIndex = 0; - for (int oldVariableIndex = 0; oldVariableIndex < oldMaxLocals; oldVariableIndex++) - { - variableMap[oldVariableIndex] = deleted[oldVariableIndex] ? - -1 : newVariableIndex++; - } - - // Set the map. - variableRemapper.setVariableMap(variableMap); - - // Remap the variables. - variableRemapper.visitCodeAttribute(clazz, method, codeAttribute); - - // Update the length of local variable frame. - codeAttribute.u2maxLocals = newVariableIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableRemapper.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableRemapper.java deleted file mode 100644 index 26e93b4e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableRemapper.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.*; -import proguard.classfile.attribute.annotation.target.visitor.*; -import proguard.classfile.attribute.annotation.visitor.TypeAnnotationVisitor; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor remaps variable indexes in all attributes that it - * visits, based on a given index map. - * - * @author Eric Lafortune - */ -public class VariableRemapper -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - TypeAnnotationVisitor, - TargetInfoVisitor, - LocalVariableTargetElementVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("vr") != null; - //*/ - - - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - private int[] variableMap; - - - /** - * Sets the given mapping of old variable indexes to their new indexes. - * Variables that should disappear can be mapped to -1. - */ - public void setVariableMap(int[] variableMap) - { - this.variableMap = variableMap; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - // Reorder the array with parameter information. - ParameterInfo[] oldParameters = methodParametersAttribute.parameters; - ParameterInfo[] newParameters = - new ParameterInfo[methodParametersAttribute.u1parametersCount]; - - for (int index = 0; index < methodParametersAttribute.u1parametersCount; index++) - { - newParameters[remapVariable(index)] = oldParameters[index]; - } - - methodParametersAttribute.parameters = newParameters; - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("VariableRemapper: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - for (int index= 0; index < codeAttribute.u2maxLocals; index++) - { - System.out.println(" v"+index+" -> "+variableMap[index]); - } - } - - // Remap the variables of the attributes, before editing the code and - // cleaning up its local variable frame. - codeAttribute.attributesAccept(clazz, method, this); - - // Initially, the code attribute editor doesn't contain any changes. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Remap the variables of the instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Apply the code atribute editor. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Remap the variable references of the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Remap the variable references of the local variables. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyTypeAnnotationsAttribute(Clazz clazz, TypeAnnotationsAttribute typeAnnotationsAttribute) - { - // Remap the variable references of local variable type annotations. - typeAnnotationsAttribute.typeAnnotationsAccept(clazz, this); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - localVariableInfo.u2index = - remapVariable(localVariableInfo.u2index); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - localVariableTypeInfo.u2index = - remapVariable(localVariableTypeInfo.u2index); - } - - - // Implementations for TypeAnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - typeAnnotation.targetInfoAccept(clazz, this); - } - - - // Implementations for TargetInfoVisitor. - - public void visitAnyTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfo targetInfo) {} - - - public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) - { - localVariableTargetInfo.targetElementsAccept(clazz, method, codeAttribute, typeAnnotation, this); - } - - - // Implementations for LocalVariableTargetElementVisitor. - - public void visitLocalVariableTargetElement(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo, LocalVariableTargetElement localVariableTargetElement) - { - localVariableTargetElement.u2index = - remapVariable(localVariableTargetElement.u2index); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - // Is the new variable index different from the original one? - int oldVariableIndex = variableInstruction.variableIndex; - int newVariableIndex = remapVariable(oldVariableIndex); - if (newVariableIndex != oldVariableIndex) - { - // Replace the instruction. - Instruction replacementInstruction = - new VariableInstruction(variableInstruction.opcode, - newVariableIndex, - variableInstruction.constant); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - } - } - - - // Small utility methods. - - /** - * Returns the new variable index of the given variable. - */ - private int remapVariable(int variableIndex) - { - return variableMap[variableIndex]; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableSizeUpdater.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableSizeUpdater.java deleted file mode 100644 index a4524eb8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/VariableSizeUpdater.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.editor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; - -/** - * This AttributeVisitor computes and updates the maximum local variable frame - * size of the code attributes that it visits. It also cleans up the local - * variable tables. - * - * @author Eric Lafortune - */ -public class VariableSizeUpdater -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - - private VariableCleaner variableCleaner = new VariableCleaner(); - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // The minimum variable size is determined by the arguments. - codeAttribute.u2maxLocals = - ClassUtil.internalMethodParameterSize(method.getDescriptor(clazz), - method.getAccessFlags()); - - if (DEBUG) - { - System.out.println("VariableSizeUpdater: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - System.out.println(" Max locals: "+codeAttribute.u2maxLocals+" <- parameters"); - } - - // Go over all instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Remove the unused variables of the attributes. - variableCleaner.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - int variableSize = variableInstruction.variableIndex + 1; - if (variableInstruction.isCategory2()) - { - variableSize++; - } - - if (codeAttribute.u2maxLocals < variableSize) - { - codeAttribute.u2maxLocals = variableSize; - - if (DEBUG) - { - System.out.println(" Max locals: "+codeAttribute.u2maxLocals+" <- "+variableInstruction.toString(offset)); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/package.html deleted file mode 100644 index d37f541f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/editor/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains visitors to edit byte code. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/BranchInstruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/BranchInstruction.java deleted file mode 100644 index c0fa03a2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/BranchInstruction.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -/** - * This interface describes an instruction that branches to a given offset in - * the code. - * - * @author Eric Lafortune - */ -public class BranchInstruction extends Instruction -{ - public int branchOffset; - - - /** - * Creates an uninitialized BranchInstruction. - */ - public BranchInstruction() {} - - - /** - * Creates a BranchInstruction with the given branch offset. - * The branch offset is relative to this instruction's offset. - */ - public BranchInstruction(byte opcode, int branchOffset) - { - this.opcode = opcode; - this.branchOffset = branchOffset; - } - - - /** - * Copies the given instruction into this instruction. - * @param branchInstruction the instruction to be copied. - * @return this instruction. - */ - public BranchInstruction copy(BranchInstruction branchInstruction) - { - this.opcode = branchInstruction.opcode; - this.branchOffset = branchInstruction.branchOffset; - - return this; - } - - - // Implementations for Instruction. - - public byte canonicalOpcode() - { - // Remove the _w extension, if any. - switch (opcode) - { - case InstructionConstants.OP_GOTO_W: return InstructionConstants.OP_GOTO; - - case InstructionConstants.OP_JSR_W: return InstructionConstants.OP_JSR; - - default: return opcode; - } - } - - public Instruction shrink() - { - // Do we need an ordinary branch or a wide branch? - if (requiredBranchOffsetSize() == 2) - { - // Can we replace the wide branch by an ordinary branch? - if (opcode == InstructionConstants.OP_GOTO_W) - { - opcode = InstructionConstants.OP_GOTO; - } - else if (opcode == InstructionConstants.OP_JSR_W) - { - opcode = InstructionConstants.OP_JSR; - } - } - else - { - // Can we provide a wide branch? - if (opcode == InstructionConstants.OP_GOTO || - opcode == InstructionConstants.OP_GOTO_W) - { - opcode = InstructionConstants.OP_GOTO_W; - } - else if (opcode == InstructionConstants.OP_JSR) - { - opcode = InstructionConstants.OP_JSR_W; - } - else - { - throw new IllegalArgumentException("Branch instruction can't be widened ("+this.toString()+")"); - } - } - - return this; - } - - protected void readInfo(byte[] code, int offset) - { - branchOffset = readSignedValue(code, offset, branchOffsetSize()); - } - - - protected void writeInfo(byte[] code, int offset) - { - if (requiredBranchOffsetSize() > branchOffsetSize()) - { - throw new IllegalArgumentException("Instruction has invalid branch offset size ("+this.toString(offset)+")"); - } - - writeSignedValue(code, offset, branchOffset, branchOffsetSize()); - } - - - public int length(int offset) - { - return 1 + branchOffsetSize(); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - instructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, this); - } - - - public String toString(int offset) - { - return "["+offset+"] "+toString()+" (target="+(offset+branchOffset)+")"; - } - - - // Implementations for Object. - - public String toString() - { - return getName()+" "+(branchOffset >= 0 ? "+" : "")+branchOffset; - } - - - // Small utility methods. - - /** - * Returns the branch offset size for this instruction. - */ - private int branchOffsetSize() - { - return opcode == InstructionConstants.OP_GOTO_W || - opcode == InstructionConstants.OP_JSR_W ? 4 : - 2; - } - - - /** - * Computes the required branch offset size for this instruction's branch - * offset. - */ - private int requiredBranchOffsetSize() - { - return (short)branchOffset == branchOffset ? 2 : 4; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/ConstantInstruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/ConstantInstruction.java deleted file mode 100644 index 8377cda7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/ConstantInstruction.java +++ /dev/null @@ -1,312 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.ClassUtil; - -/** - * This Instruction represents an instruction that refers to an entry in the - * constant pool. - * - * @author Eric Lafortune - */ -public class ConstantInstruction extends Instruction -implements ConstantVisitor -{ - public int constantIndex; - public int constant; - - - // Fields acting as return parameters for the ConstantVisitor methods. - private int parameterStackDelta; - private int typeStackDelta; - - - /** - * Creates an uninitialized ConstantInstruction. - */ - public ConstantInstruction() {} - - - /** - * Creates a new ConstantInstruction with the given opcode and constant pool - * index. - */ - public ConstantInstruction(byte opcode, int constantIndex) - { - this(opcode, constantIndex, 0); - } - - - /** - * Creates a new ConstantInstruction with the given opcode, constant pool - * index, and constant. - */ - public ConstantInstruction(byte opcode, int constantIndex, int constant) - { - this.opcode = opcode; - this.constantIndex = constantIndex; - this.constant = constant; - } - - - /** - * Copies the given instruction into this instruction. - * @param constantInstruction the instruction to be copied. - * @return this instruction. - */ - public ConstantInstruction copy(ConstantInstruction constantInstruction) - { - this.opcode = constantInstruction.opcode; - this.constantIndex = constantInstruction.constantIndex; - this.constant = constantInstruction.constant; - - return this; - } - - - // Implementations for Instruction. - - public byte canonicalOpcode() - { - // Remove the _w extension, if any. - return - opcode == InstructionConstants.OP_LDC_W ? InstructionConstants.OP_LDC : - opcode; - } - - public Instruction shrink() - { - // Do we need a short index or a long index? - if (requiredConstantIndexSize() == 1) - { - // Can we replace the long instruction by a short instruction? - if (opcode == InstructionConstants.OP_LDC_W) - { - opcode = InstructionConstants.OP_LDC; - } - } - else - { - // Should we replace the short instruction by a long instruction? - if (opcode == InstructionConstants.OP_LDC) - { - opcode = InstructionConstants.OP_LDC_W; - } - } - - return this; - } - - protected void readInfo(byte[] code, int offset) - { - int constantIndexSize = constantIndexSize(); - int constantSize = constantSize(); - - constantIndex = readValue(code, offset, constantIndexSize); offset += constantIndexSize; - constant = readValue(code, offset, constantSize); - } - - - protected void writeInfo(byte[] code, int offset) - { - int constantIndexSize = constantIndexSize(); - int constantSize = constantSize(); - - if (requiredConstantIndexSize() > constantIndexSize) - { - throw new IllegalArgumentException("Instruction has invalid constant index size ("+this.toString(offset)+")"); - } - - writeValue(code, offset, constantIndex, constantIndexSize); offset += constantIndexSize; - writeValue(code, offset, constant, constantSize); - } - - - public int length(int offset) - { - return 1 + constantIndexSize() + constantSize(); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - instructionVisitor.visitConstantInstruction(clazz, method, codeAttribute, offset, this); - } - - - public int stackPopCount(Clazz clazz) - { - int stackPopCount = super.stackPopCount(clazz); - - // Some special cases. - switch (opcode) - { - case InstructionConstants.OP_MULTIANEWARRAY: - // For each dimension, an integer size is popped from the stack. - stackPopCount += constant; - break; - - case InstructionConstants.OP_PUTSTATIC: - case InstructionConstants.OP_PUTFIELD: - // The field value is be popped from the stack. - clazz.constantPoolEntryAccept(constantIndex, this); - stackPopCount += typeStackDelta; - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - case InstructionConstants.OP_INVOKEDYNAMIC: - // Some parameters may be popped from the stack. - clazz.constantPoolEntryAccept(constantIndex, this); - stackPopCount += parameterStackDelta; - break; - } - - return stackPopCount; - } - - - public int stackPushCount(Clazz clazz) - { - int stackPushCount = super.stackPushCount(clazz); - - // Some special cases. - switch (opcode) - { - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_GETFIELD: - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - case InstructionConstants.OP_INVOKEDYNAMIC: - // The field value or a return value may be pushed onto the stack. - clazz.constantPoolEntryAccept(constantIndex, this); - stackPushCount += typeStackDelta; - break; - } - - return stackPushCount; - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) {} - public void visitLongConstant(Clazz clazz, LongConstant longConstant) {} - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) {} - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) {} - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) {} - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) {} - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) {} - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) {} - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) {} - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) {} - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) {} - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) {} - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - String type = fieldrefConstant.getType(clazz); - - typeStackDelta = ClassUtil.internalTypeSize(ClassUtil.internalMethodReturnType(type)); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - clazz.constantPoolEntryAccept(invokeDynamicConstant.u2nameAndTypeIndex, this); - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - clazz.constantPoolEntryAccept(interfaceMethodrefConstant.u2nameAndTypeIndex, this); - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - clazz.constantPoolEntryAccept(methodrefConstant.u2nameAndTypeIndex, this); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - String type = nameAndTypeConstant.getType(clazz); - - parameterStackDelta = ClassUtil.internalMethodParameterSize(type); - typeStackDelta = ClassUtil.internalTypeSize(ClassUtil.internalMethodReturnType(type)); - } - - - // Implementations for Object. - - public String toString() - { - return getName()+" #"+constantIndex+(constantSize() == 0 ? "" : ", "+constant); - } - - - // Small utility methods. - - /** - * Returns the constant pool index size for this instruction. - */ - private int constantIndexSize() - { - return opcode == InstructionConstants.OP_LDC ? 1 : - 2; - } - - - /** - * Returns the constant size for this instruction. - */ - private int constantSize() - { - return opcode == InstructionConstants.OP_MULTIANEWARRAY ? 1 : - opcode == InstructionConstants.OP_INVOKEDYNAMIC || - opcode == InstructionConstants.OP_INVOKEINTERFACE ? 2 : - 0; - } - - - /** - * Computes the required constant pool index size for this instruction's - * constant pool index. - */ - private int requiredConstantIndexSize() - { - return (constantIndex & 0xff) == constantIndex ? 1 : - (constantIndex & 0xffff) == constantIndex ? 2 : - 4; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/Instruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/Instruction.java deleted file mode 100644 index 2f8a304b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/Instruction.java +++ /dev/null @@ -1,1137 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -/** - * Base class for representing instructions. - * - * @author Eric Lafortune - */ -public abstract class Instruction -{ - // An array for marking instructions that may throw exceptions. - private static final boolean[] MAY_THROW_EXCEPTIONS = new boolean[] - { - false, // nop - false, // aconst_null - false, // iconst_m1 - false, // iconst_0 - false, // iconst_1 - false, // iconst_2 - false, // iconst_3 - false, // iconst_4 - false, // iconst_5 - false, // lconst_0 - false, // lconst_1 - false, // fconst_0 - false, // fconst_1 - false, // fconst_2 - false, // dconst_0 - false, // dconst_1 - false, // bipush - false, // sipush - false, // ldc - false, // ldc_w - false, // ldc2_w - false, // iload - false, // lload - false, // fload - false, // dload - false, // aload - false, // iload_0 - false, // iload_1 - false, // iload_2 - false, // iload_3 - false, // lload_0 - false, // lload_1 - false, // lload_2 - false, // lload_3 - false, // fload_0 - false, // fload_1 - false, // fload_2 - false, // fload_3 - false, // dload_0 - false, // dload_1 - false, // dload_2 - false, // dload_3 - false, // aload_0 - false, // aload_1 - false, // aload_2 - false, // aload_3 - true, // iaload - true, // laload - true, // faload - true, // daload - true, // aaload - true, // baload - true, // caload - true, // saload - false, // istore - false, // lstore - false, // fstore - false, // dstore - false, // astore - false, // istore_0 - false, // istore_1 - false, // istore_2 - false, // istore_3 - false, // lstore_0 - false, // lstore_1 - false, // lstore_2 - false, // lstore_3 - false, // fstore_0 - false, // fstore_1 - false, // fstore_2 - false, // fstore_3 - false, // dstore_0 - false, // dstore_1 - false, // dstore_2 - false, // dstore_3 - false, // astore_0 - false, // astore_1 - false, // astore_2 - false, // astore_3 - true, // iastore - true, // lastore - true, // fastore - true, // dastore - true, // aastore - true, // bastore - true, // castore - true, // sastore - false, // pop - false, // pop2 - false, // dup - false, // dup_x1 - false, // dup_x2 - false, // dup2 - false, // dup2_x1 - false, // dup2_x2 - false, // swap - false, // iadd - false, // ladd - false, // fadd - false, // dadd - false, // isub - false, // lsub - false, // fsub - false, // dsub - false, // imul - false, // lmul - false, // fmul - false, // dmul - true, // idiv - true, // ldiv - false, // fdiv - false, // ddiv - true, // irem - true, // lrem - false, // frem - false, // drem - false, // ineg - false, // lneg - false, // fneg - false, // dneg - false, // ishl - false, // lshl - false, // ishr - false, // lshr - false, // iushr - false, // lushr - false, // iand - false, // land - false, // ior - false, // lor - false, // ixor - false, // lxor - false, // iinc - false, // i2l - false, // i2f - false, // i2d - false, // l2i - false, // l2f - false, // l2d - false, // f2i - false, // f2l - false, // f2d - false, // d2i - false, // d2l - false, // d2f - false, // i2b - false, // i2c - false, // i2s - false, // lcmp - false, // fcmpl - false, // fcmpg - false, // dcmpl - false, // dcmpg - false, // ifeq - false, // ifne - false, // iflt - false, // ifge - false, // ifgt - false, // ifle - false, // ificmpeq - false, // ificmpne - false, // ificmplt - false, // ificmpge - false, // ificmpgt - false, // ificmple - false, // ifacmpeq - false, // ifacmpne - false, // goto - false, // jsr - false, // ret - false, // tableswitch - false, // lookupswitch - false, // ireturn - false, // lreturn - false, // freturn - false, // dreturn - false, // areturn - false, // return - true, // getstatic - true, // putstatic - true, // getfield - true, // putfield - true, // invokevirtual - true, // invokespecial - true, // invokestatic - true, // invokeinterface - true, // invokedynamic - true, // new - true, // newarray - true, // anewarray - true, // arraylength - true, // athrow - true, // checkcast - false, // instanceof - true, // monitorenter - true, // monitorexit - false, // wide - true, // multianewarray - false, // ifnull - false, // ifnonnull - false, // goto_w - false, // jsr_w - }; - - - // An array for marking Category 2 instructions. - private static final boolean[] IS_CATEGORY2 = new boolean[] - { - false, // nop - false, // aconst_null - false, // iconst_m1 - false, // iconst_0 - false, // iconst_1 - false, // iconst_2 - false, // iconst_3 - false, // iconst_4 - false, // iconst_5 - true, // lconst_0 - true, // lconst_1 - false, // fconst_0 - false, // fconst_1 - false, // fconst_2 - true, // dconst_0 - true, // dconst_1 - false, // bipush - false, // sipush - false, // ldc - false, // ldc_w - true, // ldc2_w - false, // iload - true, // lload - false, // fload - true, // dload - false, // aload - false, // iload_0 - false, // iload_1 - false, // iload_2 - false, // iload_3 - true, // lload_0 - true, // lload_1 - true, // lload_2 - true, // lload_3 - false, // fload_0 - false, // fload_1 - false, // fload_2 - false, // fload_3 - true, // dload_0 - true, // dload_1 - true, // dload_2 - true, // dload_3 - false, // aload_0 - false, // aload_1 - false, // aload_2 - false, // aload_3 - false, // iaload - true, // laload - false, // faload - true, // daload - false, // aaload - false, // baload - false, // caload - false, // saload - false, // istore - true, // lstore - false, // fstore - true, // dstore - false, // astore - false, // istore_0 - false, // istore_1 - false, // istore_2 - false, // istore_3 - true, // lstore_0 - true, // lstore_1 - true, // lstore_2 - true, // lstore_3 - false, // fstore_0 - false, // fstore_1 - false, // fstore_2 - false, // fstore_3 - true, // dstore_0 - true, // dstore_1 - true, // dstore_2 - true, // dstore_3 - false, // astore_0 - false, // astore_1 - false, // astore_2 - false, // astore_3 - false, // iastore - true, // lastore - false, // fastore - true, // dastore - false, // aastore - false, // bastore - false, // castore - false, // sastore - false, // pop - true, // pop2 - false, // dup - false, // dup_x1 - false, // dup_x2 - true, // dup2 - true, // dup2_x1 - true, // dup2_x2 - false, // swap - false, // iadd - true, // ladd - false, // fadd - true, // dadd - false, // isub - true, // lsub - false, // fsub - true, // dsub - false, // imul - true, // lmul - false, // fmul - true, // dmul - false, // idiv - true, // ldiv - false, // fdiv - true, // ddiv - false, // irem - true, // lrem - false, // frem - true, // drem - false, // ineg - true, // lneg - false, // fneg - true, // dneg - false, // ishl - true, // lshl - false, // ishr - true, // lshr - false, // iushr - true, // lushr - false, // iand - true, // land - false, // ior - true, // lor - false, // ixor - true, // lxor - false, // iinc - false, // i2l - false, // i2f - false, // i2d - true, // l2i - true, // l2f - true, // l2d - false, // f2i - false, // f2l - false, // f2d - true, // d2i - true, // d2l - true, // d2f - false, // i2b - false, // i2c - false, // i2s - true, // lcmp - false, // fcmpl - false, // fcmpg - true, // dcmpl - true, // dcmpg - false, // ifeq - false, // ifne - false, // iflt - false, // ifge - false, // ifgt - false, // ifle - false, // ificmpeq - false, // ificmpne - false, // ificmplt - false, // ificmpge - false, // ificmpgt - false, // ificmple - false, // ifacmpeq - false, // ifacmpne - false, // goto - false, // jsr - false, // ret - false, // tableswitch - false, // lookupswitch - false, // ireturn - true, // lreturn - false, // freturn - true, // dreturn - false, // areturn - false, // return - false, // getstatic - false, // putstatic - false, // getfield - false, // putfield - false, // invokevirtual - false, // invokespecial - false, // invokestatic - false, // invokeinterface - false, // invokedynamic - false, // new - false, // newarray - false, // anewarray - false, // arraylength - false, // athrow - false, // checkcast - false, // instanceof - false, // monitorenter - false, // monitorexit - false, // wide - false, // multianewarray - false, // ifnull - false, // ifnonnull - false, // goto_w - false, // jsr_w - }; - - - // An array containing the fixed number of entries popped from the stack, - // for all instructions. - private static final int[] STACK_POP_COUNTS = new int[] - { - 0, // nop - 0, // aconst_null - 0, // iconst_m1 - 0, // iconst_0 - 0, // iconst_1 - 0, // iconst_2 - 0, // iconst_3 - 0, // iconst_4 - 0, // iconst_5 - 0, // lconst_0 - 0, // lconst_1 - 0, // fconst_0 - 0, // fconst_1 - 0, // fconst_2 - 0, // dconst_0 - 0, // dconst_1 - 0, // bipush - 0, // sipush - 0, // ldc - 0, // ldc_w - 0, // ldc2_w - 0, // iload - 0, // lload - 0, // fload - 0, // dload - 0, // aload - 0, // iload_0 - 0, // iload_1 - 0, // iload_2 - 0, // iload_3 - 0, // lload_0 - 0, // lload_1 - 0, // lload_2 - 0, // lload_3 - 0, // fload_0 - 0, // fload_1 - 0, // fload_2 - 0, // fload_3 - 0, // dload_0 - 0, // dload_1 - 0, // dload_2 - 0, // dload_3 - 0, // aload_0 - 0, // aload_1 - 0, // aload_2 - 0, // aload_3 - 2, // iaload - 2, // laload - 2, // faload - 2, // daload - 2, // aaload - 2, // baload - 2, // caload - 2, // saload - 1, // istore - 2, // lstore - 1, // fstore - 2, // dstore - 1, // astore - 1, // istore_0 - 1, // istore_1 - 1, // istore_2 - 1, // istore_3 - 2, // lstore_0 - 2, // lstore_1 - 2, // lstore_2 - 2, // lstore_3 - 1, // fstore_0 - 1, // fstore_1 - 1, // fstore_2 - 1, // fstore_3 - 2, // dstore_0 - 2, // dstore_1 - 2, // dstore_2 - 2, // dstore_3 - 1, // astore_0 - 1, // astore_1 - 1, // astore_2 - 1, // astore_3 - 3, // iastore - 4, // lastore - 3, // fastore - 4, // dastore - 3, // aastore - 3, // bastore - 3, // castore - 3, // sastore - 1, // pop - 2, // pop2 - 1, // dup - 2, // dup_x1 - 3, // dup_x2 - 2, // dup2 - 3, // dup2_x1 - 4, // dup2_x2 - 2, // swap - 2, // iadd - 4, // ladd - 2, // fadd - 4, // dadd - 2, // isub - 4, // lsub - 2, // fsub - 4, // dsub - 2, // imul - 4, // lmul - 2, // fmul - 4, // dmul - 2, // idiv - 4, // ldiv - 2, // fdiv - 4, // ddiv - 2, // irem - 4, // lrem - 2, // frem - 4, // drem - 1, // ineg - 2, // lneg - 1, // fneg - 2, // dneg - 2, // ishl - 3, // lshl - 2, // ishr - 3, // lshr - 2, // iushr - 3, // lushr - 2, // iand - 4, // land - 2, // ior - 4, // lor - 2, // ixor - 4, // lxor - 0, // iinc - 1, // i2l - 1, // i2f - 1, // i2d - 2, // l2i - 2, // l2f - 2, // l2d - 1, // f2i - 1, // f2l - 1, // f2d - 2, // d2i - 2, // d2l - 2, // d2f - 1, // i2b - 1, // i2c - 1, // i2s - 4, // lcmp - 2, // fcmpl - 2, // fcmpg - 4, // dcmpl - 4, // dcmpg - 1, // ifeq - 1, // ifne - 1, // iflt - 1, // ifge - 1, // ifgt - 1, // ifle - 2, // ificmpeq - 2, // ificmpne - 2, // ificmplt - 2, // ificmpge - 2, // ificmpgt - 2, // ificmple - 2, // ifacmpeq - 2, // ifacmpne - 0, // goto - 0, // jsr - 0, // ret - 1, // tableswitch - 1, // lookupswitch - 1, // ireturn - 2, // lreturn - 1, // freturn - 2, // dreturn - 1, // areturn - 0, // return - 0, // getstatic - 0, // putstatic - 1, // getfield - 1, // putfield - 1, // invokevirtual - 1, // invokespecial - 0, // invokestatic - 1, // invokeinterface - 0, // invokedynamic - 0, // new - 1, // newarray - 1, // anewarray - 1, // arraylength - 1, // athrow - 1, // checkcast - 1, // instanceof - 1, // monitorenter - 1, // monitorexit - 0, // wide - 0, // multianewarray - 1, // ifnull - 1, // ifnonnull - 0, // goto_w - 0, // jsr_w - }; - - - // An array containing the fixed number of entries pushed onto the stack, - // for all instructions. - private static final int[] STACK_PUSH_COUNTS = new int[] - { - 0, // nop - 1, // aconst_null - 1, // iconst_m1 - 1, // iconst_0 - 1, // iconst_1 - 1, // iconst_2 - 1, // iconst_3 - 1, // iconst_4 - 1, // iconst_5 - 2, // lconst_0 - 2, // lconst_1 - 1, // fconst_0 - 1, // fconst_1 - 1, // fconst_2 - 2, // dconst_0 - 2, // dconst_1 - 1, // bipush - 1, // sipush - 1, // ldc - 1, // ldc_w - 2, // ldc2_w - 1, // iload - 2, // lload - 1, // fload - 2, // dload - 1, // aload - 1, // iload_0 - 1, // iload_1 - 1, // iload_2 - 1, // iload_3 - 2, // lload_0 - 2, // lload_1 - 2, // lload_2 - 2, // lload_3 - 1, // fload_0 - 1, // fload_1 - 1, // fload_2 - 1, // fload_3 - 2, // dload_0 - 2, // dload_1 - 2, // dload_2 - 2, // dload_3 - 1, // aload_0 - 1, // aload_1 - 1, // aload_2 - 1, // aload_3 - 1, // iaload - 2, // laload - 1, // faload - 2, // daload - 1, // aaload - 1, // baload - 1, // caload - 1, // saload - 0, // istore - 0, // lstore - 0, // fstore - 0, // dstore - 0, // astore - 0, // istore_0 - 0, // istore_1 - 0, // istore_2 - 0, // istore_3 - 0, // lstore_0 - 0, // lstore_1 - 0, // lstore_2 - 0, // lstore_3 - 0, // fstore_0 - 0, // fstore_1 - 0, // fstore_2 - 0, // fstore_3 - 0, // dstore_0 - 0, // dstore_1 - 0, // dstore_2 - 0, // dstore_3 - 0, // astore_0 - 0, // astore_1 - 0, // astore_2 - 0, // astore_3 - 0, // iastore - 0, // lastore - 0, // fastore - 0, // dastore - 0, // aastore - 0, // bastore - 0, // castore - 0, // sastore - 0, // pop - 0, // pop2 - 2, // dup - 3, // dup_x1 - 4, // dup_x2 - 4, // dup2 - 5, // dup2_x1 - 6, // dup2_x2 - 2, // swap - 1, // iadd - 2, // ladd - 1, // fadd - 2, // dadd - 1, // isub - 2, // lsub - 1, // fsub - 2, // dsub - 1, // imul - 2, // lmul - 1, // fmul - 2, // dmul - 1, // idiv - 2, // ldiv - 1, // fdiv - 2, // ddiv - 1, // irem - 2, // lrem - 1, // frem - 2, // drem - 1, // ineg - 2, // lneg - 1, // fneg - 2, // dneg - 1, // ishl - 2, // lshl - 1, // ishr - 2, // lshr - 1, // iushr - 2, // lushr - 1, // iand - 2, // land - 1, // ior - 2, // lor - 1, // ixor - 2, // lxor - 0, // iinc - 2, // i2l - 1, // i2f - 2, // i2d - 1, // l2i - 1, // l2f - 2, // l2d - 1, // f2i - 2, // f2l - 2, // f2d - 1, // d2i - 2, // d2l - 1, // d2f - 1, // i2b - 1, // i2c - 1, // i2s - 1, // lcmp - 1, // fcmpl - 1, // fcmpg - 1, // dcmpl - 1, // dcmpg - 0, // ifeq - 0, // ifne - 0, // iflt - 0, // ifge - 0, // ifgt - 0, // ifle - 0, // ificmpeq - 0, // ificmpne - 0, // ificmplt - 0, // ificmpge - 0, // ificmpgt - 0, // ificmple - 0, // ifacmpeq - 0, // ifacmpne - 0, // goto - 1, // jsr - 0, // ret - 0, // tableswitch - 0, // lookupswitch - 0, // ireturn - 0, // lreturn - 0, // freturn - 0, // dreturn - 0, // areturn - 0, // return - 0, // getstatic - 0, // putstatic - 0, // getfield - 0, // putfield - 0, // invokevirtual - 0, // invokespecial - 0, // invokestatic - 0, // invokeinterface - 0, // invokedynamic - 1, // new - 1, // newarray - 1, // anewarray - 1, // arraylength - 0, // athrow - 1, // checkcast - 1, // instanceof - 0, // monitorenter - 0, // monitorexit - 0, // wide - 1, // multianewarray - 0, // ifnull - 0, // ifnonnull - 0, // goto_w - 1, // jsr_w - }; - - - public byte opcode; - - - /** - * Returns the canonical opcode of this instruction, i.e. typically the - * opcode whose extension has been removed. - */ - public byte canonicalOpcode() - { - return opcode; - } - - - /** - * Shrinks this instruction to its shortest possible form. - * @return this instruction. - */ - public abstract Instruction shrink(); - - - - /** - * Writes the Instruction at the given offset in the given code attribute. - */ - public final void write(CodeAttribute codeAttribute, int offset) - { - write(codeAttribute.code, offset); - } - - - /** - * Writes the Instruction at the given offset in the given code array. - */ - public void write(byte[] code, int offset) - { - // Write the wide opcode, if necessary. - if (isWide()) - { - code[offset++] = InstructionConstants.OP_WIDE; - } - - // Write the opcode. - code[offset++] = opcode; - - // Write any additional arguments. - writeInfo(code, offset); - } - - - /** - * Returns whether the instruction is wide, i.e. preceded by a wide opcode. - * With the current specifications, only variable instructions can be wide. - */ - protected boolean isWide() - { - return false; - } - - - /** - * Reads the data following the instruction opcode. - */ - protected abstract void readInfo(byte[] code, int offset); - - - /** - * Writes data following the instruction opcode. - */ - protected abstract void writeInfo(byte[] code, int offset); - - - /** - * Returns the length in bytes of the instruction. - */ - public abstract int length(int offset); - - - /** - * Accepts the given visitor. - */ - public abstract void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor); - - - /** - * Returns a description of the instruction, at the given offset. - */ - public String toString(int offset) - { - return "["+offset+"] "+ this.toString(); - } - - - /** - * Returns the name of the instruction. - */ - public String getName() - { - return InstructionConstants.NAMES[opcode & 0xff]; - } - - - /** - * Returns whether the instruction may throw exceptions. - */ - public boolean mayThrowExceptions() - { - return MAY_THROW_EXCEPTIONS[opcode & 0xff]; - } - - - /** - * Returns whether the instruction is a Category 2 instruction. This means - * that it operates on long or double arguments. - */ - public boolean isCategory2() - { - return IS_CATEGORY2[opcode & 0xff]; - } - - - /** - * Returns the number of entries popped from the stack during the execution - * of the instruction. - */ - public int stackPopCount(Clazz clazz) - { - return STACK_POP_COUNTS[opcode & 0xff]; - } - - - /** - * Returns the number of entries pushed onto the stack during the execution - * of the instruction. - */ - public int stackPushCount(Clazz clazz) - { - return STACK_PUSH_COUNTS[opcode & 0xff]; - } - - - // Small utility methods. - - protected static int readByte(byte[] code, int offset) - { - return code[offset] & 0xff; - } - - protected static int readShort(byte[] code, int offset) - { - return ((code[offset++] & 0xff) << 8) | - ( code[offset ] & 0xff ); - } - - protected static int readInt(byte[] code, int offset) - { - return ( code[offset++] << 24) | - ((code[offset++] & 0xff) << 16) | - ((code[offset++] & 0xff) << 8) | - ( code[offset ] & 0xff ); - } - - protected static int readValue(byte[] code, int offset, int valueSize) - { - switch (valueSize) - { - case 0: return 0; - case 1: return readByte( code, offset); - case 2: return readShort(code, offset); - case 4: return readInt( code, offset); - default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); - } - } - - protected static int readSignedByte(byte[] code, int offset) - { - return code[offset]; - } - - protected static int readSignedShort(byte[] code, int offset) - { - return (code[offset++] << 8) | - (code[offset ] & 0xff); - } - - protected static int readSignedValue(byte[] code, int offset, int valueSize) - { - switch (valueSize) - { - case 0: return 0; - case 1: return readSignedByte( code, offset); - case 2: return readSignedShort(code, offset); - case 4: return readInt( code, offset); - default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); - } - } - - protected static void writeByte(byte[] code, int offset, int value) - { - if (value > 0xff) - { - throw new IllegalArgumentException("Unsigned byte value larger than 0xff ["+value+"]"); - } - - code[offset] = (byte)value; - } - - protected static void writeShort(byte[] code, int offset, int value) - { - if (value > 0xffff) - { - throw new IllegalArgumentException("Unsigned short value larger than 0xffff ["+value+"]"); - } - - code[offset++] = (byte)(value >> 8); - code[offset ] = (byte)(value ); - } - - protected static void writeInt(byte[] code, int offset, int value) - { - code[offset++] = (byte)(value >> 24); - code[offset++] = (byte)(value >> 16); - code[offset++] = (byte)(value >> 8); - code[offset ] = (byte)(value ); - } - - protected static void writeValue(byte[] code, int offset, int value, int valueSize) - { - switch (valueSize) - { - case 0: break; - case 1: writeByte( code, offset, value); break; - case 2: writeShort(code, offset, value); break; - case 4: writeInt( code, offset, value); break; - default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); - } - } - - protected static void writeSignedByte(byte[] code, int offset, int value) - { - if ((byte)value != value) - { - throw new IllegalArgumentException("Signed byte value out of range ["+value+"]"); - } - - code[offset] = (byte)value; - } - - protected static void writeSignedShort(byte[] code, int offset, int value) - { - if ((short)value != value) - { - throw new IllegalArgumentException("Signed short value out of range ["+value+"]"); - } - - code[offset++] = (byte)(value >> 8); - code[offset ] = (byte)(value ); - } - - protected static void writeSignedValue(byte[] code, int offset, int value, int valueSize) - { - switch (valueSize) - { - case 0: break; - case 1: writeSignedByte( code, offset, value); break; - case 2: writeSignedShort(code, offset, value); break; - case 4: writeInt( code, offset, value); break; - default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionConstants.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionConstants.java deleted file mode 100644 index ac8e33b1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionConstants.java +++ /dev/null @@ -1,449 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -/** - * Representation of an instruction. - * - * @author Eric Lafortune - */ -public interface InstructionConstants -{ - public static final byte OP_NOP = 0; - public static final byte OP_ACONST_NULL = 1; - public static final byte OP_ICONST_M1 = 2; - public static final byte OP_ICONST_0 = 3; - public static final byte OP_ICONST_1 = 4; - public static final byte OP_ICONST_2 = 5; - public static final byte OP_ICONST_3 = 6; - public static final byte OP_ICONST_4 = 7; - public static final byte OP_ICONST_5 = 8; - public static final byte OP_LCONST_0 = 9; - public static final byte OP_LCONST_1 = 10; - public static final byte OP_FCONST_0 = 11; - public static final byte OP_FCONST_1 = 12; - public static final byte OP_FCONST_2 = 13; - public static final byte OP_DCONST_0 = 14; - public static final byte OP_DCONST_1 = 15; - public static final byte OP_BIPUSH = 16; - public static final byte OP_SIPUSH = 17; - public static final byte OP_LDC = 18; - public static final byte OP_LDC_W = 19; - public static final byte OP_LDC2_W = 20; - public static final byte OP_ILOAD = 21; - public static final byte OP_LLOAD = 22; - public static final byte OP_FLOAD = 23; - public static final byte OP_DLOAD = 24; - public static final byte OP_ALOAD = 25; - public static final byte OP_ILOAD_0 = 26; - public static final byte OP_ILOAD_1 = 27; - public static final byte OP_ILOAD_2 = 28; - public static final byte OP_ILOAD_3 = 29; - public static final byte OP_LLOAD_0 = 30; - public static final byte OP_LLOAD_1 = 31; - public static final byte OP_LLOAD_2 = 32; - public static final byte OP_LLOAD_3 = 33; - public static final byte OP_FLOAD_0 = 34; - public static final byte OP_FLOAD_1 = 35; - public static final byte OP_FLOAD_2 = 36; - public static final byte OP_FLOAD_3 = 37; - public static final byte OP_DLOAD_0 = 38; - public static final byte OP_DLOAD_1 = 39; - public static final byte OP_DLOAD_2 = 40; - public static final byte OP_DLOAD_3 = 41; - public static final byte OP_ALOAD_0 = 42; - public static final byte OP_ALOAD_1 = 43; - public static final byte OP_ALOAD_2 = 44; - public static final byte OP_ALOAD_3 = 45; - public static final byte OP_IALOAD = 46; - public static final byte OP_LALOAD = 47; - public static final byte OP_FALOAD = 48; - public static final byte OP_DALOAD = 49; - public static final byte OP_AALOAD = 50; - public static final byte OP_BALOAD = 51; - public static final byte OP_CALOAD = 52; - public static final byte OP_SALOAD = 53; - public static final byte OP_ISTORE = 54; - public static final byte OP_LSTORE = 55; - public static final byte OP_FSTORE = 56; - public static final byte OP_DSTORE = 57; - public static final byte OP_ASTORE = 58; - public static final byte OP_ISTORE_0 = 59; - public static final byte OP_ISTORE_1 = 60; - public static final byte OP_ISTORE_2 = 61; - public static final byte OP_ISTORE_3 = 62; - public static final byte OP_LSTORE_0 = 63; - public static final byte OP_LSTORE_1 = 64; - public static final byte OP_LSTORE_2 = 65; - public static final byte OP_LSTORE_3 = 66; - public static final byte OP_FSTORE_0 = 67; - public static final byte OP_FSTORE_1 = 68; - public static final byte OP_FSTORE_2 = 69; - public static final byte OP_FSTORE_3 = 70; - public static final byte OP_DSTORE_0 = 71; - public static final byte OP_DSTORE_1 = 72; - public static final byte OP_DSTORE_2 = 73; - public static final byte OP_DSTORE_3 = 74; - public static final byte OP_ASTORE_0 = 75; - public static final byte OP_ASTORE_1 = 76; - public static final byte OP_ASTORE_2 = 77; - public static final byte OP_ASTORE_3 = 78; - public static final byte OP_IASTORE = 79; - public static final byte OP_LASTORE = 80; - public static final byte OP_FASTORE = 81; - public static final byte OP_DASTORE = 82; - public static final byte OP_AASTORE = 83; - public static final byte OP_BASTORE = 84; - public static final byte OP_CASTORE = 85; - public static final byte OP_SASTORE = 86; - public static final byte OP_POP = 87; - public static final byte OP_POP2 = 88; - public static final byte OP_DUP = 89; - public static final byte OP_DUP_X1 = 90; - public static final byte OP_DUP_X2 = 91; - public static final byte OP_DUP2 = 92; - public static final byte OP_DUP2_X1 = 93; - public static final byte OP_DUP2_X2 = 94; - public static final byte OP_SWAP = 95; - public static final byte OP_IADD = 96; - public static final byte OP_LADD = 97; - public static final byte OP_FADD = 98; - public static final byte OP_DADD = 99; - public static final byte OP_ISUB = 100; - public static final byte OP_LSUB = 101; - public static final byte OP_FSUB = 102; - public static final byte OP_DSUB = 103; - public static final byte OP_IMUL = 104; - public static final byte OP_LMUL = 105; - public static final byte OP_FMUL = 106; - public static final byte OP_DMUL = 107; - public static final byte OP_IDIV = 108; - public static final byte OP_LDIV = 109; - public static final byte OP_FDIV = 110; - public static final byte OP_DDIV = 111; - public static final byte OP_IREM = 112; - public static final byte OP_LREM = 113; - public static final byte OP_FREM = 114; - public static final byte OP_DREM = 115; - public static final byte OP_INEG = 116; - public static final byte OP_LNEG = 117; - public static final byte OP_FNEG = 118; - public static final byte OP_DNEG = 119; - public static final byte OP_ISHL = 120; - public static final byte OP_LSHL = 121; - public static final byte OP_ISHR = 122; - public static final byte OP_LSHR = 123; - public static final byte OP_IUSHR = 124; - public static final byte OP_LUSHR = 125; - public static final byte OP_IAND = 126; - public static final byte OP_LAND = 127; - public static final byte OP_IOR = -128; - public static final byte OP_LOR = -127; - public static final byte OP_IXOR = -126; - public static final byte OP_LXOR = -125; - public static final byte OP_IINC = -124; - public static final byte OP_I2L = -123; - public static final byte OP_I2F = -122; - public static final byte OP_I2D = -121; - public static final byte OP_L2I = -120; - public static final byte OP_L2F = -119; - public static final byte OP_L2D = -118; - public static final byte OP_F2I = -117; - public static final byte OP_F2L = -116; - public static final byte OP_F2D = -115; - public static final byte OP_D2I = -114; - public static final byte OP_D2L = -113; - public static final byte OP_D2F = -112; - public static final byte OP_I2B = -111; - public static final byte OP_I2C = -110; - public static final byte OP_I2S = -109; - public static final byte OP_LCMP = -108; - public static final byte OP_FCMPL = -107; - public static final byte OP_FCMPG = -106; - public static final byte OP_DCMPL = -105; - public static final byte OP_DCMPG = -104; - public static final byte OP_IFEQ = -103; - public static final byte OP_IFNE = -102; - public static final byte OP_IFLT = -101; - public static final byte OP_IFGE = -100; - public static final byte OP_IFGT = -99; - public static final byte OP_IFLE = -98; - public static final byte OP_IFICMPEQ = -97; - public static final byte OP_IFICMPNE = -96; - public static final byte OP_IFICMPLT = -95; - public static final byte OP_IFICMPGE = -94; - public static final byte OP_IFICMPGT = -93; - public static final byte OP_IFICMPLE = -92; - public static final byte OP_IFACMPEQ = -91; - public static final byte OP_IFACMPNE = -90; - public static final byte OP_GOTO = -89; - public static final byte OP_JSR = -88; - public static final byte OP_RET = -87; - public static final byte OP_TABLESWITCH = -86; - public static final byte OP_LOOKUPSWITCH = -85; - public static final byte OP_IRETURN = -84; - public static final byte OP_LRETURN = -83; - public static final byte OP_FRETURN = -82; - public static final byte OP_DRETURN = -81; - public static final byte OP_ARETURN = -80; - public static final byte OP_RETURN = -79; - public static final byte OP_GETSTATIC = -78; - public static final byte OP_PUTSTATIC = -77; - public static final byte OP_GETFIELD = -76; - public static final byte OP_PUTFIELD = -75; - public static final byte OP_INVOKEVIRTUAL = -74; - public static final byte OP_INVOKESPECIAL = -73; - public static final byte OP_INVOKESTATIC = -72; - public static final byte OP_INVOKEINTERFACE = -71; - public static final byte OP_INVOKEDYNAMIC = -70; - public static final byte OP_NEW = -69; - public static final byte OP_NEWARRAY = -68; - public static final byte OP_ANEWARRAY = -67; - public static final byte OP_ARRAYLENGTH = -66; - public static final byte OP_ATHROW = -65; - public static final byte OP_CHECKCAST = -64; - public static final byte OP_INSTANCEOF = -63; - public static final byte OP_MONITORENTER = -62; - public static final byte OP_MONITOREXIT = -61; - public static final byte OP_WIDE = -60; - public static final byte OP_MULTIANEWARRAY = -59; - public static final byte OP_IFNULL = -58; - public static final byte OP_IFNONNULL = -57; - public static final byte OP_GOTO_W = -56; - public static final byte OP_JSR_W = -55; - - - public static final String[] NAMES = - { - "nop", - "aconst_null", - "iconst_m1", - "iconst_0", - "iconst_1", - "iconst_2", - "iconst_3", - "iconst_4", - "iconst_5", - "lconst_0", - "lconst_1", - "fconst_0", - "fconst_1", - "fconst_2", - "dconst_0", - "dconst_1", - "bipush", - "sipush", - "ldc", - "ldc_w", - "ldc2_w", - "iload", - "lload", - "fload", - "dload", - "aload", - "iload_0", - "iload_1", - "iload_2", - "iload_3", - "lload_0", - "lload_1", - "lload_2", - "lload_3", - "fload_0", - "fload_1", - "fload_2", - "fload_3", - "dload_0", - "dload_1", - "dload_2", - "dload_3", - "aload_0", - "aload_1", - "aload_2", - "aload_3", - "iaload", - "laload", - "faload", - "daload", - "aaload", - "baload", - "caload", - "saload", - "istore", - "lstore", - "fstore", - "dstore", - "astore", - "istore_0", - "istore_1", - "istore_2", - "istore_3", - "lstore_0", - "lstore_1", - "lstore_2", - "lstore_3", - "fstore_0", - "fstore_1", - "fstore_2", - "fstore_3", - "dstore_0", - "dstore_1", - "dstore_2", - "dstore_3", - "astore_0", - "astore_1", - "astore_2", - "astore_3", - "iastore", - "lastore", - "fastore", - "dastore", - "aastore", - "bastore", - "castore", - "sastore", - "pop", - "pop2", - "dup", - "dup_x1", - "dup_x2", - "dup2", - "dup2_x1", - "dup2_x2", - "swap", - "iadd", - "ladd", - "fadd", - "dadd", - "isub", - "lsub", - "fsub", - "dsub", - "imul", - "lmul", - "fmul", - "dmul", - "idiv", - "ldiv", - "fdiv", - "ddiv", - "irem", - "lrem", - "frem", - "drem", - "ineg", - "lneg", - "fneg", - "dneg", - "ishl", - "lshl", - "ishr", - "lshr", - "iushr", - "lushr", - "iand", - "land", - "ior", - "lor", - "ixor", - "lxor", - "iinc", - "i2l", - "i2f", - "i2d", - "l2i", - "l2f", - "l2d", - "f2i", - "f2l", - "f2d", - "d2i", - "d2l", - "d2f", - "i2b", - "i2c", - "i2s", - "lcmp", - "fcmpl", - "fcmpg", - "dcmpl", - "dcmpg", - "ifeq", - "ifne", - "iflt", - "ifge", - "ifgt", - "ifle", - "ificmpeq", - "ificmpne", - "ificmplt", - "ificmpge", - "ificmpgt", - "ificmple", - "ifacmpeq", - "ifacmpne", - "goto", - "jsr", - "ret", - "tableswitch", - "lookupswitch", - "ireturn", - "lreturn", - "freturn", - "dreturn", - "areturn", - "return", - "getstatic", - "putstatic", - "getfield", - "putfield", - "invokevirtual", - "invokespecial", - "invokestatic", - "invokeinterface", - "invokedynamic", - "new", - "newarray", - "anewarray", - "arraylength", - "athrow", - "checkcast", - "instanceof", - "monitorenter", - "monitorexit", - "wide", - "multianewarray", - "ifnull", - "ifnonnull", - "goto_w", - "jsr_w", - }; - - - public static final byte ARRAY_T_BOOLEAN = 4; - public static final byte ARRAY_T_CHAR = 5; - public static final byte ARRAY_T_FLOAT = 6; - public static final byte ARRAY_T_DOUBLE = 7; - public static final byte ARRAY_T_BYTE = 8; - public static final byte ARRAY_T_SHORT = 9; - public static final byte ARRAY_T_INT = 10; - public static final byte ARRAY_T_LONG = 11; -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionFactory.java deleted file mode 100644 index d3b985a0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionFactory.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -/** - * This class provides methods to create and reuse Instruction objects. - * - * @author Eric Lafortune - */ -public class InstructionFactory -{ - /** - * Creates a new Instruction from the data in the byte array, starting - * at the given index. - */ - public static Instruction create(byte[] code, int offset) - { - Instruction instruction; - - int index = offset; - byte opcode = code[index++]; - - boolean wide = false; - if (opcode == InstructionConstants.OP_WIDE) - { - opcode = code[index++]; - wide = true; - } - - switch (opcode) - { - // Simple instructions. - case InstructionConstants.OP_NOP: - case InstructionConstants.OP_ACONST_NULL: - case InstructionConstants.OP_ICONST_M1: - case InstructionConstants.OP_ICONST_0: - case InstructionConstants.OP_ICONST_1: - case InstructionConstants.OP_ICONST_2: - case InstructionConstants.OP_ICONST_3: - case InstructionConstants.OP_ICONST_4: - case InstructionConstants.OP_ICONST_5: - case InstructionConstants.OP_LCONST_0: - case InstructionConstants.OP_LCONST_1: - case InstructionConstants.OP_FCONST_0: - case InstructionConstants.OP_FCONST_1: - case InstructionConstants.OP_FCONST_2: - case InstructionConstants.OP_DCONST_0: - case InstructionConstants.OP_DCONST_1: - - case InstructionConstants.OP_BIPUSH: - case InstructionConstants.OP_SIPUSH: - - case InstructionConstants.OP_IALOAD: - case InstructionConstants.OP_LALOAD: - case InstructionConstants.OP_FALOAD: - case InstructionConstants.OP_DALOAD: - case InstructionConstants.OP_AALOAD: - case InstructionConstants.OP_BALOAD: - case InstructionConstants.OP_CALOAD: - case InstructionConstants.OP_SALOAD: - - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_LASTORE: - case InstructionConstants.OP_FASTORE: - case InstructionConstants.OP_DASTORE: - case InstructionConstants.OP_AASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - case InstructionConstants.OP_POP: - case InstructionConstants.OP_POP2: - case InstructionConstants.OP_DUP: - case InstructionConstants.OP_DUP_X1: - case InstructionConstants.OP_DUP_X2: - case InstructionConstants.OP_DUP2: - case InstructionConstants.OP_DUP2_X1: - case InstructionConstants.OP_DUP2_X2: - case InstructionConstants.OP_SWAP: - case InstructionConstants.OP_IADD: - case InstructionConstants.OP_LADD: - case InstructionConstants.OP_FADD: - case InstructionConstants.OP_DADD: - case InstructionConstants.OP_ISUB: - case InstructionConstants.OP_LSUB: - case InstructionConstants.OP_FSUB: - case InstructionConstants.OP_DSUB: - case InstructionConstants.OP_IMUL: - case InstructionConstants.OP_LMUL: - case InstructionConstants.OP_FMUL: - case InstructionConstants.OP_DMUL: - case InstructionConstants.OP_IDIV: - case InstructionConstants.OP_LDIV: - case InstructionConstants.OP_FDIV: - case InstructionConstants.OP_DDIV: - case InstructionConstants.OP_IREM: - case InstructionConstants.OP_LREM: - case InstructionConstants.OP_FREM: - case InstructionConstants.OP_DREM: - case InstructionConstants.OP_INEG: - case InstructionConstants.OP_LNEG: - case InstructionConstants.OP_FNEG: - case InstructionConstants.OP_DNEG: - case InstructionConstants.OP_ISHL: - case InstructionConstants.OP_LSHL: - case InstructionConstants.OP_ISHR: - case InstructionConstants.OP_LSHR: - case InstructionConstants.OP_IUSHR: - case InstructionConstants.OP_LUSHR: - case InstructionConstants.OP_IAND: - case InstructionConstants.OP_LAND: - case InstructionConstants.OP_IOR: - case InstructionConstants.OP_LOR: - case InstructionConstants.OP_IXOR: - case InstructionConstants.OP_LXOR: - - case InstructionConstants.OP_I2L: - case InstructionConstants.OP_I2F: - case InstructionConstants.OP_I2D: - case InstructionConstants.OP_L2I: - case InstructionConstants.OP_L2F: - case InstructionConstants.OP_L2D: - case InstructionConstants.OP_F2I: - case InstructionConstants.OP_F2L: - case InstructionConstants.OP_F2D: - case InstructionConstants.OP_D2I: - case InstructionConstants.OP_D2L: - case InstructionConstants.OP_D2F: - case InstructionConstants.OP_I2B: - case InstructionConstants.OP_I2C: - case InstructionConstants.OP_I2S: - case InstructionConstants.OP_LCMP: - case InstructionConstants.OP_FCMPL: - case InstructionConstants.OP_FCMPG: - case InstructionConstants.OP_DCMPL: - case InstructionConstants.OP_DCMPG: - - case InstructionConstants.OP_IRETURN: - case InstructionConstants.OP_LRETURN: - case InstructionConstants.OP_FRETURN: - case InstructionConstants.OP_DRETURN: - case InstructionConstants.OP_ARETURN: - case InstructionConstants.OP_RETURN: - - case InstructionConstants.OP_NEWARRAY: - case InstructionConstants.OP_ARRAYLENGTH: - case InstructionConstants.OP_ATHROW: - - case InstructionConstants.OP_MONITORENTER: - case InstructionConstants.OP_MONITOREXIT: - instruction = new SimpleInstruction(); - break; - - // Instructions with a contant pool index. - case InstructionConstants.OP_LDC: - case InstructionConstants.OP_LDC_W: - case InstructionConstants.OP_LDC2_W: - - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_PUTSTATIC: - case InstructionConstants.OP_GETFIELD: - case InstructionConstants.OP_PUTFIELD: - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - case InstructionConstants.OP_INVOKEDYNAMIC: - - case InstructionConstants.OP_NEW: - case InstructionConstants.OP_ANEWARRAY: - case InstructionConstants.OP_CHECKCAST: - case InstructionConstants.OP_INSTANCEOF: - case InstructionConstants.OP_MULTIANEWARRAY: - instruction = new ConstantInstruction(); - break; - - // Instructions with a local variable index. - case InstructionConstants.OP_ILOAD: - case InstructionConstants.OP_LLOAD: - case InstructionConstants.OP_FLOAD: - case InstructionConstants.OP_DLOAD: - case InstructionConstants.OP_ALOAD: - case InstructionConstants.OP_ILOAD_0: - case InstructionConstants.OP_ILOAD_1: - case InstructionConstants.OP_ILOAD_2: - case InstructionConstants.OP_ILOAD_3: - case InstructionConstants.OP_LLOAD_0: - case InstructionConstants.OP_LLOAD_1: - case InstructionConstants.OP_LLOAD_2: - case InstructionConstants.OP_LLOAD_3: - case InstructionConstants.OP_FLOAD_0: - case InstructionConstants.OP_FLOAD_1: - case InstructionConstants.OP_FLOAD_2: - case InstructionConstants.OP_FLOAD_3: - case InstructionConstants.OP_DLOAD_0: - case InstructionConstants.OP_DLOAD_1: - case InstructionConstants.OP_DLOAD_2: - case InstructionConstants.OP_DLOAD_3: - case InstructionConstants.OP_ALOAD_0: - case InstructionConstants.OP_ALOAD_1: - case InstructionConstants.OP_ALOAD_2: - case InstructionConstants.OP_ALOAD_3: - - case InstructionConstants.OP_ISTORE: - case InstructionConstants.OP_LSTORE: - case InstructionConstants.OP_FSTORE: - case InstructionConstants.OP_DSTORE: - case InstructionConstants.OP_ASTORE: - case InstructionConstants.OP_ISTORE_0: - case InstructionConstants.OP_ISTORE_1: - case InstructionConstants.OP_ISTORE_2: - case InstructionConstants.OP_ISTORE_3: - case InstructionConstants.OP_LSTORE_0: - case InstructionConstants.OP_LSTORE_1: - case InstructionConstants.OP_LSTORE_2: - case InstructionConstants.OP_LSTORE_3: - case InstructionConstants.OP_FSTORE_0: - case InstructionConstants.OP_FSTORE_1: - case InstructionConstants.OP_FSTORE_2: - case InstructionConstants.OP_FSTORE_3: - case InstructionConstants.OP_DSTORE_0: - case InstructionConstants.OP_DSTORE_1: - case InstructionConstants.OP_DSTORE_2: - case InstructionConstants.OP_DSTORE_3: - case InstructionConstants.OP_ASTORE_0: - case InstructionConstants.OP_ASTORE_1: - case InstructionConstants.OP_ASTORE_2: - case InstructionConstants.OP_ASTORE_3: - - case InstructionConstants.OP_IINC: - - case InstructionConstants.OP_RET: - instruction = new VariableInstruction(wide); - break; - - // Instructions with a branch offset operand. - case InstructionConstants.OP_IFEQ: - case InstructionConstants.OP_IFNE: - case InstructionConstants.OP_IFLT: - case InstructionConstants.OP_IFGE: - case InstructionConstants.OP_IFGT: - case InstructionConstants.OP_IFLE: - case InstructionConstants.OP_IFICMPEQ: - case InstructionConstants.OP_IFICMPNE: - case InstructionConstants.OP_IFICMPLT: - case InstructionConstants.OP_IFICMPGE: - case InstructionConstants.OP_IFICMPGT: - case InstructionConstants.OP_IFICMPLE: - case InstructionConstants.OP_IFACMPEQ: - case InstructionConstants.OP_IFACMPNE: - case InstructionConstants.OP_GOTO: - case InstructionConstants.OP_JSR: - - case InstructionConstants.OP_IFNULL: - case InstructionConstants.OP_IFNONNULL: - - case InstructionConstants.OP_GOTO_W: - case InstructionConstants.OP_JSR_W: - instruction = new BranchInstruction(); - break; - - // The tableswitch instruction. - case InstructionConstants.OP_TABLESWITCH: - instruction = new TableSwitchInstruction(); - break; - - // The lookupswitch instruction. - case InstructionConstants.OP_LOOKUPSWITCH: - instruction = new LookUpSwitchInstruction(); - break; - - default: - throw new IllegalArgumentException("Unknown instruction opcode ["+opcode+"] at offset "+offset); - } - - instruction.opcode = opcode; - - instruction.readInfo(code, index); - - return instruction; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionUtil.java deleted file mode 100644 index bd4f6a65..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/InstructionUtil.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.ClassConstants; - -import static proguard.classfile.ClassConstants.*; -import static proguard.classfile.instruction.InstructionConstants.*; - -/** - * Utility methods for converting between representations of names and - * descriptions. - * - * @author Eric Lafortune - */ -public class InstructionUtil -{ - /** - * Returns the internal type corresponding to the given 'newarray' type. - * @param arrayType InstructionConstants.ARRAY_T_BOOLEAN, - * InstructionConstants.ARRAY_T_BYTE, - * InstructionConstants.ARRAY_T_CHAR, - * InstructionConstants.ARRAY_T_SHORT, - * InstructionConstants.ARRAY_T_INT, - * InstructionConstants.ARRAY_T_LONG, - * InstructionConstants.ARRAY_T_FLOAT, or - * InstructionConstants.ARRAY_T_DOUBLE. - * @return ClassConstants.TYPE_BOOLEAN, - * ClassConstants.TYPE_BYTE, - * ClassConstants.TYPE_CHAR, - * ClassConstants.TYPE_SHORT, - * ClassConstants.TYPE_INT, - * ClassConstants.TYPE_LONG, - * ClassConstants.TYPE_FLOAT, or - * ClassConstants.TYPE_DOUBLE. - */ - public static char internalTypeFromArrayType(byte arrayType) - { - switch (arrayType) - { - case InstructionConstants.ARRAY_T_BOOLEAN: return ClassConstants.TYPE_BOOLEAN; - case InstructionConstants.ARRAY_T_CHAR: return ClassConstants.TYPE_CHAR; - case InstructionConstants.ARRAY_T_FLOAT: return ClassConstants.TYPE_FLOAT; - case InstructionConstants.ARRAY_T_DOUBLE: return ClassConstants.TYPE_DOUBLE; - case InstructionConstants.ARRAY_T_BYTE: return ClassConstants.TYPE_BYTE; - case InstructionConstants.ARRAY_T_SHORT: return ClassConstants.TYPE_SHORT; - case InstructionConstants.ARRAY_T_INT: return ClassConstants.TYPE_INT; - case InstructionConstants.ARRAY_T_LONG: return ClassConstants.TYPE_LONG; - default: throw new IllegalArgumentException("Unknown array type ["+arrayType+"]"); - } - } - - /** - * Returns the newarray type constant for the given internal primitive - * type. - * - * @param internalType a primitive type ('Z','B','I',...) - * @return the array type constant corresponding to the given - * primitive type. - * @see #internalTypeFromArrayType(byte) - */ - public static byte arrayTypeFromInternalType(char internalType) - { - switch (internalType) - { - case TYPE_BOOLEAN: return ARRAY_T_BOOLEAN; - case TYPE_BYTE: return ARRAY_T_BYTE; - case TYPE_CHAR: return ARRAY_T_CHAR; - case TYPE_SHORT: return ARRAY_T_SHORT; - case TYPE_INT: return ARRAY_T_INT; - case TYPE_LONG: return ARRAY_T_LONG; - case TYPE_FLOAT: return ARRAY_T_FLOAT; - case TYPE_DOUBLE: return ARRAY_T_DOUBLE; - default: throw new IllegalArgumentException("Unknown primitive: " + internalType); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/LookUpSwitchInstruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/LookUpSwitchInstruction.java deleted file mode 100644 index 83dcac26..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/LookUpSwitchInstruction.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -/** - * This Instruction represents a simple instruction without variable arguments - * or constant pool references. - * - * @author Eric Lafortune - */ -public class LookUpSwitchInstruction extends SwitchInstruction -{ - public int[] cases; - - - /** - * Creates an uninitialized LookUpSwitchInstruction. - */ - public LookUpSwitchInstruction() {} - - - /** - * Creates a new LookUpSwitchInstruction with the given arguments. - */ - public LookUpSwitchInstruction(byte opcode, - int defaultOffset, - int[] cases, - int[] jumpOffsets) - { - this.opcode = opcode; - this.defaultOffset = defaultOffset; - this.cases = cases; - this.jumpOffsets = jumpOffsets; - } - - - /** - * Copies the given instruction into this instruction. - * @param lookUpSwitchInstruction the instruction to be copied. - * @return this instruction. - */ - public LookUpSwitchInstruction copy(LookUpSwitchInstruction lookUpSwitchInstruction) - { - this.opcode = lookUpSwitchInstruction.opcode; - this.defaultOffset = lookUpSwitchInstruction.defaultOffset; - this.cases = lookUpSwitchInstruction.cases; - this.jumpOffsets = lookUpSwitchInstruction.jumpOffsets; - - return this; - } - - - // Implementations for Instruction. - - public Instruction shrink() - { - // There aren't any ways to shrink this instruction. - return this; - } - - protected void readInfo(byte[] code, int offset) - { - // Skip up to three padding bytes. - offset += -offset & 3; - - // Read the two 32-bit arguments. - defaultOffset = readInt(code, offset); offset += 4; - int jumpOffsetCount = readInt(code, offset); offset += 4; - - // Read the matches-offset pairs. - cases = new int[jumpOffsetCount]; - jumpOffsets = new int[jumpOffsetCount]; - - for (int index = 0; index < jumpOffsetCount; index++) - { - cases[index] = readInt(code, offset); offset += 4; - jumpOffsets[index] = readInt(code, offset); offset += 4; - } - } - - - protected void writeInfo(byte[] code, int offset) - { - // Write up to three padding bytes. - while ((offset & 3) != 0) - { - writeByte(code, offset++, 0); - } - - // Write the two 32-bit arguments. - writeInt(code, offset, defaultOffset); offset += 4; - writeInt(code, offset, cases.length); offset += 4; - - // Write the matches-offset pairs. - for (int index = 0; index < cases.length; index++) - { - writeInt(code, offset, cases[index]); offset += 4; - writeInt(code, offset, jumpOffsets[index]); offset += 4; - } - } - - - public int length(int offset) - { - return 1 + (-(offset+1) & 3) + 8 + cases.length * 8; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - instructionVisitor.visitLookUpSwitchInstruction(clazz, method, codeAttribute, offset, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/SimpleInstruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/SimpleInstruction.java deleted file mode 100644 index 543b5708..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/SimpleInstruction.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -/** - * This Instruction represents a simple instruction without variable arguments - * or constant pool references. - * - * @author Eric Lafortune - */ -public class SimpleInstruction extends Instruction -{ - public int constant; - - - /** - * Creates an uninitialized SimpleInstruction. - */ - public SimpleInstruction() {} - - - /** - * Creates a new SimpleInstruction with the given opcode. - */ - public SimpleInstruction(byte opcode) - { - this(opcode, embeddedConstant(opcode)); - } - - - /** - * Creates a new SimpleInstruction with the given opcode and constant. - */ - public SimpleInstruction(byte opcode, int constant) - { - this.opcode = opcode; - this.constant = constant; - } - - - /** - * Copies the given instruction into this instruction. - * @param simpleInstruction the instruction to be copied. - * @return this instruction. - */ - public SimpleInstruction copy(SimpleInstruction simpleInstruction) - { - this.opcode = simpleInstruction.opcode; - this.constant = simpleInstruction.constant; - - return this; - } - - - /** - * Return the embedded constant of the given opcode, or 0 if the opcode - * doesn't have one. - */ - private static int embeddedConstant(byte opcode) - { - switch (opcode) - { - case InstructionConstants.OP_ICONST_M1: return -1; - - case InstructionConstants.OP_ICONST_1: - case InstructionConstants.OP_LCONST_1: - case InstructionConstants.OP_FCONST_1: - case InstructionConstants.OP_DCONST_1: return 1; - - case InstructionConstants.OP_ICONST_2: - case InstructionConstants.OP_FCONST_2: return 2; - - case InstructionConstants.OP_ICONST_3: return 3; - - case InstructionConstants.OP_ICONST_4: return 4; - - case InstructionConstants.OP_ICONST_5: return 5; - - default: return 0; - } - } - - - // Implementations for Instruction. - - public byte canonicalOpcode() - { - // Replace any _1, _2, _3,... extension by _0. - switch (opcode) - { - case InstructionConstants.OP_ICONST_M1: - case InstructionConstants.OP_ICONST_0: - case InstructionConstants.OP_ICONST_1: - case InstructionConstants.OP_ICONST_2: - case InstructionConstants.OP_ICONST_3: - case InstructionConstants.OP_ICONST_4: - case InstructionConstants.OP_ICONST_5: - case InstructionConstants.OP_BIPUSH: - case InstructionConstants.OP_SIPUSH: return InstructionConstants.OP_ICONST_0; - - case InstructionConstants.OP_LCONST_0: - case InstructionConstants.OP_LCONST_1: return InstructionConstants.OP_LCONST_0; - - case InstructionConstants.OP_FCONST_0: - case InstructionConstants.OP_FCONST_1: - case InstructionConstants.OP_FCONST_2: return InstructionConstants.OP_FCONST_0; - - case InstructionConstants.OP_DCONST_0: - case InstructionConstants.OP_DCONST_1: return InstructionConstants.OP_DCONST_0; - - default: return opcode; - } - } - - public Instruction shrink() - { - // Reconstruct the opcode of the shortest instruction, if there are - // any alternatives. - switch (opcode) - { - case InstructionConstants.OP_ICONST_M1: - case InstructionConstants.OP_ICONST_0: - case InstructionConstants.OP_ICONST_1: - case InstructionConstants.OP_ICONST_2: - case InstructionConstants.OP_ICONST_3: - case InstructionConstants.OP_ICONST_4: - case InstructionConstants.OP_ICONST_5: - case InstructionConstants.OP_BIPUSH: - case InstructionConstants.OP_SIPUSH: - switch (requiredConstantSize()) - { - case 0: - opcode = (byte)(InstructionConstants.OP_ICONST_0 + constant); - break; - case 1: - opcode = InstructionConstants.OP_BIPUSH; - break; - case 2: - opcode = InstructionConstants.OP_SIPUSH; - break; - } - break; - - case InstructionConstants.OP_LCONST_0: - case InstructionConstants.OP_LCONST_1: - opcode = (byte)(InstructionConstants.OP_LCONST_0 + constant); - break; - - case InstructionConstants.OP_FCONST_0: - case InstructionConstants.OP_FCONST_1: - case InstructionConstants.OP_FCONST_2: - opcode = (byte)(InstructionConstants.OP_FCONST_0 + constant); - break; - - case InstructionConstants.OP_DCONST_0: - case InstructionConstants.OP_DCONST_1: - opcode = (byte)(InstructionConstants.OP_DCONST_0 + constant); - break; - } - - return this; - } - - protected void readInfo(byte[] code, int offset) - { - int constantSize = constantSize(); - - // Also initialize embedded constants that are different from 0. - constant = constantSize == 0 ? - embeddedConstant(opcode) : - readSignedValue(code, offset, constantSize); - } - - - protected void writeInfo(byte[] code, int offset) - { - int constantSize = constantSize(); - - if (requiredConstantSize() > constantSize) - { - throw new IllegalArgumentException("Instruction has invalid constant size ("+this.toString(offset)+")"); - } - - writeSignedValue(code, offset, constant, constantSize); - } - - - public int length(int offset) - { - return 1 + constantSize(); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - instructionVisitor.visitSimpleInstruction(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for Object. - - public String toString() - { - return getName() + - (constantSize() > 0 ? " "+constant : ""); - } - - - // Small utility methods. - - /** - * Returns the constant size for this instruction. - */ - private int constantSize() - { - return opcode == InstructionConstants.OP_BIPUSH || - opcode == InstructionConstants.OP_NEWARRAY ? 1 : - opcode == InstructionConstants.OP_SIPUSH ? 2 : - 0; - } - - - /** - * Computes the required constant size for this instruction. - */ - private int requiredConstantSize() - { - return constant >= -1 && constant <= 5 ? 0 : - (byte)constant == constant ? 1 : - (short)constant == constant ? 2 : - 4; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/SwitchInstruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/SwitchInstruction.java deleted file mode 100644 index 2cb8abef..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/SwitchInstruction.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -/** - * This Instruction represents a simple instruction without variable arguments - * or constant pool references. - * - * @author Eric Lafortune - */ -public abstract class SwitchInstruction extends Instruction -{ - public int defaultOffset; - public int[] jumpOffsets; - - - /** - * Creates an uninitialized SwitchInstruction. - */ - public SwitchInstruction() {} - - - /** - * Creates a new SwitchInstruction with the given arguments. - */ - public SwitchInstruction(byte opcode, - int defaultOffset, - int[] jumpOffsets) - { - this.opcode = opcode; - this.defaultOffset = defaultOffset; - this.jumpOffsets = jumpOffsets; - } - - - /** - * Copies the given instruction into this instruction. - * @param switchInstruction the instruction to be copied. - * @return this instruction. - */ - public SwitchInstruction copy(SwitchInstruction switchInstruction) - { - this.opcode = switchInstruction.opcode; - this.defaultOffset = switchInstruction.defaultOffset; - this.jumpOffsets = switchInstruction.jumpOffsets; - - return this; - } - - - // Implementations for Instruction. - - public String toString(int offset) - { - return "["+offset+"] "+toString()+" (target="+(offset+defaultOffset)+")"; - } - - - // Implementations for Object. - - public String toString() - { - return getName()+" ("+jumpOffsets.length+" offsets, default="+defaultOffset+")"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/TableSwitchInstruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/TableSwitchInstruction.java deleted file mode 100644 index fc55f9cc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/TableSwitchInstruction.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -/** - * This Instruction represents a simple instruction without variable arguments - * or constant pool references. - * - * @author Eric Lafortune - */ -public class TableSwitchInstruction extends SwitchInstruction -{ - public int lowCase; - public int highCase; - - - /** - * Creates an uninitialized TableSwitchInstruction. - */ - public TableSwitchInstruction() {} - - - /** - * Creates a new TableSwitchInstruction with the given arguments. - */ - public TableSwitchInstruction(byte opcode, - int defaultOffset, - int lowCase, - int highCase, - int[] jumpOffsets) - { - this.opcode = opcode; - this.defaultOffset = defaultOffset; - this.lowCase = lowCase; - this.highCase = highCase; - this.jumpOffsets = jumpOffsets; - } - - - /** - * Copies the given instruction into this instruction. - * @param tableSwitchInstruction the instruction to be copied. - * @return this instruction. - */ - public TableSwitchInstruction copy(TableSwitchInstruction tableSwitchInstruction) - { - this.opcode = tableSwitchInstruction.opcode; - this.defaultOffset = tableSwitchInstruction.defaultOffset; - this.lowCase = tableSwitchInstruction.lowCase; - this.highCase = tableSwitchInstruction.highCase; - this.jumpOffsets = tableSwitchInstruction.jumpOffsets; - - return this; - } - - - // Implementations for Instruction. - - public Instruction shrink() - { - // There aren't any ways to shrink this instruction. - return this; - } - - protected void readInfo(byte[] code, int offset) - { - // Skip up to three padding bytes. - offset += -offset & 3; - - // Read the three 32-bit arguments. - defaultOffset = readInt(code, offset); offset += 4; - lowCase = readInt(code, offset); offset += 4; - highCase = readInt(code, offset); offset += 4; - - // Read the jump offsets. - jumpOffsets = new int[highCase - lowCase + 1]; - - for (int index = 0; index < jumpOffsets.length; index++) - { - jumpOffsets[index] = readInt(code, offset); offset += 4; - } - } - - - protected void writeInfo(byte[] code, int offset) - { - // Write up to three padding bytes. - while ((offset & 3) != 0) - { - writeByte(code, offset++, 0); - } - - // Write the three 32-bit arguments. - writeInt(code, offset, defaultOffset); offset += 4; - writeInt(code, offset, lowCase); offset += 4; - writeInt(code, offset, highCase); offset += 4; - - // Write the jump offsets. - int length = highCase - lowCase + 1; - for (int index = 0; index < length; index++) - { - writeInt(code, offset, jumpOffsets[index]); offset += 4; - } - } - - - public int length(int offset) - { - return 1 + (-(offset+1) & 3) + 12 + (highCase - lowCase + 1) * 4; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - instructionVisitor.visitTableSwitchInstruction(clazz, method, codeAttribute, offset, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/VariableInstruction.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/VariableInstruction.java deleted file mode 100644 index c650abb8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/VariableInstruction.java +++ /dev/null @@ -1,372 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -/** - * This Instruction represents an instruction that refers to a variable on the - * local variable stack. - * - * @author Eric Lafortune - */ -public class VariableInstruction extends Instruction -{ - public boolean wide; - public int variableIndex; - public int constant; - - - /** - * Creates an uninitialized VariableInstruction. - */ - public VariableInstruction() {} - - - public VariableInstruction(boolean wide) - { - this.wide = wide; - } - - - public VariableInstruction(byte opcode) - { - this(opcode, embeddedVariable(opcode), 0); - } - - - public VariableInstruction(byte opcode, - int variableIndex) - { - this(opcode, variableIndex, 0); - } - - - public VariableInstruction(byte opcode, - int variableIndex, - int constant) - { - this.opcode = opcode; - this.variableIndex = variableIndex; - this.constant = constant; - this.wide = requiredVariableIndexSize() > 1 || - requiredConstantSize() > 1; - } - - - /** - * Copies the given instruction into this instruction. - * @param variableInstruction the instruction to be copied. - * @return this instruction. - */ - public VariableInstruction copy(VariableInstruction variableInstruction) - { - this.opcode = variableInstruction.opcode; - this.variableIndex = variableInstruction.variableIndex; - this.constant = variableInstruction.constant; - this.wide = variableInstruction.wide; - - return this; - } - - - /** - * Return the embedded variable of the given opcode, or 0 if the opcode - * doesn't have one. - */ - private static int embeddedVariable(byte opcode) - { - switch (opcode) - { - case InstructionConstants.OP_ILOAD_1: - case InstructionConstants.OP_LLOAD_1: - case InstructionConstants.OP_FLOAD_1: - case InstructionConstants.OP_DLOAD_1: - case InstructionConstants.OP_ALOAD_1: - case InstructionConstants.OP_ISTORE_1: - case InstructionConstants.OP_LSTORE_1: - case InstructionConstants.OP_FSTORE_1: - case InstructionConstants.OP_DSTORE_1: - case InstructionConstants.OP_ASTORE_1: return 1; - - case InstructionConstants.OP_ILOAD_2: - case InstructionConstants.OP_LLOAD_2: - case InstructionConstants.OP_FLOAD_2: - case InstructionConstants.OP_DLOAD_2: - case InstructionConstants.OP_ALOAD_2: - case InstructionConstants.OP_ISTORE_2: - case InstructionConstants.OP_LSTORE_2: - case InstructionConstants.OP_FSTORE_2: - case InstructionConstants.OP_DSTORE_2: - case InstructionConstants.OP_ASTORE_2: return 2; - - case InstructionConstants.OP_ILOAD_3: - case InstructionConstants.OP_LLOAD_3: - case InstructionConstants.OP_FLOAD_3: - case InstructionConstants.OP_DLOAD_3: - case InstructionConstants.OP_ALOAD_3: - case InstructionConstants.OP_ISTORE_3: - case InstructionConstants.OP_LSTORE_3: - case InstructionConstants.OP_FSTORE_3: - case InstructionConstants.OP_DSTORE_3: - case InstructionConstants.OP_ASTORE_3: return 3; - - default: return 0; - } - } - - - /** - * Returns whether this instruction stores the value of a variable. - * The value is false for the ret instruction, but true for the iinc - * instruction. - */ - public boolean isStore() - { - // A store instruction can be recognized as follows. Note that this - // excludes the ret instruction, which has a negative opcode. - return opcode >= InstructionConstants.OP_ISTORE || - opcode == InstructionConstants.OP_IINC; - } - - - /** - * Returns whether this instruction loads the value of a variable. - * The value is true for the ret instruction and for the iinc - * instruction. - */ - public boolean isLoad() - { - // A load instruction can be recognized as follows. Note that this - // includes the ret instruction, which has a negative opcode. - return opcode < InstructionConstants.OP_ISTORE; - } - - - // Implementations for Instruction. - - public byte canonicalOpcode() - { - // Remove the _0, _1, _2, _3 extension, if any. - switch (opcode) - { - case InstructionConstants.OP_ILOAD_0: - case InstructionConstants.OP_ILOAD_1: - case InstructionConstants.OP_ILOAD_2: - case InstructionConstants.OP_ILOAD_3: return InstructionConstants.OP_ILOAD; - case InstructionConstants.OP_LLOAD_0: - case InstructionConstants.OP_LLOAD_1: - case InstructionConstants.OP_LLOAD_2: - case InstructionConstants.OP_LLOAD_3: return InstructionConstants.OP_LLOAD; - case InstructionConstants.OP_FLOAD_0: - case InstructionConstants.OP_FLOAD_1: - case InstructionConstants.OP_FLOAD_2: - case InstructionConstants.OP_FLOAD_3: return InstructionConstants.OP_FLOAD; - case InstructionConstants.OP_DLOAD_0: - case InstructionConstants.OP_DLOAD_1: - case InstructionConstants.OP_DLOAD_2: - case InstructionConstants.OP_DLOAD_3: return InstructionConstants.OP_DLOAD; - case InstructionConstants.OP_ALOAD_0: - case InstructionConstants.OP_ALOAD_1: - case InstructionConstants.OP_ALOAD_2: - case InstructionConstants.OP_ALOAD_3: return InstructionConstants.OP_ALOAD; - - case InstructionConstants.OP_ISTORE_0: - case InstructionConstants.OP_ISTORE_1: - case InstructionConstants.OP_ISTORE_2: - case InstructionConstants.OP_ISTORE_3: return InstructionConstants.OP_ISTORE; - case InstructionConstants.OP_LSTORE_0: - case InstructionConstants.OP_LSTORE_1: - case InstructionConstants.OP_LSTORE_2: - case InstructionConstants.OP_LSTORE_3: return InstructionConstants.OP_LSTORE; - case InstructionConstants.OP_FSTORE_0: - case InstructionConstants.OP_FSTORE_1: - case InstructionConstants.OP_FSTORE_2: - case InstructionConstants.OP_FSTORE_3: return InstructionConstants.OP_FSTORE; - case InstructionConstants.OP_DSTORE_0: - case InstructionConstants.OP_DSTORE_1: - case InstructionConstants.OP_DSTORE_2: - case InstructionConstants.OP_DSTORE_3: return InstructionConstants.OP_DSTORE; - case InstructionConstants.OP_ASTORE_0: - case InstructionConstants.OP_ASTORE_1: - case InstructionConstants.OP_ASTORE_2: - case InstructionConstants.OP_ASTORE_3: return InstructionConstants.OP_ASTORE; - - default: return opcode; - } - } - - public Instruction shrink() - { - opcode = canonicalOpcode(); - - // Is this instruction pointing to a variable with index from 0 to 3? - if (variableIndex <= 3) - { - switch (opcode) - { - case InstructionConstants.OP_ILOAD: opcode = (byte)(InstructionConstants.OP_ILOAD_0 + variableIndex); break; - case InstructionConstants.OP_LLOAD: opcode = (byte)(InstructionConstants.OP_LLOAD_0 + variableIndex); break; - case InstructionConstants.OP_FLOAD: opcode = (byte)(InstructionConstants.OP_FLOAD_0 + variableIndex); break; - case InstructionConstants.OP_DLOAD: opcode = (byte)(InstructionConstants.OP_DLOAD_0 + variableIndex); break; - case InstructionConstants.OP_ALOAD: opcode = (byte)(InstructionConstants.OP_ALOAD_0 + variableIndex); break; - - case InstructionConstants.OP_ISTORE: opcode = (byte)(InstructionConstants.OP_ISTORE_0 + variableIndex); break; - case InstructionConstants.OP_LSTORE: opcode = (byte)(InstructionConstants.OP_LSTORE_0 + variableIndex); break; - case InstructionConstants.OP_FSTORE: opcode = (byte)(InstructionConstants.OP_FSTORE_0 + variableIndex); break; - case InstructionConstants.OP_DSTORE: opcode = (byte)(InstructionConstants.OP_DSTORE_0 + variableIndex); break; - case InstructionConstants.OP_ASTORE: opcode = (byte)(InstructionConstants.OP_ASTORE_0 + variableIndex); break; - } - } - - // Only make the instruction wide if necessary. - wide = requiredVariableIndexSize() > 1 || - requiredConstantSize() > 1; - - return this; - } - - - protected boolean isWide() - { - return wide; - } - - - protected void readInfo(byte[] code, int offset) - { - int variableIndexSize = variableIndexSize(); - int constantSize = constantSize(); - - // Also initialize embedded variable indexes. - if (variableIndexSize == 0) - { - // An embedded variable index can be decoded as follows. - variableIndex = opcode < InstructionConstants.OP_ISTORE_0 ? - (opcode - InstructionConstants.OP_ILOAD_0 ) & 3 : - (opcode - InstructionConstants.OP_ISTORE_0) & 3; - } - else - { - variableIndex = readValue(code, offset, variableIndexSize); offset += variableIndexSize; - } - - constant = readSignedValue(code, offset, constantSize); - } - - - protected void writeInfo(byte[] code, int offset) - { - int variableIndexSize = variableIndexSize(); - int constantSize = constantSize(); - - if (requiredVariableIndexSize() > variableIndexSize) - { - throw new IllegalArgumentException("Instruction has invalid variable index size ("+this.toString(offset)+")"); - } - - if (requiredConstantSize() > constantSize) - { - throw new IllegalArgumentException("Instruction has invalid constant size ("+this.toString(offset)+")"); - } - - writeValue(code, offset, variableIndex, variableIndexSize); offset += variableIndexSize; - writeSignedValue(code, offset, constant, constantSize); - } - - - public int length(int offset) - { - return (wide ? 2 : 1) + variableIndexSize() + constantSize(); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - instructionVisitor.visitVariableInstruction(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for Object. - - public String toString() - { - return getName() + - (wide ? "_w" : "") + - " v"+variableIndex + - (constantSize() > 0 ? ", "+constant : ""); - } - - - // Small utility methods. - - /** - * Returns the variable index size for this instruction. - */ - private int variableIndexSize() - { - return (opcode >= InstructionConstants.OP_ILOAD_0 && - opcode <= InstructionConstants.OP_ALOAD_3) || - (opcode >= InstructionConstants.OP_ISTORE_0 && - opcode <= InstructionConstants.OP_ASTORE_3) ? 0 : - wide ? 2 : - 1; - } - - - /** - * Computes the required variable index size for this instruction's variable - * index. - */ - private int requiredVariableIndexSize() - { - return (variableIndex & 0x3) == variableIndex ? 0 : - (variableIndex & 0xff) == variableIndex ? 1 : - (variableIndex & 0xffff) == variableIndex ? 2 : - 4; - - } - - - /** - * Returns the constant size for this instruction. - */ - private int constantSize() - { - return opcode != InstructionConstants.OP_IINC ? 0 : - wide ? 2 : - 1; - } - - - /** - * Computes the required constant size for this instruction's constant. - */ - private int requiredConstantSize() - { - return opcode != InstructionConstants.OP_IINC ? 0 : - (byte)constant == constant ? 1 : - (short)constant == constant ? 2 : - 4; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/package.html deleted file mode 100644 index 48c234e3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/package.html +++ /dev/null @@ -1,9 +0,0 @@ - -This package contains classes to represent Java bytecode instructions. -

-Not every instruction currently has its own class. Only groups of instructions -that refer to the constant pool get their own representations. -

-While the package is sufficient for the current needs of the ProGuard -application, it may very well be reorganised and extended in the future. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/AllInstructionVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/AllInstructionVisitor.java deleted file mode 100644 index 244c7ca0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/AllInstructionVisitor.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given InstructionVisitor visit all Instruction - * objects of the CodeAttribute objects it visits. - * - * @author Eric Lafortune - */ -public class AllInstructionVisitor -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final InstructionVisitor instructionVisitor; - - - public AllInstructionVisitor(InstructionVisitor instructionVisitor) - { - this.instructionVisitor = instructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.instructionsAccept(clazz, method, instructionVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionConstantVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionConstantVisitor.java deleted file mode 100644 index 50847d79..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionConstantVisitor.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor lets a given ConstantVisitor visit all constants - * of the instructions it visits. - * - * @author Eric Lafortune - */ -public class InstructionConstantVisitor -extends SimplifiedVisitor -implements InstructionVisitor -{ - private final ConstantVisitor constantVisitor; - - - /** - * Creates a new InstructionConstantVisitor. - * @param constantVisitor the ConstantVisitor to which visits will be - * delegated. - */ - public InstructionConstantVisitor(ConstantVisitor constantVisitor) - { - this.constantVisitor = constantVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - constantVisitor); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionCounter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionCounter.java deleted file mode 100644 index a136d242..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionCounter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor counts the number of instructions that has been visited. - * - * @author Eric Lafortune - */ -public class InstructionCounter -extends SimplifiedVisitor -implements InstructionVisitor -{ - private int count; - - - /** - * Returns the number of instructions that has been visited so far. - */ - public int getCount() - { - return count; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - Instruction instruction) - { - count++; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionVisitor.java deleted file mode 100644 index 69719680..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/InstructionVisitor.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; - - -/** - * This interface specifies the methods for a visitor of - * Instruction objects. - * - * @author Eric Lafortune - */ -public interface InstructionVisitor -{ - public void visitSimpleInstruction( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction); - public void visitVariableInstruction( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction); - public void visitConstantInstruction( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction); - public void visitBranchInstruction( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction); - public void visitTableSwitchInstruction( Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction); - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/MultiInstructionVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/MultiInstructionVisitor.java deleted file mode 100644 index 2727cae8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/MultiInstructionVisitor.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.instruction.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; -import proguard.util.ArrayUtil; - - -/** - * This InstructionVisitor delegates all visits to each InstructionVisitor - * in a given list. - * - * @author Eric Lafortune - */ -public class MultiInstructionVisitor implements InstructionVisitor -{ - private InstructionVisitor[] instructionVisitors; - private int instructionVisitorCount; - - - public MultiInstructionVisitor() - { - this.instructionVisitors = new InstructionVisitor[16]; - } - - - public MultiInstructionVisitor(InstructionVisitor... instructionVisitors) - { - this.instructionVisitors = instructionVisitors; - this.instructionVisitorCount = instructionVisitors.length; - } - - - public void addInstructionVisitor(InstructionVisitor instructionVisitor) - { - instructionVisitors = - ArrayUtil.add(instructionVisitors, - instructionVisitorCount++, - instructionVisitor); - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - for (int index = 0; index < instructionVisitorCount; index++) - { - instructionVisitors[index].visitSimpleInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - } - } - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - for (int index = 0; index < instructionVisitorCount; index++) - { - instructionVisitors[index].visitVariableInstruction(clazz, method, codeAttribute, offset, variableInstruction); - } - } - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - for (int index = 0; index < instructionVisitorCount; index++) - { - instructionVisitors[index].visitConstantInstruction(clazz, method, codeAttribute, offset, constantInstruction); - } - } - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - for (int index = 0; index < instructionVisitorCount; index++) - { - instructionVisitors[index].visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - } - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - for (int index = 0; index < instructionVisitorCount; index++) - { - instructionVisitors[index].visitTableSwitchInstruction(clazz, method, codeAttribute, offset, tableSwitchInstruction); - } - } - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - for (int index = 0; index < instructionVisitorCount; index++) - { - instructionVisitors[index].visitLookUpSwitchInstruction(clazz, method, codeAttribute, offset, lookUpSwitchInstruction); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/package.html deleted file mode 100644 index a31a4082..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/instruction/visitor/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains visitors for instructions. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/LibraryClassReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/LibraryClassReader.java deleted file mode 100644 index 253acaf7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/LibraryClassReader.java +++ /dev/null @@ -1,426 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.io; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.io.DataInput; - -/** - * This ClassVisitor fills out the LibraryClass objects that it visits with data - * from the given DataInput object. - * - * @author Eric Lafortune - */ -public class LibraryClassReader -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor -{ - private static final LibraryField[] EMPTY_LIBRARY_FIELDS = new LibraryField[0]; - private static final LibraryMethod[] EMPTY_LIBRARY_METHODS = new LibraryMethod[0]; - - - private final RuntimeDataInput dataInput; - private final boolean skipNonPublicClasses; - private final boolean skipNonPublicClassMembers; - - // A global array that acts as a parameter for the visitor methods. - private Constant[] constantPool; - - - /** - * Creates a new ProgramClassReader for reading from the given DataInput. - */ - public LibraryClassReader(DataInput dataInput, - boolean skipNonPublicClasses, - boolean skipNonPublicClassMembers) - { - this.dataInput = new RuntimeDataInput(dataInput); - this.skipNonPublicClasses = skipNonPublicClasses; - this.skipNonPublicClassMembers = skipNonPublicClassMembers; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass libraryClass) - { - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Read and check the magic number. - int u4magic = dataInput.readInt(); - - ClassUtil.checkMagicNumber(u4magic); - - // Read and check the version numbers. - int u2minorVersion = dataInput.readUnsignedShort(); - int u2majorVersion = dataInput.readUnsignedShort(); - - int u4version = ClassUtil.internalClassVersion(u2majorVersion, - u2minorVersion); - - ClassUtil.checkVersionNumbers(u4version); - - // Read the constant pool. Note that the first entry is not used. - int u2constantPoolCount = dataInput.readUnsignedShort(); - - // Create the constant pool array. - constantPool = new Constant[u2constantPoolCount]; - - for (int index = 1; index < u2constantPoolCount; index++) - { - Constant constant = createConstant(); - constant.accept(libraryClass, this); - - int tag = constant.getTag(); - if (tag == ClassConstants.CONSTANT_Class || - tag == ClassConstants.CONSTANT_Utf8) - { - constantPool[index] = constant; - } - - // Long constants and double constants take up two entries in the - // constant pool. - if (tag == ClassConstants.CONSTANT_Long || - tag == ClassConstants.CONSTANT_Double) - { - index++; - } - } - - // Read the general class information. - libraryClass.u2accessFlags = dataInput.readUnsignedShort(); - - // We may stop parsing this library class if it's not public anyway. - // E.g. only about 60% of all rt.jar classes need to be parsed. - if (skipNonPublicClasses && - AccessUtil.accessLevel(libraryClass.getAccessFlags()) < AccessUtil.PUBLIC) - { - return; - } - - // Read the class and super class indices. - int u2thisClass = dataInput.readUnsignedShort(); - int u2superClass = dataInput.readUnsignedShort(); - - // Store their actual names. - libraryClass.thisClassName = getClassName(u2thisClass); - libraryClass.superClassName = (u2superClass == 0) ? null : - getClassName(u2superClass); - - // Read the interfaces - int u2interfacesCount = dataInput.readUnsignedShort(); - - libraryClass.interfaceNames = new String[u2interfacesCount]; - for (int index = 0; index < u2interfacesCount; index++) - { - // Store the actual interface name. - int u2interface = dataInput.readUnsignedShort(); - libraryClass.interfaceNames[index] = getClassName(u2interface); - } - - // Read the fields. - int u2fieldsCount = dataInput.readUnsignedShort(); - - // Create the fields array. - LibraryField[] reusableFields = new LibraryField[u2fieldsCount]; - - int visibleFieldsCount = 0; - for (int index = 0; index < u2fieldsCount; index++) - { - LibraryField field = new LibraryField(); - this.visitLibraryMember(libraryClass, field); - - // Only store fields that are visible. - if (AccessUtil.accessLevel(field.getAccessFlags()) >= - (skipNonPublicClassMembers ? AccessUtil.PROTECTED : - AccessUtil.PACKAGE_VISIBLE)) - { - reusableFields[visibleFieldsCount++] = field; - } - } - - // Copy the visible fields (if any) into a fields array of the right size. - if (visibleFieldsCount == 0) - { - libraryClass.fields = EMPTY_LIBRARY_FIELDS; - } - else - { - libraryClass.fields = new LibraryField[visibleFieldsCount]; - System.arraycopy(reusableFields, 0, libraryClass.fields, 0, visibleFieldsCount); - } - - // Read the methods. - int u2methodsCount = dataInput.readUnsignedShort(); - - // Create the methods array. - LibraryMethod[] reusableMethods = new LibraryMethod[u2methodsCount]; - - int visibleMethodsCount = 0; - for (int index = 0; index < u2methodsCount; index++) - { - LibraryMethod method = new LibraryMethod(); - this.visitLibraryMember(libraryClass, method); - - // Only store methods that are visible. - if (AccessUtil.accessLevel(method.getAccessFlags()) >= - (skipNonPublicClassMembers ? AccessUtil.PROTECTED : - AccessUtil.PACKAGE_VISIBLE)) - { - reusableMethods[visibleMethodsCount++] = method; - } - } - - // Copy the visible methods (if any) into a methods array of the right size. - if (visibleMethodsCount == 0) - { - libraryClass.methods = EMPTY_LIBRARY_METHODS; - } - else - { - libraryClass.methods = new LibraryMethod[visibleMethodsCount]; - System.arraycopy(reusableMethods, 0, libraryClass.methods, 0, visibleMethodsCount); - } - - // Skip the class attributes. - skipAttributes(); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass libraryClass, ProgramMember libraryMember) - { - } - - - public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) - { - // Read the general field information. - libraryMember.u2accessFlags = dataInput.readUnsignedShort(); - libraryMember.name = getString(dataInput.readUnsignedShort()); - libraryMember.descriptor = getString(dataInput.readUnsignedShort()); - - // Skip the field attributes. - skipAttributes(); - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - dataInput.skipBytes(4); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - dataInput.skipBytes(8); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - dataInput.skipBytes(4); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - dataInput.skipBytes(8); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - char u2primitiveType = dataInput.readChar(); - int u4length = dataInput.readInt(); - - dataInput.skipBytes(primitiveSize(u2primitiveType) * u4length); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - dataInput.skipBytes(2); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - int u2length = dataInput.readUnsignedShort(); - - // Read the UTF-8 bytes. - byte[] bytes = new byte[u2length]; - dataInput.readFully(bytes); - utf8Constant.setBytes(bytes); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - dataInput.skipBytes(4); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - dataInput.skipBytes(3); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - dataInput.skipBytes(4); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.u2nameIndex = dataInput.readUnsignedShort(); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - dataInput.skipBytes(2); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - dataInput.skipBytes(4); - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - dataInput.skipBytes(2); - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - dataInput.skipBytes(2); - } - - // Small utility methods. - - /** - * Returns the class name of the ClassConstant at the specified index in the - * reusable constant pool. - */ - private String getClassName(int constantIndex) - { - ClassConstant classEntry = (ClassConstant)constantPool[constantIndex]; - - return getString(classEntry.u2nameIndex); - } - - - /** - * Returns the string of the Utf8Constant at the specified index in the - * reusable constant pool. - */ - private String getString(int constantIndex) - { - return ((Utf8Constant)constantPool[constantIndex]).getString(); - } - - - private Constant createConstant() - { - int u1tag = dataInput.readUnsignedByte(); - - switch (u1tag) - { - case ClassConstants.CONSTANT_Integer: return new IntegerConstant(); - case ClassConstants.CONSTANT_Float: return new FloatConstant(); - case ClassConstants.CONSTANT_Long: return new LongConstant(); - case ClassConstants.CONSTANT_Double: return new DoubleConstant(); - case ClassConstants.CONSTANT_String: return new StringConstant(); - case ClassConstants.CONSTANT_Utf8: return new Utf8Constant(); - case ClassConstants.CONSTANT_InvokeDynamic: return new InvokeDynamicConstant(); - case ClassConstants.CONSTANT_MethodHandle: return new MethodHandleConstant(); - case ClassConstants.CONSTANT_Fieldref: return new FieldrefConstant(); - case ClassConstants.CONSTANT_Methodref: return new MethodrefConstant(); - case ClassConstants.CONSTANT_InterfaceMethodref: return new InterfaceMethodrefConstant(); - case ClassConstants.CONSTANT_Class: return new ClassConstant(); - case ClassConstants.CONSTANT_MethodType: return new MethodTypeConstant(); - case ClassConstants.CONSTANT_NameAndType: return new NameAndTypeConstant(); - case ClassConstants.CONSTANT_Module: return new ModuleConstant(); - case ClassConstants.CONSTANT_Package: return new PackageConstant(); - - default: throw new RuntimeException("Unknown constant type ["+u1tag+"] in constant pool"); - } - } - - - private void skipAttributes() - { - int u2attributesCount = dataInput.readUnsignedShort(); - - for (int index = 0; index < u2attributesCount; index++) - { - skipAttribute(); - } - } - - - private void skipAttribute() - { - dataInput.skipBytes(2); - int u4attributeLength = dataInput.readInt(); - dataInput.skipBytes(u4attributeLength); - } - - - /** - * Returns the size in bytes of the given primitive type. - */ - private int primitiveSize(char primitiveType) - { - switch (primitiveType) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: return 1; - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: return 2; - case ClassConstants.TYPE_INT: - case ClassConstants.TYPE_FLOAT: return 4; - case ClassConstants.TYPE_LONG: - case ClassConstants.TYPE_DOUBLE: return 8; - } - - return 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/ProgramClassReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/ProgramClassReader.java deleted file mode 100644 index f6a31681..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/ProgramClassReader.java +++ /dev/null @@ -1,1387 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.io; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.*; -import proguard.classfile.attribute.annotation.target.visitor.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.module.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.io.DataInput; - -/** - * This ClassVisitor fills out the ProgramClass objects that it visits with data - * from the given DataInput object. - * - * @author Eric Lafortune - */ -public class ProgramClassReader -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor, - AttributeVisitor, - BootstrapMethodInfoVisitor, - InnerClassesInfoVisitor, - ExceptionInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - LineNumberInfoVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - RequiresInfoVisitor, - ExportsInfoVisitor, - OpensInfoVisitor, - ProvidesInfoVisitor, - AnnotationVisitor, - TypeAnnotationVisitor, - TargetInfoVisitor, - TypePathInfoVisitor, - LocalVariableTargetElementVisitor, - ElementValueVisitor -{ - private final RuntimeDataInput dataInput; - - - /** - * Creates a new ProgramClassReader for reading from the given DataInput. - */ - public ProgramClassReader(DataInput dataInput) - { - this.dataInput = new RuntimeDataInput(dataInput); - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Read and check the magic number. - int u4magic = dataInput.readInt(); - - ClassUtil.checkMagicNumber(u4magic); - - // Read and check the version numbers. - int u2minorVersion = dataInput.readUnsignedShort(); - int u2majorVersion = dataInput.readUnsignedShort(); - - programClass.u4version = ClassUtil.internalClassVersion(u2majorVersion, - u2minorVersion); - - ClassUtil.checkVersionNumbers(programClass.u4version); - - // Read the constant pool. Note that the first entry is not used. - programClass.u2constantPoolCount = dataInput.readUnsignedShort(); - - programClass.constantPool = new Constant[programClass.u2constantPoolCount]; - for (int index = 1; index < programClass.u2constantPoolCount; index++) - { - Constant constant = createConstant(); - constant.accept(programClass, this); - programClass.constantPool[index] = constant; - - // Long constants and double constants take up two entries in the - // constant pool. - int tag = constant.getTag(); - if (tag == ClassConstants.CONSTANT_Long || - tag == ClassConstants.CONSTANT_Double) - { - programClass.constantPool[++index] = null; - } - } - - // Read the general class information. - programClass.u2accessFlags = dataInput.readUnsignedShort(); - programClass.u2thisClass = dataInput.readUnsignedShort(); - programClass.u2superClass = dataInput.readUnsignedShort(); - - // Read the interfaces. - programClass.u2interfacesCount = dataInput.readUnsignedShort(); - - programClass.u2interfaces = new int[programClass.u2interfacesCount]; - for (int index = 0; index < programClass.u2interfacesCount; index++) - { - programClass.u2interfaces[index] = dataInput.readUnsignedShort(); - } - - // Read the fields. - programClass.u2fieldsCount = dataInput.readUnsignedShort(); - - programClass.fields = new ProgramField[programClass.u2fieldsCount]; - for (int index = 0; index < programClass.u2fieldsCount; index++) - { - ProgramField programField = new ProgramField(); - this.visitProgramField(programClass, programField); - programClass.fields[index] = programField; - } - - // Read the methods. - programClass.u2methodsCount = dataInput.readUnsignedShort(); - - programClass.methods = new ProgramMethod[programClass.u2methodsCount]; - for (int index = 0; index < programClass.u2methodsCount; index++) - { - ProgramMethod programMethod = new ProgramMethod(); - this.visitProgramMethod(programClass, programMethod); - programClass.methods[index] = programMethod; - } - - // Read the class attributes. - programClass.u2attributesCount = dataInput.readUnsignedShort(); - - programClass.attributes = new Attribute[programClass.u2attributesCount]; - for (int index = 0; index < programClass.u2attributesCount; index++) - { - Attribute attribute = createAttribute(programClass); - attribute.accept(programClass, this); - programClass.attributes[index] = attribute; - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Read the general field information. - programField.u2accessFlags = dataInput.readUnsignedShort(); - programField.u2nameIndex = dataInput.readUnsignedShort(); - programField.u2descriptorIndex = dataInput.readUnsignedShort(); - - // Read the field attributes. - programField.u2attributesCount = dataInput.readUnsignedShort(); - - programField.attributes = new Attribute[programField.u2attributesCount]; - for (int index = 0; index < programField.u2attributesCount; index++) - { - Attribute attribute = createAttribute(programClass); - attribute.accept(programClass, programField, this); - programField.attributes[index] = attribute; - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Read the general method information. - programMethod.u2accessFlags = dataInput.readUnsignedShort(); - programMethod.u2nameIndex = dataInput.readUnsignedShort(); - programMethod.u2descriptorIndex = dataInput.readUnsignedShort(); - - // Read the method attributes. - programMethod.u2attributesCount = dataInput.readUnsignedShort(); - - programMethod.attributes = new Attribute[programMethod.u2attributesCount]; - for (int index = 0; index < programMethod.u2attributesCount; index++) - { - Attribute attribute = createAttribute(programClass); - attribute.accept(programClass, programMethod, this); - programMethod.attributes[index] = attribute; - } - } - - - public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) - { - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - integerConstant.u4value = dataInput.readInt(); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - longConstant.u8value = dataInput.readLong(); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - floatConstant.f4value = dataInput.readFloat(); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - doubleConstant.f8value = dataInput.readDouble(); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - char u2primitiveType = dataInput.readChar(); - int u4length = dataInput.readInt(); - - switch (u2primitiveType) - { - case ClassConstants.TYPE_BOOLEAN: - { - boolean[] values = new boolean[u4length]; - - for (int index = 0; index < u4length; index++) - { - values[index] = dataInput.readBoolean(); - } - - primitiveArrayConstant.values = values; - break; - } - case ClassConstants.TYPE_BYTE: - { - byte[] values = new byte[u4length]; - dataInput.readFully(values); - - primitiveArrayConstant.values = values; - break; - } - case ClassConstants.TYPE_CHAR: - { - char[] values = new char[u4length]; - - for (int index = 0; index < u4length; index++) - { - values[index] = dataInput.readChar(); - } - - primitiveArrayConstant.values = values; - break; - } - case ClassConstants.TYPE_SHORT: - { - short[] values = new short[u4length]; - - for (int index = 0; index < u4length; index++) - { - values[index] = dataInput.readShort(); - } - - primitiveArrayConstant.values = values; - break; - } - case ClassConstants.TYPE_INT: - { - int[] values = new int[u4length]; - - for (int index = 0; index < u4length; index++) - { - values[index] = dataInput.readInt(); - } - - primitiveArrayConstant.values = values; - break; - } - case ClassConstants.TYPE_FLOAT: - { - float[] values = new float[u4length]; - - for (int index = 0; index < u4length; index++) - { - values[index] = dataInput.readFloat(); - } - - primitiveArrayConstant.values = values; - break; - } - case ClassConstants.TYPE_LONG: - { - long[] values = new long[u4length]; - - for (int index = 0; index < u4length; index++) - { - values[index] = dataInput.readLong(); - } - - primitiveArrayConstant.values = values; - break; - } - case ClassConstants.TYPE_DOUBLE: - { - double[] values = new double[u4length]; - - for (int index = 0; index < u4length; index++) - { - values[index] = dataInput.readDouble(); - } - - primitiveArrayConstant.values = values; - break; - } - } - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - stringConstant.u2stringIndex = dataInput.readUnsignedShort(); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - int u2length = dataInput.readUnsignedShort(); - - // Read the UTF-8 bytes. - byte[] bytes = new byte[u2length]; - dataInput.readFully(bytes); - utf8Constant.setBytes(bytes); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - invokeDynamicConstant.u2bootstrapMethodAttributeIndex = dataInput.readUnsignedShort(); - invokeDynamicConstant.u2nameAndTypeIndex = dataInput.readUnsignedShort(); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - methodHandleConstant.u1referenceKind = dataInput.readUnsignedByte(); - methodHandleConstant.u2referenceIndex = dataInput.readUnsignedShort(); - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - moduleConstant.u2nameIndex = dataInput.readUnsignedShort(); - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - packageConstant.u2nameIndex = dataInput.readUnsignedShort(); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - refConstant.u2classIndex = dataInput.readUnsignedShort(); - refConstant.u2nameAndTypeIndex = dataInput.readUnsignedShort(); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.u2nameIndex = dataInput.readUnsignedShort(); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - methodTypeConstant.u2descriptorIndex = dataInput.readUnsignedShort(); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - nameAndTypeConstant.u2nameIndex = dataInput.readUnsignedShort(); - nameAndTypeConstant.u2descriptorIndex = dataInput.readUnsignedShort(); - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - // Read the unknown information. - byte[] info = new byte[unknownAttribute.u4attributeLength]; - dataInput.readFully(info); - unknownAttribute.info = info; - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - // Read the bootstrap methods. - bootstrapMethodsAttribute.u2bootstrapMethodsCount = dataInput.readUnsignedShort(); - - bootstrapMethodsAttribute.bootstrapMethods = new BootstrapMethodInfo[bootstrapMethodsAttribute.u2bootstrapMethodsCount]; - for (int index = 0; index < bootstrapMethodsAttribute.u2bootstrapMethodsCount; index++) - { - BootstrapMethodInfo bootstrapMethodInfo = new BootstrapMethodInfo(); - visitBootstrapMethodInfo(clazz, bootstrapMethodInfo); - bootstrapMethodsAttribute.bootstrapMethods[index] = bootstrapMethodInfo; - } - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - sourceFileAttribute.u2sourceFileIndex = dataInput.readUnsignedShort(); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - sourceDirAttribute.u2sourceDirIndex = dataInput.readUnsignedShort(); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Read the inner classes. - innerClassesAttribute.u2classesCount = dataInput.readUnsignedShort(); - - innerClassesAttribute.classes = new InnerClassesInfo[innerClassesAttribute.u2classesCount]; - for (int index = 0; index < innerClassesAttribute.u2classesCount; index++) - { - InnerClassesInfo innerClassesInfo = new InnerClassesInfo(); - visitInnerClassesInfo(clazz, innerClassesInfo); - innerClassesAttribute.classes[index] = innerClassesInfo; - } - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - enclosingMethodAttribute.u2classIndex = dataInput.readUnsignedShort(); - enclosingMethodAttribute.u2nameAndTypeIndex = dataInput.readUnsignedShort(); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - moduleAttribute.u2moduleNameIndex = dataInput.readUnsignedShort(); - moduleAttribute.u2moduleFlags = dataInput.readUnsignedShort(); - moduleAttribute.u2moduleVersionIndex = dataInput.readUnsignedShort(); - - // Read the requires. - moduleAttribute.u2requiresCount = dataInput.readUnsignedShort(); - - moduleAttribute.requires = new RequiresInfo[moduleAttribute.u2requiresCount]; - for (int index = 0; index < moduleAttribute.u2requiresCount; index++) - { - RequiresInfo requiresInfo = new RequiresInfo(); - visitRequiresInfo(clazz, requiresInfo); - moduleAttribute.requires[index] = requiresInfo; - } - - // Read the exports. - moduleAttribute.u2exportsCount = dataInput.readUnsignedShort(); - - moduleAttribute.exports = new ExportsInfo[moduleAttribute.u2exportsCount]; - for (int index = 0; index < moduleAttribute.u2exportsCount; index++) - { - ExportsInfo exportsInfo = new ExportsInfo(); - visitExportsInfo(clazz, exportsInfo); - moduleAttribute.exports[index] = exportsInfo; - } - - // Read the opens. - moduleAttribute.u2opensCount = dataInput.readUnsignedShort(); - - moduleAttribute.opens = new OpensInfo[moduleAttribute.u2opensCount]; - for (int index = 0; index < moduleAttribute.u2opensCount; index++) - { - OpensInfo opensInfo = new OpensInfo(); - visitOpensInfo(clazz, opensInfo); - moduleAttribute.opens[index] = opensInfo; - } - - // Read the uses. - moduleAttribute.u2usesCount = dataInput.readUnsignedShort(); - - moduleAttribute.u2uses = new int[moduleAttribute.u2usesCount]; - for (int index = 0; index < moduleAttribute.u2usesCount; index++) - { - moduleAttribute.u2uses[index] = dataInput.readUnsignedShort(); - } - - // Read the provides. - moduleAttribute.u2providesCount = dataInput.readUnsignedShort(); - - moduleAttribute.provides = new ProvidesInfo[moduleAttribute.u2providesCount]; - for (int index = 0; index < moduleAttribute.u2providesCount; index++) - { - ProvidesInfo providesInfo = new ProvidesInfo(); - visitProvidesInfo(clazz, providesInfo); - moduleAttribute.provides[index] = providesInfo; - } - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - moduleMainClassAttribute.u2mainClass = dataInput.readUnsignedShort(); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - // Read the packages. - modulePackagesAttribute.u2packagesCount = dataInput.readUnsignedShort(); - - modulePackagesAttribute.u2packages = new int[modulePackagesAttribute.u2packagesCount]; - for (int index = 0; index < modulePackagesAttribute.u2packagesCount; index++) { - modulePackagesAttribute.u2packages[index] = dataInput.readUnsignedShort(); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - // This attribute does not contain any additional information. - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - // This attribute does not contain any additional information. - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - signatureAttribute.u2signatureIndex = dataInput.readUnsignedShort(); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - constantValueAttribute.u2constantValueIndex = dataInput.readUnsignedShort(); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - // Read the parameter information. - methodParametersAttribute.u1parametersCount = dataInput.readUnsignedByte(); - - methodParametersAttribute.parameters = new ParameterInfo[methodParametersAttribute.u1parametersCount]; - for (int index = 0; index < methodParametersAttribute.u1parametersCount; index++) - { - ParameterInfo parameterInfo = new ParameterInfo(); - visitParameterInfo(clazz, method, index, parameterInfo); - methodParametersAttribute.parameters[index] = parameterInfo; - } - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - // Read the exceptions. - exceptionsAttribute.u2exceptionIndexTableLength = dataInput.readUnsignedShort(); - - exceptionsAttribute.u2exceptionIndexTable = new int[exceptionsAttribute.u2exceptionIndexTableLength]; - for (int index = 0; index < exceptionsAttribute.u2exceptionIndexTableLength; index++) - { - exceptionsAttribute.u2exceptionIndexTable[index] = dataInput.readUnsignedShort(); - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Read the stack size and local variable frame size. - codeAttribute.u2maxStack = dataInput.readUnsignedShort(); - codeAttribute.u2maxLocals = dataInput.readUnsignedShort(); - - // Read the byte code. - codeAttribute.u4codeLength = dataInput.readInt(); - - byte[] code = new byte[codeAttribute.u4codeLength]; - dataInput.readFully(code); - codeAttribute.code = code; - - // Read the exceptions. - codeAttribute.u2exceptionTableLength = dataInput.readUnsignedShort(); - - codeAttribute.exceptionTable = new ExceptionInfo[codeAttribute.u2exceptionTableLength]; - for (int index = 0; index < codeAttribute.u2exceptionTableLength; index++) - { - ExceptionInfo exceptionInfo = new ExceptionInfo(); - visitExceptionInfo(clazz, method, codeAttribute, exceptionInfo); - codeAttribute.exceptionTable[index] = exceptionInfo; - } - - // Read the code attributes. - codeAttribute.u2attributesCount = dataInput.readUnsignedShort(); - - codeAttribute.attributes = new Attribute[codeAttribute.u2attributesCount]; - for (int index = 0; index < codeAttribute.u2attributesCount; index++) - { - Attribute attribute = createAttribute(clazz); - attribute.accept(clazz, method, codeAttribute, this); - codeAttribute.attributes[index] = attribute; - } - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - // Read the stack map frames (only full frames, without tag). - stackMapAttribute.u2stackMapFramesCount = dataInput.readUnsignedShort(); - - stackMapAttribute.stackMapFrames = new FullFrame[stackMapAttribute.u2stackMapFramesCount]; - for (int index = 0; index < stackMapAttribute.u2stackMapFramesCount; index++) - { - FullFrame stackMapFrame = new FullFrame(); - visitFullFrame(clazz, method, codeAttribute, index, stackMapFrame); - stackMapAttribute.stackMapFrames[index] = stackMapFrame; - } - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - // Read the stack map frames. - stackMapTableAttribute.u2stackMapFramesCount = dataInput.readUnsignedShort(); - - stackMapTableAttribute.stackMapFrames = new StackMapFrame[stackMapTableAttribute.u2stackMapFramesCount]; - for (int index = 0; index < stackMapTableAttribute.u2stackMapFramesCount; index++) - { - StackMapFrame stackMapFrame = createStackMapFrame(); - stackMapFrame.accept(clazz, method, codeAttribute, 0, this); - stackMapTableAttribute.stackMapFrames[index] = stackMapFrame; - } - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - // Read the line numbers. - lineNumberTableAttribute.u2lineNumberTableLength = dataInput.readUnsignedShort(); - - lineNumberTableAttribute.lineNumberTable = new LineNumberInfo[lineNumberTableAttribute.u2lineNumberTableLength]; - for (int index = 0; index < lineNumberTableAttribute.u2lineNumberTableLength; index++) - { - LineNumberInfo lineNumberInfo = new LineNumberInfo(); - visitLineNumberInfo(clazz, method, codeAttribute, lineNumberInfo); - lineNumberTableAttribute.lineNumberTable[index] = lineNumberInfo; - } - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Read the local variables. - localVariableTableAttribute.u2localVariableTableLength = dataInput.readUnsignedShort(); - - localVariableTableAttribute.localVariableTable = new LocalVariableInfo[localVariableTableAttribute.u2localVariableTableLength]; - for (int index = 0; index < localVariableTableAttribute.u2localVariableTableLength; index++) - { - LocalVariableInfo localVariableInfo = new LocalVariableInfo(); - visitLocalVariableInfo(clazz, method, codeAttribute, localVariableInfo); - localVariableTableAttribute.localVariableTable[index] = localVariableInfo; - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Read the local variable types. - localVariableTypeTableAttribute.u2localVariableTypeTableLength = dataInput.readUnsignedShort(); - - localVariableTypeTableAttribute.localVariableTypeTable = new LocalVariableTypeInfo[localVariableTypeTableAttribute.u2localVariableTypeTableLength]; - for (int index = 0; index < localVariableTypeTableAttribute.u2localVariableTypeTableLength; index++) - { - LocalVariableTypeInfo localVariableTypeInfo = new LocalVariableTypeInfo(); - visitLocalVariableTypeInfo(clazz, method, codeAttribute, localVariableTypeInfo); - localVariableTypeTableAttribute.localVariableTypeTable[index] = localVariableTypeInfo; - } - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Read the annotations. - annotationsAttribute.u2annotationsCount = dataInput.readUnsignedShort(); - - annotationsAttribute.annotations = new Annotation[annotationsAttribute.u2annotationsCount]; - for (int index = 0; index < annotationsAttribute.u2annotationsCount; index++) - { - Annotation annotation = new Annotation(); - visitAnnotation(clazz, annotation); - annotationsAttribute.annotations[index] = annotation; - } - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Read the parameter annotations. - parameterAnnotationsAttribute.u1parametersCount = dataInput.readUnsignedByte(); - - // The java compilers of JDK 1.5, JDK 1.6, and Eclipse all count the - // number of parameters of constructors of non-static inner classes - // incorrectly. Fix it right here. - int parameterStart = 0; - if (method.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT)) - { - int realParametersCount = ClassUtil.internalMethodParameterCount(method.getDescriptor(clazz)); - parameterStart = realParametersCount - parameterAnnotationsAttribute.u1parametersCount; - parameterAnnotationsAttribute.u1parametersCount = realParametersCount; - } - - parameterAnnotationsAttribute.u2parameterAnnotationsCount = new int[parameterAnnotationsAttribute.u1parametersCount]; - parameterAnnotationsAttribute.parameterAnnotations = new Annotation[parameterAnnotationsAttribute.u1parametersCount][]; - - for (int parameterIndex = parameterStart; parameterIndex < parameterAnnotationsAttribute.u1parametersCount; parameterIndex++) - { - // Read the parameter annotations of the given parameter. - int u2annotationsCount = dataInput.readUnsignedShort(); - - Annotation[] annotations = new Annotation[u2annotationsCount]; - - for (int index = 0; index < u2annotationsCount; index++) - { - Annotation annotation = new Annotation(); - visitAnnotation(clazz, annotation); - annotations[index] = annotation; - } - - parameterAnnotationsAttribute.u2parameterAnnotationsCount[parameterIndex] = u2annotationsCount; - parameterAnnotationsAttribute.parameterAnnotations[parameterIndex] = annotations; - } - } - - - public void visitAnyTypeAnnotationsAttribute(Clazz clazz, TypeAnnotationsAttribute typeAnnotationsAttribute) - { - // Read the type annotations. - typeAnnotationsAttribute.u2annotationsCount = dataInput.readUnsignedShort(); - - typeAnnotationsAttribute.annotations = new TypeAnnotation[typeAnnotationsAttribute.u2annotationsCount]; - for (int index = 0; index < typeAnnotationsAttribute.u2annotationsCount; index++) - { - TypeAnnotation typeAnnotation = new TypeAnnotation(); - visitTypeAnnotation(clazz, typeAnnotation); - typeAnnotationsAttribute.annotations[index] = typeAnnotation; - } - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Read the default element value. - ElementValue elementValue = createElementValue(); - elementValue.accept(clazz, null, this); - annotationDefaultAttribute.defaultValue = elementValue; - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - bootstrapMethodInfo.u2methodHandleIndex = dataInput.readUnsignedShort(); - - // Read the bootstrap method arguments. - bootstrapMethodInfo.u2methodArgumentCount = dataInput.readUnsignedShort(); - bootstrapMethodInfo.u2methodArguments = new int[bootstrapMethodInfo.u2methodArgumentCount]; - for (int index = 0; index < bootstrapMethodInfo.u2methodArgumentCount; index++) - { - bootstrapMethodInfo.u2methodArguments[index] = dataInput.readUnsignedShort(); - } - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - innerClassesInfo.u2innerClassIndex = dataInput.readUnsignedShort(); - innerClassesInfo.u2outerClassIndex = dataInput.readUnsignedShort(); - innerClassesInfo.u2innerNameIndex = dataInput.readUnsignedShort(); - innerClassesInfo.u2innerClassAccessFlags = dataInput.readUnsignedShort(); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - exceptionInfo.u2startPC = dataInput.readUnsignedShort(); - exceptionInfo.u2endPC = dataInput.readUnsignedShort(); - exceptionInfo.u2handlerPC = dataInput.readUnsignedShort(); - exceptionInfo.u2catchType = dataInput.readUnsignedShort(); - } - - - // Implementations for StackMapFrameVisitor. - - public void visitSameZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameZeroFrame sameZeroFrame) - { - if (sameZeroFrame.getTag() == StackMapFrame.SAME_ZERO_FRAME_EXTENDED) - { - sameZeroFrame.u2offsetDelta = dataInput.readUnsignedShort(); - } - } - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - if (sameOneFrame.getTag() == StackMapFrame.SAME_ONE_FRAME_EXTENDED) - { - sameOneFrame.u2offsetDelta = dataInput.readUnsignedShort(); - } - - // Read the verification type of the stack entry. - VerificationType verificationType = createVerificationType(); - verificationType.accept(clazz, method, codeAttribute, offset, this); - sameOneFrame.stackItem = verificationType; - } - - - public void visitLessZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LessZeroFrame lessZeroFrame) - { - lessZeroFrame.u2offsetDelta = dataInput.readUnsignedShort(); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - moreZeroFrame.u2offsetDelta = dataInput.readUnsignedShort(); - - // Read the verification types of the additional local variables. - moreZeroFrame.additionalVariables = new VerificationType[moreZeroFrame.additionalVariablesCount]; - for (int index = 0; index < moreZeroFrame.additionalVariablesCount; index++) - { - VerificationType verificationType = createVerificationType(); - verificationType.accept(clazz, method, codeAttribute, offset, this); - moreZeroFrame.additionalVariables[index] = verificationType; - } - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - fullFrame.u2offsetDelta = dataInput.readUnsignedShort(); - - // Read the verification types of the local variables. - fullFrame.variablesCount = dataInput.readUnsignedShort(); - fullFrame.variables = new VerificationType[fullFrame.variablesCount]; - for (int index = 0; index < fullFrame.variablesCount; index++) - { - VerificationType verificationType = createVerificationType(); - verificationType.variablesAccept(clazz, method, codeAttribute, offset, index, this); - fullFrame.variables[index] = verificationType; - } - - // Read the verification types of the stack entries. - fullFrame.stackCount = dataInput.readUnsignedShort(); - fullFrame.stack = new VerificationType[fullFrame.stackCount]; - for (int index = 0; index < fullFrame.stackCount; index++) - { - VerificationType verificationType = createVerificationType(); - verificationType.stackAccept(clazz, method, codeAttribute, offset, index, this); - fullFrame.stack[index] = verificationType; - } - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) - { - // Most verification types don't contain any additional information. - } - - - public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) - { - objectType.u2classIndex = dataInput.readUnsignedShort(); - } - - - public void visitUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType) - { - uninitializedType.u2newInstructionOffset = dataInput.readUnsignedShort(); - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - lineNumberInfo.u2startPC = dataInput.readUnsignedShort(); - lineNumberInfo.u2lineNumber = dataInput.readUnsignedShort(); - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - parameterInfo.u2nameIndex = dataInput.readUnsignedShort(); - parameterInfo.u2accessFlags = dataInput.readUnsignedShort(); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - localVariableInfo.u2startPC = dataInput.readUnsignedShort(); - localVariableInfo.u2length = dataInput.readUnsignedShort(); - localVariableInfo.u2nameIndex = dataInput.readUnsignedShort(); - localVariableInfo.u2descriptorIndex = dataInput.readUnsignedShort(); - localVariableInfo.u2index = dataInput.readUnsignedShort(); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - localVariableTypeInfo.u2startPC = dataInput.readUnsignedShort(); - localVariableTypeInfo.u2length = dataInput.readUnsignedShort(); - localVariableTypeInfo.u2nameIndex = dataInput.readUnsignedShort(); - localVariableTypeInfo.u2signatureIndex = dataInput.readUnsignedShort(); - localVariableTypeInfo.u2index = dataInput.readUnsignedShort(); - } - - - // Implementations for RequiresInfoVisitor. - - public void visitRequiresInfo(Clazz clazz, RequiresInfo requiresInfo) - { - requiresInfo.u2requiresIndex = dataInput.readUnsignedShort(); - requiresInfo.u2requiresFlags = dataInput.readUnsignedShort(); - requiresInfo.u2requiresVersionIndex = dataInput.readUnsignedShort(); - } - - - // Implementations for ExportsInfoVisitor. - - public void visitExportsInfo(Clazz clazz, ExportsInfo exportsInfo) - { - exportsInfo.u2exportsIndex = dataInput.readUnsignedShort(); - exportsInfo.u2exportsFlags = dataInput.readUnsignedShort(); - - // Read the targets. - exportsInfo.u2exportsToCount = dataInput.readUnsignedShort(); - - exportsInfo.u2exportsToIndex = new int[exportsInfo.u2exportsToCount]; - for (int index = 0; index < exportsInfo.u2exportsToCount; index++) - { - exportsInfo.u2exportsToIndex[index] = dataInput.readUnsignedShort(); - } - } - - - // Implementations for OpensInfoVisitor. - - public void visitOpensInfo(Clazz clazz, OpensInfo opensInfo) - { - opensInfo.u2opensIndex = dataInput.readUnsignedShort(); - opensInfo.u2opensFlags = dataInput.readUnsignedShort(); - - // Read the targets. - opensInfo.u2opensToCount = dataInput.readUnsignedShort(); - - opensInfo.u2opensToIndex = new int[opensInfo.u2opensToCount]; - for (int index = 0; index < opensInfo.u2opensToCount; index++) - { - opensInfo.u2opensToIndex[index] = dataInput.readUnsignedShort(); - } - } - - - // Implementations for ProvidesInfoVisitor. - - public void visitProvidesInfo(Clazz clazz, ProvidesInfo providesInfo) - { - providesInfo.u2providesIndex = dataInput.readUnsignedShort(); - - // Read the withs. - providesInfo.u2providesWithCount = dataInput.readUnsignedShort(); - - providesInfo.u2providesWithIndex = new int[providesInfo.u2providesWithCount]; - for (int index = 0; index < providesInfo.u2providesWithCount; index++) - { - providesInfo.u2providesWithIndex[index] = dataInput.readUnsignedShort(); - } - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - // Read the annotation type. - annotation.u2typeIndex = dataInput.readUnsignedShort(); - - // Read the element value pairs. - annotation.u2elementValuesCount = dataInput.readUnsignedShort(); - - annotation.elementValues = new ElementValue[annotation.u2elementValuesCount]; - for (int index = 0; index < annotation.u2elementValuesCount; index++) - { - int u2elementNameIndex = dataInput.readUnsignedShort(); - ElementValue elementValue = createElementValue(); - elementValue.u2elementNameIndex = u2elementNameIndex; - elementValue.accept(clazz, annotation, this); - annotation.elementValues[index] = elementValue; - } - } - - - // Implementations for TypeAnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - // Read the target info. - TargetInfo targetInfo = createTargetInfo(); - targetInfo.accept(clazz, typeAnnotation, this); - typeAnnotation.targetInfo = targetInfo; - - // Read the type path. - int u1pathLength = dataInput.readUnsignedByte(); - - typeAnnotation.typePath = new TypePathInfo[u1pathLength]; - for (int index = 0; index < u1pathLength; index++) - { - TypePathInfo typePathInfo = new TypePathInfo(); - visitTypePathInfo(clazz, typeAnnotation, typePathInfo); - typeAnnotation.typePath[index] = typePathInfo; - } - - // Read the actual annotation. - visitAnnotation(clazz, typeAnnotation); - } - - - // Implementations for TargetInfoVisitor. - - public void visitTypeParameterTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) - { - typeParameterTargetInfo.u1typeParameterIndex = dataInput.readUnsignedByte(); - } - - - public void visitSuperTypeTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, SuperTypeTargetInfo superTypeTargetInfo) - { - superTypeTargetInfo.u2superTypeIndex = dataInput.readUnsignedShort(); - } - - - public void visitTypeParameterBoundTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - typeParameterBoundTargetInfo.u1typeParameterIndex = dataInput.readUnsignedByte(); - typeParameterBoundTargetInfo.u1boundIndex = dataInput.readUnsignedByte(); - } - - - public void visitEmptyTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) - { - } - - - public void visitFormalParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, FormalParameterTargetInfo formalParameterTargetInfo) - { - formalParameterTargetInfo.u1formalParameterIndex = dataInput.readUnsignedByte(); - } - - - public void visitThrowsTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, ThrowsTargetInfo throwsTargetInfo) - { - throwsTargetInfo.u2throwsTypeIndex = dataInput.readUnsignedShort(); - } - - - public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) - { - // Read the local variable target elements. - localVariableTargetInfo.u2tableLength = dataInput.readUnsignedShort(); - - localVariableTargetInfo.table = new LocalVariableTargetElement[localVariableTargetInfo.u2tableLength]; - for (int index = 0; index < localVariableTargetInfo.u2tableLength; index++) - { - LocalVariableTargetElement element = new LocalVariableTargetElement(); - visitLocalVariableTargetElement(clazz, method, codeAttribute, typeAnnotation, localVariableTargetInfo, element); - localVariableTargetInfo.table[index] = element; - } - } - - - public void visitCatchTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo catchTargetInfo) - { - catchTargetInfo.u2exceptionTableIndex = dataInput.readUnsignedShort(); - } - - - public void visitOffsetTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo) - { - offsetTargetInfo.u2offset = dataInput.readUnsignedShort(); - } - - - public void visitTypeArgumentTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo typeArgumentTargetInfo) - { - typeArgumentTargetInfo.u2offset = dataInput.readUnsignedShort(); - typeArgumentTargetInfo.u1typeArgumentIndex = dataInput.readUnsignedByte(); - } - - - // Implementations for TypePathInfoVisitor. - - public void visitTypePathInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - typePathInfo.u1typePathKind = dataInput.readUnsignedByte(); - typePathInfo.u1typeArgumentIndex = dataInput.readUnsignedByte(); - } - - - // Implementations for LocalVariableTargetElementVisitor. - - public void visitLocalVariableTargetElement(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo, LocalVariableTargetElement localVariableTargetElement) - { - localVariableTargetElement.u2startPC = dataInput.readShort(); - localVariableTargetElement.u2length = dataInput.readShort(); - localVariableTargetElement.u2index = dataInput.readShort(); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - constantElementValue.u2constantValueIndex = dataInput.readUnsignedShort(); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - enumConstantElementValue.u2typeNameIndex = dataInput.readUnsignedShort(); - enumConstantElementValue.u2constantNameIndex = dataInput.readUnsignedShort(); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - classElementValue.u2classInfoIndex = dataInput.readUnsignedShort(); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - // Read the annotation. - Annotation annotationValue = new Annotation(); - visitAnnotation(clazz, annotationValue); - annotationElementValue.annotationValue = annotationValue; - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - // Read the element values. - arrayElementValue.u2elementValuesCount = dataInput.readUnsignedShort(); - - arrayElementValue.elementValues = new ElementValue[arrayElementValue.u2elementValuesCount]; - for (int index = 0; index < arrayElementValue.u2elementValuesCount; index++) - { - ElementValue elementValue = createElementValue(); - elementValue.accept(clazz, annotation, this); - arrayElementValue.elementValues[index] = elementValue; - } - } - - - // Small utility methods. - - private Constant createConstant() - { - int u1tag = dataInput.readUnsignedByte(); - - switch (u1tag) - { - case ClassConstants.CONSTANT_Integer: return new IntegerConstant(); - case ClassConstants.CONSTANT_Float: return new FloatConstant(); - case ClassConstants.CONSTANT_Long: return new LongConstant(); - case ClassConstants.CONSTANT_Double: return new DoubleConstant(); - case ClassConstants.CONSTANT_PrimitiveArray: return new PrimitiveArrayConstant(); - case ClassConstants.CONSTANT_String: return new StringConstant(); - case ClassConstants.CONSTANT_Utf8: return new Utf8Constant(); - case ClassConstants.CONSTANT_InvokeDynamic: return new InvokeDynamicConstant(); - case ClassConstants.CONSTANT_MethodHandle: return new MethodHandleConstant(); - case ClassConstants.CONSTANT_Fieldref: return new FieldrefConstant(); - case ClassConstants.CONSTANT_Methodref: return new MethodrefConstant(); - case ClassConstants.CONSTANT_InterfaceMethodref: return new InterfaceMethodrefConstant(); - case ClassConstants.CONSTANT_Class: return new ClassConstant(); - case ClassConstants.CONSTANT_MethodType: return new MethodTypeConstant(); - case ClassConstants.CONSTANT_NameAndType: return new NameAndTypeConstant(); - case ClassConstants.CONSTANT_Module: return new ModuleConstant(); - case ClassConstants.CONSTANT_Package: return new PackageConstant(); - - default: throw new RuntimeException("Unknown constant type ["+u1tag+"] in constant pool"); - } - } - - - private Attribute createAttribute(Clazz clazz) - { - int u2attributeNameIndex = dataInput.readUnsignedShort(); - int u4attributeLength = dataInput.readInt(); - String attributeName = clazz.getString(u2attributeNameIndex); - - Attribute attribute = - attributeName.equals(ClassConstants.ATTR_BootstrapMethods) ? (Attribute)new BootstrapMethodsAttribute(): - attributeName.equals(ClassConstants.ATTR_SourceFile) ? (Attribute)new SourceFileAttribute(): - attributeName.equals(ClassConstants.ATTR_SourceDir) ? (Attribute)new SourceDirAttribute(): - attributeName.equals(ClassConstants.ATTR_InnerClasses) ? (Attribute)new InnerClassesAttribute(): - attributeName.equals(ClassConstants.ATTR_EnclosingMethod) ? (Attribute)new EnclosingMethodAttribute(): - attributeName.equals(ClassConstants.ATTR_Deprecated) ? (Attribute)new DeprecatedAttribute(): - attributeName.equals(ClassConstants.ATTR_Synthetic) ? (Attribute)new SyntheticAttribute(): - attributeName.equals(ClassConstants.ATTR_Signature) ? (Attribute)new SignatureAttribute(): - attributeName.equals(ClassConstants.ATTR_ConstantValue) ? (Attribute)new ConstantValueAttribute(): - attributeName.equals(ClassConstants.ATTR_MethodParameters) ? (Attribute)new MethodParametersAttribute(): - attributeName.equals(ClassConstants.ATTR_Exceptions) ? (Attribute)new ExceptionsAttribute(): - attributeName.equals(ClassConstants.ATTR_Code) ? (Attribute)new CodeAttribute(): - attributeName.equals(ClassConstants.ATTR_StackMap) ? (Attribute)new StackMapAttribute(): - attributeName.equals(ClassConstants.ATTR_StackMapTable) ? (Attribute)new StackMapTableAttribute(): - attributeName.equals(ClassConstants.ATTR_LineNumberTable) ? (Attribute)new LineNumberTableAttribute(): - attributeName.equals(ClassConstants.ATTR_LocalVariableTable) ? (Attribute)new LocalVariableTableAttribute(): - attributeName.equals(ClassConstants.ATTR_LocalVariableTypeTable) ? (Attribute)new LocalVariableTypeTableAttribute(): - attributeName.equals(ClassConstants.ATTR_RuntimeVisibleAnnotations) ? (Attribute)new RuntimeVisibleAnnotationsAttribute(): - attributeName.equals(ClassConstants.ATTR_RuntimeInvisibleAnnotations) ? (Attribute)new RuntimeInvisibleAnnotationsAttribute(): - attributeName.equals(ClassConstants.ATTR_RuntimeVisibleParameterAnnotations) ? (Attribute)new RuntimeVisibleParameterAnnotationsAttribute(): - attributeName.equals(ClassConstants.ATTR_RuntimeInvisibleParameterAnnotations) ? (Attribute)new RuntimeInvisibleParameterAnnotationsAttribute(): - attributeName.equals(ClassConstants.ATTR_RuntimeVisibleTypeAnnotations) ? (Attribute)new RuntimeVisibleTypeAnnotationsAttribute(): - attributeName.equals(ClassConstants.ATTR_RuntimeInvisibleTypeAnnotations) ? (Attribute)new RuntimeInvisibleTypeAnnotationsAttribute(): - attributeName.equals(ClassConstants.ATTR_AnnotationDefault) ? (Attribute)new AnnotationDefaultAttribute(): - attributeName.equals(ClassConstants.ATTR_Module) ? (Attribute)new ModuleAttribute(): - attributeName.equals(ClassConstants.ATTR_ModuleMainClass) ? (Attribute)new ModuleMainClassAttribute(): - attributeName.equals(ClassConstants.ATTR_ModulePackages) ? (Attribute)new ModulePackagesAttribute(): - (Attribute)new UnknownAttribute(u2attributeNameIndex, u4attributeLength); - attribute.u2attributeNameIndex = u2attributeNameIndex; - - return attribute; - } - - - private StackMapFrame createStackMapFrame() - { - int u1tag = dataInput.readUnsignedByte(); - - return - u1tag < StackMapFrame.SAME_ONE_FRAME ? (StackMapFrame)new SameZeroFrame(u1tag) : - u1tag < StackMapFrame.SAME_ONE_FRAME_EXTENDED ? (StackMapFrame)new SameOneFrame(u1tag) : - u1tag < StackMapFrame.LESS_ZERO_FRAME ? (StackMapFrame)new SameOneFrame(u1tag) : - u1tag < StackMapFrame.SAME_ZERO_FRAME_EXTENDED ? (StackMapFrame)new LessZeroFrame(u1tag) : - u1tag < StackMapFrame.MORE_ZERO_FRAME ? (StackMapFrame)new SameZeroFrame(u1tag) : - u1tag < StackMapFrame.FULL_FRAME ? (StackMapFrame)new MoreZeroFrame(u1tag) : - (StackMapFrame)new FullFrame(); - } - - - private VerificationType createVerificationType() - { - int u1tag = dataInput.readUnsignedByte(); - - switch (u1tag) - { - case VerificationType.INTEGER_TYPE: return new IntegerType(); - case VerificationType.FLOAT_TYPE: return new FloatType(); - case VerificationType.LONG_TYPE: return new LongType(); - case VerificationType.DOUBLE_TYPE: return new DoubleType(); - case VerificationType.TOP_TYPE: return new TopType(); - case VerificationType.OBJECT_TYPE: return new ObjectType(); - case VerificationType.NULL_TYPE: return new NullType(); - case VerificationType.UNINITIALIZED_TYPE: return new UninitializedType(); - case VerificationType.UNINITIALIZED_THIS_TYPE: return new UninitializedThisType(); - - default: throw new RuntimeException("Unknown verification type ["+u1tag+"] in stack map frame"); - } - } - - - private TargetInfo createTargetInfo() - { - byte u1targetType = dataInput.readByte(); - - switch (u1targetType) - { - case ClassConstants.ANNOTATION_TARGET_ParameterGenericClass: - case ClassConstants.ANNOTATION_TARGET_ParameterGenericMethod: return new TypeParameterTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_Extends: return new SuperTypeTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_BoundGenericClass: - case ClassConstants.ANNOTATION_TARGET_BoundGenericMethod: return new TypeParameterBoundTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_Field: - case ClassConstants.ANNOTATION_TARGET_Return: - case ClassConstants.ANNOTATION_TARGET_Receiver: return new EmptyTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_Parameter: return new FormalParameterTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_Throws: return new ThrowsTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_LocalVariable: - case ClassConstants.ANNOTATION_TARGET_ResourceVariable: return new LocalVariableTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_Catch: return new CatchTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_InstanceOf: - case ClassConstants.ANNOTATION_TARGET_New: - case ClassConstants.ANNOTATION_TARGET_MethodReferenceNew: - case ClassConstants.ANNOTATION_TARGET_MethodReference: return new OffsetTargetInfo(u1targetType); - case ClassConstants.ANNOTATION_TARGET_Cast: - case ClassConstants.ANNOTATION_TARGET_ArgumentGenericMethodNew: - case ClassConstants.ANNOTATION_TARGET_ArgumentGenericMethod: - case ClassConstants.ANNOTATION_TARGET_ArgumentGenericMethodReferenceNew: - case ClassConstants.ANNOTATION_TARGET_ArgumentGenericMethodReference: return new TypeArgumentTargetInfo(u1targetType); - - default: throw new RuntimeException("Unknown annotation target type ["+u1targetType+"]"); - } - } - - - private ElementValue createElementValue() - { - int u1tag = dataInput.readUnsignedByte(); - - switch (u1tag) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: - case ClassConstants.TYPE_FLOAT: - case ClassConstants.TYPE_LONG: - case ClassConstants.TYPE_DOUBLE: - case ClassConstants.ELEMENT_VALUE_STRING_CONSTANT: return new ConstantElementValue((char)u1tag); - - case ClassConstants.ELEMENT_VALUE_ENUM_CONSTANT: return new EnumConstantElementValue(); - case ClassConstants.ELEMENT_VALUE_CLASS: return new ClassElementValue(); - case ClassConstants.ELEMENT_VALUE_ANNOTATION: return new AnnotationElementValue(); - case ClassConstants.ELEMENT_VALUE_ARRAY: return new ArrayElementValue(); - - default: throw new IllegalArgumentException("Unknown element value tag ["+u1tag+"]"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/ProgramClassWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/ProgramClassWriter.java deleted file mode 100644 index 6f24b102..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/ProgramClassWriter.java +++ /dev/null @@ -1,1069 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.io; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.*; -import proguard.classfile.attribute.annotation.target.visitor.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.module.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.io.*; - -/** - * This ClassVisitor writes out the ProgramClass objects that it visits to the - * given DataOutput object. - * - * @author Eric Lafortune - */ -public class ProgramClassWriter -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor, - AttributeVisitor -{ - private RuntimeDataOutput dataOutput; - - private final ConstantBodyWriter constantBodyWriter = new ConstantBodyWriter(); - private final AttributeBodyWriter attributeBodyWriter = new AttributeBodyWriter(); - private final StackMapFrameBodyWriter stackMapFrameBodyWriter = new StackMapFrameBodyWriter(); - private final VerificationTypeBodyWriter verificationTypeBodyWriter = new VerificationTypeBodyWriter(); - private final ElementValueBodyWriter elementValueBodyWriter = new ElementValueBodyWriter(); - - - /** - * Creates a new ProgramClassWriter for writing to the given DataOutput. - */ - public ProgramClassWriter(DataOutput dataOutput) - { - this.dataOutput = new RuntimeDataOutput(dataOutput); - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Write the magic number. - dataOutput.writeInt(ClassConstants.MAGIC); - - // Write the version numbers. - dataOutput.writeShort(ClassUtil.internalMinorClassVersion(programClass.u4version)); - dataOutput.writeShort(ClassUtil.internalMajorClassVersion(programClass.u4version)); - - // Write the constant pool. - dataOutput.writeUnsignedShort(programClass.u2constantPoolCount); - - programClass.constantPoolEntriesAccept(this); - - // Write the general class information. - // Ignore the higher bits outside the short range - these are for - // internal purposes only. - dataOutput.writeUnsignedShort(programClass.u2accessFlags & 0xffff); - dataOutput.writeUnsignedShort(programClass.u2thisClass); - dataOutput.writeUnsignedShort(programClass.u2superClass); - - // Write the interfaces. - dataOutput.writeUnsignedShort(programClass.u2interfacesCount); - - for (int index = 0; index < programClass.u2interfacesCount; index++) - { - dataOutput.writeUnsignedShort(programClass.u2interfaces[index]); - } - - // Write the fields. - dataOutput.writeUnsignedShort(programClass.u2fieldsCount); - - programClass.fieldsAccept(this); - - // Write the methods. - dataOutput.writeUnsignedShort(programClass.u2methodsCount); - - programClass.methodsAccept(this); - - // Write the class attributes. - dataOutput.writeUnsignedShort(programClass.u2attributesCount); - - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Write the general field information. - // Ignore the higher bits outside the short range - these are for - // internal purposes only. - dataOutput.writeUnsignedShort(programField.u2accessFlags & 0xffff); - dataOutput.writeUnsignedShort(programField.u2nameIndex); - dataOutput.writeUnsignedShort(programField.u2descriptorIndex); - - // Write the field attributes. - dataOutput.writeUnsignedShort(programField.u2attributesCount); - - programField.attributesAccept(programClass, this); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Write the general method information. - // Ignore the higher bits outside the short range - these are for - // internal purposes only. - dataOutput.writeUnsignedShort(programMethod.u2accessFlags & 0xffff); - dataOutput.writeUnsignedShort(programMethod.u2nameIndex); - dataOutput.writeUnsignedShort(programMethod.u2descriptorIndex); - - // Write the method attributes. - dataOutput.writeUnsignedShort(programMethod.u2attributesCount); - - programMethod.attributesAccept(programClass, this); - } - - - public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) - { - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - // Write the tag. - dataOutput.writeByte(constant.getTag()); - - // Write the actual body. - constant.accept(clazz, constantBodyWriter); - } - - - private class ConstantBodyWriter - extends SimplifiedVisitor - implements ConstantVisitor, - PrimitiveArrayConstantElementVisitor - { - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - dataOutput.writeInt(integerConstant.u4value); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - dataOutput.writeLong(longConstant.u8value); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - dataOutput.writeFloat(floatConstant.f4value); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - dataOutput.writeDouble(doubleConstant.f8value); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - char u2primitiveType = primitiveArrayConstant.getPrimitiveType(); - int u4Length = primitiveArrayConstant.getLength(); - - dataOutput.writeUnsignedShort(u2primitiveType); - dataOutput.writeInt(u4Length); - - // Write the array values. - primitiveArrayConstant.primitiveArrayElementsAccept(clazz, this); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - dataOutput.writeUnsignedShort(stringConstant.u2stringIndex); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - byte[] bytes = utf8Constant.getBytes(); - - dataOutput.writeUnsignedShort(bytes.length); - dataOutput.write(bytes); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - dataOutput.writeUnsignedShort(invokeDynamicConstant.u2bootstrapMethodAttributeIndex); - dataOutput.writeUnsignedShort(invokeDynamicConstant.u2nameAndTypeIndex); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - dataOutput.writeByte(methodHandleConstant.u1referenceKind); - dataOutput.writeUnsignedShort(methodHandleConstant.u2referenceIndex); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - dataOutput.writeUnsignedShort(refConstant.u2classIndex); - dataOutput.writeUnsignedShort(refConstant.u2nameAndTypeIndex); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - dataOutput.writeUnsignedShort(classConstant.u2nameIndex); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - dataOutput.writeUnsignedShort(methodTypeConstant.u2descriptorIndex); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - dataOutput.writeUnsignedShort(nameAndTypeConstant.u2nameIndex); - dataOutput.writeUnsignedShort(nameAndTypeConstant.u2descriptorIndex); - } - - - // Implementations for PrimitiveArrayConstantElementVisitor. - - public void visitBooleanArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, boolean value) - { - dataOutput.writeBoolean(value); - } - - - public void visitByteArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, byte value) - { - dataOutput.writeByte(value); - } - - - public void visitCharArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, char value) - { - dataOutput.writeChar(value); - } - - - public void visitShortArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, short value) - { - dataOutput.writeShort(value); - } - - - public void visitIntArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, int value) - { - dataOutput.writeInt(value); - } - - - public void visitFloatArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, float value) - { - dataOutput.writeFloat(value); - } - - - public void visitLongArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, long value) - { - dataOutput.writeLong(value); - } - - - public void visitDoubleArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, double value) - { - dataOutput.writeDouble(value); - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - dataOutput.writeUnsignedShort(moduleConstant.u2nameIndex); - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - dataOutput.writeUnsignedShort(packageConstant.u2nameIndex); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - // Write the attribute name index. - dataOutput.writeUnsignedShort(attribute.u2attributeNameIndex); - - // We'll write the attribute body into an array first, so we can - // automatically figure out its length. - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - - // Temporarily replace the current data output. - RuntimeDataOutput oldDataOutput = dataOutput; - dataOutput = new RuntimeDataOutput(new DataOutputStream(byteArrayOutputStream)); - - // Write the attribute body into the array. Note that the - // accept method with two dummy null arguments never throws - // an UnsupportedOperationException. - attribute.accept(clazz, null, null, attributeBodyWriter); - - // Restore the original data output. - dataOutput = oldDataOutput; - - // Write the attribute length and body. - byte[] info = byteArrayOutputStream.toByteArray(); - - dataOutput.writeInt(info.length); - dataOutput.write(info); - } - - - private class AttributeBodyWriter - extends SimplifiedVisitor - implements AttributeVisitor, - BootstrapMethodInfoVisitor, - InnerClassesInfoVisitor, - ExceptionInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - LineNumberInfoVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - RequiresInfoVisitor, - ExportsInfoVisitor, - OpensInfoVisitor, - ProvidesInfoVisitor, - AnnotationVisitor, - TypeAnnotationVisitor, - TargetInfoVisitor, - TypePathInfoVisitor, - LocalVariableTargetElementVisitor, - ElementValueVisitor - { - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - // Write the unknown information. - dataOutput.write(unknownAttribute.info); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - // Write the bootstrap methods. - dataOutput.writeUnsignedShort(bootstrapMethodsAttribute.u2bootstrapMethodsCount); - - bootstrapMethodsAttribute.bootstrapMethodEntriesAccept(clazz, this); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - dataOutput.writeUnsignedShort(sourceFileAttribute.u2sourceFileIndex); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - dataOutput.writeUnsignedShort(sourceDirAttribute.u2sourceDirIndex); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Write the inner classes. - dataOutput.writeUnsignedShort(innerClassesAttribute.u2classesCount); - - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - dataOutput.writeUnsignedShort(enclosingMethodAttribute.u2classIndex); - dataOutput.writeUnsignedShort(enclosingMethodAttribute.u2nameAndTypeIndex); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - dataOutput.writeUnsignedShort(moduleAttribute.u2moduleNameIndex); - dataOutput.writeUnsignedShort(moduleAttribute.u2moduleFlags); - dataOutput.writeUnsignedShort(moduleAttribute.u2moduleVersionIndex); - - // Write the requires. - dataOutput.writeUnsignedShort(moduleAttribute.u2requiresCount); - - moduleAttribute.requiresAccept(clazz, this); - - // Write the exports. - dataOutput.writeUnsignedShort(moduleAttribute.u2exportsCount); - - moduleAttribute.exportsAccept(clazz, this); - - // Write the opens. - dataOutput.writeUnsignedShort(moduleAttribute.u2opensCount); - - moduleAttribute.opensAccept(clazz, this); - - // Write the uses. - dataOutput.writeUnsignedShort(moduleAttribute.u2usesCount); - - for (int index = 0; index < moduleAttribute.u2usesCount; index++) - { - dataOutput.writeUnsignedShort(moduleAttribute.u2uses[index]); - } - - // Write the provides. - dataOutput.writeUnsignedShort(moduleAttribute.u2providesCount); - - moduleAttribute.providesAccept(clazz, this); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - dataOutput.writeUnsignedShort(moduleMainClassAttribute.u2mainClass); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - // Write the packages. - dataOutput.writeUnsignedShort(modulePackagesAttribute.u2packagesCount); - - for (int index = 0; index < modulePackagesAttribute.u2packagesCount; index++) - { - dataOutput.writeUnsignedShort(modulePackagesAttribute.u2packages[index]); - } - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - // This attribute does not contain any additional information. - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - // This attribute does not contain any additional information. - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - dataOutput.writeUnsignedShort(signatureAttribute.u2signatureIndex); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - dataOutput.writeUnsignedShort(constantValueAttribute.u2constantValueIndex); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - // Write the parameter information. - dataOutput.writeByte(methodParametersAttribute.u1parametersCount); - - methodParametersAttribute.parametersAccept(clazz, method, this); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - // Write the exceptions. - dataOutput.writeUnsignedShort(exceptionsAttribute.u2exceptionIndexTableLength); - - for (int index = 0; index < exceptionsAttribute.u2exceptionIndexTableLength; index++) - { - dataOutput.writeUnsignedShort(exceptionsAttribute.u2exceptionIndexTable[index]); - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Write the stack size and local variable frame size. - dataOutput.writeUnsignedShort(codeAttribute.u2maxStack); - dataOutput.writeUnsignedShort(codeAttribute.u2maxLocals); - - // Write the byte code. - dataOutput.writeInt(codeAttribute.u4codeLength); - - dataOutput.write(codeAttribute.code, 0, codeAttribute.u4codeLength); - - // Write the exceptions. - dataOutput.writeUnsignedShort(codeAttribute.u2exceptionTableLength); - - codeAttribute.exceptionsAccept(clazz, method, this); - - // Write the code attributes. - dataOutput.writeUnsignedShort(codeAttribute.u2attributesCount); - - codeAttribute.attributesAccept(clazz, method, ProgramClassWriter.this); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - // Write the stack map frames (only full frames, without tag). - dataOutput.writeUnsignedShort(stackMapAttribute.u2stackMapFramesCount); - - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, stackMapFrameBodyWriter); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - // Write the stack map frames. - dataOutput.writeUnsignedShort(stackMapTableAttribute.u2stackMapFramesCount); - - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - // Write the line numbers. - dataOutput.writeUnsignedShort(lineNumberTableAttribute.u2lineNumberTableLength); - - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Write the local variables. - dataOutput.writeUnsignedShort(localVariableTableAttribute.u2localVariableTableLength); - - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Write the local variable types. - dataOutput.writeUnsignedShort(localVariableTypeTableAttribute.u2localVariableTypeTableLength); - - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitRequiresInfo(Clazz clazz, RequiresInfo requiresInfo) - { - dataOutput.writeUnsignedShort(requiresInfo.u2requiresIndex); - dataOutput.writeUnsignedShort(requiresInfo.u2requiresFlags); - dataOutput.writeUnsignedShort(requiresInfo.u2requiresVersionIndex); - } - - - public void visitExportsInfo(Clazz clazz, ExportsInfo exportsInfo) - { - dataOutput.writeUnsignedShort(exportsInfo.u2exportsIndex); - dataOutput.writeUnsignedShort(exportsInfo.u2exportsFlags); - - // Write tthe argets. - dataOutput.writeUnsignedShort(exportsInfo.u2exportsToCount); - - for (int index = 0; index < exportsInfo.u2exportsToCount; index++) - { - dataOutput.writeUnsignedShort(exportsInfo.u2exportsToIndex[index]); - } - } - - - public void visitOpensInfo(Clazz clazz, OpensInfo opensInfo) - { - dataOutput.writeUnsignedShort(opensInfo.u2opensIndex); - dataOutput.writeUnsignedShort(opensInfo.u2opensFlags); - - // Write the targets. - dataOutput.writeUnsignedShort(opensInfo.u2opensToCount); - - for (int index = 0; index < opensInfo.u2opensToCount; index++) - { - dataOutput.writeUnsignedShort(opensInfo.u2opensToIndex[index]); - } - } - - - public void visitProvidesInfo(Clazz clazz, ProvidesInfo providesInfo) - { - dataOutput.writeUnsignedShort(providesInfo.u2providesIndex); - - // Write the with. - dataOutput.writeUnsignedShort(providesInfo.u2providesWithCount); - - for (int index = 0; index < providesInfo.u2providesWithCount; index++) - { - dataOutput.writeUnsignedShort(providesInfo.u2providesWithIndex[index]); - } - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Write the annotations. - dataOutput.writeUnsignedShort(annotationsAttribute.u2annotationsCount); - - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Write the parameter annotations. - dataOutput.writeByte(parameterAnnotationsAttribute.u1parametersCount); - - for (int parameterIndex = 0; parameterIndex < parameterAnnotationsAttribute.u1parametersCount; parameterIndex++) - { - // Write the parameter annotations of the given parameter. - int u2annotationsCount = parameterAnnotationsAttribute.u2parameterAnnotationsCount[parameterIndex]; - Annotation[] annotations = parameterAnnotationsAttribute.parameterAnnotations[parameterIndex]; - - dataOutput.writeUnsignedShort(u2annotationsCount); - - for (int index = 0; index < u2annotationsCount; index++) - { - visitAnnotation(clazz, annotations[index]); - } - - } - } - - - public void visitAnyTypeAnnotationsAttribute(Clazz clazz, TypeAnnotationsAttribute typeAnnotationsAttribute) - { - // Write the type annotations. - dataOutput.writeUnsignedShort(typeAnnotationsAttribute.u2annotationsCount); - - typeAnnotationsAttribute.typeAnnotationsAccept(clazz, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Write the default element value. - annotationDefaultAttribute.defaultValue.accept(clazz, null, this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - dataOutput.writeUnsignedShort(bootstrapMethodInfo.u2methodHandleIndex); - - // Write the bootstrap method arguments. - dataOutput.writeUnsignedShort(bootstrapMethodInfo.u2methodArgumentCount); - - for (int index = 0; index < bootstrapMethodInfo.u2methodArgumentCount; index++) - { - dataOutput.writeUnsignedShort(bootstrapMethodInfo.u2methodArguments[index]); - } - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - dataOutput.writeUnsignedShort(innerClassesInfo.u2innerClassIndex); - dataOutput.writeUnsignedShort(innerClassesInfo.u2outerClassIndex); - dataOutput.writeUnsignedShort(innerClassesInfo.u2innerNameIndex); - dataOutput.writeUnsignedShort(innerClassesInfo.u2innerClassAccessFlags); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - dataOutput.writeUnsignedShort(exceptionInfo.u2startPC); - dataOutput.writeUnsignedShort(exceptionInfo.u2endPC); - dataOutput.writeUnsignedShort(exceptionInfo.u2handlerPC); - dataOutput.writeUnsignedShort(exceptionInfo.u2catchType); - } - - - // Implementations for StackMapFrameVisitor. - - public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) - { - // Write the stack map frame tag. - dataOutput.writeByte(stackMapFrame.getTag()); - - // Write the actual body. - stackMapFrame.accept(clazz, method, codeAttribute, offset, stackMapFrameBodyWriter); - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - // Simply suppress line number overflows, typically caused by - // inlined methods and their artificial line numbers. - dataOutput.writeUnsignedShort(lineNumberInfo.u2startPC > 0xffff ? 0 : lineNumberInfo.u2startPC); - dataOutput.writeUnsignedShort(lineNumberInfo.u2lineNumber > 0xffff ? 0 : lineNumberInfo.u2lineNumber); - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - dataOutput.writeUnsignedShort(parameterInfo.u2nameIndex); - dataOutput.writeUnsignedShort(parameterInfo.u2accessFlags); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - dataOutput.writeUnsignedShort(localVariableInfo.u2startPC); - dataOutput.writeUnsignedShort(localVariableInfo.u2length); - dataOutput.writeUnsignedShort(localVariableInfo.u2nameIndex); - dataOutput.writeUnsignedShort(localVariableInfo.u2descriptorIndex); - dataOutput.writeUnsignedShort(localVariableInfo.u2index); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - dataOutput.writeUnsignedShort(localVariableTypeInfo.u2startPC); - dataOutput.writeUnsignedShort(localVariableTypeInfo.u2length); - dataOutput.writeUnsignedShort(localVariableTypeInfo.u2nameIndex); - dataOutput.writeUnsignedShort(localVariableTypeInfo.u2signatureIndex); - dataOutput.writeUnsignedShort(localVariableTypeInfo.u2index); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - // Write the annotation type. - dataOutput.writeUnsignedShort(annotation.u2typeIndex); - - // Write the element value pairs. - dataOutput.writeUnsignedShort(annotation.u2elementValuesCount); - - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for TypeAnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - // Write the target info. - dataOutput.writeByte(typeAnnotation.targetInfo.u1targetType); - - typeAnnotation.targetInfoAccept(clazz, this); - - // Write the type path. - dataOutput.writeByte(typeAnnotation.typePath.length); - - typeAnnotation.typePathInfosAccept(clazz, this); - - // Write the actual annotation. - visitAnnotation(clazz, typeAnnotation); - } - - - // Implementations for TargetInfoVisitor. - - public void visitTypeParameterTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) - { - dataOutput.writeByte(typeParameterTargetInfo.u1typeParameterIndex); - } - - - public void visitSuperTypeTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, SuperTypeTargetInfo superTypeTargetInfo) - { - dataOutput.writeUnsignedShort(superTypeTargetInfo.u2superTypeIndex); - } - - - public void visitTypeParameterBoundTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - dataOutput.writeByte(typeParameterBoundTargetInfo.u1typeParameterIndex); - dataOutput.writeByte(typeParameterBoundTargetInfo.u1boundIndex); - } - - - public void visitEmptyTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) - { - } - - - public void visitFormalParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, FormalParameterTargetInfo formalParameterTargetInfo) - { - dataOutput.writeByte(formalParameterTargetInfo.u1formalParameterIndex); - } - - - public void visitThrowsTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, ThrowsTargetInfo throwsTargetInfo) - { - dataOutput.writeUnsignedShort(throwsTargetInfo.u2throwsTypeIndex); - } - - - public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) - { - // Write the local variable target elements. - dataOutput.writeUnsignedShort(localVariableTargetInfo.u2tableLength); - - localVariableTargetInfo.targetElementsAccept(clazz, method, codeAttribute, typeAnnotation, this); - } - - - public void visitCatchTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo catchTargetInfo) - { - dataOutput.writeUnsignedShort(catchTargetInfo.u2exceptionTableIndex); - } - - - public void visitOffsetTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo) - { - dataOutput.writeUnsignedShort(offsetTargetInfo.u2offset); - } - - - public void visitTypeArgumentTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo typeArgumentTargetInfo) - { - dataOutput.writeUnsignedShort(typeArgumentTargetInfo.u2offset); - dataOutput.writeByte(typeArgumentTargetInfo.u1typeArgumentIndex); - } - - - // Implementations for TypePathInfoVisitor. - - public void visitTypePathInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - dataOutput.writeByte(typePathInfo.u1typePathKind); - dataOutput.writeByte(typePathInfo.u1typeArgumentIndex); - } - - - // Implementations for LocalVariableTargetElementVisitor. - - public void visitLocalVariableTargetElement(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo, LocalVariableTargetElement localVariableTargetElement) - { - dataOutput.writeUnsignedShort(localVariableTargetElement.u2startPC); - dataOutput.writeUnsignedShort(localVariableTargetElement.u2length); - dataOutput.writeUnsignedShort(localVariableTargetElement.u2index); - } - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) - { - // Write the element name index, if applicable. - int u2elementNameIndex = elementValue.u2elementNameIndex; - if (u2elementNameIndex != 0) - { - dataOutput.writeUnsignedShort(u2elementNameIndex); - } - - // Write the tag. - dataOutput.writeByte(elementValue.getTag()); - - // Write the actual body. - elementValue.accept(clazz, annotation, elementValueBodyWriter); - } - } - - - private class StackMapFrameBodyWriter - extends SimplifiedVisitor - implements StackMapFrameVisitor, - VerificationTypeVisitor - { - public void visitSameZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameZeroFrame sameZeroFrame) - { - if (sameZeroFrame.getTag() == StackMapFrame.SAME_ZERO_FRAME_EXTENDED) - { - dataOutput.writeUnsignedShort(sameZeroFrame.u2offsetDelta); - } - } - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - if (sameOneFrame.getTag() == StackMapFrame.SAME_ONE_FRAME_EXTENDED) - { - dataOutput.writeUnsignedShort(sameOneFrame.u2offsetDelta); - } - - // Write the verification type of the stack entry. - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitLessZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LessZeroFrame lessZeroFrame) - { - dataOutput.writeUnsignedShort(lessZeroFrame.u2offsetDelta); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - dataOutput.writeUnsignedShort(moreZeroFrame.u2offsetDelta); - - // Write the verification types of the additional local variables. - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - dataOutput.writeUnsignedShort(fullFrame.u2offsetDelta); - - // Write the verification types of the local variables. - dataOutput.writeUnsignedShort(fullFrame.variablesCount); - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - - // Write the verification types of the stack entries. - dataOutput.writeUnsignedShort(fullFrame.stackCount); - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) - { - // Write the verification type tag. - dataOutput.writeByte(verificationType.getTag()); - - // Write the actual body. - verificationType.accept(clazz, method, codeAttribute, offset, verificationTypeBodyWriter); - } - } - - - private class VerificationTypeBodyWriter - extends SimplifiedVisitor - implements VerificationTypeVisitor - { - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) - { - // Most verification types don't contain any additional information. - } - - - public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) - { - dataOutput.writeUnsignedShort(objectType.u2classIndex); - } - - - public void visitUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType) - { - dataOutput.writeUnsignedShort(uninitializedType.u2newInstructionOffset); - } - } - - - private class ElementValueBodyWriter - extends SimplifiedVisitor - implements ElementValueVisitor - { - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - dataOutput.writeUnsignedShort(constantElementValue.u2constantValueIndex); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - dataOutput.writeUnsignedShort(enumConstantElementValue.u2typeNameIndex); - dataOutput.writeUnsignedShort(enumConstantElementValue.u2constantNameIndex); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - dataOutput.writeUnsignedShort(classElementValue.u2classInfoIndex); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - // Write the annotation. - attributeBodyWriter.visitAnnotation(clazz, annotationElementValue.annotationValue); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - // Write the element values. - dataOutput.writeUnsignedShort(arrayElementValue.u2elementValuesCount); - - arrayElementValue.elementValuesAccept(clazz, annotation, attributeBodyWriter); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/RuntimeDataInput.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/RuntimeDataInput.java deleted file mode 100644 index e496ed49..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/RuntimeDataInput.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.io; - -import java.io.*; - -/** - * This class delegates its method calls to the corresponding DataInput methods, - * converting its IOExceptions to RuntimeExceptions. - * - * @author Eric Lafortune - */ -final class RuntimeDataInput -{ - private final DataInput dataInput; - - - public RuntimeDataInput(DataInput dataInput) - { - this.dataInput = dataInput; - } - - - // Methods delegating to DataInput. - - public boolean readBoolean() - { - try - { - return dataInput.readBoolean(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public byte readByte() - { - try - { - return dataInput.readByte(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public char readChar() - { - try - { - return dataInput.readChar(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public double readDouble() - { - try - { - return dataInput.readDouble(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public float readFloat() - { - try - { - return dataInput.readFloat(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public void readFully(byte[] b) - { - try - { - dataInput.readFully(b); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public void readFully(byte[] b, int off, int len) - { - try - { - dataInput.readFully(b, off, len); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public int readInt() - { - try - { - return dataInput.readInt(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public String readLine() - { - try - { - return dataInput.readLine(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public long readLong() - { - try - { - return dataInput.readLong(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public short readShort() - { - try - { - return dataInput.readShort(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public int readUnsignedByte() - { - try - { - return dataInput.readUnsignedByte(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public int readUnsignedShort() - { - try - { - return dataInput.readUnsignedShort(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public String readUTF() - { - try - { - return dataInput.readUTF(); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - public int skipBytes(int n) - { - try - { - return dataInput.skipBytes(n); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/RuntimeDataOutput.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/RuntimeDataOutput.java deleted file mode 100644 index b56fd9c3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/RuntimeDataOutput.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.io; - -import java.io.*; - -/** - * This class delegates its method calls to the corresponding DataOutput methods, - * converting its IOExceptions to RuntimeExceptions. - * - * The class provides two convenience methods that additionally check whether the - * written values are unsigned resp. signed short values before writing them. - * - * @author Eric Lafortune - */ -final class RuntimeDataOutput -{ - private final DataOutput dataOutput; - - - public RuntimeDataOutput(DataOutput dataOutput) - { - this.dataOutput = dataOutput; - } - - - // Methods delegating to DataOutput. - - public void write(byte[] b) - { - try - { - dataOutput.write(b); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void write(byte[] b, int off, int len) - { - try - { - dataOutput.write(b, off, len); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void write(int b) - { - try - { - dataOutput.write(b); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeBoolean(boolean v) - { - try - { - dataOutput.writeBoolean(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeByte(int v) - { - try - { - dataOutput.writeByte(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeBytes(String s) - { - try - { - dataOutput.writeBytes(s); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeChar(int v) - { - try - { - dataOutput.writeChar(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeChars(String s) - { - try - { - dataOutput.writeChars(s); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeDouble(double v) - { - try - { - dataOutput.writeDouble(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeFloat(float v) - { - try - { - dataOutput.writeFloat(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeInt(int v) - { - try - { - dataOutput.writeInt(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeLong(long v) - { - try - { - dataOutput.writeLong(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - /** - * Checks if the given value is an unsigned short value before writing it. - * - * @throws IllegalArgumentException if the value is not an unsigned short value. - * @see #writeShort(int) - */ - public void writeUnsignedShort(int v) - { - if ((v & 0xffff) != v) - { - throw new IllegalArgumentException("Overflow of unsigned short value ["+v+"]"); - } - - writeShort(v); - } - - - /** - * Checks if the given value is a signed short value before writing it. - * - * @throws IllegalArgumentException if the value is not a signed short value. - * @see #writeShort(int) - */ - public void writeSignedShort(int v) - { - if ((short)v != v) - { - throw new IllegalArgumentException("Overflow of signed short value ["+v+"]"); - } - - writeShort(v); - } - - - public void writeShort(int v) - { - try - { - dataOutput.writeShort(v); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } - - - public void writeUTF(String str) - { - try - { - dataOutput.writeUTF(str); - } - catch (IOException ex) - { - throw new RuntimeException(ex.getMessage()); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/package.html deleted file mode 100644 index 780b9171..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/io/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains classes for reading and writing class files. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/package.html deleted file mode 100644 index 9a68094a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/package.html +++ /dev/null @@ -1,15 +0,0 @@ - -This package contains classes to represent the various elements of class files. -

-A class file is represented by the {@link proguard.classfile.Clazz -Clazz} interface. This interface currently has two alternative -representations: -

    -
  • {@link ProgramClass ProgramClass}: - a complete representation that can be read, modified, and written back. -
  • {@link LibraryClass LibraryClass}: - an incomplete representation that can be only be read. It is however - more compact than ProgramClass, and sufficient for - analyzing class files from library jars. -
- diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/AccessUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/AccessUtil.java deleted file mode 100644 index 593907db..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/AccessUtil.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.ClassConstants; - - -/** - * Utility methods for working with access flags. For convenience, this class - * defines access levels, in ascending order: PRIVATE, - * PACKAGE_VISIBLE, PROTECTED, and PUBLIC. - * - * @author Eric Lafortune - */ -public class AccessUtil -{ - public static final int PRIVATE = 0; - public static final int PACKAGE_VISIBLE = 1; - public static final int PROTECTED = 2; - public static final int PUBLIC = 3; - - - // The mask of access flags. - private static final int ACCESS_MASK = - ClassConstants.ACC_PUBLIC | - ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_PROTECTED; - - - /** - * Returns the corresponding access level of the given access flags. - * @param accessFlags the internal access flags. - * @return the corresponding access level: PRIVATE, - * PACKAGE_VISIBLE, PROTECTED, or - * PUBLIC. - */ - public static int accessLevel(int accessFlags) - { - switch (accessFlags & ACCESS_MASK) - { - case ClassConstants.ACC_PRIVATE: return PRIVATE; - default: return PACKAGE_VISIBLE; - case ClassConstants.ACC_PROTECTED: return PROTECTED; - case ClassConstants.ACC_PUBLIC: return PUBLIC; - } - } - - - /** - * Returns the corresponding access flags of the given access level. - * @param accessLevel the access level: PRIVATE, - * PACKAGE_VISIBLE, PROTECTED, - * or PUBLIC. - * @return the corresponding internal access flags, the internal access - * flags as a logical bit mask of INTERNAL_ACC_PRIVATE, - * INTERNAL_ACC_PROTECTED, and - * INTERNAL_ACC_PUBLIC. - */ - public static int accessFlags(int accessLevel) - { - switch (accessLevel) - { - case PRIVATE: return ClassConstants.ACC_PRIVATE; - default: return 0; - case PROTECTED: return ClassConstants.ACC_PROTECTED; - case PUBLIC: return ClassConstants.ACC_PUBLIC; - } - } - - - /** - * Replaces the access part of the given access flags. - * @param accessFlags the internal access flags. - * @param newAccessFlags the new internal access flags. - */ - public static int replaceAccessFlags(int accessFlags, int newAccessFlags) - { - // A private class member should not be explicitly final. - if (newAccessFlags == ClassConstants.ACC_PRIVATE) - { - accessFlags &= ~ClassConstants.ACC_FINAL; - } - - return (accessFlags & ~ACCESS_MASK) | - (newAccessFlags & ACCESS_MASK); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/AllParameterVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/AllParameterVisitor.java deleted file mode 100644 index 96211daf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/AllParameterVisitor.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; - -/** - * This MemberVisitor lets a given parameter visitor visit all the parameters - * of the methods that it visits. The parameters optionally includes the - * 'this' parameter of non-static methods, but never the return value. - * - * @author Eric Lafortune - */ -public class AllParameterVisitor -implements MemberVisitor -{ - private final boolean includeThisParameter; - private final ParameterVisitor parameterVisitor; - - - /** - * Creates a new AllParameterVisitor for the given parameter - * visitor. - */ - public AllParameterVisitor(boolean includeThisParameter, - ParameterVisitor parameterVisitor) - { - this.includeThisParameter = includeThisParameter; - this.parameterVisitor = parameterVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - visitFieldType(programClass, - programField, - programField.referencedClass); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - visitFieldType(libraryClass, - libraryField, - libraryField.referencedClass); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - visitParameters(programClass, - programMethod, - programMethod.referencedClasses); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - visitParameters(libraryClass, - libraryMethod, - libraryMethod.referencedClasses); - } - - - // Small utility methods. - - /** - * Lets the parameter visitor visit the type of the given field. - */ - private void visitFieldType(Clazz clazz, - Field field, - Clazz referencedClass) - { - String descriptor = field.getDescriptor(clazz); - parameterVisitor.visitParameter(clazz, - field, - 0, - 1, - 0, - ClassUtil.internalTypeSize(descriptor), - descriptor, - referencedClass); - } - - - /** - * Lets the parameter visitor visit the parameters of the given method. - */ - private void visitParameters(Clazz clazz, - Method method, - Clazz[] referencedClasses) - { - String descriptor = method.getDescriptor(clazz); - - // Count the number of parameters and their total size. - int parameterCount = 0; - int parameterSize = 0; - - int index = 1; - - loop: while (true) - { - char c = descriptor.charAt(index++); - switch (c) - { - case ClassConstants.TYPE_LONG: - case ClassConstants.TYPE_DOUBLE: - { - // Long and double primitive types. - parameterSize++; - break; - } - default: - { - // All other primitive types. - break; - } - case ClassConstants.TYPE_CLASS_START: - { - // Class types. - // Skip the class name. - index = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; - break; - } - case ClassConstants.TYPE_ARRAY: - { - // Array types. - // Skip all array characters. - while ((c = descriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {} - - if (c == ClassConstants.TYPE_CLASS_START) - { - // Skip the class type. - index = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; - } - break; - } - case ClassConstants.METHOD_ARGUMENTS_CLOSE: - { - break loop; - } - } - - parameterCount++; - parameterSize++; - } - - // Visit the parameters. - int parameterIndex = 0; - int parameterOffset = 0; - int referenceClassIndex = 0; - - // Visit the 'this' parameter if applicable. - if (includeThisParameter && - (method.getAccessFlags() & ClassConstants.ACC_STATIC) == 0) - { - parameterVisitor.visitParameter(clazz, - method, - parameterIndex++, - ++parameterCount, - parameterOffset++, - ++parameterSize, - ClassUtil.internalTypeFromClassName(clazz.getName()), - clazz); - } - - index = 1; - - while (true) - { - int newIndex = index + 1; - int thisParameterSize = 1; - Clazz referencedClass = null; - - char c = descriptor.charAt(index); - switch (c) - { - case ClassConstants.TYPE_LONG: - case ClassConstants.TYPE_DOUBLE: - { - // Long and double primitive types. - thisParameterSize = 2; - break; - } - default: - { - // All other primitive types. - break; - } - case ClassConstants.TYPE_CLASS_START: - { - // Class types. - // Skip the class name. - newIndex = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, newIndex) + 1; - referencedClass = referencedClasses == null ? null : - referencedClasses[referenceClassIndex++]; - break; - } - case ClassConstants.TYPE_ARRAY: - { - // Array types. - // Skip all array characters. - while ((c = descriptor.charAt(newIndex++)) == ClassConstants.TYPE_ARRAY) {} - - if (c == ClassConstants.TYPE_CLASS_START) - { - // Skip the class type. - newIndex = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, newIndex) + 1; - referencedClass = referencedClasses == null ? null : - referencedClasses[referenceClassIndex++]; - } - break; - } - case ClassConstants.METHOD_ARGUMENTS_CLOSE: - { - // End of the method parameters. - return; - } - } - - parameterVisitor.visitParameter(clazz, - method, - parameterIndex++, - parameterCount, - parameterOffset, - parameterSize, - descriptor.substring(index, newIndex), - referencedClass); - - // Continue with the next parameter. - index = newIndex; - parameterOffset += thisParameterSize; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ArrayInitializationMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ArrayInitializationMatcher.java deleted file mode 100644 index 3f6257a1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ArrayInitializationMatcher.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.Constant; -import proguard.classfile.instruction.*; -import proguard.evaluation.TracedStack; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.PartialEvaluator; -import proguard.optimize.peephole.InstructionSequenceReplacer; - -/** - * This class finds sequences of instructions that correspond to primitive - * array initializations. Such initializations may be represented more - * efficiently in other bytecode languages. - * - * @author Eric Lafortune - */ -public class ArrayInitializationMatcher -{ - private static final int X = InstructionSequenceReplacer.X; - - private final PartialEvaluator partialEvaluator; - - private int arrayInitializationStart; - private int arrayInitializationEnd; - private Object array; - - private final Constant[] CONSTANTS = new Constant[0]; - - // Conversion with dex2jar might result in arrays - // being pre-stored to a variable before initialization: - // - // newarray - // astore X - // aload X - // initialization start - // - private final Instruction[] ARRAY_PRESTORE_INSTRUCTIONS = new Instruction[] - { - new VariableInstruction(InstructionConstants.OP_ASTORE, X), - new VariableInstruction(InstructionConstants.OP_ALOAD, X) - }; - - private final InstructionSequenceMatcher arrayPreStoreMatcher = - new InstructionSequenceMatcher(CONSTANTS, ARRAY_PRESTORE_INSTRUCTIONS); - - - /** - * Creates a new ArrayInitializationMatcher. - */ - public ArrayInitializationMatcher() - { - this(new PartialEvaluator()); - } - - - /** - * Creates a new ArrayInitializationMatcher that will use the given partial - * evaluator. The evaluator must have been initialized before trying to - * match any array initializations. - * @param partialEvaluator the evaluator to be used for the analysis. - */ - public ArrayInitializationMatcher(PartialEvaluator partialEvaluator) - { - this.partialEvaluator = partialEvaluator; - } - - - /** - * Returns whether the code fragment starting at the specified newarray - * instruction is followed by a static array initialization. - * @param clazz the class. - * @param method the method. - * @param codeAttribute the code attribute. - * @param newArrayOffset the offset of the newarray instruction. - * @param newArrayInstruction the newarray instruction. - * @return whether there is a static array initialization. - */ - public boolean matchesArrayInitialization(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int newArrayOffset, - SimpleInstruction newArrayInstruction) - { - array = null; - - TracedStack stackBefore = - partialEvaluator.getStackBefore(newArrayOffset); - - IntegerValue integerValue = - stackBefore.getTop(0).integerValue(); - - if (!integerValue.isParticular()) - { - return false; - } - - - int arrayLength = integerValue.value(); - - int newArrayType = newArrayInstruction.constant; - int arrayStoreOpcode = arrayStoreOpcode(newArrayType); - - byte[] code = codeAttribute.code; - - int offset = newArrayOffset; - Instruction instruction = newArrayInstruction; - - int skipOffset = skipPreStoreInstructions(clazz, method, codeAttribute, offset + instruction.length(offset)); - if (skipOffset > 0) - { - offset = skipOffset; - newArrayOffset = offset; - instruction = InstructionFactory.create(code, offset); - } - - // Remember the potential initialization start. - int tmpInitializationStart = offset + instruction.length(offset); - - // Check if all the elements in the array are initialized. - for (int index = 0; index < arrayLength; index++) - { - // Check if the array reference is pushed. - instruction = InstructionFactory.create(code, offset += instruction.length(offset)); - - if (instruction.stackPushCount(clazz) < 1 || - !partialEvaluator.getStackAfter(offset).getTopActualProducerValue(0).instructionOffsetValue().contains(newArrayOffset)) - { - return false; - } - - // Check that the array index is pushed. - instruction = InstructionFactory.create(code, offset += instruction.length(offset)); - if (instruction.stackPushCount(clazz) != 1) - { - return false; - } - - Value indexValue = partialEvaluator.getStackAfter(offset).getTop(0); - if (indexValue.computationalType() != Value.TYPE_INTEGER || - !indexValue.integerValue().isParticular() || - indexValue.integerValue().value() != index) - { - return false; - } - - // Check if a particular value is pushed. - instruction = InstructionFactory.create(code, offset += instruction.length(offset)); - if (instruction.stackPushCount(clazz) < 1 || - !partialEvaluator.getStackAfter(offset).getTop(0).isParticular()) - { - return false; - } - - Value elementValue = partialEvaluator.getStackAfter(offset).getTop(0); - - // Check if the value is stored in the array. - instruction = InstructionFactory.create(code, offset += instruction.length(offset)); - if (instruction.opcode != arrayStoreOpcode) - { - return false; - } - - if (index == 0) - { - array = newArray(newArrayType, arrayLength); - } - - arrayStore(newArrayType, array, index, elementValue); - } - - arrayInitializationStart = tmpInitializationStart; - arrayInitializationEnd = offset; - - return offset > newArrayOffset; - } - - - /** - * Returns the offset to skip to after a new-array instruction. - *

- * This is a work-around for code converted by dex2jar. In some - * cases, after an array has been created, it is immediately - * stored into a variable and loaded again: - *

-     *   newarray
-     *   astore X
-     *   aload  X
-     *   initialization
-     * 
- * - * @param clazz the class. - * @param method the method. - * @param codeAttribute the code attribute. - * @param startOffset the start offset. - * @return the offset to skip to - */ - private int skipPreStoreInstructions(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int startOffset) - { - final int instructionCount = arrayPreStoreMatcher.instructionCount(); - - arrayPreStoreMatcher.reset(); - for (int count = 0, offset = startOffset; - count < instructionCount && offset < codeAttribute.u4codeLength; - count++) - { - Instruction instruction = - InstructionFactory.create(codeAttribute.code, offset); - - instruction.accept(clazz, method, codeAttribute, offset, - arrayPreStoreMatcher); - - offset += instruction.length(offset); - } - - if (arrayPreStoreMatcher.isMatching()) - { - return arrayPreStoreMatcher.matchedInstructionOffset(instructionCount - 1); - } - - return -1; - } - - /** - * Returns the first offset of the recent static array initialization, i.e. the first - * initialization instruction after the newarray. - * @see #matchesArrayInitialization - */ - public int arrayInitializationStart() - { - return arrayInitializationStart; - } - - /** - * Returns the last offset of the recent static array initialization. - * @see #matchesArrayInitialization - */ - public int arrayInitializationEnd() - { - return arrayInitializationEnd; - } - - /** - * Returns the recent static array initialization. - * @see #matchesArrayInitialization - */ - public Object array() - { - return array; - } - - - private byte internalType(int newArrayType) - { - switch (newArrayType) - { - case InstructionConstants.ARRAY_T_BOOLEAN: - case InstructionConstants.ARRAY_T_BYTE: - case InstructionConstants.ARRAY_T_CHAR: - case InstructionConstants.ARRAY_T_SHORT: - case InstructionConstants.ARRAY_T_INT: return Value.TYPE_INTEGER; - case InstructionConstants.ARRAY_T_LONG: return Value.TYPE_LONG; - case InstructionConstants.ARRAY_T_FLOAT: return Value.TYPE_FLOAT; - case InstructionConstants.ARRAY_T_DOUBLE: return Value.TYPE_DOUBLE; - default: - throw new IllegalArgumentException("Unexpected new array type ["+newArrayType+"]"); - } - } - - - private byte arrayStoreOpcode(int newArrayType) - { - switch (newArrayType) - { - case InstructionConstants.ARRAY_T_BOOLEAN: - case InstructionConstants.ARRAY_T_BYTE: return InstructionConstants.OP_BASTORE; - case InstructionConstants.ARRAY_T_CHAR: return InstructionConstants.OP_CASTORE; - case InstructionConstants.ARRAY_T_SHORT: return InstructionConstants.OP_SASTORE; - case InstructionConstants.ARRAY_T_INT: return InstructionConstants.OP_IASTORE; - case InstructionConstants.ARRAY_T_LONG: return InstructionConstants.OP_LASTORE; - case InstructionConstants.ARRAY_T_FLOAT: return InstructionConstants.OP_FASTORE; - case InstructionConstants.ARRAY_T_DOUBLE: return InstructionConstants.OP_DASTORE; - default: - throw new IllegalArgumentException("Unexpected new array type ["+newArrayType+"]"); - } - } - - - private Object newArray(int newArrayType, int arrayLength) - { - switch (newArrayType) - { - case InstructionConstants.ARRAY_T_BOOLEAN: return new boolean[arrayLength]; - case InstructionConstants.ARRAY_T_BYTE: return new byte[arrayLength]; - case InstructionConstants.ARRAY_T_CHAR: return new char[arrayLength]; - case InstructionConstants.ARRAY_T_SHORT: return new short[arrayLength]; - case InstructionConstants.ARRAY_T_INT: return new int[arrayLength]; - case InstructionConstants.ARRAY_T_LONG: return new long[arrayLength]; - case InstructionConstants.ARRAY_T_FLOAT: return new float[arrayLength]; - case InstructionConstants.ARRAY_T_DOUBLE: return new double[arrayLength]; - default: - throw new IllegalArgumentException("Unexpected new array type ["+newArrayType+"]"); - } - } - - - private void arrayStore(int newArrayType, Object array, int index, Value value) - { - switch (newArrayType) - { - case InstructionConstants.ARRAY_T_BOOLEAN: ((boolean[])array)[index] = 0 != value.integerValue().value(); break; - case InstructionConstants.ARRAY_T_BYTE: ((byte [])array)[index] = (byte) value.integerValue().value(); break; - case InstructionConstants.ARRAY_T_CHAR: ((char [])array)[index] = (char) value.integerValue().value(); break; - case InstructionConstants.ARRAY_T_SHORT: ((short [])array)[index] = (short)value.integerValue().value(); break; - case InstructionConstants.ARRAY_T_INT: ((int [])array)[index] = value.integerValue().value(); break; - case InstructionConstants.ARRAY_T_LONG: ((long [])array)[index] = value.longValue().value(); break; - case InstructionConstants.ARRAY_T_FLOAT: ((float [])array)[index] = value.floatValue().value(); break; - case InstructionConstants.ARRAY_T_DOUBLE: ((double [])array)[index] = value.doubleValue().value(); break; - default: - throw new IllegalArgumentException("Unexpected new array type ["+newArrayType+"]"); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ArrayInitializationReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ArrayInitializationReplacer.java deleted file mode 100644 index 2b273ed2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ArrayInitializationReplacer.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.visitor.ClassVisitor; -import proguard.evaluation.BasicInvocationUnit; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.PartialEvaluator; - -/** - * This ClassVisitor replaces array initialization instructions with optimized - * primitive array constants. - * - * These constants are not supported by any Java specification and therefore - * only for internal use. - * - * @see PrimitiveArrayConstantReplacer - * @author Thomas Neidhart - */ -public class ArrayInitializationReplacer -extends SimplifiedVisitor -implements ClassVisitor, - - // Implementation interfaces. - AttributeVisitor, - InstructionVisitor -{ - private final ValueFactory valueFactory = new ParticularValueFactory(new BasicValueFactory()); - private final PartialEvaluator partialEvaluator = new PartialEvaluator(valueFactory, - new BasicInvocationUnit(valueFactory), - true); - private final ArrayInitializationMatcher arrayInitializationMatcher = new ArrayInitializationMatcher(partialEvaluator); - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - private ConstantPoolEditor constantPoolEditor; - private int lastInstructionOffset; - private int lastInstructionStackPushCount; - private int arrayInitializationStart; - private int arrayInitializationEnd; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - constantPoolEditor = new ConstantPoolEditor(programClass); - - // Visit all methods that have "NEWARRAY" instructions. - programClass.methodsAccept( - new AllAttributeVisitor( - new ArrayInitializationFilter( - this))); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - - lastInstructionOffset = -1; - lastInstructionStackPushCount = -1; - arrayInitializationStart = -1; - arrayInitializationEnd = -1; - codeAttribute.instructionsAccept(clazz, method, this); - - if (codeAttributeEditor.isModified()) - { - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - Instruction instruction) - { - // Verify that the previous instruction pushed the array size on the - // stack: the java compiler will always do so, but obfuscators may - // have reordered the instructions. - if (instruction.opcode == InstructionConstants.OP_NEWARRAY && - lastInstructionStackPushCount == 1) - { - if (arrayInitializationMatcher.matchesArrayInitialization(clazz, - method, - codeAttribute, - offset, - (SimpleInstruction)instruction)) - { - Object values = arrayInitializationMatcher.array(); - int constantIndex = constantPoolEditor.addPrimitiveArrayConstant(values); - - // We need to replace the previous instruction, which pushes - // the array length onto the stack. - codeAttributeEditor.replaceInstruction(lastInstructionOffset, - new ConstantInstruction(InstructionConstants.OP_LDC, - constantIndex)); - - // Remove the newarray instruction itself. - codeAttributeEditor.deleteInstruction(offset); - - // Mark the start/end of the array initialization sequence. - arrayInitializationStart = arrayInitializationMatcher.arrayInitializationStart(); - arrayInitializationEnd = arrayInitializationMatcher.arrayInitializationEnd(); - } - } - - // Remove any instruction inside the array initialization sequence. - if (arrayInitializationEnd != -1 && - offset >= arrayInitializationStart && - offset <= arrayInitializationEnd) - { - codeAttributeEditor.deleteInstruction(offset); - } - - lastInstructionOffset = offset; - lastInstructionStackPushCount = instruction.stackPushCount(clazz); - } - - - /** - * Private utility class to visit only CodeAttributes that contain - * "NEWARRAY" instructions. - */ - private static class ArrayInitializationFilter - extends SimplifiedVisitor - implements AttributeVisitor - { - private final AttributeVisitor acceptedVisitor; - - - public ArrayInitializationFilter(AttributeVisitor acceptedVisitor) - { - this.acceptedVisitor = acceptedVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - boolean delegateVisit = false; - // Directly iterate of all instructions and exit early if - // we encounter a "NEWARRAY" instruction. - for (int offset = 0; offset < codeAttribute.u4codeLength;) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, offset); - if (instruction.opcode == InstructionConstants.OP_NEWARRAY) - { - delegateVisit = true; - break; - } - - offset += instruction.length(offset); - } - - if (delegateVisit) - { - acceptedVisitor.visitCodeAttribute(clazz, method, codeAttribute); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassReferenceInitializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassReferenceInitializer.java deleted file mode 100644 index beb14a82..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassReferenceInitializer.java +++ /dev/null @@ -1,602 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.*; - - -/** - * This ClassVisitor initializes the references of all classes that - * it visits. - *

- * All class constant pool entries get direct references to the corresponding - * classes. These references make it more convenient to travel up and across - * the class hierarchy. - *

- * All field and method reference constant pool entries get direct references - * to the corresponding classes, fields, and methods. - *

- * All name and type constant pool entries get a list of direct references to - * the classes listed in the type. - *

- * This visitor optionally prints warnings if some items can't be found. - *

- * The class hierarchy must be initialized before using this visitor. - * - * @author Eric Lafortune - */ -public class ClassReferenceInitializer -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor, - AttributeVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final WarningPrinter missingClassWarningPrinter; - private final WarningPrinter missingProgramMemberWarningPrinter; - private final WarningPrinter missingLibraryMemberWarningPrinter; - private final WarningPrinter dependencyWarningPrinter; - - private final MemberFinder memberFinder = new MemberFinder(); - - - /** - * Creates a new ClassReferenceInitializer that initializes the references - * of all visited class files. - */ - public ClassReferenceInitializer(ClassPool programClassPool, - ClassPool libraryClassPool) - { - this(programClassPool, libraryClassPool, null, null, null, null); - } - - - /** - * Creates a new ClassReferenceInitializer that initializes the references - * of all visited class files, optionally printing warnings if some classes - * or class members can't be found or if they are in the program class pool. - */ - public ClassReferenceInitializer(ClassPool programClassPool, - ClassPool libraryClassPool, - WarningPrinter missingClassWarningPrinter, - WarningPrinter missingProgramMemberWarningPrinter, - WarningPrinter missingLibraryMemberWarningPrinter, - WarningPrinter dependencyWarningPrinter) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.missingClassWarningPrinter = missingClassWarningPrinter; - this.missingProgramMemberWarningPrinter = missingProgramMemberWarningPrinter; - this.missingLibraryMemberWarningPrinter = missingLibraryMemberWarningPrinter; - this.dependencyWarningPrinter = dependencyWarningPrinter; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Initialize the constant pool entries. - programClass.constantPoolEntriesAccept(this); - - // Initialize all fields and methods. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Initialize the attributes. - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Initialize all fields and methods. - libraryClass.fieldsAccept(this); - libraryClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - programField.referencedClass = - findReferencedClass(programClass, - programField.getDescriptor(programClass)); - - // Initialize the attributes. - programField.attributesAccept(programClass, this); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - programMethod.referencedClasses = - findReferencedClasses(programClass, - programMethod.getDescriptor(programClass)); - - // Initialize the attributes. - programMethod.attributesAccept(programClass, this); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - libraryField.referencedClass = - findReferencedClass(libraryClass, - libraryField.getDescriptor(libraryClass)); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - libraryMethod.referencedClasses = - findReferencedClasses(libraryClass, - libraryMethod.getDescriptor(libraryClass)); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Fill out the String class. - stringConstant.javaLangStringClass = - findClass(clazz, ClassConstants.NAME_JAVA_LANG_STRING); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - invokeDynamicConstant.referencedClasses = - findReferencedClasses(clazz, - invokeDynamicConstant.getType(clazz)); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - // Fill out the MethodHandle class. - methodHandleConstant.javaLangInvokeMethodHandleClass = - findClass(clazz, ClassConstants.NAME_JAVA_LANG_INVOKE_METHOD_HANDLE); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - String className = refConstant.getClassName(clazz); - - // Methods for array types should be found in the Object class. - if (ClassUtil.isInternalArrayType(className)) - { - className = ClassConstants.NAME_JAVA_LANG_OBJECT; - } - - // See if we can find the referenced class. - // Unresolved references are assumed to refer to library classes - // that will not change anyway. - Clazz referencedClass = findClass(clazz, className); - - if (referencedClass != null) - { - String name = refConstant.getName(clazz); - String type = refConstant.getType(clazz); - - boolean isFieldRef = refConstant.getTag() == ClassConstants.CONSTANT_Fieldref; - - // See if we can find the referenced class member somewhere in the - // hierarchy. - refConstant.referencedMember = memberFinder.findMember(clazz, - referencedClass, - name, - type, - isFieldRef); - refConstant.referencedClass = memberFinder.correspondingClass(); - - if (refConstant.referencedMember == null) - { - // We haven't found the class member anywhere in the hierarchy. - boolean isProgramClass = referencedClass instanceof ProgramClass; - - WarningPrinter missingMemberWarningPrinter = isProgramClass ? - missingProgramMemberWarningPrinter : - missingLibraryMemberWarningPrinter; - - if (missingMemberWarningPrinter != null) - { - missingMemberWarningPrinter.print(clazz.getName(), - className, - "Warning: " + - ClassUtil.externalClassName(clazz.getName()) + - ": can't find referenced " + - (isFieldRef ? - "field '" + ClassUtil.externalFullFieldDescription(0, name, type) : - "method '" + ClassUtil.externalFullMethodDescription(className, 0, name, type)) + - "' in " + - (isProgramClass ? - "program" : - "library") + - " class " + - ClassUtil.externalClassName(className)); - } - } - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Fill out the referenced class. - classConstant.referencedClass = - findClass(clazz, ClassUtil.internalClassNameFromClassType(classConstant.getName(clazz))); - - // Fill out the Class class. - classConstant.javaLangClassClass = - findClass(clazz, ClassConstants.NAME_JAVA_LANG_CLASS); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - // Fill out the MethodType class. - methodTypeConstant.javaLangInvokeMethodTypeClass = - findClass(clazz, ClassConstants.NAME_JAVA_LANG_INVOKE_METHOD_TYPE); - - methodTypeConstant.referencedClasses = - findReferencedClasses(clazz, - methodTypeConstant.getType(clazz)); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - String enclosingClassName = enclosingMethodAttribute.getClassName(clazz); - - // See if we can find the referenced class. - enclosingMethodAttribute.referencedClass = - findClass(clazz, enclosingClassName); - - if (enclosingMethodAttribute.referencedClass != null) - { - // Is there an enclosing method? Otherwise it's just initialization - // code outside of the constructors. - if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) - { - String name = enclosingMethodAttribute.getName(clazz); - String type = enclosingMethodAttribute.getType(clazz); - - // See if we can find the method in the referenced class. - enclosingMethodAttribute.referencedMethod = - enclosingMethodAttribute.referencedClass.findMethod(name, type); - - if (enclosingMethodAttribute.referencedMethod == null && - missingProgramMemberWarningPrinter != null) - { - // We couldn't find the enclosing method. - String className = clazz.getName(); - - missingProgramMemberWarningPrinter.print(className, - enclosingClassName, - "Warning: " + - ClassUtil.externalClassName(className) + - ": can't find enclosing method '" + - ClassUtil.externalFullMethodDescription(enclosingClassName, 0, name, type) + - "' in program class " + - ClassUtil.externalClassName(enclosingClassName)); - } - } - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Initialize the nested attributes. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Initialize the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Initialize the local variable types. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - signatureAttribute.referencedClasses = - findReferencedClasses(clazz, - signatureAttribute.getSignature(clazz)); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Initialize the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Initialize the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Initialize the annotation. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - localVariableInfo.referencedClass = - findReferencedClass(clazz, - localVariableInfo.getDescriptor(clazz)); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - localVariableTypeInfo.referencedClasses = - findReferencedClasses(clazz, - localVariableTypeInfo.getSignature(clazz)); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - annotation.referencedClasses = - findReferencedClasses(clazz, - annotation.getType(clazz)); - - // Initialize the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - initializeElementValue(clazz, annotation, constantElementValue); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - initializeElementValue(clazz, annotation, enumConstantElementValue); - - enumConstantElementValue.referencedClasses = - findReferencedClasses(clazz, - enumConstantElementValue.getTypeName(clazz)); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - initializeElementValue(clazz, annotation, classElementValue); - - classElementValue.referencedClasses = - findReferencedClasses(clazz, - classElementValue.getClassName(clazz)); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - initializeElementValue(clazz, annotation, annotationElementValue); - - // Initialize the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - initializeElementValue(clazz, annotation, arrayElementValue); - - // Initialize the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - /** - * Initializes the referenced method of an element value, if any. - */ - private void initializeElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) - { - // See if we have a referenced class. - if (annotation != null && - annotation.referencedClasses != null && - elementValue.u2elementNameIndex != 0) - { - // See if we can find the method in the referenced class - // (ignoring the descriptor). - String name = elementValue.getMethodName(clazz); - - Clazz referencedClass = annotation.referencedClasses[0]; - elementValue.referencedClass = referencedClass; - elementValue.referencedMethod = referencedClass.findMethod(name, null); - } - } - - - // Small utility methods. - - /** - * Returns the single class referenced by the given descriptor, or - * null if there isn't any useful reference. - */ - private Clazz findReferencedClass(Clazz referencingClass, - String descriptor) - { - DescriptorClassEnumeration enumeration = - new DescriptorClassEnumeration(descriptor); - - enumeration.nextFluff(); - - if (enumeration.hasMoreClassNames()) - { - return findClass(referencingClass, enumeration.nextClassName()); - } - - return null; - } - - - /** - * Returns an array of classes referenced by the given descriptor, or - * null if there aren't any useful references. - */ - private Clazz[] findReferencedClasses(Clazz referencingClass, - String descriptor) - { - DescriptorClassEnumeration enumeration = - new DescriptorClassEnumeration(descriptor); - - int classCount = enumeration.classCount(); - if (classCount > 0) - { - Clazz[] referencedClasses = new Clazz[classCount]; - - boolean foundReferencedClasses = false; - - for (int index = 0; index < classCount; index++) - { - String fluff = enumeration.nextFluff(); - String name = enumeration.nextClassName(); - - Clazz referencedClass = findClass(referencingClass, name); - - if (referencedClass != null) - { - referencedClasses[index] = referencedClass; - foundReferencedClasses = true; - } - } - - if (foundReferencedClasses) - { - return referencedClasses; - } - } - - return null; - } - - - /** - * Returns the class with the given name, either for the program class pool - * or from the library class pool, or null if it can't be found. - */ - private Clazz findClass(Clazz referencingClass, String name) - { - // Is it an array type? - if (ClassUtil.isInternalArrayType(name)) - { - // Ignore any primitive array types. - if (!ClassUtil.isInternalClassType(name)) - { - return null; - } - - // Strip the array part. - name = ClassUtil.internalClassNameFromClassType(name); - } - - // First look for the class in the program class pool. - Clazz clazz = programClassPool.getClass(name); - - // Otherwise look for the class in the library class pool. - if (clazz == null) - { - clazz = libraryClassPool.getClass(name); - - if (clazz == null && - missingClassWarningPrinter != null) - { - // We didn't find the superclass or interface. Print a warning. - String referencingClassName = referencingClass.getName(); - - missingClassWarningPrinter.print(referencingClassName, - name, - "Warning: " + - ClassUtil.externalClassName(referencingClassName) + - ": can't find referenced class " + - ClassUtil.externalClassName(name)); - } - } - else if (dependencyWarningPrinter != null) - { - // The superclass or interface was found in the program class pool. - // Print a warning. - String referencingClassName = referencingClass.getName(); - - dependencyWarningPrinter.print(referencingClassName, - name, - "Warning: library class " + - ClassUtil.externalClassName(referencingClassName) + - " depends on program class " + - ClassUtil.externalClassName(name)); - } - - return clazz; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassSubHierarchyInitializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassSubHierarchyInitializer.java deleted file mode 100644 index 991ac838..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassSubHierarchyInitializer.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor adds all classes that it visits to the list of subclasses - * of their superclass. These subclass lists make it more convenient to travel - * - * @author Eric Lafortune - */ -public class ClassSubHierarchyInitializer -implements ClassVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Add this class to the subclasses of its superclass. - addSubclass(programClass, programClass.getSuperClass()); - - // Add this class to the subclasses of its interfaces. - for (int index = 0; index < programClass.u2interfacesCount; index++) - { - addSubclass(programClass, programClass.getInterface(index)); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Add this class to the subclasses of its superclass, - addSubclass(libraryClass, libraryClass.superClass); - - // Add this class to the subclasses of its interfaces. - Clazz[] interfaceClasses = libraryClass.interfaceClasses; - if (interfaceClasses != null) - { - for (int index = 0; index < interfaceClasses.length; index++) - { - // Add this class to the subclasses of the interface class. - addSubclass(libraryClass, interfaceClasses[index]); - } - } - } - - - // Small utility methods. - - private void addSubclass(Clazz subclass, Clazz clazz) - { - if (clazz != null) - { - clazz.addSubClass(subclass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassSuperHierarchyInitializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassSuperHierarchyInitializer.java deleted file mode 100644 index 75a26f29..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassSuperHierarchyInitializer.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor initializes the superclass hierarchy of all classes that - * it visits. - *

- * Visited library classes get direct references to their superclasses and - * interfaces, replacing the superclass names and interface names. The direct - * references are equivalent to the names, but they are more efficient to work - * with. - *

- * This visitor optionally prints warnings if some superclasses can't be found - * or if they are in the program class pool. - * - * @author Eric Lafortune - */ -public class ClassSuperHierarchyInitializer -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor -{ - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final WarningPrinter missingWarningPrinter; - private final WarningPrinter dependencyWarningPrinter; - - - /** - * Creates a new ClassSuperHierarchyInitializer that initializes the super - * hierarchy of all visited class files. - */ - public ClassSuperHierarchyInitializer(ClassPool programClassPool, - ClassPool libraryClassPool) - { - this(programClassPool, libraryClassPool, null, null); - } - - /** - * Creates a new ClassSuperHierarchyInitializer that initializes the super - * hierarchy of all visited class files, optionally printing warnings if - * some classes can't be found or if they are in the program class pool. - */ - public ClassSuperHierarchyInitializer(ClassPool programClassPool, - ClassPool libraryClassPool, - WarningPrinter missingWarningPrinter, - WarningPrinter dependencyWarningPrinter) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.missingWarningPrinter = missingWarningPrinter; - this.dependencyWarningPrinter = dependencyWarningPrinter; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Link to the super class. - programClass.superClassConstantAccept(this); - - // Link to the interfaces. - programClass.interfaceConstantsAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - String className = libraryClass.getName(); - - // Link to the super class. - String superClassName = libraryClass.superClassName; - if (superClassName != null) - { - // Keep a reference to the superclass. - libraryClass.superClass = findClass(className, superClassName); - } - - // Link to the interfaces. - if (libraryClass.interfaceNames != null) - { - String[] interfaceNames = libraryClass.interfaceNames; - Clazz[] interfaceClasses = new Clazz[interfaceNames.length]; - - for (int index = 0; index < interfaceNames.length; index++) - { - // Keep a reference to the interface class. - interfaceClasses[index] = - findClass(className, interfaceNames[index]); - } - - libraryClass.interfaceClasses = interfaceClasses; - } - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.referencedClass = - findClass(clazz.getName(), classConstant.getName(clazz)); - } - - - // Small utility methods. - - /** - * Returns the class with the given name, either for the program class pool - * or from the library class pool, or null if it can't be found. - */ - private Clazz findClass(String referencingClassName, String name) - { - // First look for the class in the program class pool. - Clazz clazz = programClassPool.getClass(name); - - // Otherwise look for the class in the library class pool. - if (clazz == null) - { - clazz = libraryClassPool.getClass(name); - - if (clazz == null && - missingWarningPrinter != null) - { - // We didn't find the superclass or interface. Print a warning. - missingWarningPrinter.print(referencingClassName, - name, - "Warning: " + - ClassUtil.externalClassName(referencingClassName) + - ": can't find superclass or interface " + - ClassUtil.externalClassName(name)); - } - } - else if (dependencyWarningPrinter != null) - { - // The superclass or interface was found in the program class pool. - // Print a warning. - dependencyWarningPrinter.print(referencingClassName, - name, - "Warning: library class " + - ClassUtil.externalClassName(referencingClassName) + - " extends or implements program class " + - ClassUtil.externalClassName(name)); - } - - return clazz; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassUtil.java deleted file mode 100644 index de4165d1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ClassUtil.java +++ /dev/null @@ -1,1723 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; - -import java.util.List; - -/** - * Utility methods for converting between internal and external representations - * of names and descriptions. - * - * @author Eric Lafortune - */ -public class ClassUtil -{ - private static final String EMPTY_STRING = ""; - - - /** - * Checks whether the given class magic number is correct. - * @param magicNumber the magic number. - * @throws UnsupportedOperationException when the magic number is incorrect. - */ - public static void checkMagicNumber(int magicNumber) throws UnsupportedOperationException - { - if (magicNumber != ClassConstants.MAGIC) - { - throw new UnsupportedOperationException("Invalid magic number ["+Integer.toHexString(magicNumber)+"] in class"); - } - } - - - /** - * Returns the combined class version number. - * @param majorVersion the major part of the class version number. - * @param minorVersion the minor part of the class version number. - * @return the combined class version number. - */ - public static int internalClassVersion(int majorVersion, int minorVersion) - { - return (majorVersion << 16) | minorVersion; - } - - - /** - * Returns the major part of the given class version number. - * @param internalClassVersion the combined class version number. - * @return the major part of the class version number. - */ - public static int internalMajorClassVersion(int internalClassVersion) - { - return internalClassVersion >>> 16; - } - - - /** - * Returns the internal class version number. - * @param internalClassVersion the external class version number. - * @return the internal class version number. - */ - public static int internalMinorClassVersion(int internalClassVersion) - { - return internalClassVersion & 0xffff; - } - - - /** - * Returns the internal class version number. - * @param externalClassVersion the external class version number. - * @return the internal class version number. - */ - public static int internalClassVersion(String externalClassVersion) - { - return - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_0) || - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_1) ? ClassConstants.CLASS_VERSION_1_0 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_2) ? ClassConstants.CLASS_VERSION_1_2 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_3) ? ClassConstants.CLASS_VERSION_1_3 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_4) ? ClassConstants.CLASS_VERSION_1_4 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_5_ALIAS) || - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_5) ? ClassConstants.CLASS_VERSION_1_5 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_6_ALIAS) || - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_6) ? ClassConstants.CLASS_VERSION_1_6 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_7_ALIAS) || - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_7) ? ClassConstants.CLASS_VERSION_1_7 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_8_ALIAS) || - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_8) ? ClassConstants.CLASS_VERSION_1_8 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_9_ALIAS) || - externalClassVersion.equals(JavaConstants.CLASS_VERSION_1_9) ? ClassConstants.CLASS_VERSION_1_9 : - externalClassVersion.equals(JavaConstants.CLASS_VERSION_10) ? ClassConstants.CLASS_VERSION_10 : - 0; - } - - - /** - * Returns the minor part of the given class version number. - * @param internalClassVersion the combined class version number. - * @return the minor part of the class version number. - */ - public static String externalClassVersion(int internalClassVersion) - { - switch (internalClassVersion) - { - case ClassConstants.CLASS_VERSION_1_0: return JavaConstants.CLASS_VERSION_1_0; - case ClassConstants.CLASS_VERSION_1_2: return JavaConstants.CLASS_VERSION_1_2; - case ClassConstants.CLASS_VERSION_1_3: return JavaConstants.CLASS_VERSION_1_3; - case ClassConstants.CLASS_VERSION_1_4: return JavaConstants.CLASS_VERSION_1_4; - case ClassConstants.CLASS_VERSION_1_5: return JavaConstants.CLASS_VERSION_1_5; - case ClassConstants.CLASS_VERSION_1_6: return JavaConstants.CLASS_VERSION_1_6; - case ClassConstants.CLASS_VERSION_1_7: return JavaConstants.CLASS_VERSION_1_7; - case ClassConstants.CLASS_VERSION_1_8: return JavaConstants.CLASS_VERSION_1_8; - case ClassConstants.CLASS_VERSION_1_9: return JavaConstants.CLASS_VERSION_1_9; - case ClassConstants.CLASS_VERSION_10: return JavaConstants.CLASS_VERSION_10; - default: return null; - } - } - - - /** - * Checks whether the given class version number is supported. - * @param internalClassVersion the combined class version number. - * @throws UnsupportedOperationException when the version is not supported. - */ - public static void checkVersionNumbers(int internalClassVersion) throws UnsupportedOperationException - { - if (internalClassVersion < ClassConstants.CLASS_VERSION_1_0 || - internalClassVersion > ClassConstants.CLASS_VERSION_10) - { - throw new UnsupportedOperationException("Unsupported version number ["+ - internalMajorClassVersion(internalClassVersion)+"."+ - internalMinorClassVersion(internalClassVersion)+"] (maximum "+ - ClassConstants.CLASS_VERSION_10_MAJOR+"."+ - ClassConstants.CLASS_VERSION_10_MINOR+", Java "+ - JavaConstants.CLASS_VERSION_10+")"); - } - } - - - /** - * Converts an external class name into an internal class name. - * @param externalClassName the external class name, - * e.g. "java.lang.Object" - * @return the internal class name, - * e.g. "java/lang/Object". - */ - public static String internalClassName(String externalClassName) - { - return externalClassName.replace(JavaConstants.PACKAGE_SEPARATOR, - ClassConstants.PACKAGE_SEPARATOR); - } - - - /** - * Converts an internal class description into an external class description. - * @param accessFlags the access flags of the class. - * @param internalClassName the internal class name, - * e.g. "java/lang/Object". - * @return the external class description, - * e.g. "public java.lang.Object". - */ - public static String externalFullClassDescription(int accessFlags, - String internalClassName) - { - return externalClassAccessFlags(accessFlags) + - externalClassName(internalClassName); - } - - - /** - * Converts an internal class name into an external class name. - * @param internalClassName the internal class name, - * e.g. "java/lang/Object". - * @return the external class name, - * e.g. "java.lang.Object". - */ - public static String externalClassName(String internalClassName) - { - return //internalClassName.startsWith(ClassConstants.PACKAGE_JAVA_LANG) && - //internalClassName.indexOf(ClassConstants.PACKAGE_SEPARATOR, ClassConstants.PACKAGE_JAVA_LANG.length() + 1) < 0 ? - //internalClassName.substring(ClassConstants.PACKAGE_JAVA_LANG.length()) : - internalClassName.replace(ClassConstants.PACKAGE_SEPARATOR, - JavaConstants.PACKAGE_SEPARATOR); - } - - - /** - * Returns the external base type of an external array type, dropping any - * array brackets. - * @param externalArrayType the external array type, - * e.g. "java.lang.Object[][]" - * @return the external base type, - * e.g. "java.lang.Object". - */ - public static String externalBaseType(String externalArrayType) - { - int index = externalArrayType.indexOf(JavaConstants.TYPE_ARRAY); - return index >= 0 ? - externalArrayType.substring(0, index) : - externalArrayType; - } - - - /** - * Returns the external short class name of an external class name, dropping - * the package specification. - * @param externalClassName the external class name, - * e.g. "java.lang.Object" - * @return the external short class name, - * e.g. "Object". - */ - public static String externalShortClassName(String externalClassName) - { - int index = externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR); - return externalClassName.substring(index+1); - } - - - /** - * Returns whether the given internal type is an array type. - * @param internalType the internal type, - * e.g. "[[Ljava/lang/Object;". - * @return true if the given type is an array type, - * false otherwise. - */ - public static boolean isInternalArrayType(String internalType) - { - return internalType.length() > 1 && - internalType.charAt(0) == ClassConstants.TYPE_ARRAY; - } - - - /** - * Returns the number of dimensions of the given internal type. - * @param internalType the internal type, - * e.g. "[[Ljava/lang/Object;". - * @return the number of dimensions, e.g. 2. - */ - public static int internalArrayTypeDimensionCount(String internalType) - { - int dimensions = 0; - while (internalType.charAt(dimensions) == ClassConstants.TYPE_ARRAY) - { - dimensions++; - } - - return dimensions; - } - - - /** - * Returns whether the given internal class name is one of the interfaces - * that is implemented by all array types. These class names are - * "java/lang/Object", "java/lang/Cloneable", and - * "java/io/Serializable" - * @param internalClassName the internal class name, - * e.g. "java/lang/Object". - * @return true if the given type is an array interface name, - * false otherwise. - */ - public static boolean isInternalArrayInterfaceName(String internalClassName) - { - return ClassConstants.NAME_JAVA_LANG_OBJECT.equals(internalClassName) || - ClassConstants.NAME_JAVA_LANG_CLONEABLE.equals(internalClassName) || - ClassConstants.NAME_JAVA_IO_SERIALIZABLE.equals(internalClassName); - } - - - /** - * Returns whether the given internal type is a plain primitive type - * (not void). - * @param internalType the internal type, - * e.g. "I". - * @return true if the given type is a class type, - * false otherwise. - */ - public static boolean isInternalPrimitiveType(char internalType) - { - return internalType == ClassConstants.TYPE_BOOLEAN || - internalType == ClassConstants.TYPE_BYTE || - internalType == ClassConstants.TYPE_CHAR || - internalType == ClassConstants.TYPE_SHORT || - internalType == ClassConstants.TYPE_INT || - internalType == ClassConstants.TYPE_FLOAT || - internalType == ClassConstants.TYPE_LONG || - internalType == ClassConstants.TYPE_DOUBLE; - } - - - /** - * Returns whether the given internal type is a plain primitive type - * (not void). - * @param internalType the internal type, - * e.g. "I". - * @return true if the given type is a class type, - * false otherwise. - */ - public static boolean isInternalPrimitiveType(String internalType) - { - return isInternalPrimitiveType(internalType.charAt(0)); - } - - - /** - * Returns whether the given internal type is a primitive Category 2 type. - * @param internalType the internal type, - * e.g. "L". - * @return true if the given type is a Category 2 type, - * false otherwise. - */ - public static boolean isInternalCategory2Type(String internalType) - { - return internalType.length() == 1 && - (internalType.charAt(0) == ClassConstants.TYPE_LONG || - internalType.charAt(0) == ClassConstants.TYPE_DOUBLE); - } - - - /** - * Returns whether the given internal type is a plain class type - * (including an array type of a plain class type). - * @param internalType the internal type, - * e.g. "Ljava/lang/Object;". - * @return true if the given type is a class type, - * false otherwise. - */ - public static boolean isInternalClassType(String internalType) - { - int length = internalType.length(); - return length > 1 && -// internalType.charAt(0) == ClassConstants.TYPE_CLASS_START && - internalType.charAt(length-1) == ClassConstants.TYPE_CLASS_END; - } - - - /** - * Returns the internal type of a given class name. - * @param internalClassName the internal class name, - * e.g. "java/lang/Object". - * @return the internal type, - * e.g. "Ljava/lang/Object;". - */ - public static String internalTypeFromClassName(String internalClassName) - { - return internalArrayTypeFromClassName(internalClassName, 0); - } - - - /** - * Returns the internal array type of a given class name with a given number - * of dimensions. If the number of dimensions is 0, the class name itself is - * returned. - * @param internalClassName the internal class name, - * e.g. "java/lang/Object". - * @param dimensionCount the number of array dimensions. - * @return the internal array type of the array elements, - * e.g. "Ljava/lang/Object;". - */ - public static String internalArrayTypeFromClassName(String internalClassName, - int dimensionCount) - { - StringBuffer buffer = new StringBuffer(internalClassName.length() + dimensionCount + 2); - - for (int dimension = 0; dimension < dimensionCount; dimension++) - { - buffer.append(ClassConstants.TYPE_ARRAY); - } - - return buffer.append(ClassConstants.TYPE_CLASS_START) - .append(internalClassName) - .append(ClassConstants.TYPE_CLASS_END) - .toString(); - } - - - /** - * Returns the internal array type of a given type, with a given number of - * additional dimensions. - * @param internalType the internal class name, - * e.g. "[Ljava/lang/Object;". - * @param dimensionDelta the number of additional array dimensions, - * e.g. 1. - * @return the internal array type of the array elements, - * e.g. "[[Ljava/lang/Object;". - */ - public static String internalArrayTypeFromType(String internalType, - int dimensionDelta) - { - StringBuffer buffer = new StringBuffer(internalType.length() + dimensionDelta); - - for (int dimension = 0; dimension < dimensionDelta; dimension++) - { - buffer.append(ClassConstants.TYPE_ARRAY); - } - - return buffer.append(internalType).toString(); - } - - - /** - * Returns the internal element type of a given internal array type. - * @param internalArrayType the internal array type, - * e.g. "[[Ljava/lang/Object;" or - * "[I". - * @return the internal type of the array elements, - * e.g. "Ljava/lang/Object;" or - * "I". - */ - public static String internalTypeFromArrayType(String internalArrayType) - { - int index = internalArrayType.lastIndexOf(ClassConstants.TYPE_ARRAY); - return internalArrayType.substring(index + 1); - } - - - /** - * Returns the internal class type (class name or array type) of a given - * internal type (including an array type). This is the type that can be - * stored in a class constant. - * @param internalType the internal class type, - * e.g. "[I", - * "[Ljava/lang/Object;", or - * "Ljava/lang/Object;". - * @return the internal class name, - * e.g. "[I", - * "[Ljava/lang/Object;", or - * "java/lang/Object". - */ - public static String internalClassTypeFromType(String internalType) - { - return isInternalArrayType(internalType) ? - internalType : - internalClassNameFromClassType(internalType); - } - - - /** - * Returns the internal type of of a given class type (class name or array - * type). This is the type that can be stored in a class constant. - * @param internalType the internal class type, - * e.g. "[I", - * "[Ljava/lang/Object;", or - * "java/lang/Object". - * @return the internal class name, - * e.g. "[I", - * "[Ljava/lang/Object;", or - * "Ljava/lang/Object;". - */ - public static String internalTypeFromClassType(String internalType) - { - return isInternalArrayType(internalType) ? - internalType : - internalTypeFromClassName(internalType); - } - - - /** - * Returns the internal class name of a given internal class type - * (including an array type). Types involving primitive types are returned - * unchanged. - * @param internalClassType the internal class type, - * e.g. "[Ljava/lang/Object;", - * "Ljava/lang/Object;", or - * "java/lang/Object". - * @return the internal class name, - * e.g. "java/lang/Object". - */ - public static String internalClassNameFromClassType(String internalClassType) - { - return isInternalClassType(internalClassType) ? - internalClassType.substring(internalClassType.indexOf(ClassConstants.TYPE_CLASS_START)+1, - internalClassType.length()-1) : - internalClassType; - } - - - /** - * Returns the internal class name of any given internal descriptor type, - * disregarding array prefixes. - * @param internalClassType the internal class type, - * e.g. "Ljava/lang/Object;" or - * "[[I". - * @return the internal class name, - * e.g. "java/lang/Object" or - * null. - */ - public static String internalClassNameFromType(String internalClassType) - { - if (!isInternalClassType(internalClassType)) - { - return null; - } - - // Is it an array type? - if (isInternalArrayType(internalClassType)) - { - internalClassType = internalTypeFromArrayType(internalClassType); - } - - return internalClassNameFromClassType(internalClassType); - } - - - /** - * Returns the internal numeric (or void or array) class name corresponding - * to the given internal primitive type. - * @param internalPrimitiveType the internal class type, - * e.g. "I" or - * "V". - * @return the internal class name, - * e.g. "java/lang/Integer" or - * java/lang/Void. - */ - public static String internalNumericClassNameFromPrimitiveType(char internalPrimitiveType) - { - switch (internalPrimitiveType) - { - case ClassConstants.TYPE_VOID: return ClassConstants.NAME_JAVA_LANG_VOID; - case ClassConstants.TYPE_BOOLEAN: return ClassConstants.NAME_JAVA_LANG_BOOLEAN; - case ClassConstants.TYPE_BYTE: return ClassConstants.NAME_JAVA_LANG_BYTE; - case ClassConstants.TYPE_CHAR: return ClassConstants.NAME_JAVA_LANG_CHARACTER; - case ClassConstants.TYPE_SHORT: return ClassConstants.NAME_JAVA_LANG_SHORT; - case ClassConstants.TYPE_INT: return ClassConstants.NAME_JAVA_LANG_INTEGER; - case ClassConstants.TYPE_LONG: return ClassConstants.NAME_JAVA_LANG_LONG; - case ClassConstants.TYPE_FLOAT: return ClassConstants.NAME_JAVA_LANG_FLOAT; - case ClassConstants.TYPE_DOUBLE: return ClassConstants.NAME_JAVA_LANG_DOUBLE; - case ClassConstants.TYPE_ARRAY: return ClassConstants.NAME_JAVA_LANG_REFLECT_ARRAY; - default: - throw new IllegalArgumentException("Unexpected primitive type ["+internalPrimitiveType+"]"); - } - } - - - /** - * Returns the internal numeric (or void or array) class name corresponding - * to the given internal primitive type. - * @param internalPrimitiveClassName the internal class name, - * e.g. "java/lang/Integer" or - * java/lang/Void. - * @return the internal class type, - * e.g. "I" or - * "V". - */ - public static char internalPrimitiveTypeFromNumericClassName(String internalPrimitiveClassName) - { - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_VOID)) return ClassConstants.TYPE_VOID; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_BOOLEAN)) return ClassConstants.TYPE_BOOLEAN; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_BYTE)) return ClassConstants.TYPE_BYTE; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_CHARACTER)) return ClassConstants.TYPE_CHAR; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_SHORT)) return ClassConstants.TYPE_SHORT; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_INTEGER)) return ClassConstants.TYPE_INT; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_LONG)) return ClassConstants.TYPE_LONG; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_FLOAT)) return ClassConstants.TYPE_FLOAT; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_DOUBLE)) return ClassConstants.TYPE_DOUBLE; - if (internalPrimitiveClassName.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_ARRAY)) return ClassConstants.TYPE_ARRAY; - - throw new IllegalArgumentException("Unexpected primitive class name ["+internalPrimitiveClassName+"]"); - } - - - /** - * Returns whether the given method name refers to a class initializer or - * an instance initializer. - * @param internalMethodName the internal method name, - * e.g. "<clinit>". - * @return whether the method name refers to an initializer, - * e.g. true. - */ - public static boolean isInitializer(String internalMethodName) - { - return internalMethodName.equals(ClassConstants.METHOD_NAME_CLINIT) || - internalMethodName.equals(ClassConstants.METHOD_NAME_INIT); - } - - - /** - * Returns the internal type of the given internal method descriptor. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(II)Z". - * @return the internal return type, - * e.g. "Z". - */ - public static String internalMethodReturnType(String internalMethodDescriptor) - { - int index = internalMethodDescriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); - return internalMethodDescriptor.substring(index + 1); - } - - - /** - * Returns the number of parameters of the given internal method descriptor. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(ID)Z". - * @return the number of parameters, - * e.g. 2. - */ - public static int internalMethodParameterCount(String internalMethodDescriptor) - { - return internalMethodParameterCount(internalMethodDescriptor, true); - } - - - /** - * Returns the number of parameters of the given internal method descriptor. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(ID)Z". - * @param accessFlags the access flags of the method, - * e.g. 0. - * @return the number of parameters, - * e.g. 3. - */ - public static int internalMethodParameterCount(String internalMethodDescriptor, - int accessFlags) - { - return internalMethodParameterCount(internalMethodDescriptor, - (accessFlags & ClassConstants.ACC_STATIC) != 0); - } - - - /** - * Returns the number of parameters of the given internal method descriptor. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(ID)Z". - * @param isStatic specifies whether the method is static, - * e.g. false. - * @return the number of parameters, - * e.g. 3. - */ - public static int internalMethodParameterCount(String internalMethodDescriptor, - boolean isStatic) - { - int counter = isStatic ? 0 : 1; - int index = 1; - - while (true) - { - char c = internalMethodDescriptor.charAt(index++); - switch (c) - { - case ClassConstants.TYPE_ARRAY: - { - // Just ignore all array characters. - break; - } - case ClassConstants.TYPE_CLASS_START: - { - counter++; - - // Skip the class name. - index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; - break; - } - default: - { - counter++; - break; - } - case ClassConstants.METHOD_ARGUMENTS_CLOSE: - { - return counter; - } - } - } - } - - - /** - * Returns the size taken up on the stack by the parameters of the given - * internal method descriptor. This accounts for long and double parameters - * taking up two entries. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(ID)Z". - * @return the size taken up on the stack, - * e.g. 3. - */ - public static int internalMethodParameterSize(String internalMethodDescriptor) - { - return internalMethodParameterSize(internalMethodDescriptor, true); - } - - - /** - * Returns the size taken up on the stack by the parameters of the given - * internal method descriptor. This accounts for long and double parameters - * taking up two entries, and a non-static method taking up an additional - * entry. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(ID)Z". - * @param accessFlags the access flags of the method, - * e.g. 0. - * @return the size taken up on the stack, - * e.g. 4. - */ - public static int internalMethodParameterSize(String internalMethodDescriptor, - int accessFlags) - { - return internalMethodParameterSize(internalMethodDescriptor, - (accessFlags & ClassConstants.ACC_STATIC) != 0); - } - - - /** - * Returns the size taken up on the stack by the parameters of the given - * internal method descriptor. This accounts for long and double parameters - * taking up two spaces, and a non-static method taking up an additional - * entry. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(ID)Z". - * @param isStatic specifies whether the method is static, - * e.g. false. - * @return the size taken up on the stack, - * e.g. 4. - */ - public static int internalMethodParameterSize(String internalMethodDescriptor, - boolean isStatic) - { - int size = isStatic ? 0 : 1; - int index = 1; - - while (true) - { - char c = internalMethodDescriptor.charAt(index++); - switch (c) - { - case ClassConstants.TYPE_LONG: - case ClassConstants.TYPE_DOUBLE: - { - size += 2; - break; - } - case ClassConstants.TYPE_CLASS_START: - { - size++; - - // Skip the class name. - index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; - break; - } - case ClassConstants.TYPE_ARRAY: - { - size++; - - // Skip all array characters. - while ((c = internalMethodDescriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {} - - if (c == ClassConstants.TYPE_CLASS_START) - { - // Skip the class type. - index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; - } - break; - } - default: - { - size++; - break; - } - case ClassConstants.METHOD_ARGUMENTS_CLOSE: - { - return size; - } - } - } - } - - - /** - * Returns the size taken up on the stack by the given internal type. - * The size is 1, except for long and double types, for which it is 2, - * and for the void type, for which 0 is returned. - * @param internalType the internal type, - * e.g. "I". - * @return the size taken up on the stack, - * e.g. 1. - */ - public static int internalTypeSize(String internalType) - { - if (internalType.length() == 1) - { - char internalPrimitiveType = internalType.charAt(0); - if (internalPrimitiveType == ClassConstants.TYPE_LONG || - internalPrimitiveType == ClassConstants.TYPE_DOUBLE) - { - return 2; - } - else if (internalPrimitiveType == ClassConstants.TYPE_VOID) - { - return 0; - } - } - - return 1; - } - - - /** - * Converts an external type into an internal type. - * @param externalType the external type, - * e.g. "java.lang.Object[][]" or - * "int[]". - * @return the internal type, - * e.g. "[[Ljava/lang/Object;" or - * "[I". - */ - public static String internalType(String externalType) - { - // Strip the array part, if any. - int dimensionCount = externalArrayTypeDimensionCount(externalType); - if (dimensionCount > 0) - { - externalType = externalType.substring(0, externalType.length() - dimensionCount * JavaConstants.TYPE_ARRAY.length()); - } - - // Analyze the actual type part. - char internalTypeChar = - externalType.equals(JavaConstants.TYPE_VOID ) ? ClassConstants.TYPE_VOID : - externalType.equals(JavaConstants.TYPE_BOOLEAN) ? ClassConstants.TYPE_BOOLEAN : - externalType.equals(JavaConstants.TYPE_BYTE ) ? ClassConstants.TYPE_BYTE : - externalType.equals(JavaConstants.TYPE_CHAR ) ? ClassConstants.TYPE_CHAR : - externalType.equals(JavaConstants.TYPE_SHORT ) ? ClassConstants.TYPE_SHORT : - externalType.equals(JavaConstants.TYPE_INT ) ? ClassConstants.TYPE_INT : - externalType.equals(JavaConstants.TYPE_FLOAT ) ? ClassConstants.TYPE_FLOAT : - externalType.equals(JavaConstants.TYPE_LONG ) ? ClassConstants.TYPE_LONG : - externalType.equals(JavaConstants.TYPE_DOUBLE ) ? ClassConstants.TYPE_DOUBLE : - externalType.equals("%" ) ? '%' : - (char)0; - - String internalType = - internalTypeChar != 0 ? String.valueOf(internalTypeChar) : - ClassConstants.TYPE_CLASS_START + - internalClassName(externalType) + - ClassConstants.TYPE_CLASS_END; - - // Prepend the array part, if any. - for (int count = 0; count < dimensionCount; count++) - { - internalType = ClassConstants.TYPE_ARRAY + internalType; - } - - return internalType; - } - - - /** - * Returns the number of dimensions of the given external type. - * @param externalType the external type, - * e.g. "[[Ljava/lang/Object;". - * @return the number of dimensions, e.g. 2. - */ - public static int externalArrayTypeDimensionCount(String externalType) - { - int dimensions = 0; - int length = JavaConstants.TYPE_ARRAY.length(); - int offset = externalType.length() - length; - while (externalType.regionMatches(offset, - JavaConstants.TYPE_ARRAY, - 0, - length)) - { - dimensions++; - offset -= length; - } - - return dimensions; - } - - - /** - * Converts an internal type into an external type. - * @param internalType the internal type, - * e.g. "Ljava/lang/Object;" or - * "[[Ljava/lang/Object;" or - * "[I". - * @return the external type, - * e.g. "java.lang.Object" or - * "java.lang.Object[][]" or - * "int[]". - */ - public static String externalType(String internalType) - { - // Strip the array part, if any. - int dimensionCount = internalArrayTypeDimensionCount(internalType); - if (dimensionCount > 0) - { - internalType = internalType.substring(dimensionCount); - } - - // Analyze the actual type part. - char internalTypeChar = internalType.charAt(0); - - String externalType = - internalTypeChar == ClassConstants.TYPE_VOID ? JavaConstants.TYPE_VOID : - internalTypeChar == ClassConstants.TYPE_BOOLEAN ? JavaConstants.TYPE_BOOLEAN : - internalTypeChar == ClassConstants.TYPE_BYTE ? JavaConstants.TYPE_BYTE : - internalTypeChar == ClassConstants.TYPE_CHAR ? JavaConstants.TYPE_CHAR : - internalTypeChar == ClassConstants.TYPE_SHORT ? JavaConstants.TYPE_SHORT : - internalTypeChar == ClassConstants.TYPE_INT ? JavaConstants.TYPE_INT : - internalTypeChar == ClassConstants.TYPE_FLOAT ? JavaConstants.TYPE_FLOAT : - internalTypeChar == ClassConstants.TYPE_LONG ? JavaConstants.TYPE_LONG : - internalTypeChar == ClassConstants.TYPE_DOUBLE ? JavaConstants.TYPE_DOUBLE : - internalTypeChar == '%' ? "%" : - internalTypeChar == ClassConstants.TYPE_CLASS_START ? externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.TYPE_CLASS_END))) : - null; - - if (externalType == null) - { - throw new IllegalArgumentException("Unknown type ["+internalType+"]"); - } - - // Append the array part, if any. - for (int count = 0; count < dimensionCount; count++) - { - externalType += JavaConstants.TYPE_ARRAY; - } - - return externalType; - } - - - /** - * Converts an internal type into an external type, as expected by - * Class.forName. - * @param internalType the internal type, - * e.g. "Ljava/lang/Object;" or - * "[[Ljava/lang/Object;" or - * "[I". - * @return the external type, - * e.g. "java.lang.Object" or - * "[[Ljava.lang.Object;" or - * "[I". - */ - public static String externalClassForNameType(String internalType) - { - return isInternalArrayType(internalType) ? - externalClassName(internalType) : - externalClassName(internalClassNameFromClassType(internalType)); - } - - - /** - * Returns whether the given internal descriptor String represents a method - * descriptor. - * @param internalDescriptor the internal descriptor String, - * e.g. "(II)Z". - * @return true if the given String is a method descriptor, - * false otherwise. - */ - public static boolean isInternalMethodDescriptor(String internalDescriptor) - { - return internalDescriptor.charAt(0) == ClassConstants.METHOD_ARGUMENTS_OPEN; - } - - - /** - * Returns whether the given member String represents an external method - * name with arguments. - * @param externalMemberNameAndArguments the external member String, - * e.g. "myField" or - * e.g. "myMethod(int,int)". - * @return true if the given String refers to a method, - * false otherwise. - */ - public static boolean isExternalMethodNameAndArguments(String externalMemberNameAndArguments) - { - return externalMemberNameAndArguments.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN) > 0; - } - - - /** - * Returns the name part of the given external method name and arguments. - * @param externalMethodNameAndArguments the external method name and arguments, - * e.g. "myMethod(int,int)". - * @return the name part of the String, e.g. "myMethod". - */ - public static String externalMethodName(String externalMethodNameAndArguments) - { - ExternalTypeEnumeration externalTypeEnumeration = - new ExternalTypeEnumeration(externalMethodNameAndArguments); - - return externalTypeEnumeration.methodName(); - } - - - /** - * Converts the given external method return type and name and arguments to - * an internal method descriptor. - * @param externalReturnType the external method return type, - * e.g. "boolean". - * @param externalMethodNameAndArguments the external method name and arguments, - * e.g. "myMethod(int,int)". - * @return the internal method descriptor, - * e.g. "(II)Z". - */ - public static String internalMethodDescriptor(String externalReturnType, - String externalMethodNameAndArguments) - { - StringBuffer internalMethodDescriptor = new StringBuffer(); - internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); - - ExternalTypeEnumeration externalTypeEnumeration = - new ExternalTypeEnumeration(externalMethodNameAndArguments); - - while (externalTypeEnumeration.hasMoreTypes()) - { - internalMethodDescriptor.append(internalType(externalTypeEnumeration.nextType())); - } - - internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); - internalMethodDescriptor.append(internalType(externalReturnType)); - - return internalMethodDescriptor.toString(); - } - - - /** - * Converts the given external method return type and List of arguments to - * an internal method descriptor. - * @param externalReturnType the external method return type, - * e.g. "boolean". - * @param externalArguments the external method arguments, - * e.g. { "int", "int" }. - * @return the internal method descriptor, - * e.g. "(II)Z". - */ - public static String internalMethodDescriptor(String externalReturnType, - List externalArguments) - { - StringBuffer internalMethodDescriptor = new StringBuffer(); - internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); - - for (int index = 0; index < externalArguments.size(); index++) - { - internalMethodDescriptor.append(internalType((String)externalArguments.get(index))); - } - - internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); - internalMethodDescriptor.append(internalType(externalReturnType)); - - return internalMethodDescriptor.toString(); - } - - - /** - * Converts the given internal method return type and List of arguments to - * an internal method descriptor. - * - * @param internalReturnType the external method return type, - * e.g. "Z". - * @param internalArguments the external method arguments, - * e.g. { "I", "I" }. - * @return the internal method descriptor, e.g. "(II)Z". - */ - public static String internalMethodDescriptorFromInternalTypes(String internalReturnType, - List internalArguments) - { - StringBuilder internalMethodDescriptor = new StringBuilder(); - internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); - - for (String argument : internalArguments) - { - internalMethodDescriptor.append(argument); - } - - internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); - internalMethodDescriptor.append(internalReturnType); - - return internalMethodDescriptor.toString(); - } - - - /** - * Converts an internal field description into an external full field description. - * @param accessFlags the access flags of the field. - * @param fieldName the field name, - * e.g. "myField". - * @param internalFieldDescriptor the internal field descriptor, - * e.g. "Z". - * @return the external full field description, - * e.g. "public boolean myField". - */ - public static String externalFullFieldDescription(int accessFlags, - String fieldName, - String internalFieldDescriptor) - { - return externalFieldAccessFlags(accessFlags) + - externalType(internalFieldDescriptor) + - ' ' + - fieldName; - } - - - /** - * Converts an internal method description into an external full method description. - * @param internalClassName the internal name of the class of the method, - * e.g. "mypackage/MyClass". - * @param accessFlags the access flags of the method. - * @param internalMethodName the internal method name, - * e.g. "myMethod" or - * "<init>". - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(II)Z". - * @return the external full method description, - * e.g. "public boolean myMethod(int,int)" or - * "public MyClass(int,int)". - */ - public static String externalFullMethodDescription(String internalClassName, - int accessFlags, - String internalMethodName, - String internalMethodDescriptor) - { - return externalMethodAccessFlags(accessFlags) + - externalMethodReturnTypeAndName(internalClassName, - internalMethodName, - internalMethodDescriptor) + - JavaConstants.METHOD_ARGUMENTS_OPEN + - externalMethodArguments(internalMethodDescriptor) + - JavaConstants.METHOD_ARGUMENTS_CLOSE; - } - - - /** - * Converts internal class access flags into an external access description. - * @param accessFlags the class access flags. - * @return the external class access description, - * e.g. "public final ". - */ - public static String externalClassAccessFlags(int accessFlags) - { - return externalClassAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal class access flags into an external access description. - * @param accessFlags the class access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external class access description, - * e.g. "public final ". - */ - public static String externalClassAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) - { - // Only in InnerClasses attributes. - string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); - } - if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) - { - // Only in InnerClasses attributes. - string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); - } - if ((accessFlags & ClassConstants.ACC_STATIC) != 0) - { - // Only in InnerClasses attributes. - string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_FINAL) != 0) - { - string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); - } - if ((accessFlags & ClassConstants.ACC_ANNOTATION) != 0) - { - string.append(prefix).append(JavaConstants.ACC_ANNOTATION); - } - if ((accessFlags & ClassConstants.ACC_INTERFACE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_INTERFACE).append(' '); - } - else if ((accessFlags & ClassConstants.ACC_ENUM) != 0) - { - string.append(prefix).append(JavaConstants.ACC_ENUM).append(' '); - } - else if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) - { - string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); - } - else if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - else if ((accessFlags & ClassConstants.ACC_MODULE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_MODULE).append(' '); - } - - return string.toString(); - } - - - /** - * Converts internal field access flags into an external access description. - * @param accessFlags the field access flags. - * @return the external field access description, - * e.g. "public volatile ". - */ - public static String externalFieldAccessFlags(int accessFlags) - { - return externalFieldAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal field access flags into an external access description. - * @param accessFlags the field access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external field access description, - * e.g. "public volatile ". - */ - public static String externalFieldAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); - } - if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); - } - if ((accessFlags & ClassConstants.ACC_STATIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_FINAL) != 0) - { - string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); - } - if ((accessFlags & ClassConstants.ACC_VOLATILE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_VOLATILE).append(' '); - } - if ((accessFlags & ClassConstants.ACC_TRANSIENT) != 0) - { - string.append(prefix).append(JavaConstants.ACC_TRANSIENT).append(' '); - } - if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - - return string.toString(); - } - - - /** - * Converts internal method access flags into an external access description. - * @param accessFlags the method access flags. - * @return the external method access description, - * e.g. "public synchronized ". - */ - public static String externalMethodAccessFlags(int accessFlags) - { - return externalMethodAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal method access flags into an external access description. - * @param accessFlags the method access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external method access description, - * e.g. "public synchronized ". - */ - public static String externalMethodAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); - } - if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); - } - if ((accessFlags & ClassConstants.ACC_STATIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_FINAL) != 0) - { - string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); - } - if ((accessFlags & ClassConstants.ACC_SYNCHRONIZED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNCHRONIZED).append(' '); - } - if ((accessFlags & ClassConstants.ACC_BRIDGE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_BRIDGE).append(' '); - } - if ((accessFlags & ClassConstants.ACC_VARARGS) != 0) - { - string.append(prefix).append(JavaConstants.ACC_VARARGS).append(' '); - } - if ((accessFlags & ClassConstants.ACC_NATIVE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_NATIVE).append(' '); - } - if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) - { - string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); - } - if ((accessFlags & ClassConstants.ACC_STRICT) != 0) - { - string.append(prefix).append(JavaConstants.ACC_STRICT).append(' '); - } - if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - - return string.toString(); - } - - - /** - * Converts internal method parameter access flags into an external access - * description. - * @param accessFlags the method parameter access flags. - * @return the external method parameter access description, - * e.g. "final mandated ". - */ - public static String externalParameterAccessFlags(int accessFlags) - { - return externalParameterAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal method parameter access flags into an external access - * description. - * @param accessFlags the method parameter access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external method parameter access description, - * e.g. "final mandated ". - */ - public static String externalParameterAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_FINAL) != 0) - { - string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); - } - if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); - } - - return string.toString(); - } - - - /** - * Converts an internal method descriptor into an external method return type. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(II)Z". - * @return the external method return type, - * e.g. "boolean". - */ - public static String externalMethodReturnType(String internalMethodDescriptor) - { - return externalType(internalMethodReturnType(internalMethodDescriptor)); - } - - - /** - * Converts internal module access flags into an external access - * description. - * @param accessFlags the module access flags. - * @return the external module access description, - * e.g. "open mandated ". - */ - public static String externalModuleAccessFlags(int accessFlags) - { - return externalModuleAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal module access flags into an external access - * description. - * @param accessFlags the module access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external module access description, - * e.g. "final mandated ". - */ - public static String externalModuleAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_OPEN) != 0) - { - string.append(prefix).append(JavaConstants.ACC_OPEN).append(' '); - } - if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); - } - - return string.toString(); - } - - - /** - * Converts internal module requires access flags into an external access - * description. - * @param accessFlags the module requires access flags. - * @return the external module requires access description, - * e.g. "static mandated ". - */ - public static String externalRequiresAccessFlags(int accessFlags) - { - return externalRequiresAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal module requires access flags into an external access - * description. - * @param accessFlags the module requires access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external module requires access description, - * e.g. "static mandated ". - */ - public static String externalRequiresAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_TRANSITIVE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_TRANSITIVE).append(' '); - } - if ((accessFlags & ClassConstants.ACC_STATIC_PHASE) != 0) - { - string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); - } - - return string.toString(); - } - - - /** - * Converts internal module exports access flags into an external access - * description. - * @param accessFlags the module exports access flags. - * @return the external module exports access description, - * e.g. "synthetic mandated ". - */ - public static String externalExportsAccessFlags(int accessFlags) - { - return externalExportsAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal module exports access flags into an external access - * description. - * @param accessFlags the module exports access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external module exports access description, - * e.g. "static mandated ". - */ - public static String externalExportsAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); - } - - return string.toString(); - } - - - /** - * Converts internal module opens access flags into an external access - * description. - * @param accessFlags the module opens access flags. - * @return the external module opens access description, - * e.g. "synthetic mandated ". - */ - public static String externalOpensAccessFlags(int accessFlags) - { - return externalOpensAccessFlags(accessFlags, ""); - } - - - /** - * Converts internal module opens access flags into an external access - * description. - * @param accessFlags the module opens access flags. - * @param prefix a prefix that is added to each access modifier. - * @return the external module opens access description, - * e.g. "static mandated ". - */ - public static String externalOpensAccessFlags(int accessFlags, String prefix) - { - if (accessFlags == 0) - { - return EMPTY_STRING; - } - - StringBuffer string = new StringBuffer(50); - - if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) - { - string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); - } - if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) - { - string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); - } - - return string.toString(); - } - - - /** - * Converts an internal class name, method name, and method descriptor to - * an external method return type and name. - * @param internalClassName the internal name of the class of the method, - * e.g. "mypackage/MyClass". - * @param internalMethodName the internal method name, - * e.g. "myMethod" or - * "<init>". - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(II)Z". - * @return the external method return type and name, - * e.g. "boolean myMethod" or - * "MyClass". - */ - private static String externalMethodReturnTypeAndName(String internalClassName, - String internalMethodName, - String internalMethodDescriptor) - { - return internalMethodName.equals(ClassConstants.METHOD_NAME_INIT) ? - externalShortClassName(externalClassName(internalClassName)) : - (externalMethodReturnType(internalMethodDescriptor) + - ' ' + - internalMethodName); - } - - - /** - * Converts an internal method descriptor into an external method argument - * description. - * @param internalMethodDescriptor the internal method descriptor, - * e.g. "(II)Z". - * @return the external method argument description, - * e.g. "int,int". - */ - public static String externalMethodArguments(String internalMethodDescriptor) - { - StringBuffer externalMethodNameAndArguments = new StringBuffer(); - - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(internalMethodDescriptor); - - while (internalTypeEnumeration.hasMoreTypes()) - { - externalMethodNameAndArguments.append(externalType(internalTypeEnumeration.nextType())); - if (internalTypeEnumeration.hasMoreTypes()) - { - externalMethodNameAndArguments.append(JavaConstants.METHOD_ARGUMENTS_SEPARATOR); - } - } - - return externalMethodNameAndArguments.toString(); - } - - - /** - * Returns the internal package name of the given internal class name. - * @param internalClassName the internal class name, - * e.g. "java/lang/Object". - * @return the internal package name, - * e.g. "java/lang". - */ - public static String internalPackageName(String internalClassName) - { - String internalPackagePrefix = internalPackagePrefix(internalClassName); - int length = internalPackagePrefix.length(); - return length > 0 ? - internalPackagePrefix.substring(0, length - 1) : - ""; - } - - - /** - * Returns the internal package prefix of the given internal class name. - * @param internalClassName the internal class name, - * e.g. "java/lang/Object". - * @return the internal package prefix, - * e.g. "java/lang/". - */ - public static String internalPackagePrefix(String internalClassName) - { - return internalClassName.substring(0, internalClassName.lastIndexOf(ClassConstants.PACKAGE_SEPARATOR, - internalClassName.length() - 2) + 1); - } - - - /** - * Returns the external package name of the given external class name. - * @param externalClassName the external class name, - * e.g. "java.lang.Object". - * @return the external package name, - * e.g. "java.lang". - */ - public static String externalPackageName(String externalClassName) - { - String externalPackagePrefix = externalPackagePrefix(externalClassName); - int length = externalPackagePrefix.length(); - return length > 0 ? - externalPackagePrefix.substring(0, length - 1) : - ""; - } - - - /** - * Returns the external package prefix of the given external class name. - * @param externalClassName the external class name, - * e.g. "java.lang.Object". - * @return the external package prefix, - * e.g. "java.lang.". - */ - public static String externalPackagePrefix(String externalClassName) - { - return externalClassName.substring(0, externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR, - externalClassName.length() - 2) + 1); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DescriptorClassEnumeration.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DescriptorClassEnumeration.java deleted file mode 100644 index 3a820cb5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DescriptorClassEnumeration.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; - -import java.util.Stack; - -/** - * A DescriptorClassEnumeration provides an enumeration of all - * classes mentioned in a given descriptor or signature. - * - * @author Eric Lafortune - */ -public class DescriptorClassEnumeration -{ - private String descriptor; - - private int index; - private int nestingLevel; - private boolean isInnerClassName; - private String accumulatedClassName; - private Stack accumulatedClassNames; - - - /** - * Creates a new DescriptorClassEnumeration for the given descriptor. - */ - public DescriptorClassEnumeration(String descriptor) - { - this.descriptor = descriptor; - } - - - /** - * Returns the number of classes contained in the descriptor. This - * is the number of class names that the enumeration will return. - */ - public int classCount() - { - int count = 0; - - reset(); - - nextFluff(); - while (hasMoreClassNames()) - { - count++; - - nextClassName(); - nextFluff(); - } - - reset(); - - return count; - } - - - /** - * Resets the enumeration. - */ - private void reset() - { - index = 0; - nestingLevel = 0; - isInnerClassName = false; - accumulatedClassName = null; - accumulatedClassNames = null; - } - - - /** - * Returns whether the enumeration can provide more class names from the - * descriptor. - */ - public boolean hasMoreClassNames() - { - return index < descriptor.length(); - } - - - /** - * Returns the next fluff (surrounding class names) from the descriptor. - */ - public String nextFluff() - { - int fluffStartIndex = index; - - // Find the first token marking the start of a class name 'L' or '.'. - loop: while (index < descriptor.length()) - { - switch (descriptor.charAt(index++)) - { - case ClassConstants.TYPE_GENERIC_START: - { - nestingLevel++; - - // Make sure we have a stack. - if (accumulatedClassNames == null) - { - accumulatedClassNames = new Stack(); - } - - // Remember the accumulated class name. - accumulatedClassNames.push(accumulatedClassName); - - break; - } - case ClassConstants.TYPE_GENERIC_END: - { - nestingLevel--; - - // Return to the accumulated class name outside the - // generic block. - accumulatedClassName = (String)accumulatedClassNames.pop(); - - continue loop; - } - case ClassConstants.TYPE_GENERIC_BOUND: - case ClassConstants.TYPE_ARRAY: - { - continue loop; - } - case ClassConstants.TYPE_CLASS_START: - { - // We've found the start of an ordinary class name. - nestingLevel += 2; - isInnerClassName = false; - break loop; - } - case ClassConstants.TYPE_CLASS_END: - { - nestingLevel -= 2; - break; - } - case JavaConstants.INNER_CLASS_SEPARATOR: - { - // We've found the start of an inner class name in a signature. - isInnerClassName = true; - break loop; - } - case ClassConstants.TYPE_GENERIC_VARIABLE_START: - { - // We've found the start of a type identifier. Skip to the end. - while (descriptor.charAt(index++) != ClassConstants.TYPE_CLASS_END); - break; - } - } - - if (nestingLevel == 1 && - descriptor.charAt(index) != ClassConstants.TYPE_GENERIC_END) - { - // We're at the start of a type parameter. Skip to the start - // of the bounds. - while (descriptor.charAt(index++) != ClassConstants.TYPE_GENERIC_BOUND); - } - } - - return descriptor.substring(fluffStartIndex, index); - } - - - /** - * Returns the next class name from the descriptor. - */ - public String nextClassName() - { - int classNameStartIndex = index; - - // Find the first token marking the end of a class name '<' or ';'. - loop: while (true) - { - switch (descriptor.charAt(index)) - { - case ClassConstants.TYPE_GENERIC_START: - case ClassConstants.TYPE_CLASS_END: - case JavaConstants.INNER_CLASS_SEPARATOR: - { - break loop; - } - } - - index++; - } - - String className = descriptor.substring(classNameStartIndex, index); - - // Recompose the inner class name if necessary. - accumulatedClassName = isInnerClassName ? - accumulatedClassName + ClassConstants.INNER_CLASS_SEPARATOR + className : - className; - - return accumulatedClassName; - } - - - /** - * Returns whether the most recently returned class name was a recomposed - * inner class name from a signature. - */ - public boolean isInnerClassName() - { - return isInnerClassName; - } - - - /** - * A main method for testing the class name enumeration. - */ - public static void main(String[] args) - { - try - { - for (int index = 0; index < args.length; index++) - { - String descriptor = args[index]; - - System.out.println("Descriptor ["+descriptor+"]"); - DescriptorClassEnumeration enumeration = new DescriptorClassEnumeration(descriptor); - System.out.println(" Fluff: ["+enumeration.nextFluff()+"]"); - while (enumeration.hasMoreClassNames()) - { - System.out.println(" Name: ["+enumeration.nextClassName()+"]"); - System.out.println(" Fluff: ["+enumeration.nextFluff()+"]"); - } - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DynamicClassReferenceInitializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DynamicClassReferenceInitializer.java deleted file mode 100644 index cb195432..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DynamicClassReferenceInitializer.java +++ /dev/null @@ -1,486 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.util.StringMatcher; - -/** - * This InstructionVisitor initializes any constant Class.forName or - * .class references of all classes it visits. More specifically, - * it fills out the references of string constant pool entries that refer to a - * class in the program class pool or in the library class pool. - *

- * It optionally prints notes if on usage of - * (SomeClass)Class.forName(variable).newInstance(). - *

- * The class hierarchy must be initialized before using this visitor. - * - * @see ClassSuperHierarchyInitializer - * - * @author Eric Lafortune - */ -public class DynamicClassReferenceInitializer -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - AttributeVisitor -{ - public static final int X = InstructionSequenceMatcher.X; - public static final int Y = InstructionSequenceMatcher.Y; - public static final int Z = InstructionSequenceMatcher.Z; - - public static final int A = InstructionSequenceMatcher.A; - public static final int B = InstructionSequenceMatcher.B; - public static final int C = InstructionSequenceMatcher.C; - public static final int D = InstructionSequenceMatcher.D; - - - private final Constant[] CLASS_FOR_NAME_CONSTANTS = new Constant[] - { - // 0 - new MethodrefConstant(1, 2, null, null), - new ClassConstant(3, null), - new NameAndTypeConstant(4, 5), - new Utf8Constant(ClassConstants.NAME_JAVA_LANG_CLASS), - new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_FOR_NAME), - new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_FOR_NAME), - - // 6 - new MethodrefConstant(1, 7, null, null), - new NameAndTypeConstant(8, 9), - new Utf8Constant(ClassConstants.METHOD_NAME_NEW_INSTANCE), - new Utf8Constant(ClassConstants.METHOD_TYPE_NEW_INSTANCE), - - // 10 - new MethodrefConstant(1, 11, null, null), - new NameAndTypeConstant(12, 13), - new Utf8Constant(ClassConstants.METHOD_NAME_CLASS_GET_COMPONENT_TYPE), - new Utf8Constant(ClassConstants.METHOD_TYPE_CLASS_GET_COMPONENT_TYPE), - }; - - // Class.forName("SomeClass"). - private final Instruction[] CONSTANT_CLASS_FOR_NAME_INSTRUCTIONS = new Instruction[] - { - new ConstantInstruction(InstructionConstants.OP_LDC, X), - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, 0), - }; - - // (SomeClass)Class.forName(someName).newInstance(). - private final Instruction[] CLASS_FOR_NAME_CAST_INSTRUCTIONS = new Instruction[] - { - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, 0), - new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, 6), - new ConstantInstruction(InstructionConstants.OP_CHECKCAST, X), - }; - - -// private Constant[] DOT_CLASS_JAVAC_CONSTANTS = new Constant[] -// { -// new MethodrefConstant(A, 1, null, null), -// new NameAndTypeConstant(2, 3), -// new Utf8Constant(ClassConstants.METHOD_NAME_DOT_CLASS_JAVAC), -// new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JAVAC), -// }; - - private final Constant[] DOT_CLASS_JAVAC_CONSTANTS = new Constant[] - { - new MethodrefConstant(A, 1, null, null), - new NameAndTypeConstant(B, 2), - new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JAVAC), - }; - - // SomeClass.class = class$("SomeClass") (javac). - private final Instruction[] DOT_CLASS_JAVAC_INSTRUCTIONS = new Instruction[] - { - new ConstantInstruction(InstructionConstants.OP_LDC, X), - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, 0), - }; - - -// private Constant[] DOT_CLASS_JIKES_CONSTANTS = new Constant[] -// { -// new MethodrefConstant(A, 1, null, null), -// new NameAndTypeConstant(2, 3), -// new Utf8Constant(ClassConstants.METHOD_NAME_DOT_CLASS_JIKES), -// new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JIKES), -// }; - - private final Constant[] DOT_CLASS_JIKES_CONSTANTS = new Constant[] - { - new MethodrefConstant(A, 1, null, null), - new NameAndTypeConstant(B, 2), - new Utf8Constant(ClassConstants.METHOD_TYPE_DOT_CLASS_JIKES), - }; - - // SomeClass.class = class("SomeClass", false) (jikes). - private final Instruction[] DOT_CLASS_JIKES_INSTRUCTIONS = new Instruction[] - { - new ConstantInstruction(InstructionConstants.OP_LDC, X), - new SimpleInstruction(InstructionConstants.OP_ICONST_0), - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, 0), - }; - - // return Class.forName(v0). - private final Instruction[] DOT_CLASS_JAVAC_IMPLEMENTATION_INSTRUCTIONS = new Instruction[] - { - new VariableInstruction(InstructionConstants.OP_ALOAD_0), - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, 0), - new SimpleInstruction(InstructionConstants.OP_ARETURN), - }; - - // return Class.forName(v0), if (!v1) .getComponentType(). - private final Instruction[] DOT_CLASS_JIKES_IMPLEMENTATION_INSTRUCTIONS = new Instruction[] - { - new VariableInstruction(InstructionConstants.OP_ALOAD_0), - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, 0), - new VariableInstruction(InstructionConstants.OP_ALOAD_1), - new BranchInstruction(InstructionConstants.OP_IFNE, +6), - new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, 10), - new SimpleInstruction(InstructionConstants.OP_ARETURN), - }; - - // return Class.forName(v0).getComponentType(). - private final Instruction[] DOT_CLASS_JIKES_IMPLEMENTATION_INSTRUCTIONS2 = new Instruction[] - { - new VariableInstruction(InstructionConstants.OP_ALOAD_0), - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, 0), - new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, 10), - new SimpleInstruction(InstructionConstants.OP_ARETURN), - }; - - - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final WarningPrinter missingNotePrinter; - private final WarningPrinter dependencyWarningPrinter; - private final WarningPrinter notePrinter; - private final StringMatcher noteExceptionMatcher; - - - private final InstructionSequenceMatcher constantClassForNameMatcher = - new InstructionSequenceMatcher(CLASS_FOR_NAME_CONSTANTS, - CONSTANT_CLASS_FOR_NAME_INSTRUCTIONS); - - private final InstructionSequenceMatcher classForNameCastMatcher = - new InstructionSequenceMatcher(CLASS_FOR_NAME_CONSTANTS, - CLASS_FOR_NAME_CAST_INSTRUCTIONS); - - private final InstructionSequenceMatcher dotClassJavacMatcher = - new InstructionSequenceMatcher(DOT_CLASS_JAVAC_CONSTANTS, - DOT_CLASS_JAVAC_INSTRUCTIONS); - - private final InstructionSequenceMatcher dotClassJikesMatcher = - new InstructionSequenceMatcher(DOT_CLASS_JIKES_CONSTANTS, - DOT_CLASS_JIKES_INSTRUCTIONS); - - private final InstructionSequenceMatcher dotClassJavacImplementationMatcher = - new InstructionSequenceMatcher(CLASS_FOR_NAME_CONSTANTS, - DOT_CLASS_JAVAC_IMPLEMENTATION_INSTRUCTIONS); - - private final InstructionSequenceMatcher dotClassJikesImplementationMatcher = - new InstructionSequenceMatcher(CLASS_FOR_NAME_CONSTANTS, - DOT_CLASS_JIKES_IMPLEMENTATION_INSTRUCTIONS); - - private final InstructionSequenceMatcher dotClassJikesImplementationMatcher2 = - new InstructionSequenceMatcher(CLASS_FOR_NAME_CONSTANTS, - DOT_CLASS_JIKES_IMPLEMENTATION_INSTRUCTIONS2); - - - // A field acting as a return variable for the visitors. - private boolean isClassForNameInvocation; - - - /** - * Creates a new DynamicClassReferenceInitializer that optionally prints - * warnings and notes, with optional class specifications for which never - * to print notes. - */ - public DynamicClassReferenceInitializer(ClassPool programClassPool, - ClassPool libraryClassPool, - WarningPrinter missingNotePrinter, - WarningPrinter dependencyWarningPrinter, - WarningPrinter notePrinter, - StringMatcher noteExceptionMatcher) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.missingNotePrinter = missingNotePrinter; - this.dependencyWarningPrinter = dependencyWarningPrinter; - this.notePrinter = notePrinter; - this.noteExceptionMatcher = noteExceptionMatcher; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Try to match the (SomeClass)Class.forName(someName).newInstance() - // construct. Apply this matcher first, so the next matcher can still - // reset it after the first instruction. - instruction.accept(clazz, method, codeAttribute, offset, - classForNameCastMatcher); - - // Did we find a match? - if (classForNameCastMatcher.isMatching()) - { - // Print out a note about the construct. - clazz.constantPoolEntryAccept(classForNameCastMatcher.matchedConstantIndex(X), this); - } - - // Try to match the Class.forName("SomeClass") construct. - instruction.accept(clazz, method, codeAttribute, offset, - constantClassForNameMatcher); - - // Did we find a match? - if (constantClassForNameMatcher.isMatching()) - { - // Fill out the matched string constant. - clazz.constantPoolEntryAccept(constantClassForNameMatcher.matchedConstantIndex(X), this); - - // Don't look for the dynamic construct. - classForNameCastMatcher.reset(); - } - - // Try to match the javac .class construct. - instruction.accept(clazz, method, codeAttribute, offset, - dotClassJavacMatcher); - - // Did we find a match? - if (dotClassJavacMatcher.isMatching() && - isDotClassMethodref(clazz, dotClassJavacMatcher.matchedConstantIndex(0))) - { - // Fill out the matched string constant. - clazz.constantPoolEntryAccept(dotClassJavacMatcher.matchedConstantIndex(X), this); - } - - // Try to match the jikes .class construct. - instruction.accept(clazz, method, codeAttribute, offset, - dotClassJikesMatcher); - - // Did we find a match? - if (dotClassJikesMatcher.isMatching() && - isDotClassMethodref(clazz, dotClassJikesMatcher.matchedConstantIndex(0))) - { - // Fill out the matched string constant. - clazz.constantPoolEntryAccept(dotClassJikesMatcher.matchedConstantIndex(X), this); - } - } - - - // Implementations for ConstantVisitor. - - /** - * Fills out the link to the referenced class. - */ - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Save a reference to the corresponding class. - String externalClassName = stringConstant.getString(clazz); - String internalClassName = ClassUtil.internalClassName( - ClassUtil.externalBaseType(externalClassName)); - - stringConstant.referencedClass = findClass(clazz.getName(), internalClassName); - } - - - /** - * Prints out a note about the class cast to this class, if applicable. - */ - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Print out a note about the class cast. - if (noteExceptionMatcher == null || - !noteExceptionMatcher.matches(classConstant.getName(clazz))) - { - notePrinter.print(clazz.getName(), - classConstant.getName(clazz), - "Note: " + - ClassUtil.externalClassName(clazz.getName()) + - " calls '(" + - ClassUtil.externalClassName(classConstant.getName(clazz)) + - ")Class.forName(variable).newInstance()'"); - } - } - - - /** - * Checks whether the referenced method is a .class method. - */ - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - String methodType = methodrefConstant.getType(clazz); - - // Do the method's class and type match? - if (methodType.equals(ClassConstants.METHOD_TYPE_DOT_CLASS_JAVAC) || - methodType.equals(ClassConstants.METHOD_TYPE_DOT_CLASS_JIKES)) - { - String methodName = methodrefConstant.getName(clazz); - - // Does the method's name match one of the special names? - isClassForNameInvocation = - methodName.equals(ClassConstants.METHOD_NAME_DOT_CLASS_JAVAC) || - methodName.equals(ClassConstants.METHOD_NAME_DOT_CLASS_JIKES); - - if (isClassForNameInvocation) - { - return; - } - - String className = methodrefConstant.getClassName(clazz); - - // Note that we look for the class by name, since the referenced - // class has not been initialized yet. - Clazz referencedClass = programClassPool.getClass(className); - if (referencedClass != null) - { - // Check if the code of the referenced method is .class code. - // Note that we look for the method by name and type, since the - // referenced method has not been initialized yet. - referencedClass.methodAccept(methodName, - methodType, - new AllAttributeVisitor(this)); - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Check whether this is class$(String), as generated by javac, or - // class(String, boolean), as generated by jikes, or an optimized - // version. - isClassForNameInvocation = - isDotClassMethodCode(clazz, method, codeAttribute, - dotClassJavacImplementationMatcher, 5) || - isDotClassMethodCode(clazz, method, codeAttribute, - dotClassJikesImplementationMatcher, 12) || - isDotClassMethodCode(clazz, method, codeAttribute, - dotClassJikesImplementationMatcher2, 8); - } - - - // Small utility methods. - - /** - * Returns whether the given method reference corresponds to a .class - * method, as generated by javac or by jikes. - */ - private boolean isDotClassMethodref(Clazz clazz, int methodrefConstantIndex) - { - isClassForNameInvocation = false; - - // Check if the code of the referenced method is .class code. - clazz.constantPoolEntryAccept(methodrefConstantIndex, this); - - return isClassForNameInvocation; - } - - - /** - * Returns whether the first whether the first instructions of the - * given code attribute match with the given instruction matcher. - */ - private boolean isDotClassMethodCode(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - InstructionSequenceMatcher codeMatcher, - int codeLength) - { - // Check the minimum code length. - if (codeAttribute.u4codeLength < codeLength) - { - return false; - } - - // Check the actual instructions. - codeMatcher.reset(); - codeAttribute.instructionsAccept(clazz, method, 0, codeLength, codeMatcher); - return codeMatcher.isMatching(); - } - - - /** - * Returns the class with the given name, either for the program class pool - * or from the library class pool, or null if it can't be found. - */ - private Clazz findClass(String referencingClassName, String name) - { - // Is it an array type? - if (ClassUtil.isInternalArrayType(name)) - { - // Ignore any primitive array types. - if (!ClassUtil.isInternalClassType(name)) - { - return null; - } - - // Strip the array part. - name = ClassUtil.internalClassNameFromClassType(name); - } - - // First look for the class in the program class pool. - Clazz clazz = programClassPool.getClass(name); - - // Otherwise look for the class in the library class pool. - if (clazz == null) - { - clazz = libraryClassPool.getClass(name); - - if (clazz == null && - missingNotePrinter != null) - { - // We didn't find the superclass or interface. Print a note. - missingNotePrinter.print(referencingClassName, - name, - "Note: " + - ClassUtil.externalClassName(referencingClassName) + - ": can't find dynamically referenced class " + - ClassUtil.externalClassName(name)); - } - } - else if (dependencyWarningPrinter != null) - { - // The superclass or interface was found in the program class pool. - // Print a warning. - dependencyWarningPrinter.print(referencingClassName, - name, - "Warning: library class " + - ClassUtil.externalClassName(referencingClassName) + - " depends dynamically on program class " + - ClassUtil.externalClassName(name)); - } - - return clazz; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DynamicMemberReferenceInitializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DynamicMemberReferenceInitializer.java deleted file mode 100644 index 662037d2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/DynamicMemberReferenceInitializer.java +++ /dev/null @@ -1,971 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.visitor.*; -import proguard.util.StringMatcher; - -/** - * This AttributeVisitor initializes any constant class member references of all - * code that it visits. It currently handles invocations of - * Class#get[Declared]{Field,Constructor,Method} and - * Atomic{Integer,Long,Reference}FieldUpdater.newUpdater - * with constant string arguments. It lets the corresponding string constants - * refer to their class members in the program class pool or in the library - * class pool. It may create new string constants and update the code, in order - * to avoid clashes between identically named class members. - *

- * The class hierarchy and references must be initialized before using this - * visitor. - * - * @see ClassSuperHierarchyInitializer - * @see ClassReferenceInitializer - * - * @author Eric Lafortune - */ -public class DynamicMemberReferenceInitializer -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - MemberVisitor -{ - /* - private static boolean DEBUG = true; - /*/ - private static final boolean DEBUG = false; - //*/ - - private static final int CLASS_INDEX = InstructionSequenceMatcher.A; - private static final int MEMBER_NAME_INDEX = InstructionSequenceMatcher.B; - private static final int MEMBER_TYPE_INDEX = InstructionSequenceMatcher.C; - - - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - private final WarningPrinter notePrinter; - private final StringMatcher noteFieldExceptionMatcher; - private final StringMatcher noteMethodExceptionMatcher; - - - // Retrieving fields or methods from known, constant classes. - private final InstructionSequenceMatcher knownItegerUpdaterMatcher; - private final InstructionSequenceMatcher knownLongUpdaterMatcher; - private final InstructionSequenceMatcher knownReferenceUpdaterMatcher; - - // Retrieving fields or methods from unknown classes. - private final InstructionSequenceMatcher unknownIntegerUpdaterMatcher; - private final InstructionSequenceMatcher unknownLongUpdaterMatcher; - private final InstructionSequenceMatcher unknownReferenceUpdaterMatcher; - - private final MyDynamicMemberFinder dynamicMemberFinder = new MyDynamicMemberFinder(); - - private final MemberFinder memberFinder = new MemberFinder(true); - private final MemberFinder declaredMemberFinder = new MemberFinder(false); - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - - // Fields acting as parameters for the visitors. - private Clazz referencedClass; - - - /** - * Creates a new DynamicMemberReferenceInitializer. - */ - public DynamicMemberReferenceInitializer(ClassPool programClassPool, - ClassPool libraryClassPool, - WarningPrinter notePrinter, - StringMatcher noteFieldExceptionMatcher, - StringMatcher noteMethodExceptionMatcher) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - this.notePrinter = notePrinter; - this.noteFieldExceptionMatcher = noteFieldExceptionMatcher; - this.noteMethodExceptionMatcher = noteMethodExceptionMatcher; - - // Create the instruction sequences and matchers. - InstructionSequenceBuilder builder = - new InstructionSequenceBuilder(programClassPool, libraryClassPool); - - // AtomicIntegerFieldUpdater.newUpdater(A.class, "someField"). - Instruction[] knownItegerUpdaterInstructions = builder - .ldc_(CLASS_INDEX) - .ldc_(MEMBER_NAME_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_INTEGER_FIELD_UPDATER, - ClassConstants.METHOD_NAME_NEW_UPDATER, - ClassConstants.METHOD_TYPE_NEW_INTEGER_UPDATER) - .instructions(); - - // AtomicLongFieldUpdater.newUpdater(A.class, "someField"). - Instruction[] knownLongUpdaterInstructions = builder - .ldc_(CLASS_INDEX) - .ldc_(MEMBER_NAME_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_LONG_FIELD_UPDATER, - ClassConstants.METHOD_NAME_NEW_UPDATER, - ClassConstants.METHOD_TYPE_NEW_LONG_UPDATER) - .instructions(); - - // AtomicReferenceFieldUpdater.newUpdater(A.class, B.class, "someField"). - Instruction[] knownReferenceUpdaterInstructions = builder - .ldc_(CLASS_INDEX) - .ldc_(MEMBER_TYPE_INDEX) - .ldc_(MEMBER_NAME_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_REFERENCE_FIELD_UPDATER, - ClassConstants.METHOD_NAME_NEW_UPDATER, - ClassConstants.METHOD_TYPE_NEW_REFERENCE_UPDATER) - .instructions(); - - // AtomicIntegerFieldUpdater.newUpdater(..., "someField"). - Instruction[] unknownIntegerUpdaterInstructions = builder - .ldc_(MEMBER_NAME_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_INTEGER_FIELD_UPDATER, - ClassConstants.METHOD_NAME_NEW_UPDATER, - ClassConstants.METHOD_TYPE_NEW_INTEGER_UPDATER) - .instructions(); - - // AtomicLongFieldUpdater.newUpdater(..., "someField"). - Instruction[] unknownLongUpdaterInstructions = builder - .ldc_(MEMBER_NAME_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_LONG_FIELD_UPDATER, - ClassConstants.METHOD_NAME_NEW_UPDATER, - ClassConstants.METHOD_TYPE_NEW_LONG_UPDATER) - .instructions(); - - // AtomicReferenceFieldUpdater.newUpdater(..., "someField"). - final Instruction[] unknownReferenceUpdaterInstructions = builder - .ldc_(MEMBER_NAME_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_REFERENCE_FIELD_UPDATER, - ClassConstants.METHOD_NAME_NEW_UPDATER, - ClassConstants.METHOD_TYPE_NEW_REFERENCE_UPDATER) - .instructions(); - - Constant[] constants = builder.constants(); - - knownItegerUpdaterMatcher = new InstructionSequenceMatcher(constants, knownItegerUpdaterInstructions); - knownLongUpdaterMatcher = new InstructionSequenceMatcher(constants, knownLongUpdaterInstructions); - knownReferenceUpdaterMatcher = new InstructionSequenceMatcher(constants, knownReferenceUpdaterInstructions); - unknownIntegerUpdaterMatcher = new InstructionSequenceMatcher(constants, unknownIntegerUpdaterInstructions); - unknownLongUpdaterMatcher = new InstructionSequenceMatcher(constants, unknownLongUpdaterInstructions); - unknownReferenceUpdaterMatcher = new InstructionSequenceMatcher(constants, unknownReferenceUpdaterInstructions); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("DynamicMemberReferenceInitializer: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - // Set up the code attribute editor. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Find the dynamic class member references. - codeAttribute.instructionsAccept(clazz, method, this); - - // Apply any changes to the code. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Try to match get[Declared]{Field,Constructor,Method} constructs. - instruction.accept(clazz, method, codeAttribute, offset, dynamicMemberFinder); - - // Try to match the AtomicIntegerFieldUpdater.newUpdater( - // SomeClass.class, "someField") construct. - matchGetMember(clazz, method, codeAttribute, offset, instruction, - knownItegerUpdaterMatcher, - unknownIntegerUpdaterMatcher, true, false, false, - "" + ClassConstants.TYPE_INT); - - // Try to match the AtomicLongFieldUpdater.newUpdater( - // SomeClass.class, "someField") construct. - matchGetMember(clazz, method, codeAttribute, offset, instruction, - knownLongUpdaterMatcher, - unknownLongUpdaterMatcher, true, false, false, - "" + ClassConstants.TYPE_LONG); - - // Try to match the AtomicReferenceFieldUpdater.newUpdater( - // SomeClass.class, SomeClass.class, "someField") construct. - matchGetMember(clazz, method, codeAttribute, offset, instruction, - knownReferenceUpdaterMatcher, - unknownReferenceUpdaterMatcher, true, false, false, - null); - } - - - /** - * Tries to match the next instruction and fills out the string constant - * or prints out a note accordingly. - */ - private void matchGetMember(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - Instruction instruction, - InstructionSequenceMatcher constantSequenceMatcher, - InstructionSequenceMatcher variableSequenceMatcher, - boolean isField, - boolean isConstructor, - boolean isDeclared, - String memberDescriptor) - { - if (constantSequenceMatcher != null) - { - // Try to match the next instruction in the constant sequence. - instruction.accept(clazz, method, codeAttribute, offset, - constantSequenceMatcher); - - // Did we find a match to fill out the string constant? - if (constantSequenceMatcher.isMatching()) - { - // Retrieve the offset of the instruction that loads the member - // name. It's currently always the last but one instruction. - int memberNameInstructionOffset = - constantSequenceMatcher.matchedInstructionOffset( - constantSequenceMatcher.instructionCount() - 2); - - // Get the member's class. - int classIndex = constantSequenceMatcher.matchedConstantIndex(CLASS_INDEX); - clazz.constantPoolEntryAccept(classIndex, this); - - if (referencedClass != null) - { - // Get the field's type, if applicable. - int typeClassIndex = constantSequenceMatcher.matchedConstantIndex(MEMBER_TYPE_INDEX); - if (typeClassIndex > 0) - { - memberDescriptor = - ClassUtil.internalTypeFromClassName(clazz.getClassName(typeClassIndex)); - } - - // Get the member's name. - int memberNameIndex = constantSequenceMatcher.matchedConstantIndex(MEMBER_NAME_INDEX); - String memberName = clazz.getStringString(memberNameIndex); - - // Create a new string constant and update the instruction. - initializeDynamicMemberReference(clazz, - memberNameInstructionOffset, - referencedClass, - memberName, - memberDescriptor, - isField, - isConstructor, - isDeclared); - } - - // Don't look for the dynamic construct. - variableSequenceMatcher.reset(); - } - } - - // Try to match the next instruction in the variable sequence. - instruction.accept(clazz, method, codeAttribute, offset, - variableSequenceMatcher); - - // Did we find a match to print out a note? - if (variableSequenceMatcher.isMatching()) - { - int memberNameIndex = variableSequenceMatcher.matchedConstantIndex(MEMBER_NAME_INDEX); - String memberName = clazz.getStringString(memberNameIndex); - - // Print out a note about the dynamic invocation. - printDynamicMemberAccessNote(clazz, - memberName, - memberDescriptor, - isField, - isConstructor, - isDeclared); - } - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Remember the referenced class. - referencedClass = ClassUtil.isInternalArrayType(classConstant.getName(clazz)) ? - null : - classConstant.referencedClass; - } - - - // Small utility methods. - - /** - * Creates a new string constant for the specified referenced class member, - * and updates the instruction that loads it. - */ - private void initializeDynamicMemberReference(Clazz clazz, - int memberNameInstructionOffset, - Clazz referencedClass, - String memberName, - String memberDescriptor, - boolean isField, - boolean isConstructor, - boolean isDeclared) - { - // See if we can find the referenced class member locally, or - // somewhere in the hierarchy. - MemberFinder referencedMemberFinder = isDeclared ? - declaredMemberFinder : - memberFinder; - - Member referencedMember = - referencedMemberFinder.findMember(referencedClass, - memberName, - memberDescriptor, - isField); - - if (DEBUG) - { - System.out.println("DynamicMemberReferenceInitializer: ["+clazz.getName()+"] matched string ["+memberName+"]: in ["+referencedClass+"] -> ["+referencedMember+"]"); - } - - if (referencedMember != null) - { - if (!isDeclared) - { - referencedClass = referencedMemberFinder.correspondingClass(); - } - - // Update the string constant. - //stringConstant.referencedMember = referencedMember; - //stringConstant.referencedClass = referencedClass; - - // Create a new string constant with the found references. - int stringConstantIndex = - new ConstantPoolEditor((ProgramClass)clazz).addStringConstant(memberName, - referencedClass, - referencedMember); - - // Update the instruction. - codeAttributeEditor.replaceInstruction(memberNameInstructionOffset, - new ConstantInstruction(InstructionConstants.OP_LDC, - stringConstantIndex)); - } - } - - - /** - * Prints out a note on the matched dynamic invocation of a constructor. - */ - private void printDynamicConstructorAccessNote(Clazz clazz, - Clazz referencedClass, - String memberDescriptor, - boolean isDeclared) - { - // Print out a note about the dynamic invocation. - if (notePrinter != null && - notePrinter.accepts(clazz.getName())) - { - // Is the class member name in the list of exceptions? - if (noteMethodExceptionMatcher == null || - !noteMethodExceptionMatcher.matches(ClassConstants.METHOD_NAME_INIT)) - { - // Print out the actual note. - notePrinter.print(clazz.getName(), - "Note: " + - ClassUtil.externalClassName(clazz.getName()) + - " retrieves a " + - (isDeclared ? "declared " : "") + - "constructor '" + - ClassConstants.METHOD_NAME_INIT + - JavaConstants.METHOD_ARGUMENTS_OPEN + - ClassUtil.externalMethodArguments(memberDescriptor) + - JavaConstants.METHOD_ARGUMENTS_CLOSE + - "' dynamically"); - - // Print out notes about potential candidates. - ClassVisitor classVisitor = - new AllMethodVisitor( - new MemberNameFilter(ClassConstants.METHOD_NAME_INIT, - new MemberDescriptorFilter(memberDescriptor, this))); - - if (referencedClass != null) - { - referencedClass.hierarchyAccept(true, !isDeclared, false, false, - classVisitor); - } - else - { - programClassPool.classesAcceptAlphabetically(classVisitor); - libraryClassPool.classesAcceptAlphabetically(classVisitor); - } - } - } - } - - - /** - * Prints out a note on the matched dynamic access to a class member. - */ - private void printDynamicMemberAccessNote(Clazz clazz, - String memberName, - String memberDescriptor, - boolean isField, - boolean isConstructor, - boolean isDeclared) - { - // Print out a note about the dynamic invocation. - if (notePrinter != null && - notePrinter.accepts(clazz.getName())) - { - // Is the class member name in the list of exceptions? - StringMatcher noteExceptionMatcher = isField ? - noteFieldExceptionMatcher : - noteMethodExceptionMatcher; - - if (noteExceptionMatcher == null || - !noteExceptionMatcher.matches(memberName)) - { - // Compose the external member name and partial descriptor. - String externalMemberDescription = memberName; - - if (!isField) - { - externalMemberDescription += - JavaConstants.METHOD_ARGUMENTS_OPEN + - ClassUtil.externalMethodArguments(memberDescriptor) + - JavaConstants.METHOD_ARGUMENTS_CLOSE; - } - - // Print out the actual note. - notePrinter.print(clazz.getName(), - "Note: " + - ClassUtil.externalClassName(clazz.getName()) + - " accesses a " + - (isDeclared ? "declared " : "") + - (isField ? "field" : - isConstructor ? "constructor" : - "method") + - " '" + - externalMemberDescription + - "' dynamically"); - - // Print out notes about potential candidates. - ClassVisitor classVisitor; - - if (isField) - { - classVisitor = memberDescriptor == null ? - new AllFieldVisitor( - new MemberNameFilter(memberName, this)) : - new AllFieldVisitor( - new MemberNameFilter(memberName, - new MemberDescriptorFilter(memberDescriptor, this))); - } - else - { - classVisitor = - new AllMethodVisitor( - new MemberNameFilter(memberName, - new MemberDescriptorFilter(memberDescriptor, this))); - } - - programClassPool.classesAcceptAlphabetically(classVisitor); - libraryClassPool.classesAcceptAlphabetically(classVisitor); - } - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (notePrinter.accepts(programClass.getName())) - { - System.out.println(" Maybe this is program field '" + - ClassUtil.externalFullClassDescription(0, programClass.getName()) + - " { " + - ClassUtil.externalFullFieldDescription(0, programField.getName(programClass), programField.getDescriptor(programClass)) + - "; }'"); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (notePrinter.accepts(programClass.getName())) - { - System.out.println(" Maybe this is program method '" + - ClassUtil.externalFullClassDescription(0, programClass.getName()) + - " { " + - ClassUtil.externalFullMethodDescription(programClass.getName(), 0, programMethod.getName(programClass), programMethod.getDescriptor(programClass)) + - "; }'"); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (notePrinter.accepts(libraryClass.getName())) - { - System.out.println(" Maybe this is library field '" + - ClassUtil.externalFullClassDescription(0, libraryClass.getName()) + - " { " + - ClassUtil.externalFullFieldDescription(0, libraryField.getName(libraryClass), libraryField.getDescriptor(libraryClass)) + - "; }'"); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (notePrinter.accepts(libraryClass.getName())) - { - System.out.println(" Maybe this is library method '" + - ClassUtil.externalFullClassDescription(0, libraryClass.getName()) + - " { " + - ClassUtil.externalFullMethodDescription(libraryClass.getName(), 0, libraryMethod.getName(libraryClass), libraryMethod.getDescriptor(libraryClass)) + - "; }'"); - } - } - - - /** - * This InstructionVisitor finds get[Declared]{Field,Constructor,Method} - * constructs with constant arguments. It then makes sure the class member - * name strings point to the class members, or it prints out notes about the - * possible alternatives. - */ - private class MyDynamicMemberFinder - extends SimplifiedVisitor - implements InstructionVisitor, - ConstantVisitor - { - private static final int LABEL_START = 0; // ldc SomeClass.class - private static final int LABEL_LOAD_MEMBER_NAME = 1; // [ ldc "someMethod"/"someField" ] - private static final int LABEL_LOAD_CLASS_ARRAY_SIZE = 2; // [ sipush #someParameterCount - private static final int LABEL_CREATE_CLASS_ARRAY = 3; // anewarray java/lang/Class - private static final int LABEL_DUP_CLASS_ARRAY = 4; // [ dup - private static final int LABEL_LOAD_PARAMETER_INDEX = 5; // sipush #someParameterIndex - private static final int LABEL_LOAD_PARAMETER_TYPE = 6; // ldc SomeParameterClass.class / getstatic java/lang/SomePrimitive.TYPE - private static final int LABEL_STORE_PARAMETER = 7; // aastore ]* ] / aconst_null - private static final int LABEL_GET_MEMBER = 8; // invokevirtual java/lang/Class.getField/getConstructor/getMethod - - private int label; - private int instructionOffset; - private int memberNameInstructionOffset; - private Clazz referencedClass; - private String memberName; - private int parameterCount; - private int parameterIndex; - private StringBuffer parameterTypes = new StringBuffer(); - - - public void reset() - { - label = LABEL_START; - referencedClass = null; - memberName = null; - parameterTypes.setLength(0); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - if (DEBUG) - { - System.out.println("Label ["+label+"] A "+instruction.toString(offset)); - } - - reset(); - } - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - if (DEBUG) - { - System.out.println("Label ["+label+"] S "+simpleInstruction.toString(offset)); - } - - int transition = label | simpleInstruction.canonicalOpcode() << 8; - - switch (transition) - { - case LABEL_START | InstructionConstants.OP_ICONST_0 << 8: - case LABEL_LOAD_MEMBER_NAME | InstructionConstants.OP_ICONST_0 << 8: - case LABEL_CREATE_CLASS_ARRAY | InstructionConstants.OP_ICONST_0 << 8: - case LABEL_DUP_CLASS_ARRAY | InstructionConstants.OP_ICONST_0 << 8: - case LABEL_LOAD_PARAMETER_TYPE | InstructionConstants.OP_ICONST_0 << 8: - case LABEL_STORE_PARAMETER | InstructionConstants.OP_ICONST_0 << 8: - case LABEL_GET_MEMBER | InstructionConstants.OP_ICONST_0 << 8: - // This could be the start of creating a class array. - reset(); - parameterCount = simpleInstruction.constant; - label = LABEL_CREATE_CLASS_ARRAY; - break; - - case LABEL_LOAD_CLASS_ARRAY_SIZE | InstructionConstants.OP_ICONST_0 << 8: - parameterCount = simpleInstruction.constant; - label = LABEL_CREATE_CLASS_ARRAY; - break; - - case LABEL_LOAD_CLASS_ARRAY_SIZE | InstructionConstants.OP_ACONST_NULL << 8: - parameterCount = 0; - label = LABEL_GET_MEMBER; - break; - - case LABEL_DUP_CLASS_ARRAY | InstructionConstants.OP_DUP << 8: - label = LABEL_LOAD_PARAMETER_INDEX; - break; - - case LABEL_LOAD_PARAMETER_INDEX | InstructionConstants.OP_ICONST_0 << 8: - // Is it pushing the expected parameter index? - if (parameterIndex == simpleInstruction.constant) - { - label = LABEL_LOAD_PARAMETER_TYPE; - } - else - { - // This could be the start of creating a class array. - reset(); - parameterCount = simpleInstruction.constant; - label = LABEL_CREATE_CLASS_ARRAY; - } - break; - - case LABEL_STORE_PARAMETER | InstructionConstants.OP_AASTORE << 8: - // Are we still expecting more parameters? - label = ++parameterIndex < parameterCount ? - LABEL_DUP_CLASS_ARRAY : - LABEL_GET_MEMBER; - break; - - default: - reset(); - break; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (DEBUG) - { - System.out.println("Label ["+label+"] C "+constantInstruction.toString(offset)); - } - - // Let the constant figure out the transition. - switch (constantInstruction.canonicalOpcode()) - { - case InstructionConstants.OP_LDC: - instructionOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_INVOKEVIRTUAL: - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_ANEWARRAY: - if (label == LABEL_CREATE_CLASS_ARRAY) - { - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - else - { - reset(); - } - break; - - default: - reset(); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - reset(); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Argument of ldc or anewarray instruction. - switch (label) - { - case LABEL_START: - referencedClass = classConstant.referencedClass; - - label = LABEL_LOAD_MEMBER_NAME; - break; - - case LABEL_CREATE_CLASS_ARRAY: - if (classConstant.getName(clazz).equals(ClassConstants.NAME_JAVA_LANG_CLASS)) - { - parameterIndex = 0; - label = parameterCount > 0 ? - LABEL_DUP_CLASS_ARRAY : - LABEL_GET_MEMBER; - } - else - { - referencedClass = classConstant.referencedClass; - - label = LABEL_LOAD_MEMBER_NAME; - } - break; - - case LABEL_LOAD_PARAMETER_TYPE: - String parameterType = - ClassUtil.internalTypeFromClassType(classConstant.getName(clazz)); - - parameterTypes.append(parameterType); - - label = LABEL_STORE_PARAMETER; - break; - - default: - // For other states, we'll treat this as a potential - // initial class name. - referencedClass = classConstant.referencedClass; - - label = LABEL_LOAD_MEMBER_NAME; - break; - } - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Argument of ldc instruction. - switch (label) - { - case LABEL_LOAD_MEMBER_NAME: - break; - - default: - // For other states, we'll treat this as a potential - // initial method name, without a known class. - referencedClass = null; - break; - } - - // Whatever state, we'll treat this as a potential method name. - memberNameInstructionOffset = instructionOffset; - memberName = stringConstant.getString(clazz); - - label = LABEL_LOAD_CLASS_ARRAY_SIZE; - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - // Argument of getstatic instruction. - switch (label) - { - case LABEL_LOAD_PARAMETER_TYPE: - String className = fieldrefConstant.getClassName(clazz); - String fieldName = fieldrefConstant.getName(clazz); - String fieldType = fieldrefConstant.getType(clazz); - - if (className.startsWith(ClassConstants.PACKAGE_JAVA_LANG) && - fieldName.equals(ClassConstants.FIELD_NAME_TYPE) && - fieldType.equals(ClassConstants.FIELD_TYPE_TYPE)) - { - char parameterType = - ClassUtil.internalPrimitiveTypeFromNumericClassName(className); - - parameterTypes.append(parameterType); - - label = LABEL_STORE_PARAMETER; - } - else - { - reset(); - } - break; - - default: - reset(); - break; - } - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - // Argument of invokevirtual instruction. - String className = methodrefConstant.getClassName(clazz); - - if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS)) - { - String methodName = methodrefConstant.getName(clazz); - String methodType = methodrefConstant.getType(clazz); - - if (label == LABEL_LOAD_CLASS_ARRAY_SIZE && - methodType.equals(ClassConstants.METHOD_TYPE_CLASS_GET_FIELD) && - memberName != null) - { - if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_FIELD)) - { - resolveMemberString(clazz, true, false, false); - } - else if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_DECLARED_FIELD)) - { - resolveMemberString(clazz, true, false, true); - } - else - { - reset(); - } - } - else if (label == LABEL_GET_MEMBER && - methodType.equals(ClassConstants.METHOD_TYPE_CLASS_GET_CONSTRUCTOR)) - { - if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_CONSTRUCTOR)) - { - resolveMemberString(clazz, false, true, false); - } - else if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_DECLARED_CONSTRUCTOR)) - { - resolveMemberString(clazz, false, true, true); - } - else - { - reset(); - } - } - else if (label == LABEL_GET_MEMBER && - methodType.equals(ClassConstants.METHOD_TYPE_CLASS_GET_METHOD) && - memberName != null) - { - if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_METHOD)) - { - resolveMemberString(clazz, false, false, false); - } - else if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_DECLARED_METHOD)) - { - resolveMemberString(clazz, false, false, true); - } - else - { - reset(); - } - } - else - { - reset(); - } - } - else - { - reset(); - } - } - - - /** - * Links the referenced class member in the string, or prints out - * notes about the possible alternatives. - */ - private void resolveMemberString(Clazz clazz, - boolean isField, - boolean isConstructor, - boolean isDeclared) - { - String memberDescriptor = isField ? - null : - ClassConstants.METHOD_ARGUMENTS_OPEN + - parameterTypes.toString() + - ClassConstants.METHOD_ARGUMENTS_CLOSE + - "L***;"; - - if (DEBUG) - { - System.out.println("DynamicMemberReferenceInitializer: found member access"); - System.out.println(" isField = "+isField); - System.out.println(" isConstructor = "+isConstructor); - System.out.println(" isDeclared = "+isDeclared); - System.out.println(" referenced class = "+(referencedClass == null ? "(none)" : "["+referencedClass.getName()+"]")); - System.out.println(" member name = "+(memberName == null ? "(none)" : "["+memberName+"]")); - System.out.println(" member descriptor = "+(memberDescriptor == null ? "(none)" : "["+memberDescriptor+"]")); - } - - if (referencedClass != null) - { - if (isConstructor) - { - // We currently can't fill out some reference to a - // constructor. Just print out notes instead. - printDynamicConstructorAccessNote(clazz, - referencedClass, - memberDescriptor, - isDeclared); - } - else - { - // Create a new string constant and update the instruction. - initializeDynamicMemberReference(clazz, - memberNameInstructionOffset, - referencedClass, - memberName, - memberDescriptor, - isField, - isConstructor, - isDeclared); - } - } - else - { - // Print out notes about the method in some unknown class. - printDynamicMemberAccessNote(clazz, - isConstructor ? - ClassConstants.METHOD_NAME_INIT : - memberName, - memberDescriptor, - isField, - isConstructor, - isDeclared); - } - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/EnumFieldReferenceInitializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/EnumFieldReferenceInitializer.java deleted file mode 100644 index e574a2a2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/EnumFieldReferenceInitializer.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.attribute.visitor.AllAttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This ElementValueVisitor initializes the field references of the - * EnumConstantElementValue instances that it visits. - * - * @author Eric Lafortune - */ -public class EnumFieldReferenceInitializer -extends SimplifiedVisitor -implements ElementValueVisitor, - InstructionVisitor, - ConstantVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - private MemberVisitor enumFieldFinder = new AllAttributeVisitor( - new AllInstructionVisitor(this)); - - // Fields acting as parameters and return values for the visitors. - private String enumTypeName; - private String enumConstantName; - private boolean enumConstantNameFound; - private Clazz referencedEnumClass; - private Field referencedEnumField; - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) {} - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - - if (enumConstantElementValue.referencedClasses != null && - enumConstantElementValue.referencedClasses.length > 0) - { - referencedEnumClass = enumConstantElementValue.referencedClasses[0]; - if (referencedEnumClass != null) - { - // Try to find the enum field through the static enum - // initialization code (at least for program classes). - enumTypeName = enumConstantElementValue.getTypeName(clazz); - enumConstantName = enumConstantElementValue.getConstantName(clazz); - referencedEnumField = null; - referencedEnumClass.methodAccept(ClassConstants.METHOD_NAME_CLINIT, - ClassConstants.METHOD_TYPE_CLINIT, - enumFieldFinder); - - // Otherwise try to find the enum field through its name. - // The constant name could be different from the field name, if - // the latter is already obfuscated. - if (referencedEnumField == null) - { - referencedEnumField = - referencedEnumClass.findField(enumConstantName, - enumTypeName); - } - - if (DEBUG) - { - System.out.println("EnumFieldReferenceInitializer: ["+referencedEnumClass.getName()+"."+enumConstantName+"] -> "+referencedEnumField); - } - - enumConstantElementValue.referencedField = referencedEnumField; - } - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_LDC: - case InstructionConstants.OP_LDC_W: - case InstructionConstants.OP_PUTSTATIC: - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - enumConstantNameFound = - enumConstantName.equals(stringConstant.getString(clazz)); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - if (enumConstantNameFound) - { - if (enumTypeName.equals(fieldrefConstant.getType(clazz))) - { - referencedEnumField = (Field)fieldrefConstant.referencedMember; - } - - enumConstantNameFound = false; - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ExternalTypeEnumeration.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ExternalTypeEnumeration.java deleted file mode 100644 index 1dfe8db9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/ExternalTypeEnumeration.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; - - -/** - * An ExternalTypeEnumeration provides an enumeration of all - * types listed in a given external descriptor string. The method name can - * be retrieved separately. - *

- * A ExternalTypeEnumeration object can be reused for processing - * different subsequent descriptors, by means of the setDescriptor - * method. - * - * @author Eric Lafortune - */ -public class ExternalTypeEnumeration -{ - private String descriptor; - private int index; - - - public ExternalTypeEnumeration(String descriptor) - { - setDescriptor(descriptor); - } - - - ExternalTypeEnumeration() - { - } - - - void setDescriptor(String descriptor) - { - this.descriptor = descriptor; - - reset(); - } - - - public void reset() - { - index = descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN) + 1; - - if (index < 1) - { - throw new IllegalArgumentException("Missing opening parenthesis in descriptor ["+descriptor+"]"); - } - } - - - public boolean hasMoreTypes() - { - return index < descriptor.length() - 1; - } - - - public String nextType() - { - int startIndex = index; - - // Find the next separating comma. - index = descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_SEPARATOR, - startIndex); - - // Otherwise find the closing parenthesis. - if (index < 0) - { - index = descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_CLOSE, - startIndex); - if (index < 0) - { - throw new IllegalArgumentException("Missing closing parenthesis in descriptor ["+descriptor+"]"); - } - } - - return descriptor.substring(startIndex, index++).trim(); - } - - - public String methodName() - { - return descriptor.substring(0, descriptor.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN)).trim(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/InstructionSequenceMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/InstructionSequenceMatcher.java deleted file mode 100644 index da59455c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/InstructionSequenceMatcher.java +++ /dev/null @@ -1,824 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; - -import java.util.Arrays; - -/** - * This InstructionVisitor checks whether a given pattern instruction sequence - * occurs in the instructions that are visited. The arguments of the - * instruction sequence can be wildcards that are matched. - * - * @author Eric Lafortune - */ -public class InstructionSequenceMatcher -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor -{ - //* - private static final boolean DEBUG = false; - private static final boolean DEBUG_MORE = false; - /*/ - public static boolean DEBUG = System.getProperty("ism") != null; - public static boolean DEBUG_MORE = System.getProperty("ismm") != null; - //*/ - - public static final int X = 0x40000000; - public static final int Y = 0x40000001; - public static final int Z = 0x40000002; - - public static final int A = 0x40000003; - public static final int B = 0x40000004; - public static final int C = 0x40000005; - public static final int D = 0x40000006; - public static final int E = 0x40000007; - public static final int F = 0x40000008; - public static final int G = 0x40000009; - public static final int H = 0x4000000a; - public static final int I = 0x4000000b; - public static final int J = 0x4000000c; - public static final int K = 0x4000000d; - public static final int L = 0x4000000e; - public static final int M = 0x4000000f; - public static final int N = 0x40000010; - public static final int O = 0x40000011; - public static final int P = 0x40000012; - public static final int Q = 0x40000013; - public static final int R = 0x40000014; - - - protected final Constant[] patternConstants; - protected final Instruction[] patternInstructions; - - private boolean matching; - private int patternInstructionIndex; - private final int[] matchedInstructionOffsets; - private int matchedArgumentFlags; - private final int[] matchedArguments = new int[21]; - private final long[] matchedConstantFlags; - private final int[] matchedConstantIndices; - private int constantFlags; - private int previousConstantFlags; - - // Fields acting as a parameter and a return value for visitor methods. - protected Constant patternConstant; - protected boolean matchingConstant; - - - /** - * Creates a new InstructionSequenceMatcher. - * @param patternConstants any constants referenced by the pattern - * instruction. - * @param patternInstructions the pattern instruction sequence. - */ - public InstructionSequenceMatcher(Constant[] patternConstants, - Instruction[] patternInstructions) - { - this.patternConstants = patternConstants; - this.patternInstructions = patternInstructions; - - matchedInstructionOffsets = new int[patternInstructions.length]; - matchedConstantFlags = new long[(patternConstants.length + 63) / 64]; - matchedConstantIndices = new int[patternConstants.length]; - } - - - /** - * Starts matching from the first instruction again next time. - */ - public void reset() - { - patternInstructionIndex = 0; - matchedArgumentFlags = 0; - - Arrays.fill(matchedConstantFlags, 0L); - - previousConstantFlags = constantFlags; - constantFlags = 0; - } - - - /** - * Returns whether the complete pattern sequence has been matched. - */ - public boolean isMatching() - { - return matching; - } - - - /** - * Returns the number of instructions in the pattern sequence. - */ - public int instructionCount() - { - return patternInstructions.length; - } - - - /** - * Returns the matched instruction offset of the specified pattern - * instruction. - */ - public int matchedInstructionOffset(int index) - { - return matchedInstructionOffsets[index]; - } - - - /** - * Returns whether the specified wildcard argument was a constant from - * the constant pool in the most recent match. - */ - public boolean wasConstant(int argument) - { - return (previousConstantFlags & (1 << (argument - X))) != 0; - } - - - /** - * Returns the value of the specified matched argument (wildcard or not). - */ - public int matchedArgument(int argument) - { - int argumentIndex = argument - X; - return argumentIndex < 0 ? - argument : - matchedArguments[argumentIndex]; - } - - - /** - * Returns the values of the specified matched arguments (wildcard or not). - */ - public int[] matchedArguments(int[] arguments) - { - int[] matchedArguments = new int[arguments.length]; - - for (int index = 0; index < arguments.length; index++) - { - matchedArguments[index] = matchedArgument(arguments[index]); - } - - return matchedArguments; - } - - - /** - * Returns the index of the specified matched constant (wildcard or not). - */ - public int matchedConstantIndex(int constantIndex) - { - int argumentIndex = constantIndex - X; - return argumentIndex < 0 ? - matchedConstantIndices[constantIndex] : - matchedArguments[argumentIndex]; - } - - - /** - * Returns the value of the specified matched branch offset (wildcard or - * not). - */ - public int matchedBranchOffset(int offset, int branchOffset) - { - int argumentIndex = branchOffset - X; - return argumentIndex < 0 ? - branchOffset : - matchedArguments[argumentIndex] - offset; - } - - - /** - * Returns the values of the specified matched jump offsets (wildcard or - * not). - */ - public int[] matchedJumpOffsets(int offset, int[] jumpOffsets) - { - int[] matchedJumpOffsets = new int[jumpOffsets.length]; - - for (int index = 0; index < jumpOffsets.length; index++) - { - matchedJumpOffsets[index] = matchedBranchOffset(offset, - jumpOffsets[index]); - } - - return matchedJumpOffsets; - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - Instruction patternInstruction = patternInstructions[patternInstructionIndex]; - - // Check if the instruction matches the next instruction in the sequence. - boolean condition = - matchingOpcodes(simpleInstruction, patternInstruction) && - matchingArguments(simpleInstruction.constant, - ((SimpleInstruction)patternInstruction).constant); - - // Check if the instruction sequence is matching now. - checkMatch(condition, - clazz, - method, - codeAttribute, - offset, - simpleInstruction); - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - Instruction patternInstruction = patternInstructions[patternInstructionIndex]; - - // Check if the instruction matches the next instruction in the sequence. - boolean condition = - matchingOpcodes(variableInstruction, patternInstruction) && - matchingArguments(variableInstruction.variableIndex, - ((VariableInstruction)patternInstruction).variableIndex) && - matchingArguments(variableInstruction.constant, - ((VariableInstruction)patternInstruction).constant); - - // Check if the instruction sequence is matching now. - checkMatch(condition, - clazz, - method, - codeAttribute, - offset, - variableInstruction); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - Instruction patternInstruction = patternInstructions[patternInstructionIndex]; - - // Check if the instruction matches the next instruction in the sequence. - boolean condition = - matchingOpcodes(constantInstruction, patternInstruction) && - matchingConstantIndices(clazz, - constantInstruction.constantIndex, - ((ConstantInstruction)patternInstruction).constantIndex) && - matchingArguments(constantInstruction.constant, - ((ConstantInstruction)patternInstruction).constant); - - // Check if the instruction sequence is matching now. - checkMatch(condition, - clazz, - method, - codeAttribute, - offset, - constantInstruction); - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - Instruction patternInstruction = patternInstructions[patternInstructionIndex]; - - // Check if the instruction matches the next instruction in the from - // sequence. - boolean condition = - matchingOpcodes(branchInstruction, patternInstruction) && - matchingBranchOffsets(offset, - branchInstruction.branchOffset, - ((BranchInstruction)patternInstruction).branchOffset); - - // Check if the instruction sequence is matching now. - checkMatch(condition, - clazz, - method, - codeAttribute, - offset, - branchInstruction); - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - Instruction patternInstruction = patternInstructions[patternInstructionIndex]; - - // Check if the instruction matches the next instruction in the sequence. - boolean condition = - matchingOpcodes(tableSwitchInstruction, patternInstruction) && - matchingBranchOffsets(offset, - tableSwitchInstruction.defaultOffset, - ((TableSwitchInstruction)patternInstruction).defaultOffset) && - matchingArguments(tableSwitchInstruction.lowCase, - ((TableSwitchInstruction)patternInstruction).lowCase) && - matchingArguments(tableSwitchInstruction.highCase, - ((TableSwitchInstruction)patternInstruction).highCase) && - matchingJumpOffsets(offset, - tableSwitchInstruction.jumpOffsets, - ((TableSwitchInstruction)patternInstruction).jumpOffsets); - - // Check if the instruction sequence is matching now. - checkMatch(condition, - clazz, - method, - codeAttribute, - offset, - tableSwitchInstruction); - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - Instruction patternInstruction = patternInstructions[patternInstructionIndex]; - - // Check if the instruction matches the next instruction in the sequence. - boolean condition = - matchingOpcodes(lookUpSwitchInstruction, patternInstruction) && - matchingBranchOffsets(offset, - lookUpSwitchInstruction.defaultOffset, - ((LookUpSwitchInstruction)patternInstruction).defaultOffset) && - matchingArguments(lookUpSwitchInstruction.cases, - ((LookUpSwitchInstruction)patternInstruction).cases) && - matchingJumpOffsets(offset, - lookUpSwitchInstruction.jumpOffsets, - ((LookUpSwitchInstruction)patternInstruction).jumpOffsets); - - // Check if the instruction sequence is matching now. - checkMatch(condition, - clazz, - method, - codeAttribute, - offset, - lookUpSwitchInstruction); - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - IntegerConstant integerPatternConstant = (IntegerConstant)patternConstant; - - // Compare the integer values. - matchingConstant = integerConstant.getValue() == - integerPatternConstant.getValue(); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - LongConstant longPatternConstant = (LongConstant)patternConstant; - - // Compare the long values. - matchingConstant = longConstant.getValue() == - longPatternConstant.getValue(); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - FloatConstant floatPatternConstant = (FloatConstant)patternConstant; - - // Compare the float values. - matchingConstant = floatConstant.getValue() == - floatPatternConstant.getValue(); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - DoubleConstant doublePatternConstant = (DoubleConstant)patternConstant; - - // Compare the double values. - matchingConstant = doubleConstant.getValue() == - doublePatternConstant.getValue(); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - //PrimitiveArrayConstant primitiveArrayPatternConstant = (PrimitiveArrayConstant)patternConstant; - // - //// Compare the primitive array values. - //matchingConstant = - // primitiveArrayConstant.getLength() == primitiveArrayPatternConstant.getLength() && - // ArrayUtil.equal(primitiveArrayConstant.getValues(), - // primitiveArrayPatternConstant.getValues(), - // primitiveArrayPatternConstant.getLength()); - throw new UnsupportedOperationException(); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - StringConstant stringPatternConstant = (StringConstant)patternConstant; - - // Check the UTF-8 constant. - matchingConstant = - matchingConstantIndices(clazz, - stringConstant.u2stringIndex, - stringPatternConstant.u2stringIndex); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - Utf8Constant utf8PatternConstant = (Utf8Constant)patternConstant; - - // Compare the actual strings. - matchingConstant = utf8Constant.getString().equals( - utf8PatternConstant.getString()); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - InvokeDynamicConstant invokeDynamicPatternConstant = (InvokeDynamicConstant)patternConstant; - - // Check the bootstrap method and the name and type. - matchingConstant = - matchingConstantIndices(clazz, - invokeDynamicConstant.getBootstrapMethodAttributeIndex(), - invokeDynamicPatternConstant.getBootstrapMethodAttributeIndex()) && - matchingConstantIndices(clazz, - invokeDynamicConstant.getNameAndTypeIndex(), - invokeDynamicPatternConstant.getNameAndTypeIndex()); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - MethodHandleConstant methodHandlePatternConstant = (MethodHandleConstant)patternConstant; - - // Check the handle type and the name and type. - matchingConstant = - matchingArguments(methodHandleConstant.getReferenceKind(), - methodHandlePatternConstant.getReferenceKind()) && - matchingConstantIndices(clazz, - methodHandleConstant.getReferenceIndex(), - methodHandlePatternConstant.getReferenceIndex()); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - RefConstant refPatternConstant = (RefConstant)patternConstant; - - // Check the class and the name and type. - matchingConstant = - matchingConstantIndices(clazz, - refConstant.getClassIndex(), - refPatternConstant.getClassIndex()) && - matchingConstantIndices(clazz, - refConstant.getNameAndTypeIndex(), - refPatternConstant.getNameAndTypeIndex()); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - ClassConstant classPatternConstant = (ClassConstant)patternConstant; - - // Check the class name. - matchingConstant = - matchingConstantIndices(clazz, - classConstant.u2nameIndex, - classPatternConstant.u2nameIndex); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - MethodTypeConstant typePatternConstant = (MethodTypeConstant)patternConstant; - - // Check the descriptor. - matchingConstant = - matchingConstantIndices(clazz, - methodTypeConstant.u2descriptorIndex, - typePatternConstant.u2descriptorIndex); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - NameAndTypeConstant typePatternConstant = (NameAndTypeConstant)patternConstant; - - // Check the name and the descriptor. - matchingConstant = - matchingConstantIndices(clazz, - nameAndTypeConstant.u2nameIndex, - typePatternConstant.u2nameIndex) && - matchingConstantIndices(clazz, - nameAndTypeConstant.u2descriptorIndex, - typePatternConstant.u2descriptorIndex); - } - - - // Small utility methods. - - protected boolean matchingOpcodes(Instruction instruction1, - Instruction instruction2) - { - // Check the opcode. - return instruction1.opcode == instruction2.opcode || - instruction1.canonicalOpcode() == instruction2.opcode; - } - - - protected boolean matchingArguments(int argument1, - int argument2) - { - int argumentIndex = argument2 - X; - if (argumentIndex < 0) - { - // Check the literal argument. - return argument1 == argument2; - } - else if (!isMatchingArgumentIndex(argumentIndex)) - { - // Store the wildcard argument. - setMatchingArgument(argumentIndex, argument1); - - return true; - } - else - { - // Check the previously stored wildcard argument. - return matchedArguments[argumentIndex] == argument1; - } - } - - - /** - * Marks the specified argument (by index) as matching the specified - * argument value. - */ - private void setMatchingArgument(int argumentIndex, - int argument) - { - matchedArguments[argumentIndex] = argument; - matchedArgumentFlags |= 1 << argumentIndex; - } - - - /** - * Returns whether the specified wildcard argument (by index) has been - * matched. - */ - private boolean isMatchingArgumentIndex(int argumentIndex) - { - return (matchedArgumentFlags & (1 << argumentIndex)) != 0; - } - - - protected boolean matchingArguments(int[] arguments1, - int[] arguments2) - { - if (arguments1.length != arguments2.length) - { - return false; - } - - for (int index = 0; index < arguments1.length; index++) - { - if (!matchingArguments(arguments1[index], arguments2[index])) - { - return false; - } - } - - return true; - } - - - protected boolean matchingConstantIndices(Clazz clazz, - int constantIndex1, - int constantIndex2) - { - if (constantIndex2 >= X) - { - // Remember that we are trying to match a constant. - constantFlags |= 1 << (constantIndex2 - X); - - // Check the constant index. - return matchingArguments(constantIndex1, constantIndex2); - } - else if (!isMatchingConstantIndex(constantIndex2)) - { - // Check the actual constant. - matchingConstant = false; - patternConstant = patternConstants[constantIndex2]; - - if (clazz.getTag(constantIndex1) == patternConstant.getTag()) - { - clazz.constantPoolEntryAccept(constantIndex1, this); - - if (matchingConstant) - { - // Store the constant index. - setMatchingConstant(constantIndex2, constantIndex1); - } - } - - return matchingConstant; - } - else - { - // Check a previously stored constant index. - return matchedConstantIndices[constantIndex2] == constantIndex1; - } - } - - - /** - * Marks the specified constant (by index) as matching the specified - * constant index value. - */ - private void setMatchingConstant(int constantIndex, - int constantIndex1) - { - matchedConstantIndices[constantIndex] = constantIndex1; - matchedConstantFlags[constantIndex / 64] |= 1L << constantIndex; - } - - - /** - * Returns whether the specified wildcard constant has been matched. - */ - private boolean isMatchingConstantIndex(int constantIndex) - { - return (matchedConstantFlags[constantIndex / 64] & (1L << constantIndex)) != 0; - } - - - protected boolean matchingBranchOffsets(int offset, - int branchOffset1, - int branchOffset2) - { - int argumentIndex = branchOffset2 - X; - if (argumentIndex < 0) - { - // Check the literal argument. - return branchOffset1 == branchOffset2; - } - else if (!isMatchingArgumentIndex(argumentIndex)) - { - // Store a wildcard argument. - setMatchingArgument(argumentIndex, offset + branchOffset1); - - return true; - } - else - { - // Check the previously stored wildcard argument. - return matchedArguments[argumentIndex] == offset + branchOffset1; - } - } - - - protected boolean matchingJumpOffsets(int offset, - int[] jumpOffsets1, - int[] jumpOffsets2) - { - if (jumpOffsets1.length != jumpOffsets2.length) - { - return false; - } - - for (int index = 0; index < jumpOffsets1.length; index++) - { - if (!matchingBranchOffsets(offset, - jumpOffsets1[index], - jumpOffsets2[index])) - { - return false; - } - } - - return true; - } - - - private void checkMatch(boolean condition, - Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - Instruction instruction) - { - if (DEBUG_MORE) - { - System.out.println("InstructionSequenceMatcher: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]: "+instruction.toString(offset)+(condition?"\t== ":"\t ")+patternInstructions[patternInstructionIndex].toString(patternInstructionIndex)); - } - - // Did the instruction match? - if (condition) - { - // Remember the offset of the matching instruction. - matchedInstructionOffsets[patternInstructionIndex] = offset; - - // Try to match the next instruction next time. - patternInstructionIndex++; - - // Did we match all instructions in the sequence? - matching = patternInstructionIndex == patternInstructions.length; - - if (matching) - { - // Allow subclasses to perform a final check on additional constraints. - matching &= finalMatch(clazz, method, codeAttribute, offset, instruction); - - if (DEBUG) - { - System.out.println("InstructionSequenceMatcher: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - for (int index = 0; index < patternInstructionIndex; index++) - { - System.out.println(" "+InstructionFactory.create(codeAttribute.code, matchedInstructionOffsets[index]).toString(matchedInstructionOffsets[index])); - } - - for (int index = 0; index < matchedArguments.length; index++) - { - if ((matchedArgumentFlags & (1 << index)) != 0) - { - System.out.println(" Arg #"+index+": "+matchedArguments[index]); - } - } - - for (int index = 0; index < matchedConstantIndices.length; index++) - { - if (isMatchingConstantIndex(index)) - { - System.out.println(" Constant #"+index+": "+matchedConstantIndices[index]); - } - } - } - - // Start matching from the first instruction again next time. - reset(); - } - } - else - { - // The instruction didn't match. - matching = false; - - // Is this a failed second instruction? - boolean retry = patternInstructionIndex == 1; - - // Start matching from the first instruction next time. - reset(); - - // Retry a failed second instruction as a first instruction. - if (retry) - { - instruction.accept(clazz, method, codeAttribute, offset, this); - } - } - } - - - /** - * Performs a final check on the candidate sequence to match, - * after the pattern has been successfully fully matched with the - * sequence. Subclasses may override this method to implement - * additional constraints on the matched sequences. - * - * @param clazz - * @param method - * @param codeAttribute - * @param offset - * @param instruction - * @return - */ - protected boolean finalMatch(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - Instruction instruction ) - { - return true; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/InternalTypeEnumeration.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/InternalTypeEnumeration.java deleted file mode 100644 index 70c98985..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/InternalTypeEnumeration.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.ClassConstants; - - -/** - * An InternalTypeEnumeration provides an enumeration of all - * types listed in a given internal descriptor or signature of a class, a - * method, or a field. - * - * The leading formal type parameters, if any, can be retrieved separately. - * - * The return type of a method descriptor can also be retrieved separately. - * - * @author Eric Lafortune - */ -public class InternalTypeEnumeration -{ - private String descriptor; - private int formalTypeParametersIndex; - private int openIndex; - private int closeIndex; - private int index; - - - /** - * Creates a new InternalTypeEnumeration for the given method descriptor. - */ - public InternalTypeEnumeration(String descriptor) - { - this.descriptor = descriptor; - - // Find any formal type parameters. - if (descriptor.charAt(0) == ClassConstants.TYPE_GENERIC_START) - { - formalTypeParametersIndex = 1; - - int nestingLevel = 1; - do - { - char c = descriptor.charAt(formalTypeParametersIndex++); - switch (c) - { - case ClassConstants.TYPE_GENERIC_START: - { - nestingLevel++; - break; - } - case ClassConstants.TYPE_GENERIC_END: - { - nestingLevel--; - break; - } - } - } - while (nestingLevel > 0); - } - - this.openIndex = descriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_OPEN, - formalTypeParametersIndex); - - this.closeIndex = openIndex >= 0 ? - descriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE, openIndex) : - descriptor.length(); - - this.index = openIndex >= 0 ? - openIndex + 1 : - formalTypeParametersIndex; - } - - - /** - * Returns whether the descriptor has leading formal type parameters. - */ - public boolean hasFormalTypeParameters() - { - return formalTypeParametersIndex > 0; - } - - - /** - * Returns the leading formal type parameters from the descriptor. - */ - public String formalTypeParameters() - { - return descriptor.substring(0, formalTypeParametersIndex); - } - - - /** - * Returns whether the descriptor is a method signature. - */ - public boolean isMethodSignature() - { - return openIndex >= 0; - } - - - /** - * Returns whether the enumeration can provide more types from the method - * descriptor. - */ - public boolean hasMoreTypes() - { - return index < closeIndex; - } - - - /** - * Returns the next type from the method descriptor. - */ - public String nextType() - { - int startIndex = index; - - skipArray(); - - char c = descriptor.charAt(index++); - switch (c) - { - case ClassConstants.TYPE_CLASS_START: - case ClassConstants.TYPE_GENERIC_VARIABLE_START: - { - skipClass(); - break; - } - case ClassConstants.TYPE_GENERIC_START: - { - skipGeneric(); - break; - } - } - - return descriptor.substring(startIndex, index); - } - - - /** - * Returns the return type from the descriptor, assuming it's a method - * descriptor. - */ - public String returnType() - { - return descriptor.substring(closeIndex + 1); - } - - - // Small utility methods. - - private void skipArray() - { - while (descriptor.charAt(index) == ClassConstants.TYPE_ARRAY) - { - index++; - } - } - - - private void skipClass() - { - while (true) - { - char c = descriptor.charAt(index++); - switch (c) - { - case ClassConstants.TYPE_GENERIC_START: - skipGeneric(); - break; - - case ClassConstants.TYPE_CLASS_END: - return; - } - } - } - - - private void skipGeneric() - { - int nestingLevel = 1; - - do - { - char c = descriptor.charAt(index++); - switch (c) - { - case ClassConstants.TYPE_GENERIC_START: - nestingLevel++; - break; - - case ClassConstants.TYPE_GENERIC_END: - nestingLevel--; - break; - } - } - while (nestingLevel > 0); - } - - - /** - * A main method for testing the type enumeration. - */ - public static void main(String[] args) - { - try - { - for (int index = 0; index < args.length; index++) - { - String descriptor = args[index]; - - System.out.println("Descriptor ["+descriptor+"]"); - InternalTypeEnumeration enumeration = new InternalTypeEnumeration(descriptor); - - if (enumeration.hasFormalTypeParameters()) - { - System.out.println(" Formal type parameters ["+enumeration.formalTypeParameters()+"]"); - } - - while (enumeration.hasMoreTypes()) - { - System.out.println(" Type ["+enumeration.nextType()+"]"); - } - - if (enumeration.isMethodSignature()) - { - System.out.println(" Return type ["+enumeration.returnType()+"]"); - } - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/MemberFinder.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/MemberFinder.java deleted file mode 100644 index 32db2678..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/MemberFinder.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; - -/** - * This class provides methods to find class members in a given class or in its - * hierarchy. - * - * @author Eric Lafortune - */ -public class MemberFinder -extends SimplifiedVisitor -implements MemberVisitor -{ - private static class MemberFoundException extends RuntimeException {} - private static final MemberFoundException MEMBER_FOUND = new MemberFoundException(); - - private final boolean searchHierarchy; - - private Clazz clazz; - private Member member; - - - /** - * Creates a new MemberFinder that looks in the class hierarchy. - */ - public MemberFinder() - { - this(true); - } - - - /** - * Creates a new MemberFinder that looks in the class hierarchy if - * specified. - */ - public MemberFinder(boolean searchHierarchy) - { - this.searchHierarchy = searchHierarchy; - } - - - /** - * Finds the field with the given name and descriptor in the given - * class or its hierarchy. The name and descriptor may contain wildcards. - */ - public Field findField(Clazz clazz, - String name, - String descriptor) - { - return findField(null, clazz, name, descriptor); - } - - - /** - * Finds the field with the given name and descriptor in the given - * class or its hierarchy. The name and descriptor may contain wildcards. - */ - public Field findField(Clazz referencingClass, - Clazz clazz, - String name, - String descriptor) - { - return (Field)findMember(referencingClass, clazz, name, descriptor, true); - } - - - /** - * Finds the method with the given name and descriptor in the given - * class or its hierarchy. The name and descriptor may contain wildcards. - */ - public Method findMethod(Clazz clazz, - String name, - String descriptor) - { - return findMethod(null, clazz, name, descriptor); - } - - - /** - * Finds the method with the given name and descriptor in the given - * class or its hierarchy. The name and descriptor may contain wildcards. - */ - public Method findMethod(Clazz referencingClass, - Clazz clazz, - String name, - String descriptor) - { - return (Method)findMember(referencingClass, clazz, name, descriptor, false); - } - - - /** - * Finds the class member with the given name and descriptor in the given - * class or its hierarchy. The name and descriptor may contain wildcards. - */ - public Member findMember(Clazz clazz, - String name, - String descriptor, - boolean isField) - { - return findMember(null, clazz, name, descriptor, isField); - } - - - /** - * Finds the class member with the given name and descriptor in the given - * class or its hierarchy, referenced from the optional given class. - * The name and descriptor may contain wildcards. - */ - public Member findMember(Clazz referencingClass, - Clazz clazz, - String name, - String descriptor, - boolean isField) - { - // Organize a search in the hierarchy of superclasses and interfaces. - // The class member may be in a different class, if the code was - // compiled with "-target 1.2" or higher (the default in JDK 1.4). - try - { - boolean containsWildcards = - (name != null && (name.indexOf('*') >= 0 || name.indexOf('?') >= 0)) || - (descriptor != null && (descriptor.indexOf('*') >= 0 || descriptor.indexOf('?') >= 0)); - - this.clazz = null; - this.member = null; - - // Check the accessibility from the referencing class, if any - // (non-dummy). - MemberVisitor memberVisitor = - referencingClass != null && - referencingClass.getName() != null ? - new MemberClassAccessFilter(referencingClass, this) : - this; - - clazz.hierarchyAccept(true, - searchHierarchy, - searchHierarchy, - false, - containsWildcards ? - isField ? - new AllFieldVisitor( - new MemberNameFilter(name, - new MemberDescriptorFilter(descriptor, - memberVisitor))) : - - new AllMethodVisitor( - new MemberNameFilter(name, - new MemberDescriptorFilter(descriptor, - memberVisitor))) : - isField ? - new NamedFieldVisitor(name, descriptor, - memberVisitor) : - - new NamedMethodVisitor(name, descriptor, - memberVisitor)); - } - catch (MemberFoundException ex) - { - // We've found the member we were looking for. - } - - return member; - } - - - /** - * Returns the corresponding class of the most recently found class - * member. - */ - public Clazz correspondingClass() - { - return clazz; - } - - - /** - * Returns whether the given method is overridden anywhere down the class - * hierarchy. - */ - public boolean isOverriden(Clazz clazz, - Method method) - { - String name = method.getName(clazz); - String descriptor = method.getDescriptor(clazz); - - // Go looking for the method down the class hierarchy. - try - { - this.clazz = null; - this.member = null; - - clazz.hierarchyAccept(false, false, false, true, - new NamedMethodVisitor(name, descriptor, - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, this))); - } - catch (MemberFoundException ex) - { - // We've found an overriding method. - return true; - } - - return false; - } - - - /** - * Returns whether the given field is shadowed anywhere down the class - * hierarchy. - */ - public boolean isShadowed(Clazz clazz, - Field field) - { - String name = field.getName(clazz); - String descriptor = field.getDescriptor(clazz); - - // Go looking for the field down the class hierarchy. - try - { - this.clazz = null; - this.member = null; - clazz.hierarchyAccept(false, false, false, true, - new NamedFieldVisitor(name, descriptor, - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, this))); - } - catch (MemberFoundException ex) - { - // We've found a shadowing field. - return true; - } - - return false; - } - - -// // Implementations for ClassVisitor. -// -// private void visitAnyClass(Clazz clazz) -// { -// if (member == null) -// { -// member = isField ? -// (Member)clazz.findField(name, descriptor) : -// (Member)clazz.findMethod(name, descriptor); -// -// if (member != null) -// { -// this.clazz = clazz; -// } -// } -// } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - this.clazz = clazz; - this.member = member; - - throw MEMBER_FOUND; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/MethodLinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/MethodLinker.java deleted file mode 100644 index 8ddb762e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/MethodLinker.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; - -import java.util.*; - -/** - * This ClassVisitor links all corresponding non-private, non-static, - * non-initializer methods in the class hierarchies of all visited classes. - * Visited classes are typically all class files that are not being subclassed. - * Chains of links that have been created in previous invocations are merged - * with new chains of links, in order to create a consistent set of chains. - * - * @author Eric Lafortune - */ -public class MethodLinker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor -{ - // An object that is reset and reused every time. - // The map: [class member name+' '+descriptor - class member info] - private final Map memberMap = new HashMap(); - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - // Collect all non-private members in this class hierarchy. - clazz.hierarchyAccept(true, true, true, false, - new AllMethodVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE | ClassConstants.ACC_STATIC, - this))); - - // Clean up for the next class hierarchy. - memberMap.clear(); - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - // Get the class member's name and descriptor. - String name = member.getName(clazz); - String descriptor = member.getDescriptor(clazz); - - // Special cases: and are always kept unchanged. - // We can ignore them here. - if (ClassUtil.isInitializer(name)) - { - return; - } - - // See if we've already come across a method with the same name and - // descriptor. - String key = name + ' ' + descriptor; - Member otherMember = (Member)memberMap.get(key); - - if (otherMember == null) - { - // Get the last method in the chain. - Member thisLastMember = lastMember(member); - - // Store the new class method in the map. - memberMap.put(key, thisLastMember); - } - else - { - // Link both members. - link(member, otherMember); - } - } - - - // Small utility methods. - - /** - * Links the two given class members. - */ - private static void link(Member member1, Member member2) - { - // Get the last methods in the both chains. - Member lastMember1 = lastMember(member1); - Member lastMember2 = lastMember(member2); - - // Check if both link chains aren't already ending in the same element. - if (!lastMember1.equals(lastMember2)) - { - // Merge the two chains, with the library members last. - if (lastMember2 instanceof LibraryMember) - { - lastMember1.setVisitorInfo(lastMember2); - } - else - { - lastMember2.setVisitorInfo(lastMember1); - } - } - } - - - /** - * Finds the last class member in the linked list of related class members. - * @param member the given class member. - * @return the last class member in the linked list. - */ - public static Member lastMember(Member member) - { - Member lastMember = member; - while (lastMember.getVisitorInfo() != null && - lastMember.getVisitorInfo() instanceof Member) - { - lastMember = (Member)lastMember.getVisitorInfo(); - } - - return lastMember; - } - - - /** - * Finds the last visitor accepter in the linked list of visitors. - * @param visitorAccepter the given method. - * @return the last method in the linked list. - */ - public static VisitorAccepter lastVisitorAccepter(VisitorAccepter visitorAccepter) - { - VisitorAccepter lastVisitorAccepter = visitorAccepter; - while (lastVisitorAccepter.getVisitorInfo() != null && - lastVisitorAccepter.getVisitorInfo() instanceof VisitorAccepter) - { - lastVisitorAccepter = (VisitorAccepter)lastVisitorAccepter.getVisitorInfo(); - } - - return lastVisitorAccepter; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/PrimitiveArrayConstantReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/PrimitiveArrayConstantReplacer.java deleted file mode 100644 index d6c9fbd9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/PrimitiveArrayConstantReplacer.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor replaces all PrimitiveArray constants by Java bytecode - * compliant array store instructions. - * - * @see ArrayInitializationReplacer - * @author Thomas Neidhart - */ -public class PrimitiveArrayConstantReplacer -extends SimplifiedVisitor -implements ClassVisitor, - AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - PrimitiveArrayConstantElementVisitor -{ - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - private final ConstantPoolShrinker constantPoolShrinker = new ConstantPoolShrinker(); - - // Fields acting as parameters and return values. - - private boolean classModified; - private InstructionSequenceBuilder builder; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - ConstantCounter counter = new ConstantCounter(); - programClass.constantPoolEntriesAccept( - new ConstantTagFilter(ClassConstants.CONSTANT_PrimitiveArray, - counter)); - - // Replace PrimitiveArray constants if the class has any. - if (counter.getCount() > 0) - { - classModified = false; - - programClass.methodsAccept(new AllAttributeVisitor(this)); - - if (classModified) - { - // Remove the now unused PrimitiveArray constants. - programClass.accept(constantPoolShrinker); - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - codeAttribute.instructionsAccept(clazz, method, this); - - if (codeAttributeEditor.isModified()) - { - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - - classModified = true; - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - builder = null; - - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - - if (builder != null) - { - codeAttributeEditor.replaceInstruction(offset, builder.instructions()); - - classModified = true; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - char primitiveType = primitiveArrayConstant.getPrimitiveType(); - int arrayLength = primitiveArrayConstant.getLength(); - - // Start composing a new array initialization sequence. - builder = new InstructionSequenceBuilder((ProgramClass) clazz); - - // Push the primitive array length. - builder.pushInt(primitiveArrayConstant.getLength()); - - // Create the primitive array. - builder.newarray(InstructionUtil.arrayTypeFromInternalType(primitiveType)); - - // Fill out the primitive array elements. - primitiveArrayConstant.primitiveArrayElementsAccept(clazz, this); - } - - - // Implementations for PrimitiveArrayConstantElementVisitor. - - public void visitBooleanArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, boolean value) - { - builder.dup() - .pushInt(index) - .iconst(value ? 1 : 0) - .bastore(); - } - - - public void visitByteArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, byte value) - { - builder.dup() - .pushInt(index) - .pushInt(value) - .bastore(); - } - - - public void visitCharArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, char value) - { - builder.dup() - .pushInt(index) - .pushInt(value) - .castore(); - } - - - public void visitShortArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, short value) - { - builder.dup() - .pushInt(index) - .pushInt(value) - .sastore(); - } - - - public void visitIntArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, int value) - { - builder.dup() - .pushInt(index) - .pushInt(value) - .iastore(); - } - - - public void visitFloatArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, float value) - { - builder.dup() - .pushInt(index) - .pushFloat(value) - .fastore(); - } - - - public void visitLongArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, long value) - { - builder.dup() - .pushInt(index) - .pushLong(value) - .lastore(); - } - - - public void visitDoubleArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, double value) - { - builder.dup() - .pushInt(index) - .pushDouble(value) - .dastore(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/SimplifiedVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/SimplifiedVisitor.java deleted file mode 100644 index 55f2a31c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/SimplifiedVisitor.java +++ /dev/null @@ -1,1261 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.constant.*; -import proguard.classfile.instruction.*; - -/** - * This abstract utility class allows to implement various visitor interfaces - * with simplified methods. The provided methods delegate to other versions - * with fewer arguments or more general arguments. - * - * @author Eric Lafortune - * @noinspection AbstractClassWithoutAbstractMethods - */ -public abstract class SimplifiedVisitor -{ - // Simplifications for ClassVisitor. - - /** - * Visits any type of class member of the given class. - */ - public void visitAnyClass(Clazz clazz) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitProgramClass(ProgramClass programClass) - { - visitAnyClass(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - visitAnyClass(libraryClass); - } - - - // Simplifications for MemberVisitor. - - /** - * Visits any type of class member of the given class. - */ - public void visitAnyMember(Clazz clazz, Member member) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - /** - * Visits any type of class member of the given program class. - */ - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - visitAnyMember(programClass, programMember); - } - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - visitProgramMember(programClass, programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - visitProgramMember(programClass, programMethod); - } - - - /** - * Visits any type of class member of the given library class. - */ - public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) - { - visitAnyMember(libraryClass, libraryMember); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - visitLibraryMember(libraryClass, libraryField); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - visitLibraryMember(libraryClass, libraryMethod); - } - - - // Simplifications for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - visitAnyConstant(clazz, integerConstant); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - visitAnyConstant(clazz, longConstant); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - visitAnyConstant(clazz, floatConstant); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - visitAnyConstant(clazz, doubleConstant); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - visitAnyConstant(clazz, primitiveArrayConstant); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - visitAnyConstant(clazz, stringConstant); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - visitAnyConstant(clazz, utf8Constant); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - visitAnyConstant(clazz, invokeDynamicConstant); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - visitAnyConstant(clazz, methodHandleConstant); - } - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - visitAnyConstant(clazz, moduleConstant); - } - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - visitAnyConstant(clazz, packageConstant); - } - - - /** - * Visits any type of RefConstant of the given class. - */ - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - visitAnyConstant(clazz, refConstant); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - visitAnyRefConstant(clazz, fieldrefConstant); - } - - - /** - * Visits any type of method RefConstant of the given class. - */ - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - visitAnyRefConstant(clazz, refConstant); - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - visitAnyMethodrefConstant(clazz, interfaceMethodrefConstant); - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - visitAnyMethodrefConstant(clazz, methodrefConstant); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - visitAnyConstant(clazz, classConstant); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - visitAnyConstant(clazz, methodTypeConstant); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - visitAnyConstant(clazz, nameAndTypeConstant); - } - - - // Simplifications for PrimitiveArrayConstantVisitor. - - public void visitAnyPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, Object values) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitBooleanArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, boolean[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - public void visitByteArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, byte[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - public void visitCharArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, char[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - public void visitShortArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, short[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - public void visitIntArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - public void visitFloatArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, float[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - public void visitLongArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, long[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - public void visitDoubleArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, double[] values) - { - visitAnyPrimitiveArrayConstant(clazz, primitiveArrayConstant, values); - } - - - // Simplifications for PrimitiveArrayConstantElementVisitor. - - public void visitAnyPrimitiveArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitBooleanArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, boolean value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - public void visitByteArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, byte value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - public void visitCharArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, char value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - public void visitShortArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, short value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - public void visitIntArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, int value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - public void visitFloatArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, float value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - public void visitLongArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, long value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - public void visitDoubleArrayConstantElement(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant, int index, double value) - { - visitAnyPrimitiveArrayConstantElement(clazz, primitiveArrayConstant, index); - } - - - // Simplifications for AttributeVisitor. - - /** - * Visit any type of attribute. - */ - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - visitAnyAttribute(clazz, unknownAttribute); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - visitAnyAttribute(clazz, bootstrapMethodsAttribute); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - visitAnyAttribute(clazz, sourceFileAttribute); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - visitAnyAttribute(clazz, sourceDirAttribute); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - visitAnyAttribute(clazz, innerClassesAttribute); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - visitAnyAttribute(clazz, enclosingMethodAttribute); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - visitAnyAttribute(clazz, moduleAttribute); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - visitAnyAttribute(clazz, moduleMainClassAttribute); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - visitAnyAttribute(clazz, modulePackagesAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - visitAnyAttribute(clazz, deprecatedAttribute); - } - - - /** - * Visits the given DeprecatedAttribute of any type of class member. - */ - public void visitDeprecatedAttribute(Clazz clazz, Member member, DeprecatedAttribute deprecatedAttribute) - { - visitDeprecatedAttribute(clazz, deprecatedAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) - { - visitDeprecatedAttribute(clazz, (Member)field, deprecatedAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) - { - visitDeprecatedAttribute(clazz, (Member)method, deprecatedAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - visitAnyAttribute(clazz, syntheticAttribute); - } - - - /** - * Visits the given SyntheticAttribute of any type of class member. - */ - public void visitSyntheticAttribute(Clazz clazz, Member member, SyntheticAttribute syntheticAttribute) - { - visitSyntheticAttribute(clazz, syntheticAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) - { - visitSyntheticAttribute(clazz, (Member)field, syntheticAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) - { - visitSyntheticAttribute(clazz, (Member)method, syntheticAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - visitAnyAttribute(clazz, signatureAttribute); - } - - - /** - * Visits the given SignatureAttribute of any type of class member. - */ - public void visitSignatureAttribute(Clazz clazz, Member member, SignatureAttribute signatureAttribute) - { - visitSignatureAttribute(clazz, signatureAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) - { - visitSignatureAttribute(clazz, (Member)field, signatureAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) - { - visitSignatureAttribute(clazz, (Member)method, signatureAttribute); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - visitAnyAttribute(clazz, constantValueAttribute); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - visitAnyAttribute(clazz, methodParametersAttribute); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - visitAnyAttribute(clazz, exceptionsAttribute); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - visitAnyAttribute(clazz, codeAttribute); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - visitAnyAttribute(clazz, stackMapAttribute); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - visitAnyAttribute(clazz, stackMapTableAttribute); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - visitAnyAttribute(clazz, lineNumberTableAttribute); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - visitAnyAttribute(clazz, localVariableTableAttribute); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - visitAnyAttribute(clazz, localVariableTypeTableAttribute); - } - - - /** - * Visits any type of AnnotationsAttribute of a class. - */ - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - visitAnyAttribute(clazz, annotationsAttribute); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - visitAnyAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - } - - - /** - * Visits the given RuntimeVisibleAnnotationsAttribute of any type of class member. - */ - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Member member, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - visitRuntimeVisibleAnnotationsAttribute(clazz, (Member)field, runtimeVisibleAnnotationsAttribute); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - visitRuntimeVisibleAnnotationsAttribute(clazz, (Member)method, runtimeVisibleAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - visitAnyAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - } - - - /** - * Visits the given RuntimeInvisibleAnnotationsAttribute of any type of class member. - */ - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Member member, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - visitRuntimeInvisibleAnnotationsAttribute(clazz, (Member)field, runtimeInvisibleAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - visitRuntimeInvisibleAnnotationsAttribute(clazz, (Member)method, runtimeInvisibleAnnotationsAttribute); - } - - - /** - * Visits any type of ParameterAnnotationsAttribute. - */ - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - visitAnyAttribute(clazz, parameterAnnotationsAttribute); - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - visitAnyParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - visitAnyParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); - } - - - /** - * Visits any type of TypeAnnotationsAttribute of a class. - */ - public void visitAnyTypeAnnotationsAttribute(Clazz clazz, TypeAnnotationsAttribute typeAnnotationsAttribute) - { - visitAnyAnnotationsAttribute(clazz, typeAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - visitAnyTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - } - - - /** - * Visits the given RuntimeVisibleTypeAnnotationsAttribute of any type of class member. - */ - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Member member, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - visitRuntimeVisibleTypeAnnotationsAttribute(clazz, (Member)field, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - visitRuntimeVisibleTypeAnnotationsAttribute(clazz, (Member)method, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - visitAnyTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - } - - - /** - * Visits the given RuntimeInvisibleTypeAnnotationsAttribute of any type of class member. - */ - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Member member, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, (Member)field, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, (Member)method, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - visitAnyAttribute(clazz, annotationDefaultAttribute); - } - - - // Simplifications for InstructionVisitor. - - /** - * Visits any type of Instruction. - */ - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - visitAnyInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - visitAnyInstruction(clazz, method, codeAttribute, offset, variableInstruction); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - visitAnyInstruction(clazz, method, codeAttribute, offset, constantInstruction); - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - visitAnyInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - - - /** - * Visits either type of SwitchInstruction. - */ - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - visitAnyInstruction(clazz, method, codeAttribute, offset, switchInstruction); - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - visitAnySwitchInstruction(clazz, method, codeAttribute, offset, tableSwitchInstruction); - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - visitAnySwitchInstruction(clazz, method, codeAttribute, offset, lookUpSwitchInstruction); - } - - - // Simplifications for StackMapFrameVisitor. - - /** - * Visits any type of VerificationType. - */ - public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitSameZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameZeroFrame sameZeroFrame) - { - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, sameZeroFrame); - } - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, sameOneFrame); - } - - - public void visitLessZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LessZeroFrame lessZeroFrame) - { - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, lessZeroFrame); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, moreZeroFrame); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - visitAnyStackMapFrame(clazz, method, codeAttribute, offset, fullFrame); - } - - - // Simplifications for VerificationTypeVisitor. - - /** - * Visits any type of VerificationType. - */ - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitIntegerType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, IntegerType integerType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, integerType); - } - - - public void visitFloatType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FloatType floatType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, floatType); - } - - - public void visitLongType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LongType longType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, longType); - } - - - public void visitDoubleType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, DoubleType doubleType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, doubleType); - } - - - public void visitTopType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TopType topType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, topType); - } - - - public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, objectType); - } - - - public void visitNullType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, NullType nullType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, nullType); - } - - - public void visitUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, uninitializedType); - } - - - public void visitUninitializedThisType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedThisType uninitializedThisType) - { - visitAnyVerificationType(clazz, method, codeAttribute, offset, uninitializedThisType); - } - - - public void visitStackIntegerType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, IntegerType integerType) - { - visitIntegerType(clazz, method, codeAttribute, offset, integerType); - } - - - public void visitStackFloatType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, FloatType floatType) - { - visitFloatType(clazz, method, codeAttribute, offset, floatType); - } - - - public void visitStackLongType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, LongType longType) - { - visitLongType(clazz, method, codeAttribute, offset, longType); - } - - - public void visitStackDoubleType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, DoubleType doubleType) - { - visitDoubleType(clazz, method, codeAttribute, offset, doubleType); - } - - - public void visitStackTopType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, TopType topType) - { - visitTopType(clazz, method, codeAttribute, offset, topType); - } - - - public void visitStackObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, ObjectType objectType) - { - visitObjectType(clazz, method, codeAttribute, offset, objectType); - } - - - public void visitStackNullType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, NullType nullType) - { - visitNullType(clazz, method, codeAttribute, offset, nullType); - } - - - public void visitStackUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedType uninitializedType) - { - visitUninitializedType(clazz, method, codeAttribute, offset, uninitializedType); - } - - - public void visitStackUninitializedThisType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedThisType uninitializedThisType) - { - visitUninitializedThisType(clazz, method, codeAttribute, offset, uninitializedThisType); - } - - - - public void visitVariablesIntegerType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, IntegerType integerType) - { - visitIntegerType(clazz, method, codeAttribute, offset, integerType); - } - - - public void visitVariablesFloatType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, FloatType floatType) - { - visitFloatType(clazz, method, codeAttribute, offset, floatType); - } - - - public void visitVariablesLongType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, LongType longType) - { - visitLongType(clazz, method, codeAttribute, offset, longType); - } - - - public void visitVariablesDoubleType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, DoubleType doubleType) - { - visitDoubleType(clazz, method, codeAttribute, offset, doubleType); - } - - - public void visitVariablesTopType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, TopType topType) - { - visitTopType(clazz, method, codeAttribute, offset, topType); - } - - - public void visitVariablesObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, ObjectType objectType) - { - visitObjectType(clazz, method, codeAttribute, offset, objectType); - } - - - public void visitVariablesNullType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, NullType nullType) - { - visitNullType(clazz, method, codeAttribute, offset, nullType); - } - - - public void visitVariablesUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedType uninitializedType) - { - visitUninitializedType(clazz, method, codeAttribute, offset, uninitializedType); - } - - - public void visitVariablesUninitializedThisType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int index, UninitializedThisType uninitializedThisType) - { - visitUninitializedThisType(clazz, method, codeAttribute, offset, uninitializedThisType); - } - - - // Simplifications for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - /** - * Visits the given Annotation of any type of class member. - */ - public void visitAnnotation(Clazz clazz, Member member, Annotation annotation) - { - visitAnnotation(clazz, annotation); - } - - - public void visitAnnotation(Clazz clazz, Field field, Annotation annotation) - { - visitAnnotation(clazz, (Member)field, annotation); - } - - - public void visitAnnotation(Clazz clazz, Method method, Annotation annotation) - { - visitAnnotation(clazz, (Member)method, annotation); - } - - - public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation) - { - visitAnnotation(clazz, method, annotation); - } - - - public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation) - { - visitAnnotation(clazz, method, annotation); - } - - - // Simplifications for TypeAnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - /** - * Visits the given TypeAnnotation of any type of class member. - */ - public void visitTypeAnnotation(Clazz clazz, Member member, TypeAnnotation typeAnnotation) - { - visitTypeAnnotation(clazz, typeAnnotation); - } - - - public void visitTypeAnnotation(Clazz clazz, Field field, TypeAnnotation typeAnnotation) - { - visitTypeAnnotation(clazz, (Member)field, typeAnnotation); - } - - - public void visitTypeAnnotation(Clazz clazz, Method method, TypeAnnotation typeAnnotation) - { - visitTypeAnnotation(clazz, (Member)method, typeAnnotation); - } - - - public void visitTypeAnnotation(Clazz clazz, Method method, int parameterIndex, TypeAnnotation typeAnnotation) - { - visitTypeAnnotation(clazz, method, typeAnnotation); - } - - - public void visitTypeAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation) - { - visitTypeAnnotation(clazz, method, typeAnnotation); - } - - - // Simplifications for TargetInfoVisitor. - - /** - * Visits any type of TargetInfo. - */ - public void visitAnyTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfo targetInfo) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitTypeParameterTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, typeParameterTargetInfo); - } - - - public void visitTypeParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) - { - visitTypeParameterTargetInfo(clazz, typeAnnotation, typeParameterTargetInfo); - } - - - public void visitSuperTypeTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, SuperTypeTargetInfo superTypeTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, superTypeTargetInfo); - } - - - public void visitTypeParameterBoundTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, typeParameterBoundTargetInfo); - } - - - /** - * Visits the given TypeParameterBoundTargetInfo of any type of class member. - */ - public void visitTypeParameterBoundTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - visitTypeParameterBoundTargetInfo(clazz, typeAnnotation, typeParameterBoundTargetInfo); - } - - - public void visitTypeParameterBoundTargetInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - visitTypeParameterBoundTargetInfo(clazz, (Member)field, typeAnnotation, typeParameterBoundTargetInfo); - } - - - public void visitTypeParameterBoundTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - visitTypeParameterBoundTargetInfo(clazz, (Member)method, typeAnnotation, typeParameterBoundTargetInfo); - } - - - /** - * Visits the given EmptyTargetInfo of any type of class member. - */ - public void visitEmptyTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, emptyTargetInfo); - } - - - public void visitEmptyTargetInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) - { - visitEmptyTargetInfo(clazz, (Member)field, typeAnnotation, emptyTargetInfo); - } - - - public void visitEmptyTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) - { - visitEmptyTargetInfo(clazz, (Member)method, typeAnnotation, emptyTargetInfo); - } - - - public void visitFormalParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, FormalParameterTargetInfo formalParameterTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, formalParameterTargetInfo); - } - - - public void visitThrowsTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, ThrowsTargetInfo throwsTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, throwsTargetInfo); - } - - - public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, localVariableTargetInfo); - } - - - public void visitCatchTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo catchTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, catchTargetInfo); - } - - - public void visitOffsetTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, offsetTargetInfo); - } - - - public void visitTypeArgumentTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo typeArgumentTargetInfo) - { - visitAnyTargetInfo(clazz, typeAnnotation, typeArgumentTargetInfo); - } - - - // Simplifications for TypePathInfoVisitor. - - public void visitTypePathInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - /** - * Visits the given TypePathInfo of any type of class member. - */ - public void visitTypePathInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - visitTypePathInfo(clazz, typeAnnotation, typePathInfo); - } - - - public void visitTypePathInfo(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - visitTypePathInfo(clazz, (Member)field, typeAnnotation, typePathInfo); - } - - - public void visitTypePathInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - visitTypePathInfo(clazz, (Member)method, typeAnnotation, typePathInfo); - } - - - public void visitTypePathInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - visitTypePathInfo(clazz, method, typeAnnotation, typePathInfo); - } - - - // Simplifications for ElementValueVisitor. - - /** - * Visits any type of ElementValue. - */ - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) - { - throw new UnsupportedOperationException("Method must be overridden in ["+this.getClass().getName()+"] if ever called"); - } - - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - visitAnyElementValue(clazz, annotation, constantElementValue); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - visitAnyElementValue(clazz, annotation, enumConstantElementValue); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - visitAnyElementValue(clazz, annotation, classElementValue); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - visitAnyElementValue(clazz, annotation, annotationElementValue); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - visitAnyElementValue(clazz, annotation, arrayElementValue); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/StringReferenceInitializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/StringReferenceInitializer.java deleted file mode 100644 index 46376c61..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/StringReferenceInitializer.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This ConstantVisitor initializes any class references of all string constants - * it visits. More specifically, it fills out the references of string constant - * pool entries that happen to refer to a class in the program class pool or in - * the library class pool. - * - * @author Eric Lafortune - */ -public class StringReferenceInitializer -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final ClassPool programClassPool; - private final ClassPool libraryClassPool; - - - /** - * Creates a new StringReferenceInitializer. - */ - public StringReferenceInitializer(ClassPool programClassPool, - ClassPool libraryClassPool) - { - this.programClassPool = programClassPool; - this.libraryClassPool = libraryClassPool; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - if (stringConstant.referencedClass == null) - { - // See if we can find the referenced class. - stringConstant.referencedClass = - findClass(ClassUtil.internalClassName( - ClassUtil.externalBaseType(stringConstant.getString(clazz)))); - } - } - - - // Small utility methods. - - /** - * Returns the class with the given name, either for the program class pool - * or from the library class pool, or null if it can't be found. - */ - private Clazz findClass(String name) - { - // First look for the class in the program class pool. - Clazz clazz = programClassPool.getClass(name); - - // Otherwise look for the class in the library class pool. - if (clazz == null) - { - clazz = libraryClassPool.getClass(name); - } - - return clazz; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/StringSharer.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/StringSharer.java deleted file mode 100644 index 4cf100eb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/StringSharer.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor shares strings in the class files that it visits. - * - * @author Eric Lafortune - */ -public class StringSharer -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - AttributeVisitor -{ - // A fields acting as an argument for the visitor methods. - private String name; - private String type; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Replace name strings in the constant pool by shared strings. - programClass.constantPoolEntriesAccept(this); - - // Replace attribute name strings in the constant pool by internalized - // strings. - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Replace the super class name string by the shared name string. - Clazz superClass = libraryClass.superClass; - if (superClass != null) - { - libraryClass.superClassName = superClass.getName(); - } - - // Replace the interface name strings by the shared name strings. - if (libraryClass.interfaceNames != null) - { - String[] interfaceNames = libraryClass.interfaceNames; - Clazz[] interfaceClasses = new Clazz[interfaceNames.length]; - - for (int index = 0; index < interfaceNames.length; index++) - { - // Keep a reference to the interface class. - Clazz interfaceClass = interfaceClasses[index]; - if (interfaceClass != null) - { - interfaceNames[index] = interfaceClass.getName(); - } - } - } - } - - - // Implementations for ConstantVisitor. - - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - Member referencedMember = stringConstant.referencedMember; - if (referencedMember != null) - { - Clazz referencedClass = stringConstant.referencedClass; - - // Put the actual class member's name in the class pool. - name = referencedMember.getName(referencedClass); - clazz.constantPoolEntryAccept(stringConstant.u2stringIndex, this); - } - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - Member referencedMember = refConstant.referencedMember; - if (referencedMember != null) - { - Clazz referencedClass = refConstant.referencedClass; - - // Put the actual class member's name and type strings in the class - // pool. - name = referencedMember.getName(referencedClass); - type = referencedMember.getDescriptor(referencedClass); - clazz.constantPoolEntryAccept(refConstant.u2nameAndTypeIndex, this); - } - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - if (name != null) - { - // Put the actual class member's name and type strings in the class - // pool. - clazz.constantPoolEntryAccept(nameAndTypeConstant.u2nameIndex, this); - name = type; - clazz.constantPoolEntryAccept(nameAndTypeConstant.u2descriptorIndex, this); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - Clazz referencedClass = classConstant.referencedClass; - if (referencedClass != null) - { - // Put the actual class's name string in the class pool. - name = referencedClass.getName(); - clazz.constantPoolEntryAccept(classConstant.u2nameIndex, this); - } - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - // Do we have a new string to put into this constant? - if (name != null) - { - // Replace the string, if it's actually the same. - if (name.equals(utf8Constant.getString())) - { - utf8Constant.setString(name); - } - - name = null; - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - // Put the internalized attribute's name string in the class pool. - name = attribute.getAttributeName(clazz).intern(); - clazz.constantPoolEntryAccept(attribute.u2attributeNameIndex, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/WarningPrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/WarningPrinter.java deleted file mode 100644 index c2298cd1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/WarningPrinter.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.util; - -import proguard.util.*; - -import java.io.PrintStream; -import java.util.List; - -/** - * This class prints out and counts warnings. - * - * @author Eric Lafortune - */ -public class WarningPrinter -{ - private final PrintStream printStream; - private final StringMatcher classFilter; - private int warningCount; - - - /** - * Creates a new WarningPrinter that prints to the System.err print stream. - */ - public WarningPrinter() - { - this(System.err); - } - - - /** - * Creates a new WarningPrinter that prints to the given print stream. - */ - public WarningPrinter(PrintStream printStream) - { - this.printStream = printStream; - this.classFilter = null; - } - - - /** - * Creates a new WarningPrinter that prints to the given print stream, - * except if the names of any involved classes matches the given filter. - */ - public WarningPrinter(PrintStream printStream, List classFilter) - { - this.printStream = printStream; - this.classFilter = classFilter == null ? null : - new ListParser(new ClassNameParser()).parse(classFilter); - } - - - /** - * Prints out the given warning and increments the warning count, if - * the given class name passes the class name filter. - */ - public void print(String className, String warning) - { - if (accepts(className)) - { - print(warning); - } - } - - - /** - * Returns whether the given class name passes the class name filter. - */ - public boolean accepts(String className) - { - return classFilter == null || - !classFilter.matches(className); - } - - - /** - * Prints out the given warning and increments the warning count, if - * the given class names pass the class name filter. - */ - public void print(String className1, String className2, String warning) - { - if (accepts(className1, className2)) - { - print(warning); - } - } - - - /** - * Returns whether the given class names pass the class name filter. - */ - public boolean accepts(String className1, String className2) - { - return classFilter == null || - !(classFilter.matches(className1) || - classFilter.matches(className2)); - } - - - /** - * Prints out the given warning and increments the warning count. - */ - private void print(String warning) - { - printStream.println(warning); - - warningCount++; - } - - - /** - * Returns the number of warnings printed so far. - */ - public int getWarningCount() - { - return warningCount; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/package.html deleted file mode 100644 index b1b881ec..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/util/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains utility classes for processing class files. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllClassVisitor.java deleted file mode 100644 index c2471d9c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllClassVisitor.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.ClassPool; - - -/** - * This ClassPoolVisitor lets a given ClassVisitor visit all Clazz - * objects of the class pools it visits. - * - * @author Eric Lafortune - */ -public class AllClassVisitor implements ClassPoolVisitor -{ - private final ClassVisitor classVisitor; - - - public AllClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - public void visitClassPool(ClassPool classPool) - { - classPool.classesAccept(classVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllFieldVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllFieldVisitor.java deleted file mode 100644 index c86a0d21..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllFieldVisitor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor lets a given MemberVisitor visit all FieldMember - * objects of the classes it visits. - * - * @author Eric Lafortune - */ -public class AllFieldVisitor implements ClassVisitor -{ - private final MemberVisitor memberVisitor; - - - public AllFieldVisitor(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.fieldsAccept(memberVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.fieldsAccept(memberVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllMemberVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllMemberVisitor.java deleted file mode 100644 index c3aa5572..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllMemberVisitor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor lets a given MemberVisitor visit all Member - * objects of the classes it visits. - * - * @author Eric Lafortune - */ -public class AllMemberVisitor implements ClassVisitor -{ - private final MemberVisitor memberVisitor; - - - public AllMemberVisitor(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.fieldsAccept(memberVisitor); - programClass.methodsAccept(memberVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.fieldsAccept(memberVisitor); - libraryClass.methodsAccept(memberVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllMethodVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllMethodVisitor.java deleted file mode 100644 index 346c4fa4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/AllMethodVisitor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor lets a given MemberVisitor visit all MethodMember - * objects of the classes it visits. - * - * @author Eric Lafortune - */ -public class AllMethodVisitor implements ClassVisitor -{ - private final MemberVisitor memberVisitor; - - - public AllMethodVisitor(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.methodsAccept(memberVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.methodsAccept(memberVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/BottomClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/BottomClassFilter.java deleted file mode 100644 index 5a0c4186..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/BottomClassFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, but only when visiting classes that don't - * have any subclasses. - * - * @author Eric Lafortune - */ -public class BottomClassFilter implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new ProgramClassFilter. - * @param classVisitor the ClassVisitor to which visits - * will be delegated. - */ - public BottomClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Is this a bottom class in the class hierarchy? - if (programClass.subClasses == null) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Is this a bottom class in the class hierarchy? - if (libraryClass.subClasses == null) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassAccessFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassAccessFilter.java deleted file mode 100644 index ffca52fe..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassAccessFilter.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, but only when the visited class - * has the proper access flags. - * - * @see ClassConstants - * - * @author Eric Lafortune - */ -public class ClassAccessFilter implements ClassVisitor -{ - private final int requiredSetAccessFlags; - private final int requiredUnsetAccessFlags; - private final ClassVisitor classVisitor; - - - /** - * Creates a new ClassAccessFilter. - * @param requiredSetAccessFlags the class access flags that should be - * set. - * @param requiredUnsetAccessFlags the class access flags that should be - * unset. - * @param classVisitor the ClassVisitor to - * which visits will be delegated. - */ - public ClassAccessFilter(int requiredSetAccessFlags, - int requiredUnsetAccessFlags, - ClassVisitor classVisitor) - { - this.requiredSetAccessFlags = requiredSetAccessFlags; - this.requiredUnsetAccessFlags = requiredUnsetAccessFlags; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (accepted(programClass.getAccessFlags())) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (accepted(libraryClass.getAccessFlags())) - { - classVisitor.visitLibraryClass(libraryClass); - } - } - - - // Small utility methods. - - private boolean accepted(int accessFlags) - { - return (requiredSetAccessFlags & ~accessFlags) == 0 && - (requiredUnsetAccessFlags & accessFlags) == 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCleaner.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCleaner.java deleted file mode 100644 index 8f2ee4b8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCleaner.java +++ /dev/null @@ -1,364 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ClassVisitor removes all visitor information of the - * classes it visits. - * - * @author Eric Lafortune - */ -public class ClassCleaner -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor, - AttributeVisitor, - BootstrapMethodInfoVisitor, - ExceptionInfoVisitor, - InnerClassesInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - AnnotationVisitor, - TypeAnnotationVisitor, - ElementValueVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - clean(programClass); - - programClass.constantPoolEntriesAccept(this); - - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - clean(libraryClass); - - libraryClass.fieldsAccept(this); - libraryClass.methodsAccept(this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - clean(constant); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - clean(programMember); - - programMember.attributesAccept(programClass, this); - } - - - public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) - { - clean(libraryMember); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - clean(attribute); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - clean(bootstrapMethodsAttribute); - - bootstrapMethodsAttribute.bootstrapMethodEntriesAccept(clazz, this); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - clean(innerClassesAttribute); - - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - clean(methodParametersAttribute); - - methodParametersAttribute.parametersAccept(clazz, method, this); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - clean(exceptionsAttribute); - - exceptionsAttribute.exceptionEntriesAccept((ProgramClass)clazz, this); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - clean(codeAttribute); - - codeAttribute.exceptionsAccept(clazz, method, this); - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - clean(stackMapAttribute); - - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - clean(stackMapTableAttribute); - - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - clean(localVariableTableAttribute); - - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - clean(localVariableTypeTableAttribute); - - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - clean(annotationsAttribute); - - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - clean(parameterAnnotationsAttribute); - - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnyTypeAnnotationsAttribute(Clazz clazz, TypeAnnotationsAttribute typeAnnotationsAttribute) - { - clean(typeAnnotationsAttribute); - - typeAnnotationsAttribute.typeAnnotationsAccept(clazz, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - clean(annotationDefaultAttribute); - - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - clean(bootstrapMethodInfo); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - clean(innerClassesInfo); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - clean(exceptionInfo); - } - - - // Implementations for StackMapFrameVisitor. - - public void visitSameZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameZeroFrame sameZeroFrame) - { - clean(sameZeroFrame); - } - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - clean(sameOneFrame); - - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitLessZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LessZeroFrame lessZeroFrame) - { - clean(lessZeroFrame); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - clean(moreZeroFrame); - - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - clean(fullFrame); - - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) - { - clean(verificationType); - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - clean(parameterInfo); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - clean(localVariableInfo); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - clean(localVariableTypeInfo); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - clean(annotation); - - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for TypeAnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - clean(typeAnnotation); - - //typeAnnotation.targetInfoAccept(clazz, this); - //typeAnnotation.typePathInfosAccept(clazz, this); - typeAnnotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) - { - clean(elementValue); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - clean(annotationElementValue); - - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - clean(arrayElementValue); - } - - - // Small utility methods. - - private void clean(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(null); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCollector.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCollector.java deleted file mode 100644 index 0e9b628c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCollector.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Set; - -/** - * This ClassVisitor collects the classes that it visits in the - * given collection. - * - * @author Eric Lafortune - */ -public class ClassCollector -extends SimplifiedVisitor -implements ClassVisitor -{ - private final Set set; - - - /** - * Creates a new ClassCollector. - * @param set the Set in which all class names will be - * collected. - */ - public ClassCollector(Set set) - { - this.set = set; - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - set.add(clazz); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCounter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCounter.java deleted file mode 100644 index d765c353..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassCounter.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor counts the number of classes that has been visited. - * - * @author Eric Lafortune - */ -public class ClassCounter implements ClassVisitor -{ - private int count; - - - /** - * Returns the number of classes that has been visited so far. - */ - public int getCount() - { - return count; - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) - { - count++; - } - - - public void visitProgramClass(ProgramClass programClass) - { - count++; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassHierarchyTraveler.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassHierarchyTraveler.java deleted file mode 100644 index 8511121c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassHierarchyTraveler.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor lets a given ClassVisitor - * optionally travel to the visited class, its superclass, its interfaces, and - * its subclasses. - * - * @author Eric Lafortune - */ -public class ClassHierarchyTraveler implements ClassVisitor -{ - private final boolean visitThisClass; - private final boolean visitSuperClass; - private final boolean visitInterfaces; - private final boolean visitSubclasses; - - private final ClassVisitor classVisitor; - - - /** - * Creates a new ClassHierarchyTraveler. - * @param visitThisClass specifies whether to visit the originally visited - * classes. - * @param visitSuperClass specifies whether to visit the super classes of - * the visited classes. - * @param visitInterfaces specifies whether to visit the interfaces of - * the visited classes. - * @param visitSubclasses specifies whether to visit the subclasses of - * the visited classes. - * @param classVisitor the ClassVisitor to - * which visits will be delegated. - */ - public ClassHierarchyTraveler(boolean visitThisClass, - boolean visitSuperClass, - boolean visitInterfaces, - boolean visitSubclasses, - ClassVisitor classVisitor) - { - this.visitThisClass = visitThisClass; - this.visitSuperClass = visitSuperClass; - this.visitInterfaces = visitInterfaces; - this.visitSubclasses = visitSubclasses; - - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.hierarchyAccept(visitThisClass, - visitSuperClass, - visitInterfaces, - visitSubclasses, - classVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.hierarchyAccept(visitThisClass, - visitSuperClass, - visitInterfaces, - visitSubclasses, - classVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassNameFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassNameFilter.java deleted file mode 100644 index 3db4756a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassNameFilter.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.util.*; - -import java.util.List; - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, but only when the visited class has a name that - * matches a given regular expression. - * - * @author Eric Lafortune - */ -public class ClassNameFilter implements ClassVisitor -{ - private final StringMatcher regularExpressionMatcher; - private final ClassVisitor classVisitor; - - - /** - * Creates a new ClassNameFilter. - * @param regularExpression the regular expression against which class - * names will be matched. - * @param classVisitor the ClassVisitor to which - * visits will be delegated. - */ - public ClassNameFilter(String regularExpression, - ClassVisitor classVisitor) - { - this(regularExpression, null, classVisitor); - } - - - /** - * Creates a new ClassNameFilter. - * @param regularExpression the regular expression against which class - * names will be matched. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - * @param classVisitor the ClassVisitor to which - * visits will be delegated. - */ - public ClassNameFilter(String regularExpression, - List variableStringMatchers, - ClassVisitor classVisitor) - { - this(new ListParser(new ClassNameParser(variableStringMatchers)).parse(regularExpression), - classVisitor); - } - - - /** - * Creates a new ClassNameFilter. - * @param regularExpression the regular expression against which class - * names will be matched. - * @param classVisitor the ClassVisitor to which - * visits will be delegated. - */ - public ClassNameFilter(List regularExpression, - ClassVisitor classVisitor) - { - this(regularExpression, null, classVisitor); - } - - - /** - * Creates a new ClassNameFilter. - * @param regularExpression the regular expression against which class - * names will be matched. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - * @param classVisitor the ClassVisitor to which - * visits will be delegated. - */ - public ClassNameFilter(List regularExpression, - List variableStringMatchers, - ClassVisitor classVisitor) - { - this(new ListParser(new ClassNameParser(variableStringMatchers)).parse(regularExpression), - classVisitor); - } - - - /** - * Creates a new ClassNameFilter. - * @param regularExpressionMatcher the string matcher against which - * class names will be matched. - * @param classVisitor the ClassVisitor to which - * visits will be delegated. - */ - public ClassNameFilter(StringMatcher regularExpressionMatcher, - ClassVisitor classVisitor) - { - this.regularExpressionMatcher = regularExpressionMatcher; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (accepted(programClass.getName())) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (accepted(libraryClass.getName())) - { - classVisitor.visitLibraryClass(libraryClass); - } - } - - - // Small utility methods. - - private boolean accepted(String name) - { - return regularExpressionMatcher.matches(name); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolClassVisitor.java deleted file mode 100644 index 0b0f8300..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolClassVisitor.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassPoolVisitor and ClassVisitor remembers the ClassPool instances - * that it visits and applies the given ClassPoolVisitor to the most - * recently remembered one, every time it visits a Clazz instance. - * - * @author Eric Lafortune - */ -public class ClassPoolClassVisitor -implements ClassPoolVisitor, - ClassVisitor -{ - private ClassPoolVisitor classPoolVisitor; - private ClassPool classPool; - - - /** - * Creates a new ClassPoolClassVisitor. - * @param classPoolVisitor - */ - public ClassPoolClassVisitor(ClassPoolVisitor classPoolVisitor) - { - this.classPoolVisitor = classPoolVisitor; - } - - - // Implementations for ClassPoolVisitor. - - public void visitClassPool(ClassPool classPool) - { - this.classPool = classPool; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - classPoolVisitor.visitClassPool(classPool); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - classPoolVisitor.visitClassPool(classPool); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolFiller.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolFiller.java deleted file mode 100644 index 94c59901..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolFiller.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; - - -/** - * This ClassVisitor collects all the classes it visits in a given - * class pool. - * - * @author Eric Lafortune - */ -public class ClassPoolFiller -extends SimplifiedVisitor -implements ClassVisitor -{ - private final ClassPool classPool; - - - /** - * Creates a new ClassPoolFiller. - */ - public ClassPoolFiller(ClassPool classPool) - { - this.classPool = classPool; - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - classPool.addClass(clazz); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolRemover.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolRemover.java deleted file mode 100644 index c2afda14..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolRemover.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ClassVisitor removes all the classes it visits from a given - * class pool. - * - * @author Eric Lafortune - */ -public class ClassPoolRemover -extends SimplifiedVisitor -implements ClassVisitor -{ - private final ClassPool classPool; - - - /** - * Creates a new ClassPoolFiller. - */ - public ClassPoolRemover(ClassPool classPool) - { - this.classPool = classPool; - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - classPool.removeClass(clazz); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolVisitor.java deleted file mode 100644 index b37f6f73..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPoolVisitor.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.ClassPool; - - -/** - * This interface specifies the methods for a visitor of - * ClassPool objects. Note that there is only a single - * implementation of ClassPool, such that this interface - * is not strictly necessary as a visitor. - * - * @author Eric Lafortune - */ -public interface ClassPoolVisitor -{ - public void visitClassPool(ClassPool classPool); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPresenceFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPresenceFilter.java deleted file mode 100644 index 592db812..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPresenceFilter.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates its visits to one of two - * ClassVisitor instances, depending on whether the name of - * the visited class file is present in a given ClassPool or not. - * - * @author Eric Lafortune - */ -public class ClassPresenceFilter implements ClassVisitor -{ - private final ClassPool classPool; - private final ClassVisitor presentClassVisitor; - private final ClassVisitor missingClassVisitor; - - - /** - * Creates a new ClassPresenceFilter. - * @param classPool the ClassPool in which the - * presence will be tested. - * @param presentClassVisitor the ClassVisitor to which visits - * of present class files will be delegated. - * @param missingClassVisitor the ClassVisitor to which visits - * of missing class files will be delegated. - */ - public ClassPresenceFilter(ClassPool classPool, - ClassVisitor presentClassVisitor, - ClassVisitor missingClassVisitor) - { - this.classPool = classPool; - this.presentClassVisitor = presentClassVisitor; - this.missingClassVisitor = missingClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - ClassVisitor classFileVisitor = classFileVisitor(programClass); - - if (classFileVisitor != null) - { - classFileVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - ClassVisitor classFileVisitor = classFileVisitor(libraryClass); - - if (classFileVisitor != null) - { - classFileVisitor.visitLibraryClass(libraryClass); - } - } - - - // Small utility methods. - - /** - * Returns the appropriate ClassVisitor. - */ - private ClassVisitor classFileVisitor(Clazz clazz) - { - return classPool.getClass(clazz.getName()) != null ? - presentClassVisitor : - missingClassVisitor; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPrinter.java deleted file mode 100644 index 38014ca5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassPrinter.java +++ /dev/null @@ -1,1357 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.target.*; -import proguard.classfile.attribute.annotation.target.visitor.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.module.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; - -import java.io.PrintWriter; - - -/** - * This ClassVisitor prints out the complete internal - * structure of the classes it visits. - * - * @author Eric Lafortune - */ -public class ClassPrinter -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor, - AttributeVisitor, - BootstrapMethodInfoVisitor, - InnerClassesInfoVisitor, - ExceptionInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - LineNumberInfoVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - RequiresInfoVisitor, - ExportsInfoVisitor, - OpensInfoVisitor, - ProvidesInfoVisitor, - AnnotationVisitor, - TypeAnnotationVisitor, - TargetInfoVisitor, - LocalVariableTargetElementVisitor, - TypePathInfoVisitor, - ElementValueVisitor, - InstructionVisitor -{ - private static final String INDENTATION = " "; - - private final PrintWriter pw; - - private int indentation; - - - /** - * Creates a new ClassPrinter that prints to the standard output. - */ - public ClassPrinter() - { - // We're using the system's default character encoding for writing to - // the standard output. - this(new PrintWriter(System.out, true)); - } - - - /** - * Creates a new ClassPrinter that prints to the given writer. - */ - public ClassPrinter(PrintWriter printWriter) - { - pw = printWriter; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - println("_____________________________________________________________________"); - println(visitorInfo(programClass) + " " + - "Program class: " + programClass.getName()); - indent(); - println("Superclass: " + programClass.getSuperName()); - println("Major version: 0x" + Integer.toHexString(ClassUtil.internalMajorClassVersion(programClass.u4version))); - println("Minor version: 0x" + Integer.toHexString(ClassUtil.internalMinorClassVersion(programClass.u4version))); - println(" = target " + ClassUtil.externalClassVersion(programClass.u4version)); - println("Access flags: 0x" + Integer.toHexString(programClass.u2accessFlags)); - println(" = " + - ClassUtil.externalClassAccessFlags(programClass.u2accessFlags) + - ((programClass.u2accessFlags & (ClassConstants.ACC_ENUM | - ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_MODULE)) == 0 ? "class " : "") + - ClassUtil.externalClassName(programClass.getName()) + - (programClass.u2superClass == 0 ? "" : " extends " + - ClassUtil.externalClassName(programClass.getSuperName()))); - outdent(); - println(); - - println("Interfaces (count = " + programClass.u2interfacesCount + "):"); - indent(); - programClass.interfaceConstantsAccept(this); - outdent(); - println(); - - println("Constant Pool (count = " + programClass.u2constantPoolCount + "):"); - indent(); - programClass.constantPoolEntriesAccept(this); - outdent(); - println(); - - println("Fields (count = " + programClass.u2fieldsCount + "):"); - indent(); - programClass.fieldsAccept(this); - outdent(); - println(); - - println("Methods (count = " + programClass.u2methodsCount + "):"); - indent(); - programClass.methodsAccept(this); - outdent(); - println(); - - println("Class file attributes (count = " + programClass.u2attributesCount + "):"); - indent(); - programClass.attributesAccept(this); - outdent(); - println(); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - println("_____________________________________________________________________"); - println(visitorInfo(libraryClass) + " " + - "Library class: " + libraryClass.getName()); - indent(); - println("Superclass: " + libraryClass.getSuperName()); - println("Access flags: 0x" + Integer.toHexString(libraryClass.u2accessFlags)); - println(" = " + - ClassUtil.externalClassAccessFlags(libraryClass.u2accessFlags) + - ((libraryClass.u2accessFlags & (ClassConstants.ACC_ENUM | - ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_MODULE)) == 0 ? "class " : "") + - ClassUtil.externalClassName(libraryClass.getName()) + - (libraryClass.getSuperName() == null ? "" : " extends " + - ClassUtil.externalClassName(libraryClass.getSuperName()))); - outdent(); - println(); - - println("Interfaces (count = " + libraryClass.interfaceClasses.length + "):"); - for (int index = 0; index < libraryClass.interfaceClasses.length; index++) - { - Clazz interfaceClass = libraryClass.interfaceClasses[index]; - if (interfaceClass != null) - { - println(" + " + interfaceClass.getName()); - } - } - - println("Fields (count = " + libraryClass.fields.length + "):"); - libraryClass.fieldsAccept(this); - - println("Methods (count = " + libraryClass.methods.length + "):"); - libraryClass.methodsAccept(this); - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - println(visitorInfo(integerConstant) + " Integer [" + - integerConstant.getValue() + "]"); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - println(visitorInfo(longConstant) + " Long [" + - longConstant.getValue() + "]"); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - println(visitorInfo(floatConstant) + " Float [" + - floatConstant.getValue() + "]"); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - println(visitorInfo(doubleConstant) + " Double [" + - doubleConstant.getValue() + "]"); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - println(visitorInfo(primitiveArrayConstant) + " PrimitiveArray " + - primitiveArrayConstant.getPrimitiveType() + "[" + - primitiveArrayConstant.getLength() + "]"); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - println(visitorInfo(stringConstant) + " String [" + - stringConstant.getString(clazz) + "]"); - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - println(visitorInfo(utf8Constant) + " Utf8 [" + - utf8Constant.getString() + "]"); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - println(visitorInfo(invokeDynamicConstant) + " InvokeDynamic [bootstrap method index = " + invokeDynamicConstant.u2bootstrapMethodAttributeIndex + "]:"); - - indent(); - clazz.constantPoolEntryAccept(invokeDynamicConstant.u2nameAndTypeIndex, this); - outdent(); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - println(visitorInfo(methodHandleConstant) + " MethodHandle [kind = " + methodHandleConstant.u1referenceKind + "]:"); - - indent(); - clazz.constantPoolEntryAccept(methodHandleConstant.u2referenceIndex, this); - outdent(); - } - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - println(visitorInfo(moduleConstant) + " Module [" + - moduleConstant.getName(clazz) + "]"); - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - println(visitorInfo(packageConstant) + " Package [" + - packageConstant.getName(clazz) + "]"); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - println(visitorInfo(fieldrefConstant) + " Fieldref [" + - clazz.getClassName(fieldrefConstant.u2classIndex) + "." + - clazz.getName(fieldrefConstant.u2nameAndTypeIndex) + " " + - clazz.getType(fieldrefConstant.u2nameAndTypeIndex) + "]"); - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - println(visitorInfo(interfaceMethodrefConstant) + " InterfaceMethodref [" + - clazz.getClassName(interfaceMethodrefConstant.u2classIndex) + "." + - clazz.getName(interfaceMethodrefConstant.u2nameAndTypeIndex) + " " + - clazz.getType(interfaceMethodrefConstant.u2nameAndTypeIndex) + "]"); - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - println(visitorInfo(methodrefConstant) + " Methodref [" + - clazz.getClassName(methodrefConstant.u2classIndex) + "." + - clazz.getName(methodrefConstant.u2nameAndTypeIndex) + " " + - clazz.getType(methodrefConstant.u2nameAndTypeIndex) + "]"); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - println(visitorInfo(classConstant) + " Class [" + - classConstant.getName(clazz) + "]"); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - println(visitorInfo(methodTypeConstant) + " MethodType [" + - methodTypeConstant.getType(clazz) + "]"); - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - println(visitorInfo(nameAndTypeConstant) + " NameAndType [" + - nameAndTypeConstant.getName(clazz) + " " + - nameAndTypeConstant.getType(clazz) + "]"); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - println(visitorInfo(programField) + " " + - "Field: " + - programField.getName(programClass) + " " + - programField.getDescriptor(programClass)); - - indent(); - println("Access flags: 0x" + Integer.toHexString(programField.u2accessFlags)); - println(" = " + - ClassUtil.externalFullFieldDescription(programField.u2accessFlags, - programField.getName(programClass), - programField.getDescriptor(programClass))); - - visitMember(programClass, programField); - outdent(); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - println(visitorInfo(programMethod) + " " + - "Method: " + - programMethod.getName(programClass) + - programMethod.getDescriptor(programClass)); - - indent(); - println("Access flags: 0x" + Integer.toHexString(programMethod.u2accessFlags)); - println(" = " + - ClassUtil.externalFullMethodDescription(programClass.getName(), - programMethod.u2accessFlags, - programMethod.getName(programClass), - programMethod.getDescriptor(programClass))); - - visitMember(programClass, programMethod); - outdent(); - } - - - private void visitMember(ProgramClass programClass, ProgramMember programMember) - { - if (programMember.u2attributesCount > 0) - { - println("Class member attributes (count = " + programMember.u2attributesCount + "):"); - programMember.attributesAccept(programClass, this); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - println(visitorInfo(libraryField) + " " + - "Field: " + - libraryField.getName(libraryClass) + " " + - libraryField.getDescriptor(libraryClass)); - - indent(); - println("Access flags: 0x" + Integer.toHexString(libraryField.u2accessFlags)); - println(" = " + - ClassUtil.externalFullFieldDescription(libraryField.u2accessFlags, - libraryField.getName(libraryClass), - libraryField.getDescriptor(libraryClass))); - outdent(); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - println(visitorInfo(libraryMethod) + " " + - "Method: " + - libraryMethod.getName(libraryClass) + " " + - libraryMethod.getDescriptor(libraryClass)); - - indent(); - println("Access flags: 0x" + Integer.toHexString(libraryMethod.u2accessFlags)); - println(" = " + - ClassUtil.externalFullMethodDescription(libraryClass.getName(), - libraryMethod.u2accessFlags, - libraryMethod.getName(libraryClass), - libraryMethod.getDescriptor(libraryClass))); - outdent(); - } - - - // Implementations for AttributeVisitor. - // Note that attributes are typically only referenced once, so we don't - // test if they are marked already. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - println(visitorInfo(unknownAttribute) + - " Unknown attribute (" + unknownAttribute.getAttributeName(clazz) + ")"); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - println(visitorInfo(bootstrapMethodsAttribute) + - " Bootstrap methods attribute (count = " + bootstrapMethodsAttribute.u2bootstrapMethodsCount + "):"); - - indent(); - bootstrapMethodsAttribute.bootstrapMethodEntriesAccept(clazz, this); - outdent(); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - println(visitorInfo(sourceFileAttribute) + - " Source file attribute:"); - - indent(); - clazz.constantPoolEntryAccept(sourceFileAttribute.u2sourceFileIndex, this); - outdent(); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - println(visitorInfo(sourceDirAttribute) + - " Source dir attribute:"); - - indent(); - clazz.constantPoolEntryAccept(sourceDirAttribute.u2sourceDirIndex, this); - outdent(); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - println(visitorInfo(innerClassesAttribute) + - " Inner classes attribute (count = " + innerClassesAttribute.u2classesCount + "):"); - - indent(); - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - outdent(); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - println(visitorInfo(enclosingMethodAttribute) + - " Enclosing method attribute:"); - - indent(); - clazz.constantPoolEntryAccept(enclosingMethodAttribute.u2classIndex, this); - - if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) - { - clazz.constantPoolEntryAccept(enclosingMethodAttribute.u2nameAndTypeIndex, this); - } - outdent(); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - println(visitorInfo(moduleAttribute) + - " Module attribute:"); - - indent(); - clazz.constantPoolEntryAccept(moduleAttribute.u2moduleNameIndex, this); - println("Access flags: 0x" + - Integer.toHexString(moduleAttribute.u2moduleFlags) + - " = " + - ClassUtil.externalModuleAccessFlags(moduleAttribute.u2moduleFlags)); - - if (moduleAttribute.u2moduleVersionIndex != 0) - { - clazz.constantPoolEntryAccept(moduleAttribute.u2moduleVersionIndex, this); - } - println("Requires:"); - moduleAttribute.requiresAccept(clazz, this); - println("Exports:"); - moduleAttribute.exportsAccept(clazz, this); - println("Opens:"); - moduleAttribute.opensAccept(clazz, this); - println("Uses services:"); - - for (int index = 0; index < moduleAttribute.u2usesCount; index++) - { - clazz.constantPoolEntryAccept(moduleAttribute.u2uses[index], this); - } - - println("Provides services:"); - moduleAttribute.providesAccept(clazz, this); - outdent(); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - println(visitorInfo(moduleMainClassAttribute) + - " Module main class attribute:"); - - indent(); - clazz.constantPoolEntryAccept(moduleMainClassAttribute.u2mainClass, this); - outdent(); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - println(visitorInfo(modulePackagesAttribute) + - " Module packages attribute (count = " + modulePackagesAttribute.u2packagesCount + "):"); - - indent(); - modulePackagesAttribute.packagesAccept(clazz, this); - outdent(); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - println(visitorInfo(deprecatedAttribute) + - " Deprecated attribute"); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - println(visitorInfo(syntheticAttribute) + - " Synthetic attribute"); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - println(visitorInfo(signatureAttribute) + - " Signature attribute:"); - - indent(); - clazz.constantPoolEntryAccept(signatureAttribute.u2signatureIndex, this); - outdent(); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - println(visitorInfo(constantValueAttribute) + - " Constant value attribute:"); - - clazz.constantPoolEntryAccept(constantValueAttribute.u2constantValueIndex, this); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - println(visitorInfo(methodParametersAttribute) + - " Method parameters attribute (count = " + methodParametersAttribute.u1parametersCount + "):"); - - indent(); - methodParametersAttribute.parametersAccept(clazz, method, this); - outdent(); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - println(visitorInfo(exceptionsAttribute) + - " Exceptions attribute (count = " + exceptionsAttribute.u2exceptionIndexTableLength + "):"); - - indent(); - exceptionsAttribute.exceptionEntriesAccept(clazz, this); - outdent(); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - println(visitorInfo(codeAttribute) + - " Code attribute instructions (code length = "+ codeAttribute.u4codeLength + - ", locals = "+ codeAttribute.u2maxLocals + - ", stack = "+ codeAttribute.u2maxStack + "):"); - - indent(); - - codeAttribute.instructionsAccept(clazz, method, this); - - println("Code attribute exceptions (count = " + - codeAttribute.u2exceptionTableLength + "):"); - - codeAttribute.exceptionsAccept(clazz, method, this); - - println("Code attribute attributes (attribute count = " + - codeAttribute.u2attributesCount + "):"); - - codeAttribute.attributesAccept(clazz, method, this); - - outdent(); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - println(visitorInfo(codeAttribute) + - " Stack map attribute (count = "+ - stackMapAttribute.u2stackMapFramesCount + "):"); - - indent(); - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - outdent(); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - println(visitorInfo(codeAttribute) + - " Stack map table attribute (count = "+ - stackMapTableAttribute.u2stackMapFramesCount + "):"); - - indent(); - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - outdent(); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - println(visitorInfo(lineNumberTableAttribute) + - " Line number table attribute (count = " + - lineNumberTableAttribute.u2lineNumberTableLength + "):"); - - indent(); - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this); - outdent(); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - println(visitorInfo(localVariableTableAttribute) + - " Local variable table attribute (count = " + - localVariableTableAttribute.u2localVariableTableLength + "):"); - - indent(); - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - outdent(); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - println(visitorInfo(localVariableTypeTableAttribute) + - " Local variable type table attribute (count = "+ - localVariableTypeTableAttribute.u2localVariableTypeTableLength + "):"); - - indent(); - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - outdent(); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - println(visitorInfo(runtimeVisibleAnnotationsAttribute) + - " Runtime visible annotations attribute:"); - - indent(); - runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, this); - outdent(); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - println(visitorInfo(runtimeInvisibleAnnotationsAttribute) + - " Runtime invisible annotations attribute:"); - - indent(); - runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, this); - outdent(); - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - println(visitorInfo(runtimeVisibleParameterAnnotationsAttribute) + - " Runtime visible parameter annotations attribute (parameter count = " + runtimeVisibleParameterAnnotationsAttribute.u1parametersCount + "):"); - - indent(); - runtimeVisibleParameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - outdent(); - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - println(visitorInfo(runtimeInvisibleParameterAnnotationsAttribute) + - " Runtime invisible parameter annotations attribute (parameter count = " + runtimeInvisibleParameterAnnotationsAttribute.u1parametersCount + "):"); - - indent(); - runtimeInvisibleParameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - outdent(); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - println(visitorInfo(runtimeVisibleTypeAnnotationsAttribute) + - " Runtime visible type annotations attribute"); - - indent(); - runtimeVisibleTypeAnnotationsAttribute.typeAnnotationsAccept(clazz, this); - outdent(); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - println(visitorInfo(runtimeInvisibleTypeAnnotationsAttribute) + - " Runtime invisible type annotations attribute"); - - indent(); - runtimeInvisibleTypeAnnotationsAttribute.typeAnnotationsAccept(clazz, this); - outdent(); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - println(visitorInfo(annotationDefaultAttribute) + - " Annotation default attribute:"); - - indent(); - annotationDefaultAttribute.defaultValueAccept(clazz, this); - outdent(); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - println(visitorInfo(bootstrapMethodInfo) + - " BootstrapMethodInfo (argument count = " + - bootstrapMethodInfo.u2methodArgumentCount+ "):"); - - indent(); - clazz.constantPoolEntryAccept(bootstrapMethodInfo.u2methodHandleIndex, this); - bootstrapMethodInfo.methodArgumentsAccept(clazz, this); - outdent(); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - println(visitorInfo(innerClassesInfo) + - " InnerClassesInfo:"); - - indent(); - println("Access flags: 0x" + Integer.toHexString(innerClassesInfo.u2innerClassAccessFlags) + " = " + - ClassUtil.externalClassAccessFlags(innerClassesInfo.u2innerClassAccessFlags)); - innerClassesInfo.innerClassConstantAccept(clazz, this); - innerClassesInfo.outerClassConstantAccept(clazz, this); - innerClassesInfo.innerNameConstantAccept(clazz, this); - outdent(); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - println(instruction.toString(offset)); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - println(constantInstruction.toString(offset)); - - indent(); - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - outdent(); - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - println(tableSwitchInstruction.toString(offset)); - - indent(); - - int[] jumpOffsets = tableSwitchInstruction.jumpOffsets; - - for (int index = 0; index < jumpOffsets.length; index++) - { - int jumpOffset = jumpOffsets[index]; - println(Integer.toString(tableSwitchInstruction.lowCase + index) + ": offset = " + jumpOffset + ", target = " + (offset + jumpOffset)); - } - - int defaultOffset = tableSwitchInstruction.defaultOffset; - println("default: offset = " + defaultOffset + ", target = "+ (offset + defaultOffset)); - - outdent(); - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - println(lookUpSwitchInstruction.toString(offset)); - - indent(); - - int[] cases = lookUpSwitchInstruction.cases; - int[] jumpOffsets = lookUpSwitchInstruction.jumpOffsets; - - for (int index = 0; index < jumpOffsets.length; index++) - { - int jumpOffset = jumpOffsets[index]; - println(Integer.toString(cases[index]) + ": offset = " + jumpOffset + ", target = " + (offset + jumpOffset)); - } - - int defaultOffset = lookUpSwitchInstruction.defaultOffset; - println("default: offset = " + defaultOffset + ", target = "+ (offset + defaultOffset)); - - outdent(); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - println(visitorInfo(exceptionInfo) + - " ExceptionInfo (" + - exceptionInfo.u2startPC + " -> " + - exceptionInfo.u2endPC + ": " + - exceptionInfo.u2handlerPC + "):"); - - if (exceptionInfo.u2catchType != 0) - { - clazz.constantPoolEntryAccept(exceptionInfo.u2catchType, this); - } - } - - - // Implementations for StackMapFrameVisitor. - - public void visitSameZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameZeroFrame sameZeroFrame) - { - println(visitorInfo(sameZeroFrame) + - " [" + offset + "]" + - " Var: ..., Stack: (empty)"); - } - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - print(visitorInfo(sameOneFrame) + - " [" + offset + "]" + - " Var: ..., Stack: "); - - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - - println(); - } - - - public void visitLessZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LessZeroFrame lessZeroFrame) - { - println(visitorInfo(lessZeroFrame) + - " [" + offset + "]" + - " Var: -" + lessZeroFrame.choppedVariablesCount + - ", Stack: (empty)"); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - print(visitorInfo(moreZeroFrame) + - " [" + offset + "]" + - " Var: ..."); - - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - - pw.println(", Stack: (empty)"); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - print(visitorInfo(fullFrame) + - " [" + offset + "]" + - " Var: "); - - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - - pw.print(", Stack: "); - - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - - println(); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitIntegerType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, IntegerType integerType) - { - pw.print("[i]"); - } - - - public void visitFloatType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FloatType floatType) - { - pw.print("[f]"); - } - - - public void visitLongType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LongType longType) - { - pw.print("[l]"); - } - - - public void visitDoubleType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, DoubleType doubleType) - { - pw.print("[d]"); - } - - - public void visitTopType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TopType topType) - { - pw.print("[T]"); - } - - - public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) - { - pw.print("[a:" + clazz.getClassName(objectType.u2classIndex) + "]"); - } - - - public void visitNullType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, NullType nullType) - { - pw.print("[n]"); - } - - - public void visitUninitializedType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedType uninitializedType) - { - pw.print("[u:" + uninitializedType.u2newInstructionOffset + "]"); - } - - - public void visitUninitializedThisType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, UninitializedThisType uninitializedThisType) - { - pw.print("[u:this]"); - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - println("[" + lineNumberInfo.u2startPC + "] -> line " + - lineNumberInfo.u2lineNumber + - (lineNumberInfo.getSource() == null ? "" : " [" + lineNumberInfo.getSource() + "]")); - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - println("p" + parameterIndex + ": Access flags: 0x" + Integer.toHexString(parameterInfo.u2accessFlags) + " = " + - ClassUtil.externalParameterAccessFlags(parameterInfo.u2accessFlags) + " [" + - (parameterInfo.u2nameIndex == 0 ? "" : parameterInfo.getName(clazz)) + "]"); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - println("v" + localVariableInfo.u2index + ": " + - localVariableInfo.u2startPC + " -> " + - (localVariableInfo.u2startPC + localVariableInfo.u2length) + " [" + - localVariableInfo.getDescriptor(clazz) + " " + - localVariableInfo.getName(clazz) + "]"); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - println("v" + localVariableTypeInfo.u2index + ": " + - localVariableTypeInfo.u2startPC + " -> " + - (localVariableTypeInfo.u2startPC + localVariableTypeInfo.u2length) + " [" + - localVariableTypeInfo.getSignature(clazz) + " " + - localVariableTypeInfo.getName(clazz) + "]"); - } - - - // Implementations for RequiresInfoVisitor - - public void visitRequiresInfo(Clazz clazz, RequiresInfo requiresInfo) - { - println(visitorInfo(requiresInfo) + - " RequiresInfo:"); - - indent(); - clazz.constantPoolEntryAccept(requiresInfo.u2requiresIndex, this); - println("Access flags: 0x" + Integer.toHexString(requiresInfo.u2requiresFlags) + " = " + - ClassUtil.externalRequiresAccessFlags(requiresInfo.u2requiresFlags)); - clazz.constantPoolEntryAccept(requiresInfo.u2requiresVersionIndex, this); - outdent(); - } - - - // Implementations for ExportsInfoVisitor - - public void visitExportsInfo(Clazz clazz, ExportsInfo exportsInfo) - { - println(visitorInfo(exportsInfo) + - " ExportsInfo (targets count = " + - exportsInfo.u2exportsToCount + "):"); - - indent(); - clazz.constantPoolEntryAccept(exportsInfo.u2exportsIndex, this); - println("Access flags: 0x" + Integer.toHexString(exportsInfo.u2exportsFlags) + " = " + - ClassUtil.externalExportsAccessFlags(exportsInfo.u2exportsFlags)); - - for (int index = 0; index < exportsInfo.u2exportsToCount; index++) - { - clazz.constantPoolEntryAccept(exportsInfo.u2exportsToIndex[index], this); - } - - outdent(); - } - - - // Implementations for ExportsOpensVisitor - - public void visitOpensInfo(Clazz clazz, OpensInfo opensInfo) - { - println(visitorInfo(opensInfo) + - " OpensInfo (targets count = " + - opensInfo.u2opensToCount + "):"); - - indent(); - clazz.constantPoolEntryAccept(opensInfo.u2opensIndex, this); - println("Access flags: 0x" + Integer.toHexString(opensInfo.u2opensFlags) + " = " + - ClassUtil.externalOpensAccessFlags(opensInfo.u2opensFlags)); - - for (int index = 0; index < opensInfo.u2opensToCount; index++) - { - clazz.constantPoolEntryAccept(opensInfo.u2opensToIndex[index], this); - } - - outdent(); - } - - - // Implementations for ProvidesInfoVisitor - - public void visitProvidesInfo(Clazz clazz, ProvidesInfo providesInfo) - { - println(visitorInfo(providesInfo) + - " ProvidesInfo (with count = " + - providesInfo.u2providesWithCount + "):"); - - indent(); - clazz.constantPoolEntryAccept(providesInfo.u2providesIndex, this); - - for (int index = 0; index < providesInfo.u2providesWithCount; index++) - { - clazz.constantPoolEntryAccept(providesInfo.u2providesWithIndex[index], this); - } - - outdent(); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - println(visitorInfo(annotation) + - " Annotation [" + annotation.getType(clazz) + "]:"); - - indent(); - annotation.elementValuesAccept(clazz, this); - outdent(); - } - - - public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation) - { - println(visitorInfo(annotation) + - " Parameter #"+parameterIndex+", annotation [" + annotation.getType(clazz) + "]:"); - - indent(); - annotation.elementValuesAccept(clazz, this); - outdent(); - } - - - // Implementations for TypeAnnotationVisitor. - - public void visitTypeAnnotation(Clazz clazz, TypeAnnotation typeAnnotation) - { - println(visitorInfo(typeAnnotation) + - " Type annotation [" + typeAnnotation.getType(clazz) + "]:"); - - indent(); - typeAnnotation.targetInfoAccept(clazz, this); - - println("Type path (count = " + typeAnnotation.typePath.length + "):"); - indent(); - typeAnnotation.typePathInfosAccept(clazz, this); - outdent(); - - typeAnnotation.elementValuesAccept(clazz, this); - - outdent(); - } - - - // Implementations for TargetInfoVisitor. - - public void visitTypeParameterTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterTargetInfo typeParameterTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(typeParameterTargetInfo.u1targetType) + "): Parameter #" + - typeParameterTargetInfo.u1typeParameterIndex); - } - - - public void visitSuperTypeTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, SuperTypeTargetInfo superTypeTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(superTypeTargetInfo.u1targetType) + "): " + - (superTypeTargetInfo.u2superTypeIndex == 0xffff ? - "super class" : - "interface #" + superTypeTargetInfo.u2superTypeIndex)); - } - - - public void visitTypeParameterBoundTargetInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(typeParameterBoundTargetInfo.u1targetType) + "): parameter #" + - typeParameterBoundTargetInfo.u1typeParameterIndex + ", bound #" + typeParameterBoundTargetInfo.u1boundIndex); - } - - - public void visitEmptyTargetInfo(Clazz clazz, Member member, TypeAnnotation typeAnnotation, EmptyTargetInfo emptyTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(emptyTargetInfo.u1targetType) + ")"); - } - - - public void visitFormalParameterTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, FormalParameterTargetInfo formalParameterTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(formalParameterTargetInfo.u1targetType) + "): formal parameter #" + - formalParameterTargetInfo.u1formalParameterIndex); - } - - - public void visitThrowsTargetInfo(Clazz clazz, Method method, TypeAnnotation typeAnnotation, ThrowsTargetInfo throwsTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(throwsTargetInfo.u1targetType) + "): throws #" + - throwsTargetInfo.u2throwsTypeIndex); - } - - - public void visitLocalVariableTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(localVariableTargetInfo.u1targetType) + "): local variables (count = " + - localVariableTargetInfo.u2tableLength + ")"); - - indent(); - localVariableTargetInfo.targetElementsAccept(clazz, method, codeAttribute, typeAnnotation, this); - outdent(); - } - - - public void visitCatchTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo catchTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(catchTargetInfo.u1targetType) + "): catch #" + - catchTargetInfo.u2exceptionTableIndex); - } - - - public void visitOffsetTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo offsetTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(offsetTargetInfo.u1targetType) + "): offset " + - offsetTargetInfo.u2offset); - } - - - public void visitTypeArgumentTargetInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo typeArgumentTargetInfo) - { - println("Target (type = 0x" + Integer.toHexString(typeArgumentTargetInfo.u1targetType) + "): offset " + - typeArgumentTargetInfo.u2offset + ", type argument " + - typeArgumentTargetInfo.u1typeArgumentIndex); - } - - - // Implementations for TypePathInfoVisitor. - - public void visitTypePathInfo(Clazz clazz, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo) - { - println("kind = " + - typePathInfo.u1typePathKind + ", argument index = " + - typePathInfo.u1typeArgumentIndex); - } - - - // Implementations for LocalVariableTargetElementVisitor. - - public void visitLocalVariableTargetElement(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo, LocalVariableTargetElement localVariableTargetElement) - { - println("v" + - localVariableTargetElement.u2index + ": " + - localVariableTargetElement.u2startPC + " -> " + - (localVariableTargetElement.u2startPC + localVariableTargetElement.u2length)); - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - println(visitorInfo(constantElementValue) + - " Constant element value [" + - (constantElementValue.u2elementNameIndex == 0 ? "(default)" : - constantElementValue.getMethodName(clazz)) + " '" + - constantElementValue.u1tag + "']"); - - indent(); - clazz.constantPoolEntryAccept(constantElementValue.u2constantValueIndex, this); - outdent(); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - println(visitorInfo(enumConstantElementValue) + - " Enum constant element value [" + - (enumConstantElementValue.u2elementNameIndex == 0 ? "(default)" : - enumConstantElementValue.getMethodName(clazz)) + ", " + - enumConstantElementValue.getTypeName(clazz) + ", " + - enumConstantElementValue.getConstantName(clazz) + "]"); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - println(visitorInfo(classElementValue) + - " Class element value [" + - (classElementValue.u2elementNameIndex == 0 ? "(default)" : - classElementValue.getMethodName(clazz)) + ", " + - classElementValue.getClassName(clazz) + "]"); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - println(visitorInfo(annotationElementValue) + - " Annotation element value [" + - (annotationElementValue.u2elementNameIndex == 0 ? "(default)" : - annotationElementValue.getMethodName(clazz)) + "]:"); - - indent(); - annotationElementValue.annotationAccept(clazz, this); - outdent(); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - println(visitorInfo(arrayElementValue) + - " Array element value [" + - (arrayElementValue.u2elementNameIndex == 0 ? "(default)" : - arrayElementValue.getMethodName(clazz)) + "]:"); - - indent(); - arrayElementValue.elementValuesAccept(clazz, annotation, this); - outdent(); - } - - - // Small utility methods. - - private void indent() - { - indentation++; - } - - private void outdent() - { - indentation--; - } - - private void println(String string) - { - print(string); - println(); - - } - - private void print(String string) - { - for (int index = 0; index < indentation; index++) - { - pw.print(INDENTATION); - } - - pw.print(string); - } - - private void println() - { - pw.println(); - } - - - private String visitorInfo(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == null ? "-" : "+"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVersionFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVersionFilter.java deleted file mode 100644 index a9fea4c8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVersionFilter.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates its visits to program classes to - * another given ClassVisitor, but only when the class version - * number of the visited program class lies in a given range. - * - * @author Eric Lafortune - */ -public class ClassVersionFilter implements ClassVisitor -{ - private final int minimumClassVersion; - private final int maximumClassVersion; - private final ClassVisitor classVisitor; - - - /** - * Creates a new ClassVersionFilter. - * @param minimumClassVersion the minimum class version number. - * @param classVisitor the ClassVisitor to which visits - * will be delegated. - */ - public ClassVersionFilter(int minimumClassVersion, - ClassVisitor classVisitor) - { - this(minimumClassVersion, Integer.MAX_VALUE, classVisitor); - } - - - /** - * Creates a new ClassVersionFilter. - * @param minimumClassVersion the minimum class version number. - * @param maximumClassVersion the maximum class version number. - * @param classVisitor the ClassVisitor to which visits - * will be delegated. - */ - public ClassVersionFilter(int minimumClassVersion, - int maximumClassVersion, - ClassVisitor classVisitor) - { - this.minimumClassVersion = minimumClassVersion; - this.maximumClassVersion = maximumClassVersion; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (programClass.u4version >= minimumClassVersion && - programClass.u4version <= maximumClassVersion) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Library classes don't have version numbers. - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVersionSetter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVersionSetter.java deleted file mode 100644 index 6021c62a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVersionSetter.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -import java.util.Set; - -/** - * This ClassVisitor sets the version number of the program classes - * that it visits. - * - * @author Eric Lafortune - */ -public class ClassVersionSetter implements ClassVisitor -{ - private final int classVersion; - - private final Set newerClassVersions; - - - /** - * Creates a new ClassVersionSetter. - * @param classVersion the class version number. - */ - public ClassVersionSetter(int classVersion) - { - this(classVersion, null); - } - - - /** - * Creates a new ClassVersionSetter that also stores any newer class version - * numbers that it encounters while visiting program classes. - * @param classVersion the class version number. - * @param newerClassVersions the Set in which newer class - * version numbers can be collected. - */ - public ClassVersionSetter(int classVersion, - Set newerClassVersions) - { - this.classVersion = classVersion; - this.newerClassVersions = newerClassVersions; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (programClass.u4version > classVersion && - newerClassVersions != null) - { - newerClassVersions.add(new Integer(programClass.u4version)); - } - - programClass.u4version = classVersion; - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Library classes don't have version numbers. - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVisitor.java deleted file mode 100644 index b3d3c980..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ClassVisitor.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This interface specifies the methods for a visitor of - * Clazz objects. - * - * @author Eric Lafortune - */ -public interface ClassVisitor -{ - public void visitProgramClass(ProgramClass programClass); - public void visitLibraryClass(LibraryClass libraryClass); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ConcreteClassDownTraveler.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ConcreteClassDownTraveler.java deleted file mode 100644 index 3d92ff90..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ConcreteClassDownTraveler.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor lets a given ClassVisitor - * travel to the first concrete subclasses down in its hierarchy of abstract - * classes and concrete classes. - * - * @author Eric Lafortune - */ -public class ConcreteClassDownTraveler -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new ConcreteClassDownTraveler. - * @param classVisitor the ClassVisitor to - * which visits will be delegated. - */ - public ConcreteClassDownTraveler(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Is this an abstract class or an interface? - if ((programClass.getAccessFlags() & - (ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_ABSTRACT)) != 0) - { - // Travel down the hierarchy. - Clazz[] subClasses = programClass.subClasses; - if (subClasses != null) - { - for (int index = 0; index < subClasses.length; index++) - { - subClasses[index].accept(this); - } - } - } - else - { - // Visit the class. Don't descend any further. - programClass.accept(classVisitor); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Is this an abstract class or interface? - if ((libraryClass.getAccessFlags() & - (ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_ABSTRACT)) != 0) - { - // Travel down the hierarchy. - Clazz[] subClasses = libraryClass.subClasses; - if (subClasses != null) - { - for (int index = 0; index < subClasses.length; index++) - { - subClasses[index].accept(this); - } - } - } - else - { - // Visit the class. Don't descend any further. - libraryClass.accept(classVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ConstructorMethodFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ConstructorMethodFilter.java deleted file mode 100644 index 7d6e0e9b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ConstructorMethodFilter.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor delegates its visits to one of three delegates, depending on whether the visited method is: - * - * - a constructor - * - a constructor that calls a super constructor - * - or another method. - * - * @author Johan Leys - */ -public class ConstructorMethodFilter -extends SimplifiedVisitor -implements MemberVisitor, - - // Implementation interfaces. - AttributeVisitor, - InstructionVisitor -{ - private static final int FIELD_INDEX = InstructionSequenceMatcher.X; - - private static final Constant[] CONSTANTS = new Constant[] {}; - - private static final Instruction[] INVOKE_INSTRUCTIONS = new Instruction[] - { - new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, FIELD_INDEX), - }; - - private final InstructionSequenceMatcher invokeMatcher = new InstructionSequenceMatcher(CONSTANTS, INVOKE_INSTRUCTIONS); - - private final MemberVisitor superCallingConstructorVisitor; - private final MemberVisitor constructorVisitor; - private final MemberVisitor otherMethodVisitor; - - private boolean isSuperConstructorCalled; - - - public ConstructorMethodFilter(MemberVisitor constructorVisitor) - { - this(constructorVisitor, constructorVisitor, null); - } - - - public ConstructorMethodFilter(MemberVisitor superCallingConstructorVisitor, - MemberVisitor constructorVisitor, - MemberVisitor otherMethodVisitor) - { - this.superCallingConstructorVisitor = superCallingConstructorVisitor; - this.constructorVisitor = constructorVisitor; - this.otherMethodVisitor = otherMethodVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Delegate the visit. - MemberVisitor delegateVisitor = delegateVisitor(programClass, programMethod); - if (delegateVisitor != null) - { - delegateVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.instructionsAccept(clazz, method, this); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - instruction.accept(clazz, method, codeAttribute, offset, invokeMatcher); - if (invokeMatcher.isMatching()) - { - MethodrefConstant methodrefConstant = (MethodrefConstant)((ProgramClass)clazz).getConstant(invokeMatcher.matchedArgument(FIELD_INDEX)); - if (ClassConstants.METHOD_NAME_INIT.equals(methodrefConstant.getName(clazz))) - { - isSuperConstructorCalled |= - methodrefConstant.getClassName(clazz).equals(clazz.getSuperName()); - } - } - } - - - // Small utility methods. - - private MemberVisitor delegateVisitor(ProgramClass programClass, ProgramMethod programMethod) - { - isSuperConstructorCalled = false; - - if (ClassConstants.METHOD_NAME_INIT.equals(programMethod.getName(programClass))) - { - // Search the code attribute for super. invocations. - programMethod.attributesAccept(programClass, this); - return isSuperConstructorCalled ? superCallingConstructorVisitor : constructorVisitor; - } - else - { - return otherMethodVisitor; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/DotClassClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/DotClassClassVisitor.java deleted file mode 100644 index ddbffff8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/DotClassClassVisitor.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - - -/** - * This InstructionVisitor lets a given ClassVisitor visit all - * classes involved in any .class constructs that it visits. - *

- * Note that before JDK 1.5, .class constructs are actually - * compiled differently, using Class.forName constructs. - * - * @author Eric Lafortune - */ -public class DotClassClassVisitor -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new ClassHierarchyTraveler. - * @param classVisitor the ClassVisitor to which visits will - * be delegated. - */ - public DotClassClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - byte opcode = constantInstruction.opcode; - - // Could this instruction be a .class construct? - if (opcode == InstructionConstants.OP_LDC || - opcode == InstructionConstants.OP_LDC_W) - { - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - this); - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Visit the referenced class from the .class construct. - classConstant.referencedClassAccept(classVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/DynamicReturnedClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/DynamicReturnedClassVisitor.java deleted file mode 100644 index 946471e7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/DynamicReturnedClassVisitor.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; - -/** - * This ConstantVisitor lets a given ClassVisitor visit all the referenced - * classes that are returned by the invoke dynamic constants that it visits. - * - * @author Eric Lafortune - */ -public class DynamicReturnedClassVisitor -extends SimplifiedVisitor -implements ConstantVisitor -{ - protected final ClassVisitor classVisitor; - - - public DynamicReturnedClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Is the method returning a class type? - Clazz[] referencedClasses = invokeDynamicConstant.referencedClasses; - if (referencedClasses != null && - referencedClasses.length > 0 && - ClassUtil.isInternalClassType(ClassUtil.internalMethodReturnType(invokeDynamicConstant.getType(clazz)))) - { - // Let the visitor visit the return type class, if any. - Clazz referencedClass = referencedClasses[referencedClasses.length - 1]; - if (referencedClass != null) - { - referencedClass.accept(classVisitor); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptClassFilter.java deleted file mode 100644 index 15134f9d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptClassFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, except for one given class. - * - * @author Eric Lafortune - */ -public class ExceptClassFilter implements ClassVisitor -{ - private final Clazz exceptClass; - private final ClassVisitor classVisitor; - - - /** - * Creates a new ClassNameFilter. - * @param exceptClass the class that will not be visited. - * @param classVisitor the ClassVisitor to which visits will - * be delegated. - */ - public ExceptClassFilter(Clazz exceptClass, - ClassVisitor classVisitor) - { - this.exceptClass = exceptClass; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (!programClass.equals(exceptClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (!libraryClass.equals(exceptClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptClassesFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptClassesFilter.java deleted file mode 100644 index 10124869..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptClassesFilter.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, except for classes are in a given list. - * - * @author Eric Lafortune - */ -public class ExceptClassesFilter implements ClassVisitor -{ - private final Clazz[] exceptClasses; - private final ClassVisitor classVisitor; - - - /** - * Creates a new ExceptClassesFilter. - * @param exceptClasses the classes that will not be visited. - * @param classVisitor the ClassVisitor to which visits will - * be delegated. - */ - public ExceptClassesFilter(Clazz[] exceptClasses, - ClassVisitor classVisitor) - { - this.exceptClasses = exceptClasses; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (!present(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (!present(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } - - - // Small utility methods. - - private boolean present(Clazz clazz) - { - if (exceptClasses == null) - { - return false; - } - - for (int index = 0; index < exceptClasses.length; index++) - { - if (exceptClasses[index].equals(clazz)) - { - return true; - } - } - - return false; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionCounter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionCounter.java deleted file mode 100644 index 8223b210..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionCounter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ExceptionInfoVisitor; - -/** - * This ExceptionInfoVisitor counts the number of exceptions that has been visited. - * - * @author Eric Lafortune - */ -public class ExceptionCounter implements ExceptionInfoVisitor -{ - private int count; - - - /** - * Returns the number of exceptions that has been visited so far. - */ - public int getCount() - { - return count; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - count++; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionExcludedOffsetFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionExcludedOffsetFilter.java deleted file mode 100644 index df4f260a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionExcludedOffsetFilter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ExceptionInfoVisitor; - -/** - * This ExceptionInfoVisitor delegates its visits to another given - * ExceptionInfoVisitor, but only when the visited exception - * does not cover the instruction at the given offset. - * - * @author Eric Lafortune - */ -public class ExceptionExcludedOffsetFilter -implements ExceptionInfoVisitor -{ - private final int instructionOffset; - private final ExceptionInfoVisitor exceptionInfoVisitor; - - - /** - * Creates a new ExceptionExcludedOffsetFilter. - * @param instructionOffset the instruction offset. - * @param exceptionInfoVisitor the ExceptionInfoVisitor to which visits - * will be delegated. - */ - public ExceptionExcludedOffsetFilter(int instructionOffset, - ExceptionInfoVisitor exceptionInfoVisitor) - { - this.instructionOffset = instructionOffset; - this.exceptionInfoVisitor = exceptionInfoVisitor; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - if (!exceptionInfo.isApplicable(instructionOffset)) - { - exceptionInfoVisitor.visitExceptionInfo(clazz, method, codeAttribute, exceptionInfo); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionHandlerConstantVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionHandlerConstantVisitor.java deleted file mode 100644 index 79ed6ef6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionHandlerConstantVisitor.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ExceptionInfoVisitor; -import proguard.classfile.constant.visitor.ConstantVisitor; - -/** - * This ExceptionInfoVisitor lets a given - * ConstantVisitor visit all catch class constants of exceptions - * that it visits. - * - * @author Eric Lafortune - */ -public class ExceptionHandlerConstantVisitor -implements ExceptionInfoVisitor -{ - private final ConstantVisitor constantVisitor; - - - /** - * Creates a new ExceptionHandlerConstantVisitor. - * @param constantVisitor the ConstantVisitor that will visit the catch - * class constants. - */ - public ExceptionHandlerConstantVisitor(ConstantVisitor constantVisitor) - { - this.constantVisitor = constantVisitor; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - int catchType = exceptionInfo.u2catchType; - if (catchType != 0) - { - clazz.constantPoolEntryAccept(catchType, constantVisitor); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionHandlerFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionHandlerFilter.java deleted file mode 100644 index ae56e68c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionHandlerFilter.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ExceptionInfoVisitor; - -/** - * This ExceptionInfoVisitor delegates its visits to another given - * ExceptionInfoVisitor, but only when the visited exception - * targets an instruction in the given range of offsets. - * - * @author Eric Lafortune - */ -public class ExceptionHandlerFilter -implements ExceptionInfoVisitor -{ - private final int startOffset; - private final int endOffset; - private final ExceptionInfoVisitor exceptionInfoVisitor; - - - /** - * Creates a new ExceptionHandlerFilter. - * @param startOffset the start of the instruction offset range. - * @param endOffset the end of the instruction offset range. - * @param exceptionInfoVisitor the ExceptionInfoVisitor to which visits - * will be delegated. - */ - public ExceptionHandlerFilter(int startOffset, - int endOffset, - ExceptionInfoVisitor exceptionInfoVisitor) - { - this.startOffset = startOffset; - this.endOffset = endOffset; - this.exceptionInfoVisitor = exceptionInfoVisitor; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - int handlerPC = exceptionInfo.u2handlerPC; - if (handlerPC >= startOffset && - handlerPC < endOffset) - { - exceptionInfoVisitor.visitExceptionInfo(clazz, method, codeAttribute, exceptionInfo); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionOffsetFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionOffsetFilter.java deleted file mode 100644 index 6ea99be6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionOffsetFilter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ExceptionInfoVisitor; - -/** - * This ExceptionInfoVisitor delegates its visits to another given - * ExceptionInfoVisitor, but only when the visited exception - * covers the instruction at the given offset. - * - * @author Eric Lafortune - */ -public class ExceptionOffsetFilter -implements ExceptionInfoVisitor -{ - private final int instructionOffset; - private final ExceptionInfoVisitor exceptionInfoVisitor; - - - /** - * Creates a new ExceptionOffsetFilter. - * @param instructionOffset the instruction offset. - * @param exceptionInfoVisitor the ExceptionInfoVisitor to which visits - * will be delegated. - */ - public ExceptionOffsetFilter(int instructionOffset, - ExceptionInfoVisitor exceptionInfoVisitor) - { - this.instructionOffset = instructionOffset; - this.exceptionInfoVisitor = exceptionInfoVisitor; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - if (exceptionInfo.isApplicable(instructionOffset)) - { - exceptionInfoVisitor.visitExceptionInfo(clazz, method, codeAttribute, exceptionInfo); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionRangeFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionRangeFilter.java deleted file mode 100644 index 542cf8cf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ExceptionRangeFilter.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.ExceptionInfoVisitor; - -/** - * This ExceptionInfoVisitor delegates its visits to another given - * ExceptionInfoVisitor, but only when the visited exception - * overlaps with the given instruction range. - * - * @author Eric Lafortune - */ -public class ExceptionRangeFilter -implements ExceptionInfoVisitor -{ - private final int startOffset; - private final int endOffset; - private final ExceptionInfoVisitor exceptionInfoVisitor; - - - /** - * Creates a new ExceptionRangeFilter. - * @param startOffset the start offset of the instruction range. - * @param endOffset the end offset of the instruction range. - * @param exceptionInfoVisitor the ExceptionInfoVisitor to which visits - * will be delegated. - */ - public ExceptionRangeFilter(int startOffset, - int endOffset, - ExceptionInfoVisitor exceptionInfoVisitor) - { - this.startOffset = startOffset; - this.endOffset = endOffset; - this.exceptionInfoVisitor = exceptionInfoVisitor; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - if (exceptionInfo.isApplicable(startOffset, endOffset)) - { - exceptionInfoVisitor.visitExceptionInfo(clazz, method, codeAttribute, exceptionInfo); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/FunctionalInterfaceFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/FunctionalInterfaceFilter.java deleted file mode 100644 index d571770d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/FunctionalInterfaceFilter.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, but only for functional interfaces, that - * is, interface classes that have exactly one abstract method. - * - * @author Eric Lafortune - */ -public class FunctionalInterfaceFilter implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new ProgramClassFilter. - * @param classVisitor the ClassVisitor to which visits - * will be delegated. - */ - public FunctionalInterfaceFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (isFunctionalInterface(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (isFunctionalInterface(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } - - - // Small utility methods. - - private boolean isFunctionalInterface(Clazz clazz) - { - // Is it an interface? - if ((clazz.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0) - { - return false; - } - - // Count the abstract methods in the interface hierarchy. - // Subtract any corresponding default methods, since only abstract - // methods that don't have a default implementation count. - // TODO: Find a better way to count default methods, since there may be more of them for a single abstract method, or we can find one via different paths. - MemberCounter abstractMethodCounter = new MemberCounter(); - MemberCounter defaultMethodCounter = new MemberCounter(); - clazz.hierarchyAccept(true, false, true, false, - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - new MultiMemberVisitor( - abstractMethodCounter, - new SimilarMemberVisitor(clazz, true, false, true, false, - new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT, - defaultMethodCounter)) - )))); - - return abstractMethodCounter.getCount() - defaultMethodCounter.getCount() == 1; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementedClassConstantFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementedClassConstantFilter.java deleted file mode 100644 index 45987386..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementedClassConstantFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor delegates its visits to class constants - * to another given ConstantVisitor, except for classes that - * extend or implement a given class. This exception includes the class itself. - * - * @author Eric Lafortune - */ -public class ImplementedClassConstantFilter -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final Clazz implementedClass; - private final ConstantVisitor constantVisitor; - - - /** - * Creates a new ImplementedClassConstantFilter. - * @param implementedClass the class whose implementations will not be - * visited. - * @param constantVisitor the ConstantVisitor to which visits - * will be delegated. - */ - public ImplementedClassConstantFilter(Clazz implementedClass, - ConstantVisitor constantVisitor) - { - this.implementedClass = implementedClass; - this.constantVisitor = constantVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - Clazz referencedClass = classConstant.referencedClass; - if (referencedClass == null || - !referencedClass.extendsOrImplements(implementedClass)) - { - constantVisitor.visitClassConstant(clazz, classConstant); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementedClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementedClassFilter.java deleted file mode 100644 index 5d4107a2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementedClassFilter.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, except for classes that extend or implement - * a given class. - * - * @author Eric Lafortune - */ -public class ImplementedClassFilter implements ClassVisitor -{ - private final Clazz implementedClass; - private final ClassVisitor classVisitor; - - - /** - * Creates a new ImplementedClassFilter. - * @param implementedClass the class whose implementations will not be - * visited. - * @param classVisitor the ClassVisitor to which visits will - * be delegated. - */ - public ImplementedClassFilter(Clazz implementedClass, - ClassVisitor classVisitor) - { - this.implementedClass = implementedClass; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (!programClass.extendsOrImplements(implementedClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (!libraryClass.extendsOrImplements(implementedClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementingClassConstantFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementingClassConstantFilter.java deleted file mode 100644 index b9e796c3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ImplementingClassConstantFilter.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor delegates its visits to class constants - * to another given ConstantVisitor, except for classes that - * are extended or implemented by a given class. This exception includes the - * class itself. - * - * @author Eric Lafortune - */ -public class ImplementingClassConstantFilter -extends SimplifiedVisitor -implements ConstantVisitor -{ - private final Clazz implementingClass; - private final ConstantVisitor constantVisitor; - - - /** - * Creates a new ImplementingClassConstantFilter. - * @param implementingClass the class whose superclasses and interfaces will - * not be visited. - * @param constantVisitor the ConstantVisitor to which visits - * will be delegated. - */ - public ImplementingClassConstantFilter(Clazz implementingClass, - ConstantVisitor constantVisitor) - { - this.implementingClass = implementingClass; - this.constantVisitor = constantVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - Clazz referencedClass = classConstant.referencedClass; - if (referencedClass == null || - !implementingClass.extendsOrImplements(referencedClass)) - { - constantVisitor.visitClassConstant(clazz, classConstant); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/InitializerMethodFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/InitializerMethodFilter.java deleted file mode 100644 index 1c9ccc05..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/InitializerMethodFilter.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; - -/** - * This MemberVisitor delegates its visits to one of two other given - * MemberVisitor instances, depending on whether the visited method - * is a static initializer or instance initializer, or not. - * - * @author Eric Lafortune - */ -public class InitializerMethodFilter -implements MemberVisitor -{ - private final MemberVisitor initializerMemberVisitor; - private final MemberVisitor otherMemberVisitor; - - - /** - * Creates a new InitializerMethodFilter. - * @param initializerMemberVisitor the member visitor to which visits to - * initializers will be delegated. - */ - public InitializerMethodFilter(MemberVisitor initializerMemberVisitor) - { - this(initializerMemberVisitor, null); - } - - - /** - * Creates a new InitializerMethodFilter. - * @param initializerMemberVisitor the member visitor to which visits to - * initializers will be delegated. - * @param otherMemberVisitor the member visitor to which visits to - * non-initializer methods will be delegated. - */ - public InitializerMethodFilter(MemberVisitor initializerMemberVisitor, - MemberVisitor otherMemberVisitor) - { - this.initializerMemberVisitor = initializerMemberVisitor; - this.otherMemberVisitor = otherMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) {} - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - MemberVisitor memberVisitor = - applicableMemberVisitor(programClass, programMethod); - - if (memberVisitor != null) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - MemberVisitor memberVisitor = - applicableMemberVisitor(libraryClass, libraryMethod); - - if (memberVisitor != null) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } - - - // Small utility methods. - - /** - * Returns the appropriate member visitor, depending on whether the - * given method is an initializer or not. - */ - private MemberVisitor applicableMemberVisitor(Clazz clazz, Member method) - { - return ClassUtil.isInitializer(method.getName(clazz)) ? - initializerMemberVisitor : - otherMemberVisitor; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/LibraryClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/LibraryClassFilter.java deleted file mode 100644 index a92e8bb1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/LibraryClassFilter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, but only when visiting library classes. - * - * @author Eric Lafortune - */ -public class LibraryClassFilter implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new LibraryClassFilter. - * @param classVisitor the ClassVisitor to which visits - * will be delegated. - */ - public LibraryClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Don't delegate visits to program classes. - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - classVisitor.visitLibraryClass(libraryClass); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/LibraryMemberFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/LibraryMemberFilter.java deleted file mode 100644 index cdfc3e9e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/LibraryMemberFilter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when visiting members of library - * classes. - * - * @author Eric Lafortune - */ -public class LibraryMemberFilter implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new ProgramMemberFilter. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public LibraryMemberFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Don't delegate visits to program members. - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Don't delegate visits to program members. - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFilter.java deleted file mode 100644 index c6b46358..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFilter.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when the visited member has the proper - * access flags. - *

- * If conflicting access flags (public/private/protected) are specified, - * having one of them set will be considered sufficient. - * - * @see ClassConstants - * - * @author Eric Lafortune - */ -public class MemberAccessFilter -implements MemberVisitor -{ - // A mask of conflicting access flags. These are interpreted in a special - // way if more of them are required at the same time. In that case, one - // of them being set is sufficient. - private static final int ACCESS_MASK = - ClassConstants.ACC_PUBLIC | - ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_PROTECTED; - - private final int requiredSetAccessFlags; - private final int requiredUnsetAccessFlags; - private final int requiredOneSetAccessFlags; - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MemberAccessFilter. - * @param requiredSetAccessFlags the member access flags that should be - * set. - * @param requiredUnsetAccessFlags the member access flags that should be - * unset. - * @param memberVisitor the MemberVisitor to - * which visits will be delegated. - */ - public MemberAccessFilter(int requiredSetAccessFlags, - int requiredUnsetAccessFlags, - MemberVisitor memberVisitor) - { - this.requiredSetAccessFlags = requiredSetAccessFlags & ~ACCESS_MASK; - this.requiredUnsetAccessFlags = requiredUnsetAccessFlags; - this.requiredOneSetAccessFlags = requiredSetAccessFlags & ACCESS_MASK; - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (accepted(programField.getAccessFlags())) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (accepted(programMethod.getAccessFlags())) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (accepted(libraryField.getAccessFlags())) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (accepted(libraryMethod.getAccessFlags())) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } - - - // Small utility methods. - - private boolean accepted(int accessFlags) - { - return (requiredSetAccessFlags & ~accessFlags) == 0 && - (requiredUnsetAccessFlags & accessFlags) == 0 && - (requiredOneSetAccessFlags == 0 || - (requiredOneSetAccessFlags & accessFlags) != 0); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFlagCleaner.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFlagCleaner.java deleted file mode 100644 index 2784afae..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFlagCleaner.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This visitor clears the specified access flags of the - * program classes and class members that its visits. - * - * @see ClassConstants - * - * @author Eric Lafortune - */ -public class MemberAccessFlagCleaner -implements ClassVisitor, - MemberVisitor -{ - private final int accessFlags; - - - /** - * Creates a new MemberAccessFlagCleaner. - * @param accessFlags the member access flags to be cleared. - */ - public MemberAccessFlagCleaner(int accessFlags) - { - this.accessFlags = accessFlags; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.u2accessFlags &= ~accessFlags; - } - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.u2accessFlags &= ~accessFlags; - } - - - // Implementations for MemberVisitor. - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - programField.u2accessFlags &= ~accessFlags; - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - programMethod.u2accessFlags &= ~accessFlags; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFlagSetter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFlagSetter.java deleted file mode 100644 index b28c6f7b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberAccessFlagSetter.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This MemberVisitor sets the specified access flags of the - * program class members that it visits. - * - * @see ClassConstants - * - * @author Johan Leys - */ -public class MemberAccessFlagSetter -implements MemberVisitor -{ - private final int accessFlags; - - - /** - * Creates a new MemberAccessFlagSetter. - * - * @param accessFlags the member access flags to be set. - */ - public MemberAccessFlagSetter(int accessFlags) - { - this.accessFlags = accessFlags; - } - - - // Implementations for MemberVisitor. - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - programField.u2accessFlags |= accessFlags; - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - programMethod.u2accessFlags |= accessFlags; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberClassAccessFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberClassAccessFilter.java deleted file mode 100644 index acb5e6b1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberClassAccessFilter.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.*; - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when the visited member is accessible - * from the given referencing class. - * - * @author Eric Lafortune - */ -public class MemberClassAccessFilter -implements MemberVisitor -{ - private final Clazz referencingClass; - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MemberAccessFilter. - * @param referencingClass the class that is accessing the member. - * @param memberVisitor the MemberVisitor to which visits - * will be delegated. - */ - public MemberClassAccessFilter(Clazz referencingClass, - MemberVisitor memberVisitor) - { - this.referencingClass = referencingClass; - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (accepted(programClass, programField.getAccessFlags())) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (accepted(programClass, programMethod.getAccessFlags())) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (accepted(libraryClass, libraryField.getAccessFlags())) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (accepted(libraryClass, libraryMethod.getAccessFlags())) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } - - - // Small utility methods. - - private boolean accepted(Clazz clazz, int memberAccessFlags) - { - int accessLevel = AccessUtil.accessLevel(memberAccessFlags); - - return - (accessLevel >= AccessUtil.PUBLIC ) || - (accessLevel >= AccessUtil.PRIVATE && referencingClass.equals(clazz) ) || - (accessLevel >= AccessUtil.PACKAGE_VISIBLE && (ClassUtil.internalPackageName(referencingClass.getName()).equals( - ClassUtil.internalPackageName(clazz.getName())))) || - (accessLevel >= AccessUtil.PROTECTED && (referencingClass.extends_(clazz) || - referencingClass.extendsOrImplements(clazz)) ); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberCollector.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberCollector.java deleted file mode 100644 index c0b511ec..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberCollector.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Set; - -/** - * This MemberVisitor collects dot-separated classname.membername.descriptor - * strings of the class members that it visits. - * - * @author Eric Lafortune - */ -public class MemberCollector -extends SimplifiedVisitor -implements MemberVisitor -{ - private final boolean includeClassName; - private final boolean includeMemberName; - private final boolean includeMemberDescriptor; - - private final Set set; - - - /** - * Creates a new MemberCollector. - * @param includeClassName specifies whether to include the class - * name in each collected strings. - * @param includeMemberName specifies whether to include the member - * name in each collected strings. - * @param includeMemberDescriptor specifies whether to include the member - * descriptor in each collected strings. - * @param set the Set in which all strings will be - * collected. - */ - public MemberCollector(boolean includeClassName, - boolean includeMemberName, - boolean includeMemberDescriptor, - Set set) - { - this.includeClassName = includeClassName; - this.includeMemberName = includeMemberName; - this.includeMemberDescriptor = includeMemberDescriptor; - - this.set = set; - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - StringBuffer buffer = new StringBuffer(); - - if (includeClassName) - { - buffer.append(clazz.getName()).append('.'); - } - - if (includeMemberName) - { - buffer.append(member.getName(clazz)).append('.'); - } - - if (includeMemberDescriptor) - { - buffer.append(member.getDescriptor(clazz)); - } - - set.add(buffer.toString()); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberCounter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberCounter.java deleted file mode 100644 index 0a5dd5ec..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberCounter.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This MemberVisitor counts the number of class members that have been visited. - * - * @author Eric Lafortune - */ -public class MemberCounter implements MemberVisitor -{ - private int count; - - - /** - * Returns the number of class members that has been visited so far. - */ - public int getCount() - { - return count; - } - - - // Implementations for MemberVisitor. - - public void visitLibraryField(LibraryClass libraryClass, - LibraryField libraryField) - { - count++; - } - - - public void visitLibraryMethod(LibraryClass libraryClass, - LibraryMethod libraryMethod) - { - count++; - } - - - public void visitProgramField(ProgramClass programClass, - ProgramField programField) - { - count++; - } - - - public void visitProgramMethod(ProgramClass programClass, - ProgramMethod programMethod) - { - count++; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberDescriptorFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberDescriptorFilter.java deleted file mode 100644 index d37d08d8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberDescriptorFilter.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.util.*; - -import java.util.List; - - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when the visited member - * has a descriptor that matches a given regular expression. - * - * @author Eric Lafortune - */ -public class MemberDescriptorFilter implements MemberVisitor -{ - private final StringMatcher regularExpressionMatcher; - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MemberDescriptorFilter. - * @param regularExpression the regular expression against which member - * descriptors will be matched. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberDescriptorFilter(String regularExpression, - MemberVisitor memberVisitor) - { - this(regularExpression, null, memberVisitor); - } - - - /** - * Creates a new MemberDescriptorFilter. - * @param regularExpression the regular expression against which member - * descriptors will be matched. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberDescriptorFilter(String regularExpression, - List variableStringMatchers, - MemberVisitor memberVisitor) - { - this(new ListParser(new ClassNameParser(variableStringMatchers)).parse(regularExpression), - memberVisitor); - } - - - /** - * Creates a new MemberDescriptorFilter. - * @param regularExpressionMatcher the regular expression against which - * member descriptors will be matched. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberDescriptorFilter(StringMatcher regularExpressionMatcher, - MemberVisitor memberVisitor) - { - this.regularExpressionMatcher = regularExpressionMatcher; - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (accepted(programField.getDescriptor(programClass))) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (accepted(programMethod.getDescriptor(programClass))) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (accepted(libraryField.getDescriptor(libraryClass))) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (accepted(libraryMethod.getDescriptor(libraryClass))) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } - - - // Small utility methods. - - private boolean accepted(String name) - { - return regularExpressionMatcher.matches(name); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberDescriptorReferencedClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberDescriptorReferencedClassVisitor.java deleted file mode 100644 index 5a49b191..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberDescriptorReferencedClassVisitor.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This MemberVisitor lets a given ClassVisitor visit all the classes - * referenced by the descriptors of the class members that it visits. - * - * @author Eric Lafortune - */ -public class MemberDescriptorReferencedClassVisitor -extends SimplifiedVisitor -implements MemberVisitor -{ - private final ClassVisitor classVisitor; - - - public MemberDescriptorReferencedClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Let the visitor visit the classes referenced in the descriptor string. - programMember.referencedClassesAccept(classVisitor); - } - - - public void visitLibraryMember(LibraryClass programClass, LibraryMember libraryMember) - { - // Let the visitor visit the classes referenced in the descriptor string. - libraryMember.referencedClassesAccept(classVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberNameFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberNameFilter.java deleted file mode 100644 index 0729aa5f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberNameFilter.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.util.*; - -import java.util.List; - - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when the visited member - * has a name that matches a given regular expression. - * - * @author Eric Lafortune - */ -public class MemberNameFilter implements MemberVisitor -{ - private final StringMatcher regularExpressionMatcher; - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MemberNameFilter. - * @param regularExpression the regular expression against which member - * names will be matched. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberNameFilter(String regularExpression, - MemberVisitor memberVisitor) - { - this(regularExpression, null, memberVisitor); - } - - - /** - * Creates a new MemberNameFilter. - * @param regularExpression the regular expression against which member - * names will be matched. - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberNameFilter(String regularExpression, - List variableStringMatchers, - MemberVisitor memberVisitor) - { - this(new ListParser(new NameParser(variableStringMatchers)).parse(regularExpression), - memberVisitor); - } - - - /** - /** - * Creates a new MemberNameFilter. - * @param regularExpressionMatcher the regular expression against which - * member names will be matched. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberNameFilter(StringMatcher regularExpressionMatcher, - MemberVisitor memberVisitor) - { - this.regularExpressionMatcher = regularExpressionMatcher; - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (accepted(programField.getName(programClass))) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (accepted(programMethod.getName(programClass))) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (accepted(libraryField.getName(libraryClass))) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (accepted(libraryMethod.getName(libraryClass))) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } - - - // Small utility methods. - - private boolean accepted(String name) - { - return regularExpressionMatcher.matches(name); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberToClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberToClassVisitor.java deleted file mode 100644 index 8c3d0dbc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberToClassVisitor.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This MemberVisitor delegates all visits to a given ClassVisitor. - * The latter visits the class of each visited class member. - * - * @author Eric Lafortune - */ -public class MemberToClassVisitor implements MemberVisitor -{ - private final ClassVisitor classVisitor; - - - public MemberToClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - classVisitor.visitProgramClass(programClass); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - classVisitor.visitProgramClass(programClass); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - classVisitor.visitLibraryClass(libraryClass); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - classVisitor.visitLibraryClass(libraryClass); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberVisitor.java deleted file mode 100644 index a8564bec..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MemberVisitor.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This interface specifies the methods for a visitor of - * ProgramMember objects and LibraryMember - * objects. - * - * @author Eric Lafortune - */ -public interface MemberVisitor -{ - public void visitProgramField( ProgramClass programClass, ProgramField programField); - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod); - - public void visitLibraryField( LibraryClass libraryClass, LibraryField libraryField); - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodCollector.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodCollector.java deleted file mode 100644 index 72a5cf6e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodCollector.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Set; - -/** - * This MemberVisitor collects the methods that it visits in the - * given collection. - * - * @author Johan Leys - */ -public class MethodCollector -extends SimplifiedVisitor -implements MemberVisitor -{ - private final Set methods; - - - public MethodCollector(Set methods) - { - this.methods = methods; - } - - - // Implementations for MethodCollector. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - methods.add(programMethod); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - methods.add(libraryMethod); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodImplementationFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodImplementationFilter.java deleted file mode 100644 index fe401e53..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodImplementationFilter.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This MemberVisitor delegates its visits to methods to - * another given MemberVisitor, but only when the visited - * method may have implementations. - * - * @see Clazz#mayHaveImplementations(Method) - * @author Eric Lafortune - */ -public class MethodImplementationFilter -extends SimplifiedVisitor -implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MethodImplementationFilter. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MethodImplementationFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (programClass.mayHaveImplementations(programMethod)) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (libraryClass.mayHaveImplementations(libraryMethod)) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodImplementationTraveler.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodImplementationTraveler.java deleted file mode 100644 index 199cfe10..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MethodImplementationTraveler.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This MemberVisitor lets a given MemberVisitor - * travel to all concrete and abstract implementations of the visited methods - * in their class hierarchies. - * - * @author Eric Lafortune - */ -public class MethodImplementationTraveler -extends SimplifiedVisitor -implements MemberVisitor -{ - private final boolean visitThisMethod; - private final boolean visitSuperMethods; - private final boolean visitInterfaceMethods; - private final boolean visitOverridingMethods; - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MethodImplementationTraveler. - * @param visitThisMethod specifies whether to visit the originally - * visited methods. - * @param visitSuperMethods specifies whether to visit the method in - * the super classes. - * @param visitInterfaceMethods specifies whether to visit the method in - * the interface classes. - * @param visitOverridingMethods specifies whether to visit the method in - * the subclasses. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MethodImplementationTraveler(boolean visitThisMethod, - boolean visitSuperMethods, - boolean visitInterfaceMethods, - boolean visitOverridingMethods, - MemberVisitor memberVisitor) - { - this.visitThisMethod = visitThisMethod; - this.visitSuperMethods = visitSuperMethods; - this.visitInterfaceMethods = visitInterfaceMethods; - this.visitOverridingMethods = visitOverridingMethods; - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (visitThisMethod) - { - programMethod.accept(programClass, memberVisitor); - } - - if (!isSpecial(programClass, programMethod)) - { - programClass.hierarchyAccept(false, - visitSuperMethods, - visitInterfaceMethods, - visitOverridingMethods, - new NamedMethodVisitor(programMethod.getName(programClass), - programMethod.getDescriptor(programClass), - new MemberAccessFilter(0, - ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC, - memberVisitor))); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (visitThisMethod) - { - libraryMethod.accept(libraryClass, memberVisitor); - } - - if (!isSpecial(libraryClass, libraryMethod)) - { - libraryClass.hierarchyAccept(false, - visitSuperMethods, - visitInterfaceMethods, - visitOverridingMethods, - new NamedMethodVisitor(libraryMethod.getName(libraryClass), - libraryMethod.getDescriptor(libraryClass), - new MemberAccessFilter(0, - ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC, - memberVisitor))); - } - } - - - // Small utility methods. - - private boolean isSpecial(Clazz clazz, Method method) - { - return (method.getAccessFlags() & - (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC)) != 0 || - method.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiClassPoolVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiClassPoolVisitor.java deleted file mode 100644 index 9bd6de89..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiClassPoolVisitor.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.ClassPool; - - -/** - * This ClassPoolVisitor delegates all visits to each ClassPoolVisitor - * in a given list. - * - * @author Eric Lafortune - */ -public class MultiClassPoolVisitor implements ClassPoolVisitor -{ - private static final int ARRAY_SIZE_INCREMENT = 5; - - private ClassPoolVisitor[] classPoolVisitors; - private int classPoolVisitorCount; - - - public MultiClassPoolVisitor() - { - } - - - public MultiClassPoolVisitor(ClassPoolVisitor[] classPoolVisitors) - { - this.classPoolVisitors = classPoolVisitors; - this.classPoolVisitorCount = classPoolVisitors.length; - } - - - public void addClassPoolVisitor(ClassPoolVisitor classPoolVisitor) - { - ensureArraySize(); - - classPoolVisitors[classPoolVisitorCount++] = classPoolVisitor; - } - - - private void ensureArraySize() - { - if (classPoolVisitors == null) - { - classPoolVisitors = new ClassPoolVisitor[ARRAY_SIZE_INCREMENT]; - } - else if (classPoolVisitors.length == classPoolVisitorCount) - { - ClassPoolVisitor[] newClassPoolVisitors = - new ClassPoolVisitor[classPoolVisitorCount + - ARRAY_SIZE_INCREMENT]; - System.arraycopy(classPoolVisitors, 0, - newClassPoolVisitors, 0, - classPoolVisitorCount); - classPoolVisitors = newClassPoolVisitors; - } - } - - - // Implementations for ClassPoolVisitor. - - public void visitClassPool(ClassPool classPool) - { - for (int index = 0; index < classPoolVisitorCount; index++) - { - classPoolVisitors[index].visitClassPool(classPool); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiClassVisitor.java deleted file mode 100644 index 658c4235..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiClassVisitor.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.util.ArrayUtil; - - -/** - * This ClassVisitor delegates all visits to each ClassVisitor - * in a given list. - * - * @author Eric Lafortune - */ -public class MultiClassVisitor implements ClassVisitor -{ - private ClassVisitor[] classVisitors; - private int classVisitorCount; - - - public MultiClassVisitor() - { - this.classVisitors = new ClassVisitor[16]; - } - - - public MultiClassVisitor(ClassVisitor... classVisitors) - { - this.classVisitors = classVisitors; - this.classVisitorCount = classVisitors.length; - } - - - public void addClassVisitor(ClassVisitor classVisitor) - { - classVisitors = - ArrayUtil.add(classVisitors, - classVisitorCount++, - classVisitor); - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - for (int index = 0; index < classVisitorCount; index++) - { - classVisitors[index].visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - for (int index = 0; index < classVisitorCount; index++) - { - classVisitors[index].visitLibraryClass(libraryClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiConstantVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiConstantVisitor.java deleted file mode 100644 index 3da684b4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiConstantVisitor.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.util.ArrayUtil; - - -/** - * This ConstantVisitor delegates all visits to each ConstantVisitor in a given list. - * - * @author Johan Leys - */ -public class MultiConstantVisitor -extends SimplifiedVisitor -implements ConstantVisitor -{ - private ConstantVisitor[] constantVisitors; - private int constantVisitorCount; - - - public MultiConstantVisitor() - { - this.constantVisitors = new ConstantVisitor[16]; - } - - - public MultiConstantVisitor(ConstantVisitor... constantVisitors) - { - this.constantVisitors = constantVisitors; - this.constantVisitorCount = this.constantVisitors.length; - } - - - public void addClassVisitor(ConstantVisitor constantVisitor) - { - constantVisitors = - ArrayUtil.add(constantVisitors, - constantVisitorCount++, - constantVisitor); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - for (int index = 0; index < constantVisitorCount; index++) - { - constant.accept(clazz, constantVisitors[index]); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiMemberVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiMemberVisitor.java deleted file mode 100644 index 7e641dbf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/MultiMemberVisitor.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.util.ArrayUtil; - - -/** - * This MemberVisitor delegates all visits to each MemberVisitor - * in a given list. - * - * @author Eric Lafortune - */ -public class MultiMemberVisitor implements MemberVisitor -{ - private MemberVisitor[] memberVisitors; - private int memberVisitorCount; - - - public MultiMemberVisitor() - { - this.memberVisitors = new MemberVisitor[16]; - } - - - public MultiMemberVisitor(MemberVisitor... memberVisitors) - { - this.memberVisitors = memberVisitors; - this.memberVisitorCount = memberVisitors.length; - } - - - public void addMemberVisitor(MemberVisitor memberVisitor) - { - memberVisitors = - ArrayUtil.add(memberVisitors, - memberVisitorCount++, - memberVisitor); - } - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - for (int index = 0; index < memberVisitorCount; index++) - { - memberVisitors[index].visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - for (int index = 0; index < memberVisitorCount; index++) - { - memberVisitors[index].visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - for (int index = 0; index < memberVisitorCount; index++) - { - memberVisitors[index].visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - for (int index = 0; index < memberVisitorCount; index++) - { - memberVisitors[index].visitLibraryMethod(libraryClass, libraryMethod); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedClassVisitor.java deleted file mode 100644 index 5270e1bb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedClassVisitor.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.ClassPool; - - -/** - * This class visits Clazz objects with the given name. - * - * @author Eric Lafortune - */ -public class NamedClassVisitor implements ClassPoolVisitor -{ - private final ClassVisitor classVisitor; - private final String name; - - - public NamedClassVisitor(ClassVisitor classVisitor, - String name) - { - this.classVisitor = classVisitor; - this.name = name; - } - - - public void visitClassPool(ClassPool classPool) - { - classPool.classAccept(name, classVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedFieldVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedFieldVisitor.java deleted file mode 100644 index c6021bc5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedFieldVisitor.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This class visits ProgramMember objects referring to fields, identified by - * a name and descriptor pair. - * - * @author Eric Lafortune - */ -public class NamedFieldVisitor implements ClassVisitor -{ - private final String name; - private final String descriptor; - private final MemberVisitor memberVisitor; - - - public NamedFieldVisitor(String name, - String descriptor, - MemberVisitor memberVisitor) - { - this.name = name; - this.descriptor = descriptor; - this.memberVisitor = memberVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.fieldAccept(name, descriptor, memberVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.fieldAccept(name, descriptor, memberVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedMethodVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedMethodVisitor.java deleted file mode 100644 index f096cf7a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/NamedMethodVisitor.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This class visits ProgramMember objects referring to methods, identified by - * a name and descriptor pair. - * - * @author Eric Lafortune - */ -public class NamedMethodVisitor implements ClassVisitor -{ - private final String name; - private final String descriptor; - private final MemberVisitor memberVisitor; - - - public NamedMethodVisitor(String name, - String descriptor, - MemberVisitor memberVisitor) - { - this.name = name; - this.descriptor = descriptor; - this.memberVisitor = memberVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.methodAccept(name, descriptor, memberVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.methodAccept(name, descriptor, memberVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ParallelAllClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ParallelAllClassVisitor.java deleted file mode 100644 index b7be4d19..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ParallelAllClassVisitor.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -import java.util.*; -import java.util.concurrent.*; - - -/** - * This ClassPoolVisitor will visit all Clazz objects of the class pool - * in a parallel way. For each thread, a separate ClassVisitor will be - * created using {@link ClassVisitorFactory#createClassVisitor()}. - *

- * The number of parallel threads is coupled to the number of available - * processors: - *

- *     parallel_threads = Runtime.getRuntime().availableProcessors() - 1;
- * 
- *

- * It is possible to override the number of threads by setting the - * environment variable {@code parallel.threads} to an integer > 0. - * - * @author Thomas Neidhart - */ -public class ParallelAllClassVisitor -implements ClassPoolVisitor -{ - private static final int THREAD_COUNT; - static { - Integer threads = null; - try { - String threadCountString = System.getProperty("parallel.threads"); - if (threadCountString != null) - { - threads = Integer.parseInt(threadCountString); - } - } - catch (Exception ex) {} - - threads = threads == null ? - Runtime.getRuntime().availableProcessors() - 1 : - Math.min(threads.intValue(), Runtime.getRuntime().availableProcessors()); - - THREAD_COUNT = threads.intValue(); - } - - - /** - * A factory for ClassVisitor objects. - */ - public interface ClassVisitorFactory - { - /** - * Creates a ClassVisitor that will be used during - * parallel visiting of classes in a ClassPool. - */ - ClassVisitor createClassVisitor(); - } - - - private final ClassVisitorFactory classVisitorFactory; - - - /** - * Create a new ParallelAllClassVisitor that will use the given factory - * to visit all classes in a ClassPool in a parallel way. - */ - public ParallelAllClassVisitor(ClassVisitorFactory classVisitorFactory) - { - this.classVisitorFactory = classVisitorFactory; - } - - - // Implementations for ClassPoolVisitor. - - public void visitClassPool(ClassPool classPool) - { - if (THREAD_COUNT <= 1) - { - // Fallback to single thread execution if the thread count - // was overridden by an environment variable. - classPool.classesAccept(classVisitorFactory.createClassVisitor()); - } - else - { - ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT, new MyThreadFactory()); - - MyThreadedClassVisitor classVisitor = new MyThreadedClassVisitor(executor); - - classPool.classesAccept(classVisitor); - - try - { - // Shutdown the executor service to release memory. - executor.shutdown(); - - // Rethrow any exception that was thrown in the executor threads. - classVisitor.awaitTermination(); - } - catch (InterruptedException e) - { - throw new RuntimeException("Parallel execution is taking too long", e); - } - catch (ExecutionException e) - { - throw new RuntimeException(e.getCause()); - } - } - } - - - private class MyThreadFactory - implements ThreadFactory - { - private int threadCounter = 0; - - public Thread newThread(Runnable runnable) - { - return new MyClassVisitorThread(++threadCounter, runnable); - } - } - - - private class MyClassVisitorThread - extends Thread - { - private final ClassVisitor classVisitor = classVisitorFactory.createClassVisitor(); - - public MyClassVisitorThread(int counter, Runnable runnable) - { - super(runnable, "Parallel Class Visitor " + counter); - } - } - - - private static class MyThreadedClassVisitor - implements ClassVisitor - { - private final ExecutorService executorService; - - private final List futures = new ArrayList(); - - public MyThreadedClassVisitor(ExecutorService executorService) - { - this.executorService = executorService; - } - - public void awaitTermination() throws ExecutionException, InterruptedException - { - for (Future future : futures) - { - future.get(); - } - } - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) - { - submitClassToExecutorService(libraryClass); - } - - - public void visitProgramClass(ProgramClass programClass) - { - submitClassToExecutorService(programClass); - } - - - private void submitClassToExecutorService(final Clazz clazz) - { - futures.add(executorService.submit(new Runnable() - { - public void run() - { - MyClassVisitorThread thread = (MyClassVisitorThread)Thread.currentThread(); - clazz.accept(thread.classVisitor); - } - })); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ParameterVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ParameterVisitor.java deleted file mode 100644 index 503d1ac8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ParameterVisitor.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This interface specifies the methods for a visitor of method parameters or - * field types (which can be considered parameters when storing values). The - * parameters do not include or count the 'this' parameter or the method return - * value. - * - * @author Eric Lafortune - */ -public interface ParameterVisitor -{ - /** - * Visits the given parameter. - * @param clazz the class of the method. - * @param member the field or method of the parameter. - * @param parameterIndex the index of the parameter. - * @param parameterCount the total number of parameters. - * @param parameterOffset the offset of the parameter, accounting for - * longs and doubles taking up two entries. - * @param parameterSize the total size of the parameters, accounting for - * longs and doubles taking up two entries. - * @param parameterType the parameter type. - * @param referencedClass the class contained in the parameter type, if any. - */ - public void visitParameter(Clazz clazz, - Member member, - int parameterIndex, - int parameterCount, - int parameterOffset, - int parameterSize, - String parameterType, - Clazz referencedClass); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ProgramClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ProgramClassFilter.java deleted file mode 100644 index 0d57634d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ProgramClassFilter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, but only when visiting program classes. - * - * @author Eric Lafortune - */ -public class ProgramClassFilter implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new ProgramClassFilter. - * @param classVisitor the ClassVisitor to which visits - * will be delegated. - */ - public ProgramClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - classVisitor.visitProgramClass(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Don't delegate visits to library classes. - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ProgramMemberFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ProgramMemberFilter.java deleted file mode 100644 index 9315b373..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ProgramMemberFilter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when visiting members of program - * classes. - * - * @author Eric Lafortune - */ -public class ProgramMemberFilter implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new ProgramMemberFilter. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public ProgramMemberFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - memberVisitor.visitProgramField(programClass, programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - // Don't delegate visits to library members. - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - // Don't delegate visits to library members. - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ReferencedClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ReferencedClassVisitor.java deleted file mode 100644 index 9b62ff68..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ReferencedClassVisitor.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ClassVisitor, MemberVisitor, ConstantVisitor, AttributeVisitor, etc. - * lets a given ClassVisitor visit all the referenced classes of the elements - * that it visits. Only downstream elements are considered (in order to avoid - * loops and repeated visits). - * - * @author Eric Lafortune - */ -public class ReferencedClassVisitor -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor, - AttributeVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - protected final ClassVisitor classVisitor; - - - public ReferencedClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Visit the constant pool entries. - programClass.constantPoolEntriesAccept(this); - - // Visit the fields and methods. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Visit the attributes. - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Visit the superclass and interfaces. - libraryClass.superClassAccept(classVisitor); - libraryClass.interfacesAccept(classVisitor); - - // Visit the fields and methods. - libraryClass.fieldsAccept(this); - libraryClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Let the visitor visit the classes referenced in the descriptor string. - programMember.referencedClassesAccept(classVisitor); - - // Visit the attributes. - programMember.attributesAccept(programClass, this); - } - - - public void visitLibraryMember(LibraryClass programClass, LibraryMember libraryMember) - { - // Let the visitor visit the classes referenced in the descriptor string. - libraryMember.referencedClassesAccept(classVisitor); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Let the visitor visit the class referenced in the string constant. - stringConstant.referencedClassAccept(classVisitor); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - // Let the visitor visit the class referenced in the reference constant. - refConstant.referencedClassAccept(classVisitor); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Let the visitor visit the class referenced in the reference constant. - invokeDynamicConstant.referencedClassesAccept(classVisitor); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Let the visitor visit the class referenced in the class constant. - classConstant.referencedClassAccept(classVisitor); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - // Let the visitor visit the classes referenced in the method type constant. - methodTypeConstant.referencedClassesAccept(classVisitor); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - // Let the visitor visit the class of the enclosing method. - enclosingMethodAttribute.referencedClassAccept(classVisitor); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Visit the attributes of the code attribute. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Visit the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Visit the local variable types. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - // Let the visitor visit the classes referenced in the signature string. - signatureAttribute.referencedClassesAccept(classVisitor); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Visit the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Visit the parameter annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Visit the default element value. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Let the visitor visit the class referenced in the local variable. - localVariableInfo.referencedClassAccept(classVisitor); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Let the visitor visit the classes referenced in the local variable type. - localVariableTypeInfo.referencedClassesAccept(classVisitor); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - // Let the visitor visit the classes referenced in the annotation. - annotation.referencedClassesAccept(classVisitor); - - // Visit the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) {} - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - // Let the visitor visit the classes referenced in the constant element value. - enumConstantElementValue.referencedClassesAccept(classVisitor); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - // Let the visitor visit the classes referenced in the class element value. - classElementValue.referencedClassesAccept(classVisitor); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - // Visit the contained annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - // Visit the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ReferencedMemberVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ReferencedMemberVisitor.java deleted file mode 100644 index 3cce2c0f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/ReferencedMemberVisitor.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.ElementValueVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This ConstantVisitor and ElementValueVisitor lets a given MemberVisitor - * visit all the referenced class members of the elements that it visits. - * - * @author Eric Lafortune - */ -public class ReferencedMemberVisitor -extends SimplifiedVisitor -implements ConstantVisitor, - ElementValueVisitor -{ - protected final MemberVisitor memberVisitor; - - - public ReferencedMemberVisitor(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - stringConstant.referencedMemberAccept(memberVisitor); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - refConstant.referencedMemberAccept(memberVisitor); - } - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) - { - elementValue.referencedMethodAccept(memberVisitor); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SimilarMemberVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SimilarMemberVisitor.java deleted file mode 100644 index 2c9e39cb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SimilarMemberVisitor.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This MemberVisitor lets a given MemberVisitor - * visit all members that have the same name and type as the visited methods - * in the class hierarchy of the members' classes or of a given target class. - * - * @author Eric Lafortune - */ -public class SimilarMemberVisitor -implements MemberVisitor -{ - private final Clazz targetClass; - private final boolean visitThisMember; - private final boolean visitSuperMembers; - private final boolean visitInterfaceMembers; - private final boolean visitOverridingMembers; - private final MemberVisitor memberVisitor; - - - /** - * Creates a new SimilarMemberVisitor. - * @param visitThisMember specifies whether to visit the class - * members in the members' classes themselves. - * @param visitSuperMembers specifies whether to visit the class - * members in the super classes of the - * members' classes. - * @param visitInterfaceMembers specifies whether to visit the class - * members in the interface classes of the - * members' classes. - * @param visitOverridingMembers specifies whether to visit the class - * members in the subclasses of the members' - * classes. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public SimilarMemberVisitor(boolean visitThisMember, - boolean visitSuperMembers, - boolean visitInterfaceMembers, - boolean visitOverridingMembers, - MemberVisitor memberVisitor) - { - this(null, - visitThisMember, - visitSuperMembers, - visitInterfaceMembers, - visitOverridingMembers, - memberVisitor); - } - - - /** - * Creates a new SimilarMemberVisitor. - * @param targetClass the class in whose hierarchy to look for - * the visited class members. - * @param visitThisMember specifies whether to visit the class - * members in the target class itself. - * @param visitSuperMembers specifies whether to visit the class - * members in the super classes of the target - * class. - * @param visitInterfaceMembers specifies whether to visit the class - * members in the interface classes of the - * target class. - * @param visitOverridingMembers specifies whether to visit the class - * members in the subclasses of the target - * class. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public SimilarMemberVisitor(Clazz targetClass, - boolean visitThisMember, - boolean visitSuperMembers, - boolean visitInterfaceMembers, - boolean visitOverridingMembers, - MemberVisitor memberVisitor) - { - this.targetClass = targetClass; - this.visitThisMember = visitThisMember; - this.visitSuperMembers = visitSuperMembers; - this.visitInterfaceMembers = visitInterfaceMembers; - this.visitOverridingMembers = visitOverridingMembers; - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - Clazz targetClass = targetClass(programClass); - - targetClass.hierarchyAccept(visitThisMember, - visitSuperMembers, - visitInterfaceMembers, - visitOverridingMembers, - new NamedFieldVisitor(programField.getName(programClass), - programField.getDescriptor(programClass), - memberVisitor)); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - Clazz targetClass = targetClass(libraryClass); - - targetClass.hierarchyAccept(visitThisMember, - visitSuperMembers, - visitInterfaceMembers, - visitOverridingMembers, - new NamedFieldVisitor(libraryField.getName(libraryClass), - libraryField.getDescriptor(libraryClass), - memberVisitor)); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - Clazz targetClass = targetClass(programClass); - - targetClass.hierarchyAccept(visitThisMember, - visitSuperMembers, - visitInterfaceMembers, - visitOverridingMembers, - new NamedMethodVisitor(programMethod.getName(programClass), - programMethod.getDescriptor(programClass), - memberVisitor)); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - Clazz targetClass = targetClass(libraryClass); - - targetClass.hierarchyAccept(visitThisMember, - visitSuperMembers, - visitInterfaceMembers, - visitOverridingMembers, - new NamedMethodVisitor(libraryMethod.getName(libraryClass), - libraryMethod.getDescriptor(libraryClass), - memberVisitor)); - } - - - /** - * Returns the target class, or the given class if the target class is - * null. - */ - private Clazz targetClass(Clazz clazz) - { - return targetClass != null ? targetClass : clazz; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SimpleClassPrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SimpleClassPrinter.java deleted file mode 100644 index 34fa6ef5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SimpleClassPrinter.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; - -import java.io.PrintWriter; - - -/** - * This ClassVisitor and MemberVisitor - * prints out the class names of the classes it visits, and the full class - * member descriptions of the class members it visits. The names are printed - * in a readable, Java-like format. The access modifiers can be included or not. - * - * @author Eric Lafortune - */ -public class SimpleClassPrinter -implements ClassVisitor, - MemberVisitor -{ - private final boolean printAccessModifiers; - private final PrintWriter pw; - - - /** - * Creates a new SimpleClassPrinter that prints to the standard output, with - * or without the access modifiers. - */ - public SimpleClassPrinter(boolean printAccessModifiers) - { - // We're using the system's default character encoding for writing to - // the standard output. - this(printAccessModifiers, new PrintWriter(System.out, true)); - } - - - /** - * Creates a new SimpleClassPrinter that prints to the given writer, with - * or without the access modifiers. - */ - public SimpleClassPrinter(boolean printAccessModifiers, - PrintWriter printWriter) - { - this.printAccessModifiers = printAccessModifiers; - this.pw = printWriter; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - pw.println(ClassUtil.externalFullClassDescription( - printAccessModifiers ? - programClass.getAccessFlags() : - 0, - programClass.getName())); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - pw.println(ClassUtil.externalFullClassDescription( - printAccessModifiers ? - libraryClass.getAccessFlags() : - 0, - libraryClass.getName())); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - pw.println(ClassUtil.externalFullClassDescription( - printAccessModifiers ? - programClass.getAccessFlags() : - 0, - programClass.getName()) + - ": " + - ClassUtil.externalFullFieldDescription( - printAccessModifiers ? - programField.getAccessFlags() : - 0, - programField.getName(programClass), - programField.getDescriptor(programClass))); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - pw.println(ClassUtil.externalFullClassDescription( - printAccessModifiers ? - programClass.getAccessFlags() : - 0, - programClass.getName()) + - ": " + - ClassUtil.externalFullMethodDescription( - programClass.getName(), - printAccessModifiers ? - programMethod.getAccessFlags() : - 0, - programMethod.getName(programClass), - programMethod.getDescriptor(programClass))); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - pw.println(ClassUtil.externalFullClassDescription( - printAccessModifiers ? - libraryClass.getAccessFlags() : - 0, - libraryClass.getName()) + - ": " + - ClassUtil.externalFullFieldDescription( - printAccessModifiers ? - libraryField.getAccessFlags() : - 0, - libraryField.getName(libraryClass), - libraryField.getDescriptor(libraryClass))); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - pw.println(ClassUtil.externalFullClassDescription( - printAccessModifiers ? - libraryClass.getAccessFlags() : - 0, - libraryClass.getName()) + - ": " + - ClassUtil.externalFullMethodDescription( - libraryClass.getName(), - printAccessModifiers ? - libraryMethod.getAccessFlags() : - 0, - libraryMethod.getName(libraryClass), - libraryMethod.getDescriptor(libraryClass))); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SingleTimeClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SingleTimeClassVisitor.java deleted file mode 100644 index 2d6ef80a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SingleTimeClassVisitor.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates all visits to a given ClassVisitor, although - * only once to the same class in a row. - * - * @author Eric Lafortune - */ -public class SingleTimeClassVisitor implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - private Clazz lastVisitedClass; - - - public SingleTimeClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (!programClass.equals(lastVisitedClass)) - { - classVisitor.visitProgramClass(programClass); - - lastVisitedClass = programClass; - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (!libraryClass.equals(lastVisitedClass)) - { - classVisitor.visitLibraryClass(libraryClass); - - lastVisitedClass = libraryClass; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SubclassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SubclassFilter.java deleted file mode 100644 index ea377fba..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SubclassFilter.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, except for classes that have a given class as - * direct subclass. - * - * @author Eric Lafortune - */ -public class SubclassFilter implements ClassVisitor -{ - private final Clazz subclass; - private final ClassVisitor classVisitor; - - - /** - * Creates a new SubclassFilter. - * @param subclass the class whose superclasses will not be visited. - * @param classVisitor the ClassVisitor to which visits will - * be delegated. - */ - public SubclassFilter(Clazz subclass, - ClassVisitor classVisitor) - { - this.subclass = subclass; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (!present(programClass.subClasses)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (!present(libraryClass.subClasses)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } - - - // Small utility methods. - - private boolean present(Clazz[] subclasses) - { - if (subclasses == null) - { - return false; - } - - for (int index = 0; index < subclasses.length; index++) - { - if (subclasses[index].equals(subclass)) - { - return true; - } - } - - return false; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SubclassTraveler.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SubclassTraveler.java deleted file mode 100644 index 13c3cd98..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/SubclassTraveler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor lets a given ClassVisitor - * travel to direct subclasses of the visited class. - * - * @author Eric Lafortune - */ -public class SubclassTraveler implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new ClassHierarchyTraveler. - * @param classVisitor the ClassVisitor to - * which visits will be delegated. - */ - public SubclassTraveler(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.subclassesAccept(classVisitor); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.subclassesAccept(classVisitor); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/VariableClassVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/VariableClassVisitor.java deleted file mode 100644 index 9d72f5a5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/VariableClassVisitor.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This ClassVisitor delegates all method calls to a ClassVisitor - * that can be changed at any time. - * - * @author Eric Lafortune - */ -public class VariableClassVisitor implements ClassVisitor -{ - private ClassVisitor classVisitor; - - - public VariableClassVisitor() - { - this(null); - } - - - public VariableClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - public void setClassVisitor(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - public ClassVisitor getClassVisitor() - { - return classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (classVisitor != null) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (classVisitor != null) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/VariableMemberVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/VariableMemberVisitor.java deleted file mode 100644 index 62680416..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/VariableMemberVisitor.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.classfile.visitor; - -import proguard.classfile.*; - - -/** - * This MemberVisitor delegates all method calls to a MemberVisitor - * that can be changed at any time. - * - * @author Eric Lafortune - */ -public class VariableMemberVisitor implements MemberVisitor -{ - private MemberVisitor memberVisitor; - - - public VariableMemberVisitor() - { - this(null); - } - - - public VariableMemberVisitor(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - public void setMemberVisitor(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - public MemberVisitor getMemberVisitor() - { - return memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (memberVisitor != null) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (memberVisitor != null) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (memberVisitor != null) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (memberVisitor != null) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/package.html deleted file mode 100644 index d3be40c0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/classfile/visitor/package.html +++ /dev/null @@ -1,40 +0,0 @@ - -This package contains interfaces and classes for processing class files from -the {@link proguard.classfile proguard.classfile} package using -the visitor pattern. Cfr., for instance, "Design Patterns, Elements of -Reusable OO Software", by Gamma, Helm, Johnson, and Vlissider. -

-Why the visitor pattern? Class files frequently contain lists of elements of -various mixed types: class items, constant pool entries, attributes,... -These lists and types are largely fixed; they won't change much in future -releases of the Java class file specifications. On the other hand, the kinds -of operations that we may wish to perform on the class files may change and -expand. We want to separate the objects and the operations performed upon them. -This is a good place to use the visitor pattern. -

-Visitor interfaces avoid having to do series of instanceof tests -on the elements of a list, followed by type casts and the proper operations. -Every list element is a visitor accepter. When its accept method -is called by a visitor, it calls its corresponding visitX method -in the visitor, passing itself as an argument. This technique is called -double-dispatch. -

-As already mentioned, the main advantage is avoiding lots of -instanceof tests and type casts. Also, implementing a visitor -interface ensures you're handling all possible visitor accepter types. Each -type has its own method, which you simply have to implement. -

-A disadvantage is that the visitor methods always get the same names, specified -by the visitor interface. These names aren't descriptive at all, making code -harder to read. It's the visitor classes that describe the operations now. -

-Also, the visitor methods always have the same parameters and return values, as -specified by the visitor interfaces. Passing additional parameters is done by -means of extra fields in the visitor, which is somewhat of a kludge. -

-Because objects (the visitor accepters) and the operations performed upon them -(the visitors) are now separated, it becomes harder to associate some state -with the objects. For convenience, we always provide an extra visitor -info field in visitor accepters, in which visitors can put any temporary -information they want. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLogger.java b/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLogger.java deleted file mode 100644 index 0b080152..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLogger.java +++ /dev/null @@ -1,789 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.configuration; - - -import java.io.*; -import java.lang.reflect.*; -import java.util.*; - -/** - * This class can be injected in applications to log information about reflection - * being used in the application code, and suggest appropriate ProGuard rules for - * keeping the reflected classes, methods and/or fields. - * - * @author Johan Leys - */ -public class ConfigurationLogger implements Runnable -{ - public static final boolean LOG_ONCE = true; - - private static final String LOG_TAG = "ProGuard"; - - public static final String CLASS_MAP_FILENAME = "classmap.txt"; - - private static final String EMPTY_LINE = "\u00a0\n"; - - // Set with missing class names. - private static final Set missingClasses = new HashSet(); - - // Map from class name to missing constructors. - private static final Map> missingConstructors = new HashMap>(); - // Set of classes on which getConstructors or getDeclaredConstructors is invoked. - private static final Set constructorListingClasses = new HashSet(); - - // Map from class name to missing method signatures. - private static final Map> missingMethods = new HashMap>(); - // Set of classes on which getMethods or getDeclaredMethods is invoked. - private static final Set methodListingClasses = new HashSet(); - - // Map from class name to missing field names. - private static final Map> missingFields = new HashMap>(); - // Set of classes on which getFields or getDeclaredFields is invoked. - private static final Set fieldListingCLasses = new HashSet(); - - // Map from obfuscated class name to original class name. - private static Map classNameMap; - - // Set of classes that have renamed or removed methods. - private static Set classesWithObfuscatedMethods; - - // Set of classes that have renamed or removed fields. - private static Set classesWithObfuscatedFields; - - private static Method logMethod; - - // Try to find the Android logging class. - static - { - try - { - Class logClass = Class.forName("android.util.Log"); - logMethod = logClass.getMethod("w", String.class, String. class); - } - catch (Exception e) {} - } - - // Classes. - - /** - * Log a failed call to Class.forName(). - * - * @param callingClassName - * @param missingClassName - */ - public static void logForName(String callingClassName, - String missingClassName) - { - logMissingClass(callingClassName, "Class", "forName", missingClassName); - } - - /** - * Log a failed call to ClassLoader.loadClass(). - * - * @param callingClassName - * @param missingClassName - */ - public static void logLoadClass(String callingClassName, - String missingClassName) - { - logMissingClass(callingClassName, "ClassLoader", "loadClass", missingClassName); - } - - - /** - * Log a failed call to Class.forName(). - * - * @param callingClassName - * @param missingClassName - */ - public static void logMissingClass(String callingClassName, - String invokedClassName, - String invokedMethodName, - String missingClassName) - { - if (!LOG_ONCE || !missingClasses.contains(missingClassName)) - { - missingClasses.add(missingClassName); - log( - "The class '" + originalClassName(callingClassName) + "' is calling " + invokedClassName + "." + invokedMethodName + " to retrieve\n" + - "the class '" + missingClassName + "', but the latter could not be found.\n" + - "It may have been obfuscated or shrunk.\n" + - "You should consider preserving the class with its original name,\n" + - "with a setting like:\n" + - EMPTY_LINE + - keepClassRule(missingClassName) + "\n" + - EMPTY_LINE); - } - } - - - // Constructors. - - - /** - * Log a failed call to Class.getDeclaredConstructor(). - * - * @param invokingClassName - * @param reflectedClass - * @param constructorParameters - */ - public static void logGetDeclaredConstructor(String invokingClassName, - Class reflectedClass, - Class[] constructorParameters) - { - logGetConstructor(invokingClassName, "getDeclaredConstructor", reflectedClass, constructorParameters); - } - - - /** - * Log a failed call to Class.getConstructor(). - * - * @param invokingClassName - * @param reflectedClass - * @param constructorParameters - */ - public static void logGetConstructor(String invokingClassName, - Class reflectedClass, - Class[] constructorParameters) - { - logGetConstructor(invokingClassName, "getConstructor", reflectedClass, constructorParameters); - } - - - /** - * Log a failed call to one of the constructor retrieving methods on Class. - * - * @param invokingClassName - * @param invokedMethodName - * @param reflectedClass - * @param constructorParameters - */ - public static void logGetConstructor(String invokingClassName, - String invokedMethodName, - Class reflectedClass, - Class[] constructorParameters) - { - MethodSignature signature = new MethodSignature("", constructorParameters); - - Set constructors = missingConstructors.get(reflectedClass.getName()); - if (constructors == null) - { - constructors = new HashSet(); - missingConstructors.put(reflectedClass.getName(), constructors); - } - - if ((!LOG_ONCE || !constructors.contains(signature)) && !isLibraryClass(reflectedClass)) - { - constructors.add(signature); - log( - "The class '" + originalClassName(invokingClassName) + "' is calling Class." + invokedMethodName + "\n" + - "on class '" + originalClassName(reflectedClass) + "' to retrieve\n" + - "the constructor with signature (" + originalSignature(signature) + "), but the latter could not be found.\n" + - "It may have been obfuscated or shrunk.\n" + - "You should consider preserving the constructor, with a setting like:\n" + - EMPTY_LINE + - keepConstructorRule(reflectedClass.getName(), signature) + "\n" + - EMPTY_LINE); - } - } - - - /** - * Log a call to Class.getDeclaredConstructors(). - * - * @param invokingClassName - * @param reflectedClass - */ - public static void logGetDeclaredConstructors(String invokingClassName, - Class reflectedClass ) - { - logGetConstructors(invokingClassName, reflectedClass, "getDeclaredConstructors"); - } - - - /** - * Log a call to Class.getConstructors(). - * - * @param invokingClassName - * @param reflectedClass - */ - public static void logGetConstructors(String invokingClassName, - Class reflectedClass ) - { - logGetConstructors(invokingClassName, reflectedClass, "getConstructors"); - } - - - /** - * Log a call to one of the constructor listing methods on Class. - * - * @param invokingClassName - * @param reflectedClass - * @param reflectedMethodName - */ - private static void logGetConstructors(String invokingClassName, - Class reflectedClass, - String reflectedMethodName) - { - initializeMappings(); - if (classesWithObfuscatedMethods.contains(reflectedClass.getName()) && - !constructorListingClasses.contains(reflectedClass.getName()) && - !isLibraryClass(reflectedClass)) - { - constructorListingClasses.add(reflectedClass.getName()); - log( - "The class '" + originalClassName(invokingClassName) + "' is calling Class." + reflectedMethodName + "\n" + - "on class '" + originalClassName(reflectedClass) + "' to retrieve its constructors.\n" + - "You might consider preserving all constructors with their original names,\n" + - "with a setting like:\n" + - EMPTY_LINE + - keepAllConstructorsRule(reflectedClass) + "\n" + - EMPTY_LINE); - } - } - - - // Methods. - - - /** - * Log a failed call to Class.getDeclaredMethod(). - * - * @param invokingClassName - * @param reflectedClass - * @param reflectedMethodName - * @param methodParameters - */ - public static void logGetDeclaredMethod(String invokingClassName, - Class reflectedClass, - String reflectedMethodName, - Class[] methodParameters ) - { - logGetMethod(invokingClassName, "getDeclaredMethod", reflectedClass, reflectedMethodName, methodParameters); - } - - - /** - * Log a failed call to Class.getMethod(). - * - * @param invokingClassName - * @param reflectedClass - * @param reflectedMethodName - * @param methodParameters - */ - public static void logGetMethod(String invokingClassName, - Class reflectedClass, - String reflectedMethodName, - Class[] methodParameters ) - { - logGetMethod(invokingClassName, "getMethod", reflectedClass, reflectedMethodName, methodParameters); - } - - - /** - * Log a failed call to one of the method retrieving methods on Class. - * @param invokingClassName - * @param invokedReflectionMethodName - * @param reflectedClass - * @param reflectedMethodName - * @param methodParameters - */ - private static void logGetMethod(String invokingClassName, - String invokedReflectionMethodName, - Class reflectedClass, - String reflectedMethodName, - Class[] methodParameters ) - { - Set methods = missingMethods.get(reflectedClass.getName()); - if (methods == null) - { - methods = new HashSet(); - missingMethods.put(reflectedClass.getName(), methods); - } - - MethodSignature signature = new MethodSignature(reflectedMethodName, methodParameters); - if (!methods.contains(signature) && !isLibraryClass(reflectedClass)) - { - methods.add(signature); - log( - "The class '" + originalClassName(invokingClassName) + - "' is calling Class." + invokedReflectionMethodName + "\n" + - "on class '" + originalClassName(reflectedClass) + - "' to retrieve the method\n" + - reflectedMethodName + "(" + originalSignature(signature) + "),\n" + - "but the latter could not be found. It may have been obfuscated or shrunk.\n" + - "You should consider preserving the method with its original name,\n" + - "with a setting like:\n" + - EMPTY_LINE + - keepMethodRule(reflectedClass.getName(), reflectedMethodName, signature) + "\n" + - EMPTY_LINE); - } - } - - - /** - * Log a call to Class.getDeclaredMethods(). - * - * @param invokingClassName - * @param reflectedClass - */ - public static void logGetDeclaredMethods(String invokingClassName, - Class reflectedClass ) - { - logGetMethods(invokingClassName, "getDeclaredMethods", reflectedClass); - } - - - /** - * Log a call to Class.getMethods(). - * - * @param invokingClassName - * @param reflectedClass - */ - public static void logGetMethods(String invokingClassName, - Class reflectedClass ) - { - logGetMethods(invokingClassName, "getMethods", reflectedClass); - } - - - /** - * Log a call to one of the method listing methods on Class. - * - * @param invokingClassName - * @param invokedReflectionMethodName - * @param reflectedClass - */ - private static void logGetMethods(String invokingClassName, - String invokedReflectionMethodName, - Class reflectedClass ) - { - initializeMappings(); - if (classesWithObfuscatedMethods.contains(reflectedClass.getName()) && - !methodListingClasses.contains(reflectedClass.getName()) && - !isLibraryClass(reflectedClass)) - { - methodListingClasses.add(reflectedClass.getName()); - log( - "The class '" + originalClassName(invokingClassName) + - "' is calling Class." + invokedReflectionMethodName + "\n" + - "on class '" + originalClassName(reflectedClass) + - "' to retrieve its methods.\n" + - "You might consider preserving all methods with their original names,\n" + - "with a setting like:\n" + - EMPTY_LINE + - keepAllMethodsRule(reflectedClass) + "\n" + - EMPTY_LINE); - } - } - - - // Fields. - - - /** - * Log a failed call to Class.getField(). - * - * @param invokingClassName - * @param reflectedClass - * @param reflectedFieldName - */ - public static void logGetField(String invokingClassName, - Class reflectedClass, - String reflectedFieldName) - { - logGetField(invokingClassName, "getField", reflectedClass, reflectedFieldName); - } - - - /** - * Log a failed call to Class.getDeclaredField(). - * - * @param invokingClassName - * @param reflectedClass - * @param reflectedFieldName - */ - public static void logGetDeclaredField(String invokingClassName, - Class reflectedClass, - String reflectedFieldName) - { - logGetField(invokingClassName, "getDeclaredField", reflectedClass, reflectedFieldName); - } - - - /** - * Log a failed call to one of the field retrieving methods of Class. - * - * @param invokingClassName - * @param invokedReflectionMethodName - * @param reflectedClass - * @param reflectedFieldName - */ - private static void logGetField(String invokingClassName, - String invokedReflectionMethodName, - Class reflectedClass, - String reflectedFieldName ) - { - Set fields = missingFields.get(reflectedClass.getName()); - if (fields == null) - { - fields = new HashSet(); - missingFields.put(reflectedClass.getName(), fields); - } - - if ((!LOG_ONCE || !fields.contains(reflectedFieldName)) && - !isLibraryClass(reflectedClass)) - { - fields.add(reflectedFieldName); - log( - "The class '" + originalClassName(invokingClassName) + - "' is calling Class." + invokedReflectionMethodName + "\n" + - "on class '" + originalClassName(reflectedClass) + - "' to retrieve the field '" + reflectedFieldName + "',\n" + - "but the latter could not be found. It may have been obfuscated or shrunk.\n" + - "You should consider preserving the field with its original name,\n" + - "with a setting like:\n" + - EMPTY_LINE + - keepFieldRule(reflectedClass.getName(), reflectedFieldName) + "\n" + - EMPTY_LINE); - } - } - - - /** - * Log a call to Class.getDeclaredFields(). - * - * @param invokingClassName - * @param reflectedClass - */ - public static void logGetDeclaredFields(String invokingClassName, - Class reflectedClass ) - { - logGetFields(invokingClassName, "getDeclaredFields", reflectedClass); - } - - - /** - * Log a call to Class.getFields(). - * - * @param invokingClassName - * @param reflectedClass - */ - public static void logGetFields(String invokingClassName, - Class reflectedClass ) - { - logGetFields(invokingClassName, "getFields", reflectedClass); - } - - - /** - * Log a call to one of the field listing methods on Class. - * - * @param invokingClassName - * @param invokedReflectionMethodName - * @param reflectedClass - */ - private static void logGetFields(String invokingClassName, - String invokedReflectionMethodName, - Class reflectedClass ) - { - initializeMappings(); - if (classesWithObfuscatedFields.contains(reflectedClass.getName()) && - !fieldListingCLasses.contains(reflectedClass.getName()) && - !isLibraryClass(reflectedClass)) - { - fieldListingCLasses.add(reflectedClass.getName()); - log( - "The class '" + originalClassName(invokingClassName) + - "' is calling Class." + invokedReflectionMethodName + "\n" + - "on class '" + originalClassName(reflectedClass) + - "' to retrieve its fields.\n" + - "You might consider preserving all fields with their original names,\n" + - "with a setting like:\n" + - EMPTY_LINE + - keepAllFieldsRule(reflectedClass) + "\n" + - EMPTY_LINE); - } - } - - - // Implementations for Runnable. - - public void run() - { - printConfiguration(); - } - - - private static void printConfiguration() - { - log("The following settings may help solving issues related to\n" + - "missing classes, methods and/or fields:\n"); - - for (String clazz : missingClasses) - { - log(keepClassRule(clazz) + "\n"); - } - - for (String clazz : missingConstructors.keySet()) - { - for (MethodSignature constructor : missingConstructors.get(clazz)) - { - log(keepConstructorRule(clazz, constructor) + "\n"); - } - } - - for (String clazz : missingMethods.keySet()) - { - for (MethodSignature method : missingMethods.get(clazz)) - { - log(keepMethodRule(clazz, method.name, method) + "\n"); - } - } - - for (String clazz : missingFields.keySet()) - { - for (String field : missingFields.get(clazz)) - { - log(keepFieldRule(clazz, field) + "\n"); - } - } - } - - - // ProGuard rules. - - private static String keepClassRule(String className) - { - return "-keep class " + className; - } - - - private static String keepConstructorRule(String className, - MethodSignature constructorParameters) - { - return "-keepclassmembers class " + originalClassName(className) + " {\n" + - " public (" + originalSignature(constructorParameters) + ");\n" + - "}"; - } - - - private static String keepMethodRule(String className, - String methodName, - MethodSignature constructorParameters) - { - return "-keepclassmembers class " + originalClassName(className) + " {\n" + - " *** " + methodName + "(" + originalSignature(constructorParameters) + ");\n" + - "}"; - } - - - private static String keepFieldRule(String className, - String fieldName) - { - return "-keepclassmembers class " + originalClassName(className) + " {\n" + - " *** " + fieldName + ";\n" + - "}"; - } - - - private static String keepAllConstructorsRule(Class className) - { - return "-keepclassmembers class " + originalClassName(className) + " {\n" + - " (...);\n" + - "}"; - } - - - private static String keepAllMethodsRule(Class className) - { - return "-keepclassmembers class " + originalClassName(className) + " {\n" + - " ;\n" + - "}"; - } - - - private static String keepAllFieldsRule(Class className) - { - return "-keepclassmembers class " + originalClassName(className) + " {\n" + - " ;\n" + - "}"; - } - - - private static String originalClassName(Class className) - { - return originalClassName(className.getName()); - } - - - private static String originalClassName(String className) - { - initializeMappings(); - String originalClassName = classNameMap.get(className); - return originalClassName != null ? originalClassName : className; - } - - - /** - * Simple heuristic to see if the given class is a library class or not. - * - * @param clazz - * @return - */ - private static boolean isLibraryClass(Class clazz) - { - return clazz.getClassLoader() == String.class.getClassLoader(); - } - - - /** - * Log a message, either on the Android Logcat, if available, or on the - * Standard error outputstream otherwise. - * - * @param message the message to be logged. - */ - private static void log(String message) - { - if (logMethod != null) - { - try - { - logMethod.invoke(null, LOG_TAG, message); - } - catch (Exception e) - { - System.err.println(message); - } - } - else - { - System.err.println(message); - } - } - - - private static void initializeMappings() - { - if (classNameMap == null) - { - classNameMap = new HashMap (); - classesWithObfuscatedMethods = new HashSet (); - classesWithObfuscatedFields = new HashSet (); - - String line; - try - { - BufferedReader reader = - new BufferedReader( - new InputStreamReader( - ConfigurationLogger.class.getClassLoader().getResourceAsStream(CLASS_MAP_FILENAME))); - - while ((line = reader.readLine()) != null) - { - StringTokenizer tokenizer = new StringTokenizer(line, ","); - String originalClassName = tokenizer.nextToken(); - String obfuscatedClassName = tokenizer.nextToken(); - boolean hasObfuscatedMethods = tokenizer.nextToken().equals("1"); - boolean hasObfuscatedFields = tokenizer.nextToken().equals("1"); - - classNameMap.put(obfuscatedClassName, originalClassName); - - if (hasObfuscatedMethods) - { - classesWithObfuscatedMethods.add(obfuscatedClassName); - } - - if (hasObfuscatedFields) - { - classesWithObfuscatedFields.add(obfuscatedClassName); - } - } - reader.close(); - } - catch (IOException e) - { - e.printStackTrace(); - } - } - } - - - private static String originalSignature(MethodSignature signature) - { - StringBuilder stringBuilder = new StringBuilder(); - boolean first = true; - for (String clazz : signature.parameters) - { - if (first) - { - first = false; - } - else - { - stringBuilder.append(","); - } - stringBuilder.append(originalClassName(clazz)); - } - return stringBuilder.toString(); - } - - - public static class MethodSignature - { - private String name; - private String[] parameters; - - - public MethodSignature(String name, Class[] parameters) - { - this.name = name; - this.parameters = new String[parameters.length]; - for (int i = 0; i < parameters.length; i++) - { - this.parameters[i] = parameters[i].getName(); - } - } - - - // Implementations for Object. - - public boolean equals(Object o) - { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MethodSignature that = (MethodSignature)o; - - if (!name.equals(that.name)) return false; - return Arrays.equals(parameters, that.parameters); - } - - - public int hashCode() - { - int result = name.hashCode(); - result = 31 * result + Arrays.hashCode(parameters); - return result; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingAdder.java b/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingAdder.java deleted file mode 100644 index e8999dff..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingAdder.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.configuration; - - -import proguard.*; -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.io.*; -import proguard.optimize.peephole.*; -import proguard.util.MultiValueMap; - -import java.io.IOException; - -import static proguard.classfile.util.ClassUtil.internalClassName; - -/** - * This class can add configuration debug logging code to all code that - * relies on reflection. The added code prints suggestions on which keep - * rules to add to ensure the reflection code will continue working after - * obfuscation and shrinking. - * - * @author Johan Leys - */ -public class ConfigurationLoggingAdder -extends SimplifiedVisitor -implements // Implementation interfaces. - InstructionVisitor -{ - private final Configuration configuration; - - // Field acting as parameter for the visitor methods. - private MultiValueMap injectedClassMap; - - - /** - * Creates a new ConfigurationLoggingAdder. - */ - public ConfigurationLoggingAdder(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Instrumets the given program class pool. - */ - public void execute(ClassPool programClassPool, - ClassPool libraryClassPool, - MultiValueMap injectedClassMap ) - { - // Load the logging utility classes in the program class pool. - // TODO: The initialization could be incomplete if the loaded classes depend on one another. - ClassReader classReader = - new ClassReader(false, false, false, null, - new MultiClassVisitor( - new ClassPoolFiller(programClassPool), - new ClassReferenceInitializer(programClassPool, libraryClassPool), - new ClassSubHierarchyInitializer() - )); - - try - { - classReader.read(new ClassPathDataEntry(ConfigurationLogger.MethodSignature.class)); - classReader.read(new ClassPathDataEntry(ConfigurationLogger.class)); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - - // Set up the instruction sequences and their replacements. - ConfigurationLoggingInstructionSequenceConstants constants = - new ConfigurationLoggingInstructionSequenceConstants(programClassPool, - libraryClassPool); - - BranchTargetFinder branchTargetFinder = new BranchTargetFinder(); - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - // Set the injected class map for the extra visitor. - this.injectedClassMap = injectedClassMap; - - // Replace the instruction sequences in all non-ProGuard classes. - programClassPool.classesAccept( - new ClassNameFilter("!proguard/**", - new AllMethodVisitor( - new AllAttributeVisitor( - new PeepholeOptimizer(branchTargetFinder, codeAttributeEditor, - new ConfigurationLoggingInstructionSequencesReplacer(constants.CONSTANTS, - constants.RESOURCE, - branchTargetFinder, - codeAttributeEditor, - this)))))); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Add a dependency from the modified class on the logging class. - injectedClassMap.put(clazz.getName(), internalClassName(ConfigurationLogger.class.getName())); - injectedClassMap.put(clazz.getName(), internalClassName(ConfigurationLogger.MethodSignature.class.getName())); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequenceConstants.java b/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequenceConstants.java deleted file mode 100644 index 36f353fe..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequenceConstants.java +++ /dev/null @@ -1,479 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.configuration; - -import proguard.classfile.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.util.*; -import proguard.optimize.peephole.InstructionSequenceReplacer; - -import static proguard.optimize.peephole.InstructionSequenceReplacer.catch_; - -/** - * This class contains a set of instruction sequences for accessing class information via reflection, and replacement instructions that add logging information on the reflection that is used. - * - * @author Johan Leys - */ -public class ConfigurationLoggingInstructionSequenceConstants -{ - private static String LOGGER_CLASS_NAME = ClassUtil.internalClassName(ConfigurationLogger.class.getName()); - - // Exceptions classes. - public static final String NAME_CLASS_NOT_FOUND_EXCEPTION = "java/lang/ClassNotFoundException"; - public static final String NAME_NO_SUCH_FIELD_EXCEPTION = "java/lang/NoSuchFieldException"; - public static final String NAME_NO_SUCH_METHOD_EXCEPTION = "java/lang/NoSuchMethodException"; - public static final String NAME_RUNTIME_EXCEPTION = "java/lang/RuntimeException"; - public static final String NAME_UNSATISFIED_LINK_ERROR = "java/lang/UnsatisfiedLinkError"; - public static final String NAME_IO_EXCEPTION = "java/io/IOException"; - - // Matched constants. - public static final int CLASS_NAME = 0x30000000; - public static final int LOCAL_VARIABLE_INDEX_1 = 0x30000001; - public static final int LOCAL_VARIABLE_INDEX_2 = 0x30000002; - public static final int LOCAL_VARIABLE_INDEX_3 = 0x30000003; - - public static final int CONSTANT_INDEX = InstructionSequenceMatcher.X; - public static final int ACCESS_MODE = InstructionSequenceMatcher.Y; - - public final Instruction[][][] RESOURCE; - public final Constant[] CONSTANTS; - - // Labels. - private final InstructionSequenceReplacer.Label TRY_START = InstructionSequenceReplacer.label(); - private final InstructionSequenceReplacer.Label TRY_END = InstructionSequenceReplacer.label(); - private final InstructionSequenceReplacer.Label CATCH_END = InstructionSequenceReplacer.label(); - - private final InstructionSequenceReplacer.Label CLASS_NOT_FOUND_EXCEPTION; - private final InstructionSequenceReplacer.Label NO_SUCH_METHOD_EXCEPTION; - private final InstructionSequenceReplacer.Label NO_SUCH_FIELD_EXCEPTION; - private final InstructionSequenceReplacer.Label IO_EXCEPTION; - private final InstructionSequenceReplacer.Label RUNTIME_EXCEPTION; - private final InstructionSequenceReplacer.Label UNSATISFIED_LINK_ERROR; - - /** - * Creates a new instance of ResourceIdInstructionSequenceConstants, - * with constants that reference classes from the given class pools. - */ - public ConfigurationLoggingInstructionSequenceConstants(ClassPool programClassPool, - ClassPool libraryClassPool) - { - InstructionSequenceBuilder ____ = - new InstructionSequenceBuilder(programClassPool, libraryClassPool); - - ConstantPoolEditor constantPoolEditor = ____.getConstantPoolEditor(); - - CLASS_NOT_FOUND_EXCEPTION = - catch_(TRY_START.offset(), - TRY_END.offset(), - constantPoolEditor.addClassConstant(NAME_CLASS_NOT_FOUND_EXCEPTION, null)); - NO_SUCH_METHOD_EXCEPTION = - catch_(TRY_START.offset(), - TRY_END.offset(), - constantPoolEditor.addClassConstant(NAME_NO_SUCH_METHOD_EXCEPTION, null)); - NO_SUCH_FIELD_EXCEPTION = - catch_(TRY_START.offset(), - TRY_END.offset(), - constantPoolEditor.addClassConstant(NAME_NO_SUCH_FIELD_EXCEPTION, null)); - IO_EXCEPTION = - catch_(TRY_START.offset(), - TRY_END.offset(), - constantPoolEditor.addClassConstant(NAME_IO_EXCEPTION, null)); - RUNTIME_EXCEPTION = - catch_(TRY_START.offset(), - TRY_END.offset(), - constantPoolEditor.addClassConstant(NAME_RUNTIME_EXCEPTION, null)); - UNSATISFIED_LINK_ERROR = - catch_(TRY_START.offset(), - TRY_END.offset(), - constantPoolEditor.addClassConstant(NAME_UNSATISFIED_LINK_ERROR, null)); - - RESOURCE = new Instruction[][][] - { - // Classes. - { - ____.invokestatic("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;").__(), - - ____.dup() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokestatic("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(CLASS_NOT_FOUND_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .invokestatic(LOGGER_CLASS_NAME, "logForName", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokestatic("java/lang/Class", "forName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;").__(), - - ____.dup_x2() - .pop() - .dup_x2() - .pop() - .dup_x2() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokestatic("java/lang/Class", "forName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(CLASS_NOT_FOUND_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .invokestatic(LOGGER_CLASS_NAME, "logForName", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokevirtual("java/lang/ClassLoader", "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;").__(), - - ____.dup() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokevirtual("java/lang/ClassLoader", "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(CLASS_NOT_FOUND_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .invokestatic(LOGGER_CLASS_NAME, "logLoadClass", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - - // Constructors. - { - ____.invokevirtual("java/lang/Class", "getDeclaredConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;").__(), - - ____.dup_x1() - .astore(LOCAL_VARIABLE_INDEX_2) - .dup_x1() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokevirtual("java/lang/Class", "getDeclaredConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(NO_SUCH_METHOD_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .aload(LOCAL_VARIABLE_INDEX_2) - .invokestatic(LOGGER_CLASS_NAME, "logGetDeclaredConstructor", "(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokevirtual("java/lang/Class", "getConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;").__(), - - ____.dup_x1() - .astore(LOCAL_VARIABLE_INDEX_2) - .dup_x1() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokevirtual("java/lang/Class", "getConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(NO_SUCH_METHOD_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .aload(LOCAL_VARIABLE_INDEX_2) - .invokestatic(LOGGER_CLASS_NAME, "logGetConstructor", "(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokevirtual("java/lang/Class", "getDeclaredConstructors", "()[Ljava/lang/reflect/Constructor;").__(), - - ____.dup() - .ldc_(CLASS_NAME) - .swap() - .invokestatic(LOGGER_CLASS_NAME, "logGetDeclaredConstructors", "(Ljava/lang/String;Ljava/lang/Class;)V") - .invokevirtual("java/lang/Class", "getDeclaredConstructors", "()[Ljava/lang/reflect/Constructor;").__() - }, - { - ____.invokevirtual("java/lang/Class", "getConstructors", "()[Ljava/lang/reflect/Constructor;").__(), - - ____.dup() - .ldc_(CLASS_NAME) - .swap() - .invokestatic(LOGGER_CLASS_NAME, "logGetConstructors", "(Ljava/lang/String;Ljava/lang/Class;)V") - .invokevirtual("java/lang/Class", "getConstructors", "()[Ljava/lang/reflect/Constructor;").__() - }, - - // Methods. - - { - ____.invokevirtual("java/lang/Class", "getDeclaredMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;").__(), - - ____.dup_x2() - .astore(LOCAL_VARIABLE_INDEX_3) - .dup_x2() - .astore(LOCAL_VARIABLE_INDEX_2) - .dup_x2() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokevirtual("java/lang/Class", "getDeclaredMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(NO_SUCH_METHOD_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .aload(LOCAL_VARIABLE_INDEX_2) - .aload(LOCAL_VARIABLE_INDEX_3) - .invokestatic(LOGGER_CLASS_NAME, "logGetDeclaredMethod", "(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokevirtual("java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;").__(), - - ____.dup_x2() - .astore(LOCAL_VARIABLE_INDEX_3) - .dup_x2() - .astore(LOCAL_VARIABLE_INDEX_2) - .dup_x2() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokevirtual("java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(NO_SUCH_METHOD_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .aload(LOCAL_VARIABLE_INDEX_2) - .aload(LOCAL_VARIABLE_INDEX_3) - .invokestatic(LOGGER_CLASS_NAME, "logGetMethod", "(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokevirtual("java/lang/Class", "getDeclaredMethods", "()[Ljava/lang/reflect/Method;").__(), - - ____.dup() - .ldc_(CLASS_NAME) - .swap() - .invokestatic(LOGGER_CLASS_NAME, "logGetDeclaredMethods", "(Ljava/lang/String;Ljava/lang/Class;)V") - .invokevirtual("java/lang/Class", "getDeclaredMethods", "()[Ljava/lang/reflect/Method;").__() - }, - { - ____.invokevirtual("java/lang/Class", "getMethods", "()[Ljava/lang/reflect/Method;").__(), - - ____.dup() - .ldc_(CLASS_NAME) - .swap() - .invokestatic(LOGGER_CLASS_NAME, "logGetMethods", "(Ljava/lang/String;Ljava/lang/Class;)V") - .invokevirtual("java/lang/Class", "getMethods", "()[Ljava/lang/reflect/Method;").__() - }, - - // Fields. - - { - ____.invokevirtual("java/lang/Class", "getDeclaredField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;").__(), - - ____.dup_x1() - .astore(LOCAL_VARIABLE_INDEX_2) - .dup_x1() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokevirtual("java/lang/Class", "getDeclaredField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(NO_SUCH_FIELD_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .aload(LOCAL_VARIABLE_INDEX_2) - .invokestatic(LOGGER_CLASS_NAME, "logGetDeclaredField", "(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokevirtual("java/lang/Class", "getField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;").__(), - - ____.dup_x1() - .astore(LOCAL_VARIABLE_INDEX_2) - .dup_x1() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokevirtual("java/lang/Class", "getField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;") - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(NO_SUCH_FIELD_EXCEPTION) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .aload(LOCAL_VARIABLE_INDEX_2) - .invokestatic(LOGGER_CLASS_NAME, "logGetField", "(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokevirtual("java/lang/Class", "getDeclaredFields", "()[Ljava/lang/reflect/Field;").__(), - - ____.dup() - .ldc_(CLASS_NAME) - .swap() - .invokestatic(LOGGER_CLASS_NAME, "logGetDeclaredFields", "(Ljava/lang/String;Ljava/lang/Class;)V") - .invokevirtual("java/lang/Class", "getDeclaredFields", "()[Ljava/lang/reflect/Field;").__() - }, - { - ____.invokevirtual("java/lang/Class", "getFields", "()[Ljava/lang/reflect/Field;").__(), - - ____.dup() - .ldc_(CLASS_NAME) - .swap() - .invokestatic(LOGGER_CLASS_NAME, "logGetFields", "(Ljava/lang/String;Ljava/lang/Class;)V") - .invokevirtual("java/lang/Class", "getFields", "()[Ljava/lang/reflect/Field;").__() - }, - - // Resource files. - - // System.loadLibrary(String) - { - ____.ldc_(CONSTANT_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY).__(), - - ____.ldc_(CONSTANT_INDEX) - .label(TRY_START) - .invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY) - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(UNSATISFIED_LINK_ERROR) - .ldc_(CLASS_NAME) - .ldc_(CONSTANT_INDEX) - .invokestatic(LOGGER_CLASS_NAME, "logLoadLibrary", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY).__(), - - ____.dup() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY) - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(UNSATISFIED_LINK_ERROR) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .invokestatic(LOGGER_CLASS_NAME, "logLoadLibrary", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - - // System.load(String) - { - ____.ldc_(CONSTANT_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD, - ClassConstants.METHOD_TYPE_LOAD).__(), - - ____.ldc_(CONSTANT_INDEX) - .label(TRY_START) - .invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD, - ClassConstants.METHOD_TYPE_LOAD) - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(UNSATISFIED_LINK_ERROR) - .ldc_(CLASS_NAME) - .ldc_(CONSTANT_INDEX) - .invokestatic(LOGGER_CLASS_NAME, "logLoad", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD, - ClassConstants.METHOD_TYPE_LOAD).__(), - - ____.dup() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokestatic(ClassConstants.NAME_JAVA_LANG_SYSTEM, - ClassConstants.METHOD_NAME_LOAD, - ClassConstants.METHOD_TYPE_LOAD) - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(UNSATISFIED_LINK_ERROR) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .invokestatic(LOGGER_CLASS_NAME, "logLoad", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - - // Runtime.loadLibrary(String) - { - ____.ldc_(CONSTANT_INDEX) - .invokestatic(ClassConstants.NAME_JAVA_LANG_RUNTIME, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY).__(), - - ____.ldc_(CONSTANT_INDEX) - .label(TRY_START) - .invokestatic(ClassConstants.NAME_JAVA_LANG_RUNTIME, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY) - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(UNSATISFIED_LINK_ERROR) - .ldc_(CLASS_NAME) - .ldc_(CONSTANT_INDEX) - .invokestatic(LOGGER_CLASS_NAME, "logLoadLibrary", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - { - ____.invokestatic(ClassConstants.NAME_JAVA_LANG_RUNTIME, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY).__(), - - ____.dup() - .astore(LOCAL_VARIABLE_INDEX_1) - .label(TRY_START) - .invokestatic(ClassConstants.NAME_JAVA_LANG_RUNTIME, - ClassConstants.METHOD_NAME_LOAD_LIBRARY, - ClassConstants.METHOD_TYPE_LOAD_LIBRARY) - .label(TRY_END) - .goto_(CATCH_END.offset()) - .catch_(UNSATISFIED_LINK_ERROR) - .ldc_(CLASS_NAME) - .aload(LOCAL_VARIABLE_INDEX_1) - .invokestatic(LOGGER_CLASS_NAME, "logLoadLibrary", "(Ljava/lang/String;Ljava/lang/String;)V") - .athrow() - .label(CATCH_END).__() - }, - }; - - CONSTANTS = ____.constants(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequenceReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequenceReplacer.java deleted file mode 100644 index 25492966..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequenceReplacer.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.configuration; - - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.Constant; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.optimize.peephole.*; - -import static proguard.configuration.ConfigurationLoggingInstructionSequenceConstants.LOCAL_VARIABLE_INDEX_1; -import static proguard.configuration.ConfigurationLoggingInstructionSequenceConstants.LOCAL_VARIABLE_INDEX_2; -import static proguard.configuration.ConfigurationLoggingInstructionSequenceConstants.LOCAL_VARIABLE_INDEX_3; - -/** - * This InstructionSequencesReplacer appends logging instructions to all - * instructions calling reflection methods. - * - * @see InstructionSequenceReplacer - * - * @author Johan Leys - */ -public class ConfigurationLoggingInstructionSequenceReplacer extends InstructionSequenceReplacer -{ - public ConfigurationLoggingInstructionSequenceReplacer(InstructionSequenceMatcher instructionSequenceMatcher, - Constant[] patternConstants, - Instruction[] patternInstructions, - Constant[] replacementConstants, - Instruction[] replacementInstructions, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor ) - { - super(instructionSequenceMatcher, - patternConstants, - patternInstructions, - replacementConstants, - replacementInstructions, - branchTargetFinder, - codeAttributeEditor, - extraInstructionVisitor ); - } - - - public ConfigurationLoggingInstructionSequenceReplacer(Constant[] patternConstants, - Instruction[] patternInstructions, - Constant[] replacementConstants, - Instruction[] replacementInstructions, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor ) - { - super(patternConstants, - patternInstructions, - replacementConstants, - replacementInstructions, - branchTargetFinder, - codeAttributeEditor ); - } - - - public ConfigurationLoggingInstructionSequenceReplacer(Constant[] patternConstants, - Instruction[] patternInstructions, - Constant[] replacementConstants, - Instruction[] replacementInstructions, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor ) - { - super(patternConstants, - patternInstructions, - replacementConstants, - replacementInstructions, - branchTargetFinder, - codeAttributeEditor, - extraInstructionVisitor ); - } - - - @Override - protected int matchedArgument(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int argument) - { - switch (argument) - { - case LOCAL_VARIABLE_INDEX_1: - return codeAttribute.u2maxLocals; - case LOCAL_VARIABLE_INDEX_2: - return codeAttribute.u2maxLocals + 1; - case LOCAL_VARIABLE_INDEX_3: - return codeAttribute.u2maxLocals + 2; - default: - return super.matchedArgument(clazz, argument); - } - } - - - @Override - protected int matchedConstantIndex(ProgramClass programClass, int constantIndex) - { - switch (constantIndex) - { - case ConfigurationLoggingInstructionSequenceConstants.CLASS_NAME: - return new ConstantPoolEditor(programClass) - .addStringConstant(ClassUtil.externalClassName(programClass.getName()), programClass, null); - default: - return super.matchedConstantIndex(programClass, constantIndex); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequencesReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequencesReplacer.java deleted file mode 100644 index cb397abb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/configuration/ConfigurationLoggingInstructionSequencesReplacer.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.configuration; - -import proguard.classfile.constant.Constant; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.*; -import proguard.optimize.peephole.*; - -/** - * This InstructionSequencesReplacer appends logging instructions to all - * instructions calling reflection methods. - * - * @see InstructionSequencesReplacer - * @see ConfigurationLoggingInstructionSequenceReplacer - * - * @author Johan Leys - */ -public class ConfigurationLoggingInstructionSequencesReplacer -extends MultiInstructionVisitor -implements InstructionVisitor -{ - private static final int PATTERN_INDEX = 0; - private static final int REPLACEMENT_INDEX = 1; - - - /** - * Creates a new ConfigurationLoggingInstructionSequencesReplacer. - * - * @param constants any constants referenced by the pattern - * instructions and replacement instructions. - * @param instructionSequences the instruction sequences to be replaced, - * with subsequently the sequence pair index, - * the patten/replacement index (0 or 1), - * and the instruction index in the sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - */ - public ConfigurationLoggingInstructionSequencesReplacer(Constant[] constants, - Instruction[][][] instructionSequences, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor) - { - this(constants, - instructionSequences, - branchTargetFinder, - codeAttributeEditor, - null); - } - - - /** - * Creates a new ConfigurationLoggingInstructionSequencesReplacer. - * - * @param constants any constants referenced by the pattern - * instructions and replacement instructions. - * @param instructionSequences the instruction sequences to be replaced, - * with subsequently the sequence pair index, - * the patten/replacement index (0 or 1), - * and the instruction index in the sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all deleted - * load instructions. - */ - public ConfigurationLoggingInstructionSequencesReplacer(Constant[] constants, - Instruction[][][] instructionSequences, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - super(createInstructionSequenceReplacers(constants, - instructionSequences, - branchTargetFinder, - codeAttributeEditor, - extraInstructionVisitor)); - } - - - /** - * Creates an array of InstructionSequenceReplacer instances. - * - * @param constants any constants referenced by the pattern - * instructions and replacement instructions. - * @param instructionSequences the instruction sequences to be replaced, - * with subsequently the sequence pair index, - * the from/to index (0 or 1), and the - * instruction index in the sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all deleted - * load instructions. - */ - private static InstructionVisitor[] createInstructionSequenceReplacers(Constant[] constants, - Instruction[][][] instructionSequences, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - InstructionVisitor[] instructionSequenceReplacers = - new InstructionSequenceReplacer[instructionSequences.length]; - - for (int index = 0; index < instructionSequenceReplacers.length; index++) - { - Instruction[][] instructionSequencePair = instructionSequences[index]; - instructionSequenceReplacers[index] = - new ConfigurationLoggingInstructionSequenceReplacer(constants, - instructionSequencePair[PATTERN_INDEX], - constants, - instructionSequencePair[REPLACEMENT_INDEX], - branchTargetFinder, - codeAttributeEditor, - extraInstructionVisitor); - } - - return instructionSequenceReplacers; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BasicBranchUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BasicBranchUnit.java deleted file mode 100644 index 89b3b1ac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BasicBranchUnit.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.CodeAttribute; -import proguard.evaluation.value.InstructionOffsetValue; - -/** - * This BranchUnit remembers the branch unit commands that are invoked on it. - * It doesn't consider conditions when branching. - * - * @author Eric Lafortune - */ -public class BasicBranchUnit -implements BranchUnit -{ - protected InstructionOffsetValue traceBranchTargets; - protected boolean wasCalled; - - - /** - * Resets the accumulated branch targets and the flag that tells whether - * any of the branch unit methods was called. - */ - public void reset() - { - traceBranchTargets = InstructionOffsetValue.EMPTY_VALUE; - - wasCalled = false; - } - - /** - * Returns whether any of the branch unit methods was called. - */ - public boolean wasCalled() - { - return wasCalled; - } - - - /** - * Returns the accumulated branch targets that were passed to the branch - * unit methods. - */ - public InstructionOffsetValue getTraceBranchTargets() - { - return traceBranchTargets; - } - - - // Implementations for BranchUnit. - - public void branch(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - int branchTarget) - { - // Override the branch targets. - traceBranchTargets = new InstructionOffsetValue(branchTarget); - - wasCalled = true; - } - - - public void branchConditionally(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - int branchTarget, - int conditional) - { - // Accumulate the branch targets. - traceBranchTargets = - traceBranchTargets.add(branchTarget); - - wasCalled = true; - } - - - public void returnFromMethod() - { - // Stop processing this block. - traceBranchTargets = InstructionOffsetValue.EMPTY_VALUE; - - wasCalled = true; - } - - - public void throwException() - { - // Stop processing this block. - traceBranchTargets = InstructionOffsetValue.EMPTY_VALUE; - - wasCalled = true; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BasicInvocationUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BasicInvocationUnit.java deleted file mode 100644 index be38b722..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BasicInvocationUnit.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.util.ClassUtil; -import proguard.classfile.visitor.MemberVisitor; -import proguard.evaluation.value.*; - -/** - * This InvocationUnit sets up the variables for entering a method, - * and it updates the stack for the invocation of a class member, - * using simple values. - * - * @author Eric Lafortune - */ -public class BasicInvocationUnit -extends SimplifiedInvocationUnit -implements InvocationUnit, - MemberVisitor -{ - protected final ValueFactory valueFactory; - - // Field acting as parameter between the visitor methods. - private Clazz returnTypeClass; - - - /** - * Creates a new BasicInvocationUnit with the given value factory. - */ - public BasicInvocationUnit(ValueFactory valueFactory) - { - this.valueFactory = valueFactory; - } - - - // Implementations for SimplifiedInvocationUnit. - - public Value getExceptionValue(Clazz clazz, - ClassConstant catchClassConstant) - { - String catchClassName = catchClassConstant != null ? - catchClassConstant.getName(clazz) : - ClassConstants.NAME_JAVA_LANG_THROWABLE; - - Clazz catchClass = catchClassConstant != null ? - catchClassConstant.referencedClass : - null; - - return valueFactory.createReferenceValue(catchClassName, - catchClass, - true, - false); - } - - - public void setFieldClassValue(Clazz clazz, - RefConstant refConstant, - ReferenceValue value) - { - // We don't care about the new value. - } - - - public Value getFieldClassValue(Clazz clazz, - RefConstant refConstant, - String type) - { - // Try to figure out the class of the return type. - returnTypeClass = null; - refConstant.referencedMemberAccept(this); - - return valueFactory.createValue(type, - returnTypeClass, - true, - true); - } - - - public void setFieldValue(Clazz clazz, - RefConstant refConstant, - Value value) - { - // We don't care about the new field value. - } - - - public Value getFieldValue(Clazz clazz, - RefConstant refConstant, - String type) - { - // Try to figure out the class of the return type. - returnTypeClass = null; - refConstant.referencedMemberAccept(this); - - return valueFactory.createValue(type, - returnTypeClass, - true, - true); - } - - - public void setMethodParameterValue(Clazz clazz, - RefConstant refConstant, - int parameterIndex, - Value value) - { - // We don't care about the parameter value. - } - - - public Value getMethodParameterValue(Clazz clazz, - Method method, - int parameterIndex, - String type, - Clazz referencedClass) - { - // A "this" parameter can never be null. - boolean isThis = - parameterIndex == 0 && - (method.getAccessFlags() & ClassConstants.ACC_STATIC) == 0; - - return valueFactory.createValue(type, - referencedClass, - true, - !isThis); - } - - - public void setMethodReturnValue(Clazz clazz, - Method method, - Value value) - { - // We don't care about the return value. - } - - - public Value getMethodReturnValue(Clazz clazz, - RefConstant refConstant, - String type) - { - // Try to figure out the class of the return type. - returnTypeClass = null; - refConstant.referencedMemberAccept(this); - - return valueFactory.createValue(type, - returnTypeClass, - true, - true); - } - - - /** - * Returns the return value of the specified method. - */ - public Value getMethodReturnValue(Clazz clazz, - InvokeDynamicConstant invokeDynamicConstant, - String type) - { - // Try to figure out the class of the return type. - Clazz[] referencedClasses = invokeDynamicConstant.referencedClasses; - - Clazz referencedClass = - referencedClasses != null && - ClassUtil.isInternalClassType(type) ? - referencedClasses[referencedClasses.length - 1] : - null; - - return valueFactory.createValue(type, - referencedClass, - true, - true); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - returnTypeClass = programField.referencedClass; - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - Clazz[] referencedClasses = programMethod.referencedClasses; - if (referencedClasses != null && - ClassUtil.isInternalClassType(programMethod.getDescriptor(programClass))) - { - returnTypeClass = referencedClasses[referencedClasses.length - 1]; - } - } - - - public void visitLibraryField(LibraryClass programClass, LibraryField libraryField) - { - returnTypeClass = libraryField.referencedClass; - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - Clazz[] referencedClasses = libraryMethod.referencedClasses; - if (referencedClasses != null && - ClassUtil.isInternalClassType(libraryMethod.getDescriptor(libraryClass))) - { - returnTypeClass = referencedClasses[referencedClasses.length - 1]; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BranchUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BranchUnit.java deleted file mode 100644 index 4dbead1d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/BranchUnit.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.CodeAttribute; - -/** - * This InstructionVisitor evaluates the instructions that it visits. - * - * @author Eric Lafortune - */ -public interface BranchUnit -{ - /** - * Sets the new instruction offset. - */ - public void branch(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - int branchTarget); - - - /** - * Sets the new instruction offset, depending on the certainty of the - * conditional branch. - */ - public void branchConditionally(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - int branchTarget, - int conditional); - - - /** - * Returns from the method with the given value. - */ - public void returnFromMethod(); - - - /** - * Handles the throwing of an exception. - */ - public void throwException(); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/ClassConstantValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/ClassConstantValueFactory.java deleted file mode 100644 index 9b4738e6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/ClassConstantValueFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.*; -import proguard.classfile.constant.ClassConstant; -import proguard.evaluation.value.ValueFactory; - -/** - * This class creates java.lang.Class ReferenceValue instances that correspond - * to specified constant pool entries. - * - * @author Eric Lafortune - */ -public class ClassConstantValueFactory -extends ConstantValueFactory -{ - public ClassConstantValueFactory(ValueFactory valueFactory) - { - super(valueFactory); - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Create a Class reference instead of a reference to the class. - value = valueFactory.createReferenceValue(ClassConstants.NAME_JAVA_LANG_CLASS, - classConstant.javaLangClassClass, - false, - false); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/ConstantValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/ConstantValueFactory.java deleted file mode 100644 index 3733e56c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/ConstantValueFactory.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.evaluation.value.*; - -/** - * This class creates Value instance that correspond to specified constant pool - * entries. - * - * @author Eric Lafortune - */ -public class ConstantValueFactory -extends SimplifiedVisitor -implements ConstantVisitor -{ - protected final ValueFactory valueFactory; - - // Field acting as a parameter for the ConstantVisitor methods. - protected Value value; - - - public ConstantValueFactory(ValueFactory valueFactory) - { - this.valueFactory = valueFactory; - } - - - /** - * Returns the Value of the constant pool element at the given index. - */ - public Value constantValue(Clazz clazz, - int constantIndex) - { - // Visit the constant pool entry to get its return value. - clazz.constantPoolEntryAccept(constantIndex, this); - - return value; - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - value = valueFactory.createIntegerValue(integerConstant.getValue()); - } - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - value = valueFactory.createLongValue(longConstant.getValue()); - } - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - value = valueFactory.createFloatValue(floatConstant.getValue()); - } - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - value = valueFactory.createDoubleValue(doubleConstant.getValue()); - } - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - value = valueFactory.createArrayReferenceValue(""+primitiveArrayConstant.getPrimitiveType(), - null, - valueFactory.createIntegerValue(primitiveArrayConstant.getLength())); - } - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - value = valueFactory.createReferenceValue(ClassConstants.NAME_JAVA_LANG_STRING, - stringConstant.javaLangStringClass, - false, - false); - } - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - value = valueFactory.createReferenceValue(ClassConstants.NAME_JAVA_LANG_INVOKE_METHOD_HANDLE, - methodHandleConstant.javaLangInvokeMethodHandleClass, - false, - false); - } - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - value = valueFactory.createReferenceValue(classConstant.getName(clazz), - classConstant.referencedClass, - false, - false); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - value = valueFactory.createReferenceValue(ClassConstants.NAME_JAVA_LANG_INVOKE_METHOD_TYPE, - methodTypeConstant.javaLangInvokeMethodTypeClass, - false, - false); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/InvocationUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/InvocationUnit.java deleted file mode 100644 index 18141436..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/InvocationUnit.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.ConstantInstruction; -import proguard.evaluation.value.Value; - -/** - * This interface sets up the variables for entering a method, - * and it updates the stack for the invocation of a class member. - * - * @author Eric Lafortune - */ -public interface InvocationUnit -{ - /** - * Sets up the given variables for entering the given method. - */ - public void enterMethod(Clazz clazz, - Method method, - Variables variables); - - - /** - * Exits the given method with the given return value. - */ - public void exitMethod(Clazz clazz, - Method method, - Value returnValue); - - - /** - * Sets up the given stack for entering the given exception handler. - */ - public void enterExceptionHandler(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - int catchType, - Stack stack); - - - /** - * Updates the given stack corresponding to the execution of the given - * field or method reference instruction. - */ - public void invokeMember(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - ConstantInstruction constantInstruction, - Stack stack); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Processor.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Processor.java deleted file mode 100644 index 80b7b98c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Processor.java +++ /dev/null @@ -1,933 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.evaluation.value.*; - -/** - * This InstructionVisitor executes the instructions that it visits on a given - * local variable frame and stack. - * - * @author Eric Lafortune - */ -public class Processor -implements InstructionVisitor -{ - private final Variables variables; - private final Stack stack; - private final ValueFactory valueFactory; - private final BranchUnit branchUnit; - private final InvocationUnit invocationUnit; - private final boolean alwaysCast; - - private final ConstantValueFactory constantValueFactory; - private final ClassConstantValueFactory classConstantValueFactory; - - - /** - * Creates a new processor that operates on the given environment. - * @param variables the local variable frame. - * @param stack the local stack. - * @param valueFactory the value factory that will create all values - * during the evaluation. - * @param branchUnit the class that can affect the program counter. - * @param invocationUnit the class that can access other program members. - * @param alwaysCast a flag that specifies whether downcasts or casts - * of null values should always be performed. - */ - public Processor(Variables variables, - Stack stack, - ValueFactory valueFactory, - BranchUnit branchUnit, - InvocationUnit invocationUnit, - boolean alwaysCast) - { - this.variables = variables; - this.stack = stack; - this.valueFactory = valueFactory; - this.branchUnit = branchUnit; - this.invocationUnit = invocationUnit; - this.alwaysCast = alwaysCast; - - constantValueFactory = new ConstantValueFactory(valueFactory); - classConstantValueFactory = new ClassConstantValueFactory(valueFactory); - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_NOP: - break; - - case InstructionConstants.OP_ACONST_NULL: - stack.push(valueFactory.createReferenceValueNull()); - break; - - case InstructionConstants.OP_ICONST_M1: - case InstructionConstants.OP_ICONST_0: - case InstructionConstants.OP_ICONST_1: - case InstructionConstants.OP_ICONST_2: - case InstructionConstants.OP_ICONST_3: - case InstructionConstants.OP_ICONST_4: - case InstructionConstants.OP_ICONST_5: - case InstructionConstants.OP_BIPUSH: - case InstructionConstants.OP_SIPUSH: - stack.push(valueFactory.createIntegerValue(simpleInstruction.constant)); - break; - - case InstructionConstants.OP_LCONST_0: - case InstructionConstants.OP_LCONST_1: - stack.push(valueFactory.createLongValue(simpleInstruction.constant)); - break; - - case InstructionConstants.OP_FCONST_0: - case InstructionConstants.OP_FCONST_1: - case InstructionConstants.OP_FCONST_2: - stack.push(valueFactory.createFloatValue((float)simpleInstruction.constant)); - break; - - case InstructionConstants.OP_DCONST_0: - case InstructionConstants.OP_DCONST_1: - stack.push(valueFactory.createDoubleValue((double)simpleInstruction.constant)); - break; - - case InstructionConstants.OP_IALOAD: - case InstructionConstants.OP_BALOAD: - case InstructionConstants.OP_CALOAD: - case InstructionConstants.OP_SALOAD: - { - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - stack.push(arrayReference.integerArrayLoad(arrayIndex, valueFactory)); - break; - } - case InstructionConstants.OP_LALOAD: - { - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - stack.push(arrayReference.longArrayLoad(arrayIndex, valueFactory)); - break; - } - case InstructionConstants.OP_FALOAD: - { - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - stack.push(arrayReference.floatArrayLoad(arrayIndex, valueFactory)); - break; - } - case InstructionConstants.OP_DALOAD: - { - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - stack.push(arrayReference.doubleArrayLoad(arrayIndex, valueFactory)); - break; - } - case InstructionConstants.OP_AALOAD: - { - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - stack.push(arrayReference.referenceArrayLoad(arrayIndex, valueFactory)); - break; - } - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - { - Value value = stack.ipop(); - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - arrayReference.arrayStore(arrayIndex, value); - break; - } - case InstructionConstants.OP_LASTORE: - { - Value value = stack.lpop(); - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - arrayReference.arrayStore(arrayIndex, value); - break; - } - case InstructionConstants.OP_FASTORE: - { - Value value = stack.fpop(); - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - arrayReference.arrayStore(arrayIndex, value); - break; - } - case InstructionConstants.OP_DASTORE: - { - Value value = stack.dpop(); - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - arrayReference.arrayStore(arrayIndex, value); - break; - } - case InstructionConstants.OP_AASTORE: - { - Value value = stack.apop(); - IntegerValue arrayIndex = stack.ipop(); - ReferenceValue arrayReference = stack.apop(); - arrayReference.arrayStore(arrayIndex, value); - break; - } - case InstructionConstants.OP_POP: - stack.pop1(); - break; - - case InstructionConstants.OP_POP2: - stack.pop2(); - break; - - case InstructionConstants.OP_DUP: - stack.dup(); - break; - - case InstructionConstants.OP_DUP_X1: - stack.dup_x1(); - break; - - case InstructionConstants.OP_DUP_X2: - stack.dup_x2(); - break; - - case InstructionConstants.OP_DUP2: - stack.dup2(); - break; - - case InstructionConstants.OP_DUP2_X1: - stack.dup2_x1(); - break; - - case InstructionConstants.OP_DUP2_X2: - stack.dup2_x2(); - break; - - case InstructionConstants.OP_SWAP: - stack.swap(); - break; - - case InstructionConstants.OP_IADD: - stack.push(stack.ipop().add(stack.ipop())); - break; - - case InstructionConstants.OP_LADD: - stack.push(stack.lpop().add(stack.lpop())); - break; - - case InstructionConstants.OP_FADD: - stack.push(stack.fpop().add(stack.fpop())); - break; - - case InstructionConstants.OP_DADD: - stack.push(stack.dpop().add(stack.dpop())); - break; - - case InstructionConstants.OP_ISUB: - stack.push(stack.ipop().subtractFrom(stack.ipop())); - break; - - case InstructionConstants.OP_LSUB: - stack.push(stack.lpop().subtractFrom(stack.lpop())); - break; - - case InstructionConstants.OP_FSUB: - stack.push(stack.fpop().subtractFrom(stack.fpop())); - break; - - case InstructionConstants.OP_DSUB: - stack.push(stack.dpop().subtractFrom(stack.dpop())); - break; - - case InstructionConstants.OP_IMUL: - stack.push(stack.ipop().multiply(stack.ipop())); - break; - - case InstructionConstants.OP_LMUL: - stack.push(stack.lpop().multiply(stack.lpop())); - break; - - case InstructionConstants.OP_FMUL: - stack.push(stack.fpop().multiply(stack.fpop())); - break; - - case InstructionConstants.OP_DMUL: - stack.push(stack.dpop().multiply(stack.dpop())); - break; - - case InstructionConstants.OP_IDIV: - try - { - stack.push(stack.ipop().divideOf(stack.ipop())); - } - catch (ArithmeticException ex) - { - stack.push(valueFactory.createIntegerValue()); - // TODO: Forward ArithmeticExceptions. - //stack.clear(); - //stack.push(valueFactory.createReference(false)); - //branchUnit.throwException(); - } - break; - - case InstructionConstants.OP_LDIV: - try - { - stack.push(stack.lpop().divideOf(stack.lpop())); - } - catch (ArithmeticException ex) - { - stack.push(valueFactory.createLongValue()); - // TODO: Forward ArithmeticExceptions. - //stack.clear(); - //stack.push(valueFactory.createReference(false)); - //branchUnit.throwException(); - } - break; - - case InstructionConstants.OP_FDIV: - stack.push(stack.fpop().divideOf(stack.fpop())); - break; - - case InstructionConstants.OP_DDIV: - stack.push(stack.dpop().divideOf(stack.dpop())); - break; - - case InstructionConstants.OP_IREM: - try - { - stack.push(stack.ipop().remainderOf(stack.ipop())); - } - catch (ArithmeticException ex) - { - stack.push(valueFactory.createIntegerValue()); - // TODO: Forward ArithmeticExceptions. - //stack.clear(); - //stack.push(valueFactory.createReference(false)); - //branchUnit.throwException(); - } - break; - - case InstructionConstants.OP_LREM: - try - { - stack.push(stack.lpop().remainderOf(stack.lpop())); - } - catch (ArithmeticException ex) - { - stack.push(valueFactory.createLongValue()); - // TODO: Forward ArithmeticExceptions. - //stack.clear(); - //stack.push(valueFactory.createReference(false)); - //branchUnit.throwException(); - } - break; - - case InstructionConstants.OP_FREM: - stack.push(stack.fpop().remainderOf(stack.fpop())); - break; - - case InstructionConstants.OP_DREM: - stack.push(stack.dpop().remainderOf(stack.dpop())); - break; - - case InstructionConstants.OP_INEG: - stack.push(stack.ipop().negate()); - break; - - case InstructionConstants.OP_LNEG: - stack.push(stack.lpop().negate()); - break; - - case InstructionConstants.OP_FNEG: - stack.push(stack.fpop().negate()); - break; - - case InstructionConstants.OP_DNEG: - stack.push(stack.dpop().negate()); - break; - - case InstructionConstants.OP_ISHL: - stack.push(stack.ipop().shiftLeftOf(stack.ipop())); - break; - - case InstructionConstants.OP_LSHL: - stack.push(stack.ipop().shiftLeftOf(stack.lpop())); - break; - - case InstructionConstants.OP_ISHR: - stack.push(stack.ipop().shiftRightOf(stack.ipop())); - break; - - case InstructionConstants.OP_LSHR: - stack.push(stack.ipop().shiftRightOf(stack.lpop())); - break; - - case InstructionConstants.OP_IUSHR: - stack.push(stack.ipop().unsignedShiftRightOf(stack.ipop())); - break; - - case InstructionConstants.OP_LUSHR: - stack.push(stack.ipop().unsignedShiftRightOf(stack.lpop())); - break; - - case InstructionConstants.OP_IAND: - stack.push(stack.ipop().and(stack.ipop())); - break; - - case InstructionConstants.OP_LAND: - stack.push(stack.lpop().and(stack.lpop())); - break; - - case InstructionConstants.OP_IOR: - stack.push(stack.ipop().or(stack.ipop())); - break; - - case InstructionConstants.OP_LOR: - stack.push(stack.lpop().or(stack.lpop())); - break; - - case InstructionConstants.OP_IXOR: - stack.push(stack.ipop().xor(stack.ipop())); - break; - - case InstructionConstants.OP_LXOR: - stack.push(stack.lpop().xor(stack.lpop())); - break; - - case InstructionConstants.OP_I2L: - stack.push(stack.ipop().convertToLong()); - break; - - case InstructionConstants.OP_I2F: - stack.push(stack.ipop().convertToFloat()); - break; - - case InstructionConstants.OP_I2D: - stack.push(stack.ipop().convertToDouble()); - break; - - case InstructionConstants.OP_L2I: - stack.push(stack.lpop().convertToInteger()); - break; - - case InstructionConstants.OP_L2F: - stack.push(stack.lpop().convertToFloat()); - break; - - case InstructionConstants.OP_L2D: - stack.push(stack.lpop().convertToDouble()); - break; - - case InstructionConstants.OP_F2I: - stack.push(stack.fpop().convertToInteger()); - break; - - case InstructionConstants.OP_F2L: - stack.push(stack.fpop().convertToLong()); - break; - - case InstructionConstants.OP_F2D: - stack.push(stack.fpop().convertToDouble()); - break; - - case InstructionConstants.OP_D2I: - stack.push(stack.dpop().convertToInteger()); - break; - - case InstructionConstants.OP_D2L: - stack.push(stack.dpop().convertToLong()); - break; - - case InstructionConstants.OP_D2F: - stack.push(stack.dpop().convertToFloat()); - break; - - case InstructionConstants.OP_I2B: - stack.push(stack.ipop().convertToByte()); - break; - - case InstructionConstants.OP_I2C: - stack.push(stack.ipop().convertToCharacter()); - break; - - case InstructionConstants.OP_I2S: - stack.push(stack.ipop().convertToShort()); - break; - - case InstructionConstants.OP_LCMP: -// stack.push(stack.lpop().compareReverse(stack.lpop())); - - LongValue longValue1 = stack.lpop(); - LongValue longValue2 = stack.lpop(); - stack.push(longValue2.compare(longValue1)); - break; - - case InstructionConstants.OP_FCMPL: - FloatValue floatValue1 = stack.fpop(); - FloatValue floatValue2 = stack.fpop(); - stack.push(floatValue2.compare(floatValue1)); - break; - - case InstructionConstants.OP_FCMPG: - stack.push(stack.fpop().compareReverse(stack.fpop())); - break; - - case InstructionConstants.OP_DCMPL: - DoubleValue doubleValue1 = stack.dpop(); - DoubleValue doubleValue2 = stack.dpop(); - stack.push(doubleValue2.compare(doubleValue1)); - break; - - case InstructionConstants.OP_DCMPG: - stack.push(stack.dpop().compareReverse(stack.dpop())); - break; - - case InstructionConstants.OP_IRETURN: - invocationUnit.exitMethod(clazz, method, stack.ipop()); - branchUnit.returnFromMethod(); - break; - - case InstructionConstants.OP_LRETURN: - invocationUnit.exitMethod(clazz, method, stack.lpop()); - branchUnit.returnFromMethod(); - break; - - case InstructionConstants.OP_FRETURN: - invocationUnit.exitMethod(clazz, method, stack.fpop()); - branchUnit.returnFromMethod(); - break; - - case InstructionConstants.OP_DRETURN: - invocationUnit.exitMethod(clazz, method, stack.dpop()); - branchUnit.returnFromMethod(); - break; - - case InstructionConstants.OP_ARETURN: - invocationUnit.exitMethod(clazz, method, stack.apop()); - branchUnit.returnFromMethod(); - break; - - case InstructionConstants.OP_RETURN: - branchUnit.returnFromMethod(); - break; - - case InstructionConstants.OP_NEWARRAY: - IntegerValue arrayLength = stack.ipop(); - stack.push(valueFactory.createArrayReferenceValue(String.valueOf(InstructionUtil.internalTypeFromArrayType((byte)simpleInstruction.constant)), - null, - arrayLength)); - break; - - case InstructionConstants.OP_ARRAYLENGTH: - ReferenceValue referenceValue = stack.apop(); - stack.push(referenceValue.arrayLength(valueFactory)); - break; - - case InstructionConstants.OP_ATHROW: - ReferenceValue exceptionReferenceValue = stack.apop(); - stack.clear(); - stack.push(exceptionReferenceValue); - branchUnit.throwException(); - break; - - case InstructionConstants.OP_MONITORENTER: - case InstructionConstants.OP_MONITOREXIT: - stack.apop(); - break; - - default: - throw new IllegalArgumentException("Unknown simple instruction ["+simpleInstruction.opcode+"]"); - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - int constantIndex = constantInstruction.constantIndex; - - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_LDC: - case InstructionConstants.OP_LDC_W: - case InstructionConstants.OP_LDC2_W: - stack.push(classConstantValueFactory.constantValue(clazz, constantIndex)); - break; - - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_PUTSTATIC: - case InstructionConstants.OP_GETFIELD: - case InstructionConstants.OP_PUTFIELD: - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - case InstructionConstants.OP_INVOKEDYNAMIC: - invocationUnit.invokeMember(clazz, method, codeAttribute, offset, constantInstruction, stack); - break; - - case InstructionConstants.OP_NEW: - stack.push(constantValueFactory.constantValue(clazz, constantIndex).referenceValue()); - break; - - case InstructionConstants.OP_ANEWARRAY: - { - ReferenceValue arrayType = constantValueFactory.constantValue(clazz, constantIndex).referenceValue(); - - stack.push(valueFactory.createArrayReferenceValue(arrayType.internalType(), - arrayType.getReferencedClass(), - stack.ipop())); - break; - } - - case InstructionConstants.OP_CHECKCAST: - { - // TODO: Check cast. - ReferenceValue type = constantValueFactory.constantValue(clazz, constantIndex).referenceValue(); - - stack.push(stack.apop().cast(type.getType(), - type.getReferencedClass(), - valueFactory, - alwaysCast)); - break; - } - - case InstructionConstants.OP_INSTANCEOF: - { - ReferenceValue value = stack.apop(); - ReferenceValue type = constantValueFactory.constantValue(clazz, constantIndex).referenceValue(); - - int instanceOf = type.mayBeExtension() ? Value.MAYBE : - value.instanceOf(type.getType(), - type.getReferencedClass()); - - stack.push(instanceOf == Value.NEVER ? valueFactory.createIntegerValue(0) : - instanceOf == Value.ALWAYS ? valueFactory.createIntegerValue(1) : - valueFactory.createIntegerValue()); - break; - } - - case InstructionConstants.OP_MULTIANEWARRAY: - { - int dimensionCount = constantInstruction.constant; - for (int dimension = 0; dimension < dimensionCount; dimension++) - { - // TODO: Use array lengths. - IntegerValue arrayLength = stack.ipop(); - } - - stack.push(constantValueFactory.constantValue(clazz, constantIndex).referenceValue()); - break; - } - - default: - throw new IllegalArgumentException("Unknown constant pool instruction ["+constantInstruction.opcode+"]"); - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - int variableIndex = variableInstruction.variableIndex; - - switch (variableInstruction.opcode) - { - case InstructionConstants.OP_ILOAD: - case InstructionConstants.OP_ILOAD_0: - case InstructionConstants.OP_ILOAD_1: - case InstructionConstants.OP_ILOAD_2: - case InstructionConstants.OP_ILOAD_3: - stack.push(variables.iload(variableIndex)); - break; - - case InstructionConstants.OP_LLOAD: - case InstructionConstants.OP_LLOAD_0: - case InstructionConstants.OP_LLOAD_1: - case InstructionConstants.OP_LLOAD_2: - case InstructionConstants.OP_LLOAD_3: - stack.push(variables.lload(variableIndex)); - break; - - case InstructionConstants.OP_FLOAD: - case InstructionConstants.OP_FLOAD_0: - case InstructionConstants.OP_FLOAD_1: - case InstructionConstants.OP_FLOAD_2: - case InstructionConstants.OP_FLOAD_3: - stack.push(variables.fload(variableIndex)); - break; - - case InstructionConstants.OP_DLOAD: - case InstructionConstants.OP_DLOAD_0: - case InstructionConstants.OP_DLOAD_1: - case InstructionConstants.OP_DLOAD_2: - case InstructionConstants.OP_DLOAD_3: - stack.push(variables.dload(variableIndex)); - break; - - case InstructionConstants.OP_ALOAD: - case InstructionConstants.OP_ALOAD_0: - case InstructionConstants.OP_ALOAD_1: - case InstructionConstants.OP_ALOAD_2: - case InstructionConstants.OP_ALOAD_3: - stack.push(variables.aload(variableIndex)); - break; - - case InstructionConstants.OP_ISTORE: - case InstructionConstants.OP_ISTORE_0: - case InstructionConstants.OP_ISTORE_1: - case InstructionConstants.OP_ISTORE_2: - case InstructionConstants.OP_ISTORE_3: - variables.store(variableIndex, stack.ipop()); - break; - - case InstructionConstants.OP_LSTORE: - case InstructionConstants.OP_LSTORE_0: - case InstructionConstants.OP_LSTORE_1: - case InstructionConstants.OP_LSTORE_2: - case InstructionConstants.OP_LSTORE_3: - variables.store(variableIndex, stack.lpop()); - break; - - case InstructionConstants.OP_FSTORE: - case InstructionConstants.OP_FSTORE_0: - case InstructionConstants.OP_FSTORE_1: - case InstructionConstants.OP_FSTORE_2: - case InstructionConstants.OP_FSTORE_3: - variables.store(variableIndex, stack.fpop()); - break; - - case InstructionConstants.OP_DSTORE: - case InstructionConstants.OP_DSTORE_0: - case InstructionConstants.OP_DSTORE_1: - case InstructionConstants.OP_DSTORE_2: - case InstructionConstants.OP_DSTORE_3: - variables.store(variableIndex, stack.dpop()); - break; - - case InstructionConstants.OP_ASTORE: - case InstructionConstants.OP_ASTORE_0: - case InstructionConstants.OP_ASTORE_1: - case InstructionConstants.OP_ASTORE_2: - case InstructionConstants.OP_ASTORE_3: - // The operand on the stack can be a reference or a return - // address, so we'll relax the pop operation. - //variables.store(variableIndex, stack.apop()); - variables.store(variableIndex, stack.pop()); - break; - - case InstructionConstants.OP_IINC: - variables.store(variableIndex, - variables.iload(variableIndex).add( - valueFactory.createIntegerValue(variableInstruction.constant))); - break; - - case InstructionConstants.OP_RET: - // The return address should be in the last offset of the - // given instruction offset variable (even though there may - // be other offsets). - InstructionOffsetValue instructionOffsetValue = variables.oload(variableIndex); - branchUnit.branch(clazz, - codeAttribute, - offset, - instructionOffsetValue.instructionOffset(instructionOffsetValue.instructionOffsetCount()-1)); - break; - - default: - throw new IllegalArgumentException("Unknown variable instruction ["+variableInstruction.opcode+"]"); - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - int branchTarget = offset + branchInstruction.branchOffset; - - // Maybe branch to the next instruction. - branchUnit.branchConditionally(clazz, - codeAttribute, - offset, - offset + branchInstruction.length(offset), - Value.MAYBE); - - switch (branchInstruction.opcode) - { - case InstructionConstants.OP_IFEQ: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().equal(valueFactory.createIntegerValue(0))); - break; - - case InstructionConstants.OP_IFNE: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().notEqual(valueFactory.createIntegerValue(0))); - break; - - case InstructionConstants.OP_IFLT: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().lessThan(valueFactory.createIntegerValue(0))); - break; - - case InstructionConstants.OP_IFGE: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().greaterThanOrEqual(valueFactory.createIntegerValue(0))); - break; - - case InstructionConstants.OP_IFGT: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().greaterThan(valueFactory.createIntegerValue(0))); - break; - - case InstructionConstants.OP_IFLE: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().lessThanOrEqual(valueFactory.createIntegerValue(0))); - break; - - - case InstructionConstants.OP_IFICMPEQ: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().equal(stack.ipop())); - break; - - case InstructionConstants.OP_IFICMPNE: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().notEqual(stack.ipop())); - break; - - case InstructionConstants.OP_IFICMPLT: - // Note that the stack entries are popped in reverse order. - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().greaterThan(stack.ipop())); - break; - - case InstructionConstants.OP_IFICMPGE: - // Note that the stack entries are popped in reverse order. - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().lessThanOrEqual(stack.ipop())); - break; - - case InstructionConstants.OP_IFICMPGT: - // Note that the stack entries are popped in reverse order. - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().lessThan(stack.ipop())); - break; - - case InstructionConstants.OP_IFICMPLE: - // Note that the stack entries are popped in reverse order. - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.ipop().greaterThanOrEqual(stack.ipop())); - break; - - case InstructionConstants.OP_IFACMPEQ: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.apop().equal(stack.apop())); - break; - - case InstructionConstants.OP_IFACMPNE: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.apop().notEqual(stack.apop())); - break; - - case InstructionConstants.OP_GOTO: - case InstructionConstants.OP_GOTO_W: - branchUnit.branch(clazz, codeAttribute, offset, branchTarget); - break; - - - case InstructionConstants.OP_JSR: - case InstructionConstants.OP_JSR_W: - stack.push(new InstructionOffsetValue(offset + - branchInstruction.length(offset))); - branchUnit.branch(clazz, codeAttribute, offset, branchTarget); - break; - - case InstructionConstants.OP_IFNULL: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.apop().isNull()); - break; - - case InstructionConstants.OP_IFNONNULL: - branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget, - stack.apop().isNotNull()); - break; - - default: - throw new IllegalArgumentException("Unknown branch instruction ["+branchInstruction.opcode+"]"); - } - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - IntegerValue indexValue = stack.ipop(); - - // Maybe branch to the default offset. - branchUnit.branchConditionally(clazz, - codeAttribute, - offset, - offset + tableSwitchInstruction.defaultOffset, - Value.MAYBE); - - for (int index = 0; index < tableSwitchInstruction.jumpOffsets.length; index++) - { - int conditional = indexValue.equal(valueFactory.createIntegerValue( - tableSwitchInstruction.lowCase + index)); - - branchUnit.branchConditionally(clazz, - codeAttribute, - offset, - offset + tableSwitchInstruction.jumpOffsets[index], - conditional); - } - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - IntegerValue indexValue = stack.ipop(); - - // Maybe branch to the default offset. - branchUnit.branchConditionally(clazz, - codeAttribute, - offset, - offset + lookUpSwitchInstruction.defaultOffset, - Value.MAYBE); - - for (int index = 0; index < lookUpSwitchInstruction.jumpOffsets.length; index++) - { - int conditional = indexValue.equal(valueFactory.createIntegerValue( - lookUpSwitchInstruction.cases[index])); - - branchUnit.branchConditionally(clazz, - codeAttribute, - offset, - offset + lookUpSwitchInstruction.jumpOffsets[index], - conditional); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/SimplifiedInvocationUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/SimplifiedInvocationUnit.java deleted file mode 100644 index 9f7cc86f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/SimplifiedInvocationUnit.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.value.*; - -/** - * This InvocationUnit sets up the variables for entering a method, - * and it updates the stack for the invocation of a class member, - * using simple values. - * - * @author Eric Lafortune - */ -public abstract class SimplifiedInvocationUnit -extends SimplifiedVisitor -implements InvocationUnit, - ParameterVisitor, - ConstantVisitor -{ - private final MemberVisitor parameterInitializer = new AllParameterVisitor(true, this); - - // Fields acting as parameters between the visitor methods. - private Variables variables; - protected boolean isStatic; - protected boolean isLoad; - protected Stack stack; - - - // Implementations for InvocationUnit. - - public void enterMethod(Clazz clazz, Method method, Variables variables) - { - // Count the number of parameters, taking into account their categories. - int parameterSize = - ClassUtil.internalMethodParameterSize(method.getDescriptor(clazz), - method.getAccessFlags()); - - // Reuse the existing parameters object, ensuring the right size. - variables.reset(parameterSize); - - // Initialize the parameters. - this.variables = variables; - method.accept(clazz, parameterInitializer); - this.variables = null; - } - - - // Implementation for ParameterVisitor. - - public void visitParameter(Clazz clazz, Member member, int parameterIndex, int parameterCount, int parameterOffset, int parameterSize, String parameterType, Clazz referencedClass) - { - Method method = (Method)member; - - // Get the parameter value. - Value value = getMethodParameterValue(clazz, - method, - parameterIndex, - parameterType, - referencedClass); - - // Store the value in the corresponding variable. - variables.store(parameterOffset, value); - } - - - public void exitMethod(Clazz clazz, Method method, Value returnValue) - { - setMethodReturnValue(clazz, method, returnValue); - } - - - public void enterExceptionHandler(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - int catchType, - Stack stack) - { - ClassConstant exceptionClassConstant = - (ClassConstant)((ProgramClass)clazz).getConstant(catchType); - - stack.push(getExceptionValue(clazz, exceptionClassConstant)); - } - - - public void invokeMember(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction, Stack stack) - { - int constantIndex = constantInstruction.constantIndex; - - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_GETSTATIC: - isStatic = true; - isLoad = true; - break; - - case InstructionConstants.OP_PUTSTATIC: - isStatic = true; - isLoad = false; - break; - - case InstructionConstants.OP_GETFIELD: - isStatic = false; - isLoad = true; - break; - - case InstructionConstants.OP_PUTFIELD: - isStatic = false; - isLoad = false; - break; - - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEDYNAMIC: - isStatic = true; - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKEINTERFACE: - isStatic = false; - break; - } - - // Pop the parameters and push the return value. - this.stack = stack; - clazz.constantPoolEntryAccept(constantIndex, this); - this.stack = null; - } - - - // Implementations for ConstantVisitor. - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - // Pop the field value, if applicable. - if (!isLoad) - { - setFieldValue(clazz, fieldrefConstant, stack.pop()); - } - - // Pop the reference value, if applicable. - if (!isStatic) - { - setFieldClassValue(clazz, fieldrefConstant, stack.apop()); - } - - // Push the field value, if applicable. - if (isLoad) - { - String type = fieldrefConstant.getType(clazz); - - stack.push(getFieldValue(clazz, fieldrefConstant, type)); - } - } - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant methodrefConstant) - { - String type = methodrefConstant.getType(clazz); - - // Count the number of parameters. - int parameterCount = ClassUtil.internalMethodParameterCount(type); - if (!isStatic) - { - parameterCount++; - } - - // Pop the parameters and the class reference, in reverse order. - for (int parameterIndex = parameterCount-1; parameterIndex >= 0; parameterIndex--) - { - setMethodParameterValue(clazz, methodrefConstant, parameterIndex, stack.pop()); - } - - // Push the return value, if applicable. - String returnType = ClassUtil.internalMethodReturnType(type); - if (returnType.charAt(0) != ClassConstants.TYPE_VOID) - { - stack.push(getMethodReturnValue(clazz, methodrefConstant, returnType)); - } - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - String type = invokeDynamicConstant.getType(clazz); - - // Count the number of parameters. - int parameterCount = ClassUtil.internalMethodParameterCount(type); - if (!isStatic) - { - parameterCount++; - } - - // Pop the parameters and the class reference, in reverse order. - for (int parameterIndex = parameterCount-1; parameterIndex >= 0; parameterIndex--) - { - stack.pop(); - } - - // Push the return value, if applicable. - String returnType = ClassUtil.internalMethodReturnType(type); - if (returnType.charAt(0) != ClassConstants.TYPE_VOID) - { - stack.push(getMethodReturnValue(clazz, invokeDynamicConstant, returnType)); - } - } - - - /** - * Returns the value of the specified exception. - */ - public abstract Value getExceptionValue(Clazz clazz, - ClassConstant catchClassConstant); - - - /** - * Sets the class through which the specified field is accessed. - */ - public abstract void setFieldClassValue(Clazz clazz, - RefConstant refConstant, - ReferenceValue value); - - - /** - * Returns the class though which the specified field is accessed. - */ - public abstract Value getFieldClassValue(Clazz clazz, - RefConstant refConstant, - String type); - - - /** - * Sets the value of the specified field. - */ - public abstract void setFieldValue(Clazz clazz, - RefConstant refConstant, - Value value); - - - /** - * Returns the value of the specified field. - */ - public abstract Value getFieldValue(Clazz clazz, - RefConstant refConstant, - String type); - - - /** - * Sets the value of the specified method parameter. - */ - public abstract void setMethodParameterValue(Clazz clazz, - RefConstant refConstant, - int parameterIndex, - Value value); - - - /** - * Returns the value of the specified method parameter. - */ - public abstract Value getMethodParameterValue(Clazz clazz, - Method method, - int parameterIndex, - String type, - Clazz referencedClass); - - - /** - * Sets the return value of the specified method. - */ - public abstract void setMethodReturnValue(Clazz clazz, - Method method, - Value value); - - - /** - * Returns the return value of the specified method. - */ - public abstract Value getMethodReturnValue(Clazz clazz, - RefConstant refConstant, - String type); - - - /** - * Returns the return value of the specified method. - */ - public abstract Value getMethodReturnValue(Clazz clazz, - InvokeDynamicConstant invokeDynamicConstant, - String type); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Stack.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Stack.java deleted file mode 100644 index c8fcc0f9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Stack.java +++ /dev/null @@ -1,560 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.evaluation.value.*; - -import java.util.Arrays; - -/** - * This class represents an operand stack that contains Value - * objects. - * - * @author Eric Lafortune - */ -public class Stack -{ - private static final TopValue TOP_VALUE = new TopValue(); - - - protected Value[] values; - protected int currentSize; - protected int actualMaxSize; - - - /** - * Creates a new Stack with a given maximum size, accounting for the double - * space required by Category 2 values. - */ - public Stack(int maxSize) - { - values = new Value[maxSize]; - } - - - /** - * Creates a Stack that is a copy of the given Stack. - */ - public Stack(Stack stack) - { - // Create the values array. - this(stack.values.length); - - // Copy the stack contents. - copy(stack); - } - - - /** - * Returns the actual maximum stack size that was required for all stack - * operations, accounting for the double space required by Category 2 values. - */ - public int getActualMaxSize() - { - return actualMaxSize; - } - - - /** - * Resets this Stack, so that it can be reused. - */ - public void reset(int maxSize) - { - // Is the values array large enough? - if (values.length < maxSize) - { - // Create a new one. - values = new Value[maxSize]; - } - - // Clear the sizes. - clear(); - - actualMaxSize = 0; - } - - - /** - * Copies the values of the given Stack into this Stack. - */ - public void copy(Stack other) - { - // Is the values array large enough? - if (values.length < other.values.length) - { - // Create a new one. - values = new Value[other.values.length]; - } - - // Copy the stack contents. - System.arraycopy(other.values, 0, this.values, 0, other.currentSize); - - // Copy the sizes. - currentSize = other.currentSize; - actualMaxSize = other.actualMaxSize; - } - - - /** - * Generalizes the values of this Stack with the values of the given Stack. - * The stacks must have the same current sizes. - * @return whether the generalization has made any difference. - */ - public boolean generalize(Stack other) - { - if (this.currentSize != other.currentSize) - { - throw new IllegalArgumentException("Stacks have different current sizes ["+this.currentSize+"] and ["+other.currentSize+"]"); - } - - boolean changed = false; - - // Generalize the stack values. - for (int index = 0; index < currentSize; index++) - { - Value thisValue = this.values[index]; - - if (thisValue != null) - { - Value newValue = null; - - Value otherValue = other.values[index]; - - if (otherValue != null) - { - newValue = thisValue.generalize(otherValue); - } - - changed = changed || !thisValue.equals(newValue); - - values[index] = newValue; - } - } - - // Check if the other stack extends beyond this one. - if (this.actualMaxSize < other.actualMaxSize) - { - this.actualMaxSize = other.actualMaxSize; - } - - return changed; - } - - - /** - * Clears the stack. - */ - public void clear() - { - // Clear the stack contents. - Arrays.fill(values, 0, currentSize, null); - - currentSize = 0; - } - - - /** - * Returns the number of elements currently on the stack, accounting for the - * double space required by Category 2 values. - */ - public int size() - { - return currentSize; - } - - - /** - * Gets the specified Value from the stack, without disturbing it. - * @param index the index of the stack element, counting from the bottom - * of the stack. - * @return the value at the specified position. - */ - public Value getBottom(int index) - { - return values[index]; - } - - - /** - * Sets the specified Value on the stack, without disturbing it. - * @param index the index of the stack element, counting from the bottom - * of the stack. - * @param value the value to set. - */ - public void setBottom(int index, Value value) - { - values[index] = value; - } - - - /** - * Gets the specified Value from the stack, without disturbing it. - * @param index the index of the stack element, counting from the top - * of the stack. - * @return the value at the specified position. - */ - public Value getTop(int index) - { - return values[currentSize - index - 1]; - } - - - /** - * Sets the specified Value on the stack, without disturbing it. - * @param index the index of the stack element, counting from the top - * of the stack. - * @param value the value to set. - */ - public void setTop(int index, Value value) - { - values[currentSize - index - 1] = value; - } - - - /** - * Removes the specified Value from the stack. - * @param index the index of the stack element, counting from the top - * of the stack. - */ - public void removeTop(int index) - { - System.arraycopy(values, currentSize - index, - values, currentSize - index - 1, - index); - currentSize--; - } - - - /** - * Pushes the given Value onto the stack. - */ - public void push(Value value) - { - // Account for the extra space required by Category 2 values. - if (value.isCategory2()) - { - values[currentSize++] = TOP_VALUE; - } - - // Push the value. - values[currentSize++] = value; - - // Update the maximum actual size; - if (actualMaxSize < currentSize) - { - actualMaxSize = currentSize; - } - } - - - /** - * Pops the top Value from the stack. - */ - public Value pop() - { - Value value = values[--currentSize]; - - values[currentSize] = null; - - // Account for the extra space required by Category 2 values. - if (value.isCategory2()) - { - values[--currentSize] = null; - } - - return value; - } - - - // Pop methods that provide convenient casts to the expected value types. - - /** - * Pops the top IntegerValue from the stack. - */ - public IntegerValue ipop() - { - return pop().integerValue(); - } - - - /** - * Pops the top LongValue from the stack. - */ - public LongValue lpop() - { - return pop().longValue(); - } - - - /** - * Pops the top FloatValue from the stack. - */ - public FloatValue fpop() - { - return pop().floatValue(); - } - - - /** - * Pops the top DoubleValue from the stack. - */ - public DoubleValue dpop() - { - return pop().doubleValue(); - } - - - /** - * Pops the top ReferenceValue from the stack. - */ - public ReferenceValue apop() - { - return pop().referenceValue(); - } - - - /** - * Pops the top InstructionOffsetValue from the stack. - */ - public InstructionOffsetValue opop() - { - return pop().instructionOffsetValue(); - } - - - /** - * Pops the top category 1 value from the stack. - */ - public void pop1() - { - values[--currentSize] = null; - } - - - /** - * Pops the top category 2 value from the stack (or alternatively, two - * Category 1 stack elements). - */ - public void pop2() - { - values[--currentSize] = null; - values[--currentSize] = null; - } - - - /** - * Duplicates the top Category 1 value. - */ - public void dup() - { - values[currentSize] = values[currentSize - 1].category1Value(); - - currentSize++; - - // Update the maximum actual size; - if (actualMaxSize < currentSize) - { - actualMaxSize = currentSize; - } - } - - - /** - * Duplicates the top Category 1 value, one Category 1 element down the - * stack. - */ - public void dup_x1() - { - values[currentSize] = values[currentSize - 1].category1Value(); - values[currentSize - 1] = values[currentSize - 2].category1Value(); - values[currentSize - 2] = values[currentSize ]; - - currentSize++; - - // Update the maximum actual size; - if (actualMaxSize < currentSize) - { - actualMaxSize = currentSize; - } - } - - - /** - * Duplicates the top Category 1 value, two Category 1 elements (or one - * Category 2 element) down the stack. - */ - public void dup_x2() - { - values[currentSize] = values[currentSize - 1].category1Value(); - values[currentSize - 1] = values[currentSize - 2]; - values[currentSize - 2] = values[currentSize - 3]; - values[currentSize - 3] = values[currentSize ]; - - currentSize++; - - // Update the maximum actual size; - if (actualMaxSize < currentSize) - { - actualMaxSize = currentSize; - } - } - - /** - * Duplicates the top Category 2 value (or alternatively, the equivalent - * Category 1 stack elements). - */ - public void dup2() - { - values[currentSize ] = values[currentSize - 2]; - values[currentSize + 1] = values[currentSize - 1]; - - currentSize += 2; - - // Update the maximum actual size; - if (actualMaxSize < currentSize) - { - actualMaxSize = currentSize; - } - } - - - /** - * Duplicates the top Category 2 value, one Category 1 element down the - * stack (or alternatively, the equivalent Category 1 stack values). - */ - public void dup2_x1() - { - values[currentSize + 1] = values[currentSize - 1]; - values[currentSize ] = values[currentSize - 2]; - values[currentSize - 1] = values[currentSize - 3]; - values[currentSize - 2] = values[currentSize + 1]; - values[currentSize - 3] = values[currentSize ]; - - currentSize += 2; - - // Update the maximum actual size; - if (actualMaxSize < currentSize) - { - actualMaxSize = currentSize; - } - } - - - /** - * Duplicates the top Category 2 value, one Category 2 stack element down - * the stack (or alternatively, the equivalent Category 1 stack values). - */ - public void dup2_x2() - { - values[currentSize + 1] = values[currentSize - 1]; - values[currentSize ] = values[currentSize - 2]; - values[currentSize - 1] = values[currentSize - 3]; - values[currentSize - 2] = values[currentSize - 4]; - values[currentSize - 3] = values[currentSize + 1]; - values[currentSize - 4] = values[currentSize ]; - - currentSize += 2; - - // Update the maximum actual size; - if (actualMaxSize < currentSize) - { - actualMaxSize = currentSize; - } - } - - - /** - * Swaps the top two Category 1 values. - */ - public void swap() - { - Value value1 = values[currentSize - 1].category1Value(); - Value value2 = values[currentSize - 2].category1Value(); - - values[currentSize - 1] = value2; - values[currentSize - 2] = value1; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - Stack other = (Stack)object; - - if (this.currentSize != other.currentSize) - { - return false; - } - - for (int index = 0; index < currentSize; index++) - { - Value thisValue = this.values[index]; - Value otherValue = other.values[index]; - if (thisValue == null ? otherValue != null : - !thisValue.equals(otherValue)) - { - return false; - } - } - - return true; - } - - - public int hashCode() - { - int hashCode = currentSize; - - for (int index = 0; index < currentSize; index++) - { - Value value = values[index]; - if (value != null) - { - hashCode ^= value.hashCode(); - } - } - - return hashCode; - } - - - public String toString() - { - StringBuffer buffer = new StringBuffer(); - - for (int index = 0; index < currentSize; index++) - { - Value value = values[index]; - buffer = buffer.append('[') - .append(value == null ? "empty" : value.toString()) - .append(']'); - } - - return buffer.toString(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/TracedStack.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/TracedStack.java deleted file mode 100644 index 6e52ae6c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/TracedStack.java +++ /dev/null @@ -1,374 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.evaluation.value.Value; - -/** - * This Stack saves additional information with stack elements, to keep track - * of their origins. - *

- * The stack stores a given producer Value along with each Value it stores. - * It then generalizes a given collected Value with the producer Value - * of each Value it loads. The producer Value and the initial collected Value - * can be set. The generalized collected Value can be retrieved, either taking - * into account dup/swap instructions as proper instructions or ignoring them. - * - * @author Eric Lafortune - */ -public class TracedStack extends Stack -{ - private Value producerValue; - private Stack producerStack; - private Stack actualProducerStack; - - - /** - * Creates a new TracedStack with a given maximum size. - */ - public TracedStack(int maxSize) - { - super(maxSize); - - producerStack = new Stack(maxSize); - actualProducerStack = new Stack(maxSize); - } - - - /** - * Creates a new TracedStack that is a copy of the given TracedStack. - */ - public TracedStack(TracedStack tracedStack) - { - super(tracedStack); - - producerStack = new Stack(tracedStack.producerStack); - actualProducerStack = new Stack(tracedStack.actualProducerStack); - } - - - /** - * Sets the Value that will be stored along with all push and pop - * instructions. - */ - public void setProducerValue(Value producerValue) - { - this.producerValue = producerValue; - } - - - /** - * Gets the specified producer Value from the stack, without disturbing it. - * @param index the index of the stack element, counting from the bottom - * of the stack. - * @return the producer value at the specified position. - */ - public Value getBottomProducerValue(int index) - { - return producerStack.getBottom(index); - } - - - /** - * Gets the specified actual producer Value from the stack, ignoring - * dup/swap instructions, without disturbing it. - * @param index the index of the stack element, counting from the bottom - * of the stack. - * @return the producer value at the specified position. - */ - public Value getBottomActualProducerValue(int index) - { - return actualProducerStack.getBottom(index); - } - - - /** - * Gets the specified producer Value from the stack, without disturbing it. - * @param index the index of the stack element, counting from the top - * of the stack. - * @return the producer value at the specified position. - */ - public Value getTopProducerValue(int index) - { - return producerStack.getTop(index); - } - - - /** - * Gets the specified actual producer Value from the stack, ignoring - * dup/swap instructions, without disturbing it. - * @param index the index of the stack element, counting from the top - * of the stack. - * @return the producer value at the specified position. - */ - public Value getTopActualProducerValue(int index) - { - return actualProducerStack.getTop(index); - } - - - // Implementations for Stack. - - public void reset(int size) - { - super.reset(size); - - producerStack.reset(size); - actualProducerStack.reset(size); - } - - public void copy(TracedStack other) - { - super.copy(other); - - producerStack.copy(other.producerStack); - actualProducerStack.copy(other.actualProducerStack); - } - - public boolean generalize(TracedStack other) - { - return - super.generalize(other) | - producerStack.generalize(other.producerStack) | - actualProducerStack.generalize(other.actualProducerStack); - } - - public void clear() - { - super.clear(); - - producerStack.clear(); - actualProducerStack.clear(); - } - - public void removeTop(int index) - { - super.removeTop(index); - - producerStack.removeTop(index); - actualProducerStack.removeTop(index); - } - - public void push(Value value) - { - super.push(value); - - producerPush(); - - // Account for the extra space required by Category 2 values. - if (value.isCategory2()) - { - producerPush(); - } - } - - public Value pop() - { - Value value = super.pop(); - - producerPop(); - - // Account for the extra space required by Category 2 values. - if (value.isCategory2()) - { - producerPop(); - } - - return value; - } - - public void pop1() - { - super.pop1(); - - producerPop(); - } - - public void pop2() - { - super.pop2(); - - producerPop(); - producerPop(); - } - - public void dup() - { - super.dup(); - - producerStack.pop(); - producerStack.push(producerValue); - producerStack.push(producerValue); - - actualProducerStack.dup(); - } - - public void dup_x1() - { - super.dup_x1(); - - producerStack.pop(); - producerStack.pop(); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - - actualProducerStack.dup_x1(); - } - - public void dup_x2() - { - super.dup_x2(); - - producerStack.pop(); - producerStack.pop(); - producerStack.pop(); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - - actualProducerStack.dup_x2(); - } - - public void dup2() - { - super.dup2(); - - producerStack.pop(); - producerStack.pop(); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - - actualProducerStack.dup2(); - } - - public void dup2_x1() - { - super.dup2_x1(); - - producerStack.pop(); - producerStack.pop(); - producerStack.pop(); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - - actualProducerStack.dup2_x1(); - } - - public void dup2_x2() - { - super.dup2_x2(); - - producerStack.pop(); - producerStack.pop(); - producerStack.pop(); - producerStack.pop(); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - producerStack.push(producerValue); - - actualProducerStack.dup2_x2(); - } - - public void swap() - { - super.swap(); - - producerStack.pop(); - producerStack.pop(); - producerStack.push(producerValue); - producerStack.push(producerValue); - - actualProducerStack.swap(); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - TracedStack other = (TracedStack)object; - - return super.equals(object) && - this.producerStack.equals(other.producerStack) && - this.actualProducerStack.equals(other.actualProducerStack); - } - - - public int hashCode() - { - return super.hashCode() ^ - producerStack.hashCode() ^ - actualProducerStack.hashCode(); - } - - - public String toString() - { - StringBuffer buffer = new StringBuffer(); - - for (int index = 0; index < this.size(); index++) - { - Value value = this.values[index]; - Value producerValue = producerStack.getBottom(index); - Value actualProducerValue = actualProducerStack.getBottom(index); - buffer = buffer.append('[') - .append(producerValue == null ? "empty:" : - producerValue.equals(actualProducerValue) ? producerValue.toString() : - producerValue.toString() + actualProducerValue.toString()) - .append(value == null ? "empty" : value.toString()) - .append(']'); - } - - return buffer.toString(); - } - - - // Small utility methods. - - private void producerPush() - { - producerStack.push(producerValue); - actualProducerStack.push(producerValue); - } - - - private void producerPop() - { - producerStack.pop(); - actualProducerStack.pop(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/TracedVariables.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/TracedVariables.java deleted file mode 100644 index 4714c3d2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/TracedVariables.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.evaluation.value.Value; - -/** - * This Variables class saves additional information with variables, to keep - * track of their origins. - *

- * The Variables class stores a given producer Value along with each Value it - * stores. It then generalizes a given collected Value with the producer Value - * of each Value it loads. The producer Value and the initial collected Value - * can be set; the generalized collected Value can be retrieved. - * - * @author Eric Lafortune - */ -public class TracedVariables extends Variables -{ - public static final int NONE = -1; - - - private Value producerValue; - private Variables producerVariables; - - - /** - * Creates a new TracedVariables with a given size. - */ - public TracedVariables(int size) - { - super(size); - - producerVariables = new Variables(size); - } - - - /** - * Creates a new TracedVariables that is a copy of the given TracedVariables. - */ - public TracedVariables(TracedVariables tracedVariables) - { - super(tracedVariables); - - producerVariables = new Variables(tracedVariables.producerVariables); - } - - - /** - * Sets the Value that will be stored along with all store instructions. - */ - public void setProducerValue(Value producerValue) - { - this.producerValue = producerValue; - } - - - /** - * Gets the producer Value for the specified variable, without disturbing it. - * @param index the variable index. - * @return the producer value of the given variable. - */ - public Value getProducerValue(int index) - { - return producerVariables.getValue(index); - } - - - /** - * Sets the given producer Value for the specified variable, without - * disturbing it. - * @param index the variable index. - * @param value the producer value to set. - */ - public void setProducerValue(int index, Value value) - { - producerVariables.store(index, value); - } - - - // Implementations for Variables. - - public void reset(int size) - { - super.reset(size); - - producerVariables.reset(size); - } - - public void initialize(TracedVariables other) - { - super.initialize(other); - - producerVariables.initialize(other.producerVariables); - } - - public boolean generalize(TracedVariables other, - boolean clearConflictingOtherVariables) - { - boolean variablesChanged = super.generalize(other, clearConflictingOtherVariables); - boolean producersChanged = producerVariables.generalize(other.producerVariables, clearConflictingOtherVariables); - /* consumerVariables.generalize(other.consumerVariables)*/ - - // Clear any traces if a variable has become null. - if (variablesChanged) - { - for (int index = 0; index < size; index++) - { - if (values[index] == null) - { - producerVariables.values[index] = null; - - if (clearConflictingOtherVariables) - { - other.producerVariables.values[index] = null; - } - } - } - } - - return variablesChanged || producersChanged; - } - - - public void store(int index, Value value) - { - // Store the value itself in the variable. - super.store(index, value); - - // Store the producer value in its producer variable. - producerVariables.store(index, producerValue); - - // Account for the extra space required by Category 2 values. - if (value.isCategory2()) - { - producerVariables.store(index+1, producerValue); - } - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - TracedVariables other = (TracedVariables)object; - - return super.equals(object) && - this.producerVariables.equals(other.producerVariables); - } - - - public int hashCode() - { - return super.hashCode() ^ - producerVariables.hashCode(); - } - - - public String toString() - { - StringBuffer buffer = new StringBuffer(); - - for (int index = 0; index < this.size(); index++) - { - Value value = this.values[index]; - Value producerValue = producerVariables.getValue(index); - buffer = buffer.append('[') - .append(producerValue == null ? "empty:" : producerValue.toString()) - .append(value == null ? "empty" : value.toString()) - .append(']'); - } - - return buffer.toString(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Variables.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Variables.java deleted file mode 100644 index e92fe7d5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/Variables.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation; - -import proguard.evaluation.value.*; - -import java.util.Arrays; - -/** - * This class represents a local variable frame that contains Value - * objects. Values are generalizations of all values that have been stored in - * the respective variables. - * - * @author Eric Lafortune - */ -public class Variables -{ - private static final TopValue TOP_VALUE = new TopValue(); - - - protected Value[] values; - protected int size; - - - /** - * Creates a new Variables object with a given maximum number of variables. - */ - public Variables(int size) - { - this.values = new Value[size]; - this.size = size; - } - - - /** - * Creates a Variables object that is a copy of the given Variables object. - */ - public Variables(Variables variables) - { - // Create the values array. - this(variables.size); - - // Copy the values. - initialize(variables); - } - - - /** - * Resets this Variables object, so that it can be reused. - */ - public void reset(int size) - { - // Is the values array large enough? - if (values.length < size) - { - // Create a new one. - values = new Value[size]; - } - else - { - // Clear the old variables. - Arrays.fill(values, 0, this.size, null); - } - - this.size = size; - } - - - /** - * Initializes the values of this Variables object with the values of the - * given Variables object. The other object may have fewer values, in which - * case the remaining values are left unchanged. - */ - public void initialize(Variables other) - { - if (this.size < other.size) - { - throw new IllegalArgumentException("Variable frame is too small ["+this.size+"] compared to other frame ["+other.size+"]"); - } - - // Copy the values. - System.arraycopy(other.values, 0, this.values, 0, other.size); - } - - - /** - * Generalizes the values of this Variables object with the values of the - * given Variables object. - * @param clearConflictingOtherVariables specifies whether the other - * variables should be cleared too, - * in case of conflicts. - * @return whether the generalization has made any difference. - */ - public boolean generalize(Variables other, - boolean clearConflictingOtherVariables) - { - if (this.size != other.size) - { - throw new IllegalArgumentException("Variable frames have different sizes ["+this.size+"] and ["+other.size+"]"); - } - - boolean changed = false; - - for (int index = 0; index < size; index++) - { - Value thisValue = this.values[index]; - Value otherValue = other.values[index]; - - // Occasionally, two values of different types might be present - // in the same variable in a variable frame (corresponding to - // two local variables that share the same index), at some point - // outside of their scopes. Don't generalize the variable then, - // but let it clear instead. - if (thisValue != null && - otherValue != null && - thisValue.computationalType() == otherValue.computationalType()) - { - Value newValue = thisValue.generalize(otherValue); - - changed = changed || !thisValue.equals(newValue); - - this.values[index] = newValue; - } - else - { - changed = changed || thisValue != null; - - this.values[index] = null; - - if (clearConflictingOtherVariables) - { - other.values[index] = null; - } - } - } - - return changed; - } - - - /** - * Returns the number of variables. - */ - public int size() - { - return size; - } - - - /** - * Gets the Value of the variable with the given index, without disturbing it. - */ - public Value getValue(int index) - { - if (index < 0 || - index >= size) - { - throw new IndexOutOfBoundsException("Variable index ["+index+"] out of bounds ["+size+"]"); - } - - return values[index]; - } - - - /** - * Stores the given Value at the given variable index. - */ - public void store(int index, Value value) - { - if (index < 0 || - index >= size) - { - throw new IndexOutOfBoundsException("Variable index ["+index+"] out of bounds ["+size+"]"); - } - - // Store the value. - values[index] = value; - - // Account for the extra space required by Category 2 values. - if (value.isCategory2()) - { - values[index + 1] = TOP_VALUE; - } - } - - - /** - * Loads the Value from the variable with the given index. - */ - public Value load(int index) - { - if (index < 0 || - index >= size) - { - throw new IndexOutOfBoundsException("Variable index ["+index+"] out of bounds ["+size+"]"); - } - - return values[index]; - } - - - // Load methods that provide convenient casts to the expected value types. - - /** - * Loads the IntegerValue from the variable with the given index. - */ - public IntegerValue iload(int index) - { - return load(index).integerValue(); - } - - - /** - * Loads the LongValue from the variable with the given index. - */ - public LongValue lload(int index) - { - return load(index).longValue(); - } - - - /** - * Loads the FloatValue from the variable with the given index. - */ - public FloatValue fload(int index) - { - return load(index).floatValue(); - } - - - /** - * Loads the DoubleValue from the variable with the given index. - */ - public DoubleValue dload(int index) - { - return load(index).doubleValue(); - } - - - /** - * Loads the ReferenceValue from the variable with the given index. - */ - public ReferenceValue aload(int index) - { - return load(index).referenceValue(); - } - - - /** - * Loads the InstructionOffsetValue from the variable with the given index. - */ - public InstructionOffsetValue oload(int index) - { - return load(index).instructionOffsetValue(); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - Variables other = (Variables)object; - - if (this.size != other.size) - { - return false; - } - - for (int index = 0; index < size; index++) - { - Value thisValue = this.values[index]; - Value otherValue = other.values[index]; - - // Occasionally, two values of different types might be - // present in the same variable in a variable frame - // (corresponding to two local variables that share the - // same index), at some point outside of their scopes. - // We'll ignore these. - if (thisValue != null && - otherValue != null && - thisValue.computationalType() == otherValue.computationalType() && - !thisValue.equals(otherValue)) - { - return false; - } - } - - return true; - } - - - public int hashCode() - { - int hashCode = size; - - for (int index = 0; index < size; index++) - { - Value value = values[index]; - if (value != null) - { - hashCode ^= value.hashCode(); - } - } - - return hashCode; - } - - - public String toString() - { - StringBuffer buffer = new StringBuffer(); - - for (int index = 0; index < size; index++) - { - Value value = values[index]; - buffer = buffer.append('[') - .append(value == null ? "empty" : value.toString()) - .append(']'); - } - - return buffer.toString(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ArrayReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ArrayReferenceValue.java deleted file mode 100644 index cc021aa0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ArrayReferenceValue.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; - -/** - * This ReferenceValue represents a partially evaluated array. It has an array - * length and possibly array values (up to a fixed maximum number). It is not - * immutable. - * - * @author Eric Lafortune - */ -class ArrayReferenceValue extends TypedReferenceValue -{ - protected final IntegerValue arrayLength; - - - /** - * Creates a new ArrayReferenceValue. - */ - public ArrayReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - IntegerValue arrayLength) - { - super(type, referencedClass, mayBeExtension, false); - - this.arrayLength = arrayLength; - } - - - // Implementations for ReferenceValue. - - public IntegerValue arrayLength(ValueFactory valueFactory) - { - return arrayLength; - } - - - // Implementations of binary methods of ReferenceValue. - - public ReferenceValue generalize(ReferenceValue other) - { - return other.generalize(this); - } - - - public int equal(ReferenceValue other) - { - return other.equal(this); - } - - -// // Implementations of binary ReferenceValue methods with -// // IdentifiedReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(IdentifiedReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } - - - // Implementations of binary ReferenceValue methods with - // ArrayReferenceValue arguments. - - public ReferenceValue generalize(ArrayReferenceValue other) - { - return - this.equals(other) ? this : - this.type != null && - this.type.equals(other.type) && - this.referencedClass == other.referencedClass ? new ArrayReferenceValue(this.type, - this.referencedClass, - this.mayBeExtension || other.mayBeExtension, - this.arrayLength.generalize(other.arrayLength)) : - generalize((TypedReferenceValue)other); - } - - - public int equal(ArrayReferenceValue other) - { - if (this.arrayLength.equal(other.arrayLength) == NEVER) - { - return NEVER; - } - - return equal((TypedReferenceValue)other); - } - - -// // Implementations of binary ReferenceValue methods with -// // IdentifiedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) -// { -// return generalize((ArrayReferenceValue)other); -// } -// -// -// public int equal(IdentifiedArrayReferenceValue other) -// { -// return equal((ArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // DetailedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(DetailedArrayReferenceValue other) -// { -// return generalize((IdentifiedArrayReferenceValue)other); -// } -// -// -// public int equal(DetailedArrayReferenceValue other) -// { -// return equal((IdentifiedArrayReferenceValue)other); -// } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (this == object) - { - return true; - } - - if (!super.equals(object)) - { - return false; - } - - ArrayReferenceValue other = (ArrayReferenceValue)object; - return this.arrayLength.equals(other.arrayLength); - } - - - public int hashCode() - { - return super.hashCode() ^ - arrayLength.hashCode(); - } - - - public String toString() - { - return super.toString() + '['+arrayLength+']'; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ArrayReferenceValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ArrayReferenceValueFactory.java deleted file mode 100644 index d564402c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ArrayReferenceValueFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.*; - -/** - * This identified value factory creates array reference values that also - * represent their elements, in as far as possible. - * - * @author Eric Lafortune - */ -public class ArrayReferenceValueFactory -extends TypedReferenceValueFactory -{ - // Implementations for ReferenceValue. - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return type == null ? - REFERENCE_VALUE_NULL : - new ArrayReferenceValue(ClassConstants.TYPE_ARRAY + type, - referencedClass, - false, - arrayLength); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/BasicValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/BasicValueFactory.java deleted file mode 100644 index 64a9bf16..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/BasicValueFactory.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; - -/** - * This class provides methods to create and reuse Value objects. - * - * @author Eric Lafortune - */ -public class BasicValueFactory -implements ValueFactory -{ - // Shared copies of Value objects, to avoid creating a lot of objects. - static final IntegerValue INTEGER_VALUE = new UnknownIntegerValue(); - static final LongValue LONG_VALUE = new UnknownLongValue(); - static final FloatValue FLOAT_VALUE = new UnknownFloatValue(); - static final DoubleValue DOUBLE_VALUE = new UnknownDoubleValue(); - static final ReferenceValue REFERENCE_VALUE = new UnknownReferenceValue(); - - - // Implementations for BasicValueFactory. - - public Value createValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - switch (type.charAt(0)) - { - case ClassConstants.TYPE_VOID: return null; - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: return createIntegerValue(); - case ClassConstants.TYPE_LONG: return createLongValue(); - case ClassConstants.TYPE_FLOAT: return createFloatValue(); - case ClassConstants.TYPE_DOUBLE: return createDoubleValue(); - default: return createReferenceValue(ClassUtil.isInternalArrayType(type) ? - type : - ClassUtil.internalClassNameFromClassType(type), - referencedClass, - mayBeExtension, - mayBeNull); - } - } - - - public IntegerValue createIntegerValue() - { - return INTEGER_VALUE; - } - - - public IntegerValue createIntegerValue(int value) - { - return createIntegerValue(); - } - - - public LongValue createLongValue() - { - return LONG_VALUE; - } - - - public LongValue createLongValue(long value) - { - return createLongValue(); - } - - - public FloatValue createFloatValue() - { - return FLOAT_VALUE; - } - - - public FloatValue createFloatValue(float value) - { - return createFloatValue(); - } - - - public DoubleValue createDoubleValue() - { - return DOUBLE_VALUE; - } - - - public DoubleValue createDoubleValue(double value) - { - return createDoubleValue(); - } - - - public ReferenceValue createReferenceValue() - { - return REFERENCE_VALUE; - } - - - public ReferenceValue createReferenceValueNull() - { - return REFERENCE_VALUE; - } - - - public ReferenceValue createReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - return createReferenceValue(); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return createReferenceValue(type, referencedClass, false, false); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength, - Value elementValue) - { - return createArrayReferenceValue(type, referencedClass, arrayLength); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Category1Value.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Category1Value.java deleted file mode 100644 index 2aafb45b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Category1Value.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This abstract class represents a partially evaluated Category 1 value. - * - * @author Eric Lafortune - */ -public abstract class Category1Value extends Value -{ - // Implementations for Value. - - public final Category1Value category1Value() - { - return this; - } - - public final boolean isCategory2() - { - return false; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Category2Value.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Category2Value.java deleted file mode 100644 index 5a5835bd..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Category2Value.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This abstract class represents a partially evaluated Category 2 value. - * - * @author Eric Lafortune - */ -public abstract class Category2Value extends Value -{ - // Implementations for Value. - - public final Category2Value category2Value() - { - return this; - } - - public final boolean isCategory2() - { - return true; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ComparisonValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ComparisonValue.java deleted file mode 100644 index 97d46ea7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ComparisonValue.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents the result of a comparisons of two scalar - * values. - * - * @author Eric Lafortune - */ -final class ComparisonValue extends SpecificIntegerValue -{ - private final Value value1; - private final Value value2; - - - /** - * Creates a new comparison integer value of the two given scalar values. - */ - public ComparisonValue(Value value1, - Value value2) - { - this.value1 = value1; - this.value2 = value2; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value1.equals(((ComparisonValue)object).value1) && - this.value2.equals(((ComparisonValue)object).value2); - } - - - public int hashCode() - { - return super.hashCode() ^ - value1.hashCode() ^ - value2.hashCode(); - } - - - public String toString() - { - return "("+value1+"~"+ value2 +")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeDoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeDoubleValue.java deleted file mode 100644 index 5af044cd..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeDoubleValue.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This DoubleValue represents the result of a binary operation on two double - * values. - * - * @author Eric Lafortune - */ -final class CompositeDoubleValue extends SpecificDoubleValue -{ - public static final byte ADD = '+'; - public static final byte SUBTRACT = '-'; - public static final byte MULTIPLY = '*'; - public static final byte DIVIDE = '/'; - public static final byte REMAINDER = '%'; - - - private final DoubleValue doubleValue1; - private final byte operation; - private final DoubleValue doubleValue2; - - - /** - * Creates a new composite double value of the two given double values - * and the given operation. - */ - public CompositeDoubleValue(DoubleValue doubleValue1, - byte operation, - DoubleValue doubleValue2) - { - this.doubleValue1 = doubleValue1; - this.operation = operation; - this.doubleValue2 = doubleValue2; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.doubleValue1.equals(((CompositeDoubleValue)object).doubleValue1) && - this.operation == ((CompositeDoubleValue)object).operation && - this.doubleValue2.equals(((CompositeDoubleValue)object).doubleValue2); - } - - - public int hashCode() - { - return super.hashCode() ^ - doubleValue1.hashCode() ^ - doubleValue2.hashCode(); - } - - - public String toString() - { - return "("+doubleValue1+((char)operation)+doubleValue2+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeFloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeFloatValue.java deleted file mode 100644 index e461c6b6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeFloatValue.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This FloatValue represents the result of a binary operation on two float - * values. - * - * @author Eric Lafortune - */ -final class CompositeFloatValue extends SpecificFloatValue -{ - public static final byte ADD = '+'; - public static final byte SUBTRACT = '-'; - public static final byte MULTIPLY = '*'; - public static final byte DIVIDE = '/'; - public static final byte REMAINDER = '%'; - - - private final FloatValue floatValue1; - private final byte operation; - private final FloatValue floatValue2; - - - /** - * Creates a new composite float value of the two given float values - * and the given operation. - */ - public CompositeFloatValue(FloatValue floatValue1, - byte operation, - FloatValue floatValue2) - { - this.floatValue1 = floatValue1; - this.operation = operation; - this.floatValue2 = floatValue2; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.floatValue1.equals(((CompositeFloatValue)object).floatValue1) && - this.operation == ((CompositeFloatValue)object).operation && - this.floatValue2.equals(((CompositeFloatValue)object).floatValue2); - } - - - public int hashCode() - { - return super.hashCode() ^ - floatValue1.hashCode() ^ - floatValue2.hashCode(); - } - - - public String toString() - { - return "("+floatValue1+((char)operation)+floatValue2+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeIntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeIntegerValue.java deleted file mode 100644 index cbb87a0f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeIntegerValue.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents the result of a binary operation on two integer - * values. - * - * @author Eric Lafortune - */ -final class CompositeIntegerValue extends SpecificIntegerValue -{ - public static final byte ADD = '+'; - public static final byte SUBTRACT = '-'; - public static final byte MULTIPLY = '*'; - public static final byte DIVIDE = '/'; - public static final byte REMAINDER = '%'; - public static final byte SHIFT_LEFT = '<'; - public static final byte SHIFT_RIGHT = '>'; - public static final byte UNSIGNED_SHIFT_RIGHT = '}'; - public static final byte AND = '&'; - public static final byte OR = '|'; - public static final byte XOR = '^'; - - - private final IntegerValue integerValue1; - private final byte operation; - private final IntegerValue integerValue2; - - - /** - * Creates a new composite integer value of the two given integer values - * and the given operation. - */ - public CompositeIntegerValue(IntegerValue integerValue1, - byte operation, - IntegerValue integerValue2) - { - this.integerValue1 = integerValue1; - this.operation = operation; - this.integerValue2 = integerValue2; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.integerValue1.equals(((CompositeIntegerValue)object).integerValue1) && - this.operation == ((CompositeIntegerValue)object).operation && - this.integerValue2.equals(((CompositeIntegerValue)object).integerValue2); - } - - - public int hashCode() - { - return super.hashCode() ^ - integerValue1.hashCode() ^ - integerValue2.hashCode(); - } - - - public String toString() - { - return "("+integerValue1+((char)operation)+integerValue2+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeLongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeLongValue.java deleted file mode 100644 index 0966c38f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/CompositeLongValue.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This LongValue represents the result of a binary operation on two long - * values. - * - * @author Eric Lafortune - */ -final class CompositeLongValue extends SpecificLongValue -{ - public static final byte ADD = '+'; - public static final byte SUBTRACT = '-'; - public static final byte MULTIPLY = '*'; - public static final byte DIVIDE = '/'; - public static final byte REMAINDER = '%'; - public static final byte SHIFT_LEFT = '<'; - public static final byte SHIFT_RIGHT = '>'; - public static final byte UNSIGNED_SHIFT_RIGHT = '}'; - public static final byte AND = '&'; - public static final byte OR = '|'; - public static final byte XOR = '^'; - - - private final LongValue longValue1; - private final byte operation; - private final Value longValue2; - - - /** - * Creates a new composite long value of the two given long values - * and the given operation. - */ - public CompositeLongValue(LongValue longValue1, - byte operation, - Value longValue2) - { - this.longValue1 = longValue1; - this.operation = operation; - this.longValue2 = longValue2; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.longValue1.equals(((CompositeLongValue)object).longValue1) && - this.operation == ((CompositeLongValue)object).operation && - this.longValue2.equals(((CompositeLongValue)object).longValue2); - } - - - public int hashCode() - { - return super.hashCode() ^ - longValue1.hashCode() ^ - longValue2.hashCode(); - } - - - public String toString() - { - return "("+longValue1+((char)operation)+longValue2+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedByteValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedByteValue.java deleted file mode 100644 index 3f297fe0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedByteValue.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a byte value that is converted from an - * integer value. - * - * @author Eric Lafortune - */ -final class ConvertedByteValue extends SpecificIntegerValue -{ - private final IntegerValue value; - - - /** - * Creates a new converted byte value of the given integer value. - */ - public ConvertedByteValue(IntegerValue value) - { - this.value = value; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value.equals(((ConvertedByteValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - value.hashCode(); - } - - - public String toString() - { - return "(byte)("+value+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedCharacterValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedCharacterValue.java deleted file mode 100644 index 68f76f6f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedCharacterValue.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a character value that is converted from an - * integer value. - * - * @author Eric Lafortune - */ -final class ConvertedCharacterValue extends SpecificIntegerValue -{ - private final IntegerValue value; - - - /** - * Creates a new converted character value of the given integer value. - */ - public ConvertedCharacterValue(IntegerValue value) - { - this.value = value; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value.equals(((ConvertedCharacterValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - value.hashCode(); - } - - - public String toString() - { - return "(char)("+value+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedDoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedDoubleValue.java deleted file mode 100644 index adf6db9e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedDoubleValue.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This DoubleValue represents a double value that is converted from another - * scalar value. - * - * @author Eric Lafortune - */ -final class ConvertedDoubleValue extends SpecificDoubleValue -{ - private final Value value; - - - /** - * Creates a new converted double value of the given value. - */ - public ConvertedDoubleValue(Value value) - { - this.value = value; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value.equals(((ConvertedDoubleValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - value.hashCode(); - } - - - public String toString() - { - return "(double)("+value+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedFloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedFloatValue.java deleted file mode 100644 index 51acd7ba..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedFloatValue.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This FloatValue represents a float value that is converted from another - * scalar value. - * - * @author Eric Lafortune - */ -final class ConvertedFloatValue extends SpecificFloatValue -{ - private final Value value; - - - /** - * Creates a new converted float value of the given value. - */ - public ConvertedFloatValue(Value value) - { - this.value = value; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value.equals(((ConvertedFloatValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - value.hashCode(); - } - - - public String toString() - { - return "(float)("+value+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedIntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedIntegerValue.java deleted file mode 100644 index 4c40f37a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedIntegerValue.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a integer value that is converted from another - * scalar value. - * - * @author Eric Lafortune - */ -final class ConvertedIntegerValue extends SpecificIntegerValue -{ - private final Value value; - - - /** - * Creates a new converted integer value of the given value. - */ - public ConvertedIntegerValue(Value value) - { - this.value = value; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value.equals(((ConvertedIntegerValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - value.hashCode(); - } - - - public String toString() - { - return "(int)("+value+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedLongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedLongValue.java deleted file mode 100644 index 168eb028..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedLongValue.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This LongValue represents a long value that is converted from another - * scalar value. - * - * @author Eric Lafortune - */ -final class ConvertedLongValue extends SpecificLongValue -{ - private final Value value; - - - /** - * Creates a new converted long value of the given value. - */ - public ConvertedLongValue(Value value) - { - this.value = value; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value.equals(((ConvertedLongValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - value.hashCode(); - } - - - public String toString() - { - return "(long)("+value+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedShortValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedShortValue.java deleted file mode 100644 index f8097bac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ConvertedShortValue.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a short value that is converted from an - * integer value. - * - * @author Eric Lafortune - */ -final class ConvertedShortValue extends SpecificIntegerValue -{ - private final IntegerValue value; - - - /** - * Creates a new converted short value of the given integer value. - */ - public ConvertedShortValue(IntegerValue value) - { - this.value = value; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.value.equals(((ConvertedShortValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - value.hashCode(); - } - - - public String toString() - { - return "(short)("+value+")"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DetailedArrayReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DetailedArrayReferenceValue.java deleted file mode 100644 index 48a7246a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DetailedArrayReferenceValue.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; -import proguard.classfile.util.ClassUtil; -import proguard.util.ArrayUtil; - -/** - * This IdentifiedArrayReferenceValue represents an identified array reference - * value with its elements. - * - * @author Eric Lafortune - */ -class DetailedArrayReferenceValue extends IdentifiedArrayReferenceValue -{ - private static final int MAXIMUM_STORED_ARRAY_LENGTH = 32; - - - private final Value[] values; - - - /** - * Creates a new array reference value with the given ID. - */ - public DetailedArrayReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - IntegerValue arrayLength, - ValueFactory valuefactory, - int id) - { - super(type, referencedClass, mayBeExtension, arrayLength, valuefactory, id); - - // Is the array short enough to analyze? - if (arrayLength.isParticular() && - arrayLength.value() >= 0 && - arrayLength.value() <= MAXIMUM_STORED_ARRAY_LENGTH) - { - // Initialize the values of the array. - InitialValueFactory initialValueFactory = - new InitialValueFactory(valuefactory); - - String elementType = ClassUtil.isInternalArrayType(type) ? - type.substring(1) : - type; - - this.values = new Value[arrayLength.value()]; - - for (int index = 0; index < values.length; index++) - { - values[index] = initialValueFactory.createValue(elementType); - } - } - else - { - // Just ignore the values of the array. - this.values = null; - } - } - - - // Implementations for ReferenceValue. - - public IntegerValue integerArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - Value value = arrayLoad(indexValue, valueFactory); - return value != null ? - value.integerValue() : - super.integerArrayLoad(indexValue, valueFactory); - } - - - public LongValue longArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - Value value = arrayLoad(indexValue, valueFactory); - return value != null ? - value.longValue() : - super.longArrayLoad(indexValue, valueFactory); - } - - - public FloatValue floatArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - Value value = arrayLoad(indexValue, valueFactory); - return value != null ? - value.floatValue() : - super.floatArrayLoad(indexValue, valueFactory); - } - - - public DoubleValue doubleArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - Value value = arrayLoad(indexValue, valueFactory); - return value != null ? - value.doubleValue() : - super.doubleArrayLoad(indexValue, valueFactory); - } - - - public ReferenceValue referenceArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - Value value = arrayLoad(indexValue, valueFactory); - return value != null ? - value.referenceValue() : - super.referenceArrayLoad(indexValue, valueFactory); - } - - - /** - * Returns the specified untyped value from the given array, or null if it - * is unknown. - */ - private Value arrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - if (values != null && - indexValue.isParticular()) - { - int index = indexValue.value(); - if (index >=0 && - index < values.length) - { - return values[index]; - } - } - - return null; - } - - - public void arrayStore(IntegerValue indexValue, Value value) - { - if (values != null) - { - if (indexValue.isParticular()) - { - int index = indexValue.value(); - if (index >=0 && - index < values.length) - { - values[index] = value; - } - } - else - { - for (int index = 0; index < values.length; index++) - { - values[index].generalize(value); - } - } - } - } - - - // Implementations of binary methods of ReferenceValue. - - public ReferenceValue generalize(ReferenceValue other) - { - return other.generalize(this); - } - - - public int equal(ReferenceValue other) - { - return other.equal(this); - } - - -// // Implementations of binary ReferenceValue methods with -// // UnknownReferenceValue arguments. -// -// public ReferenceValue generalize(UnknownReferenceValue other) -// { -// return other; -// } -// -// -// public int equal(UnknownReferenceValue other) -// { -// return MAYBE; -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TypedReferenceValue arguments. -// -// public ReferenceValue generalize(TypedReferenceValue other) -// { -// } -// -// -// public int equal(TypedReferenceValue other) -// { -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // IdentifiedReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(IdentifiedReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // ArrayReferenceValue arguments. -// -// public ReferenceValue generalize(ArrayReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(ArrayReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // IdentifiedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) -// { -// return generalize((ArrayReferenceValue)other); -// } -// -// -// public int equal(IdentifiedArrayReferenceValue other) -// { -// return equal((ArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // DetailedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(DetailedArrayReferenceValue other) -// { -// return generalize((IdentifiedArrayReferenceValue)other); -// } -// -// -// public int equal(DetailedArrayReferenceValue other) -// { -// return equal((IdentifiedArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TracedReferenceValue arguments. -// -// public ReferenceValue generalize(TracedReferenceValue other) -// { -// return other.generalize(this); -// } -// -// -// public int equal(TracedReferenceValue other) -// { -// return other.equal(this); -// } - - - // Implementations for Value. - - public boolean isParticular() - { - if (values == null) - { - return false; - } - - for (int index = 0; index < values.length; index++) - { - if (!values[index].isParticular()) - { - return false; - } - } - - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (this == object) - { - return true; - } - - if (!super.equals(object)) - { - return false; - } - - DetailedArrayReferenceValue other = - (DetailedArrayReferenceValue)object; - - return ArrayUtil.equalOrNull(this.values, other.values); - } - - - public int hashCode() - { - return super.hashCode() ^ - ArrayUtil.hashCodeOrNull(values); - } - - - public String toString() - { - if (values == null) - { - return super.toString(); - } - - StringBuffer buffer = new StringBuffer(super.toString()); - - buffer.append('{'); - for (int index = 0; index < values.length; index++) - { - buffer.append(values[index]); - buffer.append(index < values.length-1 ? ',' : '}'); - } - - return buffer.toString(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DetailedArrayValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DetailedArrayValueFactory.java deleted file mode 100644 index d169f2ad..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DetailedArrayValueFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.*; - -/** - * This identified value factory creates array reference values that also - * represent their elements, in as far as possible. - * - * @author Eric Lafortune - */ -public class DetailedArrayValueFactory -extends IdentifiedValueFactory -{ - // Implementations for ReferenceValue. - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return type == null ? - TypedReferenceValueFactory.REFERENCE_VALUE_NULL : - new DetailedArrayReferenceValue(ClassConstants.TYPE_ARRAY + type, - referencedClass, - false, - arrayLength, - this, - referenceID++); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DoubleValue.java deleted file mode 100644 index fbac4b0a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/DoubleValue.java +++ /dev/null @@ -1,359 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.ClassConstants; - -/** - * This class represents a partially evaluated double value. - * - * @author Eric Lafortune - */ -public abstract class DoubleValue extends Category2Value -{ - /** - * Returns the specific double value, if applicable. - */ - public double value() - { - return 0.0; - } - - - // Basic unary methods. - - /** - * Returns the negated value of this DoubleValue. - */ - public abstract DoubleValue negate(); - - /** - * Converts this DoubleValue to an IntegerValue. - */ - public abstract IntegerValue convertToInteger(); - - /** - * Converts this DoubleValue to a LongValue. - */ - public abstract LongValue convertToLong(); - - /** - * Converts this DoubleValue to a FloatValue. - */ - public abstract FloatValue convertToFloat(); - - - // Basic binary methods. - - /** - * Returns the generalization of this DoubleValue and the given other - * DoubleValue. - */ - public abstract DoubleValue generalize(DoubleValue other); - - - /** - * Returns the sum of this DoubleValue and the given DoubleValue. - */ - public abstract DoubleValue add(DoubleValue other); - - /** - * Returns the difference of this DoubleValue and the given DoubleValue. - */ - public abstract DoubleValue subtract(DoubleValue other); - - /** - * Returns the difference of the given DoubleValue and this DoubleValue. - */ - public abstract DoubleValue subtractFrom(DoubleValue other); - - /** - * Returns the product of this DoubleValue and the given DoubleValue. - */ - public abstract DoubleValue multiply(DoubleValue other); - - /** - * Returns the quotient of this DoubleValue and the given DoubleValue. - */ - public abstract DoubleValue divide(DoubleValue other); - - /** - * Returns the quotient of the given DoubleValue and this DoubleValue. - */ - public abstract DoubleValue divideOf(DoubleValue other); - - /** - * Returns the remainder of this DoubleValue divided by the given DoubleValue. - */ - public abstract DoubleValue remainder(DoubleValue other); - - /** - * Returns the remainder of the given DoubleValue divided by this DoubleValue. - */ - public abstract DoubleValue remainderOf(DoubleValue other); - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this DoubleValue is - * less than, equal to, or greater than the given DoubleValue, respectively. - */ - public abstract IntegerValue compare(DoubleValue other); - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this DoubleValue is - * less than, equal to, or greater than the given DoubleValue, respectively. - */ - public final IntegerValue compareReverse(DoubleValue other) - { - return compare(other).negate(); - } - - - // Similar binary methods, but this time with more specific arguments. - - /** - * Returns the generalization of this DoubleValue and the given other - * SpecificDoubleValue. - */ - public DoubleValue generalize(SpecificDoubleValue other) - { - return generalize((DoubleValue)other); - } - - - /** - * Returns the sum of this DoubleValue and the given SpecificDoubleValue. - */ - public DoubleValue add(SpecificDoubleValue other) - { - return add((DoubleValue)other); - } - - /** - * Returns the difference of this DoubleValue and the given SpecificDoubleValue. - */ - public DoubleValue subtract(SpecificDoubleValue other) - { - return subtract((DoubleValue)other); - } - - /** - * Returns the difference of the given SpecificDoubleValue and this DoubleValue. - */ - public DoubleValue subtractFrom(SpecificDoubleValue other) - { - return subtractFrom((DoubleValue)other); - } - - /** - * Returns the product of this DoubleValue and the given SpecificDoubleValue. - */ - public DoubleValue multiply(SpecificDoubleValue other) - { - return multiply((DoubleValue)other); - } - - /** - * Returns the quotient of this DoubleValue and the given SpecificDoubleValue. - */ - public DoubleValue divide(SpecificDoubleValue other) - { - return divide((DoubleValue)other); - } - - /** - * Returns the quotient of the given SpecificDoubleValue and this - * DoubleValue. - */ - public DoubleValue divideOf(SpecificDoubleValue other) - { - return divideOf((DoubleValue)other); - } - - /** - * Returns the remainder of this DoubleValue divided by the given - * SpecificDoubleValue. - */ - public DoubleValue remainder(SpecificDoubleValue other) - { - return remainder((DoubleValue)other); - } - - /** - * Returns the remainder of the given SpecificDoubleValue and this - * DoubleValue. - */ - public DoubleValue remainderOf(SpecificDoubleValue other) - { - return remainderOf((DoubleValue)other); - } - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this DoubleValue is - * less than, equal to, or greater than the given SpecificDoubleValue, - * respectively. - */ - public IntegerValue compare(SpecificDoubleValue other) - { - return compare((DoubleValue)other); - } - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this DoubleValue is - * less than, equal to, or greater than the given SpecificDoubleValue, - * respectively. - */ - public final IntegerValue compareReverse(SpecificDoubleValue other) - { - return compare(other).negate(); - } - - - // Similar binary methods, but this time with particular arguments. - - /** - * Returns the generalization of this DoubleValue and the given other - * ParticularDoubleValue. - */ - public DoubleValue generalize(ParticularDoubleValue other) - { - return generalize((SpecificDoubleValue)other); - } - - - /** - * Returns the sum of this DoubleValue and the given ParticularDoubleValue. - */ - public DoubleValue add(ParticularDoubleValue other) - { - return add((SpecificDoubleValue)other); - } - - /** - * Returns the difference of this DoubleValue and the given ParticularDoubleValue. - */ - public DoubleValue subtract(ParticularDoubleValue other) - { - return subtract((SpecificDoubleValue)other); - } - - /** - * Returns the difference of the given ParticularDoubleValue and this DoubleValue. - */ - public DoubleValue subtractFrom(ParticularDoubleValue other) - { - return subtractFrom((SpecificDoubleValue)other); - } - - /** - * Returns the product of this DoubleValue and the given ParticularDoubleValue. - */ - public DoubleValue multiply(ParticularDoubleValue other) - { - return multiply((SpecificDoubleValue)other); - } - - /** - * Returns the quotient of this DoubleValue and the given ParticularDoubleValue. - */ - public DoubleValue divide(ParticularDoubleValue other) - { - return divide((SpecificDoubleValue)other); - } - - /** - * Returns the quotient of the given ParticularDoubleValue and this - * DoubleValue. - */ - public DoubleValue divideOf(ParticularDoubleValue other) - { - return divideOf((SpecificDoubleValue)other); - } - - /** - * Returns the remainder of this DoubleValue divided by the given - * ParticularDoubleValue. - */ - public DoubleValue remainder(ParticularDoubleValue other) - { - return remainder((SpecificDoubleValue)other); - } - - /** - * Returns the remainder of the given ParticularDoubleValue and this - * DoubleValue. - */ - public DoubleValue remainderOf(ParticularDoubleValue other) - { - return remainderOf((SpecificDoubleValue)other); - } - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this DoubleValue is - * less than, equal to, or greater than the given ParticularDoubleValue, - * respectively. - */ - public IntegerValue compare(ParticularDoubleValue other) - { - return compare((SpecificDoubleValue)other); - } - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this DoubleValue is - * less than, equal to, or greater than the given ParticularDoubleValue, - * respectively. - */ - public final IntegerValue compareReverse(ParticularDoubleValue other) - { - return compare(other).negate(); - } - - - // Implementations for Value. - - public final DoubleValue doubleValue() - { - return this; - } - - public final Value generalize(Value other) - { - return this.generalize(other.doubleValue()); - } - - public final int computationalType() - { - return TYPE_DOUBLE; - } - - public final String internalType() - { - return String.valueOf(ClassConstants.TYPE_DOUBLE); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/FloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/FloatValue.java deleted file mode 100644 index bd845742..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/FloatValue.java +++ /dev/null @@ -1,359 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.ClassConstants; - -/** - * This class represents a partially evaluated float value. - * - * @author Eric Lafortune - */ -public abstract class FloatValue extends Category1Value -{ - /** - * Returns the specific float value, if applicable. - */ - public float value() - { - return 0f; - } - - - // Basic unary methods. - - /** - * Returns the negated value of this FloatValue. - */ - public abstract FloatValue negate(); - - /** - * Converts this FloatValue to an IntegerValue. - */ - public abstract IntegerValue convertToInteger(); - - /** - * Converts this FloatValue to a LongValue. - */ - public abstract LongValue convertToLong(); - - /** - * Converts this FloatValue to a DoubleValue. - */ - public abstract DoubleValue convertToDouble(); - - - // Basic binary methods. - - /** - * Returns the generalization of this FloatValue and the given other - * FloatValue. - */ - public abstract FloatValue generalize(FloatValue other); - - - /** - * Returns the sum of this FloatValue and the given FloatValue. - */ - public abstract FloatValue add(FloatValue other); - - /** - * Returns the difference of this FloatValue and the given FloatValue. - */ - public abstract FloatValue subtract(FloatValue other); - - /** - * Returns the difference of the given FloatValue and this FloatValue. - */ - public abstract FloatValue subtractFrom(FloatValue other); - - /** - * Returns the product of this FloatValue and the given FloatValue. - */ - public abstract FloatValue multiply(FloatValue other); - - /** - * Returns the quotient of this FloatValue and the given FloatValue. - */ - public abstract FloatValue divide(FloatValue other); - - /** - * Returns the quotient of the given FloatValue and this FloatValue. - */ - public abstract FloatValue divideOf(FloatValue other); - - /** - * Returns the remainder of this FloatValue divided by the given FloatValue. - */ - public abstract FloatValue remainder(FloatValue other); - - /** - * Returns the remainder of the given FloatValue divided by this FloatValue. - */ - public abstract FloatValue remainderOf(FloatValue other); - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this FloatValue is - * less than, equal to, or greater than the given FloatValue, respectively. - */ - public abstract IntegerValue compare(FloatValue other); - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this FloatValue is - * less than, equal to, or greater than the given FloatValue, respectively. - */ - public final IntegerValue compareReverse(FloatValue other) - { - return compare(other).negate(); - } - - - // Similar binary methods, but this time with more specific arguments. - - /** - * Returns the generalization of this FloatValue and the given other - * SpecificFloatValue. - */ - public FloatValue generalize(SpecificFloatValue other) - { - return generalize((FloatValue)other); - } - - - /** - * Returns the sum of this FloatValue and the given SpecificFloatValue. - */ - public FloatValue add(SpecificFloatValue other) - { - return add((FloatValue)other); - } - - /** - * Returns the difference of this FloatValue and the given SpecificFloatValue. - */ - public FloatValue subtract(SpecificFloatValue other) - { - return subtract((FloatValue)other); - } - - /** - * Returns the difference of the given SpecificFloatValue and this FloatValue. - */ - public FloatValue subtractFrom(SpecificFloatValue other) - { - return subtractFrom((FloatValue)other); - } - - /** - * Returns the product of this FloatValue and the given SpecificFloatValue. - */ - public FloatValue multiply(SpecificFloatValue other) - { - return multiply((FloatValue)other); - } - - /** - * Returns the quotient of this FloatValue and the given SpecificFloatValue. - */ - public FloatValue divide(SpecificFloatValue other) - { - return divide((FloatValue)other); - } - - /** - * Returns the quotient of the given SpecificFloatValue and this - * FloatValue. - */ - public FloatValue divideOf(SpecificFloatValue other) - { - return divideOf((FloatValue)other); - } - - /** - * Returns the remainder of this FloatValue divided by the given - * SpecificFloatValue. - */ - public FloatValue remainder(SpecificFloatValue other) - { - return remainder((FloatValue)other); - } - - /** - * Returns the remainder of the given SpecificFloatValue and this - * FloatValue. - */ - public FloatValue remainderOf(SpecificFloatValue other) - { - return remainderOf((FloatValue)other); - } - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this FloatValue is - * less than, equal to, or greater than the given SpecificFloatValue, - * respectively. - */ - public IntegerValue compare(SpecificFloatValue other) - { - return compare((FloatValue)other); - } - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this FloatValue is - * less than, equal to, or greater than the given SpecificFloatValue, - * respectively. - */ - public final IntegerValue compareReverse(SpecificFloatValue other) - { - return compare(other).negate(); - } - - - // Similar binary methods, but this time with particular arguments. - - /** - * Returns the generalization of this FloatValue and the given other - * ParticularFloatValue. - */ - public FloatValue generalize(ParticularFloatValue other) - { - return generalize((SpecificFloatValue)other); - } - - - /** - * Returns the sum of this FloatValue and the given ParticularFloatValue. - */ - public FloatValue add(ParticularFloatValue other) - { - return add((SpecificFloatValue)other); - } - - /** - * Returns the difference of this FloatValue and the given ParticularFloatValue. - */ - public FloatValue subtract(ParticularFloatValue other) - { - return subtract((SpecificFloatValue)other); - } - - /** - * Returns the difference of the given ParticularFloatValue and this FloatValue. - */ - public FloatValue subtractFrom(ParticularFloatValue other) - { - return subtractFrom((SpecificFloatValue)other); - } - - /** - * Returns the product of this FloatValue and the given ParticularFloatValue. - */ - public FloatValue multiply(ParticularFloatValue other) - { - return multiply((SpecificFloatValue)other); - } - - /** - * Returns the quotient of this FloatValue and the given ParticularFloatValue. - */ - public FloatValue divide(ParticularFloatValue other) - { - return divide((SpecificFloatValue)other); - } - - /** - * Returns the quotient of the given ParticularFloatValue and this - * FloatValue. - */ - public FloatValue divideOf(ParticularFloatValue other) - { - return divideOf((SpecificFloatValue)other); - } - - /** - * Returns the remainder of this FloatValue divided by the given - * ParticularFloatValue. - */ - public FloatValue remainder(ParticularFloatValue other) - { - return remainder((SpecificFloatValue)other); - } - - /** - * Returns the remainder of the given ParticularFloatValue and this - * FloatValue. - */ - public FloatValue remainderOf(ParticularFloatValue other) - { - return remainderOf((SpecificFloatValue)other); - } - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this FloatValue is - * less than, equal to, or greater than the given ParticularFloatValue, - * respectively. - */ - public IntegerValue compare(ParticularFloatValue other) - { - return compare((SpecificFloatValue)other); - } - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this FloatValue is - * less than, equal to, or greater than the given ParticularFloatValue, - * respectively. - */ - public final IntegerValue compareReverse(ParticularFloatValue other) - { - return compare(other).negate(); - } - - - // Implementations for Value. - - public final FloatValue floatValue() - { - return this; - } - - public final Value generalize(Value other) - { - return this.generalize(other.floatValue()); - } - - public final int computationalType() - { - return TYPE_FLOAT; - } - - public final String internalType() - { - return String.valueOf(ClassConstants.TYPE_FLOAT); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedArrayReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedArrayReferenceValue.java deleted file mode 100644 index da31f07e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedArrayReferenceValue.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; - -/** - * This ArrayReferenceValue represents an array reference value that is - * identified by a unique ID. - * - * @author Eric Lafortune - */ -class IdentifiedArrayReferenceValue extends ArrayReferenceValue -{ - private final ValueFactory valuefactory; - private final int id; - - - /** - * Creates a new array reference value with the given ID. - */ - public IdentifiedArrayReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - IntegerValue arrayLength, - ValueFactory valuefactory, - int id) - { - super(type, referencedClass, mayBeExtension, arrayLength); - - this.valuefactory = valuefactory; - this.id = id; - } - - - // Implementations of binary methods of ReferenceValue. - - public ReferenceValue generalize(ReferenceValue other) - { - return other.generalize(this); - } - - - public int equal(ReferenceValue other) - { - return other.equal(this); - } - - -// // Implementations of binary ReferenceValue methods with -// // UnknownReferenceValue arguments. -// -// public ReferenceValue generalize(UnknownReferenceValue other) -// { -// return other; -// } -// -// -// public int equal(UnknownReferenceValue other) -// { -// return MAYBE; -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TypedReferenceValue arguments. -// -// public ReferenceValue generalize(TypedReferenceValue other) -// { -// } -// -// -// public int equal(TypedReferenceValue other) -// { -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // IdentifiedReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(IdentifiedReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // ArrayReferenceValue arguments. -// -// public ReferenceValue generalize(ArrayReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(ArrayReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// - // Implementations of binary ReferenceValue methods with - // IdentifiedArrayReferenceValue arguments. - -// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) -// { -// return generalize((ArrayReferenceValue)other); -// } - - - public int equal(IdentifiedArrayReferenceValue other) - { - return this.equals(other) ? ALWAYS : - this.equal((TypedReferenceValue)other); - } - - -// // Implementations of binary ReferenceValue methods with -// // DetailedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(DetailedArrayReferenceValue other) -// { -// return generalize((IdentifiedArrayReferenceValue)other); -// } -// -// -// public int equal(DetailedArrayReferenceValue other) -// { -// return equal((IdentifiedArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TracedReferenceValue arguments. -// -// public ReferenceValue generalize(TracedReferenceValue other) -// { -// return other.generalize(this); -// } -// -// -// public int equal(TracedReferenceValue other) -// { -// return other.equal(this); -// } - - - // Implementations for Value. - - public boolean isSpecific() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (this == object) - { - return true; - } - - if (!super.equals(object)) - { - return false; - } - - IdentifiedArrayReferenceValue other = - (IdentifiedArrayReferenceValue)object; - - return this.valuefactory.equals(other.valuefactory) && - this.id == other.id; - } - - - public int hashCode() - { - return super.hashCode() ^ - valuefactory.hashCode() ^ - id; - } - - - public String toString() - { - return super.toString() + '#' + id; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedDoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedDoubleValue.java deleted file mode 100644 index 04be74a3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedDoubleValue.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This DoubleValue represents a double value that is identified by a unique ID. - * - * @author Eric Lafortune - */ -final class IdentifiedDoubleValue extends SpecificDoubleValue -{ - private final ValueFactory valuefactory; - private final int id; - - - /** - * Creates a new double value with the given ID. - */ - public IdentifiedDoubleValue(ValueFactory valuefactory, int id) - { - this.valuefactory = valuefactory; - this.id = id; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.valuefactory.equals(((IdentifiedDoubleValue)object).valuefactory) && - this.id == ((IdentifiedDoubleValue)object).id; - } - - - public int hashCode() - { - return super.hashCode() ^ - valuefactory.hashCode() ^ - id; - } - - - public String toString() - { - return "d"+id; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedFloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedFloatValue.java deleted file mode 100644 index aa0a86ca..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedFloatValue.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This FloatValue represents a float value that is identified by a unique ID. - * - * @author Eric Lafortune - */ -final class IdentifiedFloatValue extends SpecificFloatValue -{ - private final ValueFactory valuefactory; - private final int id; - - - /** - * Creates a new float value with the given ID. - */ - public IdentifiedFloatValue(ValueFactory valuefactory, int id) - { - this.valuefactory = valuefactory; - this.id = id; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.valuefactory.equals(((IdentifiedFloatValue)object).valuefactory) && - this.id == ((IdentifiedFloatValue)object).id; - } - - - public int hashCode() - { - return super.hashCode() ^ - valuefactory.hashCode() ^ - id; - } - - - public String toString() - { - return "f"+id; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedIntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedIntegerValue.java deleted file mode 100644 index f92363df..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedIntegerValue.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a integer value that is identified by a unique ID. - * - * @author Eric Lafortune - */ -final class IdentifiedIntegerValue extends SpecificIntegerValue -{ - private final ValueFactory valuefactory; - private final int id; - - - /** - * Creates a new integer value with the given ID. - */ - public IdentifiedIntegerValue(ValueFactory valuefactory, int id) - { - this.valuefactory = valuefactory; - this.id = id; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.valuefactory.equals(((IdentifiedIntegerValue)object).valuefactory) && - this.id == ((IdentifiedIntegerValue)object).id; - } - - - public int hashCode() - { - return super.hashCode() ^ - valuefactory.hashCode() ^ - id; - } - - - public String toString() - { - return "i"+id; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedLongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedLongValue.java deleted file mode 100644 index ad3775a2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedLongValue.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This LongValue represents a long value that is identified by a unique ID. - * - * @author Eric Lafortune - */ -final class IdentifiedLongValue extends SpecificLongValue -{ - private final ValueFactory valuefactory; - private final int id; - - - /** - * Creates a new long value with the given ID. - */ - public IdentifiedLongValue(ValueFactory valuefactory, int id) - { - this.valuefactory = valuefactory; - this.id = id; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.valuefactory.equals(((IdentifiedLongValue)object).valuefactory) && - this.id == ((IdentifiedLongValue)object).id; - } - - - public int hashCode() - { - return super.hashCode() ^ - valuefactory.hashCode() ^ - id; - } - - - public String toString() - { - return "l"+id; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedReferenceValue.java deleted file mode 100644 index a3a2d7c1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedReferenceValue.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; - -/** - * This ReferenceValue represents a reference value that is identified by a - * unique ID. - * - * @author Eric Lafortune - */ -final class IdentifiedReferenceValue extends TypedReferenceValue -{ - private final ValueFactory valuefactory; - private final int id; - - - /** - * Creates a new reference value with the given ID. - */ - public IdentifiedReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull, - ValueFactory valuefactory, - int id) - { - super(type, referencedClass, mayBeExtension, mayBeNull); - - this.valuefactory = valuefactory; - this.id = id; - } - - - // Implementations of binary methods of ReferenceValue. - - public ReferenceValue generalize(ReferenceValue other) - { - return other.generalize(this); - } - - - public int equal(ReferenceValue other) - { - return other.equal(this); - } - - -// // Implementations of binary ReferenceValue methods with -// // UnknownReferenceValue arguments. -// -// public ReferenceValue generalize(UnknownReferenceValue other) -// { -// return other; -// } -// -// -// public int equal(UnknownReferenceValue other) -// { -// return MAYBE; -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TypedReferenceValue arguments. -// -// public ReferenceValue generalize(TypedReferenceValue other) -// { -// } -// -// -// public int equal(TypedReferenceValue other) -// { -// } - - - // Implementations of binary ReferenceValue methods with - // IdentifiedReferenceValue arguments. - -// public ReferenceValue generalize(IdentifiedReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } - - - public int equal(IdentifiedReferenceValue other) - { - return this.equals(other) ? ALWAYS : - this.equal((TypedReferenceValue)other); - } - - -// // Implementations of binary ReferenceValue methods with -// // ArrayReferenceValue arguments. -// -// public ReferenceValue generalize(ArrayReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(ArrayReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // IdentifiedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) -// { -// return generalize((ArrayReferenceValue)other); -// } -// -// -// public int equal(IdentifiedArrayReferenceValue other) -// { -// return equal((ArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // DetailedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(DetailedArrayReferenceValue other) -// { -// return generalize((IdentifiedArrayReferenceValue)other); -// } -// -// -// public int equal(DetailedArrayReferenceValue other) -// { -// return equal((IdentifiedArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TracedReferenceValue arguments. -// -// public ReferenceValue generalize(TracedReferenceValue other) -// { -// return other.generalize(this); -// } -// -// -// public int equal(TracedReferenceValue other) -// { -// return other.equal(this); -// } - - - // Implementations for Value. - - public boolean isSpecific() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (this == object) - { - return true; - } - - if (!super.equals(object)) - { - return false; - } - - IdentifiedReferenceValue other = (IdentifiedReferenceValue)object; - return this.valuefactory.equals(other.valuefactory) && - this.id == other.id; - } - - - public int hashCode() - { - return super.hashCode() ^ - valuefactory.hashCode() ^ - id; - } - - - public String toString() - { - return super.toString()+'#'+id; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedValueFactory.java deleted file mode 100644 index 5c43cd3b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IdentifiedValueFactory.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.ClassConstants; -import proguard.classfile.Clazz; - -/** - * This class provides methods to create and reuse Value objects that are - * identified by unique integer IDs. - * - * @author Eric Lafortune - */ -public class IdentifiedValueFactory -extends ParticularValueFactory -{ - protected int integerID; - protected int longID; - protected int floatID; - protected int doubleID; - protected int referenceID; - - - // Implementations for BasicValueFactory. - - public IntegerValue createIntegerValue() - { - return new IdentifiedIntegerValue(this, integerID++); - } - - - public LongValue createLongValue() - { - return new IdentifiedLongValue(this, longID++); - } - - - public FloatValue createFloatValue() - { - return new IdentifiedFloatValue(this, floatID++); - } - - - public DoubleValue createDoubleValue() - { - return new IdentifiedDoubleValue(this, doubleID++); - } - - - public ReferenceValue createReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - return type == null ? - TypedReferenceValueFactory.REFERENCE_VALUE_NULL : - new IdentifiedReferenceValue(type, - referencedClass, - mayBeExtension, - mayBeNull, - this, - referenceID++); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return type == null ? - TypedReferenceValueFactory.REFERENCE_VALUE_NULL : - new IdentifiedArrayReferenceValue(ClassConstants.TYPE_ARRAY + type, - referencedClass, - false, - arrayLength, - this, - referenceID++); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/InitialValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/InitialValueFactory.java deleted file mode 100644 index 983c86f6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/InitialValueFactory.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.ClassConstants; - -/** - * This value factory creates initial values for fields and array elements, - * with the help of a given value factory. Note that this class itself doesn't - * implement ValueFactory. - * - * @author Eric Lafortune - */ -public class InitialValueFactory -{ - private final ValueFactory valueFactory; - - - /** - * Creates a new InitialValueFactory. - * @param valueFactory the value factory that will actually create the - * values. - */ - public InitialValueFactory(ValueFactory valueFactory) - { - this.valueFactory = valueFactory; - } - - - /** - * Creates an initial value (0, 0L, 0.0f, 0.0, null) of the given type. - */ - public Value createValue(String type) - { - switch (type.charAt(0)) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: - return valueFactory.createIntegerValue(0); - - case ClassConstants.TYPE_LONG: - return valueFactory.createLongValue(0L); - - case ClassConstants.TYPE_FLOAT: - return valueFactory.createFloatValue(0.0f); - - case ClassConstants.TYPE_DOUBLE: - return valueFactory.createDoubleValue(0.0); - - case ClassConstants.TYPE_CLASS_START: - case ClassConstants.TYPE_ARRAY: - return valueFactory.createReferenceValueNull(); - - default: - throw new IllegalArgumentException("Invalid type ["+type+"]"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/InstructionOffsetValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/InstructionOffsetValue.java deleted file mode 100644 index 429dea12..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/InstructionOffsetValue.java +++ /dev/null @@ -1,477 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.ClassConstants; - -/** - * This class represents a partially evaluated instruction offset. It can - * contain 0 or more specific instruction offsets. Each instruction offset - * can be flagged as an ordinary offset, a method parameter, a method return - * value, a field value, a new instance value, or an exception handler. - * - * @author Eric Lafortune - */ -public class InstructionOffsetValue extends Category1Value -{ - private static final int[] EMPTY_OFFSETS = new int[0]; - public static final InstructionOffsetValue EMPTY_VALUE = new InstructionOffsetValue(EMPTY_OFFSETS); - - public static final int INSTRUCTION_OFFSET_MASK = 0x01ffffff; - public static final int METHOD_PARAMETER = 0x01000000; // Method parameter indices are not really instruction offsets. - public static final int METHOD_RETURN_VALUE = 0x02000000; - public static final int FIELD_VALUE = 0x04000000; - public static final int NEW_INSTANCE = 0x08000000; - public static final int CAST = 0x10000000; - public static final int EXCEPTION_HANDLER = 0x20000000; - - - private int[] values; - - - /** - * Creates a new InstructionOffsetValue with the given instruction offset. - */ - public InstructionOffsetValue(int value) - { - this.values = new int[] { value }; - } - - - /** - * Creates a new InstructionOffsetValue with the given list of instruction - * offsets. - */ - public InstructionOffsetValue(int[] values) - { - this.values = values; - } - - - /** - * Returns the number of instruction offsets of this value. - */ - public int instructionOffsetCount() - { - return values.length; - } - - - /** - * Returns the specified instruction offset of this value. - */ - public int instructionOffset(int index) - { - return values[index] & INSTRUCTION_OFFSET_MASK; - } - - - /** - * Returns whether the given value is present in this list of instruction - * offsets. - */ - public boolean contains(int value) - { - for (int index = 0; index < values.length; index++) - { - if (values[index] == value) - { - return true; - } - } - - return false; - } - - - /** - * Returns the minimum value from this list of instruction offsets. - * Returns Integer.MAX_VALUE if the list is empty. - */ - public int minimumValue() - { - int minimumValue = Integer.MAX_VALUE; - - for (int index = 0; index < values.length; index++) - { - int value = values[index] & INSTRUCTION_OFFSET_MASK; - - if (minimumValue > value) - { - minimumValue = value; - } - } - - return minimumValue; - } - - - /** - * Returns the maximum value from this list of instruction offsets. - * Returns Integer.MIN_VALUE if the list is empty. - */ - public int maximumValue() - { - int maximumValue = Integer.MIN_VALUE; - - for (int index = 0; index < values.length; index++) - { - int value = values[index] & INSTRUCTION_OFFSET_MASK; - - if (maximumValue < value) - { - maximumValue = value; - } - } - - return maximumValue; - } - - - /** - * Returns whether the specified instruction offset corresponds to a method - * parameter. - */ - public boolean isMethodParameter(int index) - { - return (values[index] & METHOD_PARAMETER) != 0; - } - - - /** - * Returns the specified method parameter (assuming it is one). - */ - public int methodParameter(int index) - { - return values[index] & ~METHOD_PARAMETER; - } - - - /** - * Returns whether the specified instruction offset corresponds to a method - * return value. - */ - public boolean isMethodReturnValue(int index) - { - return (values[index] & METHOD_RETURN_VALUE) != 0; - } - - - /** - * Returns whether the specified instruction offset corresponds to a field - * value. - */ - public boolean isFieldValue(int index) - { - return (values[index] & FIELD_VALUE) != 0; - } - - - /** - * Returns whether the specified instruction offset corresponds to a new - * instance. - */ - public boolean isNewinstance(int index) - { - return (values[index] & NEW_INSTANCE) != 0; - } - - - /** - * Returns whether the specified instruction offset corresponds to a cast. - */ - public boolean isCast(int index) - { - return (values[index] & CAST) != 0; - } - - - /** - * Returns whether the specified instruction offset corresponds to an - * exception handler. - */ - public boolean isExceptionHandler(int index) - { - return (values[index] & EXCEPTION_HANDLER) != 0; - } - - - /** - * Returns an InstructionOffsetValue that contains the instructions offsets - * of this value and the given instruction offset. - */ - public InstructionOffsetValue add(int value) - { - if (contains(value)) - { - return this; - } - - int[] newValues = new int[values.length+1]; - System.arraycopy(values, 0, newValues, 0, values.length); - newValues[values.length] = value; - - return new InstructionOffsetValue(newValues); - } - - - /** - * Returns an InstructionOffsetValue that contains the instructions offsets - * of this value but not the given instruction offset. - */ - public InstructionOffsetValue remove(int value) - { - for (int index = 0; index < values.length; index++) - { - if (values[index] == value) - { - int[] newValues = new int[values.length-1]; - System.arraycopy(values, 0, newValues, 0, index); - System.arraycopy(values, index+1, newValues, index, values.length-index-1); - - return new InstructionOffsetValue(newValues); - } - } - - return this; - } - - - /** - * Returns the generalization of this InstructionOffsetValue and the given - * other InstructionOffsetValue. The values of the other InstructionOffsetValue - * are guaranteed to remain at the end of the list, in the same order. - */ - public final InstructionOffsetValue generalize(InstructionOffsetValue other) - { - // If the values array of either is empty, we can return the other one. - int[] thisValues = this.values; - if (thisValues.length == 0) - { - return other; - } - - int[] otherValues = other.values; - if (otherValues.length == 0) - { - return this; - } - - // Compute the length of the union of the arrays. - int newLength = thisValues.length; - for (int index = 0; index < otherValues.length; index++) - { - if (!this.contains(otherValues[index])) - { - newLength++; - } - } - - // If the length of the union array is equal to the length of the other - // values array, we can return it. - if (newLength == otherValues.length) - { - return other; - } - - // If the length of the union array is equal to the length of this - // values array, we can return it. We have to make sure that the other - // values are at the end. We'll just test one special case, with a - // single other value. - if (newLength == this.values.length && - otherValues.length == 1 && - thisValues[thisValues.length-1] == otherValues[0]) - { - return this; - } - - // Create the union array. - int newIndex = 0; - int[] newValues = new int[newLength]; - - // Is the length of the union array is equal to the sum of the lengths? - if (newLength == thisValues.length + otherValues.length) - { - // We can just copy all values, because they are unique. - System.arraycopy(thisValues, 0, newValues, 0, thisValues.length); - - newIndex = thisValues.length; - } - else - { - // Copy the values that are different from the other array. - for (int index = 0; index < thisValues.length; index++) - { - if (!other.contains(thisValues[index])) - { - newValues[newIndex++] = thisValues[index]; - } - } - } - - // Copy the values from the other array. - System.arraycopy(otherValues, 0, newValues, newIndex, otherValues.length); - - return new InstructionOffsetValue(newValues); - } - - - // Implementations for Value. - - public final InstructionOffsetValue instructionOffsetValue() - { - return this; - } - - public boolean isSpecific() - { - return true; - } - - public boolean isParticular() - { - return true; - } - - public final Value generalize(Value other) - { - return this.generalize(other.instructionOffsetValue()); - } - - public final int computationalType() - { - return TYPE_INSTRUCTION_OFFSET; - } - - public final String internalType() - { - return String.valueOf(ClassConstants.TYPE_INT); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - InstructionOffsetValue other = (InstructionOffsetValue)object; - if (this.values == other.values) - { - return true; - } - - if (this.values == null || - other.values == null || - this.values.length != other.values.length) - { - return false; - } - - for (int index = 0; index < other.values.length; index++) - { - if (!this.contains(other.values[index])) - { - return false; - } - } - - return true; - } - - - public int hashCode() - { - int hashCode = this.getClass().hashCode(); - - if (values != null) - { - for (int index = 0; index < values.length; index++) - { - hashCode ^= values[index]; - } - } - - return hashCode; - } - - - public String toString() - { - StringBuffer buffer = new StringBuffer(); - - if (values != null) - { - for (int index = 0; index < values.length; index++) - { - if (index > 0) - { - buffer.append(','); - } - - if (values[index] < 0) - { - buffer.append(values[index]); - } - else - { - if (isMethodParameter(index)) - { - buffer.append('P'); - } - - if (isMethodReturnValue(index)) - { - buffer.append('M'); - } - - if (isFieldValue(index)) - { - buffer.append('F'); - } - - if (isNewinstance(index)) - { - buffer.append('N'); - } - - if (isCast(index)) - { - buffer.append('C'); - } - - if (isExceptionHandler(index)) - { - buffer.append('E'); - } - - buffer.append(values[index] & 0xffff); - } - } - } - - return buffer.append(':').toString(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IntegerValue.java deleted file mode 100644 index dedd5ab8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/IntegerValue.java +++ /dev/null @@ -1,1002 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.ClassConstants; - -/** - * This class represents a partially evaluated integer value. - * - * @author Eric Lafortune - */ -public abstract class IntegerValue extends Category1Value -{ - /** - * Returns the specific integer value, if applicable. - */ - public int value() - { - return 0; - } - - - // Basic unary methods. - - /** - * Returns the negated value of this IntegerValue. - */ - public abstract IntegerValue negate(); - - /** - * Converts this IntegerValue to a byte IntegerValue. - */ - public abstract IntegerValue convertToByte(); - - /** - * Converts this IntegerValue to a character IntegerValue. - */ - public abstract IntegerValue convertToCharacter(); - - /** - * Converts this IntegerValue to a short IntegerValue. - */ - public abstract IntegerValue convertToShort(); - - /** - * Converts this IntegerValue to a LongValue. - */ - public abstract LongValue convertToLong(); - - /** - * Converts this IntegerValue to a FloatValue. - */ - public abstract FloatValue convertToFloat(); - - /** - * Converts this IntegerValue to a DoubleValue. - */ - public abstract DoubleValue convertToDouble(); - - - // Basic binary methods. - - /** - * Returns the generalization of this IntegerValue and the given other - * IntegerValue. - */ - public abstract IntegerValue generalize(IntegerValue other); - - /** - * Returns the sum of this IntegerValue and the given IntegerValue. - */ - public abstract IntegerValue add(IntegerValue other); - - /** - * Returns the difference of this IntegerValue and the given IntegerValue. - */ - public abstract IntegerValue subtract(IntegerValue other); - - /** - * Returns the difference of the given IntegerValue and this IntegerValue. - */ - public abstract IntegerValue subtractFrom(IntegerValue other); - - /** - * Returns the product of this IntegerValue and the given IntegerValue. - */ - public abstract IntegerValue multiply(IntegerValue other) - throws ArithmeticException; - - /** - * Returns the quotient of this IntegerValue and the given IntegerValue. - */ - public abstract IntegerValue divide(IntegerValue other) - throws ArithmeticException; - - /** - * Returns the quotient of the given IntegerValue and this IntegerValue. - */ - public abstract IntegerValue divideOf(IntegerValue other) - throws ArithmeticException; - - /** - * Returns the remainder of this IntegerValue divided by the given - * IntegerValue. - */ - public abstract IntegerValue remainder(IntegerValue other) - throws ArithmeticException; - - /** - * Returns the remainder of the given IntegerValue divided by this - * IntegerValue. - */ - public abstract IntegerValue remainderOf(IntegerValue other) - throws ArithmeticException; - - /** - * Returns this IntegerValue, shifted left by the given IntegerValue. - */ - public abstract IntegerValue shiftLeft(IntegerValue other); - - /** - * Returns this IntegerValue, shifted right by the given IntegerValue. - */ - public abstract IntegerValue shiftRight(IntegerValue other); - - /** - * Returns this unsigned IntegerValue, shifted left by the given - * IntegerValue. - */ - public abstract IntegerValue unsignedShiftRight(IntegerValue other); - - /** - * Returns the given IntegerValue, shifted left by this IntegerValue. - */ - public abstract IntegerValue shiftLeftOf(IntegerValue other); - - /** - * Returns the given IntegerValue, shifted right by this IntegerValue. - */ - public abstract IntegerValue shiftRightOf(IntegerValue other); - - /** - * Returns the given unsigned IntegerValue, shifted left by this - * IntegerValue. - */ - public abstract IntegerValue unsignedShiftRightOf(IntegerValue other); - - /** - * Returns the given LongValue, shifted left by this IntegerValue. - */ - public abstract LongValue shiftLeftOf(LongValue other); - - /** - * Returns the given LongValue, shifted right by this IntegerValue. - */ - public abstract LongValue shiftRightOf(LongValue other); - - /** - * Returns the given unsigned LongValue, shifted right by this IntegerValue. - */ - public abstract LongValue unsignedShiftRightOf(LongValue other); - - /** - * Returns the logical and of this IntegerValue and the given - * IntegerValue. - */ - public abstract IntegerValue and(IntegerValue other); - - /** - * Returns the logical or of this IntegerValue and the given - * IntegerValue. - */ - public abstract IntegerValue or(IntegerValue other); - - /** - * Returns the logical xor of this IntegerValue and the given - * IntegerValue. - */ - public abstract IntegerValue xor(IntegerValue other); - - /** - * Returns whether this IntegerValue and the given IntegerValue are equal: - * NEVER, MAYBE, or ALWAYS. - */ - public abstract int equal(IntegerValue other); - - /** - * Returns whether this IntegerValue is less than the given IntegerValue: - * NEVER, MAYBE, or ALWAYS. - */ - public abstract int lessThan(IntegerValue other); - - /** - * Returns whether this IntegerValue is less than or equal to the given - * IntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public abstract int lessThanOrEqual(IntegerValue other); - - - // Derived binary methods. - - /** - * Returns whether this IntegerValue and the given IntegerValue are different: - * NEVER, MAYBE, or ALWAYS. - */ - public final int notEqual(IntegerValue other) - { - return -equal(other); - } - - /** - * Returns whether this IntegerValue is greater than the given IntegerValue: - * NEVER, MAYBE, or ALWAYS. - */ - public final int greaterThan(IntegerValue other) - { - return -lessThanOrEqual(other); - } - - /** - * Returns whether this IntegerValue is greater than or equal to the given IntegerValue: - * NEVER, MAYBE, or ALWAYS. - */ - public final int greaterThanOrEqual(IntegerValue other) - { - return -lessThan(other); - } - - - // Similar binary methods, but this time with unknown arguments. - - /** - * Returns the generalization of this IntegerValue and the given other - * UnknownIntegerValue. - */ - public IntegerValue generalize(UnknownIntegerValue other) - { - return generalize((IntegerValue)other); - } - - - /** - * Returns the sum of this IntegerValue and the given UnknownIntegerValue. - */ - public IntegerValue add(UnknownIntegerValue other) - { - return add((IntegerValue)other); - } - - /** - * Returns the difference of this IntegerValue and the given UnknownIntegerValue. - */ - public IntegerValue subtract(UnknownIntegerValue other) - { - return subtract((IntegerValue)other); - } - - /** - * Returns the difference of the given UnknownIntegerValue and this IntegerValue. - */ - public IntegerValue subtractFrom(UnknownIntegerValue other) - { - return subtractFrom((IntegerValue)other); - } - - /** - * Returns the product of this IntegerValue and the given UnknownIntegerValue. - */ - public IntegerValue multiply(UnknownIntegerValue other) - { - return multiply((IntegerValue)other); - } - - /** - * Returns the quotient of this IntegerValue and the given - * UnknownIntegerValue. - */ - public IntegerValue divide(UnknownIntegerValue other) - { - return divide((IntegerValue)other); - } - - /** - * Returns the quotient of the given UnknownIntegerValue and this - * IntegerValue. - */ - public IntegerValue divideOf(UnknownIntegerValue other) - { - return divideOf((IntegerValue)other); - } - - /** - * Returns the remainder of this IntegerValue divided by the given - * UnknownIntegerValue. - */ - public IntegerValue remainder(UnknownIntegerValue other) - { - return remainder((IntegerValue)other); - } - - /** - * Returns the remainder of the given UnknownIntegerValue divided by this - * IntegerValue. - */ - public IntegerValue remainderOf(UnknownIntegerValue other) - { - return remainderOf((IntegerValue)other); - } - - /** - * Returns this IntegerValue, shifted left by the given UnknownIntegerValue. - */ - public IntegerValue shiftLeft(UnknownIntegerValue other) - { - return shiftLeft((IntegerValue)other); - } - - /** - * Returns this IntegerValue, shifted right by the given UnknownIntegerValue. - */ - public IntegerValue shiftRight(UnknownIntegerValue other) - { - return shiftRight((IntegerValue)other); - } - - /** - * Returns this unsigned IntegerValue, shifted right by the given - * UnknownIntegerValue. - */ - public IntegerValue unsignedShiftRight(UnknownIntegerValue other) - { - return unsignedShiftRight((IntegerValue)other); - } - - /** - * Returns the given UnknownIntegerValue, shifted left by this IntegerValue. - */ - public IntegerValue shiftLeftOf(UnknownIntegerValue other) - { - return shiftLeftOf((IntegerValue)other); - } - - /** - * Returns the given UnknownIntegerValue, shifted right by this IntegerValue. - */ - public IntegerValue shiftRightOf(UnknownIntegerValue other) - { - return shiftRightOf((IntegerValue)other); - } - - /** - * Returns the given unsigned UnknownIntegerValue, shifted right by this - * IntegerValue. - */ - public IntegerValue unsignedShiftRightOf(UnknownIntegerValue other) - { - return unsignedShiftRightOf((IntegerValue)other); - } - - /** - * Returns the given UnknownLongValue, shifted left by this IntegerValue. - */ - public LongValue shiftLeftOf(UnknownLongValue other) - { - return shiftLeftOf((LongValue)other); - } - - /** - * Returns the given UnknownLongValue, shifted right by this IntegerValue. - */ - public LongValue shiftRightOf(UnknownLongValue other) - { - return shiftRightOf((LongValue)other); - } - - /** - * Returns the given unsigned UnknownLongValue, shifted right by this - * IntegerValue. - */ - public LongValue unsignedShiftRightOf(UnknownLongValue other) - { - return unsignedShiftRightOf((LongValue)other); - } - - /** - * Returns the logical and of this IntegerValue and the given - * UnknownIntegerValue. - */ - public IntegerValue and(UnknownIntegerValue other) - { - return and((IntegerValue)other); - } - - /** - * Returns the logical or of this IntegerValue and the given - * UnknownIntegerValue. - */ - public IntegerValue or(UnknownIntegerValue other) - { - return or((IntegerValue)other); - } - - /** - * Returns the logical xor of this IntegerValue and the given - * UnknownIntegerValue. - */ - public IntegerValue xor(UnknownIntegerValue other) - { - return xor((IntegerValue)other); - } - - /** - * Returns whether this IntegerValue and the given UnknownIntegerValue are - * equal: NEVER, MAYBE, or ALWAYS. - */ - public int equal(UnknownIntegerValue other) - { - return equal((IntegerValue)other); - } - - /** - * Returns whether this IntegerValue is less than the given - * UnknownIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public int lessThan(UnknownIntegerValue other) - { - return lessThan((IntegerValue)other); - } - - /** - * Returns whether this IntegerValue is less than or equal to the given - * UnknownIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public int lessThanOrEqual(UnknownIntegerValue other) - { - return lessThanOrEqual((IntegerValue)other); - } - - - // Derived binary methods. - - /** - * Returns whether this IntegerValue and the given UnknownIntegerValue are - * different: NEVER, MAYBE, or ALWAYS. - */ - public final int notEqual(UnknownIntegerValue other) - { - return -equal(other); - } - - /** - * Returns whether this IntegerValue is greater than the given - * UnknownIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public final int greaterThan(UnknownIntegerValue other) - { - return -lessThanOrEqual(other); - } - - /** - * Returns whether this IntegerValue is greater than or equal to the given - * UnknownIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public final int greaterThanOrEqual(UnknownIntegerValue other) - { - return -lessThan(other); - } - - - // Similar binary methods, but this time with specific arguments. - - /** - * Returns the generalization of this IntegerValue and the given other - * SpecificIntegerValue. - */ - public IntegerValue generalize(SpecificIntegerValue other) - { - return generalize((IntegerValue)other); - } - - - /** - * Returns the sum of this IntegerValue and the given SpecificIntegerValue. - */ - public IntegerValue add(SpecificIntegerValue other) - { - return add((IntegerValue)other); - } - - /** - * Returns the difference of this IntegerValue and the given SpecificIntegerValue. - */ - public IntegerValue subtract(SpecificIntegerValue other) - { - return subtract((IntegerValue)other); - } - - /** - * Returns the difference of the given SpecificIntegerValue and this IntegerValue. - */ - public IntegerValue subtractFrom(SpecificIntegerValue other) - { - return subtractFrom((IntegerValue)other); - } - - /** - * Returns the product of this IntegerValue and the given SpecificIntegerValue. - */ - public IntegerValue multiply(SpecificIntegerValue other) - { - return multiply((IntegerValue)other); - } - - /** - * Returns the quotient of this IntegerValue and the given - * SpecificIntegerValue. - */ - public IntegerValue divide(SpecificIntegerValue other) - { - return divide((IntegerValue)other); - } - - /** - * Returns the quotient of the given SpecificIntegerValue and this - * IntegerValue. - */ - public IntegerValue divideOf(SpecificIntegerValue other) - { - return divideOf((IntegerValue)other); - } - - /** - * Returns the remainder of this IntegerValue divided by the given - * SpecificIntegerValue. - */ - public IntegerValue remainder(SpecificIntegerValue other) - { - return remainder((IntegerValue)other); - } - - /** - * Returns the remainder of the given SpecificIntegerValue divided by this - * IntegerValue. - */ - public IntegerValue remainderOf(SpecificIntegerValue other) - { - return remainderOf((IntegerValue)other); - } - - /** - * Returns this IntegerValue, shifted left by the given SpecificIntegerValue. - */ - public IntegerValue shiftLeft(SpecificIntegerValue other) - { - return shiftLeft((IntegerValue)other); - } - - /** - * Returns this IntegerValue, shifted right by the given SpecificIntegerValue. - */ - public IntegerValue shiftRight(SpecificIntegerValue other) - { - return shiftRight((IntegerValue)other); - } - - /** - * Returns this unsigned IntegerValue, shifted right by the given - * SpecificIntegerValue. - */ - public IntegerValue unsignedShiftRight(SpecificIntegerValue other) - { - return unsignedShiftRight((IntegerValue)other); - } - - /** - * Returns the given SpecificIntegerValue, shifted left by this IntegerValue. - */ - public IntegerValue shiftLeftOf(SpecificIntegerValue other) - { - return shiftLeftOf((IntegerValue)other); - } - - /** - * Returns the given SpecificIntegerValue, shifted right by this IntegerValue. - */ - public IntegerValue shiftRightOf(SpecificIntegerValue other) - { - return shiftRightOf((IntegerValue)other); - } - - /** - * Returns the given unsigned SpecificIntegerValue, shifted right by this - * IntegerValue. - */ - public IntegerValue unsignedShiftRightOf(SpecificIntegerValue other) - { - return unsignedShiftRightOf((IntegerValue)other); - } - - /** - * Returns the given SpecificLongValue, shifted left by this IntegerValue. - */ - public LongValue shiftLeftOf(SpecificLongValue other) - { - return shiftLeftOf((LongValue)other); - } - - /** - * Returns the given SpecificLongValue, shifted right by this IntegerValue. - */ - public LongValue shiftRightOf(SpecificLongValue other) - { - return shiftRightOf((LongValue)other); - } - - /** - * Returns the given unsigned SpecificLongValue, shifted right by this - * IntegerValue. - */ - public LongValue unsignedShiftRightOf(SpecificLongValue other) - { - return unsignedShiftRightOf((LongValue)other); - } - - /** - * Returns the logical and of this IntegerValue and the given - * SpecificIntegerValue. - */ - public IntegerValue and(SpecificIntegerValue other) - { - return and((IntegerValue)other); - } - - /** - * Returns the logical or of this IntegerValue and the given - * SpecificIntegerValue. - */ - public IntegerValue or(SpecificIntegerValue other) - { - return or((IntegerValue)other); - } - - /** - * Returns the logical xor of this IntegerValue and the given - * SpecificIntegerValue. - */ - public IntegerValue xor(SpecificIntegerValue other) - { - return xor((IntegerValue)other); - } - - /** - * Returns whether this IntegerValue and the given SpecificIntegerValue are - * equal: NEVER, MAYBE, or ALWAYS. - */ - public int equal(SpecificIntegerValue other) - { - return equal((IntegerValue)other); - } - - /** - * Returns whether this IntegerValue is less than the given - * SpecificIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public int lessThan(SpecificIntegerValue other) - { - return lessThan((IntegerValue)other); - } - - /** - * Returns whether this IntegerValue is less than or equal to the given - * SpecificIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public int lessThanOrEqual(SpecificIntegerValue other) - { - return lessThanOrEqual((IntegerValue)other); - } - - - // Derived binary methods. - - /** - * Returns whether this IntegerValue and the given SpecificIntegerValue are - * different: NEVER, MAYBE, or ALWAYS. - */ - public final int notEqual(SpecificIntegerValue other) - { - return -equal(other); - } - - /** - * Returns whether this IntegerValue is greater than the given - * SpecificIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public final int greaterThan(SpecificIntegerValue other) - { - return -lessThanOrEqual(other); - } - - /** - * Returns whether this IntegerValue is greater than or equal to the given - * SpecificIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public final int greaterThanOrEqual(SpecificIntegerValue other) - { - return -lessThan(other); - } - - - // Similar binary methods, but this time with particular arguments. - - /** - * Returns the generalization of this IntegerValue and the given other - * ParticularIntegerValue. - */ - public IntegerValue generalize(ParticularIntegerValue other) - { - return generalize((SpecificIntegerValue)other); - } - - - /** - * Returns the sum of this IntegerValue and the given ParticularIntegerValue. - */ - public IntegerValue add(ParticularIntegerValue other) - { - return add((SpecificIntegerValue)other); - } - - /** - * Returns the difference of this IntegerValue and the given ParticularIntegerValue. - */ - public IntegerValue subtract(ParticularIntegerValue other) - { - return subtract((SpecificIntegerValue)other); - } - - /** - * Returns the difference of the given ParticularIntegerValue and this IntegerValue. - */ - public IntegerValue subtractFrom(ParticularIntegerValue other) - { - return subtractFrom((SpecificIntegerValue)other); - } - - /** - * Returns the product of this IntegerValue and the given ParticularIntegerValue. - */ - public IntegerValue multiply(ParticularIntegerValue other) - { - return multiply((SpecificIntegerValue)other); - } - - /** - * Returns the quotient of this IntegerValue and the given - * ParticularIntegerValue. - */ - public IntegerValue divide(ParticularIntegerValue other) - { - return divide((SpecificIntegerValue)other); - } - - /** - * Returns the quotient of the given ParticularIntegerValue and this - * IntegerValue. - */ - public IntegerValue divideOf(ParticularIntegerValue other) - { - return divideOf((SpecificIntegerValue)other); - } - - /** - * Returns the remainder of this IntegerValue divided by the given - * ParticularIntegerValue. - */ - public IntegerValue remainder(ParticularIntegerValue other) - { - return remainder((SpecificIntegerValue)other); - } - - /** - * Returns the remainder of the given ParticularIntegerValue divided by this - * IntegerValue. - */ - public IntegerValue remainderOf(ParticularIntegerValue other) - { - return remainderOf((SpecificIntegerValue)other); - } - - /** - * Returns this IntegerValue, shifted left by the given ParticularIntegerValue. - */ - public IntegerValue shiftLeft(ParticularIntegerValue other) - { - return shiftLeft((SpecificIntegerValue)other); - } - - /** - * Returns this IntegerValue, shifted right by the given ParticularIntegerValue. - */ - public IntegerValue shiftRight(ParticularIntegerValue other) - { - return shiftRight((SpecificIntegerValue)other); - } - - /** - * Returns this unsigned IntegerValue, shifted right by the given - * ParticularIntegerValue. - */ - public IntegerValue unsignedShiftRight(ParticularIntegerValue other) - { - return unsignedShiftRight((SpecificIntegerValue)other); - } - - /** - * Returns the given ParticularIntegerValue, shifted left by this IntegerValue. - */ - public IntegerValue shiftLeftOf(ParticularIntegerValue other) - { - return shiftLeftOf((SpecificIntegerValue)other); - } - - /** - * Returns the given ParticularIntegerValue, shifted right by this IntegerValue. - */ - public IntegerValue shiftRightOf(ParticularIntegerValue other) - { - return shiftRightOf((SpecificIntegerValue)other); - } - - /** - * Returns the given unsigned ParticularIntegerValue, shifted right by this - * IntegerValue. - */ - public IntegerValue unsignedShiftRightOf(ParticularIntegerValue other) - { - return unsignedShiftRightOf((SpecificIntegerValue)other); - } - - /** - * Returns the given ParticularLongValue, shifted left by this IntegerValue. - */ - public LongValue shiftLeftOf(ParticularLongValue other) - { - return shiftLeftOf((SpecificLongValue)other); - } - - /** - * Returns the given ParticularLongValue, shifted right by this IntegerValue. - */ - public LongValue shiftRightOf(ParticularLongValue other) - { - return shiftRightOf((SpecificLongValue)other); - } - - /** - * Returns the given unsigned ParticularLongValue, shifted right by this - * IntegerValue. - */ - public LongValue unsignedShiftRightOf(ParticularLongValue other) - { - return unsignedShiftRightOf((SpecificLongValue)other); - } - - /** - * Returns the logical and of this IntegerValue and the given - * ParticularIntegerValue. - */ - public IntegerValue and(ParticularIntegerValue other) - { - return and((SpecificIntegerValue)other); - } - - /** - * Returns the logical or of this IntegerValue and the given - * ParticularIntegerValue. - */ - public IntegerValue or(ParticularIntegerValue other) - { - return or((SpecificIntegerValue)other); - } - - /** - * Returns the logical xor of this IntegerValue and the given - * ParticularIntegerValue. - */ - public IntegerValue xor(ParticularIntegerValue other) - { - return xor((SpecificIntegerValue)other); - } - - /** - * Returns whether this IntegerValue and the given ParticularIntegerValue are - * equal: NEVER, MAYBE, or ALWAYS. - */ - public int equal(ParticularIntegerValue other) - { - return equal((SpecificIntegerValue)other); - } - - /** - * Returns whether this IntegerValue is less than the given - * ParticularIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public int lessThan(ParticularIntegerValue other) - { - return lessThan((SpecificIntegerValue)other); - } - - /** - * Returns whether this IntegerValue is less than or equal to the given - * ParticularIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public int lessThanOrEqual(ParticularIntegerValue other) - { - return lessThanOrEqual((SpecificIntegerValue)other); - } - - - // Derived binary methods. - - /** - * Returns whether this IntegerValue and the given ParticularIntegerValue are - * different: NEVER, MAYBE, or ALWAYS. - */ - public final int notEqual(ParticularIntegerValue other) - { - return -equal(other); - } - - /** - * Returns whether this IntegerValue is greater than the given - * ParticularIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public final int greaterThan(ParticularIntegerValue other) - { - return -lessThanOrEqual(other); - } - - /** - * Returns whether this IntegerValue is greater than or equal to the given - * ParticularIntegerValue: NEVER, MAYBE, or - * ALWAYS. - */ - public final int greaterThanOrEqual(ParticularIntegerValue other) - { - return -lessThan(other); - } - - - // Implementations for Value. - - public final IntegerValue integerValue() - { - return this; - } - - public final Value generalize(Value other) - { - return this.generalize(other.integerValue()); - } - - public final int computationalType() - { - return TYPE_INTEGER; - } - - public final String internalType() - { - return String.valueOf(ClassConstants.TYPE_INT); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/LongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/LongValue.java deleted file mode 100644 index fd0f4065..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/LongValue.java +++ /dev/null @@ -1,554 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.ClassConstants; - -/** - * This class represents a partially evaluated long value. - * - * @author Eric Lafortune - */ -public abstract class LongValue extends Category2Value -{ - /** - * Returns the specific long value, if applicable. - */ - public long value() - { - return 0; - } - - - // Basic unary methods. - - /** - * Returns the negated value of this LongValue. - */ - public abstract LongValue negate(); - - - /** - * Converts this LongValue to an IntegerValue. - */ - public abstract IntegerValue convertToInteger(); - - /** - * Converts this LongValue to a FloatValue. - */ - public abstract FloatValue convertToFloat(); - - /** - * Converts this LongValue to a DoubleValue. - */ - public abstract DoubleValue convertToDouble(); - - - // Basic binary methods. - - /** - * Returns the generalization of this LongValue and the given other - * LongValue. - */ - public LongValue generalize(LongValue other) - { - return other.generalize(this); - } - - /** - * Returns the sum of this LongValue and the given LongValue. - */ - public LongValue add(LongValue other) - { - return other.add(this); - } - - /** - * Returns the difference of this LongValue and the given LongValue. - */ - public LongValue subtract(LongValue other) - { - return other.subtractFrom(this); - } - - /** - * Returns the difference of the given LongValue and this LongValue. - */ - public LongValue subtractFrom(LongValue other) - { - return other.subtract(this); - } - - /** - * Returns the product of this LongValue and the given LongValue. - */ - public LongValue multiply(LongValue other) - throws ArithmeticException - { - return other.multiply(this); - } - - /** - * Returns the quotient of this LongValue and the given LongValue. - */ - public LongValue divide(LongValue other) - throws ArithmeticException - { - return other.divideOf(this); - } - - /** - * Returns the quotient of the given LongValue and this LongValue. - */ - public LongValue divideOf(LongValue other) - throws ArithmeticException - { - return other.divide(this); - } - - /** - * Returns the remainder of this LongValue divided by the given - * LongValue. - */ - public LongValue remainder(LongValue other) - throws ArithmeticException - { - return other.remainderOf(this); - } - - /** - * Returns the remainder of the given LongValue divided by this - * LongValue. - */ - public LongValue remainderOf(LongValue other) - throws ArithmeticException - { - return other.remainder(this); - } - - /** - * Returns this LongValue, shifted left by the given IntegerValue. - */ - public LongValue shiftLeft(IntegerValue other) - { - return other.shiftLeftOf(this); - } - - /** - * Returns this LongValue, shifted right by the given IntegerValue. - */ - public LongValue shiftRight(IntegerValue other) - { - return other.shiftRightOf(this); - } - - /** - * Returns this unsigned LongValue, shifted left by the given - * IntegerValue. - */ - public LongValue unsignedShiftRight(IntegerValue other) - { - return other.unsignedShiftRightOf(this); - } - - /** - * Returns the logical and of this LongValue and the given - * LongValue. - */ - public LongValue and(LongValue other) - { - return other.and(this); - } - - /** - * Returns the logical or of this LongValue and the given - * LongValue. - */ - public LongValue or(LongValue other) - { - return other.or(this); - } - - /** - * Returns the logical xor of this LongValue and the given - * LongValue. - */ - public LongValue xor(LongValue other) - { - return other.xor(this); - } - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this LongValue is - * less than, equal to, or greater than the given LongValue, respectively. - */ - public IntegerValue compare(LongValue other) - { - return other.compareReverse(this); - } - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this LongValue is - * less than, equal to, or greater than the given LongValue, respectively. - */ - public final IntegerValue compareReverse(LongValue other) - { - return compare(other).negate(); - } - - - // Similar binary methods, but this time with more specific arguments. - - /** - * Returns the generalization of this LongValue and the given other - * SpecificLongValue. - */ - public LongValue generalize(SpecificLongValue other) - { - return this; - } - - - /** - * Returns the sum of this LongValue and the given SpecificLongValue. - */ - public LongValue add(SpecificLongValue other) - { - return this; - } - - /** - * Returns the difference of this LongValue and the given SpecificLongValue. - */ - public LongValue subtract(SpecificLongValue other) - { - return this; - } - - /** - * Returns the difference of the given SpecificLongValue and this LongValue. - */ - public LongValue subtractFrom(SpecificLongValue other) - { - return this; - } - - /** - * Returns the product of this LongValue and the given SpecificLongValue. - */ - public LongValue multiply(SpecificLongValue other) - { - return this; - } - - /** - * Returns the quotient of this LongValue and the given - * SpecificLongValue. - */ - public LongValue divide(SpecificLongValue other) - { - return this; - } - - /** - * Returns the quotient of the given SpecificLongValue and this - * LongValue. - */ - public LongValue divideOf(SpecificLongValue other) - { - return this; - } - - /** - * Returns the remainder of this LongValue divided by the given - * SpecificLongValue. - */ - public LongValue remainder(SpecificLongValue other) - { - return this; - } - - /** - * Returns the remainder of the given SpecificLongValue divided by this - * LongValue. - */ - public LongValue remainderOf(SpecificLongValue other) - { - return this; - } - - /** - * Returns this LongValue, shifted left by the given SpecificLongValue. - */ - public LongValue shiftLeft(SpecificLongValue other) - { - return this; - } - - /** - * Returns this LongValue, shifted right by the given SpecificLongValue. - */ - public LongValue shiftRight(SpecificLongValue other) - { - return this; - } - - /** - * Returns this unsigned LongValue, shifted right by the given - * SpecificLongValue. - */ - public LongValue unsignedShiftRight(SpecificLongValue other) - { - return this; - } - - /** - * Returns the logical and of this LongValue and the given - * SpecificLongValue. - */ - public LongValue and(SpecificLongValue other) - { - return this; - } - - /** - * Returns the logical or of this LongValue and the given - * SpecificLongValue. - */ - public LongValue or(SpecificLongValue other) - { - return this; - } - - /** - * Returns the logical xor of this LongValue and the given - * SpecificLongValue. - */ - public LongValue xor(SpecificLongValue other) - { - return this; - } - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this LongValue is - * less than, equal to, or greater than the given SpecificLongValue, - * respectively. - */ - public IntegerValue compare(SpecificLongValue other) - { - return new ComparisonValue(this, other); - } - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this LongValue is - * less than, equal to, or greater than the given SpecificLongValue, - * respectively. - */ - public final IntegerValue compareReverse(SpecificLongValue other) - { - return compare(other).negate(); - } - - - // Similar binary methods, but this time with particular arguments. - - /** - * Returns the generalization of this LongValue and the given other - * ParticularLongValue. - */ - public LongValue generalize(ParticularLongValue other) - { - return generalize((SpecificLongValue)other); - } - - - /** - * Returns the sum of this LongValue and the given ParticularLongValue. - */ - public LongValue add(ParticularLongValue other) - { - return add((SpecificLongValue)other); - } - - /** - * Returns the difference of this LongValue and the given ParticularLongValue. - */ - public LongValue subtract(ParticularLongValue other) - { - return subtract((SpecificLongValue)other); - } - - /** - * Returns the difference of the given ParticularLongValue and this LongValue. - */ - public LongValue subtractFrom(ParticularLongValue other) - { - return subtractFrom((SpecificLongValue)other); - } - - /** - * Returns the product of this LongValue and the given ParticularLongValue. - */ - public LongValue multiply(ParticularLongValue other) - { - return multiply((SpecificLongValue)other); - } - - /** - * Returns the quotient of this LongValue and the given - * ParticularLongValue. - */ - public LongValue divide(ParticularLongValue other) - { - return divide((SpecificLongValue)other); - } - - /** - * Returns the quotient of the given ParticularLongValue and this - * LongValue. - */ - public LongValue divideOf(ParticularLongValue other) - { - return divideOf((SpecificLongValue)other); - } - - /** - * Returns the remainder of this LongValue divided by the given - * ParticularLongValue. - */ - public LongValue remainder(ParticularLongValue other) - { - return remainder((SpecificLongValue)other); - } - - /** - * Returns the remainder of the given ParticularLongValue divided by this - * LongValue. - */ - public LongValue remainderOf(ParticularLongValue other) - { - return remainderOf((SpecificLongValue)other); - } - - /** - * Returns this LongValue, shifted left by the given ParticularIntegerValue. - */ - public LongValue shiftLeft(ParticularIntegerValue other) - { - return shiftLeft((SpecificIntegerValue)other); - } - - /** - * Returns this LongValue, shifted right by the given ParticularIntegerValue. - */ - public LongValue shiftRight(ParticularIntegerValue other) - { - return shiftRight((SpecificIntegerValue)other); - } - - /** - * Returns this unsigned LongValue, shifted right by the given - * ParticularIntegerValue. - */ - public LongValue unsignedShiftRight(ParticularIntegerValue other) - { - return unsignedShiftRight((SpecificIntegerValue)other); - } - - /** - * Returns the logical and of this LongValue and the given - * ParticularLongValue. - */ - public LongValue and(ParticularLongValue other) - { - return and((SpecificLongValue)other); - } - - /** - * Returns the logical or of this LongValue and the given - * ParticularLongValue. - */ - public LongValue or(ParticularLongValue other) - { - return or((SpecificLongValue)other); - } - - /** - * Returns the logical xor of this LongValue and the given - * ParticularLongValue. - */ - public LongValue xor(ParticularLongValue other) - { - return xor((SpecificLongValue)other); - } - - /** - * Returns an IntegerValue with value -1, 0, or 1, if this LongValue is - * less than, equal to, or greater than the given ParticularLongValue, - * respectively. - */ - public IntegerValue compare(ParticularLongValue other) - { - return compare((SpecificLongValue)other); - } - - - // Derived binary methods. - - /** - * Returns an IntegerValue with value 1, 0, or -1, if this LongValue is - * less than, equal to, or greater than the given ParticularLongValue, - * respectively. - */ - public final IntegerValue compareReverse(ParticularLongValue other) - { - return compare(other).negate(); - } - - - // Implementations for Value. - - public final LongValue longValue() - { - return this; - } - - public final Value generalize(Value other) - { - return this.generalize(other.longValue()); - } - - public final int computationalType() - { - return TYPE_LONG; - } - - public final String internalType() - { - return String.valueOf(ClassConstants.TYPE_INT); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedDoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedDoubleValue.java deleted file mode 100644 index 6b27dc22..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedDoubleValue.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This DoubleValue represents a double value that is negated. - * - * @author Eric Lafortune - */ -final class NegatedDoubleValue extends SpecificDoubleValue -{ - private final DoubleValue doubleValue; - - - /** - * Creates a new negated double value of the given double value. - */ - public NegatedDoubleValue(DoubleValue doubleValue) - { - this.doubleValue = doubleValue; - } - - - // Implementations of unary methods of DoubleValue. - - public DoubleValue negate() - { - return doubleValue; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.doubleValue.equals(((NegatedDoubleValue)object).doubleValue); - } - - - public int hashCode() - { - return super.hashCode() ^ - doubleValue.hashCode(); - } - - - public String toString() - { - return "-"+doubleValue; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedFloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedFloatValue.java deleted file mode 100644 index 68007e43..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedFloatValue.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This FloatValue represents a float value that is negated. - * - * @author Eric Lafortune - */ -final class NegatedFloatValue extends SpecificFloatValue -{ - private final FloatValue floatValue; - - - /** - * Creates a new negated float value of the given float value. - */ - public NegatedFloatValue(FloatValue floatValue) - { - this.floatValue = floatValue; - } - - - // Implementations of unary methods of FloatValue. - - public FloatValue negate() - { - return floatValue; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.floatValue.equals(((NegatedFloatValue)object).floatValue); - } - - - public int hashCode() - { - return super.hashCode() ^ - floatValue.hashCode(); - } - - - public String toString() - { - return "-"+floatValue; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedIntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedIntegerValue.java deleted file mode 100644 index a16da1f4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedIntegerValue.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a integer value that is negated. - * - * @author Eric Lafortune - */ -final class NegatedIntegerValue extends SpecificIntegerValue -{ - private final IntegerValue integerValue; - - - /** - * Creates a new negated integer value of the given integer value. - */ - public NegatedIntegerValue(IntegerValue integerValue) - { - this.integerValue = integerValue; - } - - - // Implementations of unary methods of IntegerValue. - - public IntegerValue negate() - { - return integerValue; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.integerValue.equals(((NegatedIntegerValue)object).integerValue); - } - - - public int hashCode() - { - return super.hashCode() ^ - integerValue.hashCode(); - } - - - public String toString() - { - return "-"+integerValue; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedLongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedLongValue.java deleted file mode 100644 index 0ab6384b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/NegatedLongValue.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This LongValue represents a long value that is negated. - * - * @author Eric Lafortune - */ -final class NegatedLongValue extends SpecificLongValue -{ - private final LongValue longValue; - - - /** - * Creates a new negated long value of the given long value. - */ - public NegatedLongValue(LongValue longValue) - { - this.longValue = longValue; - } - - - // Implementations of unary methods of LongValue. - - public LongValue negate() - { - return longValue; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return this == object || - super.equals(object) && - this.longValue.equals(((NegatedLongValue)object).longValue); - } - - - public int hashCode() - { - return super.hashCode() ^ - longValue.hashCode(); - } - - - public String toString() - { - return "-"+longValue; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularDoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularDoubleValue.java deleted file mode 100644 index afe2ea98..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularDoubleValue.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This DoubleValue represents a particular double value. - * - * @author Eric Lafortune - */ -final class ParticularDoubleValue extends SpecificDoubleValue -{ - private final double value; - - - /** - * Creates a new particular double value. - */ - public ParticularDoubleValue(double value) - { - this.value = value; - } - - - // Implementations for DoubleValue. - - public double value() - { - return value; - } - - - // Implementations of unary methods of DoubleValue. - - public DoubleValue negate() - { - return new ParticularDoubleValue(-value); - } - - public IntegerValue convertToInteger() - { - return new ParticularIntegerValue((int)value); - } - - public LongValue convertToLong() - { - return new ParticularLongValue((long)value); - } - - public FloatValue convertToFloat() - { - return new ParticularFloatValue((float)value); - } - - - // Implementations of binary methods of DoubleValue. - - public DoubleValue generalize(DoubleValue other) - { - return other.generalize(this); - } - - public DoubleValue add(DoubleValue other) - { - // Careful: -0.0 + 0.0 == 0.0 - //return value == 0.0 ? other : other.add(this); - return other.add(this); - } - - public DoubleValue subtract(DoubleValue other) - { - // Careful: -0.0 + 0.0 == 0.0 - //return value == 0.0 ? other.negate() : other.subtractFrom(this); - return other.subtractFrom(this); - } - - public DoubleValue subtractFrom(DoubleValue other) - { - // Careful: -0.0 + 0.0 == 0.0 - //return value == 0.0 ? other : other.subtract(this); - return other.subtract(this); - } - - public DoubleValue multiply(DoubleValue other) - { - return other.multiply(this); - } - - public DoubleValue divide(DoubleValue other) - { - return other.divideOf(this); - } - - public DoubleValue divideOf(DoubleValue other) - { - return other.divide(this); - } - - public DoubleValue remainder(DoubleValue other) - { - return other.remainderOf(this); - } - - public DoubleValue remainderOf(DoubleValue other) - { - return other.remainder(this); - } - - public IntegerValue compare(DoubleValue other) - { - return other.compareReverse(this); - } - - - // Implementations of binary DoubleValue methods with ParticularDoubleValue - // arguments. - - public DoubleValue generalize(ParticularDoubleValue other) - { - // Also handle NaN and Infinity. - return Double.doubleToRawLongBits(this.value) == - Double.doubleToRawLongBits(other.value) ? - this : BasicValueFactory.DOUBLE_VALUE; - } - - public DoubleValue add(ParticularDoubleValue other) - { - return new ParticularDoubleValue(this.value + other.value); - } - - public DoubleValue subtract(ParticularDoubleValue other) - { - return new ParticularDoubleValue(this.value - other.value); - } - - public DoubleValue subtractFrom(ParticularDoubleValue other) - { - return new ParticularDoubleValue(other.value - this.value); - } - - public DoubleValue multiply(ParticularDoubleValue other) - { - return new ParticularDoubleValue(this.value * other.value); - } - - public DoubleValue divide(ParticularDoubleValue other) - { - return new ParticularDoubleValue(this.value / other.value); - } - - public DoubleValue divideOf(ParticularDoubleValue other) - { - return new ParticularDoubleValue(other.value / this.value); - } - - public DoubleValue remainder(ParticularDoubleValue other) - { - return new ParticularDoubleValue(this.value % other.value); - } - - public DoubleValue remainderOf(ParticularDoubleValue other) - { - return new ParticularDoubleValue(other.value % this.value); - } - - public IntegerValue compare(ParticularDoubleValue other) - { - return this.value < other.value ? ParticularValueFactory.INTEGER_VALUE_M1 : - this.value == other.value ? ParticularValueFactory.INTEGER_VALUE_0 : - ParticularValueFactory.INTEGER_VALUE_1; - } - - - // Implementations for Value. - - public boolean isParticular() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - // Also handle NaN and Infinity. - return super.equals(object) && - Double.doubleToLongBits(this.value) == - Double.doubleToLongBits(((ParticularDoubleValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - (int)Double.doubleToLongBits(value); - } - - - public String toString() - { - return value+"d"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularFloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularFloatValue.java deleted file mode 100644 index 895c560d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularFloatValue.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This FloatValue represents a particular float value. - * - * @author Eric Lafortune - */ -final class ParticularFloatValue extends SpecificFloatValue -{ - private final float value; - - - /** - * Creates a new particular float value. - */ - public ParticularFloatValue(float value) - { - this.value = value; - } - - - // Implementations for FloatValue. - - public float value() - { - return value; - } - - - // Implementations of unary methods of FloatValue. - - public FloatValue negate() - { - return new ParticularFloatValue(-value); - } - - public IntegerValue convertToInteger() - { - return new ParticularIntegerValue((int)value); - } - - public LongValue convertToLong() - { - return new ParticularLongValue((long)value); - } - - public DoubleValue convertToDouble() - { - return new ParticularDoubleValue((float)value); - } - - - // Implementations of binary methods of FloatValue. - - public FloatValue generalize(FloatValue other) - { - return other.generalize(this); - } - - public FloatValue add(FloatValue other) - { - // Careful: -0.0 + 0.0 == 0.0 - //return value == 0.0 ? other : other.add(this); - return other.add(this); - } - - public FloatValue subtract(FloatValue other) - { - // Careful: -0.0 + 0.0 == 0.0 - //return value == 0.0 ? other.negate() : other.subtractFrom(this); - return other.subtractFrom(this); - } - - public FloatValue subtractFrom(FloatValue other) - { - // Careful: -0.0 + 0.0 == 0.0 - //return value == 0.0 ? other : other.subtract(this); - return other.subtract(this); - } - - public FloatValue multiply(FloatValue other) - { - return other.multiply(this); - } - - public FloatValue divide(FloatValue other) - { - return other.divideOf(this); - } - - public FloatValue divideOf(FloatValue other) - { - return other.divide(this); - } - - public FloatValue remainder(FloatValue other) - { - return other.remainderOf(this); - } - - public FloatValue remainderOf(FloatValue other) - { - return other.remainder(this); - } - - public IntegerValue compare(FloatValue other) - { - return other.compareReverse(this); - } - - - // Implementations of binary FloatValue methods with ParticularFloatValue - // arguments. - - public FloatValue generalize(ParticularFloatValue other) - { - // Also handle NaN and Infinity. - return Float.floatToRawIntBits(this.value) == - Float.floatToRawIntBits(other.value) ? - this : BasicValueFactory.FLOAT_VALUE; - } - - public FloatValue add(ParticularFloatValue other) - { - return new ParticularFloatValue(this.value + other.value); - } - - public FloatValue subtract(ParticularFloatValue other) - { - return new ParticularFloatValue(this.value - other.value); - } - - public FloatValue subtractFrom(ParticularFloatValue other) - { - return new ParticularFloatValue(other.value - this.value); - } - - public FloatValue multiply(ParticularFloatValue other) - { - return new ParticularFloatValue(this.value * other.value); - } - - public FloatValue divide(ParticularFloatValue other) - { - return new ParticularFloatValue(this.value / other.value); - } - - public FloatValue divideOf(ParticularFloatValue other) - { - return new ParticularFloatValue(other.value / this.value); - } - - public FloatValue remainder(ParticularFloatValue other) - { - return new ParticularFloatValue(this.value % other.value); - } - - public FloatValue remainderOf(ParticularFloatValue other) - { - return new ParticularFloatValue(other.value % this.value); - } - - public IntegerValue compare(ParticularFloatValue other) - { - return this.value < other.value ? ParticularValueFactory.INTEGER_VALUE_M1 : - this.value == other.value ? ParticularValueFactory.INTEGER_VALUE_0 : - ParticularValueFactory.INTEGER_VALUE_1; - } - - - // Implementations for Value. - - public boolean isParticular() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - // Also handle NaN and Infinity. - return super.equals(object) && - Float.floatToIntBits(this.value) == - Float.floatToIntBits(((ParticularFloatValue)object).value); - } - - - public int hashCode() - { - return super.hashCode() ^ - Float.floatToIntBits(value); - } - - - public String toString() - { - return value+"f"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularIntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularIntegerValue.java deleted file mode 100644 index 16f7e2e0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularIntegerValue.java +++ /dev/null @@ -1,383 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a particular integer value. - * - * @author Eric Lafortune - */ -final class ParticularIntegerValue extends SpecificIntegerValue -{ - private final int value; - - - /** - * Creates a new particular integer value. - */ - public ParticularIntegerValue(int value) - { - this.value = value; - } - - - // Implementations for IntegerValue. - - public int value() - { - return value; - } - - - // Implementations of unary methods of IntegerValue. - - public IntegerValue negate() - { - return new ParticularIntegerValue(-value); - } - - public IntegerValue convertToByte() - { - int byteValue = (byte)value; - - return byteValue == value ? - this : - new ParticularIntegerValue(byteValue); - } - - public IntegerValue convertToCharacter() - { - int charValue = (char)value; - - return charValue == value ? - this : - new ParticularIntegerValue(charValue); - } - - public IntegerValue convertToShort() - { - int shortValue = (short)value; - - return shortValue == value ? - this : - new ParticularIntegerValue(shortValue); - } - - public LongValue convertToLong() - { - return new ParticularLongValue((long)value); - } - - public FloatValue convertToFloat() - { - return new ParticularFloatValue((float)value); - } - - public DoubleValue convertToDouble() - { - return new ParticularDoubleValue((double)value); - } - - - // Implementations of binary methods of IntegerValue. - - public IntegerValue generalize(IntegerValue other) - { - return other.generalize(this); - } - - public IntegerValue add(IntegerValue other) - { - return other.add(this); - } - - public IntegerValue subtract(IntegerValue other) - { - return other.subtractFrom(this); - } - - public IntegerValue subtractFrom(IntegerValue other) - { - return other.subtract(this); - } - - public IntegerValue multiply(IntegerValue other) - { - return other.multiply(this); - } - - public IntegerValue divide(IntegerValue other) - throws ArithmeticException - { - return other.divideOf(this); - } - - public IntegerValue divideOf(IntegerValue other) - throws ArithmeticException - { - return other.divide(this); - } - - public IntegerValue remainder(IntegerValue other) - throws ArithmeticException - { - return other.remainderOf(this); - } - - public IntegerValue remainderOf(IntegerValue other) - throws ArithmeticException - { - return other.remainder(this); - } - - public IntegerValue shiftLeft(IntegerValue other) - { - return other.shiftLeftOf(this); - } - - public IntegerValue shiftLeftOf(IntegerValue other) - { - return other.shiftLeft(this); - } - - public IntegerValue shiftRight(IntegerValue other) - { - return other.shiftRightOf(this); - } - - public IntegerValue shiftRightOf(IntegerValue other) - { - return other.shiftRight(this); - } - - public IntegerValue unsignedShiftRight(IntegerValue other) - { - return other.unsignedShiftRightOf(this); - } - - public IntegerValue unsignedShiftRightOf(IntegerValue other) - { - return other.unsignedShiftRight(this); - } - - public LongValue shiftLeftOf(LongValue other) - { - return other.shiftLeft(this); - } - - public LongValue shiftRightOf(LongValue other) - { - return other.shiftRight(this); - } - - public LongValue unsignedShiftRightOf(LongValue other) - { - return other.unsignedShiftRight(this); - } - - public IntegerValue and(IntegerValue other) - { - return other.and(this); - } - - public IntegerValue or(IntegerValue other) - { - return other.or(this); - } - - public IntegerValue xor(IntegerValue other) - { - return other.xor(this); - } - - public int equal(IntegerValue other) - { - return other.equal(this); - } - - public int lessThan(IntegerValue other) - { - return other.greaterThan(this); - } - - public int lessThanOrEqual(IntegerValue other) - { - return other.greaterThanOrEqual(this); - } - - - // Implementations of binary IntegerValue methods with ParticularIntegerValue - // arguments. - - public IntegerValue generalize(ParticularIntegerValue other) - { - return generalize((SpecificIntegerValue)other); - } - - public IntegerValue add(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value + other.value); - } - - public IntegerValue subtract(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value - other.value); - } - - public IntegerValue subtractFrom(ParticularIntegerValue other) - { - return new ParticularIntegerValue(other.value - this.value); - } - - public IntegerValue multiply(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value * other.value); - } - - public IntegerValue divide(ParticularIntegerValue other) - throws ArithmeticException - { - return new ParticularIntegerValue(this.value / other.value); - } - - public IntegerValue divideOf(ParticularIntegerValue other) - throws ArithmeticException - { - return new ParticularIntegerValue(other.value / this.value); - } - - public IntegerValue remainder(ParticularIntegerValue other) - throws ArithmeticException - { - return new ParticularIntegerValue(this.value % other.value); - } - - public IntegerValue remainderOf(ParticularIntegerValue other) - throws ArithmeticException - { - return new ParticularIntegerValue(other.value % this.value); - } - - public IntegerValue shiftLeft(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value << other.value); - } - - public IntegerValue shiftRight(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value >> other.value); - } - - public IntegerValue unsignedShiftRight(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value >>> other.value); - } - - public IntegerValue shiftLeftOf(ParticularIntegerValue other) - { - return new ParticularIntegerValue(other.value << this.value); - } - - public IntegerValue shiftRightOf(ParticularIntegerValue other) - { - return new ParticularIntegerValue(other.value >> this.value); - } - - public IntegerValue unsignedShiftRightOf(ParticularIntegerValue other) - { - return new ParticularIntegerValue(other.value >>> this.value); - } - - public LongValue shiftLeftOf(ParticularLongValue other) - { - return new ParticularLongValue(other.value() << this.value); - } - - public LongValue shiftRightOf(ParticularLongValue other) - { - return new ParticularLongValue(other.value() >> this.value); - } - - public LongValue unsignedShiftRightOf(ParticularLongValue other) - { - return new ParticularLongValue(other.value() >>> this.value); - } - - public IntegerValue and(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value & other.value); - } - - public IntegerValue or(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value | other.value); - } - - public IntegerValue xor(ParticularIntegerValue other) - { - return new ParticularIntegerValue(this.value ^ other.value); - } - - public int equal(ParticularIntegerValue other) - { - return this.value == other.value ? ALWAYS : NEVER; - } - - public int lessThan(ParticularIntegerValue other) - { - return this.value < other.value ? ALWAYS : NEVER; - } - - public int lessThanOrEqual(ParticularIntegerValue other) - { - return this.value <= other.value ? ALWAYS : NEVER; - } - - - // Implementations for Value. - - public boolean isParticular() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return super.equals(object) && - this.value == ((ParticularIntegerValue)object).value; - } - - - public int hashCode() - { - return this.getClass().hashCode() ^ - value; - } - - - public String toString() - { - return Integer.toString(value); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularLongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularLongValue.java deleted file mode 100644 index 656c2554..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularLongValue.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This LongValue represents a particular long value. - * - * @author Eric Lafortune - */ -final class ParticularLongValue extends SpecificLongValue -{ - private final long value; - - - /** - * Creates a new particular long value. - */ - public ParticularLongValue(long value) - { - this.value = value; - } - - - // Implementations for LongValue. - - public long value() - { - return value; - } - - - // Implementations of unary methods of LongValue. - - public LongValue negate() - { - return new ParticularLongValue(-value); - } - - public IntegerValue convertToInteger() - { - return new ParticularIntegerValue((int)value); - } - - public FloatValue convertToFloat() - { - return new ParticularFloatValue((float)value); - } - - public DoubleValue convertToDouble() - { - return new ParticularDoubleValue((double)value); - } - - - // Implementations of binary methods of LongValue. - - public LongValue generalize(LongValue other) - { - return other.generalize(this); - } - - public LongValue add(LongValue other) - { - return other.add(this); - } - - public LongValue subtract(LongValue other) - { - return other.subtractFrom(this); - } - - public LongValue subtractFrom(LongValue other) - { - return other.subtract(this); - } - - public LongValue multiply(LongValue other) - { - return other.multiply(this); - } - - public LongValue divide(LongValue other) - throws ArithmeticException - { - return other.divideOf(this); - } - - public LongValue divideOf(LongValue other) - throws ArithmeticException - { - return other.divide(this); - } - - public LongValue remainder(LongValue other) - throws ArithmeticException - { - return other.remainderOf(this); - } - - public LongValue remainderOf(LongValue other) - throws ArithmeticException - { - return other.remainder(this); - } - - public LongValue shiftLeft(IntegerValue other) - { - return other.shiftLeftOf(this); - } - - public LongValue shiftRight(IntegerValue other) - { - return other.shiftRightOf(this); - } - - public LongValue unsignedShiftRight(IntegerValue other) - { - return other.unsignedShiftRightOf(this); - } - - public LongValue and(LongValue other) - { - return other.and(this); - } - - public LongValue or(LongValue other) - { - return other.or(this); - } - - public LongValue xor(LongValue other) - { - return other.xor(this); - } - - public IntegerValue compare(LongValue other) - { - return other.compareReverse(this); - } - - - // Implementations of binary LongValue methods with ParticularLongValue - // arguments. - - public LongValue generalize(ParticularLongValue other) - { - return generalize((SpecificLongValue)other); - } - - public LongValue add(ParticularLongValue other) - { - return new ParticularLongValue(this.value + other.value); - } - - public LongValue subtract(ParticularLongValue other) - { - return new ParticularLongValue(this.value - other.value); - } - - public LongValue subtractFrom(ParticularLongValue other) - { - return new ParticularLongValue(other.value - this.value); - } - - public LongValue multiply(ParticularLongValue other) - { - return new ParticularLongValue(this.value * other.value); - } - - public LongValue divide(ParticularLongValue other) - throws ArithmeticException - { - return new ParticularLongValue(this.value / other.value); - } - - public LongValue divideOf(ParticularLongValue other) - throws ArithmeticException - { - return new ParticularLongValue(other.value / this.value); - } - - public LongValue remainder(ParticularLongValue other) - throws ArithmeticException - { - return new ParticularLongValue(this.value % other.value); - } - - public LongValue remainderOf(ParticularLongValue other) - throws ArithmeticException - { - return new ParticularLongValue(other.value % this.value); - } - - public LongValue shiftLeft(ParticularIntegerValue other) - { - return new ParticularLongValue(this.value << other.value()); - } - - public LongValue shiftRight(ParticularIntegerValue other) - { - return new ParticularLongValue(this.value >> other.value()); - } - - public LongValue unsignedShiftRight(ParticularIntegerValue other) - { - return new ParticularLongValue(this.value >>> other.value()); - } - - public LongValue and(ParticularLongValue other) - { - return new ParticularLongValue(this.value & other.value); - } - - public LongValue or(ParticularLongValue other) - { - return new ParticularLongValue(this.value | other.value); - } - - public LongValue xor(ParticularLongValue other) - { - return new ParticularLongValue(this.value ^ other.value); - } - - - // Implementations for Value. - - public boolean isParticular() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return super.equals(object) && - this.value == ((ParticularLongValue)object).value; - } - - - public int hashCode() - { - return this.getClass().hashCode() ^ - (int)value; - } - - - public String toString() - { - return value+"L"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularValueFactory.java deleted file mode 100644 index 72a8fcde..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ParticularValueFactory.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; - -/** - * This class provides methods to create and reuse Value objects that have - * particular values, whenever they are known. - * - * @author Eric Lafortune - */ -public class ParticularValueFactory -extends BasicValueFactory -implements ValueFactory -{ - // Shared copies of Value objects, to avoid creating a lot of objects. - static final IntegerValue INTEGER_VALUE_M1 = new ParticularIntegerValue(-1); - static final IntegerValue INTEGER_VALUE_0 = new ParticularIntegerValue(0); - static final IntegerValue INTEGER_VALUE_1 = new ParticularIntegerValue(1); - static final IntegerValue INTEGER_VALUE_2 = new ParticularIntegerValue(2); - static final IntegerValue INTEGER_VALUE_3 = new ParticularIntegerValue(3); - static final IntegerValue INTEGER_VALUE_4 = new ParticularIntegerValue(4); - static final IntegerValue INTEGER_VALUE_5 = new ParticularIntegerValue(5); - static final LongValue LONG_VALUE_0 = new ParticularLongValue(0); - static final LongValue LONG_VALUE_1 = new ParticularLongValue(1); - static final FloatValue FLOAT_VALUE_0 = new ParticularFloatValue(0.0f); - static final FloatValue FLOAT_VALUE_1 = new ParticularFloatValue(1.0f); - static final FloatValue FLOAT_VALUE_2 = new ParticularFloatValue(2.0f); - static final DoubleValue DOUBLE_VALUE_0 = new ParticularDoubleValue(0.0); - static final DoubleValue DOUBLE_VALUE_1 = new ParticularDoubleValue(1.0); - - - private static int POS_ZERO_FLOAT_BITS = Float.floatToIntBits(0.0f); - private static long POS_ZERO_DOUBLE_BITS = Double.doubleToLongBits(0.0); - - - private final ValueFactory referenceValueFactory; - - - /** - * Creates a new ParticularValueFactory. - */ - public ParticularValueFactory() - { - this(new ArrayReferenceValueFactory()); - } - - - /** - * Creates a new ParticularValueFactory that delegates to the given - * value factory for creating reference values. - */ - public ParticularValueFactory(ValueFactory referenceValueFactory) - { - this.referenceValueFactory = referenceValueFactory; - } - - - // Implementations for ValueFactory. - - public IntegerValue createIntegerValue(int value) - { - switch (value) - { - case -1: return INTEGER_VALUE_M1; - case 0: return INTEGER_VALUE_0; - case 1: return INTEGER_VALUE_1; - case 2: return INTEGER_VALUE_2; - case 3: return INTEGER_VALUE_3; - case 4: return INTEGER_VALUE_4; - case 5: return INTEGER_VALUE_5; - default: return new ParticularIntegerValue(value); - } - } - - - public LongValue createLongValue(long value) - { - return value == 0L ? LONG_VALUE_0 : - value == 1L ? LONG_VALUE_1 : - new ParticularLongValue(value); - } - - - public FloatValue createFloatValue(float value) - { - // Make sure to distinguish between +0.0 and -0.0. - return value == 0.0f && Float.floatToIntBits(value) == POS_ZERO_FLOAT_BITS - ? FLOAT_VALUE_0 : - value == 1.0f ? FLOAT_VALUE_1 : - value == 2.0f ? FLOAT_VALUE_2 : - new ParticularFloatValue(value); - } - - - public DoubleValue createDoubleValue(double value) - { - // Make sure to distinguish between +0.0 and -0.0. - return value == 0.0 && Double.doubleToLongBits(value) == POS_ZERO_DOUBLE_BITS - ? DOUBLE_VALUE_0 : - value == 1.0 ? DOUBLE_VALUE_1 : - new ParticularDoubleValue(value); - } - - - public ReferenceValue createReferenceValue() - { - return referenceValueFactory.createReferenceValue(); - } - - - public ReferenceValue createReferenceValueNull() - { - return referenceValueFactory.createReferenceValueNull(); - } - - - public ReferenceValue createReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - return referenceValueFactory.createReferenceValue(type, - referencedClass, - mayBeExtension, - mayBeNull); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return referenceValueFactory.createArrayReferenceValue(type, - referencedClass, - arrayLength); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength, - Value elementValue) - { - return referenceValueFactory.createArrayReferenceValue(type, - referencedClass, - arrayLength, - elementValue); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/PrimitiveTypedReferenceValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/PrimitiveTypedReferenceValueFactory.java deleted file mode 100644 index 0e18174e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/PrimitiveTypedReferenceValueFactory.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; - -/** - * This class provides methods to create and reuse Value objects. - * Its ReferenceValue objects have types if they represent primitive arrays. - * - * @author Eric Lafortune - */ -public class PrimitiveTypedReferenceValueFactory -extends BasicValueFactory -{ - static final ReferenceValue REFERENCE_VALUE_NULL = new TypedReferenceValue(null, null, false, true); - - // Implementations for BasicValueFactory. - - - public ReferenceValue createReferenceValueNull() - { - return REFERENCE_VALUE_NULL; - } - - - public ReferenceValue createReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - return type == null ? REFERENCE_VALUE_NULL : - !ClassUtil.isInternalArrayType(type) || - ClassUtil.isInternalClassType(type) ? REFERENCE_VALUE : - new TypedReferenceValue(type, referencedClass, mayBeExtension, mayBeNull); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return type == null ? - REFERENCE_VALUE_NULL : - new ArrayReferenceValue(ClassConstants.TYPE_ARRAY + type, - referencedClass, - false, - arrayLength); - } - -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ReferenceValue.java deleted file mode 100644 index 4431dce1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ReferenceValue.java +++ /dev/null @@ -1,382 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; - -/** - * This class represents a partially evaluated reference value. - * - * @author Eric Lafortune - */ -public abstract class ReferenceValue extends Category1Value -{ - // Basic unary methods. - - /** - * Returns the type. - */ - public abstract String getType(); - - - /** - * Returns the class that is referenced by the type. - */ - public abstract Clazz getReferencedClass(); - - - /** - * Returns whether the actual type of this ReferenceValue may be an - * extension of its type. - */ - public abstract boolean mayBeExtension(); - - - /** - * Returns whether this ReferenceValue is null. - * @return NEVER, MAYBE, or ALWAYS. - */ - public abstract int isNull(); - - - /** - * Returns whether the type is an instance of the given type. - */ - public abstract int instanceOf(String otherType, Clazz otherReferencedClass); - - - /** - * Returns this ReferenceValue, cast to the given type. - */ - public abstract ReferenceValue cast(String type, Clazz referencedClass, ValueFactory valueFactory, boolean alwaysCast); - - - /** - * Returns the length of the array, assuming this type is an array. - */ - public IntegerValue arrayLength(ValueFactory valueFactory) - { - return valueFactory.createIntegerValue(); - } - - - /** - * Returns the value of the array at the given index, assuming this type - * is an integer array. - */ - public IntegerValue integerArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return valueFactory.createIntegerValue(); - } - - - /** - * Returns the value of the array at the given index, assuming this type - * is an long array. - */ - public LongValue longArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return valueFactory.createLongValue(); - } - - - /** - * Returns the value of the array at the given index, assuming this type - * is an float array. - */ - public FloatValue floatArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return valueFactory.createFloatValue(); - } - - - /** - * Returns the value of the array at the given index, assuming this type - * is an double array. - */ - public DoubleValue doubleArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return valueFactory.createDoubleValue(); - } - - - /** - * Returns the value of the array at the given index, assuming this type - * is a reference array. - */ - public ReferenceValue referenceArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return valueFactory.createReferenceValue(); - } - - - /** - * Stores the given value at the given index in the given array, assuming - * this type is an array. - */ - public void arrayStore(IntegerValue indexValue, Value value) - { - } - - - // Basic binary methods. - - /** - * Returns the generalization of this ReferenceValue and the given other - * ReferenceValue. - */ - public abstract ReferenceValue generalize(ReferenceValue other); - - - /** - * Returns whether this ReferenceValue is equal to the given other - * ReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public abstract int equal(ReferenceValue other); - - - // Derived unary methods. - - /** - * Returns whether this ReferenceValue is not null. - * @return NEVER, MAYBE, or ALWAYS. - */ - public final int isNotNull() - { - return -isNull(); - } - - - // Derived binary methods. - - /** - * Returns whether this ReferenceValue and the given ReferenceValue are different. - * @return NEVER, MAYBE, or ALWAYS. - */ - public final int notEqual(ReferenceValue other) - { - return -equal(other); - } - - - // Similar binary methods, but this time with unknown arguments. - - /** - * Returns the generalization of this ReferenceValue and the given other - * UnknownReferenceValue. - */ - public ReferenceValue generalize(UnknownReferenceValue other) - { - return other; - } - - - /** - * Returns whether this ReferenceValue is equal to the given other - * UnknownReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public int equal(UnknownReferenceValue other) - { - return MAYBE; - } - - - // Similar binary methods, but this time with typed reference arguments. - - /** - * Returns the generalization of this ReferenceValue and the given other - * TypedReferenceValue. - */ - public ReferenceValue generalize(TypedReferenceValue other) - { - return generalize((ReferenceValue)other); - } - - - /** - * Returns whether this ReferenceValue is equal to the given other - * TypedReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public int equal(TypedReferenceValue other) - { - return equal((ReferenceValue)other); - } - - - // Similar binary methods, but this time with identified reference - // arguments. - - /** - * Returns the generalization of this ReferenceValue and the given other - * IdentifiedReferenceValue. - */ - public ReferenceValue generalize(IdentifiedReferenceValue other) - { - return generalize((TypedReferenceValue)other); - } - - - /** - * Returns whether this ReferenceValue is equal to the given other - * IdentifiedReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public int equal(IdentifiedReferenceValue other) - { - return equal((TypedReferenceValue)other); - } - - - // Similar binary methods, but this time with array reference arguments. - - /** - * Returns the generalization of this ReferenceValue and the given other - * ArrayReferenceValue. - */ - public ReferenceValue generalize(ArrayReferenceValue other) - { - return generalize((TypedReferenceValue)other); - } - - - /** - * Returns whether this ReferenceValue is equal to the given other - * ArrayReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public int equal(ArrayReferenceValue other) - { - return equal((TypedReferenceValue)other); - } - - - // Similar binary methods, but this time with identified array reference - // arguments. - - /** - * Returns the generalization of this ReferenceValue and the given other - * IdentifiedArrayReferenceValue. - */ - public ReferenceValue generalize(IdentifiedArrayReferenceValue other) - { - return generalize((ArrayReferenceValue)other); - } - - - /** - * Returns whether this ReferenceValue is equal to the given other - * IdentifiedArrayReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public int equal(IdentifiedArrayReferenceValue other) - { - return equal((ArrayReferenceValue)other); - } - - - // Similar binary methods, but this time with detailed array reference - // arguments. - - /** - * Returns the generalization of this ReferenceValue and the given other - * DetailedArrayReferenceValue. - */ - public ReferenceValue generalize(DetailedArrayReferenceValue other) - { - return generalize((IdentifiedArrayReferenceValue)other); - } - - - /** - * Returns whether this ReferenceValue is equal to the given other - * DetailedArrayReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public int equal(DetailedArrayReferenceValue other) - { - return equal((IdentifiedArrayReferenceValue)other); - } - - - // Similar binary methods, but this time with traced arguments. - - /** - * Returns the generalization of this ReferenceValue and the given other - * TracedReferenceValue. - */ - public ReferenceValue generalize(TracedReferenceValue other) - { - return generalize((ReferenceValue)other); - } - - - /** - * Returns whether this ReferenceValue is equal to the given other - * TracedReferenceValue. - * @return NEVER, MAYBE, or ALWAYS. - */ - public int equal(TracedReferenceValue other) - { - return equal((ReferenceValue)other); - } - - - // Implementations for Value. - - public final ReferenceValue referenceValue() - { - return this; - } - - public final Value generalize(Value other) - { - return this.generalize(other.referenceValue()); - } - - public final int computationalType() - { - return TYPE_REFERENCE; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } - - - public String toString() - { - return "a"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificDoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificDoubleValue.java deleted file mode 100644 index 0eda32ff..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificDoubleValue.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This DoubleValue represents a specific double value. - * - * @author Eric Lafortune - */ -abstract class SpecificDoubleValue extends DoubleValue -{ - // Implementations of unary methods of DoubleValue. - - public DoubleValue negate() - { - return new NegatedDoubleValue(this); - } - - public IntegerValue convertToInteger() - { - return new ConvertedIntegerValue(this); - } - - public LongValue convertToLong() - { - return new ConvertedLongValue(this); - } - - public FloatValue convertToFloat() - { - return new ConvertedFloatValue(this); - } - - - // Implementations of binary methods of DoubleValue. - - public DoubleValue generalize(DoubleValue other) - { - return other.generalize(this); - } - - public DoubleValue add(DoubleValue other) - { - return other.add(this); - } - - public DoubleValue subtract(DoubleValue other) - { - return other.subtractFrom(this); - } - - public DoubleValue subtractFrom(DoubleValue other) - { - return other.subtract(this); - } - - public DoubleValue multiply(DoubleValue other) - { - return other.multiply(this); - } - - public DoubleValue divide(DoubleValue other) - { - return other.divideOf(this); - } - - public DoubleValue divideOf(DoubleValue other) - { - return other.divide(this); - } - - public DoubleValue remainder(DoubleValue other) - { - return other.remainderOf(this); - } - - public DoubleValue remainderOf(DoubleValue other) - { - return other.remainder(this); - } - - public IntegerValue compare(DoubleValue other) - { - return other.compareReverse(this); - } - - - // Implementations of binary DoubleValue methods with SpecificDoubleValue - // arguments. - - public DoubleValue generalize(SpecificDoubleValue other) - { - return this.equals(other) ? this : BasicValueFactory.DOUBLE_VALUE; - } - - public DoubleValue add(SpecificDoubleValue other) - { - return new CompositeDoubleValue(this, CompositeDoubleValue.ADD, other); - } - - public DoubleValue subtract(SpecificDoubleValue other) - { - return new CompositeDoubleValue(this, CompositeDoubleValue.SUBTRACT, other); - } - - public DoubleValue subtractFrom(SpecificDoubleValue other) - { - return new CompositeDoubleValue(other, CompositeDoubleValue.SUBTRACT, this); - } - - public DoubleValue multiply(SpecificDoubleValue other) - { - return new CompositeDoubleValue(this, CompositeDoubleValue.MULTIPLY, other); - } - - public DoubleValue divide(SpecificDoubleValue other) - { - return new CompositeDoubleValue(this, CompositeDoubleValue.DIVIDE, other); - } - - public DoubleValue divideOf(SpecificDoubleValue other) - { - return new CompositeDoubleValue(other, CompositeDoubleValue.DIVIDE, this); - } - - public DoubleValue remainder(SpecificDoubleValue other) - { - return new CompositeDoubleValue(this, CompositeDoubleValue.REMAINDER, other); - } - - public DoubleValue remainderOf(SpecificDoubleValue other) - { - return new CompositeDoubleValue(other, CompositeDoubleValue.REMAINDER, this); - } - - public IntegerValue compare(SpecificDoubleValue other) - { - return BasicValueFactory.INTEGER_VALUE; - - // Not handling NaN properly. - //return this.equals(other) ? - // ParticularValueFactory.INTEGER_VALUE_0 : - // new ComparisonValue(this, other); - } - - - // Implementations for Value. - - public boolean isSpecific() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificFloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificFloatValue.java deleted file mode 100644 index 76a7f99c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificFloatValue.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This FloatValue represents a specific float value. - * - * @author Eric Lafortune - */ -abstract class SpecificFloatValue extends FloatValue -{ - // Implementations of unary methods of FloatValue. - - public FloatValue negate() - { - return new NegatedFloatValue(this); - } - - public IntegerValue convertToInteger() - { - return new ConvertedIntegerValue(this); - } - - public LongValue convertToLong() - { - return new ConvertedLongValue(this); - } - - public DoubleValue convertToDouble() - { - return new ConvertedDoubleValue(this); - } - - - // Implementations of binary methods of FloatValue. - - public FloatValue generalize(FloatValue other) - { - return other.generalize(this); - } - - public FloatValue add(FloatValue other) - { - return other.add(this); - } - - public FloatValue subtract(FloatValue other) - { - return other.subtractFrom(this); - } - - public FloatValue subtractFrom(FloatValue other) - { - return other.subtract(this); - } - - public FloatValue multiply(FloatValue other) - { - return other.multiply(this); - } - - public FloatValue divide(FloatValue other) - { - return other.divideOf(this); - } - - public FloatValue divideOf(FloatValue other) - { - return other.divide(this); - } - - public FloatValue remainder(FloatValue other) - { - return other.remainderOf(this); - } - - public FloatValue remainderOf(FloatValue other) - { - return other.remainder(this); - } - - public IntegerValue compare(FloatValue other) - { - return other.compareReverse(this); - } - - - // Implementations of binary FloatValue methods with SpecificFloatValue - // arguments. - - public FloatValue generalize(SpecificFloatValue other) - { - return this.equals(other) ? this : BasicValueFactory.FLOAT_VALUE; - } - - public FloatValue add(SpecificFloatValue other) - { - return new CompositeFloatValue(this, CompositeFloatValue.ADD, other); - } - - public FloatValue subtract(SpecificFloatValue other) - { - return new CompositeFloatValue(this, CompositeFloatValue.SUBTRACT, other); - } - - public FloatValue subtractFrom(SpecificFloatValue other) - { - return new CompositeFloatValue(other, CompositeFloatValue.SUBTRACT, this); - } - - public FloatValue multiply(SpecificFloatValue other) - { - return new CompositeFloatValue(this, CompositeFloatValue.MULTIPLY, other); - } - - public FloatValue divide(SpecificFloatValue other) - { - return new CompositeFloatValue(this, CompositeFloatValue.DIVIDE, other); - } - - public FloatValue divideOf(SpecificFloatValue other) - { - return new CompositeFloatValue(other, CompositeFloatValue.DIVIDE, this); - } - - public FloatValue remainder(SpecificFloatValue other) - { - return new CompositeFloatValue(this, CompositeFloatValue.REMAINDER, other); - } - - public FloatValue remainderOf(SpecificFloatValue other) - { - return new CompositeFloatValue(other, CompositeFloatValue.REMAINDER, this); - } - - public IntegerValue compare(SpecificFloatValue other) - { - return BasicValueFactory.INTEGER_VALUE; - - // Not handling NaN properly. - //return this.equals(other) ? - // ParticularValueFactory.INTEGER_VALUE_0 : - // new ComparisonValue(this, other); - } - - - // Implementations for Value. - - public boolean isSpecific() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificIntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificIntegerValue.java deleted file mode 100644 index c5c33ad7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificIntegerValue.java +++ /dev/null @@ -1,354 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This IntegerValue represents a specific integer value. - * - * @author Eric Lafortune - */ -abstract class SpecificIntegerValue extends IntegerValue -{ - // Implementations of unary methods of IntegerValue. - - public IntegerValue negate() - { - return new NegatedIntegerValue(this); - } - - public IntegerValue convertToByte() - { - return new ConvertedByteValue(this); - } - - public IntegerValue convertToCharacter() - { - return new ConvertedCharacterValue(this); - } - - public IntegerValue convertToShort() - { - return new ConvertedShortValue(this); - } - - public LongValue convertToLong() - { - return new ConvertedLongValue(this); - } - - public FloatValue convertToFloat() - { - return new ConvertedFloatValue(this); - } - - public DoubleValue convertToDouble() - { - return new ConvertedDoubleValue(this); - } - - - // Implementations of binary methods of IntegerValue. - - public IntegerValue generalize(IntegerValue other) - { - return other.generalize(this); - } - - public IntegerValue add(IntegerValue other) - { - return other.add(this); - } - - public IntegerValue subtract(IntegerValue other) - { - return other.subtractFrom(this); - } - - public IntegerValue subtractFrom(IntegerValue other) - { - return other.subtract(this); - } - - public IntegerValue multiply(IntegerValue other) - { - return other.multiply(this); - } - - public IntegerValue divide(IntegerValue other) - throws ArithmeticException - { - return other.divideOf(this); - } - - public IntegerValue divideOf(IntegerValue other) - throws ArithmeticException - { - return other.divide(this); - } - - public IntegerValue remainder(IntegerValue other) - throws ArithmeticException - { - return other.remainderOf(this); - } - - public IntegerValue remainderOf(IntegerValue other) - throws ArithmeticException - { - return other.remainder(this); - } - - public IntegerValue shiftLeft(IntegerValue other) - { - return other.shiftLeftOf(this); - } - - public IntegerValue shiftLeftOf(IntegerValue other) - { - return other.shiftLeft(this); - } - - public IntegerValue shiftRight(IntegerValue other) - { - return other.shiftRightOf(this); - } - - public IntegerValue shiftRightOf(IntegerValue other) - { - return other.shiftRight(this); - } - - public IntegerValue unsignedShiftRight(IntegerValue other) - { - return other.unsignedShiftRightOf(this); - } - - public IntegerValue unsignedShiftRightOf(IntegerValue other) - { - return other.unsignedShiftRight(this); - } - - public LongValue shiftLeftOf(LongValue other) - { - return other.shiftLeft(this); - } - - public LongValue shiftRightOf(LongValue other) - { - return other.shiftRight(this); - } - - public LongValue unsignedShiftRightOf(LongValue other) - { - return other.unsignedShiftRight(this); - } - - public IntegerValue and(IntegerValue other) - { - return other.and(this); - } - - public IntegerValue or(IntegerValue other) - { - return other.or(this); - } - - public IntegerValue xor(IntegerValue other) - { - return other.xor(this); - } - - public int equal(IntegerValue other) - { - return other.equal(this); - } - - public int lessThan(IntegerValue other) - { - return other.greaterThan(this); - } - - public int lessThanOrEqual(IntegerValue other) - { - return other.greaterThanOrEqual(this); - } - - - // Implementations of binary IntegerValue methods with SpecificIntegerValue - // arguments. - - public IntegerValue generalize(SpecificIntegerValue other) - { - return this.equals(other) ? this : BasicValueFactory.INTEGER_VALUE; - } - - public IntegerValue add(SpecificIntegerValue other) - { - return new CompositeIntegerValue(this, CompositeIntegerValue.ADD, other); - } - - public IntegerValue subtract(SpecificIntegerValue other) - { - return this.equals(other) ? - ParticularValueFactory.INTEGER_VALUE_0 : - new CompositeIntegerValue(this, CompositeIntegerValue.SUBTRACT, other); - } - - public IntegerValue subtractFrom(SpecificIntegerValue other) - { - return this.equals(other) ? - ParticularValueFactory.INTEGER_VALUE_0 : - new CompositeIntegerValue(other, CompositeIntegerValue.SUBTRACT, this); - } - - public IntegerValue multiply(SpecificIntegerValue other) - { - return new CompositeIntegerValue(this, CompositeIntegerValue.MULTIPLY, other); - } - - public IntegerValue divide(SpecificIntegerValue other) - throws ArithmeticException - { - return new CompositeIntegerValue(this, CompositeIntegerValue.DIVIDE, other); - } - - public IntegerValue divideOf(SpecificIntegerValue other) - throws ArithmeticException - { - return new CompositeIntegerValue(other, CompositeIntegerValue.DIVIDE, this); - } - - public IntegerValue remainder(SpecificIntegerValue other) - throws ArithmeticException - { - return new CompositeIntegerValue(this, CompositeIntegerValue.REMAINDER, other); - } - - public IntegerValue remainderOf(SpecificIntegerValue other) - throws ArithmeticException - { - return new CompositeIntegerValue(other, CompositeIntegerValue.REMAINDER, this); - } - - public IntegerValue shiftLeft(SpecificIntegerValue other) - { - return new CompositeIntegerValue(this, CompositeIntegerValue.SHIFT_LEFT, other); - } - - public IntegerValue shiftRight(SpecificIntegerValue other) - { - return new CompositeIntegerValue(this, CompositeIntegerValue.SHIFT_RIGHT, other); - } - - public IntegerValue unsignedShiftRight(SpecificIntegerValue other) - { - return new CompositeIntegerValue(this, CompositeIntegerValue.UNSIGNED_SHIFT_RIGHT, other); - } - - public IntegerValue shiftLeftOf(SpecificIntegerValue other) - { - return new CompositeIntegerValue(other, CompositeIntegerValue.SHIFT_LEFT, this); - } - - public IntegerValue shiftRightOf(SpecificIntegerValue other) - { - return new CompositeIntegerValue(other, CompositeIntegerValue.SHIFT_RIGHT, this); - } - - public IntegerValue unsignedShiftRightOf(SpecificIntegerValue other) - { - return new CompositeIntegerValue(other, CompositeIntegerValue.UNSIGNED_SHIFT_RIGHT, this); - } - - public LongValue shiftLeftOf(SpecificLongValue other) - { - return new CompositeLongValue(other, CompositeLongValue.SHIFT_LEFT, this); - } - - public LongValue shiftRightOf(SpecificLongValue other) - { - return new CompositeLongValue(other, CompositeLongValue.SHIFT_RIGHT, this); - } - - public LongValue unsignedShiftRightOf(SpecificLongValue other) - { - return new CompositeLongValue(other, CompositeLongValue.UNSIGNED_SHIFT_RIGHT, this); - } - - public IntegerValue and(SpecificIntegerValue other) - { - return this.equals(other) ? - this : - new CompositeIntegerValue(other, CompositeIntegerValue.AND, this); - } - - public IntegerValue or(SpecificIntegerValue other) - { - return this.equals(other) ? - this : - new CompositeIntegerValue(other, CompositeIntegerValue.OR, this); - } - - public IntegerValue xor(SpecificIntegerValue other) - { - return this.equals(other) ? - ParticularValueFactory.INTEGER_VALUE_0 : - new CompositeIntegerValue(other, CompositeIntegerValue.XOR, this); - } - - public int equal(SpecificIntegerValue other) - { - return this.equals(other) ? ALWAYS : MAYBE; - } - - public int lessThan(SpecificIntegerValue other) - { - return this.equals(other) ? NEVER : MAYBE; - } - - public int lessThanOrEqual(SpecificIntegerValue other) - { - return this.equals(other) ? ALWAYS : MAYBE; - } - - - // Implementations for Value. - - public boolean isSpecific() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificLongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificLongValue.java deleted file mode 100644 index 0e0420a8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/SpecificLongValue.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This LongValue represents a specific long value. - * - * @author Eric Lafortune - */ -abstract class SpecificLongValue extends LongValue -{ - // Implementations of unary methods of LongValue. - - public LongValue negate() - { - return new NegatedLongValue(this); - } - - public IntegerValue convertToInteger() - { - return new ConvertedIntegerValue(this); - } - - public FloatValue convertToFloat() - { - return new ConvertedFloatValue(this); - } - - public DoubleValue convertToDouble() - { - return new ConvertedDoubleValue(this); - } - - - // Implementations of binary methods of LongValue. - - public LongValue generalize(LongValue other) - { - return other.generalize(this); - } - - public LongValue add(LongValue other) - { - return other.add(this); - } - - public LongValue subtract(LongValue other) - { - return other.subtractFrom(this); - } - - public LongValue subtractFrom(LongValue other) - { - return other.subtract(this); - } - - public LongValue multiply(LongValue other) - { - return other.multiply(this); - } - - public LongValue divide(LongValue other) - throws ArithmeticException - { - return other.divideOf(this); - } - - public LongValue divideOf(LongValue other) - throws ArithmeticException - { - return other.divide(this); - } - - public LongValue remainder(LongValue other) - throws ArithmeticException - { - return other.remainderOf(this); - } - - public LongValue remainderOf(LongValue other) - throws ArithmeticException - { - return other.remainder(this); - } - - public LongValue shiftLeft(IntegerValue other) - { - return other.shiftLeftOf(this); - } - - public LongValue shiftRight(IntegerValue other) - { - return other.shiftRightOf(this); - } - - public LongValue unsignedShiftRight(IntegerValue other) - { - return other.unsignedShiftRightOf(this); - } - - public LongValue and(LongValue other) - { - return other.and(this); - } - - public LongValue or(LongValue other) - { - return other.or(this); - } - - public LongValue xor(LongValue other) - { - return other.xor(this); - } - - public IntegerValue compare(LongValue other) - { - return other.compareReverse(this); - } - - - // Implementations of binary LongValue methods with SpecificLongValue - // arguments. - - public LongValue generalize(SpecificLongValue other) - { - return this.equals(other) ? this : BasicValueFactory.LONG_VALUE; - } - - public LongValue add(SpecificLongValue other) - { - return new CompositeLongValue(this, CompositeLongValue.ADD, other); - } - - public LongValue subtract(SpecificLongValue other) - { - return this.equals(other) ? - ParticularValueFactory.LONG_VALUE_0 : - new CompositeLongValue(this, CompositeLongValue.SUBTRACT, other); - } - - public LongValue subtractFrom(SpecificLongValue other) - { - return this.equals(other) ? - ParticularValueFactory.LONG_VALUE_0 : - new CompositeLongValue(other, CompositeLongValue.SUBTRACT, this); - } - - public LongValue multiply(SpecificLongValue other) - { - return new CompositeLongValue(this, CompositeLongValue.MULTIPLY, other); - } - - public LongValue divide(SpecificLongValue other) - throws ArithmeticException - { - return new CompositeLongValue(this, CompositeLongValue.DIVIDE, other); - } - - public LongValue divideOf(SpecificLongValue other) - throws ArithmeticException - { - return new CompositeLongValue(other, CompositeLongValue.DIVIDE, this); - } - - public LongValue remainder(SpecificLongValue other) - throws ArithmeticException - { - return new CompositeLongValue(this, CompositeLongValue.REMAINDER, other); - } - - public LongValue remainderOf(SpecificLongValue other) - throws ArithmeticException - { - return new CompositeLongValue(other, CompositeLongValue.REMAINDER, this); - } - - public LongValue shiftLeft(SpecificLongValue other) - { - return new CompositeLongValue(this, CompositeLongValue.SHIFT_LEFT, other); - } - - public LongValue shiftRight(SpecificLongValue other) - { - return new CompositeLongValue(this, CompositeLongValue.SHIFT_RIGHT, other); - } - - public LongValue unsignedShiftRight(SpecificLongValue other) - { - return new CompositeLongValue(this, CompositeLongValue.UNSIGNED_SHIFT_RIGHT, other); - } - - public LongValue and(SpecificLongValue other) - { - return this.equals(other) ? - this : - new CompositeLongValue(other, CompositeLongValue.AND, this); - } - - public LongValue or(SpecificLongValue other) - { - return this.equals(other) ? - this : - new CompositeLongValue(other, CompositeLongValue.OR, this); - } - - public LongValue xor(SpecificLongValue other) - { - return this.equals(other) ? - ParticularValueFactory.LONG_VALUE_0 : - new CompositeLongValue(other, CompositeLongValue.XOR, this); - } - - public IntegerValue compare(SpecificLongValue other) - { - return new ComparisonValue(this, other); - } - - - // Implementations for Value. - - public boolean isSpecific() - { - return true; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TopValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TopValue.java deleted file mode 100644 index 35d7989b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TopValue.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This class represents a partially evaluated top value. A top value is the - * dummy value that takes up the extra space when storing a long value or a - * double value. - * - * @author Eric Lafortune - */ -public class TopValue extends Category1Value -{ - // Implementations for Value. - - public boolean isSpecific() - { - return true; - } - - public boolean isParticular() - { - return true; - } - - public final Value generalize(Value other) - { - return this.getClass() == other.getClass() ? this : null; - } - - public final int computationalType() - { - return TYPE_TOP; - } - - public final String internalType() - { - return null; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } - - - public String toString() - { - return "T"; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TracedReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TracedReferenceValue.java deleted file mode 100644 index f5f9c24c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TracedReferenceValue.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; -import proguard.optimize.evaluation.ReferenceTracingValueFactory; - -/** - * This ReferenceValue represents a reference value that is tagged with a trace - * value. - * - * @author Eric Lafortune - */ -public class TracedReferenceValue extends ReferenceValue -{ - private final ReferenceValue referenceValue; - private final Value traceValue; - - - /** - * Creates a new reference value with the given ID. - */ - public TracedReferenceValue(ReferenceValue referenceValue, - Value traceValue) - { - this.referenceValue = referenceValue; - this.traceValue = traceValue; - } - - - /** - * Returns the reference value. - */ - public ReferenceValue getReferenceValue() - { - return referenceValue; - } - - - /** - * Returns the trace value. - */ - public Value getTraceValue() - { - return traceValue; - } - - - // Implementations for ReferenceValue. - - public String getType() - { - return referenceValue.getType(); - } - - - public Clazz getReferencedClass() - { - return referenceValue.getReferencedClass(); - } - - - public boolean mayBeExtension() - { - return referenceValue.mayBeExtension(); - } - - - public int isNull() - { - return referenceValue.isNull(); - } - - - public int instanceOf(String otherType, Clazz otherReferencedClass) - { - return referenceValue.instanceOf(otherType, otherReferencedClass); - } - - - public ReferenceValue cast(String type, Clazz referencedClass, ValueFactory valueFactory, boolean alwaysCast) - { - // We're letting the value factory do the cast (either preserving the - // trace value or setting a new one). - return ((ReferenceTracingValueFactory)valueFactory).cast(this, - type, - referencedClass, - alwaysCast); - } - - - public IntegerValue arrayLength(ValueFactory valueFactory) - { - return referenceValue.arrayLength(valueFactory); - } - - - public IntegerValue integerArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return referenceValue.integerArrayLoad(indexValue, valueFactory); - } - - - public LongValue longArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return referenceValue.longArrayLoad(indexValue, valueFactory); - } - - - public FloatValue floatArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return referenceValue.floatArrayLoad(indexValue, valueFactory); - } - - - public DoubleValue doubleArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return referenceValue.doubleArrayLoad(indexValue, valueFactory); - } - - - public ReferenceValue referenceArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - ReferenceValue value = - referenceValue.referenceArrayLoad(indexValue, valueFactory); - - // We're keeping the existing trace value, if any, or attaching a new - // one otherwise. - return value instanceof TracedReferenceValue ? - value : - ((ReferenceTracingValueFactory)valueFactory).trace(value); - } - - - public void arrayStore(IntegerValue indexValue, Value value) - { - referenceValue.arrayStore(indexValue, value); - } - - - // Implementations of binary methods of ReferenceValue. - - public ReferenceValue generalize(ReferenceValue other) - { - return other.generalize(this); - } - - public int equal(ReferenceValue other) - { - return other.equal(this); - } - - - // Implementations of binary ReferenceValue methods with - // UnknownReferenceValue arguments. - - public ReferenceValue generalize(UnknownReferenceValue other) - { - return new TracedReferenceValue(referenceValue.generalize(other), - traceValue); - } - - public int equal(UnknownReferenceValue other) - { - return referenceValue.equal(other); - } - - - // Implementations of binary ReferenceValue methods with - // TypedReferenceValue arguments. - - public ReferenceValue generalize(TypedReferenceValue other) - { - return new TracedReferenceValue(referenceValue.generalize(other), - traceValue); - } - - public int equal(TypedReferenceValue other) - { - return referenceValue.equal(other); - } - - - // Implementations of binary ReferenceValue methods with - // IdentifiedReferenceValue arguments. - - public ReferenceValue generalize(IdentifiedReferenceValue other) - { - return new TracedReferenceValue(referenceValue.generalize(other), - traceValue); - } - - - public int equal(IdentifiedReferenceValue other) - { - return referenceValue.equal(other); - } - - - // Implementations of binary ReferenceValue methods with - // ArrayReferenceValue arguments. - - public ReferenceValue generalize(ArrayReferenceValue other) - { - return new TracedReferenceValue(referenceValue.generalize(other), - traceValue); - } - - - public int equal(ArrayReferenceValue other) - { - return referenceValue.equal(other); - } - - - // Implementations of binary ReferenceValue methods with - // IdentifiedArrayReferenceValue arguments. - - public ReferenceValue generalize(IdentifiedArrayReferenceValue other) - { - return new TracedReferenceValue(referenceValue.generalize(other), - traceValue); - } - - - public int equal(IdentifiedArrayReferenceValue other) - { - return referenceValue.equal(other); - } - - - // Implementations of binary ReferenceValue methods with - // DetailedArrayReferenceValue arguments. - - public ReferenceValue generalize(DetailedArrayReferenceValue other) - { - return new TracedReferenceValue(referenceValue.generalize(other), - traceValue); - } - - - public int equal(DetailedArrayReferenceValue other) - { - return referenceValue.equal(other); - } - - - // Implementations of binary ReferenceValue methods with - // TracedReferenceValue arguments. - - public ReferenceValue generalize(TracedReferenceValue other) - { - if (this.equals(other)) - { - return this; - } - - return new TracedReferenceValue(this.referenceValue.generalize(other.referenceValue), - this.traceValue .generalize(other.traceValue)); - } - - public int equal(TracedReferenceValue other) - { - return this.referenceValue.equal(other.referenceValue); - } - - - // Implementations for Value. - - public boolean isSpecific() - { - return referenceValue.isSpecific(); - } - - public boolean isParticular() - { - return referenceValue.isParticular(); - } - - public String internalType() - { - return referenceValue.internalType(); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (this == object) - { - return true; - } - - if (!super.equals(object)) - { - return false; - } - - TracedReferenceValue other = (TracedReferenceValue)object; - return this.referenceValue.equals(other.referenceValue) && - this.traceValue .equals(other.traceValue); - } - - - public int hashCode() - { - return referenceValue.hashCode() ^ - traceValue.hashCode(); - } - - - public String toString() - { - return traceValue.toString() + referenceValue.toString(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TracingValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TracingValue.java deleted file mode 100644 index bb4bdc06..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TracingValue.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This class represents a value that has been tagged with a sticky trace - * value. - * - * @author Eric Lafortune - */ -public class TracingValue extends Value -{ - private Value traceValue; - private Value value; - - - /** - * Creates a new TracingValue with the given trace value and value. - */ - public TracingValue(Value traceValue, Value value) - { - - this.traceValue = traceValue; - this.value = value; - } - - - /** - * Returns the generalization of this TracingValue and the given other - * TracingValue. - */ - public final TracingValue generalize(TracingValue other) - { - return this.equals(other) ? this : - new TracingValue(this.traceValue.generalize(other.traceValue), - this.value .generalize(other.value)); - } - - - // Implementations for Value. - - public Category1Value category1Value() - { - return value.category1Value(); - } - - public Category2Value category2Value() - { - return value.category2Value(); - } - - public IntegerValue integerValue() - { - return value.integerValue(); - } - - public LongValue longValue() - { - return value.longValue(); - } - - public FloatValue floatValue() - { - return value.floatValue(); - } - - public DoubleValue doubleValue() - { - return value.doubleValue(); - } - - public ReferenceValue referenceValue() - { - return value.referenceValue(); - } - - public final InstructionOffsetValue instructionOffsetValue() - { - return value.instructionOffsetValue(); - } - - public boolean isSpecific() - { - return value.isSpecific(); - } - - public boolean isParticular() - { - return value.isParticular(); - } - - public final Value generalize(Value other) - { - return - other instanceof TracingValue ? generalize((TracingValue)other) : - value.equals(other) ? this : - new TracingValue(traceValue, - value.generalize(other)); - } - - public boolean isCategory2() - { - return value.isCategory2(); - } - - public final int computationalType() - { - return value.computationalType(); - } - - public final String internalType() - { - return value.internalType(); - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (object == null || - this.getClass() != object.getClass()) - { - return false; - } - - TracingValue other = (TracingValue)object; - return - this.traceValue.equals(other.traceValue) && - this.value .equals(other.value); - } - - - public int hashCode() - { - return - this.getClass().hashCode() ^ - traceValue.hashCode() ^ - value .hashCode(); - } - - - public String toString() - { - return 'P' + traceValue.toString() + value.toString(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TypedReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TypedReferenceValue.java deleted file mode 100644 index 75428082..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TypedReferenceValue.java +++ /dev/null @@ -1,730 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; -import proguard.classfile.visitor.ClassCollector; - -import java.util.*; - -/** - * This ReferenceValue represents a partially evaluated reference value. - * It has a type and a flag that indicates whether the value could be - * null. If the type is null, the value is - * null. - * - * @author Eric Lafortune - */ -public class TypedReferenceValue extends ReferenceValue -{ - private static final boolean ALLOW_INCOMPLETE_CLASS_HIERARCHY = System.getProperty("allow.incomplete.class.hierarchy") != null; - - private static final boolean DEBUG = false; - - - protected final String type; - protected final Clazz referencedClass; - protected final boolean mayBeExtension; - protected final boolean mayBeNull; - - - /** - * Creates a new TypedReferenceValue. - */ - public TypedReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - this.type = type; - this.referencedClass = referencedClass; - this.mayBeExtension = mayBeExtension; - this.mayBeNull = mayBeNull; - } - - - // Implementations for ReferenceValue. - - public String getType() - { - return type; - } - - - public Clazz getReferencedClass() - { - return referencedClass; - } - - - // Implementations of unary methods of ReferenceValue. - - public boolean mayBeExtension() - { - return mayBeExtension; - } - - public int isNull() - { - return type == null ? ALWAYS : - mayBeNull ? MAYBE : - NEVER; - } - - - public int instanceOf(String otherType, Clazz otherReferencedClass) - { - String thisType = this.type; - - // If this type is null, it is never an instance of any class. - if (thisType == null) - { - return NEVER; - } - - // Start taking into account the type dimensions. - int thisDimensionCount = ClassUtil.internalArrayTypeDimensionCount(thisType); - int otherDimensionCount = ClassUtil.internalArrayTypeDimensionCount(otherType); - int commonDimensionCount = Math.min(thisDimensionCount, otherDimensionCount); - - // Strip any common array prefixes. - thisType = thisType.substring(commonDimensionCount); - otherType = otherType.substring(commonDimensionCount); - - // If either stripped type is a primitive type, we can tell right away. - if (commonDimensionCount > 0 && - (ClassUtil.isInternalPrimitiveType(thisType.charAt(0)) || - ClassUtil.isInternalPrimitiveType(otherType.charAt(0)))) - { - return !thisType.equals(otherType) ? NEVER : - mayBeNull ? MAYBE : - ALWAYS; - } - - // Strip the class type prefix and suffix of this type, if any. - if (thisDimensionCount == commonDimensionCount) - { - thisType = ClassUtil.internalClassNameFromClassType(thisType); - } - - // Strip the class type prefix and suffix of the other type, if any. - if (otherDimensionCount == commonDimensionCount) - { - otherType = ClassUtil.internalClassNameFromClassType(otherType); - } - - // If this type is an array type, and the other type is not - // java.lang.Object, java.lang.Cloneable, or java.io.Serializable, - // this type can never be an instance. - if (thisDimensionCount > otherDimensionCount && - !ClassUtil.isInternalArrayInterfaceName(otherType)) - { - return NEVER; - } - - // If the other type is an array type, and this type is not - // java.lang.Object, java.lang.Cloneable, or java.io.Serializable, - // this type can never be an instance. - if (thisDimensionCount < otherDimensionCount && - !ClassUtil.isInternalArrayInterfaceName(thisType)) - { - return NEVER; - } - - // If this type is equal to the other type, or if the other type is - // java.lang.Object, or if this type is an array type, then this type - // is always an instance (unless it may be null). - if (thisType.equals(otherType) || - ClassConstants.NAME_JAVA_LANG_OBJECT.equals(otherType) || - thisDimensionCount > otherDimensionCount) - { - return mayBeNull ? MAYBE : - ALWAYS; - } - - // If the other type is an array type, it might be ok. - if (thisDimensionCount < otherDimensionCount) - { - return MAYBE; - } - - // If the value extends the type, we're sure (unless it may be null). - // Otherwise, if the value type is final, it can never be an instance. - // Also, if the types are not interfaces and not in the same hierarchy, - // the value can never be an instance. - return referencedClass == null || - otherReferencedClass == null ? MAYBE : - referencedClass.extendsOrImplements(otherReferencedClass) ? mayBeNull ? MAYBE : ALWAYS : - (referencedClass.getAccessFlags() & ClassConstants.ACC_FINAL) != 0 ? NEVER : - (referencedClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0 && - (otherReferencedClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0 && - !otherReferencedClass.extendsOrImplements(referencedClass) ? NEVER : - MAYBE; - } - - - public ReferenceValue cast(String type, Clazz referencedClass, ValueFactory valueFactory, boolean alwaysCast) - { - // Just return this value if it's the same type. - // Also return this value if it is null or more specific. - return (this.type != null && - this.type.equals(type)) || - (!alwaysCast && - (this.type == null || - instanceOf(this.type, referencedClass) == ALWAYS)) ? this : - valueFactory.createReferenceValue(type, - referencedClass, - true, - mayBeNull); - } - - - public ReferenceValue generalizeMayBeNull(boolean mayBeNull) - { - return this.mayBeNull == mayBeNull ? - this : - new TypedReferenceValue(type, referencedClass, mayBeExtension, true); - } - - - public ReferenceValue referenceArrayLoad(IntegerValue indexValue, ValueFactory valueFactory) - { - return - type == null ? TypedReferenceValueFactory.REFERENCE_VALUE_NULL : - !ClassUtil.isInternalArrayType(type) ? TypedReferenceValueFactory.REFERENCE_VALUE_JAVA_LANG_OBJECT_MAYBE_NULL : - valueFactory.createValue(type.substring(1), - referencedClass, - true, - true).referenceValue(); - } - - - // Implementations of binary methods of ReferenceValue. - - public ReferenceValue generalize(ReferenceValue other) - { - return other.generalize(this); - } - - - public int equal(ReferenceValue other) - { - return other.equal(this); - } - - -// // Implementations of binary ReferenceValue methods with -// // UnknownReferenceValue arguments. -// -// public ReferenceValue generalize(UnknownReferenceValue other) -// { -// return other; -// } -// -// -// public int equal(UnknownReferenceValue other) -// { -// return MAYBE; -// } - - - // Implementations of binary ReferenceValue methods with TypedReferenceValue - // arguments. - - public ReferenceValue generalize(TypedReferenceValue other) - { - // If both types are identical, the generalization is the same too. - if (this.equals(other)) - { - return this; - } - - String thisType = this.type; - String otherType = other.type; - - // If both types are null, the generalization is null too. - if (thisType == null && otherType == null) - { - return TypedReferenceValueFactory.REFERENCE_VALUE_NULL; - } - - // If this type is null, the generalization is the other type, maybe null. - if (thisType == null) - { - return other.generalizeMayBeNull(true); - } - - // If the other type is null, the generalization is this type, maybe null. - if (otherType == null) - { - return this.generalizeMayBeNull(true); - } - - boolean mayBeExtension = this.mayBeExtension || other.mayBeExtension; - boolean mayBeNull = this.mayBeNull || other.mayBeNull; - - // If the two types are equal, the generalization remains the same, - // maybe an extension, maybe null. - if (thisType.equals(otherType)) - { - return typedReferenceValue(this, mayBeExtension, mayBeNull); - } - - // Start taking into account the type dimensions. - int thisDimensionCount = ClassUtil.internalArrayTypeDimensionCount(thisType); - int otherDimensionCount = ClassUtil.internalArrayTypeDimensionCount(otherType); - int commonDimensionCount = Math.min(thisDimensionCount, otherDimensionCount); - - if (thisDimensionCount == otherDimensionCount) - { - // See if we can take into account the referenced classes. - Clazz thisReferencedClass = this.referencedClass; - Clazz otherReferencedClass = other.referencedClass; - - if (thisReferencedClass != null && - otherReferencedClass != null) - { - // Is one class simply an extension of the other one? - if (thisReferencedClass.extendsOrImplements(otherReferencedClass)) - { - return typedReferenceValue(other, true, mayBeNull); - } - - if (otherReferencedClass.extendsOrImplements(thisReferencedClass)) - { - return typedReferenceValue(this, true, mayBeNull); - } - - try - { - // Do the classes have a non-trivial common superclass? - Clazz commonClass = findCommonClass(thisReferencedClass, - otherReferencedClass, - false); - - if (commonClass.getName().equals(ClassConstants.NAME_JAVA_LANG_OBJECT)) - { - // Otherwise, do the classes have a common interface? - Clazz commonInterface = findCommonClass(thisReferencedClass, - otherReferencedClass, - true); - if (commonInterface != null) - { - commonClass = commonInterface; - } - } - - return new TypedReferenceValue(commonDimensionCount == 0 ? - commonClass.getName() : - ClassUtil.internalArrayTypeFromClassName(commonClass.getName(), - commonDimensionCount), - commonClass, - mayBeExtension, - mayBeNull); - } - catch (IllegalArgumentException e) - { - // The class hierarchy seems to be incomplete. - if (ALLOW_INCOMPLETE_CLASS_HIERARCHY) - { - // We'll return an unknown reference value. - return BasicValueFactory.REFERENCE_VALUE; - } - - throw e; - } - } - } - else if (thisDimensionCount > otherDimensionCount) - { - // See if the other type is an interface type of arrays. - if (ClassUtil.isInternalArrayInterfaceName(ClassUtil.internalClassNameFromClassType(otherType))) - { - return typedReferenceValue(other, true, mayBeNull); - } - } - else if (thisDimensionCount < otherDimensionCount) - { - // See if this type is an interface type of arrays. - if (ClassUtil.isInternalArrayInterfaceName(ClassUtil.internalClassNameFromClassType(thisType))) - { - return typedReferenceValue(this, true, mayBeNull); - } - } - - // Reduce the common dimension count if either type is an array of - // primitives type of this dimension. - if (commonDimensionCount > 0 && - (ClassUtil.isInternalPrimitiveType(otherType.charAt(commonDimensionCount)) || - ClassUtil.isInternalPrimitiveType(thisType.charAt(commonDimensionCount)))) - { - commonDimensionCount--; - } - - // Fall back on a basic Object or array of Objects type. - return - commonDimensionCount != 0 ? - new TypedReferenceValue(ClassUtil.internalArrayTypeFromClassName(ClassConstants.NAME_JAVA_LANG_OBJECT, commonDimensionCount), - null, - true, - mayBeNull) : - mayBeNull ? - TypedReferenceValueFactory.REFERENCE_VALUE_JAVA_LANG_OBJECT_MAYBE_NULL : - TypedReferenceValueFactory.REFERENCE_VALUE_JAVA_LANG_OBJECT_NOT_NULL; - } - - - /** - * Returns the most specific common superclass or interface of the given - * classes. - * @param class1 the first class. - * @param class2 the second class. - * @param interfaces specifies whether to look for a superclass or for an - * interface. - * @return the common class. - */ - private Clazz findCommonClass(Clazz class1, - Clazz class2, - boolean interfaces) - { - // Collect the superclasses or the interfaces of this class. - Set superClasses1 = new HashSet(); - class1.hierarchyAccept(!interfaces, - !interfaces, - interfaces, - false, - new ClassCollector(superClasses1)); - - int superClasses1Count = superClasses1.size(); - if (superClasses1Count == 0) - { - if (interfaces) - { - return null; - } - else if (class1.getSuperName() != null) - { - throw new IllegalArgumentException("Can't find any super classes of ["+class1.getName()+"] (not even immediate super class ["+class1.getSuperName()+"])"); - } - } - - // Collect the superclasses or the interfaces of the other class. - Set superClasses2 = new HashSet(); - class2.hierarchyAccept(!interfaces, - !interfaces, - interfaces, - false, - new ClassCollector(superClasses2)); - - int superClasses2Count = superClasses2.size(); - if (superClasses2Count == 0) - { - if (interfaces) - { - return null; - } - else if (class2.getSuperName() != null) - { - throw new IllegalArgumentException("Can't find any super classes of ["+class2.getName()+"] (not even immediate super class ["+class2.getSuperName()+"])"); - } - } - - if (DEBUG) - { - System.out.println("ReferenceValue.generalize this ["+class1.getName()+"] with other ["+class2.getName()+"] (interfaces = "+interfaces+")"); - System.out.println(" This super classes: "+superClasses1); - System.out.println(" Other super classes: "+superClasses2); - } - - // Find the common superclasses. - superClasses1.retainAll(superClasses2); - - if (DEBUG) - { - System.out.println(" Common super classes: "+superClasses1); - } - - if (interfaces && superClasses1.isEmpty()) - { - return null; - } - - // Find a class that is a subclass of all common superclasses, - // or that at least has the maximum number of common superclasses. - Clazz commonClass = null; - - int maximumSuperClassCount = -1; - - // Go over all common superclasses to find it. In case of - // multiple subclasses, keep the lowest one alphabetically, - // in order to ensure that the choice is deterministic. - Iterator commonSuperClasses = superClasses1.iterator(); - while (commonSuperClasses.hasNext()) - { - Clazz commonSuperClass = (Clazz)commonSuperClasses.next(); - - int superClassCount = superClassCount(commonSuperClass, superClasses1); - if (maximumSuperClassCount < superClassCount || - (maximumSuperClassCount == superClassCount && - commonClass != null && - commonClass.getName().compareTo(commonSuperClass.getName()) > 0)) - { - commonClass = commonSuperClass; - maximumSuperClassCount = superClassCount; - } - } - - if (commonClass == null) - { - // No common superclass could be found. This usually happens - // when classes are missing in the classpool due to incomplete - // configurations. - - // In case one of the two classes is java/lang/Object itself, - // or is a final class that extends java/lang/Object, we can - // safely assume that java/lang/Object must be the common - // superclass of both. - - for (Clazz clazz : Arrays.asList(class1, class2)) - { - if (ClassConstants.NAME_JAVA_LANG_OBJECT.equals(clazz.getName())) - { - commonClass = clazz; - break; - } - else if ((clazz.getAccessFlags() & ClassConstants.ACC_FINAL) != 0 && - ClassConstants.NAME_JAVA_LANG_OBJECT.equals(clazz.getSuperName())) - { - commonClass = clazz.getSuperClass(); - break; - } - } - } - - if (commonClass == null) - { - throw new IllegalArgumentException("Can't find common super class of ["+ - class1.getName() +"] (with "+superClasses1Count +" known super classes) and ["+ - class2.getName()+"] (with "+superClasses2Count+" known super classes)"); - } - - if (DEBUG) - { - System.out.println(" Best common class: ["+commonClass.getName()+"]"); - } - - return commonClass; - } - - - /** - * Returns the given reference value that may or may not be null, ensuring - * that it is a TypedReferenceValue, not a subclass. - */ - private static ReferenceValue typedReferenceValue(TypedReferenceValue referenceValue, - boolean mayBeExtension, - boolean mayBeNull) - { - return referenceValue.getClass() == TypedReferenceValue.class && - referenceValue.mayBeExtension == mayBeExtension ? - referenceValue.generalizeMayBeNull(mayBeNull) : - new TypedReferenceValue(referenceValue.type, - referenceValue.referencedClass, - mayBeExtension, - mayBeNull); - } - - - /** - * Returns if the number of superclasses of the given class in the given - * set of classes. - */ - private int superClassCount(Clazz subClass, Set classes) - { - int count = 0; - - Iterator iterator = classes.iterator(); - - while (iterator.hasNext()) - { - Clazz clazz = (Clazz)iterator.next(); - if (subClass.extendsOrImplements(clazz)) - { - count++; - } - } - - return count; - } - - - public int equal(TypedReferenceValue other) - { - return - this.type == null ? - other.type == null ? ALWAYS : - other.mayBeNull ? MAYBE : - NEVER : - other.type == null ? - this.mayBeNull ? MAYBE : - NEVER : - this.mayBeExtension || - other.mayBeExtension || - this.type.equals(other.type) ? MAYBE : - NEVER; - } - - -// // Implementations of binary ReferenceValue methods with -// // IdentifiedReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(IdentifiedReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // ArrayReferenceValue arguments. -// -// public ReferenceValue generalize(ArrayReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(ArrayReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // IdentifiedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) -// { -// return generalize((ArrayReferenceValue)other); -// } -// -// -// public int equal(IdentifiedArrayReferenceValue other) -// { -// return equal((ArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // DetailedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(DetailedArrayReferenceValue other) -// { -// return generalize((IdentifiedArrayReferenceValue)other); -// } -// -// -// public int equal(DetailedArrayReferenceValue other) -// { -// return equal((IdentifiedArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TracedReferenceValue arguments. -// -// public ReferenceValue generalize(TracedReferenceValue other) -// { -// return other.generalize(this); -// } -// -// -// public int equal(TracedReferenceValue other) -// { -// return other.equal(this); -// } - - - // Implementations for Value. - - public boolean isParticular() - { - return type == null; - } - - - public final String internalType() - { - return - type == null ? ClassConstants.TYPE_JAVA_LANG_OBJECT : - ClassUtil.isInternalArrayType(type) ? type : - ClassConstants.TYPE_CLASS_START + - type + - ClassConstants.TYPE_CLASS_END; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - if (this == object) - { - return true; - } - - if (!super.equals(object)) - { - return false; - } - - TypedReferenceValue other = (TypedReferenceValue)object; - return this.type == null ? other.type == null : - (this.mayBeExtension == other.mayBeExtension && - this.mayBeNull == other.mayBeNull && - this.type.equals(other.type)); - } - - - public int hashCode() - { - return this.getClass().hashCode() ^ - (type == null ? 0 : type.hashCode() ^ - (mayBeExtension ? 0 : 1) ^ - (mayBeNull ? 0 : 2)); - } - - - public String toString() - { - return type == null ? "n" : - type + - (referencedClass == null ? "?" : "") + - (mayBeExtension ? "" : "=") + - (mayBeNull ? "" : "!"); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TypedReferenceValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TypedReferenceValueFactory.java deleted file mode 100644 index d6311688..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/TypedReferenceValueFactory.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.*; - -/** - * This class provides methods to create and reuse Value objects. - * Its ReferenceValue objects have types. - * - * @author Eric Lafortune - */ -public class TypedReferenceValueFactory -extends BasicValueFactory -{ - static final ReferenceValue REFERENCE_VALUE_NULL = new TypedReferenceValue(null, null, false, true); - static final ReferenceValue REFERENCE_VALUE_JAVA_LANG_OBJECT_MAYBE_NULL = new TypedReferenceValue(ClassConstants.NAME_JAVA_LANG_OBJECT, null, true, true); - static final ReferenceValue REFERENCE_VALUE_JAVA_LANG_OBJECT_NOT_NULL = new TypedReferenceValue(ClassConstants.NAME_JAVA_LANG_OBJECT, null, true, false); - - - // Implementations for BasicValueFactory. - - public ReferenceValue createReferenceValueNull() - { - return REFERENCE_VALUE_NULL; - } - - - public ReferenceValue createReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - return type == null ? REFERENCE_VALUE_NULL : - !type.equals(ClassConstants.NAME_JAVA_LANG_OBJECT) || - !mayBeExtension ? new TypedReferenceValue(type, referencedClass, mayBeExtension, mayBeNull) : - mayBeNull ? REFERENCE_VALUE_JAVA_LANG_OBJECT_MAYBE_NULL : - REFERENCE_VALUE_JAVA_LANG_OBJECT_NOT_NULL; - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return createArrayReferenceValue(type, - referencedClass, - arrayLength, - createValue(type, - referencedClass, - true, - true)); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength, - Value elementValue) - { - return createReferenceValue(ClassConstants.TYPE_ARRAY + type, - referencedClass, - false, - false); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownDoubleValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownDoubleValue.java deleted file mode 100644 index 34807d1e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownDoubleValue.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This class represents a partially evaluated double value. - * - * @author Eric Lafortune - */ -public class UnknownDoubleValue extends DoubleValue -{ - // Basic unary methods. - - public DoubleValue negate() - { - return this; - } - - public IntegerValue convertToInteger() - { - return BasicValueFactory.INTEGER_VALUE; - } - - public LongValue convertToLong() - { - return BasicValueFactory.LONG_VALUE; - } - - public FloatValue convertToFloat() - { - return BasicValueFactory.FLOAT_VALUE; - } - - - // Basic binary methods. - - public DoubleValue generalize(DoubleValue other) - { - return this; - } - - public DoubleValue add(DoubleValue other) - { - return this; - } - - public DoubleValue subtract(DoubleValue other) - { - return this; - } - - public DoubleValue subtractFrom(DoubleValue other) - { - return this; - } - - public DoubleValue multiply(DoubleValue other) - { - return this; - } - - public DoubleValue divide(DoubleValue other) - { - return this; - } - - public DoubleValue divideOf(DoubleValue other) - { - return this; - } - - public DoubleValue remainder(DoubleValue other) - { - return this; - } - - public DoubleValue remainderOf(DoubleValue other) - { - return this; - } - - public IntegerValue compare(DoubleValue other) - { - return BasicValueFactory.INTEGER_VALUE; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } - - - public String toString() - { - return "d"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownFloatValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownFloatValue.java deleted file mode 100644 index 0891b756..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownFloatValue.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This class represents a partially evaluated float value. - * - * @author Eric Lafortune - */ -public class UnknownFloatValue extends FloatValue -{ - // Basic unary methods. - - public FloatValue negate() - { - return this; - } - - public IntegerValue convertToInteger() - { - return BasicValueFactory.INTEGER_VALUE; - } - - public LongValue convertToLong() - { - return BasicValueFactory.LONG_VALUE; - } - - public DoubleValue convertToDouble() - { - return BasicValueFactory.DOUBLE_VALUE; - } - - - // Basic binary methods. - - public FloatValue generalize(FloatValue other) - { - return this; - } - - public FloatValue add(FloatValue other) - { - return this; - } - - public FloatValue subtract(FloatValue other) - { - return this; - } - - public FloatValue subtractFrom(FloatValue other) - { - return this; - } - - public FloatValue multiply(FloatValue other) - { - return this; - } - - public FloatValue divide(FloatValue other) - { - return this; - } - - public FloatValue divideOf(FloatValue other) - { - return this; - } - - public FloatValue remainder(FloatValue other) - { - return this; - } - - public FloatValue remainderOf(FloatValue other) - { - return this; - } - - public IntegerValue compare(FloatValue other) - { - return BasicValueFactory.INTEGER_VALUE; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } - - - public String toString() - { - return "f"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownIntegerValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownIntegerValue.java deleted file mode 100644 index 9a04834e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownIntegerValue.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This class represents a partially evaluated integer value. - * - * @author Eric Lafortune - */ -public class UnknownIntegerValue extends IntegerValue -{ - // Basic unary methods. - - public IntegerValue negate() - { - return this; - } - - public IntegerValue convertToByte() - { - return this; - } - - public IntegerValue convertToCharacter() - { - return this; - } - - public IntegerValue convertToShort() - { - return this; - } - - public LongValue convertToLong() - { - return BasicValueFactory.LONG_VALUE; - } - - public FloatValue convertToFloat() - { - return BasicValueFactory.FLOAT_VALUE; - } - - public DoubleValue convertToDouble() - { - return BasicValueFactory.DOUBLE_VALUE; - } - - - // Basic binary methods. - - public IntegerValue generalize(IntegerValue other) - { - return this; - } - - - public IntegerValue add(IntegerValue other) - { - return this; - } - - public IntegerValue subtract(IntegerValue other) - { - return this; - } - - public IntegerValue subtractFrom(IntegerValue other) - { - return this; - } - - public IntegerValue multiply(IntegerValue other) - throws ArithmeticException - { - return this; - } - - public IntegerValue divide(IntegerValue other) - throws ArithmeticException - { - return this; - } - - public IntegerValue divideOf(IntegerValue other) - throws ArithmeticException - { - return this; - } - - public IntegerValue remainder(IntegerValue other) - throws ArithmeticException - { - return this; - } - - public IntegerValue remainderOf(IntegerValue other) - throws ArithmeticException - { - return this; - } - - public IntegerValue shiftLeft(IntegerValue other) - { - return this; - } - - public IntegerValue shiftLeftOf(IntegerValue other) - { - return this; - } - - public IntegerValue shiftRight(IntegerValue other) - { - return this; - } - - public IntegerValue shiftRightOf(IntegerValue other) - { - return this; - } - - public IntegerValue unsignedShiftRight(IntegerValue other) - { - return this; - } - - public IntegerValue unsignedShiftRightOf(IntegerValue other) - { - return this; - } - - public LongValue shiftLeftOf(LongValue other) - { - return BasicValueFactory.LONG_VALUE; - } - - public LongValue shiftRightOf(LongValue other) - { - return BasicValueFactory.LONG_VALUE; - } - - public LongValue unsignedShiftRightOf(LongValue other) - { - return BasicValueFactory.LONG_VALUE; - } - - public IntegerValue and(IntegerValue other) - { - return this; - } - - public IntegerValue or(IntegerValue other) - { - return this; - } - - public IntegerValue xor(IntegerValue other) - { - return this; - } - - public int equal(IntegerValue other) - { - return MAYBE; - } - - public int lessThan(IntegerValue other) - { - return MAYBE; - } - - public int lessThanOrEqual(IntegerValue other) - { - return MAYBE; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } - - - public String toString() - { - return "i"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownLongValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownLongValue.java deleted file mode 100644 index 3715aee5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownLongValue.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This class represents a partially evaluated long value. - * - * @author Eric Lafortune - */ -public class UnknownLongValue extends LongValue -{ - // Basic unary methods. - - public LongValue negate() - { - return this; - } - - public IntegerValue convertToInteger() - { - return BasicValueFactory.INTEGER_VALUE; - } - - public FloatValue convertToFloat() - { - return BasicValueFactory.FLOAT_VALUE; - } - - public DoubleValue convertToDouble() - { - return BasicValueFactory.DOUBLE_VALUE; - } - - - // Basic binary methods. - - public LongValue generalize(LongValue other) - { - return this; - } - - public LongValue add(LongValue other) - { - return this; - } - - public LongValue subtract(LongValue other) - { - return this; - } - - public LongValue subtractFrom(LongValue other) - { - return this; - } - - public LongValue multiply(LongValue other) - throws ArithmeticException - { - return this; - } - - public LongValue divide(LongValue other) - throws ArithmeticException - { - return this; - } - - public LongValue divideOf(LongValue other) - throws ArithmeticException - { - return this; - } - - public LongValue remainder(LongValue other) - throws ArithmeticException - { - return this; - } - - public LongValue remainderOf(LongValue other) - throws ArithmeticException - { - return this; - } - - public LongValue shiftLeft(IntegerValue other) - { - return this; - } - - public LongValue shiftRight(IntegerValue other) - { - return this; - } - - public LongValue unsignedShiftRight(IntegerValue other) - { - return this; - } - - public LongValue and(LongValue other) - { - return this; - } - - public LongValue or(LongValue other) - { - return this; - } - - public LongValue xor(LongValue other) - { - return this; - } - - public IntegerValue compare(LongValue other) - { - return BasicValueFactory.INTEGER_VALUE; - } - - - // Implementations for Object. - - public boolean equals(Object object) - { - return object != null && - this.getClass() == object.getClass(); - } - - - public int hashCode() - { - return this.getClass().hashCode(); - } - - - public String toString() - { - return "l"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownReferenceValue.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownReferenceValue.java deleted file mode 100644 index 02b4ee61..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/UnknownReferenceValue.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.*; - -/** - * This class represents a partially evaluated reference value. - * - * @author Eric Lafortune - */ -public class UnknownReferenceValue extends ReferenceValue -{ - // Implementations of unary methods of ReferenceValue. - - public String getType() - { - return ClassConstants.NAME_JAVA_LANG_OBJECT; - } - - public Clazz getReferencedClass() - { - return null; - } - - - public boolean mayBeExtension() - { - return true; - } - - - public int isNull() - { - return MAYBE; - } - - public int instanceOf(String otherType, Clazz otherReferencedClass) - { - return MAYBE; - } - - public ReferenceValue cast(String type, Clazz referencedClass, ValueFactory valueFactory, boolean alwaysCast) - { - return valueFactory.createReferenceValue(type, - referencedClass, - true, - true); - } - - - // Implementations of binary methods of ReferenceValue. - - public ReferenceValue generalize(ReferenceValue other) - { - return other.generalize(this); - } - - public int equal(ReferenceValue other) - { - return other.equal(this); - } - - -// // Implementations of binary ReferenceValue methods with -// // UnknownReferenceValue arguments. -// -// public ReferenceValue generalize(UnknownReferenceValue other) -// { -// return other; -// } -// -// -// public int equal(UnknownReferenceValue other) -// { -// return MAYBE; -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TypedReferenceValue arguments. -// -// public ReferenceValue generalize(TypedReferenceValue other) -// { -// } -// -// -// public int equal(TypedReferenceValue other) -// { -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // IdentifiedReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(IdentifiedReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // ArrayReferenceValue arguments. -// -// public ReferenceValue generalize(ArrayReferenceValue other) -// { -// return generalize((TypedReferenceValue)other); -// } -// -// -// public int equal(ArrayReferenceValue other) -// { -// return equal((TypedReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // IdentifiedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) -// { -// return generalize((ArrayReferenceValue)other); -// } -// -// -// public int equal(IdentifiedArrayReferenceValue other) -// { -// return equal((ArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // DetailedArrayReferenceValue arguments. -// -// public ReferenceValue generalize(DetailedArrayReferenceValue other) -// { -// return generalize((IdentifiedArrayReferenceValue)other); -// } -// -// -// public int equal(DetailedArrayReferenceValue other) -// { -// return equal((IdentifiedArrayReferenceValue)other); -// } -// -// -// // Implementations of binary ReferenceValue methods with -// // TracedReferenceValue arguments. -// -// public ReferenceValue generalize(TracedReferenceValue other) -// { -// return other.generalize(this); -// } -// -// -// public int equal(TracedReferenceValue other) -// { -// return other.equal(this); -// } - - - // Implementations for Value. - - public boolean isParticular() - { - return false; - } - - - public final String internalType() - { - return ClassConstants.TYPE_JAVA_LANG_OBJECT; - } - - - // Implementations for Object. - - public String toString() - { - return "a"; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Value.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Value.java deleted file mode 100644 index 30ac6487..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/Value.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -/** - * This abstract class represents a partially evaluated value. - * - * @author Eric Lafortune - */ -public abstract class Value -{ - public static final int NEVER = -1; - public static final int MAYBE = 0; - public static final int ALWAYS = 1; - - public static final int TYPE_INTEGER = 1; - public static final int TYPE_LONG = 2; - public static final int TYPE_FLOAT = 3; - public static final int TYPE_DOUBLE = 4; - public static final int TYPE_REFERENCE = 5; - public static final int TYPE_INSTRUCTION_OFFSET = 6; - public static final int TYPE_TOP = 7; - - - /** - * Returns this Value as a Category1Value. - */ - public Category1Value category1Value() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a Category 1 value [" + this.getClass().getName() + "]"); - } - - /** - * Returns this Value as a Category2Value. - */ - public Category2Value category2Value() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a Category 2 value [" + this.getClass().getName() + "]"); - } - - - /** - * Returns this Value as an IntegerValue. - */ - public IntegerValue integerValue() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not an integer value [" + this.getClass().getName() + "]"); - } - - /** - * Returns this Value as a LongValue. - */ - public LongValue longValue() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a long value [" + this.getClass().getName() + "]"); - } - - /** - * Returns this Value as a FloatValue. - */ - public FloatValue floatValue() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a float value [" + this.getClass().getName() + "]"); - } - - /** - * Returns this Value as a DoubleValue. - */ - public DoubleValue doubleValue() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a double value [" + this.getClass().getName() + "]"); - } - - /** - * Returns this Value as a ReferenceValue. - */ - public ReferenceValue referenceValue() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a reference value [" + this.getClass().getName() + "]"); - } - - /** - * Returns this Value as an InstructionOffsetValue. - */ - public InstructionOffsetValue instructionOffsetValue() - { - throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not an instruction offset value [" + this.getClass().getName() + "]"); - } - - - /** - * Returns whether this Value represents a single specific (but possibly - * unknown) value. - */ - public boolean isSpecific() - { - return false; - } - - - /** - * Returns whether this Value represents a single particular (known) - * value. - */ - public boolean isParticular() - { - return false; - } - - - /** - * Returns the generalization of this Value and the given other Value. - */ - public abstract Value generalize(Value other); - - - /** - * Returns whether the computational type of this Value is a category 2 type. - * This means that it takes up the space of two category 1 types on the - * stack, for instance. - */ - public abstract boolean isCategory2(); - - - /** - * Returns the computational type of this Value. - * @return TYPE_INTEGER, - * TYPE_LONG, - * TYPE_FLOAT, - * TYPE_DOUBLE, - * TYPE_REFERENCE, or - * TYPE_INSTRUCTION_OFFSET. - */ - public abstract int computationalType(); - - - /** - * Returns the internal type of this Value. - * @return ClassConstants.TYPE_BOOLEAN, - * ClassConstants.TYPE_BYTE, - * ClassConstants.TYPE_CHAR, - * ClassConstants.TYPE_SHORT, - * ClassConstants.TYPE_INT, - * ClassConstants.TYPE_LONG, - * ClassConstants.TYPE_FLOAT, - * ClassConstants.TYPE_DOUBLE, - * ClassConstants.TYPE_CLASS_START ... ClassConstants.TYPE_CLASS_END, or - * an array type containing any of these types (always as String). - */ - public abstract String internalType(); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ValueFactory.java deleted file mode 100644 index edadfebc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/ValueFactory.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.evaluation.value; - -import proguard.classfile.Clazz; - -/** - * This interface provides methods to create Value objects. - * - * @author Eric Lafortune - */ -public interface ValueFactory -{ - /** - * Creates a new Value of the given type. - * The type must be a fully specified internal type for primitives, classes, - * or arrays. - */ - public Value createValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull); - - - /** - * Creates a new IntegerValue with an undefined value. - */ - public IntegerValue createIntegerValue(); - - - /** - * Creates a new IntegerValue with a given particular value. - */ - public IntegerValue createIntegerValue(int value); - - - /** - * Creates a new LongValue with an undefined value. - */ - public LongValue createLongValue(); - - - /** - * Creates a new LongValue with a given particular value. - */ - public LongValue createLongValue(long value); - - - /** - * Creates a new FloatValue with an undefined value. - */ - public FloatValue createFloatValue(); - - - /** - * Creates a new FloatValue with a given particular value. - */ - public FloatValue createFloatValue(float value); - - - /** - * Creates a new DoubleValue with an undefined value. - */ - public DoubleValue createDoubleValue(); - - - /** - * Creates a new DoubleValue with a given particular value. - */ - public DoubleValue createDoubleValue(double value); - - - /** - * Creates a new ReferenceValue of an undefined type. - */ - public ReferenceValue createReferenceValue(); - - - /** - * Creates a new ReferenceValue that represents null. - */ - public ReferenceValue createReferenceValueNull(); - - - /** - * Creates a new ReferenceValue that represents the given type. The type - * must be an internal class name or an array type. If the type is - * null, the ReferenceValue represents null. - */ - public ReferenceValue createReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull); - - - /** - * Creates a new ReferenceValue that represents a non-null array with - * elements of the given type, with the given length. - */ - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength); - - - /** - * Creates a new ReferenceValue that represents a non-null array with - * elements of the given type, with the given length and initial element - * values. - */ - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength, - Value elementValue); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/package.html deleted file mode 100644 index 71e1b136..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/evaluation/value/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains classes that represent partial evaluation values. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/CascadingDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/CascadingDataEntryWriter.java deleted file mode 100644 index bd013398..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/CascadingDataEntryWriter.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -/** - * This DataEntryWriter delegates to a given DataEntryWriter, or failing that, - * to another given DataEntryWriter. - * - * @author Eric Lafortune - */ -public class CascadingDataEntryWriter implements DataEntryWriter -{ - private DataEntryWriter dataEntryWriter1; - private DataEntryWriter dataEntryWriter2; - - - /** - * Creates a new CascadingDataEntryWriter. - * @param dataEntryWriter1 the DataEntryWriter to which the writing will be - * delegated first. - * @param dataEntryWriter2 the DataEntryWriter to which the writing will be - * delegated, if the first one can't provide an - * output stream. - */ - public CascadingDataEntryWriter(DataEntryWriter dataEntryWriter1, - DataEntryWriter dataEntryWriter2) - { - this.dataEntryWriter1 = dataEntryWriter1; - this.dataEntryWriter2 = dataEntryWriter2; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - // Try to create a directory with the first data entry writer, or - // otherwise with the second data entry writer. - return dataEntryWriter1.createDirectory(dataEntry) || - dataEntryWriter2.createDirectory(dataEntry); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - return dataEntryWriter1.sameOutputStream(dataEntry1, dataEntry2) || - dataEntryWriter2.sameOutputStream(dataEntry1, dataEntry2); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - // Try to get an output stream from the first data entry writer. - OutputStream outputStream = - dataEntryWriter1.createOutputStream(dataEntry); - - // Return it, if it's not null. Otherwise try to get an output stream - // from the second data entry writer. - return outputStream != null ? - outputStream : - dataEntryWriter2.createOutputStream(dataEntry); - } - - - public void close() throws IOException - { - dataEntryWriter1.close(); - dataEntryWriter2.close(); - - dataEntryWriter1 = null; - dataEntryWriter2 = null; - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "CascadingDataEntryWriter"); - dataEntryWriter1.println(pw, prefix + " "); - dataEntryWriter2.println(pw, prefix + " "); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassDataEntryWriter.java deleted file mode 100644 index df76f41d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassDataEntryWriter.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.*; -import proguard.classfile.io.ProgramClassWriter; - -import java.io.*; - -/** - * This DataEntryWriter finds received class entries in the given class pool - * and writes them out to the given data entry writer. For resource entries, - * it returns valid output streams. For class entries, it returns output - * streams that must not be used. - * - * @see IdleRewriter - * @author Eric Lafortune - */ -public class ClassDataEntryWriter implements DataEntryWriter -{ - private final ClassPool classPool; - private final DataEntryWriter dataEntryWriter; - - - /** - * Creates a new ClassDataEntryWriter. - * @param classPool the class pool in which classes are found. - * @param dataEntryWriter the writer to which the class file is written. - */ - public ClassDataEntryWriter(ClassPool classPool, - DataEntryWriter dataEntryWriter) - { - this.classPool = classPool; - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createDirectory(dataEntry); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - return dataEntryWriter.sameOutputStream(dataEntry1, dataEntry2); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - String inputName = dataEntry.getName(); - - // Is it a class entry? - String name = dataEntry.getName(); - if (name.endsWith(ClassConstants.CLASS_FILE_EXTENSION)) - { - // Does it still have a corresponding class? - String className = inputName.substring(0, inputName.length() - ClassConstants.CLASS_FILE_EXTENSION.length()); - Clazz clazz = classPool.getClass(className); - if (clazz != null) - { - // Rename the data entry if necessary. - String newClassName = clazz.getName(); - if (!className.equals(newClassName)) - { - dataEntry = new RenamedDataEntry(dataEntry, newClassName + ClassConstants.CLASS_FILE_EXTENSION); - } - - // Get the output stream for this input entry. - OutputStream outputStream = dataEntryWriter.createOutputStream(dataEntry); - if (outputStream != null) - { - // Write the class to the output stream. - DataOutputStream classOutputStream = new DataOutputStream(outputStream); - try - { - clazz.accept(new ProgramClassWriter(classOutputStream)); - } - catch (RuntimeException e) - { - throw (RuntimeException)new RuntimeException("Unexpected error while writing class ["+className+"] ("+e.getMessage()+")").initCause(e); - } - finally - { - classOutputStream.close(); - } - } - } - - // Return a dummy, non-null output stream (to work with cascading - // output writers). - return new FilterOutputStream(null); - } - - // Delegate for resource entries. - return dataEntryWriter.createOutputStream(dataEntry); - } - - - public void close() throws IOException - { - // Close the delegate writer. - dataEntryWriter.close(); - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "ClassDataEntryWriter"); - dataEntryWriter.println(pw, prefix + " "); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassFilter.java deleted file mode 100644 index 99b78eac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassFilter.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; -import proguard.util.ExtensionMatcher; - - -/** - * This DataEntryReader delegates to one of two other DataEntryReader instances, - * depending on the extension of the data entry. - * - * @author Eric Lafortune - */ -public class ClassFilter extends FilteredDataEntryReader -{ - /** - * Creates a new ClassFilter that delegates reading classes to the - * given reader. - */ - public ClassFilter(DataEntryReader classReader) - { - this(classReader, null); - } - - - /** - * Creates a new ClassFilter that delegates to either of the two given - * readers. - */ - public ClassFilter(DataEntryReader classReader, - DataEntryReader dataEntryReader) - { - super(new DataEntryNameFilter( - new ExtensionMatcher(ClassConstants.CLASS_FILE_EXTENSION)), - classReader, - dataEntryReader); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassMapDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassMapDataEntryWriter.java deleted file mode 100644 index 77160267..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassMapDataEntryWriter.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -import java.io.*; -import java.util.Iterator; - - -/** - * This DataEntryWriter writes a class mapping to the given data entry, used - * for debugging of the configuration. - * - * Syntax of the mapping file (one line per class): - * - * originalClassName,newClassName,hasObfuscatedMethods,hasObfuscatedFields - * - * hasObfuscatedMethods and hasObfuscatedFields can either take the value - * 0 (false) or 1 (true). - * - * @author Johan Leys - */ -public class ClassMapDataEntryWriter -extends SimplifiedVisitor -implements DataEntryWriter, - - // Implementation interfaces. - MemberVisitor -{ - private final ClassPool programClassPool; - - private final DataEntryWriter dataEntryWriter; - - private boolean obfuscatedMethods = false; - private boolean obfuscatedFields = false; - - - public ClassMapDataEntryWriter(ClassPool programClassPool, - DataEntryWriter dataEntryWriter ) - { - this.programClassPool = programClassPool; - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public void close() throws IOException - { - dataEntryWriter.close(); - } - - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createDirectory(dataEntry); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, DataEntry dataEntry2) throws IOException - { - return dataEntryWriter.sameOutputStream(dataEntry1, dataEntry2); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - OutputStream os = dataEntryWriter.createOutputStream(dataEntry); - PrintWriter writer = new PrintWriter(new OutputStreamWriter(os)); - writeClassMap(writer, programClassPool); - writer.close(); - return os; - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "ClassMapDataEntryWriter"); - dataEntryWriter.println(pw, prefix + " "); - } - - - // Private utility methods. - - private void writeClassMap(PrintWriter writer, ClassPool classPool) - { - Iterator iterator = classPool.classNames(); - while (iterator.hasNext()) - { - String className = (String)iterator.next(); - - StringBuilder builder = new StringBuilder(); - - builder.append(ClassUtil.externalClassName(className)); - builder.append(","); - - ProgramClass clazz = (ProgramClass)classPool.getClass(className); - builder.append(ClassUtil.externalClassName(clazz.getName())); - builder.append(","); - - boolean hasRemovedMethods = (clazz.u2accessFlags & ClassConstants.ACC_REMOVED_METHODS) != 0; - builder.append(hasRemovedMethods || hasObfuscatedMethods(clazz) ? 1 : 0); - builder.append(","); - - boolean hasRemovedFields = (clazz.u2accessFlags & ClassConstants.ACC_REMOVED_FIELDS) != 0; - builder.append(hasRemovedFields || hasObfuscatedFields(clazz) ? 1 : 0); - writer.println(builder.toString()); - } - } - - - private boolean hasObfuscatedMethods(ProgramClass clazz) - { - obfuscatedMethods = false; - clazz.methodsAccept(this); - return obfuscatedMethods; - } - - - private boolean hasObfuscatedFields(ProgramClass clazz) - { - obfuscatedFields = false; - clazz.fieldsAccept(this); - return obfuscatedFields; - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - obfuscatedMethods |= (programMethod.getAccessFlags() & ClassConstants.ACC_RENAMED) != 0; - } - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - obfuscatedFields |= (programField.getAccessFlags() & ClassConstants.ACC_RENAMED) != 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassPathDataEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassPathDataEntry.java deleted file mode 100644 index df1046fb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassPathDataEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -import static proguard.classfile.ClassConstants.CLASS_FILE_EXTENSION; -import static proguard.classfile.util.ClassUtil.internalClassName; - -/** - * DataEntry implementation which loads an input stream from the classpath of - * the running VM. - * - * @author Johan Leys - */ -public class ClassPathDataEntry implements DataEntry -{ - private final String name; - - private InputStream inputStream; - - - /** - * Creas an new ClassPathDataEntry for the given class. - * - * @param clazz the class for which to create a data entry. - */ - public ClassPathDataEntry(Class clazz) - { - this(internalClassName(clazz.getName()) + CLASS_FILE_EXTENSION); - } - - - /** - * Creates a new ClassPathDataEntry for the entry with the given name. - * - * @param name the name of the class for which to create a data entry. - */ - public ClassPathDataEntry(String name) - { - this.name = name; - } - - - // Implementations for DataEntry. - - public String getName() - { - return name; - } - - - public String getOriginalName() - { - return name; - } - - - public long getSize() - { - return -1; - } - - - public boolean isDirectory() - { - return false; - } - - - public InputStream getInputStream() throws IOException - { - if (inputStream == null) - { - inputStream = getClass().getClassLoader().getResourceAsStream(name); - } - return inputStream; - } - - - public void closeInputStream() throws IOException - { - inputStream.close(); - inputStream = null; - } - - - public DataEntry getParent() - { - return null; - } - - - // Implementations for Object. - - public String toString() - { - return getName(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassReader.java deleted file mode 100644 index ac288a5a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ClassReader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.*; -import proguard.classfile.io.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; - -import java.io.*; - -/** - * This DataEntryReader applies a given ClassVisitor to the class - * definitions that it reads. - *

- * Class files are read as ProgramClass objects or LibraryClass objects, - * depending on the isLibrary flag. - *

- * In case of libraries, only public classes are considered, if the - * skipNonPublicLibraryClasses flag is set. - * - * @author Eric Lafortune - */ -public class ClassReader implements DataEntryReader -{ - private final boolean isLibrary; - private final boolean skipNonPublicLibraryClasses; - private final boolean skipNonPublicLibraryClassMembers; - private final WarningPrinter warningPrinter; - private final ClassVisitor classVisitor; - - - /** - * Creates a new DataEntryClassFilter for reading the specified - * Clazz objects. - */ - public ClassReader(boolean isLibrary, - boolean skipNonPublicLibraryClasses, - boolean skipNonPublicLibraryClassMembers, - WarningPrinter warningPrinter, - ClassVisitor classVisitor) - { - this.isLibrary = isLibrary; - this.skipNonPublicLibraryClasses = skipNonPublicLibraryClasses; - this.skipNonPublicLibraryClassMembers = skipNonPublicLibraryClassMembers; - this.warningPrinter = warningPrinter; - this.classVisitor = classVisitor; - } - - - // Implementations for DataEntryReader. - - public void read(DataEntry dataEntry) throws IOException - { - try - { - // Get the input stream. - InputStream inputStream = dataEntry.getInputStream(); - - // Wrap it into a data input stream. - DataInputStream dataInputStream = new DataInputStream(inputStream); - - // Create a Clazz representation. - Clazz clazz; - if (isLibrary) - { - clazz = new LibraryClass(); - clazz.accept(new LibraryClassReader(dataInputStream, skipNonPublicLibraryClasses, skipNonPublicLibraryClassMembers)); - } - else - { - clazz = new ProgramClass(); - clazz.accept(new ProgramClassReader(dataInputStream)); - } - - // Apply the visitor, if we have a real class. - String className = clazz.getName(); - if (className != null) - { - String dataEntryName = dataEntry.getName(); - if (!dataEntryName.equals("module-info.class") && - !dataEntryName.replace(File.pathSeparatorChar, ClassConstants.PACKAGE_SEPARATOR).equals(className + ClassConstants.CLASS_FILE_EXTENSION) && - warningPrinter != null) - { - warningPrinter.print(className, - "Warning: class [" + dataEntry.getName() + "] unexpectedly contains class [" + ClassUtil.externalClassName(className) + "]"); - } - - clazz.accept(classVisitor); - } - - dataEntry.closeInputStream(); - } - catch (Exception ex) - { - throw (IOException)new IOException("Can't process class ["+dataEntry.getName()+"] ("+ex.getMessage()+")").initCause(ex); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntry.java deleted file mode 100644 index 09d1b988..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntry.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -/** - * This interface describes a data entry, e.g. a ZIP entry, a file, or a - * directory. - * - * @author Eric Lafortune - */ -public interface DataEntry -{ - /** - * Returns the name of this data entry. - */ - public String getName(); - - - /** - * Returns the original name of this data entry, i.e. the name of the - * data entry before any renaming or obfuscation. - */ - public String getOriginalName(); - - - /** - * Returns the size of this data entry, in bytes, or -1 if unknown. - */ - public long getSize(); - - - /** - * Returns whether the data entry represents a directory. - */ - public boolean isDirectory(); - - - /** - * Returns an input stream for reading the content of this data entry. - * The data entry may not represent a directory. - */ - public InputStream getInputStream() throws IOException; - - - /** - * Closes the previously retrieved InputStream. - */ - public void closeInputStream() throws IOException; - - - /** - * Returns the parent of this data entry, or null if it doesn't - * have one. - */ - public DataEntry getParent(); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryClassWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryClassWriter.java deleted file mode 100644 index 36cf77ab..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryClassWriter.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.*; -import proguard.classfile.io.ProgramClassWriter; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -import java.io.*; - -/** - * This ClassVisitor writes out the ProgramClass objects that it visits to the - * given DataEntry, modified to have the correct name. - * - * @author Eric Lafortune - */ -public class DataEntryClassWriter -extends SimplifiedVisitor -implements ClassVisitor -{ - private final DataEntryWriter dataEntryWriter; - private final DataEntry templateDataEntry; - - - /** - * Creates a new DataEntryClassWriter for writing to the given - * DataEntryWriter, based on the given template DataEntry. - */ - public DataEntryClassWriter(DataEntryWriter dataEntryWriter, - DataEntry templateDataEntry) - { - this.dataEntryWriter = dataEntryWriter; - this.templateDataEntry = templateDataEntry; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Rename the data entry if necessary. - String actualClassName = programClass.getName(); - DataEntry actualDataEntry = - new RenamedDataEntry(templateDataEntry, - actualClassName + ClassConstants.CLASS_FILE_EXTENSION); - - try - { - // Get the output entry corresponding to this input entry. - OutputStream outputStream = dataEntryWriter.createOutputStream(actualDataEntry); - if (outputStream != null) - { - // Write the class to the output entry. - DataOutputStream classOutputStream = new DataOutputStream(outputStream); - try - { - new ProgramClassWriter(classOutputStream).visitProgramClass(programClass); - } - finally - { - classOutputStream.close(); - } - } - } - catch (IOException e) - { - throw new RuntimeException("Can't write program class ["+actualClassName+"] to ["+actualDataEntry+"] ("+e.getMessage()+")", e); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryCopier.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryCopier.java deleted file mode 100644 index 7674b3d5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryCopier.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; -import proguard.util.ExtensionMatcher; - -import java.io.*; - -/** - * This DataEntryReader writes the ZIP entries and files that it reads to a - * given DataEntryWriter. - * - * @author Eric Lafortune - */ -public class DataEntryCopier implements DataEntryReader -{ - private static final int BUFFER_SIZE = 1024; - - private final DataEntryWriter dataEntryWriter; - private final byte[] buffer = new byte[BUFFER_SIZE]; - - - /** - * Creates a new DataEntryCopier. - */ - public DataEntryCopier(DataEntryWriter dataEntryWriter) - { - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryReader. - - public void read(DataEntry dataEntry) throws IOException - { - try - { - if (dataEntry.isDirectory()) - { - dataEntryWriter.createDirectory(dataEntry); - } - else - { - // Get the output entry corresponding to this input entry. - OutputStream outputStream = dataEntryWriter.createOutputStream(dataEntry); - if (outputStream != null) - { - try - { - InputStream inputStream = dataEntry.getInputStream(); - - try - { - // Copy the data from the input entry to the output entry. - copyData(inputStream, outputStream); - - // Flush the output stream, just to be sure. - outputStream.flush(); - } - finally - { - // Close the input stream. - dataEntry.closeInputStream(); - } - } - finally - { - // Close the output stream. - outputStream.close(); - } - } - } - } - catch (IOException ex) - { - System.err.println("Warning: can't write resource [" + dataEntry.getName() + "] (" + ex.getMessage() + ")"); - } - catch (Exception ex) - { - throw (IOException)new IOException("Can't write resource ["+dataEntry.getName()+"] ("+ex.getMessage()+")").initCause(ex); - } - } - - - /** - * Copies all data that it can read from the given input stream to the - * given output stream. The caller of this method will open and - * afterwards flush and close the input stream and the output stream. - * The implementation of this method needs to make sure that any wrapping - * output streams are flushed before returning. - */ - protected void copyData(InputStream inputStream, - OutputStream outputStream) - throws IOException - { - while (true) - { - int count = inputStream.read(buffer); - if (count < 0) - { - break; - } - outputStream.write(buffer, 0, count); - } - } - - - /** - * A main method for testing file/archive/directory copying. - */ - public static void main(String[] args) - { - try - { - String input = args[0]; - String output = args[1]; - - boolean outputIsApk = output.endsWith(".apk") || - output.endsWith(".ap_"); - boolean outputIsJar = output.endsWith(".jar"); - boolean outputIsAar = output.endsWith(".aar"); - boolean outputIsWar = output.endsWith(".war"); - boolean outputIsEar = output.endsWith(".ear"); - boolean outputIsJmod = output.endsWith(".jmod"); - boolean outputIsZip = output.endsWith(".zip"); - - DataEntryWriter writer = new DirectoryWriter(new File(output), - outputIsApk || - outputIsJar || - outputIsAar || - outputIsWar || - outputIsEar || - outputIsJmod || - outputIsZip); - - // Zip up any zips, if necessary. - DataEntryWriter zipWriter = new JarWriter(writer); - if (outputIsZip) - { - // Always zip. - writer = zipWriter; - } - else - { - // Only zip up zips. - writer = new FilteredDataEntryWriter(new DataEntryParentFilter( - new DataEntryNameFilter( - new ExtensionMatcher(".zip"))), - zipWriter, - writer); - } - - // Zip up any jmods, if necessary. - DataEntryWriter jmodWriter = new JarWriter(ClassConstants.JMOD_HEADER, writer); - if (outputIsJmod) - { - // Always zip. - writer = jmodWriter; - } - else - { - // Only zip up jmods. - writer = new FilteredDataEntryWriter(new DataEntryParentFilter( - new DataEntryNameFilter( - new ExtensionMatcher(".jmod"))), - jmodWriter, - writer); - } - - // Zip up any wars, if necessary. - DataEntryWriter warWriter = new JarWriter(writer); - if (outputIsWar) - { - // Always zip. - writer = warWriter; - } - else - { - // Only zip up wars. - writer = new FilteredDataEntryWriter(new DataEntryParentFilter( - new DataEntryNameFilter( - new ExtensionMatcher(".war"))), - warWriter, - writer); - } - - // Zip up any aars, if necessary. - DataEntryWriter aarWriter = new JarWriter(writer); - if (outputIsWar) - { - // Always zip. - writer = aarWriter; - } - else - { - // Only zip up aars. - writer = new FilteredDataEntryWriter(new DataEntryParentFilter( - new DataEntryNameFilter( - new ExtensionMatcher(".aar"))), - aarWriter, - writer); - } - - // Zip up any jars, if necessary. - DataEntryWriter jarWriter = new JarWriter(writer); - if (outputIsJar) - { - // Always zip. - writer = jarWriter; - } - else - { - // Only zip up jars. - writer = new FilteredDataEntryWriter(new DataEntryParentFilter( - new DataEntryNameFilter( - new ExtensionMatcher(".jar"))), - jarWriter, - writer); - } - - // Zip up any apks, if necessary. - DataEntryWriter apkWriter = new JarWriter(writer); - if (outputIsApk) - { - // Always zip. - writer = apkWriter; - } - else - { - // Only zip up apks. - writer = new FilteredDataEntryWriter(new DataEntryParentFilter( - new DataEntryNameFilter( - new ExtensionMatcher(".apk"))), - apkWriter, - writer); - } - - - // Create the copying DataEntryReader. - DataEntryReader reader = new DataEntryCopier(writer); - - boolean inputIsApk = input.endsWith(".apk") || - input.endsWith(".ap_"); - boolean inputIsJar = input.endsWith(".jar"); - boolean inputIsAar = input.endsWith(".aar"); - boolean inputIsWar = input.endsWith(".war"); - boolean inputIsEar = input.endsWith(".ear"); - boolean inputIsJmod = input.endsWith(".jmod"); - boolean inputIsZip = input.endsWith(".zip"); - - // Unzip any apks, if necessary. - DataEntryReader apkReader = new JarReader(reader); - if (inputIsApk) - { - // Always unzip. - reader = apkReader; - } - else - { - // Only unzip apk entries. - reader = new FilteredDataEntryReader(new DataEntryNameFilter( - new ExtensionMatcher(".apk")), - apkReader, - reader); - - // Unzip any jars, if necessary. - DataEntryReader jarReader = new JarReader(reader); - if (inputIsJar) - { - // Always unzip. - reader = jarReader; - } - else - { - // Only unzip jar entries. - reader = new FilteredDataEntryReader(new DataEntryNameFilter( - new ExtensionMatcher(".jar")), - jarReader, - reader); - - // Unzip any aars, if necessary. - DataEntryReader aarReader = new JarReader(reader); - if (inputIsAar) - { - // Always unzip. - reader = aarReader; - } - else - { - // Only unzip aar entries. - reader = new FilteredDataEntryReader(new DataEntryNameFilter( - new ExtensionMatcher(".aar")), - aarReader, - reader); - - // Unzip any wars, if necessary. - DataEntryReader warReader = new JarReader(reader); - if (inputIsWar) - { - // Always unzip. - reader = warReader; - } - else - { - // Only unzip war entries. - reader = new FilteredDataEntryReader(new DataEntryNameFilter( - new ExtensionMatcher(".war")), - warReader, - reader); - - // Unzip any ears, if necessary. - DataEntryReader earReader = new JarReader(reader); - if (inputIsEar) - { - // Always unzip. - reader = earReader; - } - else - { - // Only unzip ear entries. - reader = new FilteredDataEntryReader(new DataEntryNameFilter( - new ExtensionMatcher(".ear")), - earReader, - reader); - - // Unzip any jmods, if necessary. - DataEntryReader jmodReader = new JarReader(reader, true); - if (inputIsJmod) - { - // Always unzip. - reader = jmodReader; - } - else - { - // Only unzip jmod entries. - reader = new FilteredDataEntryReader(new DataEntryNameFilter( - new ExtensionMatcher(".jmod")), - jmodReader, - reader); - - // Unzip any zips, if necessary. - DataEntryReader zipReader = new JarReader(reader); - if (inputIsZip) - { - // Always unzip. - reader = zipReader; - } - else - { - // Only unzip zip entries. - reader = new FilteredDataEntryReader(new DataEntryNameFilter( - new ExtensionMatcher(".zip")), - zipReader, - reader); - } - } - } - } - } - } - } - - DirectoryPump directoryReader = new DirectoryPump(new File(input)); - - directoryReader.pumpDataEntries(reader); - - writer.close(); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryDirectoryFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryDirectoryFilter.java deleted file mode 100644 index 62f9904c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryDirectoryFilter.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -/** - * This DataEntryFilter filters data entries based on whether they represent - * directories. - * - * @author Eric Lafortune - */ -public class DataEntryDirectoryFilter -implements DataEntryFilter -{ - // Implementations for DataEntryFilter. - - public boolean accepts(DataEntry dataEntry) - { - return dataEntry != null && dataEntry.isDirectory(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryFilter.java deleted file mode 100644 index 1bc5d7f2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryFilter.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - - -/** - * This interface provides a method to filter data entries. - * - * @author Eric Lafortune - */ -public interface DataEntryFilter -{ - /** - * Checks whether the filter accepts the given data entry. - * @param dataEntry the data entry to filter. - * @return a boolean indicating whether the filter accepts the given data - * entry. - */ - public boolean accepts(DataEntry dataEntry); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryNameFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryNameFilter.java deleted file mode 100644 index 9dd97f0b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryNameFilter.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.util.StringMatcher; - -/** - * This DataEntryFilter filters data entries based on whether their names match - * a given StringMatcher. - * - * @author Eric Lafortune - */ -public class DataEntryNameFilter -implements DataEntryFilter -{ - private final StringMatcher stringMatcher; - - - /** - * Creates a new DataEntryNameFilter. - * @param stringMatcher the string matcher that will be applied to the names - * of the filtered data entries. - */ - public DataEntryNameFilter(StringMatcher stringMatcher) - { - this.stringMatcher = stringMatcher; - } - - - // Implementations for DataEntryFilter. - - public boolean accepts(DataEntry dataEntry) - { - return dataEntry != null && stringMatcher.matches(dataEntry.getName()); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryParentFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryParentFilter.java deleted file mode 100644 index e2be6f94..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryParentFilter.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -/** - * This DataEntryFilter delegates filtering to a DataEntryFilter for its parent. - * - * @author Eric Lafortune - */ -public class DataEntryParentFilter -implements DataEntryFilter -{ - private final DataEntryFilter dataEntryFilter; - - - /** - * Creates a new ParentFilter. - * @param dataEntryFilter the filter that will be applied to the data - * entry's parent. - */ - public DataEntryParentFilter(DataEntryFilter dataEntryFilter) - { - this.dataEntryFilter = dataEntryFilter; - } - - - // Implementations for DataEntryFilter. - - public boolean accepts(DataEntry dataEntry) - { - return dataEntry != null && dataEntryFilter.accepts(dataEntry.getParent()); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryPump.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryPump.java deleted file mode 100644 index e6448574..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryPump.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.IOException; - - -/** - * This interface provides a method to pump data entries. The implementation - * determines the source and the type of the data entries. Typical examples - * are zip entries coming from a zip file of file entries coming from a - * directory structure. The reader can for instance collect the classes, - * or copy the resource files that are presented. - * - * @author Eric Lafortune - */ -public interface DataEntryPump -{ - /** - * Applies the given DataEntryReader to all data entries that the - * implementation can provide. - */ - public void pumpDataEntries(DataEntryReader dataEntryReader) - throws IOException; -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryReader.java deleted file mode 100644 index 5dd1701a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryReader.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.IOException; - - -/** - * This interface provides methods for reading data entries. The implementation - * determines what to do with the read data, if anything. - * - * @author Eric Lafortune - */ -public interface DataEntryReader -{ - /** - * Reads the given data entry. - */ - public void read(DataEntry dataEntry) throws IOException; -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryRewriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryRewriter.java deleted file mode 100644 index f9117dd3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryRewriter.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.*; - -import java.io.*; -import java.nio.charset.Charset; - -/** - * This DataEntryReader writes the resource data entries that it reads to a - * given DataEntryWriter, updating their contents based on the renamed classes - * in the given ClassPool. - * - * @author Eric Lafortune - */ -public class DataEntryRewriter extends DataEntryCopier -{ - private final ClassPool classPool; - private final Charset charset; - - - /** - * Creates a new DataEntryRewriter. - */ - public DataEntryRewriter(ClassPool classPool, - Charset charset, - DataEntryWriter dataEntryWriter) - { - super(dataEntryWriter); - - this.classPool = classPool; - this.charset = charset; - } - - - // Implementations for DataEntryCopier. - - protected void copyData(InputStream inputStream, - OutputStream outputStream) - throws IOException - { - Reader reader = new BufferedReader(new InputStreamReader(inputStream, charset)); - Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset)); - - copyData(reader, writer); - - writer.flush(); - } - - - /** - * Copies all data that it can read from the given reader to the given - * writer. - */ - protected void copyData(Reader reader, - Writer writer) - throws IOException - { - StringBuffer word = new StringBuffer(); - - while (true) - { - int i = reader.read(); - if (i < 0) - { - break; - } - - // Is the character part of a word? - char c = (char)i; - if (Character.isJavaIdentifierPart(c) || - c == '.' || - c == '-') - { - // Collect the characters in this word. - word.append(c); - } - else - { - // Write out the updated word, if any. - writeUpdatedWord(writer, word.toString()); - word.setLength(0); - - // Write out the character that terminated it. - writer.write(c); - } - } - - // Write out the final word. - writeUpdatedWord(writer, word.toString()); - } - - - // Small utility methods. - - /** - * Writes the given word to the given writer, after having adapted it, - * based on the renamed class names. - */ - private void writeUpdatedWord(Writer writer, String word) - throws IOException - { - if (word.length() > 0) - { - String newWord = word; - - boolean containsDots = word.indexOf('.') >= 0; - - // Replace dots by forward slashes. - String className = containsDots ? - word.replace('.', ClassConstants.PACKAGE_SEPARATOR) : - word; - - // Find the class corresponding to the word. - Clazz clazz = classPool.getClass(className); - if (clazz != null) - { - // Update the word if necessary. - String newClassName = clazz.getName(); - if (!className.equals(newClassName)) - { - // Replace forward slashes by dots. - newWord = containsDots ? - newClassName.replace(ClassConstants.PACKAGE_SEPARATOR, '.') : - newClassName; - } - } - - writer.write(newWord); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryWriter.java deleted file mode 100644 index 819a5d41..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DataEntryWriter.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -/** - * This interface provides methods for writing data entries, such as ZIP entries - * or files. The implementation determines to which type of data entry the - * data will be written. - * - * @author Eric Lafortune - */ -public interface DataEntryWriter -{ - /** - * Creates a directory. - * @param dataEntry the data entry for which the directory is to be created. - * @return whether the directory has been created. - */ - public boolean createDirectory(DataEntry dataEntry) throws IOException; - - - /** - * Returns whether the two given data entries would result in the same - * output stream. - * @param dataEntry1 the first data entry. - * @param dataEntry2 the second data entry. - */ - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) throws IOException; - - - /** - * Creates a new output stream for writing data. The caller is responsible - * for closing the stream. - * @param dataEntry the data entry for which the output stream is to be - * created. - * @return the output stream. The stream may be null to - * indicate that the data entry should not be written. - */ - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException; - - - /** - * Finishes writing all data entries. - */ - public void close() throws IOException; - - - /** - * Prints out the structure of the data entry writer. - * @param pw the print stream to which the structure should be printed. - * @param prefix a prefix for every printed line. - */ - public void println(PrintWriter pw, String prefix); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryFilter.java deleted file mode 100644 index 1cc5aea0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryFilter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -/** - * This DataEntryReader delegates to one of two other DataEntryReader instances, - * depending on whether the data entry represents a directory or not. - * - * @author Eric Lafortune - */ -public class DirectoryFilter extends FilteredDataEntryReader -{ - /** - * Creates a new ClassFilter that delegates reading directories to the - * given reader. - */ - public DirectoryFilter(DataEntryReader directoryReader) - { - this (directoryReader, null); - } - - - /** - * Creates a new ClassFilter that delegates to either of the two given - * readers. - */ - public DirectoryFilter(DataEntryReader directoryReader, - DataEntryReader otherReader) - { - super(new DataEntryDirectoryFilter(), - directoryReader, - otherReader); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryPump.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryPump.java deleted file mode 100644 index cfab9746..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryPump.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - - -/** - * This class can read a given file or directory, recursively, applying a given - * DataEntryReader to all files it comes across. - * - * @author Eric Lafortune - */ -public class DirectoryPump implements DataEntryPump -{ - private final File directory; - - - public DirectoryPump(File directory) - { - this.directory = directory; - } - - - // Implementations for DataEntryPump. - - public void pumpDataEntries(DataEntryReader dataEntryReader) - throws IOException - { - if (!directory.exists()) - { - throw new IOException("No such file or directory: " + directory); - } - - readFiles(directory, dataEntryReader); - } - - - /** - * Reads the given subdirectory recursively, applying the given DataEntryReader - * to all files that are encountered. - */ - private void readFiles(File file, DataEntryReader dataEntryReader) - throws IOException - { - // Pass the file data entry to the reader. - dataEntryReader.read(new FileDataEntry(directory, file)); - - if (file.isDirectory()) - { - // Recurse into the subdirectory. - File[] listedFiles = file.listFiles(); - - for (int index = 0; index < listedFiles.length; index++) - { - File listedFile = listedFiles[index]; - try - { - readFiles(listedFile, dataEntryReader); - } - catch (IOException e) - { - throw new IOException("Can't read ["+listedFile.getName()+"] ("+e.getMessage()+")", e); - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryWriter.java deleted file mode 100644 index dfedcef7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/DirectoryWriter.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; - -import java.io.*; - -/** - * This DataEntryWriter writes data entries to individual files in a given - * directory. - * - * @author Eric Lafortune - */ -public class DirectoryWriter implements DataEntryWriter -{ - private final File baseFile; - private final boolean isFile; - - - /** - * Creates a new DirectoryWriter. - * @param baseFile the base directory to which all files will be written. - */ - public DirectoryWriter(File baseFile, - boolean isFile) - { - this.baseFile = baseFile; - this.isFile = isFile; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - File directory = getFile(dataEntry); - if (!directory.exists() && - !directory.mkdirs()) - { - throw new IOException("Can't create directory [" + directory.getPath() + "]"); - } - - return true; - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - return getFile(dataEntry1).equals(getFile(dataEntry2)); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - File file = getFile(dataEntry); - - // Make sure the parent directories exist. - File parentDirectory = file.getParentFile(); - if (parentDirectory != null && - !parentDirectory.exists() && - !parentDirectory.mkdirs()) - { - throw new IOException("Can't create directory [" + parentDirectory.getPath() + "]"); - } - - return - new BufferedOutputStream( - new FileOutputStream(file)); - } - - - public void close() throws IOException - { - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "DirectoryWriter (base " + (isFile?"file ":"directory") + " ["+baseFile+"])"); - } - - - // Small utility methods. - - /** - * Returns the file for the given data entry. - */ - private File getFile(DataEntry dataEntry) - { - // Use the specified file, or construct a new file. - return isFile ? - baseFile : - new File(baseFile, - dataEntry.getName().replace(ClassConstants.PACKAGE_SEPARATOR, - File.separatorChar)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ExtraDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ExtraDataEntryWriter.java deleted file mode 100644 index fcfd9b32..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ExtraDataEntryWriter.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.util.MultiValueMap; - -import java.io.*; -import java.util.*; - -/** - * This DataEntryWriter writes out all data entries to a delegate - * DataEntryWriter, inserting additional data entries that are attached - * to the written data entry. The output stream of the additional data - * entry is not used. - * - * @author Eric Lafortune - */ -public class ExtraDataEntryWriter implements DataEntryWriter -{ - private final MultiValueMap extraEntryNameMap; - private final Set extraEntryNamesWritten = new HashSet(); - - private final DataEntryWriter dataEntryWriter; - private final DataEntryWriter extraDataEntryWriter; - - private final String entrySuffix; - - /** - * Creates a new ExtraDataEntryWriter that writes one given extra data entry - * together with the first data entry that is written. - * - * @param extraEntryName the name of the extra data entry. - * @param dataEntryWriter the writer to which the entries are - * written, including the extra data entry. - */ - public ExtraDataEntryWriter(String extraEntryName, - DataEntryWriter dataEntryWriter) - { - this(extraEntryName, dataEntryWriter, dataEntryWriter); - } - - - /** - * Creates a new ExtraDataEntryWriter that writes one given extra data entry - * together with the first data entry that is written. - * - * @param extraEntryName the name of the extra data entry. - * @param dataEntryWriter the writer to which the entries are - * written. - * @param extraDataEntryWriter the writer to which the extra data entry - * will be written. - */ - public ExtraDataEntryWriter(String extraEntryName, - DataEntryWriter dataEntryWriter, - DataEntryWriter extraDataEntryWriter) - { - this(new MultiValueMap(), - dataEntryWriter, - extraDataEntryWriter, - null); - extraEntryNameMap.put(null, extraEntryName); - } - - /** - * Creates a new ExtraDataEntryWriter. - * - * @param extraEntryNameMap a map with data entry names and their - * associated extra data entries. An extra - * data entry that is associated with multiple - * entries is only written once. - * @param dataEntryWriter the writer to which the entries are - * written. - * @param extraDataEntryWriter the writer to which the extra data entry - * will be written. - * @param entrySuffix an optional file suffix. It is stripped - * from the entry name when looking up the - * entry in the map, and added to all extra - * entry names. - */ - public ExtraDataEntryWriter(MultiValueMap extraEntryNameMap, - DataEntryWriter dataEntryWriter, - DataEntryWriter extraDataEntryWriter, - String entrySuffix ) - { - this.extraEntryNameMap = extraEntryNameMap; - this.dataEntryWriter = dataEntryWriter; - this.extraDataEntryWriter = extraDataEntryWriter; - this.entrySuffix = entrySuffix; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createDirectory(dataEntry); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - return dataEntryWriter.sameOutputStream(dataEntry1, dataEntry2); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - // Write all default extra entries. - writeExtraEntries(dataEntry, null); - - // Write all extra entries attached to the current data entry. - writeExtraEntries(dataEntry); - - // Delegate to write out the actual entry. - return dataEntryWriter.createOutputStream(dataEntry); - } - - - private void writeExtraEntries(DataEntry dataEntry) throws IOException - { - String mapKey = dataEntry.getName(); - if (entrySuffix != null && mapKey.endsWith(entrySuffix)) - { - mapKey = mapKey.substring(0, mapKey.length() - entrySuffix.length()); - } - - writeExtraEntries(dataEntry, mapKey); - } - - - private void writeExtraEntries(DataEntry dataEntry, - String key) throws IOException - { - Set extraEntryNames = extraEntryNameMap.get(key); - if (extraEntryNames != null) - { - for (String extraEntryName : extraEntryNames) - { - if (!extraEntryNamesWritten.contains(extraEntryName)) - { - String fullEntryName = entrySuffix != null ? extraEntryName + entrySuffix : extraEntryName; - RenamedDataEntry extraEntry = new RenamedDataEntry(dataEntry, fullEntryName); - extraDataEntryWriter.createOutputStream(extraEntry); - extraEntryNamesWritten.add(extraEntryName); - writeExtraEntries(extraEntry); - } - } - } - } - - public void close() throws IOException - { - dataEntryWriter.close(); - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "ExtraDataEntryWriter"); - dataEntryWriter.println(pw, prefix + " "); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/FileDataEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/FileDataEntry.java deleted file mode 100644 index a5309106..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/FileDataEntry.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; - -import java.io.*; - -/** - * This DataEntry represents a file. - * - * @author Eric Lafortune - */ -public class FileDataEntry implements DataEntry -{ - private final File directory; - private final File file; - private InputStream inputStream; - - - public FileDataEntry(File directory, - File file) - { - this.directory = directory; - this.file = file; - } - - - /** - * Returns the complete file, including its directory. - */ - public File getFile() - { - return file.equals(directory) ? - file : - new File(directory, getRelativeFilePath()); - } - - - // Implementations for DataEntry. - - public String getName() - { - // Chop the directory name from the file name and get the right separators. - return file.equals(directory) ? - file.getName() : - getRelativeFilePath(); - } - - - /** - * Returns the file path of this data entry, relative to the base directory. - * If the file equals the base directory, an empty string is returned. - */ - private String getRelativeFilePath() - { - return file.equals(directory) ? - "" : - file.getPath() - .substring(directory.getPath().length() + File.separator.length()) - .replace(File.separatorChar, ClassConstants.PACKAGE_SEPARATOR); - } - - - public String getOriginalName() - { - return getName(); - } - - - public long getSize() - { - return file.length(); - } - - - public boolean isDirectory() - { - return file.isDirectory(); - } - - - public InputStream getInputStream() throws IOException - { - if (inputStream == null) - { - inputStream = new BufferedInputStream(new FileInputStream(file)); - } - - return inputStream; - } - - - public void closeInputStream() throws IOException - { - inputStream.close(); - inputStream = null; - } - - - public DataEntry getParent() - { - return null; - } - - - // Implementations for Object. - - public String toString() - { - return getName(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/FilteredDataEntryReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/FilteredDataEntryReader.java deleted file mode 100644 index f5426bb8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/FilteredDataEntryReader.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.IOException; - - -/** - * This DataEntryReader delegates to one of two other DataEntryReader instances, - * depending on whether the data entry passes through a given data entry filter - * or not. - * - * @author Eric Lafortune - */ -public class FilteredDataEntryReader implements DataEntryReader -{ - private final DataEntryFilter dataEntryFilter; - private final DataEntryReader acceptedDataEntryReader; - private final DataEntryReader rejectedDataEntryReader; - - - /** - * Creates a new FilteredDataEntryReader with only a reader for accepted - * data entries. - * @param dataEntryFilter the data entry filter. - * @param acceptedDataEntryReader the DataEntryReader to which the reading - * will be delegated if the filter accepts - * the data entry. May be null. - */ - public FilteredDataEntryReader(DataEntryFilter dataEntryFilter, - DataEntryReader acceptedDataEntryReader) - { - this(dataEntryFilter, acceptedDataEntryReader, null); - } - - - /** - * Creates a new FilteredDataEntryReader. - * @param dataEntryFilter the data entry filter. - * @param acceptedDataEntryReader the DataEntryReader to which the reading - * will be delegated if the filter accepts - * the data entry. May be null. - * @param rejectedDataEntryReader the DataEntryReader to which the reading - * will be delegated if the filter does not - * accept the data entry. May be - * null. - */ - public FilteredDataEntryReader(DataEntryFilter dataEntryFilter, - DataEntryReader acceptedDataEntryReader, - DataEntryReader rejectedDataEntryReader) - { - this.dataEntryFilter = dataEntryFilter; - this.acceptedDataEntryReader = acceptedDataEntryReader; - this.rejectedDataEntryReader = rejectedDataEntryReader; - } - - - // Implementations for DataEntryReader. - - public void read(DataEntry dataEntry) - throws IOException - { - DataEntryReader dataEntryReader = dataEntryFilter.accepts(dataEntry) ? - acceptedDataEntryReader : - rejectedDataEntryReader; - - if (dataEntryReader != null) - { - dataEntryReader.read(dataEntry); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/FilteredDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/FilteredDataEntryWriter.java deleted file mode 100644 index 59bcb5a8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/FilteredDataEntryWriter.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -/** - * This DataEntryWriter delegates to one of two other DataEntryWriter instances, - * depending on whether the data entry passes through a given data entry filter - * or not. - * - * @author Eric Lafortune - */ -public class FilteredDataEntryWriter implements DataEntryWriter -{ - private final DataEntryFilter dataEntryFilter; - private DataEntryWriter acceptedDataEntryWriter; - private DataEntryWriter rejectedDataEntryWriter; - - - /** - * Creates a new FilteredDataEntryWriter with only a writer for accepted - * data entries. - * @param dataEntryFilter the data entry filter. - * @param acceptedDataEntryWriter the DataEntryWriter to which the writing - * will be delegated if the filter accepts - * the data entry. May be null. - */ - public FilteredDataEntryWriter(DataEntryFilter dataEntryFilter, - DataEntryWriter acceptedDataEntryWriter) - { - this(dataEntryFilter, acceptedDataEntryWriter, null); - } - - - /** - * Creates a new FilteredDataEntryWriter. - * @param dataEntryFilter the data entry filter. - * @param acceptedDataEntryWriter the DataEntryWriter to which the writing - * will be delegated if the filter accepts - * the data entry. May be null. - * @param rejectedDataEntryWriter the DataEntryWriter to which the writing - * will be delegated if the filter does not - * accept the data entry. May be - * null. - */ - public FilteredDataEntryWriter(DataEntryFilter dataEntryFilter, - DataEntryWriter acceptedDataEntryWriter, - DataEntryWriter rejectedDataEntryWriter) - { - this.dataEntryFilter = dataEntryFilter; - this.acceptedDataEntryWriter = acceptedDataEntryWriter; - this.rejectedDataEntryWriter = rejectedDataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - // Get the right data entry writer. - DataEntryWriter dataEntryWriter = dataEntryFilter.accepts(dataEntry) ? - acceptedDataEntryWriter : - rejectedDataEntryWriter; - - // Delegate to it, if it's not null. - return dataEntryWriter != null && - dataEntryWriter.createDirectory(dataEntry); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - boolean accepts1 = dataEntryFilter.accepts(dataEntry1); - boolean accepts2 = dataEntryFilter.accepts(dataEntry2); - return - accepts1 ? !accepts2 || acceptedDataEntryWriter == null || acceptedDataEntryWriter.sameOutputStream(dataEntry1, dataEntry2) : - accepts2 || rejectedDataEntryWriter == null || rejectedDataEntryWriter.sameOutputStream(dataEntry1, dataEntry2); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - // Get the right data entry writer. - DataEntryWriter dataEntryWriter = dataEntryFilter.accepts(dataEntry) ? - acceptedDataEntryWriter : - rejectedDataEntryWriter; - - // Delegate to it, if it's not null. - return dataEntryWriter != null ? - dataEntryWriter.createOutputStream(dataEntry) : - null; - } - - - public void close() throws IOException - { - if (acceptedDataEntryWriter != null) - { - acceptedDataEntryWriter.close(); - acceptedDataEntryWriter = null; - } - - if (rejectedDataEntryWriter != null) - { - rejectedDataEntryWriter.close(); - rejectedDataEntryWriter = null; - } - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "FilteredDataEntryWriter (filter = "+dataEntryFilter+")"); - if (acceptedDataEntryWriter != null) - { - acceptedDataEntryWriter.println(pw, prefix + " "); - } - if (rejectedDataEntryWriter != null) - { - rejectedDataEntryWriter.println(pw, prefix + " "); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/Finisher.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/Finisher.java deleted file mode 100644 index 52eaedf3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/Finisher.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.IOException; - -/** - * This interface specifies a listener that is called to finish an output stream - * before it is closed. - * - * @author Eric Lafortune - */ -public interface Finisher -{ - /** - * Finishes an output stream right before it is closed. - */ - public void finish() throws IOException; -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/IdleRewriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/IdleRewriter.java deleted file mode 100644 index 11e1ee21..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/IdleRewriter.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.IOException; - -/** - * This DataEntryReader reads data entries and requests their corresponding - * output streams from a given DataEntryWriter, without actually using the - * output stream. - * - * @author Eric Lafortune - */ -public class IdleRewriter implements DataEntryReader -{ - private final DataEntryWriter dataEntryWriter; - - - public IdleRewriter(DataEntryWriter dataEntryWriter) - { - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryReader. - - public void read(DataEntry dataEntry) throws IOException - { - // Get the output entry corresponding to this input entry, but don't - // even try to close it. - dataEntryWriter.createOutputStream(dataEntry); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/JarReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/JarReader.java deleted file mode 100644 index 89e03fa9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/JarReader.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.IOException; -import java.util.zip.*; - -/** - * This DataEntryReader lets a given DataEntryReader read all data entries of - * the read jar/war/zip data entries. - * - * @author Eric Lafortune - */ -public class JarReader implements DataEntryReader -{ - private final DataEntryReader dataEntryReader; - private final boolean jmod; - - - /** - * Creates a new JarReader that doesn't read jmods. - */ - public JarReader(DataEntryReader dataEntryReader) - { - this(dataEntryReader, false); - } - - - /** - * Creates a new JarReader. - */ - public JarReader(DataEntryReader dataEntryReader, - boolean jmod) - { - this.dataEntryReader = dataEntryReader; - this.jmod = jmod; - } - - - // Implementation for DataEntryReader. - - public void read(DataEntry dataEntry) throws IOException - { - if (jmod) - { - // Eat the magic bytes - dataEntry.getInputStream().read(new byte[4]); - } - - ZipInputStream zipInputStream = new ZipInputStream(dataEntry.getInputStream()); - - try - { - // Get all entries from the input jar. - while (true) - { - // Can we get another entry? - ZipEntry zipEntry = zipInputStream.getNextEntry(); - if (zipEntry == null) - { - break; - } - - // Delegate the actual reading to the data entry reader. - dataEntryReader.read(new ZipDataEntry(dataEntry, - zipEntry, - zipInputStream)); - } - } - finally - { - dataEntry.closeInputStream(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/JarWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/JarWriter.java deleted file mode 100644 index 82f668f3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/JarWriter.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; - -import java.io.*; -import java.util.Date; - -/** - * This DataEntryWriter sends data entries to a the jar/zip files specified by - * their parents. - * - * @author Eric Lafortune - */ -public class JarWriter implements DataEntryWriter -{ - private final byte[] header; - private final int modificationTime; - private final DataEntryWriter dataEntryWriter; - - private DataEntry currentParentEntry; - private ZipOutput currentZipOutput; - - - /** - * Creates a new JarWriter. - * @param dataEntryWriter the data entry writer that can provide - * output streams for the jar/zip archives. - */ - public JarWriter(DataEntryWriter dataEntryWriter) - { - this(null, dataEntryWriter); - } - - - /** - * Creates a new JarWriter. - * @param header an optional header for the jar file. - * @param dataEntryWriter the data entry writer that can provide - * output streams for the jar/zip archives. - */ - public JarWriter(byte[] header, - DataEntryWriter dataEntryWriter) - { - this(header, currentTime(), dataEntryWriter); - } - - - /** - * Creates a new JarWriter. - * @param header an optional header for the jar file. - * @param modificationTime the modification date and time of the zip - * entries, in DOS format. - * @param dataEntryWriter the data entry writer that can provide - * output streams for the jar/zip archives. - */ - public JarWriter(byte[] header, - int modificationTime, - DataEntryWriter dataEntryWriter) - { - this.header = header; - this.modificationTime = modificationTime; - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - finishIfNecessary(dataEntry); - setUp(dataEntry); - - // Did we get a zip output? - if (currentZipOutput == null) - { - return false; - } - - // Get the directory entry name. - String name = dataEntry.getName() + ClassConstants.PACKAGE_SEPARATOR; - - // Create a new directory entry. - OutputStream outputStream = - currentZipOutput.createOutputStream(name, - false, - modificationTime); - outputStream.close(); - - return true; - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - return dataEntry1 != null && - dataEntry2 != null && - dataEntry1.getName().equals(dataEntry2.getName()) && - dataEntryWriter.sameOutputStream(dataEntry1.getParent(), - dataEntry2.getParent()); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - finishIfNecessary(dataEntry); - setUp(dataEntry); - - // Did we get a zip output? - if (currentZipOutput == null) - { - return null; - } - - // Create a new zip entry. - return currentZipOutput.createOutputStream(dataEntry.getName(), - true, - modificationTime); - } - - - public void close() throws IOException - { - finish(); - - // Close the delegate writer. - dataEntryWriter.close(); - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "JarWriter"); - dataEntryWriter.println(pw, prefix + " "); - } - - - // Small utility methods. - - /** - * Sets up the zip output for the given parent entry. - */ - protected void setUp(DataEntry dataEntry) throws IOException - { - if (currentZipOutput == null) - { - // Create a new zip output. - currentParentEntry = dataEntry.getParent(); - currentZipOutput = new ZipOutput(dataEntryWriter.createOutputStream(currentParentEntry), - header, - null, - 1); - } - } - - - private void finishIfNecessary(DataEntry dataEntry) throws IOException - { - // Would the new data entry end up in a different jar? - if (currentParentEntry != null && - !dataEntryWriter.sameOutputStream(currentParentEntry, dataEntry.getParent())) - { - finish(); - } - } - - - /** - * Closes the zip output, if any. - */ - protected void finish() throws IOException - { - // Finish the zip output, if any. - if (currentZipOutput != null) - { - // Close the zip output and its underlying output stream. - currentZipOutput.close(); - - currentParentEntry = null; - currentZipOutput = null; - } - } - - - /** - * Returns the current time in DOS format. - */ - private static int currentTime() - { - // Convert the current time into DOS date and time. - Date currentDate = new Date(); - return - (currentDate.getYear() - 80) << 25 | - (currentDate.getMonth() + 1) << 21 | - currentDate.getDate() << 16 | - currentDate.getHours() << 11 | - currentDate.getMinutes() << 5 | - currentDate.getSeconds() >> 1; - }} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ManifestRewriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ManifestRewriter.java deleted file mode 100644 index 7fbe315e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ManifestRewriter.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassPool; - -import java.io.*; -import java.nio.charset.Charset; - -/** - * This DataEntryReader writes the manifest data entries that it reads to a - * given DataEntryWriter, updating their contents based on the renamed classes - * in the given ClassPool. - * - * @author Eric Lafortune - */ -public class ManifestRewriter extends DataEntryRewriter -{ - /** - * Creates a new ManifestRewriter. - */ - public ManifestRewriter(ClassPool classPool, - Charset charset, - DataEntryWriter dataEntryWriter) - { - super(classPool, charset, dataEntryWriter); - } - - - // Implementations for DataEntryRewriter. - - protected void copyData(Reader reader, - Writer writer) - throws IOException - { - super.copyData(new SplitLineReader(reader), - new SplitLineWriter(writer)); - } - - - /** - * This Reader reads manifest files, joining any split lines. It replaces - * the allowed CR/LF/CR+LF alternatives by simple LF in the process. - */ - private static class SplitLineReader extends FilterReader - { - private static final int NONE = -2; - - private int bufferedCharacter = NONE; - - - public SplitLineReader(Reader reader) - { - super(reader); - } - - - // Implementations for Reader. - - public int read() throws IOException - { - while (true) - { - // Get the buffered character or the first character. - int c1 = bufferedCharacter != NONE ? - bufferedCharacter : - super.read(); - - // Clear the buffered character. - bufferedCharacter = NONE; - - // Return it if it's an ordinary character. - if (c1 != '\n' && c1 != '\r') - { - return c1; - } - - // It's a newline. Read the second character to see if it's a - // continuation. - int c2 = super.read(); - - // Skip any corresponding, redundant \n or \r. - if ((c2 == '\n' || c2 == '\r') && c1 != c2) - { - c2 = super.read(); - } - - // Isn't it a continuation after all? - if (c2 != ' ') - { - // Buffer the second character and return a newline. - bufferedCharacter = c2; - return '\n'; - } - - // Just continue after the continuation characters. - } - } - - - public int read(char[] cbuf, int off, int len) throws IOException - { - // Delegate to reading a single character at a time. - int count = 0; - while (count < len) - { - int c = read(); - if (c == -1) - { - break; - } - - cbuf[off + count++] = (char)c; - } - - return count; - } - - - public long skip(long n) throws IOException - { - // Delegate to reading a single character at a time. - int count = 0; - while (count < n) - { - int c = read(); - if (c == -1) - { - break; - } - - count++; - } - - return count; - } - } - - - /** - * This Writer writes manifest files, splitting any long lines. - */ - private static class SplitLineWriter extends FilterWriter - { - private int counter = 0; - - - public SplitLineWriter(Writer writer) - { - super(writer); - } - - - // Implementations for Reader. - - public void write(int c) throws IOException - { - // TODO: We should actually count the Utf-8 bytes, not the characters. - if (c == '\n') - { - // Reset the character count. - counter = 0; - } - else if (counter == 70) - { - // Insert a newline and a space. - super.write('\n'); - super.write(' '); - - counter = 2; - } - else - { - counter++; - } - - super.write(c); - } - - - public void write(char[] cbuf, int off, int len) throws IOException - { - for (int count = 0; count < len; count++) - { - write(cbuf[off + count]); - } - } - - - public void write(String str, int off, int len) throws IOException - { - write(str.toCharArray(), off, len); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/NameFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/NameFilter.java deleted file mode 100644 index f7caaeb8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/NameFilter.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.util.*; - -import java.util.List; - -/** - * This DataEntryReader delegates to one of two other DataEntryReader instances, - * depending on the name of the data entry. - * - * @author Eric Lafortune - */ -public class NameFilter extends FilteredDataEntryReader -{ - /** - * Creates a new NameFilter that delegates to the given reader, depending - * on the given list of filters. - */ - public NameFilter(String regularExpression, - DataEntryReader acceptedDataEntryReader) - { - this(regularExpression, acceptedDataEntryReader, null); - } - - - /** - * Creates a new NameFilter that delegates to either of the two given - * readers, depending on the given list of filters. - */ - public NameFilter(String regularExpression, - DataEntryReader acceptedDataEntryReader, - DataEntryReader rejectedDataEntryReader) - { - super(new DataEntryNameFilter(new ListParser(new FileNameParser()).parse(regularExpression)), - acceptedDataEntryReader, - rejectedDataEntryReader); - } - - - /** - * Creates a new NameFilter that delegates to the given reader, depending - * on the given list of filters. - */ - public NameFilter(List regularExpressions, - DataEntryReader acceptedDataEntryReader) - { - this(regularExpressions, acceptedDataEntryReader, null); - } - - - /** - * Creates a new NameFilter that delegates to either of the two given - * readers, depending on the given list of filters. - */ - public NameFilter(List regularExpressions, - DataEntryReader acceptedDataEntryReader, - DataEntryReader rejectedDataEntryReader) - { - super(new DataEntryNameFilter(new ListParser(new FileNameParser()).parse(regularExpressions)), - acceptedDataEntryReader, - rejectedDataEntryReader); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/NameFilteredDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/NameFilteredDataEntryWriter.java deleted file mode 100644 index b006c155..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/NameFilteredDataEntryWriter.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.util.*; - -import java.util.List; - -/** - * This DataEntryWriter delegates to one of two other DataEntryWriter instances, - * depending on the name of the data entry. - * - * @author Eric Lafortune - */ -public class NameFilteredDataEntryWriter extends FilteredDataEntryWriter -{ - /** - * Creates a new NameFilteredDataEntryWriter that delegates to the given - * writer, depending on the given list of filters. - */ - public NameFilteredDataEntryWriter(String regularExpression, - DataEntryWriter acceptedDataEntryWriter) - { - this(regularExpression, acceptedDataEntryWriter, null); - } - - - /** - * Creates a new NameFilteredDataEntryWriter that delegates to either of - * the two given writers, depending on the given list of filters. - */ - public NameFilteredDataEntryWriter(String regularExpression, - DataEntryWriter acceptedDataEntryWriter, - DataEntryWriter rejectedDataEntryWriter) - { - this(new ListParser(new FileNameParser()).parse(regularExpression), - acceptedDataEntryWriter, - rejectedDataEntryWriter); - } - - - /** - * Creates a new NameFilteredDataEntryWriter that delegates to the given - * writer, depending on the given list of filters. - */ - public NameFilteredDataEntryWriter(List regularExpressions, - DataEntryWriter acceptedDataEntryWriter) - { - this(regularExpressions, acceptedDataEntryWriter, null); - } - - - /** - * Creates a new NameFilteredDataEntryWriter that delegates to either of - * the two given writers, depending on the given list of filters. - */ - public NameFilteredDataEntryWriter(List regularExpressions, - DataEntryWriter acceptedDataEntryWriter, - DataEntryWriter rejectedDataEntryWriter) - { - this(new ListParser(new FileNameParser()).parse(regularExpressions), - acceptedDataEntryWriter, - rejectedDataEntryWriter); - } - - - /** - * Creates a new NameFilteredDataEntryWriter that delegates to the given - * writer, depending on the given string matcher. - */ - public NameFilteredDataEntryWriter(StringMatcher stringMatcher, - DataEntryWriter acceptedDataEntryWriter) - { - this(stringMatcher, acceptedDataEntryWriter, null); - } - - - /** - * Creates a new NameFilteredDataEntryWriter that delegates to either of - * the two given writers, depending on the given string matcher. - */ - public NameFilteredDataEntryWriter(StringMatcher stringMatcher, - DataEntryWriter acceptedDataEntryWriter, - DataEntryWriter rejectedDataEntryWriter) - { - super(new DataEntryNameFilter(stringMatcher), - acceptedDataEntryWriter, - rejectedDataEntryWriter); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ParentDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ParentDataEntryWriter.java deleted file mode 100644 index 1d066351..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ParentDataEntryWriter.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -/** - * This DataEntryWriter lets another DataEntryWriter write the parent data - * entries. - * - * @author Eric Lafortune - */ -public class ParentDataEntryWriter implements DataEntryWriter -{ - private DataEntryWriter dataEntryWriter; - - - /** - * Creates a new ParentDataEntryWriter. - * @param dataEntryWriter the DataEntryWriter to which the writing will be - * delegated, passing the data entries' parents. - */ - public ParentDataEntryWriter(DataEntryWriter dataEntryWriter) - { - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createDirectory(dataEntry.getParent()); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - return dataEntryWriter.sameOutputStream(dataEntry1.getParent(), - dataEntry2.getParent()); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createOutputStream(dataEntry.getParent()); - } - - - public void close() throws IOException - { - dataEntryWriter.close(); - dataEntryWriter = null; - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "ParentDataEntryWriter"); - dataEntryWriter.println(pw, prefix + " "); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/PrefixAddingDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/PrefixAddingDataEntryWriter.java deleted file mode 100644 index 2afdfbf1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/PrefixAddingDataEntryWriter.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -/** - * This DataEntryWriter delegates to a given DataEntryWriter, each time - * adding a prefix of the written data entry name. - * - * @author Eric Lafortune - */ -public class PrefixAddingDataEntryWriter implements DataEntryWriter -{ - private final String prefix; - private final DataEntryWriter dataEntryWriter; - - - /** - * Creates a new PrefixAddingDataEntryWriter. - */ - public PrefixAddingDataEntryWriter(String prefix, - DataEntryWriter dataEntryWriter) - { - this.prefix = prefix; - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) - throws IOException - { - return dataEntryWriter.createDirectory(renamedDataEntry(dataEntry)); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, - DataEntry dataEntry2) - throws IOException - { - return dataEntryWriter.sameOutputStream(renamedDataEntry(dataEntry1), - renamedDataEntry(dataEntry2)); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) - throws IOException - { - return dataEntryWriter.createOutputStream(renamedDataEntry(dataEntry)); - } - - - public void close() throws IOException - { - dataEntryWriter.close(); - } - - - public void println(PrintWriter pw, String prefix) - { - pw.println(prefix + "PrefixAddingDataEntryWriter (prefix = "+prefix+")"); - dataEntryWriter.println(pw, prefix + " "); - } - - - // Small utility methods. - - /** - * Adds the prefix to the given data entry name. - */ - private DataEntry renamedDataEntry(DataEntry dataEntry) - { - return new RenamedDataEntry(dataEntry, prefix + dataEntry.getName()); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/PrefixStrippingDataEntryReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/PrefixStrippingDataEntryReader.java deleted file mode 100644 index 8fdfd1f8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/PrefixStrippingDataEntryReader.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.util.ArrayUtil; - -import java.io.IOException; - -/** - * This DataEntryReader delegates to a given DataEntryReader, each time - * stripping a possible prefix from the read data entry name. - * - * @author Eric Lafortune - */ -public class PrefixStrippingDataEntryReader implements DataEntryReader -{ - private final String prefix; - private final DataEntryReader dataEntryReader; - - - /** - * Creates a new PrefixStrippingDataEntryReader. - */ - public PrefixStrippingDataEntryReader(String prefix, - DataEntryReader dataEntryReader) - { - this.prefix = prefix; - this.dataEntryReader = dataEntryReader; - } - - - // Implementation for DataEntryReader. - - public void read(DataEntry dataEntry) throws IOException - { - // Strip the prefix if necessary. - String name = dataEntry.getName(); - if (name.startsWith(prefix)) - { - dataEntry = new RenamedDataEntry(dataEntry, - name.substring(prefix.length())); - } - - // Read the data entry. - dataEntryReader.read(dataEntry); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntry.java deleted file mode 100644 index 238e5936..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntry.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -/** - * This DataEntry wraps another data entry, returning a different name instead - * of the wrapped data entry's name. - * - * @author Eric Lafortune - */ -public class RenamedDataEntry extends WrappedDataEntry -{ - private final String name; - - - public RenamedDataEntry(DataEntry dataEntry, - String name) - { - super(dataEntry); - this.name = name; - } - - - // Implementations for DataEntry. - - public String getName() - { - return name; - } - - - // Implementations for Object. - - public String toString() - { - return name + " == " + wrappedEntry; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntryReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntryReader.java deleted file mode 100644 index b537decc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntryReader.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; - -import java.io.IOException; -import java.util.Map; - -/** - * This DataEntryReader delegates to another DataEntryReader, renaming the - * data entries based on the given map. Entries whose name does not appear - * in the map may be passed to an alternative DataEntryReader. - * - * @author Eric Lafortune - */ -public class RenamedDataEntryReader implements DataEntryReader -{ - private final Map nameMap; - private final DataEntryReader dataEntryReader; - private final DataEntryReader missingDataEntryReader; - - - /** - * Creates a new RenamedDataEntryReader. - * @param nameMap the map from old names to new names. - * @param dataEntryReader the DataEntryReader to which renamed data - * entries will be passed. - */ - public RenamedDataEntryReader(Map nameMap, - DataEntryReader dataEntryReader) - { - this(nameMap, dataEntryReader, null); - } - - - /** - * Creates a new RenamedDataEntryReader. - * @param nameMap the map from old names to new names. - * @param dataEntryReader the DataEntryReader to which renamed data - * entries will be passed. - * @param missingDataEntryReader the optional DataEntryReader to which data - * entries that can't be renamed will be - * passed. - */ - public RenamedDataEntryReader(Map nameMap, - DataEntryReader dataEntryReader, - DataEntryReader missingDataEntryReader) - { - this.nameMap = nameMap; - this.dataEntryReader = dataEntryReader; - this.missingDataEntryReader = missingDataEntryReader; - } - - - // Implementations for DataEntryReader. - - public void read(DataEntry dataEntry) throws IOException - { - String name = dataEntry.getName(); - - // Add a directory separator if necessary. - if (dataEntry.isDirectory() && - name.length() > 0) - { - name += ClassConstants.PACKAGE_SEPARATOR; - } - - String newName = (String)nameMap.get(name); - if (newName != null) - { - // Remove the directory separator if necessary. - if (dataEntry.isDirectory() && - newName.length() > 0) - { - newName = newName.substring(0, newName.length() - 1); - } - - dataEntryReader.read(new RenamedDataEntry(dataEntry, newName)); - } - else if (missingDataEntryReader != null) - { - missingDataEntryReader.read(dataEntry); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntryWriter.java deleted file mode 100644 index cbd2dbc9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedDataEntryWriter.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; - -import java.io.*; -import java.util.Map; - -/** - * This DataEntryWriter delegates to another DataEntryWriter, renaming the - * data entries based on the renamed classes in the given ClassPool. - * - * @author Eric Lafortune - */ -public class RenamedDataEntryWriter implements DataEntryWriter -{ - private final ClassPool classPool; - private final Map packagePrefixMap; - private final DataEntryWriter dataEntryWriter; - - - /** - * Creates a new RenamedDataEntryWriter. - * @param classPool the class pool that maps from old names to new - * names. - * @param packagePrefixMap the map from old package prefixes to new package - * prefixes. - * @param dataEntryWriter the DataEntryWriter to which calls will be - * delegated. - */ - public RenamedDataEntryWriter(ClassPool classPool, - Map packagePrefixMap, - DataEntryWriter dataEntryWriter) - { - this.classPool = classPool; - this.packagePrefixMap = packagePrefixMap; - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createDirectory(renamedDataEntry(dataEntry)); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, DataEntry dataEntry2) throws IOException - { - return dataEntryWriter.sameOutputStream(dataEntry1, dataEntry2); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createOutputStream(renamedDataEntry(dataEntry)); - } - - - public void close() throws IOException - { - dataEntryWriter.close(); - } - - - public void println(PrintWriter pw, String prefix) - { - dataEntryWriter.println(pw, prefix); - } - - - // Small utility methods. - - /** - * Create a renamed data entry, if possible. - */ - private DataEntry renamedDataEntry(DataEntry dataEntry) - { - String dataEntryName = dataEntry.getName(); - - // Try to find a corresponding class name by removing increasingly - // long suffixes. - for (int suffixIndex = dataEntryName.length() - 1; - suffixIndex > 0; - suffixIndex--) - { - char c = dataEntryName.charAt(suffixIndex); - if (!Character.isLetterOrDigit(c)) - { - // Chop off the suffix. - String className = dataEntryName.substring(0, suffixIndex); - - // Did we get to the package separator? - if (c == ClassConstants.PACKAGE_SEPARATOR) - { - break; - } - - // Is there a class corresponding to the data entry? - Clazz clazz = classPool.getClass(className); - if (clazz != null) - { - // Did the class get a new name? - String newClassName = clazz.getName(); - if (!className.equals(newClassName)) - { - // Return a renamed data entry. - String newDataEntryName = - newClassName + dataEntryName.substring(suffixIndex); - - return new RenamedDataEntry(dataEntry, newDataEntryName); - } - else - { - // Otherwise stop looking. - return dataEntry; - } - } - } - } - - // Try to find a corresponding package name by increasingly removing - // more subpackages. - String packagePrefix = dataEntryName; - do - { - // Chop off the class name or the last subpackage name. - packagePrefix = ClassUtil.internalPackagePrefix(packagePrefix); - - // Is there a package corresponding to the package prefix? - String newPackagePrefix = (String)packagePrefixMap.get(packagePrefix); - if (newPackagePrefix != null) - { - // Did the package get a new name? - if (!packagePrefix.equals(newPackagePrefix)) - { - // Return a renamed data entry. - String newDataEntryName = - newPackagePrefix + dataEntryName.substring(packagePrefix.length()); - - return new RenamedDataEntry(dataEntry, newDataEntryName); - } - else - { - // Otherwise stop looking. - return dataEntry; - } - } - } - while (packagePrefix.length() > 0); - - return dataEntry; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedParentDataEntryWriter.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedParentDataEntryWriter.java deleted file mode 100644 index b4e72560..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/RenamedParentDataEntryWriter.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.util.StringMatcher; - -import java.io.*; - -/** - * This DataEntryWriter delegates to another DataEntryWriter, renaming - * parent data entries based on the given matcher. - * - * @author Thomas Neidhart - */ -public class RenamedParentDataEntryWriter implements DataEntryWriter -{ - private final StringMatcher matcher; - private final String newParentName; - private final DataEntryWriter dataEntryWriter; - - - /** - * Creates a new RenamedParentDataEntryWriter. - * - * @param matcher the string matcher to match parent entries. - * @param newParentName the new parent name to use. - * @param dataEntryWriter the DataEntryWriter to which the writing will - * be delegated. - */ - public RenamedParentDataEntryWriter(StringMatcher matcher, - String newParentName, - DataEntryWriter dataEntryWriter) - { - this.matcher = matcher; - this.newParentName = newParentName; - this.dataEntryWriter = dataEntryWriter; - } - - - // Implementations for DataEntryWriter. - - public boolean createDirectory(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createDirectory(getRedirectedEntry(dataEntry)); - } - - - public boolean sameOutputStream(DataEntry dataEntry1, DataEntry dataEntry2) - throws IOException - { - return dataEntryWriter.sameOutputStream(getRedirectedEntry(dataEntry1), - getRedirectedEntry(dataEntry2)); - } - - - public OutputStream createOutputStream(DataEntry dataEntry) throws IOException - { - return dataEntryWriter.createOutputStream(getRedirectedEntry(dataEntry)); - } - - - public void close() throws IOException - { - dataEntryWriter.close(); - } - - - public void println(PrintWriter pw, String prefix) - { - dataEntryWriter.println(pw, prefix); - } - - private DataEntry getRedirectedEntry(DataEntry dataEntry) - { - if (dataEntry == null) - { - return null; - } - - final DataEntry parentEntry = dataEntry.getParent(); - if (parentEntry != null && - matcher.matches(parentEntry.getName())) - { - final DataEntry renamedParentEntry = - new RenamedDataEntry(parentEntry, newParentName); - - return new WrappedDataEntry(dataEntry) { - public DataEntry getParent() - { - return renamedParentEntry; - } - }; - } - - return dataEntry; - } - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/WrappedDataEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/WrappedDataEntry.java deleted file mode 100644 index d084c104..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/WrappedDataEntry.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import java.io.*; - -/** - * This DataEntry wraps another data entry. - * - * @author Thomas Neidhart - */ -public class WrappedDataEntry implements DataEntry -{ - protected final DataEntry wrappedEntry; - - - public WrappedDataEntry(DataEntry wrappedEntry) - { - this.wrappedEntry = wrappedEntry; - } - - - public void closeInputStream() throws IOException - { - wrappedEntry.closeInputStream(); - } - - public String getName() - { - return wrappedEntry.getName(); - } - - - public String getOriginalName() - { - return wrappedEntry.getOriginalName(); - } - - - public long getSize() - { - return wrappedEntry.getSize(); - } - - - public boolean isDirectory() - { - return wrappedEntry.isDirectory(); - } - - - public InputStream getInputStream() throws IOException - { - return wrappedEntry.getInputStream(); - } - - - public DataEntry getParent() - { - return wrappedEntry.getParent(); - } - - - public String toString() - { - return getName(); - } - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipDataEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipDataEntry.java deleted file mode 100644 index a1dcba36..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipDataEntry.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; - -import java.io.*; -import java.util.zip.*; - -/** - * This DataEntry represents a ZIP entry. - * - * @author Eric Lafortune - */ -public class ZipDataEntry implements DataEntry -{ - private final DataEntry parent; - private final ZipEntry zipEntry; - private ZipInputStream zipInputStream; - private InputStream bufferedInputStream; - - - public ZipDataEntry(DataEntry parent, - ZipEntry zipEntry, - ZipInputStream zipInputStream) - { - this.parent = parent; - this.zipEntry = zipEntry; - this.zipInputStream = zipInputStream; - } - - - // Implementations for DataEntry. - - public String getName() - { - // Get the right separators. - String name = zipEntry.getName() - .replace(File.separatorChar, ClassConstants.PACKAGE_SEPARATOR); - - // Chop the trailing directory slash, if any. - int length = name.length(); - return length > 0 && - name.charAt(length-1) == ClassConstants.PACKAGE_SEPARATOR ? - name.substring(0, length -1) : - name; - } - - - public String getOriginalName() - { - return getName(); - } - - - public long getSize() - { - return zipEntry.getSize(); - } - - - public boolean isDirectory() - { - return zipEntry.isDirectory(); - } - - - public InputStream getInputStream() throws IOException - { - if (bufferedInputStream == null) - { - bufferedInputStream = new BufferedInputStream(zipInputStream); - } - - return bufferedInputStream; - } - - - public void closeInputStream() throws IOException - { - zipInputStream.closeEntry(); - zipInputStream = null; - bufferedInputStream = null; - } - - - public DataEntry getParent() - { - return parent; - } - - - // Implementations for Object. - - public String toString() - { - return parent.toString() + ':' + getName(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipFileDataEntry.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipFileDataEntry.java deleted file mode 100644 index 6ad4d538..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipFileDataEntry.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.classfile.ClassConstants; - -import java.io.*; -import java.util.zip.*; - -/** - * This DataEntry represents a ZIP entry. - * - * @author Eric Lafortune - */ -public class ZipFileDataEntry implements DataEntry -{ - private final DataEntry parent; - private final ZipEntry zipEntry; - private ZipFile zipFile; - private InputStream zipInputStream; - private InputStream bufferedInputStream; - - - public ZipFileDataEntry(DataEntry parent, - ZipEntry zipEntry, - ZipFile zipFile) - { - this.parent = parent; - this.zipEntry = zipEntry; - this.zipFile = zipFile; - } - - - // Implementations for DataEntry. - - public String getName() - { - // Get the right separators. - String name = zipEntry.getName() - .replace(File.separatorChar, ClassConstants.PACKAGE_SEPARATOR); - - // Chop the trailing directory slash, if any. - int length = name.length(); - return length > 0 && - name.charAt(length-1) == ClassConstants.PACKAGE_SEPARATOR ? - name.substring(0, length -1) : - name; - } - - - public String getOriginalName() - { - return getName(); - } - - - public long getSize() - { - return zipEntry.getSize(); - } - - - public boolean isDirectory() - { - return zipEntry.isDirectory(); - } - - - public InputStream getInputStream() throws IOException - { - if (zipInputStream == null) - { - zipInputStream = zipFile.getInputStream(zipEntry); - } - - if (bufferedInputStream == null) - { - bufferedInputStream = new BufferedInputStream(zipInputStream); - } - - return bufferedInputStream; - } - - - public void closeInputStream() throws IOException - { - zipInputStream.close(); - zipFile = null; - bufferedInputStream = null; - } - - - public DataEntry getParent() - { - return parent; - } - - - // Implementations for Object. - - public String toString() - { - return parent.toString() + ':' + getName(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipOutput.java b/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipOutput.java deleted file mode 100644 index d8bb94f7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/ZipOutput.java +++ /dev/null @@ -1,577 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.io; - -import proguard.util.StringUtil; - -import java.io.*; -import java.util.*; -import java.util.zip.*; - -/** - * This class writes zip data to a given output stream. It returns a new - * output stream for each zip entry that is opened. An entry can be compressed - * or uncompressed. Uncompressed entries can be aligned to a multiple of a - * given number of bytes. - * - * Multiple entries and output streams can be open at the same time. The entries - * are added to the central directory in the order in which they are opened, but - * the corresponding data are only written when their output streams are closed. - * - * The code automatically computes the CRC and lengths of the data, for - * compressed and uncompressed data. - * - * @author Eric Lafortune - */ -public class ZipOutput -{ - private static final int MAGIC_LOCAL_FILE_HEADER = 0x04034b50; - private static final int MAGIC_CENTRAL_DIRECTORY_FILE_HEADER = 0x02014b50; - private static final int MAGIC_END_OF_CENTRAL_DIRECTORY = 0x06054b50; - - private static final int VERSION = 10; - private static final int GENERAL_PURPOSE_FLAG = 0; - private static final int METHOD_UNCOMPRESSED = 0; - private static final int METHOD_COMPRESSED = 8; - - private static final boolean DEBUG = false; - - - private DataOutputStream outputStream; - private final int uncompressedAlignment; - private final String comment; - - private List zipEntries = new ArrayList(); - private Set zipEntryNames = new HashSet(); - - private long centralDirectoryOffset; - - - /** - * Creates a new ZipOutput. - * @param outputStream the output stream to which the zip data will be - * written. - */ - public ZipOutput(OutputStream outputStream) - throws IOException - { - this(outputStream, null, null, 1); - } - - - /** - * Creates a new ZipOutput that aligns uncompressed entries. - * @param outputStream the output stream to which the zip data will - * be written. - * @param header an optional header for the jar file. - * @param comment optional comment for the entire zip file. - * @param uncompressedAlignment the requested alignment of uncompressed data. - */ - public ZipOutput(OutputStream outputStream, - byte[] header, - String comment, - int uncompressedAlignment) - throws IOException - { - this.outputStream = new DataOutputStream(outputStream); - this.comment = comment; - this.uncompressedAlignment = uncompressedAlignment; - - if (header != null) - { - outputStream.write(header); - } - } - - - /** - * Creates a new zip entry, returning an output stream to write its data. - * It is the caller's responsibility to close the output stream. - * @param name the name of the zip entry. - * @param compress specifies whether the entry should be compressed. - * @param modificationTime the modification date and time of the zip entry, - * in DOS format. - * @return an output stream for writing the data of the - * zip entry. - */ - public OutputStream createOutputStream(String name, - boolean compress, - int modificationTime) - throws IOException - { - return createOutputStream(name, - compress, - modificationTime, - null, - null); - } - - - /** - * Creates a new zip entry, returning an output stream to write its data. - * It is the caller's responsibility to close the output stream. - * @param name the name of the zip entry. - * @param compress specifies whether the entry should be compressed. - * @param modificationTime the modification date and time of the zip entry, - * in DOS format. - * @param extraField optional extra field data. These should contain - * chunks, each with a short ID, a short length - * (little endian), and their corresponding data. - * The IDs 0-31 are reserved for Pkware. - * Java's jar tool just specifies an ID 0xcafe on - * its first entry. - * @param comment optional comment. - * @return an output stream for writing the data of the - * zip entry. - */ - public OutputStream createOutputStream(String name, - boolean compress, - int modificationTime, - byte[] extraField, - String comment) - throws IOException - { - // Check if the name hasn't been used yet. - if (!zipEntryNames.add(name)) - { - throw new IOException("Duplicate jar entry ["+name+"]"); - } - - ZipEntry entry = new ZipEntry(name, - compress, - modificationTime, - extraField, - comment); - - // Add the entry to the list that will be put in the central directory. - zipEntries.add(entry); - - return entry.createOutputStream(); - } - - - /** - * Closes the zip archive, also closing the underlying output stream. - */ - public void close() throws IOException - { - // Write the central directory. - writeStartOfCentralDirectory(); - - for (int index = 0; index < zipEntries.size(); index++) - { - ZipEntry entry = (ZipEntry)zipEntries.get(index); - - entry.writeCentralDirectoryFileHeader(); - } - - writeEndOfCentralDirectory(); - - // Close the underlying output stream. - outputStream.close(); - - // Make sure the archive can't be used any further. - outputStream = null; - zipEntries = null; - zipEntryNames = null; - } - - - /** - * Starts the central directory. - */ - private void writeStartOfCentralDirectory() - { - // The central directory as such doesn't have a header. - centralDirectoryOffset = outputStream.size(); - } - - - /** - * Ends the central directory. - */ - private void writeEndOfCentralDirectory() throws IOException - { - if (DEBUG) - { - System.out.println("ZipOutput.writeEndOfCentralDirectory ("+zipEntries.size()+" entries)"); - } - - // The size of the central directory, not counting this trailer. - long centralDirectorySize = outputStream.size() - centralDirectoryOffset; - - writeInt(MAGIC_END_OF_CENTRAL_DIRECTORY); - writeShort(0); // Number of this disk. - writeShort(0); // Number of disk with central directory. - writeShort(zipEntries.size()); // Number of records on this disk. - writeShort(zipEntries.size()); // Total number of records. - writeInt(centralDirectorySize); // Size of central directory, in bytes. - writeInt(centralDirectoryOffset); // Offset of central directory. - - if (comment == null) - { - // No comment. - writeShort(0); - } - else - { - // Comment length and comment. - byte[] commentBytes = StringUtil.getUtf8Bytes(comment); - writeShort(commentBytes.length); - outputStream.write(commentBytes); - } - } - - - /** - * This class represents a zip entry in its enclosing zip file. It can - * provide an output stream and write its headers and its data to the main - * zip output stream. In fact, it automatically writes its local header and - * data when the output stream is closed. - */ - private class ZipEntry - { - private boolean compressed; - private int modificationTime; - private int crc; - private long compressedSize; - private long uncompressedSize; - private long offset; - private String name; - private byte[] extraField; - private String comment; - - - /** - * Creates a new zip entry, returning output stream to write its data. - * It is the caller's responsibility to close the output stream. - * @param name the name of the zip entry. - * @param compressed specifies whether the entry should be - * compressed. - * @param modificationTime the modification date and time of the zip - * entry, in DOS format. - * @param extraField optional extra field data. These should - * contain chunks, each with a short ID, a short - * length (little endian), and their - * corresponding data. The IDs 0-31 are reserved - * for Pkware. Java's jar tool just specifies an - * ID 0xcafe on its first entry. - * @param comment optional comment. - * @return an output stream for writing the zip data. - */ - private ZipEntry(String name, - boolean compressed, - int modificationTime, - byte[] extraField, - String comment) - { - this.name = name; - this.compressed = compressed; - this.modificationTime = modificationTime; - this.extraField = extraField; - this.comment = comment; - } - - - public OutputStream createOutputStream() throws IOException - { - return compressed ? - (OutputStream)new CompressedZipEntryOutputStream() : - (OutputStream)new UncompressedZipEntryOutputStream(); - } - - - /** - * Writes the local file header, which precedes the data, to the main - * zip output stream. - */ - private void writeLocalFileHeader() throws IOException - { - if (DEBUG) - { - System.out.println("ZipOutput.writeLocalFileHeader ["+name+"] (compressed = "+compressed+", offset = "+offset+", "+compressedSize+"/"+uncompressedSize+" bytes)"); - } - - writeInt(MAGIC_LOCAL_FILE_HEADER); - writeShort(VERSION); - writeShort(GENERAL_PURPOSE_FLAG); - writeShort(compressed ? METHOD_COMPRESSED : METHOD_UNCOMPRESSED); - writeInt(modificationTime); - writeInt(crc); - writeInt(compressedSize); - writeInt(uncompressedSize); - - byte[] nameBytes = StringUtil.getUtf8Bytes(name); - int nameLength = nameBytes.length; - int extraFieldLength = extraField == null ? 0 : extraField.length; - - writeShort(nameLength); - writeShort(extraFieldLength); - - outputStream.write(nameBytes); - - if (extraField != null) - { - outputStream.write(extraField); - } - } - - - /** - * Writes the file header for the central directory to the main zip - * output stream. - */ - public void writeCentralDirectoryFileHeader() throws IOException - { - if (DEBUG) - { - System.out.println("ZipOutput.writeCentralDirectoryFileHeader ["+name+"] (compressed = "+compressed+", offset = "+offset+", "+compressedSize+"/"+uncompressedSize+" bytes)"); - } - - writeInt(MAGIC_CENTRAL_DIRECTORY_FILE_HEADER); - writeShort(VERSION); // Creation version. - writeShort(VERSION); // Extraction Version. - writeShort(GENERAL_PURPOSE_FLAG); - writeShort(compressed ? METHOD_COMPRESSED : METHOD_UNCOMPRESSED); - writeInt(modificationTime); - writeInt(crc); - writeInt(compressedSize); - writeInt(uncompressedSize); - - byte[] nameBytes = StringUtil.getUtf8Bytes(name); - byte[] commentBytes = comment == null ? null : - StringUtil.getUtf8Bytes(comment); - - writeShort(nameBytes.length); - writeShort(extraField == null ? 0 : extraField.length); - writeShort(commentBytes == null ? 0 : commentBytes.length); - writeShort(0); // Disk number of file start. - writeShort(0); // Internal file attributes. - writeInt(0); // External file attributes. - writeInt(offset); - outputStream.write(nameBytes); - if (extraField != null) - { - outputStream.write(extraField); - } - - if (commentBytes != null) - { - outputStream.write(commentBytes); - } - } - - - /** - * This OutputStream writes its uncompressed zip entry out to its zip - * output stream when it is closed. - */ - private class UncompressedZipEntryOutputStream extends ByteArrayOutputStream - { - private CRC32 crc32 = new CRC32(); - - - private UncompressedZipEntryOutputStream() - { - super(16 * 1024); - } - - - // Overridden methods for OutputStream. - - public void write(int b) - { - super.write(b); - - crc32.update(b); - } - - - //public void write(byte[] b) throws IOException - //{ - // // The super implementation delegates to the method below. - // super.write(b); - //} - - - public void write(byte[] b, int off, int len) - { - super.write(b, off, len); - - crc32.update(b, off, len); - } - - - public void close() throws IOException - { - super.close(); - - byte[] bytes = super.toByteArray(); - - offset = outputStream.size(); - crc = (int)crc32.getValue(); - compressedSize = bytes.length; - uncompressedSize = bytes.length; - - writeLocalFileHeader(); - outputStream.write(bytes); - } - } - - - /** - * This OutputStream writes its compressed zip entry out to its zip - * output stream when it is closed. - */ - private class CompressedZipEntryOutputStream extends DeflaterOutputStream - { - private CRC32 crc32 = new CRC32(); - - - private CompressedZipEntryOutputStream() - { - super(new ByteArrayOutputStream(16 * 1024), - new Deflater(Deflater.BEST_COMPRESSION, true), - 1024); - } - - - // Overridden methods for OutputStream. - - //public void write(int b) throws IOException - //{ - // // The super implementation delegates to the method below. - // super.write(b); - //} - // - // - //public void write(byte[] b) throws IOException - //{ - // // The super implementation delegates to the method below. - // super.write(b); - //} - - - public void write(byte[] b, int off, int len) throws IOException - { - super.write(b, off, len); - - crc32.update(b, off, len); - uncompressedSize += len; - } - - - public void close() throws IOException - { - // Make sure the memory is freed. [JDK-4797189] - super.finish(); - super.def.end(); - super.close(); - - ByteArrayOutputStream byteArrayOutputStream = - (ByteArrayOutputStream)super.out; - - byte[] compressedBytes = byteArrayOutputStream.toByteArray(); - - offset = outputStream.size(); - crc = (int)crc32.getValue(); - compressedSize = compressedBytes.length; - - writeLocalFileHeader(); - outputStream.write(compressedBytes); - } - } - } - - - // Small utility methods. - - /** - * Writes out a little-endian short value to the zip output stream. - */ - private void writeShort(int value) throws IOException - { - outputStream.write(value); - outputStream.write(value >>> 8); - } - - - /** - * Writes out a little-endian int value to the zip output stream. - */ - private void writeInt(int value) throws IOException - { - outputStream.write(value); - outputStream.write(value >>> 8); - outputStream.write(value >>> 16); - outputStream.write(value >>> 24); - } - - - /** - * Writes out a little-endian int value to the zip output stream. - */ - private void writeInt(long value) throws IOException - { - outputStream.write((int)value); - outputStream.write((int)(value >>> 8)); - outputStream.write((int)(value >>> 16)); - outputStream.write((int)(value >>> 24)); - } - - - /** - * Provides a simple test for this class, creating a zip file with the - * given name and a few aligned/compressed/uncompressed zip entries. - */ - public static void main(String[] args) - { - try - { - ZipOutput output = - new ZipOutput(new FileOutputStream(args[0]), null, "Main file comment", 4); - - PrintWriter printWriter1 = - new PrintWriter(output.createOutputStream("file1.txt", false, 0, new byte[] { 0x34, 0x12, 4, 0, 0x48, 0x65, 0x6c, 0x6c, 0x6f }, "Comment")); - printWriter1.println("This is file 1."); - printWriter1.println("Hello, world!"); - printWriter1.close(); - - PrintWriter printWriter2 = - new PrintWriter(output.createOutputStream("file2.txt", true, 0, null, "Another comment")); - printWriter2.println("This is file 2."); - printWriter2.println("Hello, world!"); - printWriter2.close(); - - PrintWriter printWriter3 = - new PrintWriter(output.createOutputStream("file3.txt", false, 0, null, "Last comment")); - printWriter3.println("This is file 3."); - printWriter3.println("Hello, world!"); - printWriter3.close(); - - output.close(); - } - catch (IOException e) - { - e.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/io/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/io/package.html deleted file mode 100644 index 4ad9f419..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/io/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains classes to read and write files, optionally wrapped in -jars, wars, ears, zips, directories,... - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/AttributeShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/AttributeShrinker.java deleted file mode 100644 index fdc3d92e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/AttributeShrinker.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -import java.util.Arrays; - -/** - * This ClassVisitor removes attributes that are not marked as being used or - * required. - * - * @see AttributeUsageMarker - * - * @author Eric Lafortune - */ -public class AttributeShrinker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Compact the array for class attributes. - programClass.u2attributesCount = - shrinkArray(programClass.attributes, - programClass.u2attributesCount); - - // Compact the attributes in fields, methods, and class attributes, - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Library classes are left unchanged. - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Compact the attributes array. - programMember.u2attributesCount = - shrinkArray(programMember.attributes, - programMember.u2attributesCount); - - // Compact any attributes of the remaining attributes. - programMember.attributesAccept(programClass, this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Compact the attributes array. - codeAttribute.u2attributesCount = - shrinkArray(codeAttribute.attributes, - codeAttribute.u2attributesCount); - } - - - // Small utility methods. - - /** - * Removes all VisitorAccepter objects that are not marked as being used - * from the given array. - * @return the new number of VisitorAccepter objects. - */ - private static int shrinkArray(VisitorAccepter[] array, int length) - { - int counter = 0; - - // Shift the used objects together. - for (int index = 0; index < length; index++) - { - if (AttributeUsageMarker.isUsed(array[index])) - { - array[counter++] = array[index]; - } - } - - // Clear the remaining array elements. - Arrays.fill(array, counter, length, null); - - return counter; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/AttributeUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/AttributeUsageMarker.java deleted file mode 100644 index 71179f00..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/AttributeUsageMarker.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor marks all attributes that it visits. - * - * @see AttributeShrinker - * - * @author Eric Lafortune - */ -public class AttributeUsageMarker -extends SimplifiedVisitor -implements AttributeVisitor -{ - // A visitor info flag to indicate the attribute is being used. - private static final Object USED = new Object(); - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) - { - markAsUsed(attribute); - } - - - // Small utility methods. - - /** - * Marks the given VisitorAccepter as being used (or useful). - * In this context, the VisitorAccepter will be an Attribute object. - */ - private static void markAsUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(USED); - } - - - /** - * Returns whether the given VisitorAccepter has been marked as being used. - * In this context, the VisitorAccepter will be an Attribute object. - */ - static boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ClassObfuscator.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ClassObfuscator.java deleted file mode 100644 index accee739..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ClassObfuscator.java +++ /dev/null @@ -1,569 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; -import proguard.util.*; - -import java.util.*; - -/** - * This ClassVisitor comes up with obfuscated names for the - * classes it visits, and for their class members. The actual renaming is - * done afterward. - * - * @see ClassRenamer - * - * @author Eric Lafortune - */ -public class ClassObfuscator -extends SimplifiedVisitor -implements ClassVisitor, - AttributeVisitor, - InnerClassesInfoVisitor, - ConstantVisitor -{ - private final DictionaryNameFactory classNameFactory; - private final DictionaryNameFactory packageNameFactory; - private final boolean useMixedCaseClassNames; - private final StringMatcher keepPackageNamesMatcher; - private final String flattenPackageHierarchy; - private final String repackageClasses; - private final boolean allowAccessModification; - - private final Set classNamesToAvoid = new HashSet(); - - // Map: [package prefix - new package prefix] - private final Map packagePrefixMap = new HashMap(); - - // Map: [package prefix - package name factory] - private final Map packagePrefixPackageNameFactoryMap = new HashMap(); - - // Map: [package prefix - numeric class name factory] - private final Map packagePrefixClassNameFactoryMap = new HashMap(); - - // Map: [package prefix - numeric class name factory] - private final Map packagePrefixNumericClassNameFactoryMap = new HashMap(); - - // Field acting as temporary variables and as return values for names - // of outer classes and types of inner classes. - private String newClassName; - private boolean numericClassName; - - - /** - * Creates a new ClassObfuscator. - * @param programClassPool the class pool in which class names - * have to be unique. - * @param libraryClassPool the class pool from which class names - * have to be avoided. - * @param classNameFactory the optional class obfuscation dictionary. - * @param packageNameFactory the optional package obfuscation - * dictionary. - * @param useMixedCaseClassNames specifies whether obfuscated packages and - * classes can get mixed-case names. - * @param keepPackageNames the optional filter for which matching - * package names are kept. - * @param flattenPackageHierarchy the base package if the obfuscated package - * hierarchy is to be flattened. - * @param repackageClasses the base package if the obfuscated classes - * are to be repackaged. - * @param allowAccessModification specifies whether obfuscated classes can - * be freely moved between packages. - */ - public ClassObfuscator(ClassPool programClassPool, - ClassPool libraryClassPool, - DictionaryNameFactory classNameFactory, - DictionaryNameFactory packageNameFactory, - boolean useMixedCaseClassNames, - List keepPackageNames, - String flattenPackageHierarchy, - String repackageClasses, - boolean allowAccessModification) - { - this.classNameFactory = classNameFactory; - this.packageNameFactory = packageNameFactory; - - // First append the package separator if necessary. - if (flattenPackageHierarchy != null && - flattenPackageHierarchy.length() > 0) - { - flattenPackageHierarchy += ClassConstants.PACKAGE_SEPARATOR; - } - - // First append the package separator if necessary. - if (repackageClasses != null && - repackageClasses.length() > 0) - { - repackageClasses += ClassConstants.PACKAGE_SEPARATOR; - } - - this.useMixedCaseClassNames = useMixedCaseClassNames; - this.keepPackageNamesMatcher = keepPackageNames == null ? null : - new ListParser(new FileNameParser()).parse(keepPackageNames); - this.flattenPackageHierarchy = flattenPackageHierarchy; - this.repackageClasses = repackageClasses; - this.allowAccessModification = allowAccessModification; - - // Map the root package onto the root package. - packagePrefixMap.put("", ""); - - // Collect all names that have already been taken. - programClassPool.classesAccept(new MyKeepCollector()); - libraryClassPool.classesAccept(new MyKeepCollector()); - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Does this class still need a new name? - newClassName = newClassName(programClass); - if (newClassName == null) - { - // Make sure the outer class has a name, if it exists. The name will - // be stored as the new class name, as a side effect, so we'll be - // able to use it as a prefix. - programClass.attributesAccept(this); - - // Figure out a package prefix. The package prefix may actually be - // the an outer class prefix, if any, or it may be the fixed base - // package, if classes are to be repackaged. - String newPackagePrefix = newClassName != null ? - newClassName + ClassConstants.INNER_CLASS_SEPARATOR : - newPackagePrefix(ClassUtil.internalPackagePrefix(programClass.getName())); - - // Come up with a new class name, numeric or ordinary. - newClassName = newClassName != null && numericClassName ? - generateUniqueNumericClassName(newPackagePrefix) : - generateUniqueClassName(newPackagePrefix); - - setNewClassName(programClass, newClassName); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // This can happen for dubious input, if the outer class of a program - // class is a library class, and its name is requested. - newClassName = libraryClass.getName(); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Make sure the outer classes have a name, if they exist. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - // Make sure the enclosing class has a name. - enclosingMethodAttribute.referencedClassAccept(this); - - String innerClassName = clazz.getName(); - String outerClassName = clazz.getClassName(enclosingMethodAttribute.u2classIndex); - - numericClassName = isNumericClassName(innerClassName, - outerClassName); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - // Make sure the outer class has a name, if it exists. - int innerClassIndex = innerClassesInfo.u2innerClassIndex; - int outerClassIndex = innerClassesInfo.u2outerClassIndex; - if (innerClassIndex != 0 && - outerClassIndex != 0) - { - String innerClassName = clazz.getClassName(innerClassIndex); - if (innerClassName.equals(clazz.getName())) - { - clazz.constantPoolEntryAccept(outerClassIndex, this); - - String outerClassName = clazz.getClassName(outerClassIndex); - - numericClassName = isNumericClassName(innerClassName, - outerClassName); - } - } - } - - - /** - * Returns whether the given inner class name is a numeric name. - */ - private boolean isNumericClassName(String innerClassName, - String outerClassName) - { - int innerClassNameStart = outerClassName.length() + 1; - int innerClassNameLength = innerClassName.length(); - - if (innerClassNameStart >= innerClassNameLength) - { - return false; - } - - for (int index = innerClassNameStart; index < innerClassNameLength; index++) - { - if (!Character.isDigit(innerClassName.charAt(index))) - { - return false; - } - } - - return true; - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Make sure the outer class has a name. - classConstant.referencedClassAccept(this); - } - - - /** - * This ClassVisitor collects package names and class names that have to - * be kept. - */ - private class MyKeepCollector implements ClassVisitor - { - public void visitProgramClass(ProgramClass programClass) - { - // Does the program class already have a new name? - String newClassName = newClassName(programClass); - if (newClassName != null) - { - // Remember not to use this name. - classNamesToAvoid.add(mixedCaseClassName(newClassName)); - - // Are we not aggressively repackaging all obfuscated classes? - if (repackageClasses == null || - !allowAccessModification) - { - String className = programClass.getName(); - - // Keep the package name for all other classes in the same - // package. Do this recursively if we're not doing any - // repackaging. - mapPackageName(className, - newClassName, - repackageClasses == null && - flattenPackageHierarchy == null); - } - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Get the new name or the original name of the library class. - String newClassName = newClassName(libraryClass); - if (newClassName == null) - { - newClassName = libraryClass.getName(); - } - - // Remember not to use this name. - classNamesToAvoid.add(mixedCaseClassName(newClassName)); - - // Are we not aggressively repackaging all obfuscated classes? - if (repackageClasses == null || - !allowAccessModification) - { - String className = libraryClass.getName(); - - // Keep the package name for all other classes in the same - // package. Do this recursively if we're not doing any - // repackaging. - mapPackageName(className, - newClassName, - repackageClasses == null && - flattenPackageHierarchy == null); - } - } - - - /** - * Makes sure the package name of the given class will always be mapped - * consistently with its new name. - */ - private void mapPackageName(String className, - String newClassName, - boolean recursively) - { - String packagePrefix = ClassUtil.internalPackagePrefix(className); - String newPackagePrefix = ClassUtil.internalPackagePrefix(newClassName); - - // Put the mapping of this package prefix, and possibly of its - // entire hierarchy, into the package prefix map. - do - { - packagePrefixMap.put(packagePrefix, newPackagePrefix); - - if (!recursively) - { - break; - } - - packagePrefix = ClassUtil.internalPackagePrefix(packagePrefix); - newPackagePrefix = ClassUtil.internalPackagePrefix(newPackagePrefix); - } - while (packagePrefix.length() > 0 && - newPackagePrefix.length() > 0); - } - } - - - // Small utility methods. - - /** - * Finds or creates the new package prefix for the given package. - */ - private String newPackagePrefix(String packagePrefix) - { - // Doesn't the package prefix have a new package prefix yet? - String newPackagePrefix = (String)packagePrefixMap.get(packagePrefix); - if (newPackagePrefix == null) - { - // Are we keeping the package name? - if (keepPackageNamesMatcher != null && - keepPackageNamesMatcher.matches(packagePrefix.length() > 0 ? - packagePrefix.substring(0, packagePrefix.length()-1) : - packagePrefix)) - { - return packagePrefix; - } - - // Are we forcing a new package prefix? - if (repackageClasses != null) - { - return repackageClasses; - } - - // Are we forcing a new superpackage prefix? - // Otherwise figure out the new superpackage prefix, recursively. - String newSuperPackagePrefix = flattenPackageHierarchy != null ? - flattenPackageHierarchy : - newPackagePrefix(ClassUtil.internalPackagePrefix(packagePrefix)); - - // Come up with a new package prefix. - newPackagePrefix = generateUniquePackagePrefix(newSuperPackagePrefix); - - // Remember to use this mapping in the future. - packagePrefixMap.put(packagePrefix, newPackagePrefix); - } - - return newPackagePrefix; - } - - - /** - * Creates a new package prefix in the given new superpackage. - */ - private String generateUniquePackagePrefix(String newSuperPackagePrefix) - { - // Find the right name factory for this package. - NameFactory packageNameFactory = - (NameFactory)packagePrefixPackageNameFactoryMap.get(newSuperPackagePrefix); - if (packageNameFactory == null) - { - // We haven't seen packages in this superpackage before. Create - // a new name factory for them. - packageNameFactory = new SimpleNameFactory(useMixedCaseClassNames); - if (this.packageNameFactory != null) - { - packageNameFactory = - new DictionaryNameFactory(this.packageNameFactory, - packageNameFactory); - } - - packagePrefixPackageNameFactoryMap.put(newSuperPackagePrefix, - packageNameFactory); - } - - return generateUniquePackagePrefix(newSuperPackagePrefix, packageNameFactory); - } - - - /** - * Creates a new package prefix in the given new superpackage, with the - * given package name factory. - */ - private String generateUniquePackagePrefix(String newSuperPackagePrefix, - NameFactory packageNameFactory) - { - // Come up with package names until we get an original one. - String newPackagePrefix; - do - { - // Let the factory produce a package name. - newPackagePrefix = newSuperPackagePrefix + - packageNameFactory.nextName() + - ClassConstants.PACKAGE_SEPARATOR; - } - while (packagePrefixMap.containsValue(newPackagePrefix)); - - return newPackagePrefix; - } - - - /** - * Creates a new class name in the given new package. - */ - private String generateUniqueClassName(String newPackagePrefix) - { - // Find the right name factory for this package. - NameFactory classNameFactory = - (NameFactory)packagePrefixClassNameFactoryMap.get(newPackagePrefix); - if (classNameFactory == null) - { - // We haven't seen classes in this package before. - // Create a new name factory for them. - classNameFactory = new SimpleNameFactory(useMixedCaseClassNames); - if (this.classNameFactory != null) - { - classNameFactory = - new DictionaryNameFactory(this.classNameFactory, - classNameFactory); - } - - packagePrefixClassNameFactoryMap.put(newPackagePrefix, - classNameFactory); - } - - return generateUniqueClassName(newPackagePrefix, classNameFactory); - } - - - /** - * Creates a new class name in the given new package. - */ - private String generateUniqueNumericClassName(String newPackagePrefix) - { - // Find the right name factory for this package. - NameFactory classNameFactory = - (NameFactory)packagePrefixNumericClassNameFactoryMap.get(newPackagePrefix); - if (classNameFactory == null) - { - // We haven't seen classes in this package before. - // Create a new name factory for them. - classNameFactory = new NumericNameFactory(); - - packagePrefixNumericClassNameFactoryMap.put(newPackagePrefix, - classNameFactory); - } - - return generateUniqueClassName(newPackagePrefix, classNameFactory); - } - - - /** - * Creates a new class name in the given new package, with the given - * class name factory. - */ - private String generateUniqueClassName(String newPackagePrefix, - NameFactory classNameFactory) - { - // Come up with class names until we get an original one. - String newClassName; - String newMixedCaseClassName; - do - { - // Let the factory produce a class name. - newClassName = newPackagePrefix + - classNameFactory.nextName(); - - newMixedCaseClassName = mixedCaseClassName(newClassName); - } - while (classNamesToAvoid.contains(newMixedCaseClassName)); - - // Explicitly make sure the name isn't used again if we have a - // user-specified dictionary and we're not allowed to have mixed case - // class names -- just to protect against problematic dictionaries. - if (this.classNameFactory != null && - !useMixedCaseClassNames) - { - classNamesToAvoid.add(newMixedCaseClassName); - } - - return newClassName; - } - - - /** - * Returns the given class name, unchanged if mixed-case class names are - * allowed, or the lower-case version otherwise. - */ - private String mixedCaseClassName(String className) - { - return useMixedCaseClassNames ? - className : - className.toLowerCase(); - } - - - /** - * Assigns a new name to the given class. - * @param clazz the given class. - * @param name the new name. - */ - static void setNewClassName(Clazz clazz, String name) - { - clazz.setVisitorInfo(name); - } - - - /** - * Retrieves the new name of the given class. - * @param clazz the given class. - * @return the class's new name, or null if it doesn't - * have one yet. - */ - static String newClassName(Clazz clazz) - { - Object visitorInfo = clazz.getVisitorInfo(); - - return visitorInfo instanceof String ? - (String)visitorInfo : - null; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ClassRenamer.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ClassRenamer.java deleted file mode 100644 index e91b0748..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ClassRenamer.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.ConstantPoolEditor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor renames the class names and class member - * names of the classes it visits, using names previously determined by the - * obfuscator. - * - * @see ClassObfuscator - * @see MemberObfuscator - * - * @author Eric Lafortune - */ -public class ClassRenamer -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Rename this class. - programClass.thisClassConstantAccept(this); - - // Rename the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - libraryClass.thisClassName = ClassObfuscator.newClassName(libraryClass); - - // Rename the class members. - libraryClass.fieldsAccept(this); - libraryClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, - ProgramMember programMember) - { - // Has the class member name changed? - String name = programMember.getName(programClass); - String newName = MemberObfuscator.newMemberName(programMember); - if (newName != null && - !newName.equals(name)) - { - programMember.u2nameIndex = - new ConstantPoolEditor(programClass).addUtf8Constant(newName); - } - } - - public void visitLibraryMember(LibraryClass libraryClass, - LibraryMember libraryMember) - { - String newName = MemberObfuscator.newMemberName(libraryMember); - if (newName != null) - { - libraryMember.name = newName; - } - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Update the Class entry if required. - String newName = ClassObfuscator.newClassName(clazz); - if (newName != null) - { - // Refer to a new Utf8 entry. - classConstant.u2nameIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newName); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/DictionaryNameFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/DictionaryNameFactory.java deleted file mode 100644 index 4625d6c4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/DictionaryNameFactory.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import java.io.*; -import java.net.URL; -import java.util.*; - -/** - * This NameFactory generates names that are read from a - * specified input file. - * Comments (everything starting with '#' on a single line) are ignored. - * - * @author Eric Lafortune - */ -public class DictionaryNameFactory implements NameFactory -{ - private static final char COMMENT_CHARACTER = '#'; - - - private final List names; - private final NameFactory nameFactory; - - private int index = 0; - - - /** - * Creates a new DictionaryNameFactory. - * @param url the URL from which the names can be read. - * @param nameFactory the name factory from which names will be retrieved - * if the list of read names has been exhausted. - */ - public DictionaryNameFactory(URL url, - NameFactory nameFactory) throws IOException - { - this(url, true, nameFactory); - } - - - /** - * Creates a new DictionaryNameFactory. - * @param url the URL from which the names can be read. - * @param validJavaIdentifiers specifies whether the produced names should - * be valid Java identifiers. - * @param nameFactory the name factory from which names will be - * retrieved if the list of read names has been - * exhausted. - */ - public DictionaryNameFactory(URL url, - boolean validJavaIdentifiers, - NameFactory nameFactory) throws IOException - { - this (new BufferedReader( - new InputStreamReader( - url.openStream(), "UTF-8")), - validJavaIdentifiers, - nameFactory); - } - - - /** - * Creates a new DictionaryNameFactory. - * @param file the file from which the names can be read. - * @param nameFactory the name factory from which names will be retrieved - * if the list of read names has been exhausted. - */ - public DictionaryNameFactory(File file, - NameFactory nameFactory) throws IOException - { - this(file, true, nameFactory); - } - - - /** - * Creates a new DictionaryNameFactory. - * @param file the file from which the names can be read. - * @param validJavaIdentifiers specifies whether the produced names should - * be valid Java identifiers. - * @param nameFactory the name factory from which names will be - * retrieved if the list of read names has been - * exhausted. - */ - public DictionaryNameFactory(File file, - boolean validJavaIdentifiers, - NameFactory nameFactory) throws IOException - { - this (new BufferedReader( - new InputStreamReader( - new FileInputStream(file), "UTF-8")), - validJavaIdentifiers, - nameFactory); - } - - - /** - * Creates a new DictionaryNameFactory. - * @param reader the reader from which the names can be read. The - * reader is closed at the end. - * @param nameFactory the name factory from which names will be retrieved - * if the list of read names has been exhausted. - */ - public DictionaryNameFactory(Reader reader, - NameFactory nameFactory) throws IOException - { - this(reader, true, nameFactory); - } - - - /** - * Creates a new DictionaryNameFactory. - * @param reader the reader from which the names can be read. - * The reader is closed at the end. - * @param validJavaIdentifiers specifies whether the produced names should - * be valid Java identifiers. - * @param nameFactory the name factory from which names will be - * retrieved if the list of read names has been - * exhausted. - */ - public DictionaryNameFactory(Reader reader, - boolean validJavaIdentifiers, - NameFactory nameFactory) throws IOException - { - this.names = new ArrayList(); - this.nameFactory = nameFactory; - - try - { - StringBuffer buffer = new StringBuffer(); - - while (true) - { - // Read the next character. - int c = reader.read(); - - // Is it a valid identifier character? - if (c != -1 && - (validJavaIdentifiers ? - (buffer.length() == 0 ? - Character.isJavaIdentifierStart((char)c) : - Character.isJavaIdentifierPart((char)c)) : - (c != '\n' && - c != '\r' && - c != COMMENT_CHARACTER))) - { - // Append it to the current identifier. - buffer.append((char)c); - } - else - { - // Did we collect a new identifier? - if (buffer.length() > 0) - { - // Add the completed name to the list of names, if it's - // not in it yet. - String name = buffer.toString(); - if (!names.contains(name)) - { - names.add(name); - } - - // Clear the buffer. - buffer.setLength(0); - } - - // Is this the beginning of a comment line? - if (c == COMMENT_CHARACTER) - { - // Skip all characters till the end of the line. - do - { - c = reader.read(); - } - while (c != -1 && - c != '\n' && - c != '\r'); - } - - // Is this the end of the file? - if (c == -1) - { - // Just return. - return; - } - } - } - } - finally - { - reader.close(); - } - } - - - /** - * Creates a new DictionaryNameFactory. - * @param dictionaryNameFactory the dictionary name factory whose dictionary - * will be used. - * @param nameFactory the name factory from which names will be - * retrieved if the list of read names has been - * exhausted. - */ - public DictionaryNameFactory(DictionaryNameFactory dictionaryNameFactory, - NameFactory nameFactory) - { - this.names = dictionaryNameFactory.names; - this.nameFactory = nameFactory; - } - - - // Implementations for NameFactory. - - public void reset() - { - index = 0; - - nameFactory.reset(); - } - - - public String nextName() - { - String name; - - // Do we still have names? - if (index < names.size()) - { - // Return the next name. - name = (String)names.get(index++); - } - else - { - // Return the next different name from the other name factory. - do - { - name = nameFactory.nextName(); - } - while (names.contains(name)); - } - - return name; - } - - - public static void main(String[] args) - { - try - { - DictionaryNameFactory factory = - new DictionaryNameFactory(new File(args[0]), new SimpleNameFactory()); - - // For debugging, we're always using UTF-8 instead of the default - // character encoding, even for writing to the standard output. - PrintWriter out = - new PrintWriter(new OutputStreamWriter(System.out, "UTF-8")); - - for (int counter = 0; counter < 50; counter++) - { - out.println("[" + factory.nextName() + "]"); - } - - out.flush(); - } - catch (IOException ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MapCleaner.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MapCleaner.java deleted file mode 100644 index df333ba0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MapCleaner.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.Clazz; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.Map; - -/** - * This ClassVisitor clears a given map whenever it visits a class. - * - * @author Eric Lafortune - */ -public class MapCleaner -extends SimplifiedVisitor -implements ClassVisitor -{ - private final Map map; - - - /** - * Creates a new MapCleaner. - * @param map the map to be cleared. - */ - public MapCleaner(Map map) - { - this.map = map; - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - map.clear(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingKeeper.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingKeeper.java deleted file mode 100644 index 3933906c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingKeeper.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.util.ListUtil; - -/** - * This MappingKeeper applies the mappings that it receives to its class pool, - * so these mappings are ensured in a subsequent obfuscation step. - * - * @author Eric Lafortune - */ -public class MappingKeeper implements MappingProcessor -{ - private final ClassPool classPool; - private final WarningPrinter warningPrinter; - - // A field acting as a parameter. - private Clazz clazz; - - - /** - * Creates a new MappingKeeper. - * @param classPool the class pool in which class names and class - * member names have to be mapped. - * @param warningPrinter the optional warning printer to which warnings - * can be printed. - */ - public MappingKeeper(ClassPool classPool, - WarningPrinter warningPrinter) - { - this.classPool = classPool; - this.warningPrinter = warningPrinter; - } - - - // Implementations for MappingProcessor. - - public boolean processClassMapping(String className, - String newClassName) - { - // Find the class. - String name = ClassUtil.internalClassName(className); - - clazz = classPool.getClass(name); - if (clazz != null) - { - String newName = ClassUtil.internalClassName(newClassName); - - // Print out a warning if the mapping conflicts with a name that - // was set before. - if (warningPrinter != null) - { - String currentNewName = ClassObfuscator.newClassName(clazz); - if (currentNewName != null && - !currentNewName.equals(newName)) - { - warningPrinter.print(name, - currentNewName, - "Warning: " + - className + - " is not being kept as '" + - ClassUtil.externalClassName(currentNewName) + - "', but remapped to '" + - newClassName + "'"); - } - } - - ClassObfuscator.setNewClassName(clazz, newName); - - // The class members have to be kept as well. - return true; - } - - return false; - } - - - public void processFieldMapping(String className, - String fieldType, - String fieldName, - String newClassName, - String newFieldName) - { - if (clazz != null && className.equals(newClassName)) - { - // Find the field. - String name = fieldName; - String descriptor = ClassUtil.internalType(fieldType); - - Field field = clazz.findField(name, descriptor); - if (field != null) - { - // Print out a warning if the mapping conflicts with a name that - // was set before. - if (warningPrinter != null) - { - String currentNewName = MemberObfuscator.newMemberName(field); - if (currentNewName != null && - !currentNewName.equals(newFieldName)) - { - warningPrinter.print(ClassUtil.internalClassName(className), - "Warning: " + - className + - ": field '" + fieldType + " " + fieldName + - "' is not being kept as '" + currentNewName + - "', but remapped to '" + newFieldName + "'"); - } - } - - // Make sure the mapping name will be kept. - MemberObfuscator.setFixedNewMemberName(field, newFieldName); - } - } - } - - - public void processMethodMapping(String className, - int firstLineNumber, - int lastLineNumber, - String methodReturnType, - String methodName, - String methodArguments, - String newClassName, - int newFirstLineNumber, - int newLastLineNumber, - String newMethodName) - { - if (clazz != null && className.equals(newClassName)) - { - // Find the method. - String descriptor = ClassUtil.internalMethodDescriptor(methodReturnType, - ListUtil.commaSeparatedList(methodArguments)); - - Method method = clazz.findMethod(methodName, descriptor); - if (method != null) - { - // Print out a warning if the mapping conflicts with a name that - // was set before. - if (warningPrinter != null) - { - String currentNewName = MemberObfuscator.newMemberName(method); - if (currentNewName != null && - !currentNewName.equals(newMethodName)) - { - warningPrinter.print(ClassUtil.internalClassName(className), - "Warning: " + - className + - ": method '" + methodReturnType + " " + methodName + JavaConstants.METHOD_ARGUMENTS_OPEN + methodArguments + JavaConstants.METHOD_ARGUMENTS_CLOSE + - "' is not being kept as '" + currentNewName + - "', but remapped to '" + newMethodName + "'"); - } - } - - // Make sure the mapping name will be kept. - MemberObfuscator.setFixedNewMemberName(method, newMethodName); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingPrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingPrinter.java deleted file mode 100644 index f056ce68..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingPrinter.java +++ /dev/null @@ -1,365 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.peephole.LineNumberLinearizer; - -import java.io.PrintStream; -import java.util.Stack; - - -/** - * This ClassVisitor prints out the renamed classes and class members with - * their old names and new names. - * - * @see ClassRenamer - * - * @author Eric Lafortune - */ -public class MappingPrinter -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - private final PrintStream ps; - - // A field serving as a return value for the visitor methods. - private boolean printed; - - - /** - * Creates a new MappingPrinter that prints to System.out. - */ - public MappingPrinter() - { - this(System.out); - } - - - /** - * Creates a new MappingPrinter that prints to the given stream. - * @param printStream the stream to which to print - */ - public MappingPrinter(PrintStream printStream) - { - this.ps = printStream; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - String name = programClass.getName(); - String newName = ClassObfuscator.newClassName(programClass); - - // Print out the class mapping. - ps.println(ClassUtil.externalClassName(name) + - " -> " + - ClassUtil.externalClassName(newName) + - ":"); - - // Print out the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - String fieldName = programField.getName(programClass); - String obfuscatedFieldName = MemberObfuscator.newMemberName(programField); - if (obfuscatedFieldName == null) - { - obfuscatedFieldName = fieldName; - } - - // Print out the field mapping. - ps.println(" " + - ClassUtil.externalType(programField.getDescriptor(programClass)) + " " + - fieldName + - " -> " + - obfuscatedFieldName); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - String methodName = programMethod.getName(programClass); - String obfuscatedMethodName = MemberObfuscator.newMemberName(programMethod); - if (obfuscatedMethodName == null) - { - obfuscatedMethodName = methodName; - } - - // Print out the method mapping, if it has line numbers. - printed = false; - programMethod.attributesAccept(programClass, this); - - // Otherwise print out the method mapping without line numbers. - if (!printed) - { - ps.println(" " + - ClassUtil.externalMethodReturnType(programMethod.getDescriptor(programClass)) + " " + - methodName + JavaConstants.METHOD_ARGUMENTS_OPEN + - ClassUtil.externalMethodArguments(programMethod.getDescriptor(programClass)) + JavaConstants.METHOD_ARGUMENTS_CLOSE + - " -> " + - obfuscatedMethodName); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - LineNumberInfo[] lineNumberTable = lineNumberTableAttribute.lineNumberTable; - int lineNumberTableLength = lineNumberTableAttribute.u2lineNumberTableLength; - - String methodName = method.getName(clazz); - String methodDescriptor = method.getDescriptor(clazz); - String obfuscatedMethodName = MemberObfuscator.newMemberName(method); - if (obfuscatedMethodName == null) - { - obfuscatedMethodName = methodName; - } - - int lowestLineNumber = lineNumberTableAttribute.getLowestLineNumber(); - int highestLineNumber = lineNumberTableAttribute.getHighestLineNumber(); - - // Does the method have any local line numbers at all? - if (lineNumberTableAttribute.getSource(codeAttribute.u4codeLength) == null) - { - if (lowestLineNumber > 0) - { - // Print out the line number range of the method, - // ignoring line numbers of any inlined methods. - ps.println(" " + - lowestLineNumber + ":" + - highestLineNumber + ":" + - ClassUtil.externalMethodReturnType(method.getDescriptor(clazz)) + " " + - methodName + JavaConstants.METHOD_ARGUMENTS_OPEN + - ClassUtil.externalMethodArguments(method.getDescriptor(clazz)) + JavaConstants.METHOD_ARGUMENTS_CLOSE + - " -> " + - obfuscatedMethodName); - } - else - { - // Print out the method mapping without line numbers. - ps.println(" " + - ClassUtil.externalMethodReturnType(method.getDescriptor(clazz)) + " " + - methodName + JavaConstants.METHOD_ARGUMENTS_OPEN + - ClassUtil.externalMethodArguments(method.getDescriptor(clazz)) + JavaConstants.METHOD_ARGUMENTS_CLOSE + - " -> " + - obfuscatedMethodName); - } - } - - // Print out the line numbers of any inlined methods and their - // enclosing methods. - Stack enclosingLineNumbers = new Stack(); - - LineNumberInfo previousInfo = new LineNumberInfo(0, 0); - - for (int index = 0; index < lineNumberTableLength; index++) - { - LineNumberInfo info = lineNumberTable[index]; - - // Are we entering or exiting an inlined block (or a merged block)? - // We're testing on the identities out of convenience. - String previousSource = previousInfo.getSource(); - String source = info.getSource(); - if (source != previousSource) - { - // Are we entering or exiting the block? - int previousLineNumber = previousInfo.u2lineNumber; - int lineNumber = info.u2lineNumber; - if (lineNumber > previousLineNumber) - { - // We're entering an inlined block. - // Accumulate its enclosing line numbers, so they can be - // printed out for each inlined block. - if (index > 0) - { - enclosingLineNumbers.push(previousInfo); - } - - printInlinedMethodMapping(clazz.getName(), - methodName, - methodDescriptor, - info, - enclosingLineNumbers, - obfuscatedMethodName); - } - // TODO: There appear to be cases where the stack is empty at this point, so we've added a check. - else if (!enclosingLineNumbers.isEmpty()) - { - // We're exiting an inlined block. - // Pop its enclosing line number. - enclosingLineNumbers.pop(); - } - } - - previousInfo = info; - } - - printed = true; - } - - - // Small utility methods. - - /** - * Prints out the mapping of the specified inlined methods and its - * enclosing methods. - */ - private void printInlinedMethodMapping(String className, - String methodName, - String methodDescriptor, - LineNumberInfo inlinedInfo, - Stack enclosingLineNumbers, - String obfuscatedMethodName) - { - String source = inlinedInfo.getSource(); - - // Parse the information from the source string of the - // inlined method. - int separatorIndex1 = source.indexOf('.'); - int separatorIndex2 = source.indexOf('(', separatorIndex1 + 1); - int separatorIndex3 = source.indexOf(':', separatorIndex2 + 1); - int separatorIndex4 = source.indexOf(':', separatorIndex3 + 1); - - String inlinedClassName = source.substring(0, separatorIndex1); - String inlinedMethodName = source.substring(separatorIndex1 + 1, separatorIndex2); - String inlinedMethodDescriptor = source.substring(separatorIndex2, separatorIndex3); - String inlinedRange = source.substring(separatorIndex3); - - int startLineNumber = Integer.parseInt(source.substring(separatorIndex3 + 1, separatorIndex4)); - int endLineNumber = Integer.parseInt(source.substring(separatorIndex4 + 1)); - - // Compute the shifted line number range. - int shiftedStartLineNumber = inlinedInfo.u2lineNumber; - int shiftedEndLineNumber = shiftedStartLineNumber + endLineNumber - startLineNumber; - - // Print out the line number range of the inlined method. - ps.println(" " + - shiftedStartLineNumber + ":" + - shiftedEndLineNumber + ":" + - ClassUtil.externalMethodReturnType(inlinedMethodDescriptor) + " " + - (inlinedClassName.equals(className) ? "" : - ClassUtil.externalClassName(inlinedClassName) + JavaConstants.PACKAGE_SEPARATOR) + - inlinedMethodName + JavaConstants.METHOD_ARGUMENTS_OPEN + - ClassUtil.externalMethodArguments(inlinedMethodDescriptor) + JavaConstants.METHOD_ARGUMENTS_CLOSE + - inlinedRange + " -> " + - obfuscatedMethodName); - - // Print out the line numbers of the accumulated enclosing - // methods. - for (int enclosingIndex = enclosingLineNumbers.size()-1; enclosingIndex >= 0; enclosingIndex--) - { - LineNumberInfo enclosingInfo = - (LineNumberInfo)enclosingLineNumbers.get(enclosingIndex); - - printEnclosingMethodMapping(className, - methodName, - methodDescriptor, - shiftedStartLineNumber + ":" + - shiftedEndLineNumber, - enclosingInfo, - obfuscatedMethodName); - - - } - } - - - /** - * Prints out the mapping of the specified enclosing method. - */ - private void printEnclosingMethodMapping(String className, - String methodName, - String methodDescriptor, - String shiftedRange, - LineNumberInfo enclosingInfo, - String obfuscatedMethodName) - { - // Parse the information from the source string of the enclosing - // method. - String enclosingSource = enclosingInfo.getSource(); - - String enclosingClassName; - String enclosingMethodName; - String enclosingMethodDescriptor; - int enclosingLineNumber; - - if (enclosingSource == null) - { - enclosingClassName = className; - enclosingMethodName = methodName; - enclosingMethodDescriptor = methodDescriptor; - enclosingLineNumber = enclosingInfo.u2lineNumber; - } - else - { - int enclosingSeparatorIndex1 = enclosingSource.indexOf('.'); - int enclosingSeparatorIndex2 = enclosingSource.indexOf('(', enclosingSeparatorIndex1 + 1); - int enclosingSeparatorIndex3 = enclosingSource.indexOf(':', enclosingSeparatorIndex2 + 1); - int enclosingSeparatorIndex4 = enclosingSource.indexOf(':', enclosingSeparatorIndex3 + 1); - - // We need the first line number to correct the shifted enclosing - // line number back to its original range. - int firstLineNumber = Integer.parseInt(enclosingSource.substring(enclosingSeparatorIndex3 + 1, enclosingSeparatorIndex4)); - - enclosingClassName = enclosingSource.substring(0, enclosingSeparatorIndex1); - enclosingMethodName = enclosingSource.substring(enclosingSeparatorIndex1 + 1, enclosingSeparatorIndex2); - enclosingMethodDescriptor = enclosingSource.substring(enclosingSeparatorIndex2, enclosingSeparatorIndex3); - enclosingLineNumber = (enclosingInfo.u2lineNumber - firstLineNumber) % LineNumberLinearizer.SHIFT_ROUNDING + firstLineNumber; - } - - // Print out the line number of the enclosing method. - ps.println(" " + - shiftedRange + ":" + - ClassUtil.externalMethodReturnType(enclosingMethodDescriptor) + " " + - (enclosingClassName.equals(className) ? "" : - ClassUtil.externalClassName(enclosingClassName) + JavaConstants.PACKAGE_SEPARATOR) + - enclosingMethodName + JavaConstants.METHOD_ARGUMENTS_OPEN + - ClassUtil.externalMethodArguments(enclosingMethodDescriptor) + JavaConstants.METHOD_ARGUMENTS_CLOSE + ":" + - enclosingLineNumber + " -> " + - obfuscatedMethodName); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingProcessor.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingProcessor.java deleted file mode 100644 index 8658ff19..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingProcessor.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -/** - * This interface specifies methods to process name mappings between original - * classes and their obfuscated versions. The mappings are typically read - * from a mapping file. - * - * @see MappingReader - * - * @author Eric Lafortune - */ -public interface MappingProcessor -{ - /** - * Processes the given class name mapping. - * - * @param className the original class name. - * @param newClassName the new class name. - * @return whether the processor is interested in receiving mappings of the - * class members of this class. - */ - public boolean processClassMapping(String className, - String newClassName); - - /** - * Processes the given field name mapping. - * @param className the original class name. - * @param fieldType the original external field type. - * @param fieldName the original field name. - * @param newClassName the new class name. - * @param newFieldName the new field name. - */ - public void processFieldMapping(String className, - String fieldType, - String fieldName, - String newClassName, - String newFieldName); - - /** - * Processes the given method name mapping. - * @param className the original class name. - * @param firstLineNumber the first line number of the method, or 0 if - * it is not known. - * @param lastLineNumber the last line number of the method, or 0 if - * it is not known. - * @param methodReturnType the original external method return type. - * @param methodName the original external method name. - * @param methodArguments the original external method arguments. - * @param newClassName the new class name. - * @param newFirstLineNumber the new first line number of the method, or 0 - * if it is not known. - * @param newLastLineNumber the new last line number of the method, or 0 - * if it is not known. - * @param newMethodName the new method name. - */ - public void processMethodMapping(String className, - int firstLineNumber, - int lastLineNumber, - String methodReturnType, - String methodName, - String methodArguments, - String newClassName, - int newFirstLineNumber, - int newLastLineNumber, - String newMethodName); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingReader.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingReader.java deleted file mode 100644 index 802532fd..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MappingReader.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import java.io.*; - - -/** - * This class can parse mapping files and invoke a processor for each of the - * mapping entries. - * - * @author Eric Lafortune - */ -public class MappingReader -{ - private final File mappingFile; - - - public MappingReader(File mappingFile) - { - this.mappingFile = mappingFile; - } - - - /** - * Reads the mapping file, presenting all of the encountered mapping entries - * to the given processor. - */ - public void pump(MappingProcessor mappingProcessor) throws IOException - { - LineNumberReader reader = new LineNumberReader( - new BufferedReader( - new FileReader(mappingFile))); - try - { - String className = null; - - // Read the subsequent class mappings and class member mappings. - while (true) - { - String line = reader.readLine(); - - if (line == null) - { - break; - } - - line = line.trim(); - - // Is it a non-comment line? - if (!line.startsWith("#")) - { - // Is it a class mapping or a class member mapping? - if (line.endsWith(":")) - { - // Process the class mapping and remember the class's - // old name. - className = processClassMapping(line, mappingProcessor); - } - else if (className != null) - { - // Process the class member mapping, in the context of - // the current old class name. - processClassMemberMapping(className, line, mappingProcessor); - } - } - } - } - catch (IOException ex) - { - throw new IOException("Can't process mapping file (" + ex.getMessage() + ")"); - } - finally - { - try - { - reader.close(); - } - catch (IOException ex) - { - // This shouldn't happen. - } - } - } - - - /** - * Parses the given line with a class mapping and processes the - * results with the given mapping processor. Returns the old class name, - * or null if any subsequent class member lines can be ignored. - */ - private String processClassMapping(String line, - MappingProcessor mappingProcessor) - { - // See if we can parse "___ -> ___:", containing the original - // class name and the new class name. - - int arrowIndex = line.indexOf("->"); - if (arrowIndex < 0) - { - return null; - } - - int colonIndex = line.indexOf(':', arrowIndex + 2); - if (colonIndex < 0) - { - return null; - } - - // Extract the elements. - String className = line.substring(0, arrowIndex).trim(); - String newClassName = line.substring(arrowIndex + 2, colonIndex).trim(); - - // Process this class name mapping. - boolean interested = mappingProcessor.processClassMapping(className, newClassName); - - return interested ? className : null; - } - - - /** - * Parses the given line with a class member mapping and processes the - * results with the given mapping processor. - */ - private void processClassMemberMapping(String className, - String line, - MappingProcessor mappingProcessor) - { - // See if we can parse one of - // ___ ___ -> ___ - // ___:___:___ ___(___) -> ___ - // ___:___:___ ___(___):___ -> ___ - // ___:___:___ ___(___):___:___ -> ___ - // containing the optional line numbers, the return type, the original - // field/method name, optional arguments, the optional original line - // numbers, and the new field/method name. The original field/method - // name may contain an original class name "___.___". - - int colonIndex1 = line.indexOf(':'); - int colonIndex2 = colonIndex1 < 0 ? -1 : line.indexOf(':', colonIndex1 + 1); - int spaceIndex = line.indexOf(' ', colonIndex2 + 2); - int argumentIndex1 = line.indexOf('(', spaceIndex + 1); - int argumentIndex2 = argumentIndex1 < 0 ? -1 : line.indexOf(')', argumentIndex1 + 1); - int colonIndex3 = argumentIndex2 < 0 ? -1 : line.indexOf(':', argumentIndex2 + 1); - int colonIndex4 = colonIndex3 < 0 ? -1 : line.indexOf(':', colonIndex3 + 1); - int arrowIndex = line.indexOf("->", (colonIndex4 >= 0 ? colonIndex4 : - colonIndex3 >= 0 ? colonIndex3 : - argumentIndex2 >= 0 ? argumentIndex2 : - spaceIndex) + 1); - - if (spaceIndex < 0 || - arrowIndex < 0) - { - return; - } - - // Extract the elements. - String type = line.substring(colonIndex2 + 1, spaceIndex).trim(); - String name = line.substring(spaceIndex + 1, argumentIndex1 >= 0 ? argumentIndex1 : arrowIndex).trim(); - String newName = line.substring(arrowIndex + 2).trim(); - - // Does the method name contain an explicit original class name? - String newClassName = className; - int dotIndex = name.lastIndexOf('.'); - if (dotIndex >= 0) - { - className = name.substring(0, dotIndex); - name = name.substring(dotIndex + 1); - } - - // Process this class member mapping. - if (type.length() > 0 && - name.length() > 0 && - newName.length() > 0) - { - // Is it a field or a method? - if (argumentIndex2 < 0) - { - mappingProcessor.processFieldMapping(className, - type, - name, - newClassName, - newName); - } - else - { - int firstLineNumber = 0; - int lastLineNumber = 0; - int newFirstLineNumber = 0; - int newLastLineNumber = 0; - - if (colonIndex2 >= 0) - { - firstLineNumber = newFirstLineNumber = Integer.parseInt(line.substring(0, colonIndex1).trim()); - lastLineNumber = newLastLineNumber = Integer.parseInt(line.substring(colonIndex1 + 1, colonIndex2).trim()); - } - - if (colonIndex3 >= 0) - { - firstLineNumber = Integer.parseInt(line.substring(colonIndex3 + 1, colonIndex4 > 0 ? colonIndex4 : arrowIndex).trim()); - lastLineNumber = colonIndex4 < 0 ? firstLineNumber : - Integer.parseInt(line.substring(colonIndex4 + 1, arrowIndex).trim()); - } - - String arguments = line.substring(argumentIndex1 + 1, argumentIndex2).trim(); - - mappingProcessor.processMethodMapping(className, - firstLineNumber, - lastLineNumber, - type, - name, - arguments, - newClassName, - newFirstLineNumber, - newLastLineNumber, - newName); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameCleaner.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameCleaner.java deleted file mode 100644 index 35e48b4b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameCleaner.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor clears the new names of the class members - * that it visits. - * - * @see MemberObfuscator - * - * @author Eric Lafortune - */ -public class MemberNameCleaner implements MemberVisitor -{ - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - MemberObfuscator.setNewMemberName(programField, null); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - MemberObfuscator.setNewMemberName(programMethod, null); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - MemberObfuscator.setNewMemberName(libraryField, null); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - MemberObfuscator.setNewMemberName(libraryMethod, null); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameCollector.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameCollector.java deleted file mode 100644 index 90c6115c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameCollector.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -import java.util.Map; - -/** - * This MemberVisitor collects all new (obfuscation) names of the members - * that it visits. - * - * @see MemberObfuscator - * - * @author Eric Lafortune - */ -public class MemberNameCollector -extends SimplifiedVisitor -implements MemberVisitor -{ - private final boolean allowAggressiveOverloading; - private final Map descriptorMap; - - - /** - * Creates a new MemberNameCollector. - * @param allowAggressiveOverloading a flag that specifies whether class - * members can be overloaded aggressively. - * @param descriptorMap the map of descriptors to - * [new name - old name] maps. - */ - public MemberNameCollector(boolean allowAggressiveOverloading, - Map descriptorMap) - { - this.allowAggressiveOverloading = allowAggressiveOverloading; - this.descriptorMap = descriptorMap; - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - // Special cases: and are always kept unchanged. - // We can ignore them here. - String name = member.getName(clazz); - if (ClassUtil.isInitializer(name)) - { - return; - } - - // Get the member's new name. - String newName = MemberObfuscator.newMemberName(member); - - // Remember it, if it has already been set. - if (newName != null) - { - // Get the member's descriptor. - String descriptor = member.getDescriptor(clazz); - - // Check whether we're allowed to do aggressive overloading - if (!allowAggressiveOverloading) - { - // Trim the return argument from the descriptor if not. - // Works for fields and methods alike. - descriptor = descriptor.substring(0, descriptor.indexOf(')')+1); - } - - // Put the [descriptor - new name] in the map, - // creating a new [new name - old name] map if necessary. - Map nameMap = MemberObfuscator.retrieveNameMap(descriptorMap, descriptor); - - // Isn't there another original name for this new name, or should - // this original name get priority? - String otherName = (String)nameMap.get(newName); - if (otherName == null || - MemberObfuscator.hasFixedNewMemberName(member) || - name.compareTo(otherName) < 0) - { - // Remember not to use the new name again in this name space. - nameMap.put(newName, name); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameConflictFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameConflictFixer.java deleted file mode 100644 index a6249599..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameConflictFixer.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -import java.util.Map; - -/** - * This MemberInfoVisitor solves obfuscation naming conflicts in all class - * members that it visits. It avoids names from the given descriptor map, - * delegating to the given obfuscator in order to get a new name if necessary. - * - * @author Eric Lafortune - */ -public class MemberNameConflictFixer implements MemberVisitor -{ - private final boolean allowAggressiveOverloading; - private final Map descriptorMap; - private final WarningPrinter warningPrinter; - private final MemberObfuscator memberObfuscator; - - - /** - * Creates a new MemberNameConflictFixer. - * @param allowAggressiveOverloading a flag that specifies whether class - * members can be overloaded aggressively. - * @param descriptorMap the map of descriptors to - * [new name - old name] maps. - * @param warningPrinter an optional warning printer to which - * warnings about conflicting name - * mappings can be printed. - * @param memberObfuscator the obfuscator that can assign new - * names to members with conflicting - * names. - */ - public MemberNameConflictFixer(boolean allowAggressiveOverloading, - Map descriptorMap, - WarningPrinter warningPrinter, - MemberObfuscator memberObfuscator) - { - this.allowAggressiveOverloading = allowAggressiveOverloading; - this.descriptorMap = descriptorMap; - this.warningPrinter = warningPrinter; - this.memberObfuscator = memberObfuscator; - } - - - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - visitMember(programClass, programField, true); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Special cases: and are always kept unchanged. - // We can ignore them here. - String name = programMethod.getName(programClass); - if (ClassUtil.isInitializer(name)) - { - return; - } - - visitMember(programClass, programMethod, false); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - - /** - * Obfuscates the given class member. - * @param clazz the class of the given member. - * @param member the class member to be obfuscated. - * @param isField specifies whether the class member is a field. - */ - private void visitMember(Clazz clazz, - Member member, - boolean isField) - { - // Get the member's name and descriptor. - String name = member.getName(clazz); - String descriptor = member.getDescriptor(clazz); - - // Check whether we're allowed to overload aggressively. - if (!allowAggressiveOverloading) - { - // Trim the return argument from the descriptor if not. - // Works for fields and methods alike. - descriptor = descriptor.substring(0, descriptor.indexOf(')')+1); - } - - // Get the name map. - Map nameMap = MemberObfuscator.retrieveNameMap(descriptorMap, descriptor); - - // Get the member's new name. - String newName = MemberObfuscator.newMemberName(member); - - // Get the expected old name for this new name. - String previousName = (String)nameMap.get(newName); - if (previousName != null && - !name.equals(previousName)) - { - // There's a conflict! A member (with a given old name) in a - // first namespace has received the same new name as this - // member (with a different old name) in a second name space, - // and now these two have to live together in this name space. - if (MemberObfuscator.hasFixedNewMemberName(member) && - warningPrinter != null) - { - descriptor = member.getDescriptor(clazz); - warningPrinter.print(clazz.getName(), - "Warning: " + ClassUtil.externalClassName(clazz.getName()) + - (isField ? - ": field '" + ClassUtil.externalFullFieldDescription(0, name, descriptor) : - ": method '" + ClassUtil.externalFullMethodDescription(clazz.getName(), 0, name, descriptor)) + - "' can't be mapped to '" + newName + - "' because it would conflict with " + - (isField ? - "field '" : - "method '" ) + previousName + - "', which is already being mapped to '" + newName + "'"); - } - - // Clear the conflicting name. - MemberObfuscator.setNewMemberName(member, null); - - // Assign a new name. - member.accept(clazz, memberObfuscator); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameFilter.java deleted file mode 100644 index 0e381a85..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberNameFilter.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when the visited member has a new name. - * Constructors are judged based on the class name. - * - * @see ClassObfuscator - * @see MemberObfuscator - * - * @author Eric Lafortune - */ -public class MemberNameFilter implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MemberNameFilter. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberNameFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (hasName(programField)) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (hasName(programClass, programMethod)) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (hasName(libraryField)) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (hasName(libraryClass, libraryMethod)) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } - - - // Small utility methods. - - /** - * Returns whether the given class has a new name. - */ - private boolean hasName(Clazz clazz) - { - return ClassObfuscator.newClassName(clazz) != null; - } - - - /** - * Returns whether the given method has a new name. - */ - private boolean hasName(Clazz clazz, Method method) - { - return - hasName(method) || - (hasName(clazz) && - method.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT)); - } - - - /** - * Returns whether the given class member has a new name. - */ - private boolean hasName(Member member) - { - return MemberObfuscator.newMemberName(member) != null; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberObfuscator.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberObfuscator.java deleted file mode 100644 index 02093dac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberObfuscator.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -import java.util.*; - -/** - * This MemberVisitor obfuscates all class members that it visits. - * It uses names from the given name factory. At the same time, it avoids names - * from the given descriptor map. - *

- * The class members must have been linked before applying this visitor. - * - * @see MethodLinker - * - * @author Eric Lafortune - */ -public class MemberObfuscator -extends SimplifiedVisitor -implements MemberVisitor -{ - private final boolean allowAggressiveOverloading; - private final NameFactory nameFactory; - private final Map descriptorMap; - - - /** - * Creates a new MemberObfuscator. - * @param allowAggressiveOverloading a flag that specifies whether class - * members can be overloaded aggressively. - * @param nameFactory the factory that can produce - * obfuscated member names. - * @param descriptorMap the map of descriptors to - * [new name - old name] maps. - */ - public MemberObfuscator(boolean allowAggressiveOverloading, - NameFactory nameFactory, - Map descriptorMap) - { - this.allowAggressiveOverloading = allowAggressiveOverloading; - this.nameFactory = nameFactory; - this.descriptorMap = descriptorMap; - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - // Special cases: and are always kept unchanged. - // We can ignore them here. - String name = member.getName(clazz); - if (ClassUtil.isInitializer(name)) - { - return; - } - - // Get the member's descriptor. - String descriptor = member.getDescriptor(clazz); - - // Check whether we're allowed to overload aggressively. - if (!allowAggressiveOverloading) - { - // Trim the return argument from the descriptor if not. - // Works for fields and methods alike. - descriptor = descriptor.substring(0, descriptor.indexOf(')')+1); - } - - // Get the name map, creating a new one if necessary. - Map nameMap = retrieveNameMap(descriptorMap, descriptor); - - // Get the member's new name. - String newName = newMemberName(member); - - // Assign a new one, if necessary. - if (newName == null) - { - // Find an acceptable new name. - nameFactory.reset(); - - do - { - newName = nameFactory.nextName(); - } - while (nameMap.containsKey(newName)); - - // Remember not to use the new name again in this name space. - nameMap.put(newName, name); - - // Assign the new name. - setNewMemberName(member, newName); - } - } - - - // Small utility methods. - - /** - * Gets the name map, based on the given map and a given descriptor. - * A new empty map is created if necessary. - * @param descriptorMap the map of descriptors to [new name - old name] maps. - * @param descriptor the class member descriptor. - * @return the corresponding name map. - */ - static Map retrieveNameMap(Map descriptorMap, String descriptor) - { - // See if we can find the nested map with this descriptor key. - Map nameMap = (Map)descriptorMap.get(descriptor); - - // Create a new one if not. - if (nameMap == null) - { - nameMap = new HashMap(); - descriptorMap.put(descriptor, nameMap); - } - - return nameMap; - } - - - /** - * Assigns a fixed new name to the given class member. - * @param member the class member. - * @param name the new name. - */ - static void setFixedNewMemberName(Member member, String name) - { - VisitorAccepter lastVisitorAccepter = MethodLinker.lastVisitorAccepter(member); - - if (!(lastVisitorAccepter instanceof LibraryMember) && - !(lastVisitorAccepter instanceof MyFixedName)) - { - lastVisitorAccepter.setVisitorInfo(new MyFixedName(name)); - } - else - { - lastVisitorAccepter.setVisitorInfo(name); - } - } - - - /** - * Assigns a new name to the given class member. - * @param member the class member. - * @param name the new name. - */ - static void setNewMemberName(Member member, String name) - { - MethodLinker.lastVisitorAccepter(member).setVisitorInfo(name); - } - - - /** - * Returns whether the new name of the given class member is fixed. - * @param member the class member. - * @return whether its new name is fixed. - */ - static boolean hasFixedNewMemberName(Member member) - { - VisitorAccepter lastVisitorAccepter = MethodLinker.lastVisitorAccepter(member); - - return lastVisitorAccepter instanceof LibraryMember || - lastVisitorAccepter instanceof MyFixedName; - } - - - /** - * Retrieves the new name of the given class member. - * @param member the class member. - * @return the class member's new name, or null if it doesn't - * have one yet. - */ - static String newMemberName(Member member) - { - return (String)MethodLinker.lastVisitorAccepter(member).getVisitorInfo(); - } - - - /** - * This VisitorAccepter can be used to wrap a name string, to indicate that - * the name is fixed. - */ - private static class MyFixedName implements VisitorAccepter - { - private String newName; - - - public MyFixedName(String newName) - { - this.newName = newName; - } - - - // Implementations for VisitorAccepter. - - public Object getVisitorInfo() - { - return newName; - } - - - public void setVisitorInfo(Object visitorInfo) - { - newName = (String)visitorInfo; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberSpecialNameFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberSpecialNameFilter.java deleted file mode 100644 index 7af71b74..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MemberSpecialNameFilter.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when the visited member has a - * special new name. A special name is a name that might have been produced by - * a SpecialNameFactory. - * - * @see MemberObfuscator - * @see SpecialNameFactory - * - * @author Eric Lafortune - */ -public class MemberSpecialNameFilter implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new MemberSpecialNameFilter. - * @param memberVisitor the MemberVisitor to which - * visits will be delegated. - */ - public MemberSpecialNameFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (hasSpecialName(programField)) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (hasSpecialName(programMethod)) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (hasSpecialName(libraryField)) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (hasSpecialName(libraryMethod)) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } - - - // Small utility methods. - - /** - * Returns whether the given class member has a special new name. - * @param member the class member. - */ - private static boolean hasSpecialName(Member member) - { - return SpecialNameFactory.isSpecialName(MemberObfuscator.newMemberName(member)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MultiMappingProcessor.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MultiMappingProcessor.java deleted file mode 100644 index 5e4f6ea1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/MultiMappingProcessor.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -/** - * This MappingKeeper delegates all method calls to each MappingProcessor - * in a given list. - * - * @author Eric Lafortune - */ -public class MultiMappingProcessor -implements MappingProcessor -{ - private final MappingProcessor[] mappingProcessors; - - - /** - * Creates a new MultiMappingProcessor. - * @param mappingProcessors the mapping processors to which method calls - * will be delegated. - */ - public MultiMappingProcessor(MappingProcessor[] mappingProcessors) - { - this.mappingProcessors = mappingProcessors; - } - - - // Implementations for MappingProcessor. - - public boolean processClassMapping(String className, - String newClassName) - { - boolean result = false; - - for (int index = 0; index < mappingProcessors.length; index++) - { - result |= mappingProcessors[index].processClassMapping(className, - newClassName); - } - - return result; - } - - - public void processFieldMapping(String className, - String fieldType, - String fieldName, - String newClassName, - String newFieldName) - { - for (int index = 0; index < mappingProcessors.length; index++) - { - mappingProcessors[index].processFieldMapping(className, - fieldType, - fieldName, - newClassName, - newFieldName); - } - } - - - public void processMethodMapping(String className, - int firstLineNumber, - int lastLineNumber, - String methodReturnType, - String methodName, - String methodArguments, - String newClassName, - int newFirstLineNumber, - int newLastLineNumber, - String newMethodName) - { - for (int index = 0; index < mappingProcessors.length; index++) - { - mappingProcessors[index].processMethodMapping(className, - firstLineNumber, - lastLineNumber, - methodReturnType, - methodName, - methodArguments, - newClassName, - newFirstLineNumber, - newLastLineNumber, - newMethodName); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameFactory.java deleted file mode 100644 index dd307c1e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -/** - * This interfaces provides methods to generate unique sequences of names. - * The names must be valid Java identifiers. - * - * @author Eric Lafortune - */ -public interface NameFactory -{ - public void reset(); - - public String nextName(); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameFactoryResetter.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameFactoryResetter.java deleted file mode 100644 index e2b982a6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameFactoryResetter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor resets a given name factory whenever it visits a class - * file. - * - * @author Eric Lafortune - */ -public class NameFactoryResetter implements ClassVisitor -{ - private final NameFactory nameFactory; - - - /** - * Creates a new NameFactoryResetter. - * @param nameFactory the name factory to be reset. - */ - public NameFactoryResetter(NameFactory nameFactory) - { - this.nameFactory = nameFactory; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - nameFactory.reset(); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - nameFactory.reset(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameMarker.java deleted file mode 100644 index a690299c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NameMarker.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - - -/** - * This ClassVisitor and MemberVisitor - * marks names of the classes and class members it visits. The marked names - * will remain unchanged in the obfuscation step. - * - * @see ClassObfuscator - * @see MemberObfuscator - * - * @author Eric Lafortune - */ -class NameMarker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor, - InnerClassesInfoVisitor, - ConstantVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - keepClassName(programClass); - - // Make sure any outer class names are kept as well. - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - keepClassName(libraryClass); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - keepFieldName(programClass, programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - keepMethodName(programClass, programMethod); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - keepFieldName(libraryClass, libraryField); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - keepMethodName(libraryClass, libraryMethod); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Make sure the outer class names are kept as well. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - // Make sure the outer class name is kept as well. - int innerClassIndex = innerClassesInfo.u2innerClassIndex; - int outerClassIndex = innerClassesInfo.u2outerClassIndex; - if (innerClassIndex != 0 && - outerClassIndex != 0 && - clazz.getClassName(innerClassIndex).equals(clazz.getName())) - { - clazz.constantPoolEntryAccept(outerClassIndex, this); - } - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Make sure the outer class name is kept as well. - classConstant.referencedClassAccept(this); - } - - - // Small utility method. - - /** - * Ensures the name of the given class name will be kept. - */ - public void keepClassName(Clazz clazz) - { - ClassObfuscator.setNewClassName(clazz, - clazz.getName()); - } - - - /** - * Ensures the name of the given field name will be kept. - */ - private void keepFieldName(Clazz clazz, Field field) - { - MemberObfuscator.setFixedNewMemberName(field, - field.getName(clazz)); - } - - - /** - * Ensures the name of the given method name will be kept. - */ - private void keepMethodName(Clazz clazz, Method method) - { - String name = method.getName(clazz); - - if (!ClassUtil.isInitializer(name)) - { - MemberObfuscator.setFixedNewMemberName(method, name); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NumericNameFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NumericNameFactory.java deleted file mode 100644 index 62e663fc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/NumericNameFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -/** - * This NameFactory generates unique numeric names, starting at - * "1". - * - * @author Eric Lafortune - */ -public class NumericNameFactory implements NameFactory -{ - private int index; - - - // Implementations for NameFactory. - - public void reset() - { - index = 0; - } - - - public String nextName() - { - return Integer.toString(++index); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/Obfuscator.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/Obfuscator.java deleted file mode 100644 index 26fc28e5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/Obfuscator.java +++ /dev/null @@ -1,513 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.*; -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.util.*; - -import java.io.*; -import java.util.*; - -/** - * This class can perform obfuscation of class pools according to a given - * specification. - * - * @author Eric Lafortune - */ -public class Obfuscator -{ - private final Configuration configuration; - - - /** - * Creates a new Obfuscator. - */ - public Obfuscator(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Performs obfuscation of the given program class pool. - */ - public void execute(ClassPool programClassPool, - ClassPool libraryClassPool) throws IOException - { - // Check if we have at least some keep commands. - if (configuration.keep == null && - configuration.applyMapping == null && - configuration.printMapping == null) - { - throw new IOException("You have to specify '-keep' options for the obfuscation step."); - } - - // Clean up any old visitor info. - programClassPool.classesAccept(new ClassCleaner()); - libraryClassPool.classesAccept(new ClassCleaner()); - - // If the class member names have to correspond globally, - // link all class members in all classes, otherwise - // link all non-private methods in all class hierarchies. - ClassVisitor memberInfoLinker = - configuration.useUniqueClassMemberNames ? - (ClassVisitor)new AllMemberVisitor(new MethodLinker()) : - (ClassVisitor)new BottomClassFilter(new MethodLinker()); - - programClassPool.classesAccept(memberInfoLinker); - libraryClassPool.classesAccept(memberInfoLinker); - - // Create a visitor for marking the seeds. - NameMarker nameMarker = new NameMarker(); - ClassPoolVisitor classPoolvisitor = - new KeepClassSpecificationVisitorFactory(false, false, true) - .createClassPoolVisitor(configuration.keep, - nameMarker, - nameMarker, - nameMarker, - null); - // Mark the seeds. - programClassPool.accept(classPoolvisitor); - libraryClassPool.accept(classPoolvisitor); - - // All library classes and library class members keep their names. - libraryClassPool.classesAccept(nameMarker); - libraryClassPool.classesAccept(new AllMemberVisitor(nameMarker)); - - // We also keep the names of the abstract methods of functional - // interfaces referenced from bootstrap method arguments (additional - // interfaces with LambdaMetafactory.altMetafactory). - // The functional method names have to match the names in the - // dynamic method invocations with LambdaMetafactory. - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_7, - new AllAttributeVisitor( - new AttributeNameFilter(ClassConstants.ATTR_BootstrapMethods, - new AllBootstrapMethodInfoVisitor( - new AllBootstrapMethodArgumentVisitor( - new ConstantTagFilter(ClassConstants.CONSTANT_Class, - new ReferencedClassVisitor( - new FunctionalInterfaceFilter( - new ClassHierarchyTraveler(true, false, true, false, - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - nameMarker)))))))))))); - - // We also keep the names of the abstract methods of functional - // interfaces that are returned by dynamic method invocations. - // The functional method names have to match the names in the - // dynamic method invocations with LambdaMetafactory. - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_7, - new AllConstantVisitor( - new DynamicReturnedClassVisitor( - new FunctionalInterfaceFilter( - new ClassHierarchyTraveler(true, false, true, false, - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - nameMarker)))))))); - - // Mark attributes that have to be kept. - AttributeVisitor attributeUsageMarker = - new NonEmptyAttributeFilter( - new AttributeUsageMarker()); - - AttributeVisitor optionalAttributeUsageMarker = - configuration.keepAttributes == null ? null : - new AttributeNameFilter(configuration.keepAttributes, - attributeUsageMarker); - - programClassPool.classesAccept( - new AllAttributeVisitor(true, - new RequiredAttributeFilter(attributeUsageMarker, - optionalAttributeUsageMarker))); - - // Keep parameter names and types if specified. - if (configuration.keepParameterNames) - { - programClassPool.classesAccept( - new AllMethodVisitor( - new MemberNameFilter( - new AllAttributeVisitor(true, - new ParameterNameMarker(attributeUsageMarker))))); - } - - // Remove the attributes that can be discarded. Note that the attributes - // may only be discarded after the seeds have been marked, since the - // configuration may rely on annotations. - programClassPool.classesAccept(new AttributeShrinker()); - - // Apply the mapping, if one has been specified. The mapping can - // override the names of library classes and of library class members. - if (configuration.applyMapping != null) - { - WarningPrinter warningPrinter = new WarningPrinter(System.err, configuration.warn); - - MappingReader reader = new MappingReader(configuration.applyMapping); - - MappingProcessor keeper = - new MultiMappingProcessor(new MappingProcessor[] - { - new MappingKeeper(programClassPool, warningPrinter), - new MappingKeeper(libraryClassPool, null), - }); - - reader.pump(keeper); - - // Print out a summary of the warnings if necessary. - int warningCount = warningPrinter.getWarningCount(); - if (warningCount > 0) - { - System.err.println("Warning: there were " + warningCount + - " kept classes and class members that were remapped anyway."); - System.err.println(" You should adapt your configuration or edit the mapping file."); - - if (!configuration.ignoreWarnings) - { - System.err.println(" If you are sure this remapping won't hurt, you could try your luck"); - System.err.println(" using the '-ignorewarnings' option."); - } - - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#mappingconflict1)"); - - if (!configuration.ignoreWarnings) - { - throw new IOException("Please correct the above warnings first."); - } - } - } - - // Come up with new names for all classes. - DictionaryNameFactory classNameFactory = configuration.classObfuscationDictionary != null ? - new DictionaryNameFactory(configuration.classObfuscationDictionary, null) : - null; - - DictionaryNameFactory packageNameFactory = configuration.packageObfuscationDictionary != null ? - new DictionaryNameFactory(configuration.packageObfuscationDictionary, null) : - null; - - programClassPool.classesAccept( - new ClassObfuscator(programClassPool, - libraryClassPool, - classNameFactory, - packageNameFactory, - configuration.useMixedCaseClassNames, - configuration.keepPackageNames, - configuration.flattenPackageHierarchy, - configuration.repackageClasses, - configuration.allowAccessModification)); - - // Come up with new names for all class members. - NameFactory nameFactory = new SimpleNameFactory(); - if (configuration.obfuscationDictionary != null) - { - nameFactory = - new DictionaryNameFactory(configuration.obfuscationDictionary, - nameFactory); - } - - WarningPrinter warningPrinter = new WarningPrinter(System.err, configuration.warn); - - // Maintain a map of names to avoid [descriptor - new name - old name]. - Map descriptorMap = new HashMap(); - - // Do the class member names have to be globally unique? - if (configuration.useUniqueClassMemberNames) - { - // Collect all member names in all classes. - programClassPool.classesAccept( - new AllMemberVisitor( - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap))); - - // Assign new names to all members in all classes. - programClassPool.classesAccept( - new AllMemberVisitor( - new MemberObfuscator(configuration.overloadAggressively, - nameFactory, - descriptorMap))); - } - else - { - // Come up with new names for all non-private class members. - programClassPool.classesAccept( - new MultiClassVisitor( - // Collect all private member names in this class and down - // the hierarchy. - new ClassHierarchyTraveler(true, false, false, true, - new AllMemberVisitor( - new MemberAccessFilter(ClassConstants.ACC_PRIVATE, 0, - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)))), - - // Collect all non-private member names anywhere in the - // hierarchy. - new ClassHierarchyTraveler(true, true, true, true, - new AllMemberVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)))), - - // Assign new names to all non-private members in this class. - new AllMemberVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberObfuscator(configuration.overloadAggressively, - nameFactory, - descriptorMap))), - - // Clear the collected names. - new MapCleaner(descriptorMap) - )); - - // Come up with new names for all private class members. - programClassPool.classesAccept( - new MultiClassVisitor( - // Collect all member names in this class. - new AllMemberVisitor( - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)), - - // Collect all non-private member names higher up the hierarchy. - new ClassHierarchyTraveler(false, true, true, false, - new AllMemberVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)))), - - // Collect all member names from interfaces of abstract - // classes down the hierarchy. - // Due to an error in the JLS/JVMS, virtual invocations - // may end up at a private method otherwise (Sun/Oracle - // bugs #6691741 and #6684387, ProGuard bug #3471941, - // and ProGuard test #1180). - new ClassHierarchyTraveler(false, false, false, true, - new ClassAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - new ClassHierarchyTraveler(false, false, true, false, - new AllMemberVisitor( - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap))))), - - // Collect all default method names from interfaces of - // any classes down the hierarchy. - // This is an extended version of the above problem - // (Sun/Oracle bug #802464, ProGuard bug #662, and - // ProGuard test #2060). - new ClassHierarchyTraveler(false, false, false, true, - new ClassHierarchyTraveler(false, false, true, false, - new AllMethodVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT | ClassConstants.ACC_STATIC, - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap))))), - - // Assign new names to all private members in this class. - new AllMemberVisitor( - new MemberAccessFilter(ClassConstants.ACC_PRIVATE, 0, - new MemberObfuscator(configuration.overloadAggressively, - nameFactory, - descriptorMap))), - - // Clear the collected names. - new MapCleaner(descriptorMap) - )); - } - - // Some class members may have ended up with conflicting names. - // Come up with new, globally unique names for them. - NameFactory specialNameFactory = - new SpecialNameFactory(new SimpleNameFactory()); - - // Collect a map of special names to avoid - // [descriptor - new name - old name]. - Map specialDescriptorMap = new HashMap(); - - programClassPool.classesAccept( - new AllMemberVisitor( - new MemberSpecialNameFilter( - new MemberNameCollector(configuration.overloadAggressively, - specialDescriptorMap)))); - - libraryClassPool.classesAccept( - new AllMemberVisitor( - new MemberSpecialNameFilter( - new MemberNameCollector(configuration.overloadAggressively, - specialDescriptorMap)))); - - // Replace conflicting non-private member names with special names. - programClassPool.classesAccept( - new MultiClassVisitor( - // Collect all private member names in this class and down - // the hierarchy. - new ClassHierarchyTraveler(true, false, false, true, - new AllMemberVisitor( - new MemberAccessFilter(ClassConstants.ACC_PRIVATE, 0, - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)))), - - // Collect all non-private member names in this class and - // higher up the hierarchy. - new ClassHierarchyTraveler(true, true, true, false, - new AllMemberVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)))), - - // Assign new names to all conflicting non-private members - // in this class and higher up the hierarchy. - new ClassHierarchyTraveler(true, true, true, false, - new AllMemberVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberNameConflictFixer(configuration.overloadAggressively, - descriptorMap, - warningPrinter, - new MemberObfuscator(configuration.overloadAggressively, - specialNameFactory, - specialDescriptorMap))))), - - // Clear the collected names. - new MapCleaner(descriptorMap) - )); - - // Replace conflicting private member names with special names. - // This is only possible if those names were kept or mapped. - programClassPool.classesAccept( - new MultiClassVisitor( - // Collect all member names in this class. - new AllMemberVisitor( - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)), - - // Collect all non-private member names higher up the hierarchy. - new ClassHierarchyTraveler(false, true, true, false, - new AllMemberVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberNameCollector(configuration.overloadAggressively, - descriptorMap)))), - - // Assign new names to all conflicting private members in this - // class. - new AllMemberVisitor( - new MemberAccessFilter(ClassConstants.ACC_PRIVATE, 0, - new MemberNameConflictFixer(configuration.overloadAggressively, - descriptorMap, - warningPrinter, - new MemberObfuscator(configuration.overloadAggressively, - specialNameFactory, - specialDescriptorMap)))), - - // Clear the collected names. - new MapCleaner(descriptorMap) - )); - - // Print out any warnings about member name conflicts. - int warningCount = warningPrinter.getWarningCount(); - if (warningCount > 0) - { - System.err.println("Warning: there were " + warningCount + - " conflicting class member name mappings."); - System.err.println(" Your configuration may be inconsistent."); - - if (!configuration.ignoreWarnings) - { - System.err.println(" If you are sure the conflicts are harmless,"); - System.err.println(" you could try your luck using the '-ignorewarnings' option."); - } - - System.err.println(" (http://proguard.sourceforge.net/manual/troubleshooting.html#mappingconflict2)"); - - if (!configuration.ignoreWarnings) - { - throw new IOException("Please correct the above warnings first."); - } - } - - // Print out the mapping, if requested. - if (configuration.printMapping != null) - { - PrintStream ps = - configuration.printMapping == Configuration.STD_OUT ? System.out : - new PrintStream( - new BufferedOutputStream( - new FileOutputStream(configuration.printMapping))); - - // Print out items that will be removed. - programClassPool.classesAcceptAlphabetically(new MappingPrinter(ps)); - - if (ps == System.out) - { - ps.flush(); - } - else - { - ps.close(); - } - } - - if (configuration.addConfigurationDebugging) - { - programClassPool.classesAccept(new RenamedFlagSetter()); - } - - // Actually apply the new names. - programClassPool.classesAccept(new ClassRenamer()); - libraryClassPool.classesAccept(new ClassRenamer()); - - // Update all references to these new names. - programClassPool.classesAccept(new ClassReferenceFixer(false)); - libraryClassPool.classesAccept(new ClassReferenceFixer(false)); - programClassPool.classesAccept(new MemberReferenceFixer()); - - // Make package visible elements public or protected, if obfuscated - // classes are being repackaged aggressively. - if (configuration.repackageClasses != null && - configuration.allowAccessModification) - { - programClassPool.classesAccept( - new AccessFixer()); - - // Fix the access flags of the inner classes information. - programClassPool.classesAccept( - new AllAttributeVisitor( - new AllInnerClassesInfoVisitor( - new InnerClassesAccessFixer()))); - } - - // Fix the bridge method flags. - programClassPool.classesAccept( - new AllMethodVisitor( - new BridgeMethodFixer())); - - // Rename the source file attributes, if requested. - if (configuration.newSourceFileAttribute != null) - { - programClassPool.classesAccept(new SourceFileRenamer(configuration.newSourceFileAttribute)); - } - - // Remove unused constants. - programClassPool.classesAccept( - new ConstantPoolShrinker()); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ParameterNameMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ParameterNameMarker.java deleted file mode 100644 index 49b20179..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/ParameterNameMarker.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor trims and marks all local variable (type) table - * attributes that it visits. It keeps parameter names and types and removes - * the ordinary local variable names and types. - * - * @author Eric Lafortune - */ -public class ParameterNameMarker -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final AttributeVisitor attributeUsageMarker; - - - /** - * Constructs a new ParameterNameMarker. - * @param attributeUsageMarker the marker that will be used to mark - * attributes containing local variable info. - */ - public ParameterNameMarker(AttributeVisitor attributeUsageMarker) - { - this.attributeUsageMarker = attributeUsageMarker; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - if (!AttributeUsageMarker.isUsed(localVariableTableAttribute) && - hasParameters(clazz, method)) - { - // Shift the entries that start at offset 0 to the front. - int newIndex = 0; - - for (int index = 0; index < localVariableTableAttribute.u2localVariableTableLength; index++) - { - LocalVariableInfo localVariableInfo = - localVariableTableAttribute.localVariableTable[index]; - - if (localVariableInfo.u2startPC == 0) - { - localVariableTableAttribute.localVariableTable[newIndex++] = - localVariableInfo; - } - } - - // Trim the table. - localVariableTableAttribute.u2localVariableTableLength = newIndex; - - // Mark the table if there are any entries. - if (newIndex > 0) - { - attributeUsageMarker.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); - } - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - if (!AttributeUsageMarker.isUsed(localVariableTypeTableAttribute) && - hasParameters(clazz, method)) - { - // Shift the entries that start at offset 0 to the front. - int newIndex = 0; - - for (int index = 0; index < localVariableTypeTableAttribute.u2localVariableTypeTableLength; index++) - { - LocalVariableTypeInfo localVariableTypeInfo = - localVariableTypeTableAttribute.localVariableTypeTable[index]; - - if (localVariableTypeInfo.u2startPC == 0) - { - localVariableTypeTableAttribute.localVariableTypeTable[newIndex++] = - localVariableTypeInfo; - } - } - - // Trim the table. - localVariableTypeTableAttribute.u2localVariableTypeTableLength = newIndex; - - // Mark the table if there are any entries. - if (newIndex > 0) - { - attributeUsageMarker.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); - } - } - } - - - // Small utility methods. - - private boolean hasParameters(Clazz clazz, Method method) - { - return method.getDescriptor(clazz).charAt(1) != ClassConstants.METHOD_ARGUMENTS_CLOSE; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/PrefixingNameFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/PrefixingNameFactory.java deleted file mode 100644 index b135a945..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/PrefixingNameFactory.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - - -/** - * NameFactory that prepends the names of the wrapped NameFactory with - * a fixed prefix. - * - * @author Johan Leys - */ -public class PrefixingNameFactory implements NameFactory -{ - private final NameFactory delegateNameFactory; - private final String prefix; - - - /** - * Creates a new PrefixingNameFactory. - * @param delegateNameFactory the wrapped NameFactory. - * @param prefix the prefix to add to all generated names. - */ - public PrefixingNameFactory(NameFactory delegateNameFactory, - String prefix) - { - this.delegateNameFactory = delegateNameFactory; - this.prefix = prefix; - } - - - // Implementations for NameFactory. - - public String nextName() - { - return prefix + delegateNameFactory.nextName(); - } - - public void reset() - { - delegateNameFactory.reset(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/RenamedFlagSetter.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/RenamedFlagSetter.java deleted file mode 100644 index dc77cded..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/RenamedFlagSetter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - - -/** - * This ClassVisitor sets the ACC_RENAMED flag for classes or class members - * that have been renamed. - * - * @author Johan Leys - */ -public class RenamedFlagSetter -extends SimplifiedVisitor -implements ClassVisitor, - - // Implementation interfaces. - MemberVisitor, - AttributeVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - String oldName = programClass.getName(); - String newName = ClassObfuscator.newClassName(programClass); - - if (newName != null && !oldName.equals(newName)) - { - programClass.u2accessFlags |= ClassConstants.ACC_RENAMED; - } - - // Print out the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - String oldName = programMember.getName(programClass); - String newName = MemberObfuscator.newMemberName(programMember); - - if (newName != null && !newName.equals(oldName)) - { - programMember.u2accessFlags |= ClassConstants.ACC_RENAMED; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SimpleNameFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SimpleNameFactory.java deleted file mode 100644 index b0b5af71..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SimpleNameFactory.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import java.util.*; - - -/** - * This NameFactory generates unique short names, using mixed-case - * characters or lower-case characters only. - * - * @author Eric Lafortune - */ -public class SimpleNameFactory implements NameFactory -{ - private static final int CHARACTER_COUNT = 26; - - private static final List cachedMixedCaseNames = new ArrayList(); - private static final List cachedLowerCaseNames = new ArrayList(); - - private final boolean generateMixedCaseNames; - private int index = 0; - - - /** - * Creates a new SimpleNameFactory that generates mixed-case names. - */ - public SimpleNameFactory() - { - this(true); - } - - - /** - * Creates a new SimpleNameFactory. - * @param generateMixedCaseNames a flag to indicate whether the generated - * names will be mixed-case, or lower-case only. - */ - public SimpleNameFactory(boolean generateMixedCaseNames) - { - this.generateMixedCaseNames = generateMixedCaseNames; - } - - - // Implementations for NameFactory. - - public void reset() - { - index = 0; - } - - - public String nextName() - { - return name(index++); - } - - - /** - * Returns the name at the given index. - */ - private String name(int index) - { - // Which cache do we need? - List cachedNames = generateMixedCaseNames ? - cachedMixedCaseNames : - cachedLowerCaseNames; - - // Do we have the name in the cache? - if (index < cachedNames.size()) - { - return (String)cachedNames.get(index); - } - - // Create a new name and cache it. - String name = newName(index); - cachedNames.add(index, name); - - return name; - } - - - /** - * Creates and returns the name at the given index. - */ - private String newName(int index) - { - // If we're allowed to generate mixed-case names, we can use twice as - // many characters. - int totalCharacterCount = generateMixedCaseNames ? - 2 * CHARACTER_COUNT : - CHARACTER_COUNT; - - int baseIndex = index / totalCharacterCount; - int offset = index % totalCharacterCount; - - char newChar = charAt(offset); - - String newName = baseIndex == 0 ? - new String(new char[] { newChar }) : - (name(baseIndex-1) + newChar); - - return newName; - } - - - /** - * Returns the character with the given index, between 0 and the number of - * acceptable characters. - */ - private char charAt(int index) - { - return (char)((index < CHARACTER_COUNT ? 'a' - 0 : - 'A' - CHARACTER_COUNT) + index); - } - - - public static void main(String[] args) - { - System.out.println("Some mixed-case names:"); - printNameSamples(new SimpleNameFactory(true), 60); - System.out.println("Some lower-case names:"); - printNameSamples(new SimpleNameFactory(false), 60); - System.out.println("Some more mixed-case names:"); - printNameSamples(new SimpleNameFactory(true), 80); - System.out.println("Some more lower-case names:"); - printNameSamples(new SimpleNameFactory(false), 80); - } - - - private static void printNameSamples(SimpleNameFactory factory, int count) - { - for (int counter = 0; counter < count; counter++) - { - System.out.println(" ["+factory.nextName()+"]"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SourceFileRenamer.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SourceFileRenamer.java deleted file mode 100644 index c9a4572c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SourceFileRenamer.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.ConstantPoolEditor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor changes the name stored in the source file attributes - * and source dir attributes of the classes that it visits, if the - * attributes are present. - * - * @author Eric Lafortune - */ -public class SourceFileRenamer -extends SimplifiedVisitor -implements ClassVisitor, - AttributeVisitor -{ - private final String newSourceFileAttribute; - - - /** - * Creates a new SourceFileRenamer. - * @param newSourceFileAttribute the new string to be put in the source file - * attributes. - */ - public SourceFileRenamer(String newSourceFileAttribute) - { - this.newSourceFileAttribute = newSourceFileAttribute; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Only visit the class attributes. - programClass.attributesAccept(this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - // Fix the source file attribute. - sourceFileAttribute.u2sourceFileIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSourceFileAttribute); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - // Fix the source file attribute. - sourceDirAttribute.u2sourceDirIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSourceFileAttribute); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SpecialNameFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SpecialNameFactory.java deleted file mode 100644 index c421a2bc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/SpecialNameFactory.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -/** - * This NameFactory generates names that are special, by appending - * a suffix. - * - * @author Eric Lafortune - */ -public class SpecialNameFactory implements NameFactory -{ - private static final char SPECIAL_SUFFIX = '_'; - - - private final NameFactory nameFactory; - - - /** - * Creates a new SpecialNameFactory. - * @param nameFactory the name factory from which original names will be - * retrieved. - */ - public SpecialNameFactory(NameFactory nameFactory) - { - this.nameFactory = nameFactory; - } - - - // Implementations for NameFactory. - - public void reset() - { - nameFactory.reset(); - } - - - public String nextName() - { - return nameFactory.nextName() + SPECIAL_SUFFIX; - } - - - // Small utility methods. - - /** - * Returns whether the given name is special. - */ - static boolean isSpecialName(String name) - { - return name != null && - name.charAt(name.length()-1) == SPECIAL_SUFFIX; - } - - - public static void main(String[] args) - { - SpecialNameFactory factory = new SpecialNameFactory(new SimpleNameFactory()); - - for (int counter = 0; counter < 50; counter++) - { - System.out.println("["+factory.nextName()+"]"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/UniqueMemberNameFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/UniqueMemberNameFactory.java deleted file mode 100644 index 01a0361a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/UniqueMemberNameFactory.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.obfuscate; - -import proguard.classfile.Clazz; - -/** - * NameFactory which only generates names that don't exist yet as members - * on the class for which it is created. - * - * @author Johan Leys - */ -public class UniqueMemberNameFactory implements NameFactory -{ - private static final String INJECTED_MEMBER_PREFIX = "$$"; - - private final NameFactory delegateNameFactory; - private final Clazz clazz; - - - /** - * Utility for creating a new NameFactory that can generate names for injected - * members: the generated names are unique within the given class, and don't - * clash with non-injected members of its super classes. - * - * @param clazz the class for which to generate a NameFactory. - * @return the new NameFactory instance. - */ - public static UniqueMemberNameFactory newInjectedMemberNameFactory(Clazz clazz) - { - return new UniqueMemberNameFactory( - new PrefixingNameFactory( - new SimpleNameFactory(), INJECTED_MEMBER_PREFIX), clazz); - } - - - /** - * Creates a new UniqueMemberNameFactory. - * @param delegateNameFactory the delegate NameFactory, used for generating - * new candidate names. - * @param clazz the class in which to check for existing - * member names. - */ - public UniqueMemberNameFactory(NameFactory delegateNameFactory, - Clazz clazz) - { - this.delegateNameFactory = delegateNameFactory; - this.clazz = clazz; - } - - - // Implementations for NameFactory. - - public String nextName() - { - String name; - - // Check if the name doesn't exist yet. We don't have additional - // descriptor information, so we can only search on the name. - do - { - name = delegateNameFactory.nextName(); - } - while (clazz.findField(name, null) != null || - clazz.findMethod(name, null) != null); - - return name; - } - - - public void reset() - { - delegateNameFactory.reset(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/package.html deleted file mode 100644 index a82d2668..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/obfuscate/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains classes to perform obfuscation of class files. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/BootstrapMethodArgumentShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/BootstrapMethodArgumentShrinker.java deleted file mode 100644 index cd094dba..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/BootstrapMethodArgumentShrinker.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.BootstrapMethodInfo; -import proguard.classfile.attribute.visitor.BootstrapMethodInfoVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.info.*; -import proguard.optimize.peephole.VariableShrinker; - -/** - * This BootstrapMethodInfoVisitor removes unused constant arguments from - * bootstrap method entries that it visits. - * - * @see ParameterUsageMarker - * @see VariableUsageMarker - * @see VariableShrinker - * @author Eric Lafortune - */ -public class BootstrapMethodArgumentShrinker -extends SimplifiedVisitor -implements BootstrapMethodInfoVisitor, - ConstantVisitor, - MemberVisitor -{ - private long usedParameters; - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - // Check which method parameters are used. - usedParameters = -1L; - clazz.constantPoolEntryAccept(bootstrapMethodInfo.u2methodHandleIndex, this); - - // Remove the unused arguments. - int methodArgumentCount = bootstrapMethodInfo.u2methodArgumentCount; - int[] methodArguments = bootstrapMethodInfo.u2methodArguments; - - int newArgumentIndex = 0; - - for (int argumentIndex = 0; argumentIndex < methodArgumentCount; argumentIndex++) - { - if (argumentIndex >= 64 || - (usedParameters & (1L << argumentIndex)) != 0L) - { - methodArguments[newArgumentIndex++] = methodArguments[argumentIndex]; - } - } - - // Update the number of arguments. - bootstrapMethodInfo.u2methodArgumentCount = newArgumentIndex; - } - - - // Implementations for ConstantVisitor. - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - // Check the referenced bootstrap method. - clazz.constantPoolEntryAccept(methodHandleConstant.u2referenceIndex, this); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - // Check the referenced class member itself. - refConstant.referencedMemberAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - usedParameters = ParameterUsageMarker.getUsedParameters(programMethod); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ChangedCodePrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ChangedCodePrinter.java deleted file mode 100644 index c3fe243c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ChangedCodePrinter.java +++ /dev/null @@ -1,369 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.ClassUtil; - -/** - * This AttributeVisitor delegates its call to another AttributeVisitor, and - * prints out the code if the other visitor has changed it. - * - * @author Eric Lafortune - */ -public class ChangedCodePrinter -implements AttributeVisitor -{ - private final AttributeVisitor attributeVisitor; - - - public ChangedCodePrinter(AttributeVisitor attributeVisitor) - { - this.attributeVisitor = attributeVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - attributeVisitor.visitModuleAttribute(clazz, moduleAttribute); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - attributeVisitor.visitModuleMainClassAttribute(clazz, moduleMainClassAttribute); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - attributeVisitor.visitModulePackagesAttribute(clazz, modulePackagesAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute syntheticAttribute) - { - attributeVisitor.visitSignatureAttribute(clazz, syntheticAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) - { - attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) - { - attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute syntheticAttribute) - { - attributeVisitor.visitSignatureAttribute(clazz, field, syntheticAttribute); - } - - - public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) - { - attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); - } - - - public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) - { - attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); - } - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute syntheticAttribute) - { - attributeVisitor.visitSignatureAttribute(clazz, method, syntheticAttribute); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute) - { - attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); - } - - - public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); - } - - - public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) - { - attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - byte[] code = codeAttribute.code; - byte[] oldCode = new byte[code.length]; - - // Copy the current code. - System.arraycopy(code, 0, oldCode, 0, codeAttribute.u4codeLength); - - // Delegate to the real visitor. - attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); - - // Check if the code has changed. - if (codeHasChanged(codeAttribute, oldCode)) - { - printChangedCode(clazz, method, codeAttribute, oldCode); - } - } - - - // Small utility methods. - - private boolean codeHasChanged(CodeAttribute codeAttribute, byte[] oldCode) - { - if (oldCode.length != codeAttribute.u4codeLength) - { - return true; - } - - for (int index = 0; index < codeAttribute.u4codeLength; index++) - { - if (oldCode[index] != codeAttribute.code[index]) - { - return true; - } - } - - return false; - } - - - private void printChangedCode(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - byte[] oldCode) - { - System.out.println("Class "+ClassUtil.externalClassName(clazz.getName())); - System.out.println("Method "+ClassUtil.externalFullMethodDescription(clazz.getName(), - 0, - method.getName(clazz), - method.getDescriptor(clazz))); - - for (int index = 0; index < codeAttribute.u4codeLength; index++) - { - System.out.println( - (oldCode[index] == codeAttribute.code[index]? " -- ":" => ")+ - index+": "+ - Integer.toHexString(0x100|oldCode[index] &0xff).substring(1)+" "+ - Integer.toHexString(0x100|codeAttribute.code[index]&0xff).substring(1)); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ConstantMemberFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ConstantMemberFilter.java deleted file mode 100644 index ebe32465..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ConstantMemberFilter.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; -import proguard.evaluation.value.Value; -import proguard.optimize.evaluation.StoringInvocationUnit; - -/** - * This MemberVisitor delegates its visits to program class members - * to another given MemberVisitor, but only when the visited - * class member has been marked as a constant. - * - * @see StoringInvocationUnit - * @author Eric Lafortune - */ -public class ConstantMemberFilter -extends SimplifiedVisitor -implements MemberVisitor -{ - private final MemberVisitor constantMemberVisitor; - - - /** - * Creates a new ConstantMemberFilter. - * @param constantMemberVisitor the MemberVisitor to which - * visits to constant members will be delegated. - */ - public ConstantMemberFilter(MemberVisitor constantMemberVisitor) - { - this.constantMemberVisitor = constantMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - Value value = StoringInvocationUnit.getFieldValue(programField); - if (value != null && - value.isParticular()) - { - constantMemberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - Value value = StoringInvocationUnit.getMethodReturnValue(programMethod); - if (value != null && - value.isParticular()) - { - constantMemberVisitor.visitProgramMethod(programClass, programMethod); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ConstantParameterFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ConstantParameterFilter.java deleted file mode 100644 index 6009cfcb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ConstantParameterFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.evaluation.value.Value; -import proguard.optimize.evaluation.StoringInvocationUnit; - -/** - * This MemberVisitor delegates its visits to program methods - * to another given MemberVisitor, for each method parameter - * that has been marked as constant. - * - * @see StoringInvocationUnit - * @author Eric Lafortune - */ -public class ConstantParameterFilter -extends SimplifiedVisitor -implements MemberVisitor -{ - private final MemberVisitor constantParameterVisitor; - - - /** - * Creates a new ConstantParameterFilter. - * @param constantParameterVisitor the MemberVisitor to which - * visits will be delegated. - */ - public ConstantParameterFilter(MemberVisitor constantParameterVisitor) - { - this.constantParameterVisitor = constantParameterVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // All parameters of non-static methods are shifted by one in the local - // variable frame. - int firstParameterIndex = - (programMethod.getAccessFlags() & ClassConstants.ACC_STATIC) != 0 ? - 0 : 1; - - int parameterCount = - ClassUtil.internalMethodParameterCount(programMethod.getDescriptor(programClass)); - - for (int index = firstParameterIndex; index < parameterCount; index++) - { - Value value = StoringInvocationUnit.getMethodParameterValue(programMethod, index); - if (value != null && - value.isParticular()) - { - constantParameterVisitor.visitProgramMethod(programClass, programMethod); - } - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/DuplicateInitializerFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/DuplicateInitializerFixer.java deleted file mode 100644 index 82153554..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/DuplicateInitializerFixer.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.ConstantPoolEditor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.info.*; - -/** - * This MemberVisitor adds an additional parameter to the duplicate - * initialization methods that it visits. - */ -public class DuplicateInitializerFixer -extends SimplifiedVisitor -implements MemberVisitor, - AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("dif") != null; - //*/ - - private static final char[] TYPES = new char[] - { - ClassConstants.TYPE_BYTE, - ClassConstants.TYPE_CHAR, - ClassConstants.TYPE_SHORT, - ClassConstants.TYPE_INT, - ClassConstants.TYPE_BOOLEAN - }; - - - private final MemberVisitor extraFixedInitializerVisitor; - - - /** - * Creates a new DuplicateInitializerFixer. - */ - public DuplicateInitializerFixer() - { - this(null); - } - - - /** - * Creates a new DuplicateInitializerFixer with an extra visitor. - * @param extraFixedInitializerVisitor an optional extra visitor for all - * initializers that have been fixed. - */ - public DuplicateInitializerFixer(MemberVisitor extraFixedInitializerVisitor) - { - this.extraFixedInitializerVisitor = extraFixedInitializerVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Is it a class instance initializer? - String name = programMethod.getName(programClass); - if (name.equals(ClassConstants.METHOD_NAME_INIT)) - { - // Is there already another initializer with the same descriptor? - String descriptor = programMethod.getDescriptor(programClass); - Method similarMethod = programClass.findMethod(name, descriptor); - if (!programMethod.equals(similarMethod)) - { - // Should this initializer be preserved? - if (KeepMarker.isKept(programMethod)) - { - // Fix the other initializer. - // We'll just proceed if it is being kept as well; - // apparently the descriptor types didn't matter so much. - programMethod = (ProgramMethod)similarMethod; - } - - int index = descriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); - - // Try to find a new, unique descriptor. - int typeCounter = 0; - while (true) - { - // Construct the new descriptor by inserting a new type - // as an additional last argument. - StringBuffer newDescriptorBuffer = - new StringBuffer(descriptor.substring(0, index)); - - for (int arrayDimension = 0; arrayDimension < typeCounter / TYPES.length; arrayDimension++) - { - newDescriptorBuffer.append(ClassConstants.TYPE_ARRAY); - } - - newDescriptorBuffer.append(TYPES[typeCounter % TYPES.length]); - newDescriptorBuffer.append(descriptor.substring(index)); - - String newDescriptor = newDescriptorBuffer.toString(); - - // Is the new initializer descriptor unique? - if (programClass.findMethod(name, newDescriptor) == null) - { - if (DEBUG) - { - System.out.println("DuplicateInitializerFixer:"); - System.out.println(" ["+programClass.getName()+"."+name+descriptor+"] ("+ClassUtil.externalClassAccessFlags(programMethod.getAccessFlags())+") -> ["+newDescriptor+"]"); - } - - // Update the descriptor. - programMethod.u2descriptorIndex = - new ConstantPoolEditor(programClass).addUtf8Constant(newDescriptor); - - // Fix the local variable frame size, the method - // signature, and the parameter annotations, if - // necessary. - programMethod.attributesAccept(programClass, - this); - - // Update the optimization info. - MethodOptimizationInfo methodOptimizationInfo = - ProgramMethodOptimizationInfo.getMethodOptimizationInfo(programMethod); - if (methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ProgramMethodOptimizationInfo programMethodOptimizationInfo = - (ProgramMethodOptimizationInfo)methodOptimizationInfo; - - int parameterCount = - ClassUtil.internalMethodParameterCount(newDescriptor, - programMethod.getAccessFlags()); - programMethodOptimizationInfo.insertParameter(parameterCount - 1); - - int parameterSize = - programMethodOptimizationInfo.getParameterSize(); - programMethodOptimizationInfo.setParameterSize(parameterSize + 1); - programMethodOptimizationInfo.setParameterUsed(parameterSize); - } - - // Visit the initializer, if required. - if (extraFixedInitializerVisitor != null) - { - extraFixedInitializerVisitor.visitProgramMethod(programClass, programMethod); - } - - // We're done with this constructor. - return; - } - - typeCounter++; - } - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // The minimum variable size is determined by the arguments. - int maxLocals = - ClassUtil.internalMethodParameterSize(method.getDescriptor(clazz), - method.getAccessFlags()); - - if (codeAttribute.u2maxLocals < maxLocals) - { - codeAttribute.u2maxLocals = maxLocals; - } - } - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) - { - String descriptor = method.getDescriptor(clazz); - int descriptorIndex = descriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); - String signature = signatureAttribute.getSignature(clazz); - int signatureIndex = signature.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); - - String newSignature = signature.substring(0, signatureIndex) + - descriptor.charAt(descriptorIndex - 1) + - signature.substring(signatureIndex); - - // Update the signature. - signatureAttribute.u2signatureIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSignature); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Update the number of parameters. - int oldParametersCount = parameterAnnotationsAttribute.u1parametersCount++; - - if (parameterAnnotationsAttribute.u2parameterAnnotationsCount == null || - parameterAnnotationsAttribute.u2parameterAnnotationsCount.length < parameterAnnotationsAttribute.u1parametersCount) - { - int[] annotationsCounts = new int[parameterAnnotationsAttribute.u1parametersCount]; - Annotation[][] annotations = new Annotation[parameterAnnotationsAttribute.u1parametersCount][]; - - System.arraycopy(parameterAnnotationsAttribute.u2parameterAnnotationsCount, - 0, - annotationsCounts, - 0, - oldParametersCount); - - System.arraycopy(parameterAnnotationsAttribute.parameterAnnotations, - 0, - annotations, - 0, - oldParametersCount); - - parameterAnnotationsAttribute.u2parameterAnnotationsCount = annotationsCounts; - parameterAnnotationsAttribute.parameterAnnotations = annotations; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/DuplicateInitializerInvocationFixer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/DuplicateInitializerInvocationFixer.java deleted file mode 100644 index c4acbe24..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/DuplicateInitializerInvocationFixer.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This AttributeVisitor adds an additional integer parameter to the tweaked - * initialization method invocations that it visits. - */ -public class DuplicateInitializerInvocationFixer -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - MemberVisitor -{ - private static final boolean DEBUG = false; - - private final InstructionVisitor extraAddedInstructionVisitor; - - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - private String descriptor; - private int descriptorLengthDelta; - - - /** - * Creates a new DuplicateInitializerInvocationFixer. - */ - public DuplicateInitializerInvocationFixer() - { - this(null); - } - - - /** - * Creates a new DuplicateInitializerInvocationFixer. - * @param extraAddedInstructionVisitor an optional extra visitor for all - * added instructions. - */ - public DuplicateInitializerInvocationFixer(InstructionVisitor extraAddedInstructionVisitor) - { - this.extraAddedInstructionVisitor = extraAddedInstructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - - // Reset the code changes. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Fix any duplicate constructor invocations. - codeAttribute.instructionsAccept(clazz, - method, - this); - - // Apply all accumulated changes to the code. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_INVOKESPECIAL) - { - descriptorLengthDelta = 0; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - - if (descriptorLengthDelta > 0) - { - Instruction extraInstruction = - new SimpleInstruction(descriptorLengthDelta == 1 ? - InstructionConstants.OP_ICONST_0 : - InstructionConstants.OP_ACONST_NULL); - - codeAttributeEditor.insertBeforeInstruction(offset, - extraInstruction); - - if (DEBUG) - { - System.out.println(" ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] Inserting "+extraInstruction.toString()+" before "+constantInstruction.toString(offset)); - } - - if (extraAddedInstructionVisitor != null) - { - extraInstruction.accept(null, null, null, offset, extraAddedInstructionVisitor); - } - } - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - // Check the referenced constructor descriptor. - if (refConstant.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT)) - { - descriptor = refConstant.getType(clazz); - - refConstant.referencedMemberAccept(this); - } - } - - - // Implementations for MemberVisitor. - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - descriptorLengthDelta = - programMethod.getDescriptor(programClass).length() - descriptor.length(); - - if (DEBUG) - { - if (descriptorLengthDelta > 0) - { - System.out.println("DuplicateInitializerInvocationFixer:"); - System.out.println(" ["+programClass.getName()+"."+programMethod.getName(programClass)+programMethod.getDescriptor(programClass)+"] ("+ClassUtil.externalClassAccessFlags(programMethod.getAccessFlags())+") referenced by:"); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeepMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeepMarker.java deleted file mode 100644 index af5ab7c3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeepMarker.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.optimize.info.*; - -/** - * This ClassVisitor, MemberVisitor and - * AttributeVisitor marks classes, class members and - * code attributes it visits. The marked elements will remain - * unchanged as necessary in the optimization step. - * - * @see NoSideEffectMethodMarker - * @author Eric Lafortune - */ -public class KeepMarker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - ClassOptimizationInfo.setClassOptimizationInfo(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - ClassOptimizationInfo.setClassOptimizationInfo(libraryClass); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - FieldOptimizationInfo.setFieldOptimizationInfo(programClass, programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - MethodOptimizationInfo.setMethodOptimizationInfo(programClass, programMethod); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - FieldOptimizationInfo.setFieldOptimizationInfo(libraryClass, libraryField); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - MethodOptimizationInfo.setMethodOptimizationInfo(libraryClass, libraryMethod); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - CodeAttributeOptimizationInfo.setCodeAttributeOptimizationInfo(codeAttribute); - } - - - // Small utility methods. - - public static boolean isKept(Clazz clazz) - { - ClassOptimizationInfo info = - ClassOptimizationInfo.getClassOptimizationInfo(clazz); - - return info != null && - info.isKept(); - } - - public static boolean isKept(Field field) - { - FieldOptimizationInfo info = - FieldOptimizationInfo.getFieldOptimizationInfo(field); - - return info != null && - info.isKept(); - } - - public static boolean isKept(Method method) - { - MethodOptimizationInfo info = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - return info != null && - info.isKept(); - } - - public static boolean isKept(CodeAttribute codeAttribute) - { - CodeAttributeOptimizationInfo info = - CodeAttributeOptimizationInfo.getCodeAttributeOptimizationInfo(codeAttribute); - - return info != null && - info.isKept(); - } - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeptClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeptClassFilter.java deleted file mode 100644 index 93e8799b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeptClassFilter.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates its visits to one of two ClassVisitor's, - * depending on whether the visited class is kept or not. - * - * @see KeepMarker - * - * @author Eric Lafortune - */ -public class KeptClassFilter -implements ClassVisitor -{ - private final ClassVisitor acceptedVisitor; - private final ClassVisitor rejectedVisitor; - - - /** - * Creates a new KeptClassFilter. - * - * @param acceptedVisitor the class visitor to which accepted (kept) - * classes will be delegated. - */ - public KeptClassFilter(ClassVisitor acceptedVisitor) - { - this(acceptedVisitor, null); - } - - /** - * Creates a new KeptClassFilter. - * - * @param acceptedVisitor the class visitor to which accepted (kept) - * classes will be delegated. - * @param rejectedVisitor the class visitor to which rejected (unkept) - * classes will be delegated. - */ - public KeptClassFilter(ClassVisitor acceptedVisitor, - ClassVisitor rejectedVisitor) - { - this.acceptedVisitor = acceptedVisitor; - this.rejectedVisitor = rejectedVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - ClassVisitor delegateVisitor = selectVisitor(programClass); - if (delegateVisitor != null) { - delegateVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - ClassVisitor delegateVisitor = selectVisitor(libraryClass); - if (delegateVisitor != null) { - delegateVisitor.visitLibraryClass(libraryClass); - } - } - - - // Small utility methods. - - private ClassVisitor selectVisitor(Clazz clazz) - { - return KeepMarker.isKept(clazz) ? acceptedVisitor : rejectedVisitor; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeptMemberFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeptMemberFilter.java deleted file mode 100644 index 7ce73117..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/KeptMemberFilter.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor delegates all its method calls to another MemberVisitor, - * but only for Member objects that are marked as kept. - * - * @see KeepMarker - * - * @author Eric Lafortune - */ -public class KeptMemberFilter -implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new KeptMemberFilter. - * @param memberVisitor the member visitor to which the visiting will be - * delegated. - */ - public KeptMemberFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (KeepMarker.isKept(programField)) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (KeepMarker.isKept(programMethod)) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (KeepMarker.isKept(libraryField)) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (KeepMarker.isKept(libraryMethod)) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MemberDescriptorSpecializer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MemberDescriptorSpecializer.java deleted file mode 100644 index 6438d9c7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MemberDescriptorSpecializer.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.editor.ClassReferenceFixer; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.evaluation.value.Value; -import proguard.optimize.evaluation.StoringInvocationUnit; - -/** - * This MemberVisitor specializes parameters in the descriptors of the - * methods that it visits. - * - * @see StoringInvocationUnit - * @see ClassReferenceFixer - * @author Eric Lafortune - */ -public class MemberDescriptorSpecializer -extends SimplifiedVisitor -implements MemberVisitor -{ - private static final boolean DEBUG = false; - - - private final MemberVisitor extraParameterMemberVisitor; - - - /** - * Creates a new MethodDescriptorShrinker. - */ - public MemberDescriptorSpecializer() - { - this(null); - } - - - /** - * Creates a new MethodDescriptorShrinker with an extra visitor. - * @param extraParameterMemberVisitor an optional extra visitor for all - * class members whose parameters have - * been specialized. - */ - public MemberDescriptorSpecializer(MemberVisitor extraParameterMemberVisitor) - { - this.extraParameterMemberVisitor = extraParameterMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - Value parameterValue = StoringInvocationUnit.getFieldValue(programField); - if (parameterValue.computationalType() == Value.TYPE_REFERENCE) - { - Clazz referencedClass = parameterValue.referenceValue().getReferencedClass(); - if (programField.referencedClass != referencedClass) - { - if (DEBUG) - { - System.out.println("MemberDescriptorSpecializer: "+programClass.getName()+"."+programField.getName(programClass)+" "+programField.getDescriptor(programClass)); - System.out.println(" "+programField.referencedClass.getName()+" -> "+referencedClass.getName()); - } - - programField.referencedClass = referencedClass; - - // Visit the field, if required. - if (extraParameterMemberVisitor != null) - { - extraParameterMemberVisitor.visitProgramField(programClass, programField); - } - } - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // All parameters of non-static methods are shifted by one in the local - // variable frame. - int firstParameterIndex = - (programMethod.getAccessFlags() & ClassConstants.ACC_STATIC) != 0 ? - 0 : 1; - - int parameterCount = - ClassUtil.internalMethodParameterCount(programMethod.getDescriptor(programClass)); - - int classIndex = 0; - - // Go over the parameters. - for (int parameterIndex = firstParameterIndex; parameterIndex < parameterCount; parameterIndex++) - { - Value parameterValue = StoringInvocationUnit.getMethodParameterValue(programMethod, parameterIndex); - if (parameterValue.computationalType() == Value.TYPE_REFERENCE) - { - Clazz referencedClass = parameterValue.referenceValue().getReferencedClass(); - if (programMethod.referencedClasses[classIndex] != referencedClass) - { - if (DEBUG) - { - System.out.println("MemberDescriptorSpecializer: "+programClass.getName()+"."+programMethod.getName(programClass)+programMethod.getDescriptor(programClass)); - System.out.println(" "+programMethod.referencedClasses[classIndex].getName()+" -> "+referencedClass.getName()); - } - - programMethod.referencedClasses[classIndex] = referencedClass; - - // Visit the method, if required. - if (extraParameterMemberVisitor != null) - { - extraParameterMemberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - classIndex++; - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MethodDescriptorShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MethodDescriptorShrinker.java deleted file mode 100644 index 99de95a4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MethodDescriptorShrinker.java +++ /dev/null @@ -1,353 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.ConstantPoolEditor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.info.*; - -/** - * This MemberVisitor removes unused parameters in the descriptors of the - * methods that it visits. It also updates the signatures and parameter - * annotations. - * - * @see ParameterUsageMarker - * @see VariableUsageMarker - * @see ParameterShrinker - * @author Eric Lafortune - */ -public class MethodDescriptorShrinker -extends SimplifiedVisitor -implements MemberVisitor, - AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("mds") != null; - //*/ - - - private final MemberVisitor extraMemberVisitor; - - - /** - * Creates a new MethodDescriptorShrinker. - */ - public MethodDescriptorShrinker() - { - this(null); - } - - - /** - * Creates a new MethodDescriptorShrinker with an extra visitor. - * @param extraMemberVisitor an optional extra visitor for all methods whose - * parameters have been simplified. - */ - public MethodDescriptorShrinker(MemberVisitor extraMemberVisitor) - { - this.extraMemberVisitor = extraMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (DEBUG) - { - System.out.println("MethodDescriptorShrinker: ["+programClass.getName()+"."+programMethod.getName(programClass)+programMethod.getDescriptor(programClass)+"]"); - } - - // Update the descriptor if it has any unused parameters. - String descriptor = programMethod.getDescriptor(programClass); - String newDescriptor = shrinkDescriptor(programMethod, descriptor); - - if (!newDescriptor.equals(descriptor)) - { - // Shrink the signature and parameter annotations, - // before shrinking the descriptor itself. - programMethod.attributesAccept(programClass, this); - - String name = programMethod.getName(programClass); - String newName = name; - - // Append a code, if the method isn't a class instance initializer. - if (!name.equals(ClassConstants.METHOD_NAME_INIT)) - { - newName += ClassConstants.SPECIAL_MEMBER_SEPARATOR + Long.toHexString(Math.abs((descriptor).hashCode())); - } - - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor(programClass); - - // Update the name, if necessary. - if (!newName.equals(name)) - { - programMethod.u2nameIndex = - constantPoolEditor.addUtf8Constant(newName); - } - - // Update the referenced classes. - programMethod.referencedClasses = - shrinkReferencedClasses(programMethod, - descriptor, - programMethod.referencedClasses); - - // Finally, update the descriptor itself. - programMethod.u2descriptorIndex = - constantPoolEditor.addUtf8Constant(newDescriptor); - - if (DEBUG) - { - System.out.println(" -> ["+newName+newDescriptor+"]"); - } - - // Visit the method, if required. - if (extraMemberVisitor != null) - { - extraMemberVisitor.visitProgramMethod(programClass, programMethod); - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) - { - if (DEBUG) - { - System.out.println(" ["+signatureAttribute.getSignature(clazz)+"]"); - } - - // Compute the new signature. - String signature = signatureAttribute.getSignature(clazz); - String newSignature = shrinkDescriptor(method, signature); - - if (!newSignature.equals(signature)) - { - // Update the signature. - signatureAttribute.u2signatureIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSignature); - - // Update the referenced classes. - signatureAttribute.referencedClasses = - shrinkReferencedClasses(method, - signature, - signatureAttribute.referencedClasses); - - if (DEBUG) - { - System.out.println(" -> ["+newSignature+"]"); - } - } - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - int[] annotationsCounts = parameterAnnotationsAttribute.u2parameterAnnotationsCount; - Annotation[][] annotations = parameterAnnotationsAttribute.parameterAnnotations; - - // All parameters of non-static methods are shifted by one in the local - // variable frame. - int parameterIndex = - (method.getAccessFlags() & ClassConstants.ACC_STATIC) != 0 ? - 0 : 1; - - int annotationIndex = 0; - int newAnnotationIndex = 0; - - // Go over the parameters. - String descriptor = method.getDescriptor(clazz); - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(descriptor); - - while (internalTypeEnumeration.hasMoreTypes()) - { - String type = internalTypeEnumeration.nextType(); - if (ParameterUsageMarker.isParameterUsed(method, parameterIndex)) - { - annotationsCounts[newAnnotationIndex] = annotationsCounts[annotationIndex]; - annotations[newAnnotationIndex++] = annotations[annotationIndex]; - } - - annotationIndex++; - - parameterIndex += ClassUtil.internalTypeSize(type); - } - - // Update the number of parameters. - parameterAnnotationsAttribute.u1parametersCount = newAnnotationIndex; - - // Clear the unused entries. - while (newAnnotationIndex < annotationIndex) - { - annotationsCounts[newAnnotationIndex] = 0; - annotations[newAnnotationIndex++] = null; - } - } - - - // Small utility methods. - - /** - * Returns a shrunk descriptor or signature of the given method. - */ - private String shrinkDescriptor(Method method, String descriptor) - { - // All parameters of non-static methods are shifted by one in the local - // variable frame. - int parameterIndex = - (method.getAccessFlags() & ClassConstants.ACC_STATIC) != 0 ? - 0 : 1; - - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(descriptor); - - StringBuffer newDescriptorBuffer = - new StringBuffer(descriptor.length()); - - // Copy the formal type parameters. - newDescriptorBuffer.append(internalTypeEnumeration.formalTypeParameters()); - newDescriptorBuffer.append(ClassConstants.METHOD_ARGUMENTS_OPEN); - - // Go over the parameters. - while (internalTypeEnumeration.hasMoreTypes()) - { - String type = internalTypeEnumeration.nextType(); - if (ParameterUsageMarker.isParameterUsed(method, parameterIndex)) - { - newDescriptorBuffer.append(type); - } - else if (DEBUG) - { - System.out.println(" Deleting parameter #"+parameterIndex+" ["+type+"]"); - } - - parameterIndex += ClassUtil.internalTypeSize(type); - } - - // Copy the return type. - newDescriptorBuffer.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); - newDescriptorBuffer.append(internalTypeEnumeration.returnType()); - - return newDescriptorBuffer.toString(); - } - - - /** - * Shrinks the array of referenced classes of the given method. - */ - private Clazz[] shrinkReferencedClasses(Method method, - String descriptor, - Clazz[] referencedClasses) - { - if (referencedClasses != null) - { - // All parameters of non-static methods are shifted by one in the local - // variable frame. - int parameterIndex = - (method.getAccessFlags() & ClassConstants.ACC_STATIC) != 0 ? - 0 : 1; - - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(descriptor); - - int referencedClassIndex = 0; - int newReferencedClassIndex = 0; - - // Copy the formal type parameters. - { - String type = internalTypeEnumeration.formalTypeParameters(); - int count = new DescriptorClassEnumeration(type).classCount(); - for (int counter = 0; counter < count; counter++) - { - referencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - } - - // Go over the parameters. - while (internalTypeEnumeration.hasMoreTypes()) - { - // Consider the classes referenced by this parameter type. - String type = internalTypeEnumeration.nextType(); - int count = new DescriptorClassEnumeration(type).classCount(); - - if (ParameterUsageMarker.isParameterUsed(method, parameterIndex)) - { - // Copy the referenced classes. - for (int counter = 0; counter < count; counter++) - { - referencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - } - else - { - // Skip the referenced classes. - referencedClassIndex += count; - } - - parameterIndex += ClassUtil.internalTypeSize(type); - } - - // Copy the return type. - { - String type = internalTypeEnumeration.returnType(); - int count = new DescriptorClassEnumeration(type).classCount(); - for (int counter = 0; counter < count; counter++) - { - referencedClasses[newReferencedClassIndex++] = - referencedClasses[referencedClassIndex++]; - } - } - - // Shrink the array to the proper size. - if (newReferencedClassIndex == 0) - { - referencedClasses = null; - } - else if (newReferencedClassIndex < referencedClassIndex) - { - Clazz[] newReferencedClasses = new Clazz[newReferencedClassIndex]; - System.arraycopy(referencedClasses, 0, - newReferencedClasses, 0, - newReferencedClassIndex); - - referencedClasses = newReferencedClasses; - } - } - - return referencedClasses; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MethodStaticizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MethodStaticizer.java deleted file mode 100644 index b92e04c4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/MethodStaticizer.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.editor.MethodInvocationFixer; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.info.ParameterUsageMarker; -import proguard.optimize.peephole.VariableShrinker; - -/** - * This MemberVisitor makes all methods that it visits static, if their 'this' - * parameters are unused. - * - * @see ParameterUsageMarker - * @see MethodInvocationFixer - * @see VariableShrinker - * @author Eric Lafortune - */ -public class MethodStaticizer -extends SimplifiedVisitor -implements MemberVisitor -{ - private final MemberVisitor extraStaticMemberVisitor; - - - /** - * Creates a new MethodStaticizer. - */ - public MethodStaticizer() - { - this(null); - } - - - /** - * Creates a new MethodStaticizer with an extra visitor. - * @param extraStaticMemberVisitor an optional extra visitor for all - * methods that have been made static. - */ - public MethodStaticizer(MemberVisitor extraStaticMemberVisitor) - { - this.extraStaticMemberVisitor = extraStaticMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Is the 'this' parameter being used? - if (!ParameterUsageMarker.isParameterUsed(programMethod, 0)) - { - // Make the method static. - programMethod.u2accessFlags = - (programMethod.getAccessFlags() & ~ClassConstants.ACC_FINAL) | - ClassConstants.ACC_STATIC; - - // Visit the method, if required. - if (extraStaticMemberVisitor != null) - { - extraStaticMemberVisitor.visitProgramMethod(programClass, programMethod); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/OptimizationInfoClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/OptimizationInfoClassFilter.java deleted file mode 100644 index 83dad933..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/OptimizationInfoClassFilter.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; -import proguard.optimize.info.*; - -/** - * This ClassVisitor delegates its visits to another given - * ClassVisitor, but only when the visited class has editable - * optimization info. - * - * @see ClassOptimizationInfo - * @see ProgramClassOptimizationInfo - * @author Eric Lafortune - */ -public class OptimizationInfoClassFilter -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - /** - * Creates a new OptimizationInfoClassFilter. - * @param classVisitor the ClassVisitor to which visits will - * be delegated. - */ - public OptimizationInfoClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - - public void visitProgramClass(ProgramClass programClass) - { - // Does the field have optimization info? - if (ClassOptimizationInfo.getClassOptimizationInfo(programClass) instanceof ProgramClassOptimizationInfo) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Does the class have optimization info? - if (ClassOptimizationInfo.getClassOptimizationInfo(libraryClass) instanceof ProgramClassOptimizationInfo) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/OptimizationInfoMemberFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/OptimizationInfoMemberFilter.java deleted file mode 100644 index 1f90763c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/OptimizationInfoMemberFilter.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.info.*; - -/** - * This MemberVisitor delegates its visits to another given - * MemberVisitor, but only when the visited member has editable - * optimization info. - * - * @see FieldOptimizationInfo - * @see ProgramFieldOptimizationInfo - * @see MethodOptimizationInfo - * @see ProgramMethodOptimizationInfo - * @author Eric Lafortune - */ -public class OptimizationInfoMemberFilter -implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - private final MemberVisitor otherMemberVisitor; - - - /** - * Creates a new OptimizationInfoMemberFilter. - * @param memberVisitor the MemberVisitor to which visits will - * be delegated. - */ - public OptimizationInfoMemberFilter(MemberVisitor memberVisitor) - { - this(memberVisitor, null); - } - - - /** - * Creates a new OptimizationInfoMemberFilter. - * @param memberVisitor the MemberVisitor to which visits will - * be delegated if the member has editable optimization - * info. - * @param otherMemberVisitor the MemberVisitor to which visits will - * be delegated if the member does not have editable - * optimization info. - */ - public OptimizationInfoMemberFilter(MemberVisitor memberVisitor, - MemberVisitor otherMemberVisitor) - { - this.memberVisitor = memberVisitor; - this.otherMemberVisitor = otherMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - MemberVisitor visitor = - FieldOptimizationInfo.getFieldOptimizationInfo(programField) instanceof ProgramFieldOptimizationInfo ? - memberVisitor : otherMemberVisitor; - - if (visitor != null) - { - visitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - MemberVisitor visitor = - MethodOptimizationInfo.getMethodOptimizationInfo(programMethod) instanceof ProgramMethodOptimizationInfo ? - memberVisitor : otherMemberVisitor; - - if (visitor != null) - { - visitor.visitProgramMethod(programClass, programMethod); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/Optimizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/Optimizer.java deleted file mode 100644 index 9ff4957e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/Optimizer.java +++ /dev/null @@ -1,1706 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.*; -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.visitor.*; -import proguard.classfile.util.MethodLinker; -import proguard.classfile.visitor.*; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.*; -import proguard.optimize.info.*; -import proguard.optimize.peephole.*; -import proguard.util.*; - -import java.io.IOException; -import java.util.*; - -/** - * This class optimizes class pools according to a given configuration. - * - * @author Eric Lafortune - */ -public class Optimizer -{ - public static final boolean DETAILS = System.getProperty("optd") != null; - - private static final String CLASS_MARKING_FINAL = "class/marking/final"; - private static final String CLASS_UNBOXING_ENUM = "class/unboxing/enum"; - private static final String CLASS_MERGING_VERTICAL = "class/merging/vertical"; - private static final String CLASS_MERGING_HORIZONTAL = "class/merging/horizontal"; - private static final String CLASS_MERGING_WRAPPER = "class/merging/wrapper"; - private static final String FIELD_REMOVAL_WRITEONLY = "field/removal/writeonly"; - private static final String FIELD_MARKING_PRIVATE = "field/marking/private"; - private static final String FIELD_PROPAGATION_VALUE = "field/propagation/value"; - private static final String METHOD_MARKING_PRIVATE = "method/marking/private"; - private static final String METHOD_MARKING_STATIC = "method/marking/static"; - private static final String METHOD_MARKING_FINAL = "method/marking/final"; - private static final String METHOD_MARKING_SYNCHRONIZED = "method/marking/synchronized"; - private static final String METHOD_REMOVAL_PARAMETER = "method/removal/parameter"; - private static final String METHOD_PROPAGATION_PARAMETER = "method/propagation/parameter"; - private static final String METHOD_PROPAGATION_RETURNVALUE = "method/propagation/returnvalue"; - private static final String METHOD_INLINING_SHORT = "method/inlining/short"; - private static final String METHOD_INLINING_UNIQUE = "method/inlining/unique"; - private static final String METHOD_INLINING_TAILRECURSION = "method/inlining/tailrecursion"; - private static final String CODE_MERGING = "code/merging"; - private static final String CODE_SIMPLIFICATION_VARIABLE = "code/simplification/variable"; - private static final String CODE_SIMPLIFICATION_ARITHMETIC = "code/simplification/arithmetic"; - private static final String CODE_SIMPLIFICATION_CAST = "code/simplification/cast"; - private static final String CODE_SIMPLIFICATION_FIELD = "code/simplification/field"; - private static final String CODE_SIMPLIFICATION_BRANCH = "code/simplification/branch"; - private static final String CODE_SIMPLIFICATION_OBJECT = "code/simplification/object"; - private static final String CODE_SIMPLIFICATION_STRING = "code/simplification/string"; - private static final String CODE_SIMPLIFICATION_MATH = "code/simplification/math"; - private static final String CODE_SIMPLIFICATION_ADVANCED = "code/simplification/advanced"; - private static final String CODE_REMOVAL_ADVANCED = "code/removal/advanced"; - private static final String CODE_REMOVAL_SIMPLE = "code/removal/simple"; - private static final String CODE_REMOVAL_VARIABLE = "code/removal/variable"; - private static final String CODE_REMOVAL_EXCEPTION = "code/removal/exception"; - private static final String CODE_ALLOCATION_VARIABLE = "code/allocation/variable"; - - - public static final String[] OPTIMIZATION_NAMES = new String[] - { - CLASS_MARKING_FINAL, - CLASS_MERGING_VERTICAL, - CLASS_MERGING_HORIZONTAL, - FIELD_REMOVAL_WRITEONLY, - FIELD_MARKING_PRIVATE, - FIELD_PROPAGATION_VALUE, - METHOD_MARKING_PRIVATE, - METHOD_MARKING_STATIC, - METHOD_MARKING_FINAL, - METHOD_MARKING_SYNCHRONIZED, - METHOD_REMOVAL_PARAMETER, - METHOD_PROPAGATION_PARAMETER, - METHOD_PROPAGATION_RETURNVALUE, - METHOD_INLINING_SHORT, - METHOD_INLINING_UNIQUE, - METHOD_INLINING_TAILRECURSION, - CODE_MERGING, - CODE_SIMPLIFICATION_VARIABLE, - CODE_SIMPLIFICATION_ARITHMETIC, - CODE_SIMPLIFICATION_CAST, - CODE_SIMPLIFICATION_FIELD, - CODE_SIMPLIFICATION_BRANCH, - CODE_SIMPLIFICATION_STRING, - CODE_SIMPLIFICATION_MATH, - CODE_SIMPLIFICATION_ADVANCED, - CODE_REMOVAL_ADVANCED, - CODE_REMOVAL_SIMPLE, - CODE_REMOVAL_VARIABLE, - CODE_REMOVAL_EXCEPTION, - CODE_ALLOCATION_VARIABLE, - }; - - - private final Configuration configuration; - - private final boolean classMarkingFinal; - private final boolean classUnboxingEnum; - private final boolean classMergingVertical; - private final boolean classMergingHorizontal; - private final boolean classMergingWrapper; - private final boolean fieldRemovalWriteonly; - private final boolean fieldMarkingPrivate; - private final boolean fieldPropagationValue; - private final boolean methodMarkingPrivate; - private final boolean methodMarkingStatic; - private final boolean methodMarkingFinal; - private final boolean methodMarkingSynchronized; - private final boolean methodRemovalParameter; - private final boolean methodPropagationParameter; - private final boolean methodPropagationReturnvalue; - private final boolean methodInliningShort; - private final boolean methodInliningUnique; - private final boolean methodInliningTailrecursion; - private final boolean codeMerging; - private final boolean codeSimplificationVariable; - private final boolean codeSimplificationArithmetic; - private final boolean codeSimplificationCast; - private final boolean codeSimplificationField; - private final boolean codeSimplificationBranch; - private final boolean codeSimplificationObject; - private final boolean codeSimplificationString; - private final boolean codeSimplificationMath; - private final boolean codeSimplificationPeephole; - private boolean codeSimplificationAdvanced; - private boolean codeRemovalAdvanced; - private boolean codeRemovalSimple; - private final boolean codeRemovalVariable; - private boolean codeRemovalException; - private final boolean codeAllocationVariable; - - - /** - * Creates a new Optimizer. - */ - public Optimizer(Configuration configuration) - { - this.configuration = configuration; - - // Create a matcher for filtering optimizations. - StringMatcher filter = configuration.optimizations != null ? - new ListParser(new NameParser()).parse(configuration.optimizations) : - new ConstantMatcher(true); - - classMarkingFinal = filter.matches(CLASS_MARKING_FINAL); - classUnboxingEnum = filter.matches(CLASS_UNBOXING_ENUM); - classMergingVertical = filter.matches(CLASS_MERGING_VERTICAL); - classMergingHorizontal = filter.matches(CLASS_MERGING_HORIZONTAL); - classMergingWrapper = filter.matches(CLASS_MERGING_WRAPPER); - fieldRemovalWriteonly = filter.matches(FIELD_REMOVAL_WRITEONLY); - fieldMarkingPrivate = filter.matches(FIELD_MARKING_PRIVATE); - fieldPropagationValue = filter.matches(FIELD_PROPAGATION_VALUE); - methodMarkingPrivate = filter.matches(METHOD_MARKING_PRIVATE); - methodMarkingStatic = filter.matches(METHOD_MARKING_STATIC); - methodMarkingFinal = filter.matches(METHOD_MARKING_FINAL); - methodMarkingSynchronized = filter.matches(METHOD_MARKING_SYNCHRONIZED); - methodRemovalParameter = filter.matches(METHOD_REMOVAL_PARAMETER); - methodPropagationParameter = filter.matches(METHOD_PROPAGATION_PARAMETER); - methodPropagationReturnvalue = filter.matches(METHOD_PROPAGATION_RETURNVALUE); - methodInliningShort = filter.matches(METHOD_INLINING_SHORT); - methodInliningUnique = filter.matches(METHOD_INLINING_UNIQUE); - methodInliningTailrecursion = filter.matches(METHOD_INLINING_TAILRECURSION); - codeMerging = filter.matches(CODE_MERGING); - codeSimplificationVariable = filter.matches(CODE_SIMPLIFICATION_VARIABLE); - codeSimplificationArithmetic = filter.matches(CODE_SIMPLIFICATION_ARITHMETIC); - codeSimplificationCast = filter.matches(CODE_SIMPLIFICATION_CAST); - codeSimplificationField = filter.matches(CODE_SIMPLIFICATION_FIELD); - codeSimplificationBranch = filter.matches(CODE_SIMPLIFICATION_BRANCH); - codeSimplificationObject = filter.matches(CODE_SIMPLIFICATION_OBJECT); - codeSimplificationString = filter.matches(CODE_SIMPLIFICATION_STRING); - codeSimplificationMath = filter.matches(CODE_SIMPLIFICATION_MATH); - codeSimplificationAdvanced = filter.matches(CODE_SIMPLIFICATION_ADVANCED); - codeRemovalAdvanced = filter.matches(CODE_REMOVAL_ADVANCED); - codeRemovalSimple = filter.matches(CODE_REMOVAL_SIMPLE); - codeRemovalVariable = filter.matches(CODE_REMOVAL_VARIABLE); - codeRemovalException = filter.matches(CODE_REMOVAL_EXCEPTION); - codeAllocationVariable = filter.matches(CODE_ALLOCATION_VARIABLE); - - // Some optimizations are required by other optimizations. - codeSimplificationAdvanced = - codeSimplificationAdvanced || - fieldPropagationValue || - methodPropagationParameter || - methodPropagationReturnvalue; - - codeRemovalAdvanced = - codeRemovalAdvanced || - fieldRemovalWriteonly || - methodMarkingStatic || - methodRemovalParameter; - - codeRemovalSimple = - codeRemovalSimple || - codeSimplificationBranch; - - codeRemovalException = - codeRemovalException || - codeRemovalAdvanced || - codeRemovalSimple; - - codeSimplificationPeephole = - codeSimplificationVariable || - codeSimplificationArithmetic || - codeSimplificationCast || - codeSimplificationField || - codeSimplificationBranch || - codeSimplificationObject || - codeSimplificationString || - codeSimplificationMath; - } - - - /** - * Performs optimization of the given program class pool. - */ - public boolean execute(final ClassPool programClassPool, - final ClassPool libraryClassPool, - final MultiValueMap injectedClassNameMap) throws IOException - { - // Check if we have at least some keep commands. - if (configuration.keep == null && - configuration.applyMapping == null && - configuration.printMapping == null) - { - throw new IOException("You have to specify '-keep' options for the optimization step."); - } - - // Create counters to count the numbers of optimizations. - final ClassCounter classMarkingFinalCounter = new ClassCounter(); - final ClassCounter classUnboxingEnumCounter = new ClassCounter(); - final ClassCounter classMergingVerticalCounter = new ClassCounter(); - final ClassCounter classMergingHorizontalCounter = new ClassCounter(); - final ClassCounter classMergingWrapperCounter = new ClassCounter(); - final MemberCounter fieldRemovalWriteonlyCounter = new MemberCounter(); - final MemberCounter fieldMarkingPrivateCounter = new MemberCounter(); - final MemberCounter fieldPropagationValueCounter = new MemberCounter(); - final MemberCounter methodMarkingPrivateCounter = new MemberCounter(); - final MemberCounter methodMarkingStaticCounter = new MemberCounter(); - final MemberCounter methodMarkingFinalCounter = new MemberCounter(); - final MemberCounter methodMarkingSynchronizedCounter = new MemberCounter(); - final MemberCounter methodRemovalParameterCounter1 = new MemberCounter(); - final MemberCounter methodRemovalParameterCounter2 = new MemberCounter(); - final MemberCounter methodPropagationParameterCounter = new MemberCounter(); - final MemberCounter methodPropagationReturnvalueCounter = new MemberCounter(); - final InstructionCounter methodInliningShortCounter = new InstructionCounter(); - final InstructionCounter methodInliningUniqueCounter = new InstructionCounter(); - final InstructionCounter methodInliningTailrecursionCounter = new InstructionCounter(); - final InstructionCounter codeMergingCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationVariableCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationArithmeticCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationCastCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationFieldCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationBranchCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationObjectCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationStringCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationMathCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationAndroidMathCounter = new InstructionCounter(); - final InstructionCounter codeSimplificationAdvancedCounter = new InstructionCounter(); - final InstructionCounter deletedCounter = new InstructionCounter(); - final InstructionCounter addedCounter = new InstructionCounter(); - final MemberCounter codeRemovalVariableCounter = new MemberCounter(); - final ExceptionCounter codeRemovalExceptionCounter = new ExceptionCounter(); - final MemberCounter codeAllocationVariableCounter = new MemberCounter(); - final MemberCounter initializerFixCounter1 = new MemberCounter(); - final MemberCounter initializerFixCounter2 = new MemberCounter(); - - // Clean up any old visitor info. - programClassPool.classesAccept(new ClassCleaner()); - libraryClassPool.classesAccept(new ClassCleaner()); - - // Link all methods that should get the same optimization info. - programClassPool.classesAccept(new BottomClassFilter( - new MethodLinker())); - libraryClassPool.classesAccept(new BottomClassFilter( - new MethodLinker())); - - // Create a visitor for marking the seeds. - final KeepMarker keepMarker = new KeepMarker(); - ClassPoolVisitor classPoolvisitor = - new KeepClassSpecificationVisitorFactory(false, true, false) - .createClassPoolVisitor(configuration.keep, - keepMarker, - keepMarker, - keepMarker, - keepMarker); - // Mark the seeds. - programClassPool.accept(classPoolvisitor); - libraryClassPool.accept(classPoolvisitor); - - // All library classes and library class members remain unchanged. - libraryClassPool.classesAccept(keepMarker); - libraryClassPool.classesAccept(new AllMemberVisitor(keepMarker)); - - // We also keep all classes that are involved in .class constructs. - // We're not looking at enum classes though, so they can be simplified. - programClassPool.classesAccept( - new ClassAccessFilter(0, ClassConstants.ACC_ENUM, - new AllMethodVisitor( - new AllAttributeVisitor( - new AllInstructionVisitor( - new DotClassClassVisitor(keepMarker)))))); - - // We also keep all classes that are accessed dynamically. - programClassPool.classesAccept( - new AllConstantVisitor( - new ConstantTagFilter(ClassConstants.CONSTANT_String, - new ReferencedClassVisitor(keepMarker)))); - - // We also keep all class members that are accessed dynamically. - programClassPool.classesAccept( - new AllConstantVisitor( - new ConstantTagFilter(ClassConstants.CONSTANT_String, - new ReferencedMemberVisitor(keepMarker)))); - - // We also keep all bootstrap method signatures. - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_7, - new AllAttributeVisitor( - new AttributeNameFilter(ClassConstants.ATTR_BootstrapMethods, - new AllBootstrapMethodInfoVisitor( - new BootstrapMethodHandleTraveler( - new MethodrefTraveler( - new ReferencedMemberVisitor(keepMarker)))))))); - - // We also keep classes and methods referenced from bootstrap - // method arguments. - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_7, - new AllAttributeVisitor( - new AttributeNameFilter(ClassConstants.ATTR_BootstrapMethods, - new AllBootstrapMethodInfoVisitor( - new AllBootstrapMethodArgumentVisitor( - new MultiConstantVisitor( - // Class constants refer to additional functional - // interfaces (with LambdaMetafactory.altMetafactory). - new ConstantTagFilter(ClassConstants.CONSTANT_Class, - new ReferencedClassVisitor( - new FunctionalInterfaceFilter( - new ClassHierarchyTraveler(true, false, true, false, - new MultiClassVisitor( - keepMarker, - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - keepMarker)) - ))))), - - // Method handle constants refer to synthetic lambda - // methods (with LambdaMetafactory.metafactory and - // altMetafactory). - new MethodrefTraveler( - new ReferencedMemberVisitor(keepMarker))))))))); - - // We also keep the classes and abstract methods of functional - // interfaces that are returned by dynamic method invocations. - // These functional interfaces have to remain suitable for the - // dynamic method invocations with LambdaMetafactory. - programClassPool.classesAccept( - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_7, - new AllConstantVisitor( - new DynamicReturnedClassVisitor( - new FunctionalInterfaceFilter( - new ClassHierarchyTraveler(true, false, true, false, - new MultiClassVisitor( - keepMarker, - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - keepMarker)) - ))))))); - - // Attach some optimization info to all classes and class members, so - // it can be filled out later. - programClassPool.classesAccept(new ProgramClassOptimizationInfoSetter()); - - programClassPool.classesAccept(new AllMemberVisitor( - new ProgramMemberOptimizationInfoSetter())); - - if (configuration.assumeNoSideEffects != null) - { - // Create a visitor for marking classes and methods that don't have - // any side effects. - NoSideEffectClassMarker noSideEffectClassMarker = new NoSideEffectClassMarker(); - NoSideEffectMethodMarker noSideEffectMethodMarker = new NoSideEffectMethodMarker(); - ClassPoolVisitor classPoolVisitor = - new ClassSpecificationVisitorFactory() - .createClassPoolVisitor(configuration.assumeNoSideEffects, - noSideEffectClassMarker, - noSideEffectMethodMarker); - - // Mark the seeds. - programClassPool.accept(classPoolVisitor); - libraryClassPool.accept(classPoolVisitor); - } - - if (configuration.assumeNoExternalSideEffects != null) - { - // Create a visitor for marking classes and methods that don't have - // any external side effects. - NoSideEffectClassMarker noSideEffectClassMarker = new NoSideEffectClassMarker(); - NoExternalSideEffectMethodMarker noSideEffectMethodMarker = new NoExternalSideEffectMethodMarker(); - ClassPoolVisitor classPoolVisitor = - new ClassSpecificationVisitorFactory() - .createClassPoolVisitor(configuration.assumeNoExternalSideEffects, - noSideEffectClassMarker, - noSideEffectMethodMarker); - - // Mark the seeds. - programClassPool.accept(classPoolVisitor); - libraryClassPool.accept(classPoolVisitor); - } - - if (configuration.assumeNoEscapingParameters != null) - { - // Create a visitor for marking methods that don't let any - // reference parameters escape. - NoEscapingParametersMethodMarker noEscapingParametersMethodMarker = new NoEscapingParametersMethodMarker(); - ClassPoolVisitor classPoolVisitor = - new ClassSpecificationVisitorFactory() - .createClassPoolVisitor(configuration.assumeNoEscapingParameters, - null, - noEscapingParametersMethodMarker); - - // Mark the seeds. - programClassPool.accept(classPoolVisitor); - libraryClassPool.accept(classPoolVisitor); - } - - if (configuration.assumeNoExternalReturnValues != null) - { - // Create a visitor for marking methods that don't let any - // reference parameters escape. - NoExternalReturnValuesMethodMarker noExternalReturnValuesMethodMarker = new NoExternalReturnValuesMethodMarker(); - ClassPoolVisitor classPoolVisitor = - new ClassSpecificationVisitorFactory() - .createClassPoolVisitor(configuration.assumeNoExternalReturnValues, - null, - noExternalReturnValuesMethodMarker); - - // Mark the seeds. - programClassPool.accept(classPoolVisitor); - libraryClassPool.accept(classPoolVisitor); - } - - if (classMarkingFinal) - { - // Make classes final, whereever possible. - programClassPool.classesAccept( - new ClassFinalizer(classMarkingFinalCounter)); - } - - if (methodMarkingFinal) - { - // Make methods final, whereever possible. - programClassPool.classesAccept( - new ClassAccessFilter(0, ClassConstants.ACC_INTERFACE, - new AllMethodVisitor( - new MethodFinalizer(methodMarkingFinalCounter)))); - } - - // We'll repeatedly loop over all classes to mark read/write fields. - // side-effect methods, and escaping parameters. - final MutableBoolean repeatTrigger = new MutableBoolean(); - - // Create the various markers. - ReadWriteFieldMarker readWriteFieldMarker = - new ReadWriteFieldMarker(repeatTrigger); - - if (!fieldRemovalWriteonly) - { - // Mark all fields as read/write. - programClassPool.classesAccept( - new AllFieldVisitor( - readWriteFieldMarker)); - } - - SideEffectMethodMarker sideEffectMethodMarker = - new SideEffectMethodMarker(repeatTrigger); - - ParameterEscapeMarker parameterEscapeMarker = - new ParameterEscapeMarker(repeatTrigger); - - // Mark methods based on their headers. - programClassPool.classesAccept( - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - new MultiMemberVisitor( - sideEffectMethodMarker, - parameterEscapeMarker - )))); - - { - // Mark fields based on the method instructions in methods - // without editable optimization info. - programClassPool.accept( - new TimedClassPoolVisitor("Marking field usage in kept methods", - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - null, - - // member has no editable optimization info - new AllAttributeVisitor( - new AllInstructionVisitor( - readWriteFieldMarker)))))); - - ParallelAllClassVisitor.ClassVisitorFactory markingClassVisitor = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - ReferenceTracingValueFactory referenceTracingValueFactory1 = - new ReferenceTracingValueFactory(new TypedReferenceValueFactory()); - - PartialEvaluator partialEvaluator = - new PartialEvaluator(referenceTracingValueFactory1, - new ParameterTracingInvocationUnit(new BasicInvocationUnit(referenceTracingValueFactory1)), - false, - referenceTracingValueFactory1); - - InstructionUsageMarker instructionUsageMarker = - new InstructionUsageMarker(partialEvaluator, false); - - // Create the various markers. - ReadWriteFieldMarker readWriteFieldMarker = - new ReadWriteFieldMarker(repeatTrigger); - - SideEffectMethodMarker sideEffectMethodMarker = - new SideEffectMethodMarker(repeatTrigger); - - ParameterEscapeMarker parameterEscapeMarker = - new ParameterEscapeMarker(repeatTrigger, partialEvaluator, false); - - return - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - new AllAttributeVisitor( - new DebugAttributeVisitor("Marking fields, methods, and parameters", - new MultiAttributeVisitor( - partialEvaluator, - parameterEscapeMarker, - instructionUsageMarker, - new AllInstructionVisitor( - instructionUsageMarker.necessaryInstructionFilter( - new MultiInstructionVisitor( - readWriteFieldMarker, - sideEffectMethodMarker, - parameterEscapeMarker - ))) - ))))); - } - }; - - // Mark fields, methods and parameters based on the method instructions - // for methods that have editable optimization info. - programClassPool.accept( - new RepeatedClassPoolVisitor(repeatTrigger, - new TimedClassPoolVisitor("Marking fields, methods and parameters", - new ParallelAllClassVisitor( - markingClassVisitor)))); - } - - if (methodMarkingSynchronized) - { - // Mark all superclasses of escaping (kept) classes. - programClassPool.classesAccept( - new EscapingClassFilter( - new ClassHierarchyTraveler(false, true, true, false, - new EscapingClassMarker()))); - - ParallelAllClassVisitor.ClassVisitorFactory markingEscapingClassVisitor = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - return - new AllMethodVisitor( - new AllAttributeVisitor( - new EscapingClassMarker())); - } - }; - - // Mark classes that escape to the heap. - programClassPool.accept( - new TimedClassPoolVisitor("Marking escaping classes", - new ParallelAllClassVisitor( - markingEscapingClassVisitor))); - - // Desynchronize all non-static methods whose classes don't escape. - programClassPool.classesAccept( - new EscapingClassFilter(null, - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - new MemberAccessFilter(ClassConstants.ACC_SYNCHRONIZED, ClassConstants.ACC_STATIC, - new MultiMemberVisitor( - new MemberAccessFlagCleaner(ClassConstants.ACC_SYNCHRONIZED), - methodMarkingSynchronizedCounter - )))))); - } - - if (fieldRemovalWriteonly) - { - // Count the write-only fields. - programClassPool.classesAccept( - new AllFieldVisitor( - new WriteOnlyFieldFilter(fieldRemovalWriteonlyCounter))); - } - - if (classUnboxingEnum) - { - ClassCounter counter = new ClassCounter(); - - // Mark all final enums that qualify as simple enums. - programClassPool.classesAccept( - new ClassAccessFilter(ClassConstants.ACC_FINAL | - ClassConstants.ACC_ENUM, 0, - new OptimizationInfoClassFilter( - new SimpleEnumClassChecker()))); - - // Count the preliminary number of simple enums. - programClassPool.classesAccept( - new SimpleEnumFilter(counter)); - - // Only continue checking simple enums if there are any candidates. - if (counter.getCount() > 0) - { - // Unmark all simple enums that are explicitly used as objects. - programClassPool.classesAccept( - new SimpleEnumUseChecker()); - - // Unmark all simple enums that are used in descriptors of - // kept class members. Changing their names could upset - // the name parameters of invokedynamic instructions. - programClassPool.classesAccept( - new SimpleEnumFilter(null, - new AllMemberVisitor( - new KeptMemberFilter( - new MemberDescriptorReferencedClassVisitor( - new OptimizationInfoClassFilter( - new SimpleEnumMarker(false))))))); - - // Count the definitive number of simple enums. - programClassPool.classesAccept( - new SimpleEnumFilter(classUnboxingEnumCounter)); - - // Only start handling simple enums if there are any. - if (classUnboxingEnumCounter.getCount() > 0) - { - // Simplify the use of the enum classes in code. - programClassPool.accept( - new TimedClassPoolVisitor("Simplify use of simple enums", - new AllMethodVisitor( - new AllAttributeVisitor( - new SimpleEnumUseSimplifier())))); - - // Simplify the static initializers of simple enum classes. - programClassPool.classesAccept( - new SimpleEnumFilter( - new SimpleEnumClassSimplifier())); - - // Simplify the use of the enum classes in descriptors. - programClassPool.classesAccept( - new SimpleEnumDescriptorSimplifier()); - - // Update references to class members with simple enum classes. - programClassPool.classesAccept(new MemberReferenceFixer()); - } - } - } - - // Mark all used parameters, including the 'this' parameters. - ParallelAllClassVisitor.ClassVisitorFactory markingUsedParametersClassVisitor = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - return - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - new ParameterUsageMarker(!methodMarkingStatic, - !methodRemovalParameter))); - } - }; - - programClassPool.accept( - new TimedClassPoolVisitor("Marking used parameters", - new ParallelAllClassVisitor( - markingUsedParametersClassVisitor))); - - // Mark all parameters of referenced methods in methods whose code must - // be kept. This prevents shrinking of method descriptors which may not - // be propagated correctly otherwise. - programClassPool.accept( - new TimedClassPoolVisitor("Marking used parameters in kept code attributes", - new AllClassVisitor( - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - null, - - // visit all methods that are kept - new AllAttributeVisitor( - new OptimizationCodeAttributeFilter( - null, - - // visit all code attributes that are kept - new AllInstructionVisitor( - new InstructionConstantVisitor( - new ConstantTagFilter(new int[] { ClassConstants.CONSTANT_Methodref, - ClassConstants.CONSTANT_InterfaceMethodref }, - new ReferencedMemberVisitor( - new OptimizationInfoMemberFilter( - // Mark all parameters including "this" of referenced methods - new ParameterUsageMarker(true, true, false)))))))) - ))))); - -// System.out.println("Optimizer.execute: before evaluation simplification"); -// programClassPool.classAccept("abc/Def", new NamedMethodVisitor("abc", null, new ClassPrinter())); - - // Perform partial evaluation for filling out fields, method parameters, - // and method return values, so they can be propagated. - if (fieldPropagationValue || - methodPropagationParameter || - methodPropagationReturnvalue || - classMergingWrapper) - { - // We'll create values to be stored with fields, method parameters, - // and return values. - ValueFactory valueFactory = new ParticularValueFactory(); - ValueFactory detailedValueFactory = new DetailedArrayValueFactory(); - - InvocationUnit storingInvocationUnit = - new StoringInvocationUnit(valueFactory, - fieldPropagationValue, - methodPropagationParameter || classMergingWrapper, - methodPropagationReturnvalue); - - // Evaluate synthetic classes in more detail, notably to propagate - // the arrays of the classes generated for enum switch statements. - programClassPool.classesAccept( - new ClassAccessFilter(ClassConstants.ACC_SYNTHETIC, 0, - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Filling out fields, method parameters, and return values in synthetic classes", - new PartialEvaluator(detailedValueFactory, storingInvocationUnit, false)))))); - - // Evaluate non-synthetic classes. We may need to evaluate all - // casts, to account for downcasts when specializing descriptors. - - ParallelAllClassVisitor.ClassVisitorFactory fillingOutValuesClassVisitor = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - ValueFactory valueFactory = new ParticularValueFactory(); - - InvocationUnit storingInvocationUnit = - new StoringInvocationUnit(valueFactory, - fieldPropagationValue, - methodPropagationParameter || classMergingWrapper, - methodPropagationReturnvalue); - - return - new ClassAccessFilter(0, ClassConstants.ACC_SYNTHETIC, - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Filling out fields, method parameters, and return values", - new PartialEvaluator(valueFactory, storingInvocationUnit, - false))))); - } - }; - - programClassPool.accept( - new TimedClassPoolVisitor("Filling out values in non-synthetic classes", - new ParallelAllClassVisitor( - fillingOutValuesClassVisitor))); - - if (fieldPropagationValue) - { - // Count the constant fields. - programClassPool.classesAccept( - new AllFieldVisitor( - new ConstantMemberFilter(fieldPropagationValueCounter))); - } - - if (methodPropagationParameter) - { - // Count the constant method parameters. - programClassPool.classesAccept( - new AllMethodVisitor( - new ConstantParameterFilter(methodPropagationParameterCounter))); - } - - if (methodPropagationReturnvalue) - { - // Count the constant method return values. - programClassPool.classesAccept( - new AllMethodVisitor( - new ConstantMemberFilter(methodPropagationReturnvalueCounter))); - } - - if (classUnboxingEnumCounter.getCount() > 0) - { - // Propagate the simple enum constant counts. - programClassPool.classesAccept( - new SimpleEnumFilter( - new SimpleEnumArrayPropagator())); - } - - if (codeSimplificationAdvanced) - { - // Fill out constants into the arrays of synthetic classes, - // notably the arrays of the classes generated for enum switch - // statements. - InvocationUnit loadingInvocationUnit = - new LoadingInvocationUnit(valueFactory, - fieldPropagationValue, - methodPropagationParameter, - methodPropagationReturnvalue); - - programClassPool.classesAccept( - new ClassAccessFilter(ClassConstants.ACC_SYNTHETIC, 0, - new AllMethodVisitor( - new AllAttributeVisitor( - new PartialEvaluator(valueFactory, loadingInvocationUnit, false))))); - } - } - - if (codeSimplificationAdvanced) - { - ParallelAllClassVisitor.ClassVisitorFactory simplifyingCodeVisitor = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - // Perform partial evaluation again, now loading any previously stored - // values for fields, method parameters, and method return values. - ValueFactory valueFactory = new IdentifiedValueFactory(); - - SimplifiedInvocationUnit loadingInvocationUnit = - new LoadingInvocationUnit(valueFactory, - fieldPropagationValue, - methodPropagationParameter, - methodPropagationReturnvalue); - - return - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Simplifying code", - new OptimizationCodeAttributeFilter( - new EvaluationSimplifier( - new PartialEvaluator(valueFactory, loadingInvocationUnit, false), - codeSimplificationAdvancedCounter))))); - } - }; - - // Simplify based on partial evaluation, propagating constant - // field values, method parameter values, and return values. - programClassPool.accept( - new TimedClassPoolVisitor("Simplifying code", - new ParallelAllClassVisitor( - simplifyingCodeVisitor))); - } - - if (codeRemovalAdvanced) - { - ParallelAllClassVisitor.ClassVisitorFactory shrinkingCodeVisitor = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - // Perform partial evaluation again, now loading any previously stored - // values for fields, method parameters, and method return values. - ValueFactory valueFactory = new IdentifiedValueFactory(); - - SimplifiedInvocationUnit loadingInvocationUnit = - new LoadingInvocationUnit(valueFactory, - fieldPropagationValue, - methodPropagationParameter, - methodPropagationReturnvalue); - - // Trace the construction of reference values. - ReferenceTracingValueFactory referenceTracingValueFactory = - new ReferenceTracingValueFactory(valueFactory); - - return - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Shrinking code", - new OptimizationCodeAttributeFilter( - new EvaluationShrinker( - new InstructionUsageMarker( - new PartialEvaluator(referenceTracingValueFactory, - new ParameterTracingInvocationUnit(loadingInvocationUnit), - !codeSimplificationAdvanced, - referenceTracingValueFactory), - true), true, deletedCounter, addedCounter))))); - } - }; - - // Remove code based on partial evaluation, also removing unused - // parameters from method invocations, and making methods static - // if possible. - programClassPool.accept( - new TimedClassPoolVisitor("Shrinking code", - new ParallelAllClassVisitor( - shrinkingCodeVisitor))); - } - - if (methodRemovalParameter) - { - // Shrink the parameters in the method descriptors. - programClassPool.classesAccept( - new AllMethodVisitor( - new UnusedParameterMethodFilter( - new OptimizationInfoMemberFilter( - new MethodDescriptorShrinker(methodRemovalParameterCounter1))))); - } - - if (methodMarkingStatic) - { - // Make all non-static methods that don't require the 'this' - // parameter static. - programClassPool.classesAccept( - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - new MemberAccessFilter(0, ClassConstants.ACC_STATIC, - new MethodStaticizer(methodMarkingStaticCounter))))); - } - - if (methodRemovalParameterCounter1.getCount() > 0) - { - // Fix all references to class members. - // This operation also updates the stack sizes. - programClassPool.classesAccept(new MemberReferenceFixer()); - - // Remove unused bootstrap method arguments. - programClassPool.classesAccept( - new AllAttributeVisitor( - new AllBootstrapMethodInfoVisitor( - new BootstrapMethodArgumentShrinker()))); - } - - if (methodRemovalParameterCounter1.getCount() > 0 || - methodMarkingPrivate || - // Methods are only marked private later on. - //methodMarkingPrivateCounter .getCount() > 0 || - methodMarkingStaticCounter .getCount() > 0) - { - // Remove all unused parameters from the corresponding byte code, - // shifting all remaining variables. - // This operation also updates the local variable frame sizes. - programClassPool.classesAccept( - new AllMethodVisitor( - new UnusedParameterMethodFilter( - new AllAttributeVisitor( - new ParameterShrinker(methodRemovalParameterCounter2))))); - - // Remove all unused parameters in the optimization info. - programClassPool.classesAccept( - new AllMethodVisitor( - new UnusedParameterMethodFilter( - new AllAttributeVisitor( - new UnusedParameterOptimizationInfoUpdater())))); - } - else if (codeRemovalAdvanced) - { - // Just update the local variable frame sizes. - programClassPool.classesAccept( - new AllMethodVisitor( - new AllAttributeVisitor( - new OptimizationCodeAttributeFilter( - new StackSizeUpdater())))); - } - - if (methodRemovalParameter && - methodRemovalParameterCounter2.getCount() > 0) - { - // Tweak the descriptors of duplicate initializers, due to removed - // method parameters. - programClassPool.classesAccept( - new AllMethodVisitor( - new DuplicateInitializerFixer(initializerFixCounter1))); - - if (initializerFixCounter1.getCount() > 0) - { - // Fix all invocations of tweaked initializers. - programClassPool.classesAccept( - new AllMethodVisitor( - new AllAttributeVisitor( - new DuplicateInitializerInvocationFixer(addedCounter)))); - - // Fix all references to tweaked initializers. - programClassPool.classesAccept(new MemberReferenceFixer()); - } - } - - // Mark all classes with package visible members. - // Mark all exception catches of methods. - // Count all method invocations. - // Mark super invocations and other access of methods. - StackSizeComputer stackSizeComputer = new StackSizeComputer(); - - programClassPool.accept( - new TimedClassPoolVisitor("Marking method and referenced class properties", - new MultiClassVisitor( - // Mark classes. - new OptimizationInfoClassFilter( - new MultiClassVisitor( - new PackageVisibleMemberContainingClassMarker(), - new WrapperClassMarker(), - - new AllConstantVisitor( - new PackageVisibleMemberInvokingClassMarker()) - )), - - // Mark methods. - new AllMethodVisitor( - new OptimizationInfoMemberFilter( - new AllAttributeVisitor( - new DebugAttributeVisitor("Marking method properties", - new MultiAttributeVisitor( - stackSizeComputer, - new CatchExceptionMarker(), - - new AllInstructionVisitor( - new MultiInstructionVisitor( - new SuperInvocationMarker(), - new DynamicInvocationMarker(), - new BackwardBranchMarker(), - new AccessMethodMarker(), - new SynchronizedBlockMethodMarker(), - new NonEmptyStackReturnMarker(stackSizeComputer) - )) - ))))), - - // Mark referenced classes and methods. - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Marking referenced class properties", - new MultiAttributeVisitor( - new AllExceptionInfoVisitor( - new ExceptionHandlerConstantVisitor( - new ReferencedClassVisitor( - new OptimizationInfoClassFilter( - new CaughtClassMarker())))), - - new AllInstructionVisitor( - new MultiInstructionVisitor( - new InstantiationClassMarker(), - new InstanceofClassMarker(), - new DotClassMarker(), - new MethodInvocationMarker() - )) - )))) - ))); - - if (classMergingWrapper) - { - // Merge wrapper classes into their wrapped classes. - programClassPool.accept( - new TimedClassPoolVisitor("Merging wrapper classes", - // Exclude injected classes - they might not end up in the output. - new WrapperClassMerger(configuration.allowAccessModification, - classMergingWrapperCounter))); - - if (classMergingWrapperCounter.getCount() > 0) - { - // Fix all uses of wrapper classes. - programClassPool.classesAccept( - new RetargetedClassFilter(null, - new AllMethodVisitor( - new AllAttributeVisitor( - new WrapperClassUseSimplifier())))); - } - } - - if (classMergingVertical) - { - // Merge subclasses up into their superclasses or - // merge interfaces down into their implementing classes. - programClassPool.accept( - new TimedClassPoolVisitor("Merging classes vertically", - // Exclude injected classes - they might not end up in the output. - new VerticalClassMerger(configuration.allowAccessModification, - configuration.mergeInterfacesAggressively, - classMergingVerticalCounter))); - } - - if (classMergingHorizontal) - { - // Merge classes into their sibling classes. - programClassPool.accept( - new TimedClassPoolVisitor("Merging classes horizontally", - // Exclude injected classes - they might not end up in the output. - new ClassNameFilter( - new NotMatcher( - new CollectionMatcher(injectedClassNameMap.getValues())), - new HorizontalClassMerger(configuration.allowAccessModification, - configuration.mergeInterfacesAggressively, - classMergingHorizontalCounter)))); - } - - if (classMergingVerticalCounter .getCount() > 0 || - classMergingHorizontalCounter.getCount() > 0 || - classMergingWrapperCounter .getCount() > 0) - { - // Clean up inner class attributes to avoid loops. - programClassPool.classesAccept(new RetargetedInnerClassAttributeRemover()); - - // Update references to merged classes: first the referenced - // classes, then the various actual descriptors. - // Leave retargeted classes themselves unchanged and valid, - // in case they aren't shrunk later on. - programClassPool.classesAccept(new RetargetedClassFilter(null, new TargetClassChanger())); - programClassPool.classesAccept(new RetargetedClassFilter(null, new ClassReferenceFixer(true))); - programClassPool.classesAccept(new RetargetedClassFilter(null, new MemberReferenceFixer())); - - if (configuration.allowAccessModification) - { - // Fix the access flags of referenced merged classes and their - // class members. - programClassPool.classesAccept(new AccessFixer()); - } - - // Fix the access flags of the inner classes information. - // DGD-63: don't change the access flags of inner classes - // that have not been renamed (Guice). - programClassPool.classesAccept( - new KeptClassFilter(null, - new AllAttributeVisitor( - new AllInnerClassesInfoVisitor( - new InnerClassesAccessFixer())))); - - // Tweak the descriptors of duplicate initializers, due to merged - // parameter classes. - programClassPool.classesAccept( - new AllMethodVisitor( - new DuplicateInitializerFixer(initializerFixCounter2))); - - if (initializerFixCounter2.getCount() > 0) - { - // Fix all invocations of tweaked initializers. - programClassPool.classesAccept( - new AllMethodVisitor( - new AllAttributeVisitor( - new DuplicateInitializerInvocationFixer(addedCounter)))); - - // Fix all references to tweaked initializers. - programClassPool.classesAccept(new MemberReferenceFixer()); - } - } - - if (methodInliningUnique) - { - // Inline methods that are only invoked once. - programClassPool.accept( - new TimedClassPoolVisitor("Inlining single methods", - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Inlining single methods", - new OptimizationCodeAttributeFilter( - new MethodInliner(configuration.microEdition, - configuration.android, - configuration.allowAccessModification, - true, - methodInliningUniqueCounter))))))); - } - - if (methodInliningShort) - { - // Inline short methods. - programClassPool.accept( - new TimedClassPoolVisitor("Inlining short methods", - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Inlining short methods", - new OptimizationCodeAttributeFilter( - new MethodInliner(configuration.microEdition, - configuration.android, - configuration.allowAccessModification, - false, - methodInliningShortCounter))))))); - } - - if (methodInliningTailrecursion) - { - // Simplify tail recursion calls. - programClassPool.accept( - new TimedClassPoolVisitor("Simplifying tail recursion", - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Simplifying tail recursion", - new OptimizationCodeAttributeFilter( - new TailRecursionSimplifier(methodInliningTailrecursionCounter))))))); - } - - if (fieldMarkingPrivate || - methodMarkingPrivate) - { - // Mark all class members that can not be made private. - programClassPool.classesAccept(new NonPrivateMemberMarker()); - } - - if (fieldMarkingPrivate) - { - // Make all non-private fields private, whereever possible. - programClassPool.classesAccept( - new ClassAccessFilter(0, ClassConstants.ACC_INTERFACE, - new AllFieldVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberPrivatizer(fieldMarkingPrivateCounter))))); - } - - if (methodMarkingPrivate) - { - // Make all non-private methods private, whereever possible. - programClassPool.classesAccept( - new ClassAccessFilter(0, ClassConstants.ACC_INTERFACE, - new AllMethodVisitor( - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - new MemberPrivatizer(methodMarkingPrivateCounter))))); - } - - if ((methodInliningUniqueCounter .getCount() > 0 || - methodInliningShortCounter .getCount() > 0 || - methodInliningTailrecursionCounter.getCount() > 0) && - configuration.allowAccessModification) - { - // Fix the access flags of referenced classes and class members, - // for MethodInliner. - programClassPool.classesAccept(new AccessFixer()); - } - - if (methodRemovalParameterCounter2.getCount() > 0 || - classMergingVerticalCounter .getCount() > 0 || - classMergingHorizontalCounter .getCount() > 0 || - classMergingWrapperCounter .getCount() > 0 || - methodMarkingPrivateCounter .getCount() > 0 || - ((methodInliningUniqueCounter .getCount() > 0 || - methodInliningShortCounter .getCount() > 0 || - methodInliningTailrecursionCounter.getCount() > 0) && - configuration.allowAccessModification)) - { - // Fix invocations of interface methods, or methods that have become - // non-abstract or private, and of methods that have moved to a - // different package. - programClassPool.classesAccept( - new AllMemberVisitor( - new AllAttributeVisitor( - new MethodInvocationFixer()))); - } - - if (codeMerging) - { - // Share common blocks of code at branches. - programClassPool.accept( - new TimedClassPoolVisitor("Sharing common code", - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Sharing common code", - new OptimizationCodeAttributeFilter( - new GotoCommonCodeReplacer(codeMergingCounter))))))); - } - - if (codeSimplificationPeephole) - { - ParallelAllClassVisitor.ClassVisitorFactory peepHoleOptimizer = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - // Create a branch target marker and a code attribute editor that can - // be reused for all code attributes. - BranchTargetFinder branchTargetFinder = new BranchTargetFinder(); - CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - InstructionSequenceConstants sequences = - new InstructionSequenceConstants(programClassPool, - libraryClassPool); - - List peepholeOptimizations = createPeepholeOptimizations(sequences, - branchTargetFinder, - codeAttributeEditor, - codeSimplificationVariableCounter, - codeSimplificationArithmeticCounter, - codeSimplificationCastCounter, - codeSimplificationFieldCounter, - codeSimplificationBranchCounter, - codeSimplificationObjectCounter, - codeSimplificationStringCounter, - codeSimplificationMathCounter, - codeSimplificationAndroidMathCounter); - - // Convert the list into an array. - InstructionVisitor[] peepholeOptimizationsArray = - new InstructionVisitor[peepholeOptimizations.size()]; - peepholeOptimizations.toArray(peepholeOptimizationsArray); - - return - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Peephole optimizations", - new OptimizationCodeAttributeFilter( - new PeepholeOptimizer(branchTargetFinder, codeAttributeEditor, - new MultiInstructionVisitor( - peepholeOptimizationsArray)))))); - } - }; - - // Perform the peephole optimisations. - programClassPool.accept( - new TimedClassPoolVisitor("Peephole optimizations", - new ParallelAllClassVisitor( - peepHoleOptimizer))); - } - - if (codeRemovalException) - { - // Remove unnecessary exception handlers. - programClassPool.accept( - new TimedClassPoolVisitor("Unreachable exception removal", - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Unreachable exception removal", - new OptimizationCodeAttributeFilter( - new UnreachableExceptionRemover(codeRemovalExceptionCounter))))))); - } - - if (codeRemovalSimple) - { - // Remove unreachable code. - programClassPool.accept( - new TimedClassPoolVisitor("Unreachable code removal", - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Unreachable code removal", - new OptimizationCodeAttributeFilter( - new UnreachableCodeRemover(deletedCounter))))))); - } - - if (codeRemovalVariable) - { - // Remove all unused local variables. - programClassPool.accept( - new TimedClassPoolVisitor("Variable shrinking", - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Variable shrinking", - new OptimizationCodeAttributeFilter( - new VariableShrinker(codeRemovalVariableCounter))))))); - } - - if (codeAllocationVariable) - { - ParallelAllClassVisitor.ClassVisitorFactory optimizingVariablesVisitor = - new ParallelAllClassVisitor.ClassVisitorFactory() - { - public ClassVisitor createClassVisitor() - { - return - new AllMethodVisitor( - new AllAttributeVisitor( - new DebugAttributeVisitor("Variable optimizations", - new OptimizationCodeAttributeFilter( - new VariableOptimizer(false, codeAllocationVariableCounter))))); - } - }; - - // Optimize the variables. - programClassPool.accept( - new TimedClassPoolVisitor("Variable optimizations", - new ParallelAllClassVisitor( - optimizingVariablesVisitor))); - } - - // Remove unused constants. - programClassPool.accept( - new TimedClassPoolVisitor("Shrinking constant pool", - new ConstantPoolShrinker())); - - int classMarkingFinalCount = classMarkingFinalCounter .getCount(); - int classUnboxingEnumCount = classUnboxingEnumCounter .getCount(); - int classMergingVerticalCount = classMergingVerticalCounter .getCount(); - int classMergingHorizontalCount = classMergingHorizontalCounter .getCount(); - int classMergingWrapperCount = classMergingWrapperCounter .getCount(); - int fieldRemovalWriteonlyCount = fieldRemovalWriteonlyCounter .getCount(); - int fieldMarkingPrivateCount = fieldMarkingPrivateCounter .getCount(); - int fieldPropagationValueCount = fieldPropagationValueCounter .getCount(); - int methodMarkingPrivateCount = methodMarkingPrivateCounter .getCount(); - int methodMarkingStaticCount = methodMarkingStaticCounter .getCount(); - int methodMarkingFinalCount = methodMarkingFinalCounter .getCount(); - int methodMarkingSynchronizedCount = methodMarkingSynchronizedCounter .getCount(); - int methodRemovalParameterCount1 = methodRemovalParameterCounter1 .getCount() - initializerFixCounter1.getCount() - initializerFixCounter2.getCount(); - int methodRemovalParameterCount2 = methodRemovalParameterCounter2 .getCount() - methodMarkingStaticCounter.getCount() - initializerFixCounter1.getCount() - initializerFixCounter2.getCount(); - int methodPropagationParameterCount = methodPropagationParameterCounter .getCount(); - int methodPropagationReturnvalueCount = methodPropagationReturnvalueCounter .getCount(); - int methodInliningShortCount = methodInliningShortCounter .getCount(); - int methodInliningUniqueCount = methodInliningUniqueCounter .getCount(); - int methodInliningTailrecursionCount = methodInliningTailrecursionCounter .getCount(); - int codeMergingCount = codeMergingCounter .getCount(); - int codeSimplificationVariableCount = codeSimplificationVariableCounter .getCount(); - int codeSimplificationArithmeticCount = codeSimplificationArithmeticCounter .getCount(); - int codeSimplificationCastCount = codeSimplificationCastCounter .getCount(); - int codeSimplificationFieldCount = codeSimplificationFieldCounter .getCount(); - int codeSimplificationBranchCount = codeSimplificationBranchCounter .getCount(); - int codeSimplificationObjectCount = codeSimplificationObjectCounter .getCount(); - int codeSimplificationStringCount = codeSimplificationStringCounter .getCount(); - int codeSimplificationMathCount = codeSimplificationMathCounter .getCount(); - int codeSimplificationAndroidMathCount = codeSimplificationAndroidMathCounter .getCount(); - int codeSimplificationAdvancedCount = codeSimplificationAdvancedCounter .getCount(); - int codeRemovalCount = deletedCounter .getCount() - addedCounter.getCount(); - int codeRemovalVariableCount = codeRemovalVariableCounter .getCount(); - int codeRemovalExceptionCount = codeRemovalExceptionCounter .getCount(); - int codeAllocationVariableCount = codeAllocationVariableCounter .getCount(); - - // Forget about constant fields, parameters, and return values, if they - // didn't lead to any useful optimizations. We want to avoid fruitless - // additional optimization passes. - if (codeSimplificationAdvancedCount == 0) - { - fieldPropagationValueCount = 0; - methodPropagationParameterCount = 0; - methodPropagationReturnvalueCount = 0; - } - - if (configuration.verbose) - { - System.out.println(" Number of finalized classes: " + classMarkingFinalCount + disabled(classMarkingFinal)); - System.out.println(" Number of unboxed enum classes: " + classUnboxingEnumCount + disabled(classUnboxingEnum)); - System.out.println(" Number of vertically merged classes: " + classMergingVerticalCount + disabled(classMergingVertical)); - System.out.println(" Number of horizontally merged classes: " + classMergingHorizontalCount + disabled(classMergingHorizontal)); - System.out.println(" Number of merged wrapper classes: " + classMergingWrapperCount + disabled(classMergingWrapper)); - System.out.println(" Number of removed write-only fields: " + fieldRemovalWriteonlyCount + disabled(fieldRemovalWriteonly)); - System.out.println(" Number of privatized fields: " + fieldMarkingPrivateCount + disabled(fieldMarkingPrivate)); - System.out.println(" Number of inlined constant fields: " + fieldPropagationValueCount + disabled(fieldPropagationValue)); - System.out.println(" Number of privatized methods: " + methodMarkingPrivateCount + disabled(methodMarkingPrivate)); - System.out.println(" Number of staticized methods: " + methodMarkingStaticCount + disabled(methodMarkingStatic)); - System.out.println(" Number of finalized methods: " + methodMarkingFinalCount + disabled(methodMarkingFinal)); - System.out.println(" Number of desynchronized methods: " + methodMarkingSynchronizedCount + disabled(methodMarkingSynchronized)); - System.out.println(" Number of simplified method signatures: " + methodRemovalParameterCount1 + disabled(methodRemovalParameter)); - System.out.println(" Number of removed method parameters: " + methodRemovalParameterCount2 + disabled(methodRemovalParameter)); - System.out.println(" Number of inlined constant parameters: " + methodPropagationParameterCount + disabled(methodPropagationParameter)); - System.out.println(" Number of inlined constant return values: " + methodPropagationReturnvalueCount + disabled(methodPropagationReturnvalue)); - System.out.println(" Number of inlined short method calls: " + methodInliningShortCount + disabled(methodInliningShort)); - System.out.println(" Number of inlined unique method calls: " + methodInliningUniqueCount + disabled(methodInliningUnique)); - System.out.println(" Number of inlined tail recursion calls: " + methodInliningTailrecursionCount + disabled(methodInliningTailrecursion)); - System.out.println(" Number of merged code blocks: " + codeMergingCount + disabled(codeMerging)); - System.out.println(" Number of variable peephole optimizations: " + codeSimplificationVariableCount + disabled(codeSimplificationVariable)); - System.out.println(" Number of arithmetic peephole optimizations: " + codeSimplificationArithmeticCount + disabled(codeSimplificationArithmetic)); - System.out.println(" Number of cast peephole optimizations: " + codeSimplificationCastCount + disabled(codeSimplificationCast)); - System.out.println(" Number of field peephole optimizations: " + codeSimplificationFieldCount + disabled(codeSimplificationField)); - System.out.println(" Number of branch peephole optimizations: " + codeSimplificationBranchCount + disabled(codeSimplificationBranch)); - System.out.println(" Number of object peephole optimizations: " + codeSimplificationObjectCount + disabled(codeSimplificationObject)); - System.out.println(" Number of string peephole optimizations: " + codeSimplificationStringCount + disabled(codeSimplificationString)); - System.out.println(" Number of math peephole optimizations: " + codeSimplificationMathCount + disabled(codeSimplificationMath)); - if (configuration.android) - System.out.println(" Number of Android math peephole optimizations: " + codeSimplificationAndroidMathCount + disabled(codeSimplificationMath)); - System.out.println(" Number of simplified instructions: " + codeSimplificationAdvancedCount + disabled(codeSimplificationAdvanced)); - System.out.println(" Number of removed instructions: " + codeRemovalCount + disabled(codeRemovalAdvanced)); - System.out.println(" Number of removed local variables: " + codeRemovalVariableCount + disabled(codeRemovalVariable)); - System.out.println(" Number of removed exception blocks: " + codeRemovalExceptionCount + disabled(codeRemovalException)); - System.out.println(" Number of optimized local variable frames: " + codeAllocationVariableCount + disabled(codeAllocationVariable)); - } - - return classMarkingFinalCount > 0 || - classUnboxingEnumCount > 0 || - classMergingVerticalCount > 0 || - classMergingHorizontalCount > 0 || - classMergingWrapperCount > 0 || - fieldRemovalWriteonlyCount > 0 || // TODO: The write-only field counter may be optimistic about removal. - fieldMarkingPrivateCount > 0 || - methodMarkingPrivateCount > 0 || - methodMarkingStaticCount > 0 || - methodMarkingFinalCount > 0 || - fieldPropagationValueCount > 0 || - methodRemovalParameterCount1 > 0 || - methodRemovalParameterCount2 > 0 || - methodPropagationParameterCount > 0 || - methodPropagationReturnvalueCount > 0 || - methodInliningShortCount > 0 || - methodInliningUniqueCount > 0 || - methodInliningTailrecursionCount > 0 || - codeMergingCount > 0 || - codeSimplificationVariableCount > 0 || - codeSimplificationArithmeticCount > 0 || - codeSimplificationCastCount > 0 || - codeSimplificationFieldCount > 0 || - codeSimplificationBranchCount > 0 || - codeSimplificationObjectCount > 0 || - codeSimplificationStringCount > 0 || - codeSimplificationMathCount > 0 || - codeSimplificationAndroidMathCount > 0 || - codeSimplificationAdvancedCount > 0 || - codeRemovalCount > 0 || - codeRemovalVariableCount > 0 || - codeRemovalExceptionCount > 0 || - codeAllocationVariableCount > 0; - } - - - private List createPeepholeOptimizations(InstructionSequenceConstants sequences, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionCounter codeSimplificationVariableCounter, - InstructionCounter codeSimplificationArithmeticCounter, - InstructionCounter codeSimplificationCastCounter, - InstructionCounter codeSimplificationFieldCounter, - InstructionCounter codeSimplificationBranchCounter, - InstructionCounter codeSimplificationObjectCounter, - InstructionCounter codeSimplificationStringCounter, - InstructionCounter codeSimplificationMathCounter, - InstructionCounter codeSimplificationAndroidMathCounter) - { - List peepholeOptimizations = new ArrayList(); - - if (codeSimplificationVariable) - { - // Peephole optimizations involving local variables. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.VARIABLE_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationVariableCounter)); - } - - if (codeSimplificationArithmetic) - { - // Peephole optimizations involving arithmetic operations. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.ARITHMETIC_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationArithmeticCounter)); - } - - if (codeSimplificationCast) - { - // Peephole optimizations involving cast operations. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.CAST_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationCastCounter)); - } - - if (codeSimplificationField) - { - // Peephole optimizations involving fields. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.FIELD_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationFieldCounter)); - } - - if (codeSimplificationBranch) - { - // Peephole optimizations involving branches. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.BRANCH_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationBranchCounter)); - - // Include optimization of branches to branches and returns. - peepholeOptimizations.add( - new GotoGotoReplacer(codeAttributeEditor, codeSimplificationBranchCounter)); - peepholeOptimizations.add( - new GotoReturnReplacer(codeAttributeEditor, codeSimplificationBranchCounter)); - } - - if (codeSimplificationObject) - { - // Peephole optimizations involving branches. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.OBJECT_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationObjectCounter)); - } - - if (codeSimplificationString) - { - // Peephole optimizations involving branches. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.STRING_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationStringCounter)); - } - - if (codeSimplificationMath) - { - // Peephole optimizations involving math. - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.MATH_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationMathCounter)); - - if (configuration.android) - { - peepholeOptimizations.add( - new InstructionSequencesReplacer(sequences.CONSTANTS, - sequences.MATH_ANDROID_SEQUENCES, - branchTargetFinder, codeAttributeEditor, codeSimplificationAndroidMathCounter)); - } - } - - return peepholeOptimizations; - } - - - /** - * Returns a String indicating whether the given flag is enabled or - * disabled. - */ - private String disabled(boolean flag) - { - return flag ? "" : " (disabled)"; - } - - - /** - * Returns a String indicating whether the given flags are enabled or - * disabled. - */ - private String disabled(boolean flag1, boolean flag2) - { - return flag1 && flag2 ? "" : - flag1 || flag2 ? " (partially disabled)" : - " (disabled)"; - } - - - /** - * A simple class pool visitor that will output timing information. - */ - private class TimedClassPoolVisitor - implements ClassPoolVisitor - { - private final String message; - private final ClassPoolVisitor classPoolVisitor; - - public TimedClassPoolVisitor(String message, ClassVisitor classVisitor) - { - this(message, new AllClassVisitor(classVisitor)); - } - - public TimedClassPoolVisitor(String message, ClassPoolVisitor classPoolVisitor) - { - this.message = message; - this.classPoolVisitor = classPoolVisitor; - } - - - // Implementations for ClassPoolVisitor. - - public void visitClassPool(ClassPool classPool) - { - long start = 0; - - if (DETAILS) - { - System.out.print(message); - System.out.print(getPadding(message.length(), 48)); - start = System.currentTimeMillis(); - } - - classPool.accept(classPoolVisitor); - - if (DETAILS) - { - long end = System.currentTimeMillis(); - System.out.println(String.format(" took: %6d ms", (end - start))); - } - } - - - // Private helper methods - - private String getPadding(int pos, int size) - { - StringBuilder sb = new StringBuilder(); - for (int i = pos; i < size; i++) - { - sb.append('.'); - } - return sb.toString(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ParameterShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ParameterShrinker.java deleted file mode 100644 index 0f540294..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/ParameterShrinker.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.VariableRemapper; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.info.*; - -/** - * This AttributeVisitor removes unused parameters from the code of the methods - * that it visits. - * - * @see ParameterUsageMarker - * @see MethodStaticizer - * @see MethodDescriptorShrinker - * @author Eric Lafortune - */ -public class ParameterShrinker -extends SimplifiedVisitor -implements AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("ps") != null; - //*/ - - - private final MemberVisitor extraUnusedParameterMethodVisitor; - - private final VariableRemapper variableRemapper = new VariableRemapper(); - - - /** - * Creates a new ParameterShrinker. - */ - public ParameterShrinker() - { - this(null); - } - - - /** - * Creates a new ParameterShrinker with an extra visitor. - * @param extraUnusedParameterMethodVisitor an optional extra visitor for - * all removed parameters. - */ - public ParameterShrinker(MemberVisitor extraUnusedParameterMethodVisitor) - { - this.extraUnusedParameterMethodVisitor = extraUnusedParameterMethodVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Get the original parameter size that was saved. - int oldParameterSize = ParameterUsageMarker.getParameterSize(method); - - // Compute the new parameter size from the shrunk descriptor. - int newParameterSize = - ClassUtil.internalMethodParameterSize(method.getDescriptor(clazz), - method.getAccessFlags()); - - if (oldParameterSize > newParameterSize) - { - // Get the total size of the local variable frame. - int maxLocals = codeAttribute.u2maxLocals; - - if (DEBUG) - { - System.out.println("ParameterShrinker: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - System.out.println(" Old parameter size = " + oldParameterSize); - System.out.println(" New parameter size = " + newParameterSize); - System.out.println(" Max locals = " + maxLocals); - } - - // Create a variable map. - int[] variableMap = new int[maxLocals]; - - // Move unused parameters right after the parameter block. - int usedParameterIndex = 0; - int unusedParameterIndex = newParameterSize; - for (int parameterIndex = 0; parameterIndex < oldParameterSize; parameterIndex++) - { - // Is the variable required as a parameter? - if (ParameterUsageMarker.isParameterUsed(method, parameterIndex)) - { - // Keep the variable as a parameter. - variableMap[parameterIndex] = usedParameterIndex++; - } - else - { - if (DEBUG) - { - System.out.println(" Deleting parameter #"+parameterIndex); - } - - // Shift the variable to the unused parameter block, - // in case it is still used as a variable. - variableMap[parameterIndex] = unusedParameterIndex++; - - // Visit the method, if required. - if (extraUnusedParameterMethodVisitor != null) - { - method.accept(clazz, extraUnusedParameterMethodVisitor); - } - } - } - - // Fill out the remainder of the map. - for (int variableIndex = oldParameterSize; variableIndex < maxLocals; variableIndex++) - { - variableMap[variableIndex] = variableIndex; - } - - // Set the map. - variableRemapper.setVariableMap(variableMap); - - // Remap the variables. - variableRemapper.visitCodeAttribute(clazz, method, codeAttribute); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/TailRecursionSimplifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/TailRecursionSimplifier.java deleted file mode 100644 index c92c1ec3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/TailRecursionSimplifier.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.CodeAttributeComposer; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; - -/** - * This MemberVisitor simplifies tail recursion calls in all methods that it - * visits. - * - * @author Eric Lafortune - */ -public class TailRecursionSimplifier -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - ExceptionInfoVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - - private final InstructionVisitor extraTailRecursionVisitor; - - - private final CodeAttributeComposer codeAttributeComposer = new CodeAttributeComposer(); - private final MyRecursionChecker recursionChecker = new MyRecursionChecker(); - private final StackSizeComputer stackSizeComputer = new StackSizeComputer(); - - private Method targetMethod; - private boolean inlinedAny; - - - - /** - * Creates a new TailRecursionSimplifier. - */ - public TailRecursionSimplifier() - { - this(null); - } - - - /** - * Creates a new TailRecursionSimplifier with an extra visitor. - * @param extraTailRecursionVisitor an optional extra visitor for all - * simplified tail recursions. - */ - public TailRecursionSimplifier(InstructionVisitor extraTailRecursionVisitor) - { - this.extraTailRecursionVisitor = extraTailRecursionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - int accessFlags = method.getAccessFlags(); - - if (// Only check the method if it is private, static, or final. - (accessFlags & (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC | - ClassConstants.ACC_FINAL)) != 0 && - - // Only check the method if it is not synchronized, etc. - (accessFlags & (ClassConstants.ACC_SYNCHRONIZED | - ClassConstants.ACC_NATIVE | - ClassConstants.ACC_ABSTRACT)) == 0) - { -// codeAttributeComposer.DEBUG = DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - targetMethod = method; - inlinedAny = false; - codeAttributeComposer.reset(); - - // The code may expand, due to expanding constant and variable - // instructions. - codeAttributeComposer.beginCodeFragment(codeAttribute.u4codeLength); - - // Copy the instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Update the code attribute if any code has been inlined. - if (inlinedAny) - { - // Append a label just after the code. - codeAttributeComposer.appendLabel(codeAttribute.u4codeLength); - - // Copy the exceptions. - codeAttribute.exceptionsAccept(clazz, method, this); - - codeAttributeComposer.endCodeFragment(); - - codeAttributeComposer.visitCodeAttribute(clazz, method, codeAttribute); - } - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Copy the instruction. - codeAttributeComposer.appendInstruction(offset, instruction); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Is it a method invocation? - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - { - // Is it a recursive call? - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, recursionChecker); - - if (recursionChecker.isRecursive()) - { - // Is the next instruction a return? - int nextOffset = - offset + constantInstruction.length(offset); - - Instruction nextInstruction = - InstructionFactory.create(codeAttribute.code, nextOffset); - - switch (nextInstruction.opcode) - { - case InstructionConstants.OP_IRETURN: - case InstructionConstants.OP_LRETURN: - case InstructionConstants.OP_FRETURN: - case InstructionConstants.OP_DRETURN: - case InstructionConstants.OP_ARETURN: - case InstructionConstants.OP_RETURN: - { - // Isn't the recursive call inside a try/catch block? - codeAttribute.exceptionsAccept(clazz, method, offset, recursionChecker); - - if (recursionChecker.isRecursive()) - { - // Is the stack empty after the return? - stackSizeComputer.visitCodeAttribute(clazz, method, codeAttribute); - - if (stackSizeComputer.getStackSizeAfter(nextOffset) == 0) - { - if (DEBUG) - { - System.out.println("TailRecursionSimplifier: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"], inlining "+constantInstruction.toString(offset)); - } - - // Append a label. - codeAttributeComposer.appendLabel(offset); - - storeParameters(clazz, method); - - // Branch back to the start of the method. - int gotoOffset = offset + 1; - codeAttributeComposer.appendInstruction(gotoOffset, - new BranchInstruction(InstructionConstants.OP_GOTO, -gotoOffset)); - - // The original return instruction will be - // removed elsewhere, if possible. - - // Remember that the code has changed. - inlinedAny = true; - - if (extraTailRecursionVisitor != null) - { - extraTailRecursionVisitor.visitConstantInstruction(clazz, method, codeAttribute, offset, constantInstruction); - } - - // The invocation itself is no longer necessary. - return; - } - } - } - } - } - - break; - } - } - - // Copy the instruction. - codeAttributeComposer.appendInstruction(offset, constantInstruction); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - codeAttributeComposer.appendException(new ExceptionInfo(exceptionInfo.u2startPC, - exceptionInfo.u2endPC, - exceptionInfo.u2handlerPC, - exceptionInfo.u2catchType)); - } - - - /** - * This ConstantVisitor and ExceptionInfoVisitor returns whether a method - * invocation can be treated as tail-recursive. - */ - private class MyRecursionChecker - extends SimplifiedVisitor - implements ConstantVisitor, - ExceptionInfoVisitor - { - private boolean recursive; - - - /** - * Returns whether the method invocation can be treated as - * tail-recursive. - */ - public boolean isRecursive() - { - return recursive; - } - - // Implementations for ConstantVisitor. - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant methodrefConstant) - { - recursive = targetMethod.equals(methodrefConstant.referencedMember); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - recursive = false; - } - } - - - // Small utility methods. - - /** - * Appends instructions to pop the parameters for the given method, storing - * them in new local variables. - */ - private void storeParameters(Clazz clazz, Method method) - { - String descriptor = method.getDescriptor(clazz); - - boolean isStatic = - (method.getAccessFlags() & ClassConstants.ACC_STATIC) != 0; - - // Count the number of parameters, taking into account their categories. - int parameterSize = ClassUtil.internalMethodParameterSize(descriptor); - int parameterOffset = isStatic ? 0 : 1; - - // Store the parameter types. - String[] parameterTypes = new String[parameterSize]; - - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(descriptor); - - for (int parameterIndex = 0; parameterIndex < parameterSize; parameterIndex++) - { - String parameterType = internalTypeEnumeration.nextType(); - parameterTypes[parameterIndex] = parameterType; - if (ClassUtil.internalTypeSize(parameterType) == 2) - { - parameterIndex++; - } - } - - codeAttributeComposer.beginCodeFragment(parameterSize + 1); - - // Go over the parameter types backward, storing the stack entries - // in their corresponding variables. - for (int parameterIndex = parameterSize-1; parameterIndex >= 0; parameterIndex--) - { - String parameterType = parameterTypes[parameterIndex]; - if (parameterType != null) - { - byte opcode; - switch (parameterType.charAt(0)) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: - opcode = InstructionConstants.OP_ISTORE; - break; - - case ClassConstants.TYPE_LONG: - opcode = InstructionConstants.OP_LSTORE; - break; - - case ClassConstants.TYPE_FLOAT: - opcode = InstructionConstants.OP_FSTORE; - break; - - case ClassConstants.TYPE_DOUBLE: - opcode = InstructionConstants.OP_DSTORE; - break; - - default: - opcode = InstructionConstants.OP_ASTORE; - break; - } - - codeAttributeComposer.appendInstruction(parameterSize-parameterIndex-1, - new VariableInstruction(opcode, parameterOffset + parameterIndex)); - } - } - - // Put the 'this' reference in variable 0. - if (!isStatic) - { - codeAttributeComposer.appendInstruction(parameterSize, - new VariableInstruction(InstructionConstants.OP_ASTORE, 0)); - } - - codeAttributeComposer.endCodeFragment(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/WriteOnlyFieldFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/WriteOnlyFieldFilter.java deleted file mode 100644 index fc36a15c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/WriteOnlyFieldFilter.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.info.ReadWriteFieldMarker; - -/** - * This MemberVisitor delegates its visits to program fields to - * other given MemberVisitor instances, but only when the visited - * field has been marked as write-only. - * - * @see ReadWriteFieldMarker - * @author Eric Lafortune - */ -public class WriteOnlyFieldFilter -extends SimplifiedVisitor -implements MemberVisitor -{ - private final MemberVisitor writeOnlyFieldVisitor; - - - /** - * Creates a new WriteOnlyFieldFilter. - * @param writeOnlyFieldVisitor the MemberVisitor to which - * visits to write-only fields will be delegated. - */ - public WriteOnlyFieldFilter(MemberVisitor writeOnlyFieldVisitor) - { - this.writeOnlyFieldVisitor = writeOnlyFieldVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - - if (ReadWriteFieldMarker.isWritten(programField) && - !ReadWriteFieldMarker.isRead(programField)) - { - writeOnlyFieldVisitor.visitProgramField(programClass, programField); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/EvaluationShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/EvaluationShrinker.java deleted file mode 100644 index 15591ce0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/EvaluationShrinker.java +++ /dev/null @@ -1,1548 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.RefConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.evaluation.TracedStack; -import proguard.evaluation.value.*; -import proguard.optimize.info.ParameterUsageMarker; - -/** - * This AttributeVisitor shrinks the code attributes that it visits, based - * on partial evaluation. - * - * @author Eric Lafortune - */ -public class EvaluationShrinker -extends SimplifiedVisitor -implements AttributeVisitor, - ExceptionInfoVisitor -{ - //* - private static final boolean DEBUG = false; - private static final boolean DEBUG_RESULTS = false; - /*/ - private static boolean DEBUG = System.getProperty("es") != null; - private static boolean DEBUG_RESULTS = DEBUG; - //*/ - - private static final int UNSUPPORTED = -1; - private static final int NOP = InstructionConstants.OP_NOP & 0xff; - private static final int POP = InstructionConstants.OP_POP & 0xff; - private static final int POP2 = InstructionConstants.OP_POP2 & 0xff; - private static final int DUP = InstructionConstants.OP_DUP & 0xff; - private static final int DUP_X1 = InstructionConstants.OP_DUP_X1 & 0xff; - private static final int DUP_X2 = InstructionConstants.OP_DUP_X2 & 0xff; - private static final int DUP2 = InstructionConstants.OP_DUP2 & 0xff; - private static final int DUP2_X1 = InstructionConstants.OP_DUP2_X1 & 0xff; - private static final int DUP2_X2 = InstructionConstants.OP_DUP2_X2 & 0xff; - private static final int SWAP = InstructionConstants.OP_SWAP & 0xff; - private static final int MOV_X2 = DUP_X2 | (POP << 8); - private static final int MOV2_X1 = DUP2_X1 | (POP2 << 8); - private static final int MOV2_X2 = DUP2_X2 | (POP2 << 8); - private static final int POP_X1 = SWAP | (POP << 8); - private static final int POP_X2 = DUP2_X1 | (POP2 << 8) | (POP << 16); - private static final int POP_X3 = UNSUPPORTED; - private static final int POP2_X1 = DUP_X2 | (POP << 8) | (POP2 << 16); - private static final int POP2_X2 = DUP2_X2 | (POP2 << 8) | (POP2 << 16); - private static final int POP3 = POP2 | (POP << 8); - private static final int POP4 = POP2 | (POP2 << 8); - private static final int POP_DUP = POP | (DUP << 8); - private static final int POP_SWAP_POP = POP | (SWAP << 8) | (POP << 16); - private static final int POP2_SWAP_POP = POP2 | (SWAP << 8) | (POP << 16); - private static final int SWAP_DUP_X1 = SWAP | (DUP_X1 << 8); - private static final int SWAP_DUP_X1_SWAP = SWAP | (DUP_X1 << 8) | (SWAP << 16); - private static final int SWAP_POP_DUP = SWAP | (POP << 8) | (DUP << 16); - private static final int SWAP_POP_DUP_X1 = SWAP | (POP << 8) | (DUP_X1 << 16); - private static final int DUP_X2_POP2 = DUP_X2 | (POP2 << 8); - private static final int DUP2_X1_POP3 = DUP2_X1 | (POP2 << 8) | (POP << 16); - private static final int DUP2_X2_POP3 = DUP2_X2 | (POP2 << 8) | (POP << 16); - private static final int DUP2_X2_SWAP_POP = DUP2_X2 | (SWAP << 8) | (POP << 16); - - - private final InstructionUsageMarker instructionUsageMarker; - private final boolean runInstructionUsageMarker; - private final InstructionVisitor extraDeletedInstructionVisitor; - private final InstructionVisitor extraAddedInstructionVisitor; - - private final MyStaticInvocationFixer staticInvocationFixer = new MyStaticInvocationFixer(); - private final MyBackwardBranchFixer backwardBranchFixer = new MyBackwardBranchFixer(); - private final MyNonReturningSubroutineFixer nonReturningSubroutineFixer = new MyNonReturningSubroutineFixer(); - private final MyStackConsistencyFixer stackConsistencyFixer = new MyStackConsistencyFixer(); - private final MyInstructionDeleter instructionDeleter = new MyInstructionDeleter(); - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(false, true); - - - /** - * Creates a new EvaluationShrinker. - */ - public EvaluationShrinker() - { - this(new PartialEvaluator(), true, null, null); - } - - - /** - * Creates a new EvaluationShrinker. - * @param partialEvaluator the partial evaluator that will - * analyze the code. - * @param runPartialEvaluator specifies whether the partial - * evaluator should be run for each - * method, or if some other class is - * already doing this. - * @param extraDeletedInstructionVisitor an optional extra visitor for all - * deleted instructions. - * @param extraAddedInstructionVisitor an optional extra visitor for all - * added instructions. - */ - public EvaluationShrinker(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator, - InstructionVisitor extraDeletedInstructionVisitor, - InstructionVisitor extraAddedInstructionVisitor) - { - this(new InstructionUsageMarker(partialEvaluator, runPartialEvaluator), - true, - extraDeletedInstructionVisitor, - extraAddedInstructionVisitor); - } - - - /** - * Creates a new EvaluationShrinker. - * @param instructionUsageMarker the instruction usage marker that - * will analyze the code. - * @param runInstructionUsageMarker specifies whether the usage - * marker should be run for each - * method, or if some other class is - * already doing this. - * @param extraDeletedInstructionVisitor an optional extra visitor for all - * deleted instructions. - * @param extraAddedInstructionVisitor an optional extra visitor for all - * added instructions. - */ - public EvaluationShrinker(InstructionUsageMarker instructionUsageMarker, - boolean runInstructionUsageMarker, - InstructionVisitor extraDeletedInstructionVisitor, - InstructionVisitor extraAddedInstructionVisitor) - { - this.instructionUsageMarker = instructionUsageMarker; - this.runInstructionUsageMarker = runInstructionUsageMarker; - this.extraDeletedInstructionVisitor = extraDeletedInstructionVisitor; - this.extraAddedInstructionVisitor = extraAddedInstructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = DEBUG_RESULTS = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // TODO: Remove this when the evaluation shrinker has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while shrinking instructions after partial evaluation:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - ex.printStackTrace(); - System.err.println("Not optimizing this method"); - - if (DEBUG) - { - method.accept(clazz, new ClassPrinter()); - - throw ex; - } - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG_RESULTS) - { - System.out.println("EvaluationShrinker ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - } - - // Analyze the method. - if (runInstructionUsageMarker) - { - instructionUsageMarker.visitCodeAttribute(clazz, method, codeAttribute); - } - - int codeLength = codeAttribute.u4codeLength; - - if (DEBUG) System.out.println(); - - - // Reset the code changes. - codeAttributeEditor.reset(codeLength); - - // Replace virtual invocations by static invocations, where neceesary. - if (DEBUG) System.out.println("Static invocation fixing:"); - - codeAttribute.instructionsAccept(clazz, method, - instructionUsageMarker.necessaryInstructionFilter(true, - staticInvocationFixer)); - - if (DEBUG) System.out.println(); - - - // Replace traced but unnecessary backward branches by infinite loops. - // The virtual machine's verification step is not smart enough to see - // the code isn't reachable, and may complain otherwise. - // Any clearly unreachable code will still be removed elsewhere. - if (DEBUG) System.out.println("Backward branch fixing:"); - - codeAttribute.instructionsAccept(clazz, method, - instructionUsageMarker.tracedInstructionFilter(true, - instructionUsageMarker.necessaryInstructionFilter(false, - backwardBranchFixer))); - - if (DEBUG) System.out.println(); - - - // Insert infinite loops after jumps to subroutines that don't return. - // The virtual machine's verification step is not smart enough to see - // the code isn't reachable, and may complain otherwise. - if (DEBUG) System.out.println("Non-returning subroutine fixing:"); - - codeAttribute.instructionsAccept(clazz, method, - instructionUsageMarker.necessaryInstructionFilter(true, - nonReturningSubroutineFixer)); - - if (DEBUG) System.out.println(); - - - // Locally fix instructions, in order to keep the stack consistent. - if (DEBUG) System.out.println("Stack consistency fixing:"); - - codeAttribute.instructionsAccept(clazz, method, - instructionUsageMarker.tracedInstructionFilter(true, - stackConsistencyFixer)); - - if (DEBUG) System.out.println(); - - - // Delete all instructions that are not used. - if (DEBUG) System.out.println("Deleting unused instructions"); - - codeAttribute.instructionsAccept(clazz, method, - instructionUsageMarker.necessaryInstructionFilter(false, - instructionDeleter)); - - if (DEBUG) System.out.println(); - - - if (DEBUG_RESULTS) - { - System.out.println("Simplification results:"); - - int offset = 0; - do - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - System.out.println((instructionUsageMarker.isInstructionNecessary(offset) ? " + " : - instructionUsageMarker.isExtraPushPopInstructionNecessary(offset) ? " ~ " : - " - ") + - instruction.toString(offset)); - - if (instructionUsageMarker.isTraced(offset)) - { - InstructionOffsetValue branchTargets = instructionUsageMarker.branchTargets(offset); - if (branchTargets != null) - { - System.out.println(" has overall been branching to "+branchTargets); - } - - boolean deleted = codeAttributeEditor.deleted[offset]; - if (instructionUsageMarker.isInstructionNecessary(offset) && deleted) - { - System.out.println(" is deleted"); - } - - Instruction preInsertion = codeAttributeEditor.preInsertions[offset]; - if (preInsertion != null) - { - System.out.println(" is preceded by: "+preInsertion); - } - - Instruction replacement = codeAttributeEditor.replacements[offset]; - if (replacement != null) - { - System.out.println(" is replaced by: "+replacement); - } - - Instruction postInsertion = codeAttributeEditor.postInsertions[offset]; - if (postInsertion != null) - { - System.out.println(" is followed by: "+postInsertion); - } - } - - offset += instruction.length(offset); - } - while (offset < codeLength); - } - - // Clear exception handlers that are not necessary. - codeAttribute.exceptionsAccept(clazz, method, this); - - // Apply all accumulated changes to the code. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - /** - * This MemberVisitor converts virtual method invocations into static - * method invocations if the 'this' parameter isn't used. - */ - private class MyStaticInvocationFixer - extends SimplifiedVisitor - implements InstructionVisitor, - ConstantVisitor, - MemberVisitor - { - private int invocationOffset; - private ConstantInstruction invocationInstruction; - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKEINTERFACE: - this.invocationOffset = offset; - this.invocationInstruction = constantInstruction; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - refConstant.referencedMemberAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Make the method invocation static, if possible. - if ((programMethod.getAccessFlags() & ClassConstants.ACC_STATIC) == 0 && - !ParameterUsageMarker.isParameterUsed(programMethod, 0)) - { - replaceByStaticInvocation(programClass, - invocationOffset, - invocationInstruction); - } - } - } - - - /** - * This InstructionVisitor replaces all backward branches by - * infinite loops. - */ - private class MyBackwardBranchFixer - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Is it a traced but unmarked backward branch, without an unmarked - // straddling forward branch? Note that this is still a heuristic. - if (isAllSmallerThanOrEqual(instructionUsageMarker.branchTargets(offset), - offset) && - !isAnyUnnecessaryInstructionBranchingOver(lastNecessaryInstructionOffset(offset), - offset)) - { - replaceByInfiniteLoop(clazz, offset); - - if (DEBUG) System.out.println(" Setting infinite loop instead of "+instruction.toString(offset)); - } - } - - - /** - * Returns whether all of the given instruction offsets (at least one) - * are smaller than or equal to the given offset. - */ - private boolean isAllSmallerThanOrEqual(InstructionOffsetValue instructionOffsets, - int instructionOffset) - { - if (instructionOffsets != null) - { - // Loop over all instruction offsets. - int branchCount = instructionOffsets.instructionOffsetCount(); - if (branchCount > 0) - { - for (int branchIndex = 0; branchIndex < branchCount; branchIndex++) - { - // Is the offset larger than the reference offset? - if (instructionOffsets.instructionOffset(branchIndex) > instructionOffset) - { - return false; - } - } - - return true; - } - } - - return false; - } - - - /** - * Returns the highest offset of an instruction that has been marked as - * necessary, before the given offset. - */ - private int lastNecessaryInstructionOffset(int instructionOffset) - { - for (int offset = instructionOffset-1; offset >= 0; offset--) - { - if (instructionUsageMarker.isInstructionNecessary(instructionOffset)) - { - return offset; - } - } - - return 0; - } - } - - - /** - * This InstructionVisitor appends infinite loops after all visited - * non-returning subroutine invocations. - */ - private class MyNonReturningSubroutineFixer - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - // Is it a necessary subroutine invocation? - if (branchInstruction.canonicalOpcode() == InstructionConstants.OP_JSR) - { - int nextOffset = offset + branchInstruction.length(offset); - if (!instructionUsageMarker.isInstructionNecessary(nextOffset)) - { - replaceByInfiniteLoop(clazz, nextOffset); - - if (DEBUG) System.out.println(" Adding infinite loop at ["+nextOffset+"] after "+branchInstruction.toString(offset)); - } - } - } - } - - - /** - * This InstructionVisitor fixes instructions locally, popping any unused - * produced stack entries after marked instructions, and popping produced - * stack entries and pushing missing stack entries instead of unmarked - * instructions. - */ - private class MyStackConsistencyFixer - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Has the instruction been marked? - if (instructionUsageMarker.isInstructionNecessary(offset)) - { - // Check all stack entries that are popped. - // Unusual case: an exception handler with an exception that is - // no longer consumed directly by a method. - // Typical case: a freshly marked variable initialization that - // requires some value on the stack. - int popCount = instruction.stackPopCount(clazz); - if (popCount > 0) - { - TracedStack tracedStack = - instructionUsageMarker.getStackBefore(offset); - - int stackSize = tracedStack.size(); - - int requiredPopCount = 0; - int requiredPushCount = 0; - for (int stackIndex = stackSize - popCount; stackIndex < stackSize; stackIndex++) - { - boolean stackEntryUnwantedBefore = - instructionUsageMarker.isStackEntryUnwantedBefore( offset, stackIndex); - boolean stackEntryPresentBefore = - instructionUsageMarker.isStackEntryPresentBefore( offset, stackIndex); - - if (stackEntryUnwantedBefore) - { - if (stackEntryPresentBefore) - { - // Remember to pop it. - requiredPopCount++; - } - } - else - { - if (!stackEntryPresentBefore) - { - // Remember to push some value. - requiredPushCount++; - } - } - } - - // Pop some unnecessary stack entries. - if (requiredPopCount > 0) - { - if (DEBUG) System.out.println(" Inserting before marked consumer "+instruction.toString(offset)); - - insertPopInstructions(offset, false, true, popCount); - } - - // Push some necessary stack entries. - if (requiredPushCount > 0) - { - Value value = tracedStack.getTop(0); - - if (DEBUG) System.out.println(" Inserting before marked consumer "+instruction.toString(offset)); - - if (requiredPushCount > (value.isCategory2() ? 2 : 1)) - { - throw new IllegalArgumentException("Unsupported stack size increment ["+requiredPushCount+"] at ["+offset+"]"); - } - - insertPushInstructions(offset, false, true, value.computationalType()); - } - } - - // Check all stack entries that are pushed. - // Typical case: a return value that wasn't really required and - // that should be popped. - int pushCount = instruction.stackPushCount(clazz); - if (pushCount > 0) - { - TracedStack tracedStack = - instructionUsageMarker.getStackAfter(offset); - - int stackSize = tracedStack.size(); - - int requiredPopCount = 0; - for (int stackIndex = stackSize - pushCount; stackIndex < stackSize; stackIndex++) - { - // Is the stack entry required by consumers? - if (!instructionUsageMarker.isStackEntryNecessaryAfter(offset, stackIndex)) - { - // Remember to pop it. - requiredPopCount++; - } - } - - // Pop the unnecessary stack entries. - if (requiredPopCount > 0) - { - if (DEBUG) System.out.println(" Inserting after marked producer "+instruction.toString(offset)); - - insertPopInstructions(offset, false, false, requiredPopCount); - } - } - } - else if (instructionUsageMarker.isExtraPushPopInstructionNecessary(offset)) - { - // Check all stack entries that would be popped. - // Typical case: a stack value that is required elsewhere and - // that still has to be popped. - int popCount = instruction.stackPopCount(clazz); - if (popCount > 0) - { - TracedStack tracedStack = - instructionUsageMarker.getStackBefore(offset); - - int stackSize = tracedStack.size(); - - int expectedPopCount = 0; - for (int stackIndex = stackSize - popCount; stackIndex < stackSize; stackIndex++) - { - // Is this stack entry pushed by any producer - // (because it is required by other consumers)? - if (instructionUsageMarker.isStackEntryPresentBefore(offset, stackIndex)) - { - // Remember to pop it. - expectedPopCount++; - } - } - - // Pop the unnecessary stack entries. - if (expectedPopCount > 0) - { - if (DEBUG) System.out.println(" Replacing unmarked consumer "+instruction.toString(offset)); - - insertPopInstructions(offset, true, false, expectedPopCount); - } - } - - // Check all stack entries that would be pushed. - // Typical case: a corresponding stack entry is pushed - // elsewhere so it still has to be pushed here. - int pushCount = instruction.stackPushCount(clazz); - if (pushCount > 0) - { - TracedStack tracedStack = - instructionUsageMarker.getStackAfter(offset); - - int stackSize = tracedStack.size(); - - int expectedPushCount = 0; - for (int stackIndex = stackSize - pushCount; stackIndex < stackSize; stackIndex++) - { - // Is the stack entry required by consumers? - if (instructionUsageMarker.isStackEntryNecessaryAfter(offset, stackIndex)) - { - // Remember to push it. - expectedPushCount++; - } - } - - // Push some necessary stack entries. - if (expectedPushCount > 0) - { - if (DEBUG) System.out.println(" Replacing unmarked producer "+instruction.toString(offset)); - - insertPushInstructions(offset, true, false, tracedStack.getTop(0).computationalType()); - } - } - } - } - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - if (instructionUsageMarker.isInstructionNecessary(offset) && - isDupOrSwap(simpleInstruction)) - { - int topBefore = instructionUsageMarker.getStackBefore(offset).size() - 1; - int topAfter = instructionUsageMarker.getStackAfter(offset).size() - 1; - - byte oldOpcode = simpleInstruction.opcode; - - // Simplify the dup/swap instruction if possible. - int newOpcodes = fixDupSwap(offset, oldOpcode, topBefore, topAfter); - - // Did we find a suitable (extended) opcode? - if (newOpcodes == UNSUPPORTED) - { - // We can't easily emulate some constructs. - throw new UnsupportedOperationException("Can't handle "+simpleInstruction.toString()+" instruction at ["+offset +"]"); - } - - // Is there a single replacement opcode? - if ((newOpcodes & ~0xff) == 0) - { - byte newOpcode = (byte)newOpcodes; - - if (newOpcode == InstructionConstants.OP_NOP) - { - // Delete the instruction. - codeAttributeEditor.deleteInstruction(offset); - - if (extraDeletedInstructionVisitor != null) - { - extraDeletedInstructionVisitor.visitSimpleInstruction(null, null, null, offset, null); - } - - if (DEBUG) System.out.println(" Deleting marked instruction "+simpleInstruction.toString(offset)); - } - else if (newOpcode == oldOpcode) - { - // Leave the instruction unchanged. - codeAttributeEditor.undeleteInstruction(offset); - - if (DEBUG) System.out.println(" Marking unchanged instruction "+simpleInstruction.toString(offset)); - } - else - { - // Replace the instruction. - Instruction replacementInstruction = new SimpleInstruction(newOpcode); - codeAttributeEditor.replaceInstruction(offset, - replacementInstruction); - - if (DEBUG) System.out.println(" Replacing instruction "+simpleInstruction.toString(offset)+" by "+replacementInstruction.toString()); - } - } - else - { - // Collect the replacement instructions. - Instruction[] replacementInstructions = new Instruction[4]; - - if (DEBUG) System.out.println(" Replacing instruction "+simpleInstruction.toString(offset)+" by"); - int count = 0; - while (newOpcodes != 0) - { - SimpleInstruction replacementInstruction = new SimpleInstruction((byte)newOpcodes); - replacementInstructions[count++] = replacementInstruction; - - if (DEBUG) System.out.println(" "+replacementInstruction.toString()); - newOpcodes >>>= 8; - } - - // Create a properly sized array. - if (count < 4) - { - Instruction[] newInstructions = new Instruction[count]; - System.arraycopy(replacementInstructions, 0, newInstructions, 0, count); - replacementInstructions = newInstructions; - } - - codeAttributeEditor.replaceInstruction(offset, - replacementInstructions); - } - } - else - { - visitAnyInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - if (instructionUsageMarker.isInstructionNecessary(offset)) - { - if (branchInstruction.stackPopCount(clazz) > 0 && - !instructionUsageMarker.isStackEntryPresentBefore(offset, instructionUsageMarker.getStackBefore(offset).size() - 1)) - { - // Replace the branch instruction by a simple goto. - Instruction replacementInstruction = new BranchInstruction(InstructionConstants.OP_GOTO, - branchInstruction.branchOffset); - codeAttributeEditor.replaceInstruction(offset, - replacementInstruction); - - if (DEBUG) System.out.println(" Replacing branch instruction "+branchInstruction.toString(offset)+" by "+replacementInstruction.toString()); - } - } - else - { - visitAnyInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - if (instructionUsageMarker.isInstructionNecessary(offset)) - { - if (switchInstruction.stackPopCount(clazz) > 0 && - !instructionUsageMarker.isStackEntryPresentBefore(offset, instructionUsageMarker.getStackBefore(offset).size() - 1)) - { - // Replace the switch instruction by a simple goto. - Instruction replacementInstruction = new BranchInstruction(InstructionConstants.OP_GOTO, - switchInstruction.defaultOffset); - codeAttributeEditor.replaceInstruction(offset, - replacementInstruction); - - if (DEBUG) System.out.println(" Replacing switch instruction "+switchInstruction.toString(offset)+" by "+replacementInstruction.toString()); - } - } - else - { - visitAnyInstruction(clazz, method, codeAttribute, offset, switchInstruction); - } - } - - - /** - * Returns whether the given instruction is a dup or swap instruction - * (dup, dup_x1, dup_x2, dup2, dup2_x1, dup2_x2, swap). - */ - private boolean isDupOrSwap(Instruction instruction) - { - return instruction.opcode >= InstructionConstants.OP_DUP && - instruction.opcode <= InstructionConstants.OP_SWAP; - } - - - /** - * Returns a dup/swap opcode that is corrected for the stack entries - * that are present before the instruction and necessary after the - * instruction. The returned integer opcode may contain multiple byte - * opcodes (least significant byte first). - * @param instructionOffset the offset of the dup/swap instruction. - * @param dupSwapOpcode the original dup/swap opcode. - * @param topBefore the index of the top stack entry before - * the instruction (counting from the bottom). - * @param topAfter the index of the top stack entry after - * the instruction (counting from the bottom). - * @return the corrected opcode. - */ - private int fixDupSwap(int instructionOffset, - byte dupSwapOpcode, - int topBefore, - int topAfter) - { - switch (dupSwapOpcode) - { - case InstructionConstants.OP_DUP: return fixedDup (instructionOffset, topBefore, topAfter); - case InstructionConstants.OP_DUP_X1: return fixedDup_x1 (instructionOffset, topBefore, topAfter); - case InstructionConstants.OP_DUP_X2: return fixedDup_x2 (instructionOffset, topBefore, topAfter); - case InstructionConstants.OP_DUP2: return fixedDup2 (instructionOffset, topBefore, topAfter); - case InstructionConstants.OP_DUP2_X1: return fixedDup2_x1(instructionOffset, topBefore, topAfter); - case InstructionConstants.OP_DUP2_X2: return fixedDup2_x2(instructionOffset, topBefore, topAfter); - case InstructionConstants.OP_SWAP: return fixedSwap (instructionOffset, topBefore, topAfter); - default: throw new IllegalArgumentException("Not a dup/swap opcode ["+dupSwapOpcode+"]"); - } - } - - - private int fixedDup(int instructionOffset, int topBefore, int topAfter) - { - boolean stackEntryPresent0 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore); - - boolean stackEntryNecessary0 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter); - boolean stackEntryNecessary1 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 1); - - // Figure out which stack entries should be moved, - // copied, or removed. - return - stackEntryNecessary0 ? - stackEntryNecessary1 ? DUP : // ...O -> ...OO - NOP : // ...O -> ...O - stackEntryNecessary1 ? NOP : // ...O -> ...O - stackEntryPresent0 ? POP : // ...O -> ... - NOP; // ... -> ... - } - - - private int fixedDup_x1(int instructionOffset, int topBefore, int topAfter) - { - boolean stackEntryPresent0 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore); - boolean stackEntryPresent1 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore - 1); - - boolean stackEntryNecessary0 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter); - boolean stackEntryNecessary1 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 1); - boolean stackEntryNecessary2 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 2); - - // Figure out which stack entries should be moved, - // copied, or removed. - return - stackEntryNecessary1 ? - stackEntryNecessary2 ? - stackEntryNecessary0 ? DUP_X1 : // ...XO -> ...OXO - SWAP : // ...XO -> ...OX - // !stackEntryNecessary2 - stackEntryNecessary0 ? NOP : // ...XO -> ...XO - stackEntryPresent0 ? POP : // ...XO -> ...X - NOP : // ...X -> ...X - stackEntryPresent1 ? - stackEntryNecessary2 ? - stackEntryNecessary0 ? SWAP_POP_DUP : // ...XO -> ...OO - POP_X1 : // ...XO -> ...O - // !stackEntryNecessary2 - stackEntryNecessary0 ? POP_X1 : // ...XO -> ...O - stackEntryPresent0 ? POP2 : // ...XO -> ... - POP : // ...X -> ... - // !stackEntryPresent1 - stackEntryNecessary2 ? - stackEntryNecessary0 ? DUP : // ...O -> ...OO - NOP : // ...O -> ...O - // !stackEntryNecessary2 - stackEntryNecessary0 ? NOP : // ...O -> ...O - stackEntryPresent0 ? POP : // ...O -> ... - NOP; // ... -> ... - } - - - private int fixedDup_x2(int instructionOffset, int topBefore, int topAfter) - { - boolean stackEntryPresent0 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore); - boolean stackEntryPresent1 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore - 1); - boolean stackEntryPresent2 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore - 2); - - boolean stackEntryNecessary0 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter); - boolean stackEntryNecessary1 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 1); - boolean stackEntryNecessary2 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 2); - boolean stackEntryNecessary3 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 3); - - // Figure out which stack entries should be moved, - // copied, or removed. - return - stackEntryNecessary1 ? - stackEntryNecessary2 ? - stackEntryNecessary3 ? - stackEntryNecessary0 ? DUP_X2 : // ...XYO -> ...OXYO - MOV_X2 : // ...XYO -> ...OXY - // !stackEntryNecessary3 - stackEntryNecessary0 ? NOP : // ...XYO -> ...XYO - stackEntryPresent0 ? POP : // ...XYO -> ...XY - NOP : // ...XY -> ...XY - stackEntryPresent2 ? - stackEntryNecessary3 ? - // stackEntryNecessary0 ? UNSUPPORTED : // ...XYO -> ...OYO - UNSUPPORTED : // ...XYO -> ...OY - // !stackEntryNecessary3 - stackEntryNecessary0 ? POP_X2 : // ...XYO -> ...YO - stackEntryPresent0 ? POP_SWAP_POP : // ...XYO -> ...Y - POP_X1 : // ...XY -> ...Y - // !stackEntryPresent2 - stackEntryNecessary3 ? - stackEntryNecessary0 ? DUP_X1 : // ...YO -> ...OYO - SWAP : // ...YO -> ...OY - // !stackEntryNecessary3 - stackEntryNecessary0 ? NOP : // ...YO -> ...YO - stackEntryPresent0 ? POP : // ...YO -> ...Y - NOP : // ...Y -> ...Y - stackEntryPresent1 ? - stackEntryNecessary2 ? - stackEntryNecessary3 ? - stackEntryNecessary0 ? SWAP_POP_DUP_X1 : // ...XYO -> ...OXO - DUP_X2_POP2 : // ...XYO -> ...OX - // !stackEntryNecessary3 - stackEntryNecessary0 ? POP_X1 : // ...XYO -> ...XO - stackEntryPresent0 ? POP2 : // ...XYO -> ...X - POP : // ...XY -> ...X - stackEntryPresent2 ? - stackEntryNecessary3 ? - stackEntryNecessary0 ? UNSUPPORTED : // ...XYO -> ...OO - POP2_X1 : // ...XYO -> ...O - // !stackEntryNecessary3 - stackEntryNecessary0 ? POP2_X1 : // ...XYO -> ...O - stackEntryPresent0 ? POP3 : // ...XYO -> ... - POP2 : // ...XY -> ... - // !stackEntryPresent2 - stackEntryNecessary3 ? - stackEntryNecessary0 ? SWAP_POP_DUP : // ...YO -> ...OO - POP_X1 : // ...YO -> ...O - // !stackEntryNecessary3 - stackEntryNecessary0 ? POP_X1 : // ...YO -> ...O - stackEntryPresent0 ? POP2 : // ...YO -> ... - POP : // ...Y -> ... - // !stackEntryPresent1 - stackEntryNecessary2 ? - stackEntryNecessary3 ? - stackEntryNecessary0 ? DUP_X1 : // ...XO -> ...OXO - SWAP : // ...XO -> ...OX - // !stackEntryNecessary3 - stackEntryNecessary0 ? NOP : // ...XO -> ...XO - stackEntryPresent0 ? POP : // ...XO -> ...X - NOP : // ...X -> ...X - stackEntryPresent2 ? - stackEntryNecessary3 ? - stackEntryNecessary0 ? SWAP_POP_DUP : // ...XO -> ...OO - POP_X1 : // ...XO -> ...O - // !stackEntryNecessary3 - stackEntryNecessary0 ? POP_X1 : // ...XO -> ...O - stackEntryPresent0 ? POP2 : // ...XO -> ... - POP : // ...X -> ... - // !stackEntryPresent2 - stackEntryNecessary3 ? - stackEntryNecessary0 ? DUP : // ...O -> ...OO - NOP : // ...O -> ...O - // !stackEntryNecessary3 - stackEntryNecessary0 ? NOP : // ...O -> ...O - stackEntryPresent0 ? POP : // ...O -> ... - NOP; // ... -> ... - } - - - private int fixedDup2(int instructionOffset, int topBefore, int topAfter) - { - boolean stackEntryPresent0 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore); - boolean stackEntryPresent1 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, - topBefore - - 1); - - boolean stackEntryNecessary0 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter); - boolean stackEntryNecessary1 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 1); - boolean stackEntryNecessary2 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 2); - boolean stackEntryNecessary3 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 3); - - return - stackEntryNecessary3 ? - stackEntryNecessary2 ? - stackEntryNecessary1 ? - stackEntryNecessary0 ? DUP2 : // ...AB -> ...ABAB - SWAP_DUP_X1 : // ...AB -> ...ABA - // !stackEntryNecessary1 - stackEntryNecessary0 ? DUP : // ...AB -> ...ABB - NOP : // ...AB -> ...AB - // !stackEntryNecessary2 - stackEntryNecessary1 ? - stackEntryNecessary0 ? SWAP_DUP_X1_SWAP : // ...AB -> ...AAB - stackEntryPresent0 ? POP_DUP : // ...AB -> ...AA - DUP : // ...A -> ...AA - // !stackEntryNecessary1 - stackEntryNecessary0 ? NOP : // ...AB -> ...AB - stackEntryPresent0 ? POP : // ...AB -> ...A - NOP : // ...A -> ...A - // !stackEntryNecessary3 - stackEntryNecessary2 ? - stackEntryNecessary1 ? - stackEntryNecessary0 ? DUP_X1 : // ...AB -> ...BAB - SWAP : // ...AB -> ...BA - stackEntryPresent1 ? - stackEntryNecessary0 ? SWAP_POP_DUP : // ...AB -> ...BB - POP_X1 : // ...AB -> ...B - // !stackEntryPresent1 - stackEntryNecessary0 ? POP : // ...B -> ...BB - NOP : // ...B -> ...B - // !stackEntryNecessary2 - stackEntryNecessary1 ? - stackEntryNecessary0 ? NOP : // ...AB -> ...AB - stackEntryPresent0 ? POP : // ...AB -> ...A - NOP : // ...A -> ...A - stackEntryPresent1 ? - stackEntryNecessary0 ? POP_X1 : // ...AB -> ...B - stackEntryPresent0 ? POP2 : // ...AB -> ... - POP : // ...A -> ... - // !stackEntryPresent1 - stackEntryNecessary0 ? NOP : // ...B -> ...B - stackEntryPresent0 ? POP : // ...B -> ... - NOP; // ... -> ... - } - - - private int fixedDup2_x1(int instructionOffset, int topBefore, int topAfter) - { - // We're currently assuming the value to be duplicated - // is a long or a double, taking up two slots, or at - // least consistent. - boolean stackEntriesPresent01 = instructionUsageMarker.isStackEntriesPresentBefore(instructionOffset, topBefore, topBefore - 1); - boolean stackEntryPresent2 = instructionUsageMarker.isStackEntryPresentBefore( instructionOffset, topBefore - 2); - - boolean stackEntriesNecessary01 = instructionUsageMarker.isStackEntriesNecessaryAfter(instructionOffset, topAfter, topAfter - 1); - boolean stackEntryNecessary2 = instructionUsageMarker.isStackEntryNecessaryAfter( instructionOffset, topAfter - 2); - boolean stackEntriesNecessary34 = instructionUsageMarker.isStackEntriesNecessaryAfter(instructionOffset, topAfter - 3, topAfter - 4); - - // Figure out which stack entries should be moved, - // copied, or removed. - return - stackEntryNecessary2 ? - stackEntriesNecessary34 ? - stackEntriesNecessary01 ? DUP2_X1 : // ...XAB -> ...ABXAB - MOV2_X1 : // ...XAB -> ...ABX - // !stackEntriesNecessary34 - stackEntriesNecessary01 ? NOP : // ...XAB -> ...XAB - stackEntriesPresent01 ? POP2 : // ...XAB -> ...X - NOP : // ...X -> ...X - stackEntryPresent2 ? - stackEntriesNecessary34 ? - stackEntriesNecessary01 ? UNSUPPORTED : // ...XAB -> ...ABAB - POP_X2 : // ...XAB -> ...AB - // !stackEntriesNecessary34 - stackEntriesNecessary01 ? DUP2_X1_POP3 : // ...XAB -> ...AB - stackEntriesPresent01 ? POP3 : // ...XAB -> ... - POP : // ...X -> ... - // !stackEntryPresent2 - stackEntriesNecessary34 ? - stackEntriesNecessary01 ? DUP2 : // ...AB -> ...ABAB - NOP : // ...AB -> ...AB - // !stackEntriesNecessary34 - stackEntriesNecessary01 ? NOP : // ...AB -> ...AB - stackEntriesPresent01 ? POP2 : // ...AB -> ... - NOP; // ... -> ... - } - - - private int fixedDup2_x2(int instructionOffset, int topBefore, int topAfter) - { - // We're currently assuming the value to be duplicated - // is a long or a double, taking up two slots, or at - // least consistent. - boolean stackEntriesPresent01 = instructionUsageMarker.isStackEntriesPresentBefore(instructionOffset, topBefore, topBefore - 1); - boolean stackEntryPresent2 = instructionUsageMarker.isStackEntryPresentBefore( instructionOffset, topBefore - 2); - boolean stackEntryPresent3 = instructionUsageMarker.isStackEntryPresentBefore( instructionOffset, topBefore - 3); - - boolean stackEntriesNecessary01 = instructionUsageMarker.isStackEntriesNecessaryAfter(instructionOffset, topAfter, topAfter - 1); - boolean stackEntryNecessary2 = instructionUsageMarker.isStackEntryNecessaryAfter( instructionOffset, topAfter - 2); - boolean stackEntryNecessary3 = instructionUsageMarker.isStackEntryNecessaryAfter( instructionOffset, topAfter - 3); - boolean stackEntriesNecessary45 = instructionUsageMarker.isStackEntriesNecessaryAfter(instructionOffset, topAfter - 4, topAfter - 5); - - // Figure out which stack entries should be moved, - // copied, or removed. - return - stackEntryNecessary2 ? - stackEntryNecessary3 ? - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? DUP2_X2 : // ...XYAB -> ...ABXYAB - MOV2_X2 : // ...XYAB -> ...ABXY - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? NOP : // ...XYAB -> ...XYAB - stackEntriesPresent01 ? POP2 : // ...XYAB -> ...XY - NOP : // ...XY -> ...XY - stackEntryPresent3 ? - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? UNSUPPORTED : // ...XYAB -> ...ABYAB - DUP2_X2_SWAP_POP : // ...XYAB -> ...ABY - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? POP_X3 : // ...XYAB -> ...YAB - stackEntriesPresent01 ? POP2_SWAP_POP : // ...XYAB -> ...Y - POP_X1 : // ...XY -> ...Y - // !stackEntryPresent3 - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? DUP2_X1 : // ...YAB -> ...ABYAB - MOV2_X1 : // ...YAB -> ...ABY - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? NOP : // ...YAB -> ...YAB - stackEntriesPresent01 ? POP2 : // ...YAB -> ...Y - NOP : // ...Y -> ...Y - stackEntryPresent2 ? - stackEntryNecessary3 ? - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? UNSUPPORTED : // ...XYAB -> ...ABXAB - DUP2_X2_POP3 : // ...XYAB -> ...ABX - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? POP_X2 : // ...XYAB -> ...XAB - stackEntriesPresent01 ? POP3 : // ...XYAB -> ...X - POP : // ...XY -> ...X - stackEntryPresent3 ? - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? UNSUPPORTED : // ...XYAB -> ...ABAB - POP2_X2 : // ...XYAB -> ...AB - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? POP2_X2 : // ...XYAB -> ...AB - stackEntriesPresent01 ? POP4 : // ...XYAB -> ... - POP2 : // ...XY -> ... - // !stackEntryPresent3 - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? UNSUPPORTED : // ...YAB -> ...ABAB - POP_X2 : // ...YAB -> ...AB - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? POP_X2 : // ...YAB -> ...AB - stackEntriesPresent01 ? POP3 : // ...YAB -> ... - POP : // ...Y -> ... - // !stackEntryPresent2 - stackEntryNecessary3 ? - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? DUP2_X1 : // ...XAB -> ...ABXAB - MOV2_X1 : // ...XAB -> ...ABX - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? NOP : // ...XAB -> ...XAB - stackEntriesPresent01 ? POP2 : // ...XAB -> ...X - NOP : // ...X -> ...X - stackEntryPresent3 ? - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? UNSUPPORTED : // ...XAB -> ...ABAB - POP_X2 : // ...XAB -> ...AB - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? POP_X2 : // ...XAB -> ...AB - stackEntriesPresent01 ? POP3 : // ...XAB -> ... - POP : // ...X -> ... - // !stackEntryPresent3 - stackEntriesNecessary45 ? - stackEntriesNecessary01 ? DUP2 : // ...AB -> ...ABAB - NOP : // ...AB -> ...AB - // !stackEntriesNecessary45 - stackEntriesNecessary01 ? NOP : // ...AB -> ...AB - stackEntriesPresent01 ? POP2 : // ...AB -> ... - NOP; // ... -> ... - } - - - private int fixedSwap(int instructionOffset, int topBefore, int topAfter) - { - boolean stackEntryPresent0 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore); - boolean stackEntryPresent1 = instructionUsageMarker.isStackEntryPresentBefore(instructionOffset, topBefore - 1); - - boolean stackEntryNecessary0 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter); - boolean stackEntryNecessary1 = instructionUsageMarker.isStackEntryNecessaryAfter(instructionOffset, topAfter - 1); - - // Figure out which stack entries should be moved - // or removed. - return - stackEntryNecessary0 ? - stackEntryNecessary1 ? SWAP : // ...AB -> ...BA - stackEntryPresent0 ? POP : // ...AB -> ...A - NOP : // ...A -> ...A - stackEntryPresent1 ? POP_X1 : // ...AB -> ...B - NOP; // ...B -> ...B - } - } - - - /** - * This InstructionVisitor deletes all visited instructions. - */ - private class MyInstructionDeleter - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - codeAttributeEditor.deleteInstruction(offset); - - // We're allowing edits on deleted instructions. - //codeAttributeEditor.insertBeforeInstruction(offset, (Instruction)null); - //codeAttributeEditor.replaceInstruction(offset, (Instruction)null); - //codeAttributeEditor.insertAfterInstruction(offset, (Instruction)null); - - // Visit the instruction, if required. - if (extraDeletedInstructionVisitor != null) - { - instruction.accept(clazz, method, codeAttribute, offset, extraDeletedInstructionVisitor); - } - } - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - // Is the catch handler necessary? - if (!instructionUsageMarker.isTraced(exceptionInfo.u2handlerPC)) - { - // Make the code block empty, so the code editor can remove it. - exceptionInfo.u2endPC = exceptionInfo.u2startPC; - } - } - - - // Small utility methods. - - /** - * Returns whether any traced but unnecessary instruction between the two - * given offsets is branching over the second given offset. - */ - private boolean isAnyUnnecessaryInstructionBranchingOver(int instructionOffset1, - int instructionOffset2) - { - for (int offset = instructionOffset1; offset < instructionOffset2; offset++) - { - // Is it a traced but unmarked straddling branch? - if (instructionUsageMarker.isTraced(offset) && - !instructionUsageMarker.isInstructionNecessary(offset) && - isAnyLargerThan(instructionUsageMarker.branchTargets(offset), - instructionOffset2)) - { - return true; - } - } - - return false; - } - - - /** - * Returns whether any of the given instruction offsets (at least one) - * is larger than the given offset. - */ - private boolean isAnyLargerThan(InstructionOffsetValue instructionOffsets, - int instructionOffset) - { - if (instructionOffsets != null) - { - // Loop over all instruction offsets. - int branchCount = instructionOffsets.instructionOffsetCount(); - if (branchCount > 0) - { - for (int branchIndex = 0; branchIndex < branchCount; branchIndex++) - { - // Is the offset larger than the reference offset? - if (instructionOffsets.instructionOffset(branchIndex) > instructionOffset) - { - return true; - } - } - } - } - - return false; - } - - - /** - * Pushes a specified type of stack entry before or at the given offset. - * The instruction is marked as necessary. - */ - private void insertPushInstructions(int offset, - boolean replace, - boolean before, - int computationalType) - { - // We can edit an instruction without marking it. - //markInstruction(offset); - - // Create a simple push instrucion. - Instruction replacementInstruction = - new SimpleInstruction(pushOpcode(computationalType)); - - if (DEBUG) System.out.println(": "+replacementInstruction.toString(offset)); - - // Replace or insert the push instruction. - insertInstruction(offset, replace, before, replacementInstruction); - } - - - /** - * Returns the opcode of a push instruction corresponding to the given - * computational type. - * @param computationalType the computational type to be pushed on the stack. - */ - private byte pushOpcode(int computationalType) - { - switch (computationalType) - { - case Value.TYPE_INTEGER: return InstructionConstants.OP_ICONST_0; - case Value.TYPE_LONG: return InstructionConstants.OP_LCONST_0; - case Value.TYPE_FLOAT: return InstructionConstants.OP_FCONST_0; - case Value.TYPE_DOUBLE: return InstructionConstants.OP_DCONST_0; - case Value.TYPE_REFERENCE: - case Value.TYPE_INSTRUCTION_OFFSET: return InstructionConstants.OP_ACONST_NULL; - } - - throw new IllegalArgumentException("No push opcode for computational type ["+computationalType+"]"); - } - - - /** - * Pops the given number of stack entries at or after the given offset. - * The instructions are marked as necessary. - */ - private void insertPopInstructions(int offset, - boolean replace, - boolean before, - int popCount) - { - // We can edit an instruction without marking it. - //markInstruction(offset); - - switch (popCount) - { - case 1: - { - // Replace or insert a single pop instruction. - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP); - - insertInstruction(offset, replace, before, popInstruction); - break; - } - case 2: - { - // Replace or insert a single pop2 instruction. - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP2); - - insertInstruction(offset, replace, before, popInstruction); - break; - } - default: - { - // Replace or insert the specified number of pop instructions. - Instruction[] popInstructions = - new Instruction[popCount / 2 + popCount % 2]; - - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP2); - - for (int index = 0; index < popCount / 2; index++) - { - popInstructions[index] = popInstruction; - } - - if (popCount % 2 == 1) - { - popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP); - - popInstructions[popCount / 2] = popInstruction; - } - - insertInstructions(offset, - replace, - before, - popInstruction, - popInstructions); - break; - } - } - } - - - /** - * Inserts or replaces the given instruction at the given offset. - */ - private void insertInstruction(int offset, - boolean replace, - boolean before, - Instruction instruction) - { - if (replace) - { - codeAttributeEditor.replaceInstruction(offset, instruction); - - if (extraAddedInstructionVisitor != null && - !instructionUsageMarker.isInstructionNecessary(offset)) - { - instruction.accept(null, null, null, offset, extraAddedInstructionVisitor); - } - } - else - { - if (before) - { - codeAttributeEditor.insertBeforeInstruction(offset, instruction); - } - else - { - codeAttributeEditor.insertAfterInstruction(offset, instruction); - } - - if (extraAddedInstructionVisitor != null) - { - instruction.accept(null, null, null, offset, extraAddedInstructionVisitor); - } - } - } - - - /** - * Inserts or replaces the given instruction at the given offset. - */ - private void insertInstructions(int offset, - boolean replace, - boolean before, - Instruction instruction, - Instruction[] instructions) - { - if (replace) - { - codeAttributeEditor.replaceInstruction(offset, instructions); - - if (extraAddedInstructionVisitor != null) - { - if (!instructionUsageMarker.isInstructionNecessary(offset)) - { - instruction.accept(null, null, null, offset, extraAddedInstructionVisitor); - } - - for (int index = 1; index < instructions.length; index++) - { - instructions[index].accept(null, null, null, offset, extraAddedInstructionVisitor); - } - } - } - else - { - if (before) - { - codeAttributeEditor.insertBeforeInstruction(offset, instructions); - } - else - { - codeAttributeEditor.insertAfterInstruction(offset, instructions); - } - - for (int index = 0; index < instructions.length; index++) - { - if (extraAddedInstructionVisitor != null) - { - instructions[index].accept(null, null, null, offset, extraAddedInstructionVisitor); - } - } - } - } - - - /** - * Replaces the instruction at a given offset by a static invocation. - */ - private void replaceByStaticInvocation(Clazz clazz, - int offset, - ConstantInstruction constantInstruction) - { - // Remember the replacement instruction. - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, - constantInstruction.constantIndex); - - if (DEBUG) System.out.println(" Replacing by static invocation "+constantInstruction.toString(offset)+" -> "+replacementInstruction.toString()); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - } - - - /** - * Replaces the given instruction by an infinite loop. - */ - private void replaceByInfiniteLoop(Clazz clazz, - int offset) - { - if (DEBUG) System.out.println(" Inserting infinite loop at ["+offset+"]"); - - // We can edit an instruction without marking it. - //markInstruction(offset); - - // Replace the instruction by an infinite loop. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO, 0); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/EvaluationSimplifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/EvaluationSimplifier.java deleted file mode 100644 index 14ca598b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/EvaluationSimplifier.java +++ /dev/null @@ -1,1648 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassPrinter; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.info.SideEffectInstructionChecker; - -import java.util.Arrays; - -/** - * This AttributeVisitor simplifies the code attributes that it visits, based - * on partial evaluation. - * - * @author Eric Lafortune - */ -public class EvaluationSimplifier -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor -{ - private static final int POS_ZERO_FLOAT_BITS = Float.floatToIntBits(0.0f); - private static final long POS_ZERO_DOUBLE_BITS = Double.doubleToLongBits(0.0); - - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("es") != null; - //*/ - - private final InstructionVisitor extraInstructionVisitor; - - private final PartialEvaluator partialEvaluator; - private final SideEffectInstructionChecker sideEffectInstructionChecker = new SideEffectInstructionChecker(true, true); - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(true, true); - - - /** - * Creates a new EvaluationSimplifier. - */ - public EvaluationSimplifier() - { - this(new PartialEvaluator(), null); - } - - - /** - * Creates a new EvaluationSimplifier. - * @param partialEvaluator the partial evaluator that will - * execute the code and provide - * information about the results. - * @param extraInstructionVisitor an optional extra visitor for all - * simplified instructions. - */ - public EvaluationSimplifier(PartialEvaluator partialEvaluator, - InstructionVisitor extraInstructionVisitor) - { - this.partialEvaluator = partialEvaluator; - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for AttributeVisitor. - - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // TODO: Remove this when the evaluation simplifier has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while simplifying instructions after partial evaluation:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - System.err.println("Not optimizing this method"); - - if (DEBUG) - { - method.accept(clazz, new ClassPrinter()); - - throw ex; - } - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println(); - System.out.println("EvaluationSimplifier ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - } - - // Evaluate the method. - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - - int codeLength = codeAttribute.u4codeLength; - - // Reset the code changes. - codeAttributeEditor.reset(codeLength); - - // Replace any instructions that can be simplified. - for (int offset = 0; offset < codeLength; offset++) - { - if (partialEvaluator.isTraced(offset)) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - - instruction.accept(clazz, method, codeAttribute, offset, this); - } - } - - // Apply all accumulated changes to the code. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_IDIV: - case InstructionConstants.OP_IREM: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceIntegerPushInstruction(clazz, offset, simpleInstruction); - } - else if (isDivisionByZero(offset, Value.TYPE_INTEGER)) - { - // In case we detected a certain division by zero, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/ArithmeticException"); - } - break; - - case InstructionConstants.OP_LDIV: - case InstructionConstants.OP_LREM: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceLongPushInstruction(clazz, offset, simpleInstruction); - } - else if (isDivisionByZero(offset, Value.TYPE_LONG)) - { - // In case we detected a certain division by zero, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/ArithmeticException"); - } - break; - - case InstructionConstants.OP_FDIV: - case InstructionConstants.OP_FREM: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceFloatPushInstruction(clazz, offset, simpleInstruction); - } - else if (isDivisionByZero(offset, Value.TYPE_FLOAT)) - { - // In case we detected a certain division by zero, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/ArithmeticException"); - } - break; - - case InstructionConstants.OP_DDIV: - case InstructionConstants.OP_DREM: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceDoublePushInstruction(clazz, offset, simpleInstruction); - } - else if (isDivisionByZero(offset, Value.TYPE_DOUBLE)) - { - // In case we detected a certain division by zero, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/ArithmeticException"); - } - break; - - case InstructionConstants.OP_IALOAD: - case InstructionConstants.OP_BALOAD: - case InstructionConstants.OP_CALOAD: - case InstructionConstants.OP_SALOAD: - case InstructionConstants.OP_ARRAYLENGTH: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceIntegerPushInstruction(clazz, offset, simpleInstruction); - } - else if (isNullReference(offset, simpleInstruction.stackPopCount(clazz) - 1)) - { - // In case we detected a certain access to a null array, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/NullPointerException"); - } - break; - - case InstructionConstants.OP_IADD: - case InstructionConstants.OP_ISUB: - case InstructionConstants.OP_IMUL: - case InstructionConstants.OP_INEG: - case InstructionConstants.OP_ISHL: - case InstructionConstants.OP_ISHR: - case InstructionConstants.OP_IUSHR: - case InstructionConstants.OP_IAND: - case InstructionConstants.OP_IOR: - case InstructionConstants.OP_IXOR: - case InstructionConstants.OP_L2I: - case InstructionConstants.OP_F2I: - case InstructionConstants.OP_D2I: - case InstructionConstants.OP_I2B: - case InstructionConstants.OP_I2C: - case InstructionConstants.OP_I2S: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceIntegerPushInstruction(clazz, offset, simpleInstruction); - } - break; - - case InstructionConstants.OP_LALOAD: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceLongPushInstruction(clazz, offset, simpleInstruction); - } - else if (isNullReference(offset, simpleInstruction.stackPopCount(clazz) - 1)) - { - // In case we detected a certain access to a null array, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/NullPointerException"); - } - break; - - case InstructionConstants.OP_LADD: - case InstructionConstants.OP_LSUB: - case InstructionConstants.OP_LMUL: - case InstructionConstants.OP_LNEG: - case InstructionConstants.OP_LSHL: - case InstructionConstants.OP_LSHR: - case InstructionConstants.OP_LUSHR: - case InstructionConstants.OP_LAND: - case InstructionConstants.OP_LOR: - case InstructionConstants.OP_LXOR: - case InstructionConstants.OP_I2L: - case InstructionConstants.OP_F2L: - case InstructionConstants.OP_D2L: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceLongPushInstruction(clazz, offset, simpleInstruction); - } - break; - - case InstructionConstants.OP_FALOAD: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceFloatPushInstruction(clazz, offset, simpleInstruction); - } - else if (isNullReference(offset, simpleInstruction.stackPopCount(clazz) - 1)) - { - // In case we detected a certain access to a null array, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/NullPointerException"); - } - break; - - case InstructionConstants.OP_FADD: - case InstructionConstants.OP_FSUB: - case InstructionConstants.OP_FMUL: - case InstructionConstants.OP_FNEG: - case InstructionConstants.OP_I2F: - case InstructionConstants.OP_L2F: - case InstructionConstants.OP_D2F: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceFloatPushInstruction(clazz, offset, simpleInstruction); - } - break; - - case InstructionConstants.OP_DALOAD: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceDoublePushInstruction(clazz, offset, simpleInstruction); - } - else if (isNullReference(offset, simpleInstruction.stackPopCount(clazz) - 1)) - { - // In case we detected a certain access to a null array, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/NullPointerException"); - } - break; - - case InstructionConstants.OP_DADD: - case InstructionConstants.OP_DSUB: - case InstructionConstants.OP_DMUL: - case InstructionConstants.OP_DNEG: - case InstructionConstants.OP_I2D: - case InstructionConstants.OP_L2D: - case InstructionConstants.OP_F2D: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceDoublePushInstruction(clazz, offset, simpleInstruction); - } - break; - - case InstructionConstants.OP_AALOAD: - if (!sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - simpleInstruction)) - { - replaceReferencePushInstruction(clazz, offset, simpleInstruction); - } - else if (isNullReference(offset, simpleInstruction.stackPopCount(clazz) - 1)) - { - // In case we detected a certain access to a null array, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/NullPointerException"); - } - break; - - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - case InstructionConstants.OP_LASTORE: - case InstructionConstants.OP_FASTORE: - case InstructionConstants.OP_DASTORE: - case InstructionConstants.OP_AASTORE: - if (SideEffectInstructionChecker.OPTIMIZE_CONSERVATIVELY && - isNullReference(offset, simpleInstruction.stackPopCount(clazz) - 1)) - { - // In case we detected a certain access to a null array, and OPTIMIZE.CONSERVATIVELY - // is enabled, replace the instruction by the explicit exception. - replaceByException(clazz, offset, simpleInstruction, "java/lang/NullPointerException"); - } - break; - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - int variableIndex = variableInstruction.variableIndex; - - switch (variableInstruction.opcode) - { - case InstructionConstants.OP_ILOAD: - case InstructionConstants.OP_ILOAD_0: - case InstructionConstants.OP_ILOAD_1: - case InstructionConstants.OP_ILOAD_2: - case InstructionConstants.OP_ILOAD_3: - replaceIntegerPushInstruction(clazz, offset, variableInstruction, variableIndex); - break; - - case InstructionConstants.OP_LLOAD: - case InstructionConstants.OP_LLOAD_0: - case InstructionConstants.OP_LLOAD_1: - case InstructionConstants.OP_LLOAD_2: - case InstructionConstants.OP_LLOAD_3: - replaceLongPushInstruction(clazz, offset, variableInstruction, variableIndex); - break; - - case InstructionConstants.OP_FLOAD: - case InstructionConstants.OP_FLOAD_0: - case InstructionConstants.OP_FLOAD_1: - case InstructionConstants.OP_FLOAD_2: - case InstructionConstants.OP_FLOAD_3: - replaceFloatPushInstruction(clazz, offset, variableInstruction, variableIndex); - break; - - case InstructionConstants.OP_DLOAD: - case InstructionConstants.OP_DLOAD_0: - case InstructionConstants.OP_DLOAD_1: - case InstructionConstants.OP_DLOAD_2: - case InstructionConstants.OP_DLOAD_3: - replaceDoublePushInstruction(clazz, offset, variableInstruction, variableIndex); - break; - - case InstructionConstants.OP_ALOAD: - case InstructionConstants.OP_ALOAD_0: - case InstructionConstants.OP_ALOAD_1: - case InstructionConstants.OP_ALOAD_2: - case InstructionConstants.OP_ALOAD_3: - replaceReferencePushInstruction(clazz, offset, variableInstruction); - break; - - case InstructionConstants.OP_ASTORE: - case InstructionConstants.OP_ASTORE_0: - case InstructionConstants.OP_ASTORE_1: - case InstructionConstants.OP_ASTORE_2: - case InstructionConstants.OP_ASTORE_3: - deleteReferencePopInstruction(clazz, offset, variableInstruction); - break; - - case InstructionConstants.OP_RET: - replaceBranchInstruction(clazz, offset, variableInstruction); - break; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKEINTERFACE: - if (SideEffectInstructionChecker.OPTIMIZE_CONSERVATIVELY && - isNullReference(offset, constantInstruction.stackPopCount(clazz) - 1)) - { - // In case a method is invoked on a null reference - // replace the instruction with an explicit NullPointerException. - // This is mainly needed to counter obfuscated code that might - // use exceptions to change the control flow. This is especially - // problematic if it happens with methods that are explicitly marked - // as having no side-effect (e.g. String#length()) as they might get - // removed otherwise. - replaceByException(clazz, offset, constantInstruction, "java/lang/NullPointerException"); - break; - } - // intended fallthrough - - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_GETFIELD: - case InstructionConstants.OP_INVOKESTATIC: - if (constantInstruction.stackPushCount(clazz) > 0 && - !sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - constantInstruction)) - { - replaceAnyPushInstruction(clazz, offset, constantInstruction); - } - - break; - - case InstructionConstants.OP_CHECKCAST: - replaceReferencePushInstruction(clazz, offset, constantInstruction); - break; - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - switch (branchInstruction.opcode) - { - case InstructionConstants.OP_GOTO: - case InstructionConstants.OP_GOTO_W: - // Don't replace unconditional branches. - break; - - case InstructionConstants.OP_JSR: - case InstructionConstants.OP_JSR_W: - replaceJsrInstruction(clazz, offset, branchInstruction); - break; - - default: - replaceBranchInstruction(clazz, offset, branchInstruction); - break; - } - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - // First try to simplify it to a simple branch. - replaceBranchInstruction(clazz, offset, tableSwitchInstruction); - - // Otherwise try to simplify simple enum switches. - if (!codeAttributeEditor.isModified(offset)) - { - replaceSimpleEnumSwitchInstruction(clazz, - codeAttribute, - offset, - tableSwitchInstruction); - - // Otherwise make sure all branch targets are valid. - if (!codeAttributeEditor.isModified(offset)) - { - cleanUpSwitchInstruction(clazz, offset, tableSwitchInstruction); - - trimSwitchInstruction(clazz, offset, tableSwitchInstruction); - } - } - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - // First try to simplify it to a simple branch. - replaceBranchInstruction(clazz, offset, lookUpSwitchInstruction); - - // Otherwise try to simplify simple enum switches. - if (!codeAttributeEditor.isModified(offset)) - { - replaceSimpleEnumSwitchInstruction(clazz, - codeAttribute, - offset, - lookUpSwitchInstruction); - - // Otherwise make sure all branch targets are valid. - if (!codeAttributeEditor.isModified(offset)) - { - cleanUpSwitchInstruction(clazz, offset, lookUpSwitchInstruction); - - trimSwitchInstruction(clazz, offset, lookUpSwitchInstruction); - } - } - } - - - // Small utility methods. - - /** - * Replaces the push instruction at the given offset by a simpler push - * instruction, if possible. - */ - private void replaceAnyPushInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - Value pushedValue = partialEvaluator.getStackAfter(offset).getTop(0); - if (pushedValue.isParticular()) - { - switch (pushedValue.computationalType()) - { - case Value.TYPE_INTEGER: - replaceIntegerPushInstruction(clazz, offset, instruction); - break; - case Value.TYPE_LONG: - replaceLongPushInstruction(clazz, offset, instruction); - break; - case Value.TYPE_FLOAT: - replaceFloatPushInstruction(clazz, offset, instruction); - break; - case Value.TYPE_DOUBLE: - replaceDoublePushInstruction(clazz, offset, instruction); - break; - case Value.TYPE_REFERENCE: - replaceReferencePushInstruction(clazz, offset, instruction); - break; - } - } - } - - - /** - * Replaces the integer pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceIntegerPushInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - replaceIntegerPushInstruction(clazz, - offset, - instruction, - partialEvaluator.getVariablesBefore(offset).size()); - } - - - /** - * Replaces the integer pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceIntegerPushInstruction(Clazz clazz, - int offset, - Instruction instruction, - int maxVariableIndex) - { - Value pushedValue = partialEvaluator.getStackAfter(offset).getTop(0); - if (pushedValue.isParticular()) - { - // Push a constant instead. - int value = pushedValue.integerValue().value(); - if ((short)value == value) - { - replaceConstantPushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_SIPUSH, - value); - } - else - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_LDC, - constantPoolEditor.addIntegerConstant(value)); - - replaceInstruction(clazz, offset, instruction, replacementInstruction); - } - } - else if (pushedValue.isSpecific()) - { - // Load an equivalent lower-numbered variable instead, if any. - TracedVariables variables = partialEvaluator.getVariablesBefore(offset); - for (int variableIndex = 0; variableIndex < maxVariableIndex; variableIndex++) - { - if (pushedValue.equals(variables.load(variableIndex))) - { - replaceVariablePushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_ILOAD, - variableIndex); - break; - } - } - } - } - - - /** - * Replaces the long pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceLongPushInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - replaceLongPushInstruction(clazz, - offset, - instruction, - partialEvaluator.getVariablesBefore(offset).size()); - } - - - /** - * Replaces the long pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceLongPushInstruction(Clazz clazz, - int offset, - Instruction instruction, - int maxVariableIndex) - { - Value pushedValue = partialEvaluator.getStackAfter(offset).getTop(0); - if (pushedValue.isParticular()) - { - // Push a constant instead. - long value = pushedValue.longValue().value(); - if (value == 0L || - value == 1L) - { - replaceConstantPushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_LCONST_0, - (int)value); - } - else - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_LDC2_W, - constantPoolEditor.addLongConstant(value)); - - replaceInstruction(clazz, offset, instruction, replacementInstruction); - } - } - else if (pushedValue.isSpecific()) - { - // Load an equivalent lower-numbered variable instead, if any. - TracedVariables variables = partialEvaluator.getVariablesBefore(offset); - for (int variableIndex = 0; variableIndex < maxVariableIndex; variableIndex++) - { - // Note that we have to check the second part as well. - if (pushedValue.equals(variables.load(variableIndex)) && - variables.load(variableIndex + 1) != null && - variables.load(variableIndex + 1).computationalType() == Value.TYPE_TOP) - { - replaceVariablePushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_LLOAD, - variableIndex); - } - } - } - } - - - /** - * Replaces the float pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceFloatPushInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - replaceFloatPushInstruction(clazz, - offset, - instruction, - partialEvaluator.getVariablesBefore(offset).size()); - } - - - /** - * Replaces the float pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceFloatPushInstruction(Clazz clazz, - int offset, - Instruction instruction, - int maxVariableIndex) - { - Value pushedValue = partialEvaluator.getStackAfter(offset).getTop(0); - if (pushedValue.isParticular()) - { - // Push a constant instead. - // Make sure to distinguish between +0.0 and -0.0. - float value = pushedValue.floatValue().value(); - if (value == 0.0f && Float.floatToIntBits(value) == POS_ZERO_FLOAT_BITS || - value == 1.0f || - value == 2.0f) - { - replaceConstantPushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_FCONST_0, - (int)value); - } - else - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_LDC, - constantPoolEditor.addFloatConstant(value)); - - replaceInstruction(clazz, offset, instruction, replacementInstruction); - } - } - else if (pushedValue.isSpecific()) - { - // Load an equivalent lower-numbered variable instead, if any. - TracedVariables variables = partialEvaluator.getVariablesBefore(offset); - for (int variableIndex = 0; variableIndex < maxVariableIndex; variableIndex++) - { - if (pushedValue.equals(variables.load(variableIndex))) - { - replaceVariablePushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_FLOAD, - variableIndex); - } - } - } - } - - - /** - * Replaces the double pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceDoublePushInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - replaceDoublePushInstruction(clazz, - offset, - instruction, - partialEvaluator.getVariablesBefore(offset).size()); - } - - - /** - * Replaces the double pushing instruction at the given offset by a simpler - * push instruction, if possible. - */ - private void replaceDoublePushInstruction(Clazz clazz, - int offset, - Instruction instruction, - int maxVariableIndex) - { - Value pushedValue = partialEvaluator.getStackAfter(offset).getTop(0); - if (pushedValue.isParticular()) - { - // Push a constant instead. - // Make sure to distinguish between +0.0 and -0.0. - double value = pushedValue.doubleValue().value(); - if (value == 0.0 && Double.doubleToLongBits(value) == POS_ZERO_DOUBLE_BITS || - value == 1.0) - { - replaceConstantPushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_DCONST_0, - (int)value); - } - else - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - Instruction replacementInstruction = - new ConstantInstruction(InstructionConstants.OP_LDC2_W, - constantPoolEditor.addDoubleConstant(value)); - - replaceInstruction(clazz, offset, instruction, replacementInstruction); - } - } - else if (pushedValue.isSpecific()) - { - // Load an equivalent lower-numbered variable instead, if any. - TracedVariables variables = partialEvaluator.getVariablesBefore(offset); - for (int variableIndex = 0; variableIndex < maxVariableIndex; variableIndex++) - { - // Note that we have to check the second part as well. - if (pushedValue.equals(variables.load(variableIndex)) && - variables.load(variableIndex + 1) != null && - variables.load(variableIndex + 1).computationalType() == Value.TYPE_TOP) - { - replaceVariablePushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_DLOAD, - variableIndex); - } - } - } - } - - - /** - * Replaces the reference pushing instruction at the given offset by a - * simpler push instruction, if possible. - */ - private void replaceReferencePushInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - ReferenceValue pushedValue = partialEvaluator.getStackAfter(offset).getTop(0).referenceValue(); - if (pushedValue.isNull() == Value.ALWAYS) - { - // A reference value can only be specific if it is null. - replaceConstantPushInstruction(clazz, - offset, - instruction, - InstructionConstants.OP_ACONST_NULL, - 0); - } - } - - - /** - * Replaces the instruction at a given offset by a given push instruction - * of a constant. - */ - private void replaceConstantPushInstruction(Clazz clazz, - int offset, - Instruction instruction, - byte replacementOpcode, - int value) - { - Instruction replacementInstruction = - new SimpleInstruction(replacementOpcode, value); - - replaceInstruction(clazz, offset, instruction, replacementInstruction); - } - - - /** - * Replaces the instruction at a given offset by a given push instruction - * of a variable. - */ - private void replaceVariablePushInstruction(Clazz clazz, - int offset, - Instruction instruction, - byte replacementOpcode, - int variableIndex) - { - Instruction replacementInstruction = - new VariableInstruction(replacementOpcode, variableIndex); - - replaceInstruction(clazz, offset, instruction, replacementInstruction); - } - - - /** - * Replaces the given 'jsr' instruction by a simpler branch instruction, - * if it jumps to a subroutine that doesn't return or a subroutine that - * is only called from one place. - */ - private void replaceJsrInstruction(Clazz clazz, - int offset, - BranchInstruction branchInstruction) - { - // Is the subroutine ever returning? - int subroutineStart = offset + branchInstruction.branchOffset; - if (!partialEvaluator.isSubroutineReturning(subroutineStart) || - partialEvaluator.branchOrigins(subroutineStart).instructionOffsetCount() == 1) - { - // All 'jsr' instructions to this subroutine can be replaced - // by unconditional branch instructions. - replaceBranchInstruction(clazz, offset, branchInstruction); - } - else if (!partialEvaluator.isTraced(offset + branchInstruction.length(offset))) - { - // We have to make sure the instruction after this 'jsr' - // instruction is valid, even if it is never reached. - replaceByInfiniteLoop(clazz, offset + branchInstruction.length(offset), branchInstruction); - } - } - - - /** - * Deletes the reference popping instruction at the given offset, if - * it is at the start of a subroutine that doesn't return or a subroutine - * that is only called from one place. - */ - private void deleteReferencePopInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - if (partialEvaluator.isSubroutineStart(offset) && - (!partialEvaluator.isSubroutineReturning(offset) || - partialEvaluator.branchOrigins(offset).instructionOffsetCount() == 1)) - { - if (DEBUG) System.out.println(" Deleting store of subroutine return address "+instruction.toString(offset)); - - // A reference value can only be specific if it is null. - codeAttributeEditor.deleteInstruction(offset); - } - } - - - /** - * Deletes the given branch instruction, or replaces it by a simpler branch - * instruction, if possible. - */ - private void replaceBranchInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - InstructionOffsetValue branchTargets = partialEvaluator.branchTargets(offset); - - // Is there exactly one branch target (not from a goto or jsr)? - if (branchTargets != null && - branchTargets.instructionOffsetCount() == 1) - { - // Is it branching to the next instruction? - int branchOffset = branchTargets.instructionOffset(0) - offset; - if (branchOffset == instruction.length(offset)) - { - if (DEBUG) System.out.println(" Ignoring zero branch instruction at ["+offset+"]"); - } - else - { - // Replace the branch instruction by a simple branch instruction. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO, - branchOffset); - - replaceInstruction(clazz, offset, instruction, replacementInstruction); - } - } - } - - - /** - * Replaces the given table switch instruction, if it is based on the value - * of a fixed array. This is typical for switches on simple enums. - */ - private void replaceSimpleEnumSwitchInstruction(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - TableSwitchInstruction tableSwitchInstruction) - { - // Check if the switch instruction is consuming a single value loaded - // from a fully specified array. - InstructionOffsetValue producerOffsets = - partialEvaluator.getStackBefore(offset).getTopProducerValue(0).instructionOffsetValue(); - - if (producerOffsets.instructionOffsetCount() == 1) - { - int producerOffset = producerOffsets.instructionOffset(0); - - if (codeAttribute.code[producerOffset] == InstructionConstants.OP_IALOAD && - !codeAttributeEditor.isModified(producerOffset)) - { - ReferenceValue referenceValue = - partialEvaluator.getStackBefore(producerOffset).getTop(1).referenceValue(); - - if (referenceValue.isParticular()) - { - // Simplify the entire construct. - replaceSimpleEnumSwitchInstruction(clazz, - codeAttribute, - producerOffset, - offset, - tableSwitchInstruction, - referenceValue); - } - } - } - } - - - /** - * Replaces the given table switch instruction that is based on a value of - * the given fixed array. - */ - private void replaceSimpleEnumSwitchInstruction(Clazz clazz, - CodeAttribute codeAttribute, - int loadOffset, - int switchOffset, - TableSwitchInstruction tableSwitchInstruction, - ReferenceValue mappingValue) - { - ValueFactory valueFactory = new ParticularValueFactory(); - - // Transform the jump offsets. - int[] jumpOffsets = tableSwitchInstruction.jumpOffsets; - int[] newJumpOffsets = new int[mappingValue.arrayLength(valueFactory).value()]; - - for (int index = 0; index < newJumpOffsets.length; index++) - { - int switchCase = - mappingValue.integerArrayLoad(valueFactory.createIntegerValue(index), - valueFactory).value(); - - newJumpOffsets[index] = - switchCase >= tableSwitchInstruction.lowCase && - switchCase <= tableSwitchInstruction.highCase ? - jumpOffsets[switchCase - tableSwitchInstruction.lowCase] : - tableSwitchInstruction.defaultOffset; - } - - // Update the instruction. - tableSwitchInstruction.lowCase = 0; - tableSwitchInstruction.highCase = newJumpOffsets.length - 1; - tableSwitchInstruction.jumpOffsets = newJumpOffsets; - - // Replace the original one with the new version. - replaceSimpleEnumSwitchInstruction(clazz, - loadOffset, - switchOffset, - tableSwitchInstruction); - - cleanUpSwitchInstruction(clazz, switchOffset, tableSwitchInstruction); - - trimSwitchInstruction(clazz, switchOffset, tableSwitchInstruction); - } - - - /** - * Replaces the given look up switch instruction, if it is based on the - * value of a fixed array. This is typical for switches on simple enums. - */ - private void replaceSimpleEnumSwitchInstruction(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - LookUpSwitchInstruction lookupSwitchInstruction) - { - // Check if the switch instruction is consuming a single value loaded - // from a fully specified array. - InstructionOffsetValue producerOffsets = - partialEvaluator.getStackBefore(offset).getTopProducerValue(0).instructionOffsetValue(); - - if (producerOffsets.instructionOffsetCount() == 1) - { - int producerOffset = producerOffsets.instructionOffset(0); - - if (codeAttribute.code[producerOffset] == InstructionConstants.OP_IALOAD && - !codeAttributeEditor.isModified(producerOffset)) - { - ReferenceValue referenceValue = - partialEvaluator.getStackBefore(producerOffset).getTop(1).referenceValue(); - - if (referenceValue.isParticular()) - { - // Simplify the entire construct. - replaceSimpleEnumSwitchInstruction(clazz, - codeAttribute, - producerOffset, - offset, - lookupSwitchInstruction, - referenceValue); - } - } - } - } - - - /** - * Replaces the given look up switch instruction that is based on a value of - * the given fixed array. This is typical for switches on simple enums. - */ - private void replaceSimpleEnumSwitchInstruction(Clazz clazz, - CodeAttribute codeAttribute, - int loadOffset, - int switchOffset, - LookUpSwitchInstruction lookupSwitchInstruction, - ReferenceValue mappingValue) - { - ValueFactory valueFactory = new ParticularValueFactory(); - - // Transform the jump offsets. - int[] cases = lookupSwitchInstruction.cases; - int[] jumpOffsets = lookupSwitchInstruction.jumpOffsets; - int[] newJumpOffsets = new int[mappingValue.arrayLength(valueFactory).value()]; - - for (int index = 0; index < newJumpOffsets.length; index++) - { - int switchCase = - mappingValue.integerArrayLoad(valueFactory.createIntegerValue(index), - valueFactory).value(); - - int caseIndex = Arrays.binarySearch(cases, switchCase); - - newJumpOffsets[index] = caseIndex >= 0 ? - jumpOffsets[caseIndex] : - lookupSwitchInstruction.defaultOffset; - } - - // Replace the original lookup switch with a table switch. - TableSwitchInstruction replacementSwitchInstruction = - new TableSwitchInstruction(InstructionConstants.OP_TABLESWITCH, - lookupSwitchInstruction.defaultOffset, - 0, - newJumpOffsets.length - 1, - newJumpOffsets); - - replaceSimpleEnumSwitchInstruction(clazz, - loadOffset, - switchOffset, - replacementSwitchInstruction); - - cleanUpSwitchInstruction(clazz, switchOffset, replacementSwitchInstruction); - - trimSwitchInstruction(clazz, switchOffset, replacementSwitchInstruction); - } - - - /** - * Makes sure all branch targets of the given switch instruction are valid. - */ - private void cleanUpSwitchInstruction(Clazz clazz, - int offset, - SwitchInstruction switchInstruction) - { - // Get the actual branch targets. - InstructionOffsetValue branchTargets = partialEvaluator.branchTargets(offset); - - // Get an offset that can serve as a valid default offset. - int defaultOffset = - branchTargets.instructionOffset(branchTargets.instructionOffsetCount()-1) - - offset; - - Instruction replacementInstruction = null; - - // Check the jump offsets. - int[] jumpOffsets = switchInstruction.jumpOffsets; - for (int index = 0; index < jumpOffsets.length; index++) - { - if (!branchTargets.contains(offset + jumpOffsets[index])) - { - // Replace the unused offset. - jumpOffsets[index] = defaultOffset; - - // Remember to replace the instruction. - replacementInstruction = switchInstruction; - } - } - - // Check the default offset. - if (!branchTargets.contains(offset + switchInstruction.defaultOffset)) - { - // Replace the unused offset. - switchInstruction.defaultOffset = defaultOffset; - - // Remember to replace the instruction. - replacementInstruction = switchInstruction; - } - - if (replacementInstruction != null) - { - replaceInstruction(clazz, offset, switchInstruction, replacementInstruction); - } - } - - - /** - * Trims redundant offsets from the given switch instruction. - */ - private void trimSwitchInstruction(Clazz clazz, - int offset, - TableSwitchInstruction tableSwitchInstruction) - { - // Get an offset that can serve as a valid default offset. - int defaultOffset = tableSwitchInstruction.defaultOffset; - int[] jumpOffsets = tableSwitchInstruction.jumpOffsets; - int length = jumpOffsets.length; - - // Find the lowest index with a non-default jump offset. - int lowIndex = 0; - while (lowIndex < length && - jumpOffsets[lowIndex] == defaultOffset) - { - lowIndex++; - } - - // Find the highest index with a non-default jump offset. - int highIndex = length - 1; - while (highIndex >= 0 && - jumpOffsets[highIndex] == defaultOffset) - { - highIndex--; - } - - // Can we use a shorter array? - int newLength = highIndex - lowIndex + 1; - if (newLength < length) - { - if (newLength <= 0) - { - // Replace the switch instruction by a simple branch instruction. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO, - defaultOffset); - - replaceInstruction(clazz, offset, tableSwitchInstruction, - replacementInstruction); - } - else - { - // Trim the array. - int[] newJumpOffsets = new int[newLength]; - - System.arraycopy(jumpOffsets, lowIndex, newJumpOffsets, 0, newLength); - - tableSwitchInstruction.jumpOffsets = newJumpOffsets; - tableSwitchInstruction.lowCase += lowIndex; - tableSwitchInstruction.highCase -= length - newLength - lowIndex; - - replaceInstruction(clazz, offset, tableSwitchInstruction, - tableSwitchInstruction); - } - } - } - - - /** - * Trims redundant offsets from the given switch instruction. - */ - private void trimSwitchInstruction(Clazz clazz, - int offset, - LookUpSwitchInstruction lookUpSwitchInstruction) - { - // Get an offset that can serve as a valid default offset. - int defaultOffset = lookUpSwitchInstruction.defaultOffset; - int[] jumpOffsets = lookUpSwitchInstruction.jumpOffsets; - int length = jumpOffsets.length; - int newLength = length; - - // Count the default jump offsets. - for (int index = 0; index < length; index++) - { - if (jumpOffsets[index] == defaultOffset) - { - newLength--; - } - } - - // Can we use shorter arrays? - if (newLength < length) - { - if (newLength <= 0) - { - // Replace the switch instruction by a simple branch instruction. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO, - defaultOffset); - - replaceInstruction(clazz, offset, lookUpSwitchInstruction, - replacementInstruction); - } - else - { - // Remove redundant entries from the arrays. - int[] cases = lookUpSwitchInstruction.cases; - int[] newJumpOffsets = new int[newLength]; - int[] newCases = new int[newLength]; - - int newIndex = 0; - - for (int index = 0; index < length; index++) - { - if (jumpOffsets[index] != defaultOffset) - { - newJumpOffsets[newIndex] = jumpOffsets[index]; - newCases[newIndex++] = cases[index]; - } - } - - lookUpSwitchInstruction.jumpOffsets = newJumpOffsets; - lookUpSwitchInstruction.cases = newCases; - - replaceInstruction(clazz, offset, lookUpSwitchInstruction, - lookUpSwitchInstruction); - } - } - } - - - /** - * Checks whether if the current top value on the stack is a divisor - * leading to a certain division by zero for the given computation type. - */ - private boolean isDivisionByZero(int offset, int computationType) - { - TracedStack tracedStack = partialEvaluator.getStackBefore(offset); - Value divisor = tracedStack.getTop(0); - switch (computationType) - { - case Value.TYPE_INTEGER: - return divisor.computationalType() == Value.TYPE_INTEGER && - divisor.isParticular() && - divisor.integerValue().value() == 0; - - case Value.TYPE_LONG: - return divisor.computationalType() == Value.TYPE_LONG && - divisor.isParticular() && - divisor.longValue().value() == 0L; - - case Value.TYPE_FLOAT: - return divisor.computationalType() == Value.TYPE_FLOAT && - divisor.isParticular() && - divisor.floatValue().value() == 0f; - - case Value.TYPE_DOUBLE: - return divisor.computationalType() == Value.TYPE_DOUBLE && - divisor.isParticular() && - divisor.doubleValue().value() == 0d; - - default: - return false; - } - } - - - /** - * Checks whether the value at the given stack entry index is always a null reference. - */ - private boolean isNullReference(int offset, int popStackEntryIndex) - { - TracedStack tracedStack = partialEvaluator.getStackBefore(offset); - Value objectRef = tracedStack.getTop(popStackEntryIndex); - - return objectRef.computationalType() == Value.TYPE_REFERENCE && - objectRef.isParticular() && - objectRef.referenceValue().isNull() == Value.ALWAYS; - } - - - /** - * Replaces the given instruction by an explicit exception. - */ - private void replaceByException(Clazz clazz, - int offset, - Instruction instruction, - String exceptionClass) - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - // Replace the instruction by an infinite loop. - Instruction[] replacementInstructions = new Instruction[] - { - new ConstantInstruction(InstructionConstants.OP_NEW, - constantPoolEditor.addClassConstant(exceptionClass, null)), - new SimpleInstruction(InstructionConstants.OP_DUP), - new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, - constantPoolEditor.addMethodrefConstant(exceptionClass, "", "()V", null, null)), - new SimpleInstruction(InstructionConstants.OP_ATHROW) - }; - - if (DEBUG) System.out.println(" Replacing instruction by explicit exception "+exceptionClass); - - codeAttributeEditor.replaceInstruction(offset, replacementInstructions); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - // Note: we're not passing the right arguments for now, knowing that - // they aren't used anyway. - instruction.accept(clazz, - null, - null, - offset, - extraInstructionVisitor); - } - } - - - /** - * Replaces the given instruction by an infinite loop. - */ - private void replaceByInfiniteLoop(Clazz clazz, - int offset, - Instruction instruction) - { - // Replace the instruction by an infinite loop. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO, 0); - - if (DEBUG) System.out.println(" Replacing unreachable instruction by infinite loop "+replacementInstruction.toString(offset)); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - // Note: we're not passing the right arguments for now, knowing that - // they aren't used anyway. - instruction.accept(clazz, - null, - null, - offset, - extraInstructionVisitor); - } - } - - - /** - * Replaces the instruction at a given offset by a given push instruction. - */ - private void replaceInstruction(Clazz clazz, - int offset, - Instruction instruction, - Instruction replacementInstruction) - { - // Pop unneeded stack entries if necessary. - int popCount = - instruction.stackPopCount(clazz) - - replacementInstruction.stackPopCount(clazz); - - insertPopInstructions(offset, popCount); - - if (DEBUG) System.out.println(" Replacing instruction "+instruction.toString(offset)+" -> "+replacementInstruction.toString()+(popCount == 0 ? "" : " ("+popCount+" pops)")); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - // Note: we're not passing the right arguments for now, knowing that - // they aren't used anyway. - instruction.accept(clazz, null, null, offset, extraInstructionVisitor); - } - } - - - /** - * Pops the given number of stack entries before the instruction at the - * given offset. - */ - private void insertPopInstructions(int offset, int popCount) - { - switch (popCount) - { - case 0: - { - break; - } - case 1: - { - // Insert a single pop instruction. - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP); - - codeAttributeEditor.insertBeforeInstruction(offset, - popInstruction); - break; - } - case 2: - { - // Insert a single pop2 instruction. - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP2); - - codeAttributeEditor.insertBeforeInstruction(offset, - popInstruction); - break; - } - default: - { - // Insert the specified number of pop instructions. - Instruction[] popInstructions = - new Instruction[popCount / 2 + popCount % 2]; - - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP2); - - for (int index = 0; index < popCount / 2; index++) - { - popInstructions[index] = popInstruction; - } - - if (popCount % 2 == 1) - { - popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP); - - popInstructions[popCount / 2] = popInstruction; - } - - codeAttributeEditor.insertBeforeInstruction(offset, - popInstructions); - break; - } - } - } - - - /** - * Replaces the simple enum switch instructions at a given offsets by a - * given replacement instruction. - */ - private void replaceSimpleEnumSwitchInstruction(Clazz clazz, - int loadOffset, - int switchOffset, - SwitchInstruction replacementSwitchInstruction) - { - if (DEBUG) System.out.println(" Replacing switch instruction at ["+switchOffset+"] -> ["+loadOffset+"] swap + pop, "+replacementSwitchInstruction.toString(switchOffset)+")"); - - // Remove the array load instruction. - codeAttributeEditor.replaceInstruction(loadOffset, new Instruction[] - { - new SimpleInstruction(InstructionConstants.OP_SWAP), - new SimpleInstruction(InstructionConstants.OP_POP), - }); - - // Replace the switch instruction. - codeAttributeEditor.replaceInstruction(switchOffset, replacementSwitchInstruction); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - // Note: we're not passing the right arguments for now, knowing that - // they aren't used anyway. - replacementSwitchInstruction.accept(clazz, - null, - null, - switchOffset, - extraInstructionVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/InitializationFinder.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/InitializationFinder.java deleted file mode 100644 index f2069942..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/InitializationFinder.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.instruction.InstructionFactory; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.evaluation.BasicInvocationUnit; -import proguard.evaluation.value.*; -import proguard.util.ArrayUtil; - -/** - * This AttributeVisitor links 'new' instructions and their corresponding - * initializers in the CodeAttribute objects that it visits. - * - * @author Eric Lafortune - */ -public class InitializationFinder -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("if") != null; - //*/ - - public static final int NONE = -1; - - private final PartialEvaluator partialEvaluator; - private final boolean runPartialEvaluator; - - private int superInitializationOffset; - private int[] initializationOffsets = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - private InstructionOffsetValue[] uninitializedOffsets = new InstructionOffsetValue[ClassConstants.TYPICAL_CODE_LENGTH]; - - - /** - * Creates a new InitializationFinder. - */ - public InitializationFinder() - { - this(new ReferenceTracingValueFactory(new BasicValueFactory())); - } - - - /** - * Creates a new InitializationFinder. This private constructor gets around - * the constraint that it's not allowed to add statements before calling - * 'this'. - */ - private InitializationFinder(ReferenceTracingValueFactory referenceTracingValueFactory) - { - this(new PartialEvaluator(referenceTracingValueFactory, - new ReferenceTracingInvocationUnit(new BasicInvocationUnit(referenceTracingValueFactory)), - true, - referenceTracingValueFactory), - true); - } - - - /** - * Creates a new InitializationFinder that will use the given partial - * evaluator. - * @param partialEvaluator the evaluator to be used for the analysis. - * @param runPartialEvaluator specifies whether to run this evaluator on - * every code attribute that is visited. - */ - public InitializationFinder(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator) - { - this.partialEvaluator = partialEvaluator; - this.runPartialEvaluator = runPartialEvaluator; - } - - - /** - * Returns whether the method is an instance initializer, in the - * CodeAttribute that was visited most recently. - */ - public boolean isInitializer() - { - return superInitializationOffset != NONE; - } - - - /** - * Returns the instruction offset at which this initializer is calling - * the "super" or "this" initializer method, or NONE if it is - * not an initializer. - */ - public int superInitializationOffset() - { - return superInitializationOffset; - } - - -// /** -// * Returns whether the instruction at the given offset is a 'new' -// * instruction. -// */ -// public boolean isNew(int offset) -// { -// return initializationOffsets[offset] != NONE; -// } -// -// -// /** -// * Returns the instruction offset at which the object instance that is -// * created at the given 'new' instruction offset is initialized, or -// * NONE if it is not being created. -// */ -// public int initializationOffset(int creationOffset) -// { -// return initializationOffsets[creationOffset]; -// } - - - /** - * Returns the 'new' instruction offset at which the object instance is - * created that is initialized at the given offset. - */ - public int creationOffset(int initializationOffset) - { - return creationOffsetValue(initializationOffset).instructionOffset(0); - } - - - /** - * Returns whether the specified stack entry is initialized. - */ - public boolean isInitializedBefore(int offset, int stackEntryIndexBottom) - { - InstructionOffsetValue creationOffsetValue = - creationOffsetValue(offset, stackEntryIndexBottom); - - return isInitializedBefore(offset, creationOffsetValue); - } - - - /** - * Returns whether the given creation offset is initialized before the given - * offset. - */ - public boolean isInitializedBefore(int offset, - InstructionOffsetValue creationOffsetValue) - { - return !uninitializedOffsets[offset].contains(creationOffsetValue.instructionOffset(0)); - } - - - /** - * Returns whether the instruction at the given offset is the special - * invocation of an instance initializer. - */ - public boolean isInitializer(int offset) - { - return partialEvaluator.isInitializer(offset); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - int codeLength = codeAttribute.u4codeLength; - - superInitializationOffset = NONE; - - // Make sure the global arrays are sufficiently large. - initializationOffsets = ArrayUtil.ensureArraySize(initializationOffsets, codeLength, NONE); - uninitializedOffsets = ArrayUtil.ensureArraySize(uninitializedOffsets,codeLength, null); - - // Evaluate the method. - if (runPartialEvaluator) - { - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - } - - // Loop over all instructions. This is sufficient, because the JVM - // specifications don't allow uninitialized instances on the stack or - // in variables when branching backward. JVMs without preverification - // and the Dalvik VM do allow it in practice. - InstructionOffsetValue currentUninitializedOffsets = method.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT) ? - new InstructionOffsetValue(InstructionOffsetValue.METHOD_PARAMETER) : - InstructionOffsetValue.EMPTY_VALUE; - - for (int offset = 0; offset < codeLength; offset++) - { - if (partialEvaluator.isTraced(offset)) - { - // Exception handlers start without uninitialized instances - // (on the stack or in variables). - if (partialEvaluator.isExceptionHandler(offset)) - { - currentUninitializedOffsets = InstructionOffsetValue.EMPTY_VALUE; - } - - // Check if the uninitialized creation offsets have been set - // before (because of a forward branch). - if (uninitializedOffsets[offset] != null) - { - // Continue using them. - currentUninitializedOffsets = uninitializedOffsets[offset]; - } - else - { - uninitializedOffsets[offset] = currentUninitializedOffsets; - } - - // Is it a 'new' instruction? - if (partialEvaluator.isCreation(offset)) - { - // Add its offset to the current list. - currentUninitializedOffsets = - currentUninitializedOffsets.add(offset); - } - // Is it an instance initialization? - else if (partialEvaluator.isInitializer(offset)) - { - // Remove its creation offset from the current list. - InstructionOffsetValue creationOffsetValue = - creationOffsetValue(offset); - - int creationOffset = - creationOffsetValue.instructionOffset(0); - - if (creationOffsetValue.isMethodParameter(0)) - { - // Remember the super initialization offset of the - // initializer method. - superInitializationOffset = offset; - } - else - { - // Remember the instance initialization for the 'new' - // instruction. - initializationOffsets[creationOffset] = offset; - } - - currentUninitializedOffsets = - currentUninitializedOffsets.remove(creationOffset); - } - - // Propagate the uninitialized creation offsets to the forward - // branch targets, if any. - InstructionOffsetValue branchTargets = - partialEvaluator.branchTargets(offset); - - if (branchTargets != null) - { - for (int branchIndex = 0; branchIndex < branchTargets.instructionOffsetCount(); branchIndex++) - { - int branchOffset = branchTargets.instructionOffset(branchIndex); - if (branchOffset > offset) - { - uninitializedOffsets[branchOffset] = currentUninitializedOffsets; - } - } - - currentUninitializedOffsets = InstructionOffsetValue.EMPTY_VALUE; - } - } - } - - if (DEBUG) - { - System.out.println(); - System.out.println("InitializationFinder: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - - for (int offset = 0; offset < codeLength; offset++) - { - if (partialEvaluator.isInstruction(offset)) - { - System.out.println((initializationOffsets[offset] >= 0 ? "i"+initializationOffsets[offset] : " ") + - (uninitializedOffsets[offset] != null && - uninitializedOffsets[offset].instructionOffsetCount() > 0 ? " u"+uninitializedOffsets[offset] : " ") + - (isInitializer(offset) ? " "+creationOffsetValue(offset) : " ") + " " + - InstructionFactory.create(codeAttribute.code, offset).toString(offset)); - } - } - } - } - - - // Small utility methods. - - /** - * Returns the 'new' instruction offset value (or method parameter) at - * which the object instance is created that is initialized at the given - * offset. - */ - private InstructionOffsetValue creationOffsetValue(int initializationOffset) - { - int stackEntryIndexBottom = - partialEvaluator.getStackAfter(initializationOffset).size(); - - return creationOffsetValue(initializationOffset, stackEntryIndexBottom); - } - - - /** - * Returns the 'new' instruction offset value (or method parameter) of - * the specified stack entry. - */ - private InstructionOffsetValue creationOffsetValue(int instructionOffset, - int stackEntryIndexBottom) - { - // Get the reference value of the new instance. - ReferenceValue newReferenceValue = - partialEvaluator.getStackBefore(instructionOffset).getBottom(stackEntryIndexBottom).referenceValue(); - - // It's a traced reference. - TracedReferenceValue tracedReferenceValue = - (TracedReferenceValue)newReferenceValue; - - // Get the trace value. - return tracedReferenceValue.getTraceValue().instructionOffsetValue(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/InstructionUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/InstructionUsageMarker.java deleted file mode 100644 index cb0fb1d3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/InstructionUsageMarker.java +++ /dev/null @@ -1,1777 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.TracedStack; -import proguard.evaluation.value.*; -import proguard.optimize.info.*; -import proguard.util.ArrayUtil; - -import java.util.*; - -/** - * This AttributeVisitor marks necessary instructions in the code attributes - * that it visits, based on partial evaluation. - * - * @author Eric Lafortune - */ -public class InstructionUsageMarker -extends SimplifiedVisitor -implements AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - private static final boolean DEBUG_RESULTS = false; - /*/ - private static boolean DEBUG = System.getProperty("ium") != null; - private static boolean DEBUG_RESULTS = DEBUG; - //*/ - - private final PartialEvaluator partialEvaluator; - private final boolean runPartialEvaluator; - private final PartialEvaluator simplePartialEvaluator = new PartialEvaluator(new TypedReferenceValueFactory()); - private final SideEffectInstructionChecker sideEffectInstructionChecker = new SideEffectInstructionChecker(true, true); - private final MyParameterUsageMarker parameterUsageMarker = new MyParameterUsageMarker(); - private final MyInitialUsageMarker initialUsageMarker = new MyInitialUsageMarker(); - private final MyProducerMarker producerMarker = new MyProducerMarker(); - private final MyVariableInitializationMarker variableInitializationMarker = new MyVariableInitializationMarker(); - private final MyStackConsistencyMarker stackConsistencyMarker = new MyStackConsistencyMarker(); - private final MyExtraPopInstructionMarker extraPopInstructionMarker = new MyExtraPopInstructionMarker(); - - private InstructionOffsetValue[] reverseDependencies = new InstructionOffsetValue[ClassConstants.TYPICAL_CODE_LENGTH]; - - private boolean[][] stacksNecessaryAfter = new boolean[ClassConstants.TYPICAL_CODE_LENGTH][ClassConstants.TYPICAL_STACK_SIZE]; - private boolean[][] stacksUnwantedBefore = new boolean[ClassConstants.TYPICAL_CODE_LENGTH][ClassConstants.TYPICAL_STACK_SIZE]; - private boolean[] instructionsNecessary = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - private boolean[] extraPushPopInstructionsNecessary = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - - private int maxMarkedOffset; - - - /** - * Creates a new InstructionUsageMarker. - */ - public InstructionUsageMarker() - { - this(new PartialEvaluator(), true); - } - - - /** - * Creates a new InstructionUsageMarker. - * @param partialEvaluator the evaluator to be used for the analysis. - * @param runPartialEvaluator specifies whether to run this evaluator on - * every code attribute that is visited. - */ - public InstructionUsageMarker(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator) - { - this.partialEvaluator = partialEvaluator; - this.runPartialEvaluator = runPartialEvaluator; - } - - - /** - * Returns whether the specified instruction was traced in the most - * recently analyzed code attribute. - */ - public boolean isTraced(int instructionOffset) - { - return partialEvaluator.isTraced(instructionOffset); - } - - - /** - * Returns a filtering version of the given instruction visitor that only - * visits traced instructions. - */ - public InstructionVisitor tracedInstructionFilter(InstructionVisitor instructionVisitor) - { - return partialEvaluator.tracedInstructionFilter(instructionVisitor); - } - - - /** - * Returns a filtering version of the given instruction visitor that only - * visits traced or untraced instructions. - */ - public InstructionVisitor tracedInstructionFilter(boolean traced, - InstructionVisitor instructionVisitor) - { - return partialEvaluator.tracedInstructionFilter(traced, instructionVisitor); - } - - - /** - * Returns whether the specified instruction is necessary in the most - * recently analyzed code attribute. - */ - public boolean isInstructionNecessary(int instructionOffset) - { - return instructionsNecessary[instructionOffset]; - } - - - /** - * Returns whether an extra push/pop instruction is required at the given - * offset in the most recently analyzed code attribute. - */ - public boolean isExtraPushPopInstructionNecessary(int instructionOffset) - { - return extraPushPopInstructionsNecessary[instructionOffset]; - } - - - /** - * Returns a filtering version of the given instruction visitor that only - * visits necessary instructions. - */ - public InstructionVisitor necessaryInstructionFilter(InstructionVisitor instructionVisitor) - { - return necessaryInstructionFilter(true, instructionVisitor); - } - - - /** - * Returns a filtering version of the given instruction visitor that only - * visits necessary or unnecessary instructions. - */ - public InstructionVisitor necessaryInstructionFilter(boolean necessary, - InstructionVisitor instructionVisitor) - { - return new MyNecessaryInstructionFilter(necessary, instructionVisitor); - } - - - /** - * Returns the stack before execution of the instruction at the given - * offset. - */ - public TracedStack getStackBefore(int instructionOffset) - { - return partialEvaluator.getStackBefore(instructionOffset); - } - - - /** - * Returns the stack after execution of the instruction at the given - * offset. - */ - public TracedStack getStackAfter(int instructionOffset) - { - return partialEvaluator.getStackAfter(instructionOffset); - } - - - /** - * Returns whether the specified stack entry before the given offset is - * unwanted, e.g. because it was intended as a method parameter that has - * been removed. - */ - public boolean isStackEntryUnwantedBefore(int instructionOffset, - int stackIndex) - { - return stacksUnwantedBefore[instructionOffset][stackIndex]; - } - - - /** - * Returns whether the stack specified entries before the given offset are - * present. - */ - public boolean isStackEntriesPresentBefore(int instructionOffset, - int stackIndex1, - int stackIndex2) - { - boolean present1 = isStackEntryPresentBefore(instructionOffset, stackIndex1); - boolean present2 = isStackEntryPresentBefore(instructionOffset, stackIndex2); - - //if (present1 ^ present2) - //{ - // throw new UnsupportedOperationException("Can't handle partial use of dup2 instructions"); - //} - - return present1 || present2; - } - - - /** - * Returns whether the specified stack entry before the given offset is - * present. - * @param instructionOffset the offset of the stack entry to be checked. - * @param stackIndex the index of the stack entry to be checked - * (counting from the bottom). - */ - public boolean isStackEntryPresentBefore(int instructionOffset, - int stackIndex) - { - TracedStack tracedStack = - partialEvaluator.getStackBefore(instructionOffset); - - InstructionOffsetValue producerOffsets = - tracedStack.getBottomProducerValue(stackIndex).instructionOffsetValue(); - - return isAnyStackEntryNecessaryAfter(producerOffsets, stackIndex); - } - - - /** - * Returns whether the stack specified entries after the given offset are - * necessary. - */ - public boolean isStackEntriesNecessaryAfter(int instructionOffset, - int stackIndex1, - int stackIndex2) - { - boolean present1 = isStackEntryNecessaryAfter(instructionOffset, stackIndex1); - boolean present2 = isStackEntryNecessaryAfter(instructionOffset, stackIndex2); - - //if (present1 ^ present2) - //{ - // throw new UnsupportedOperationException("Can't handle partial use of dup2 instructions"); - //} - - return present1 || present2; - } - - - /** - * Returns whether any of the stack entries after the given offsets are - * necessary. - * @param instructionOffsets the offsets of the stack entries to be checked. - * @param stackIndex the index of the stack entries to be checked - * (counting from the bottom). - */ - public boolean isAnyStackEntryNecessaryAfter(InstructionOffsetValue instructionOffsets, - int stackIndex) - { - int offsetCount = instructionOffsets.instructionOffsetCount(); - - for (int offsetIndex = 0; offsetIndex < offsetCount; offsetIndex++) - { - if (instructionOffsets.isExceptionHandler(offsetIndex) || - isStackEntryNecessaryAfter(instructionOffsets.instructionOffset(offsetIndex), stackIndex)) - { - return true; - } - } - - return false; - } - - - /** - * Returns whether the specified stack entry after the given offset is - * necessary. - * @param instructionOffset the offset of the stack entry to be checked. - * @param stackIndex the index of the stack entry to be checked - * (counting from the bottom). - */ - public boolean isStackEntryNecessaryAfter(int instructionOffset, - int stackIndex) - { - return - (instructionOffset & InstructionOffsetValue.EXCEPTION_HANDLER) != 0 || - stacksNecessaryAfter[instructionOffset][stackIndex]; - } - - - /** - * Returns the instruction offsets to which the given instruction offset - * branches in the most recently analyzed code attribute. - */ - public InstructionOffsetValue branchTargets(int instructionOffset) - { - return partialEvaluator.branchTargets(instructionOffset); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = DEBUG_RESULTS = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // TODO: Remove this when the instruction usage marker has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while marking instruction usage after partial evaluation:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - if (DEBUG) - { - method.accept(clazz, new ClassPrinter()); - } - - throw ex; - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG_RESULTS) - { - System.out.println(); - System.out.println("InstructionUsageMarker ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - } - - // Initialize the necessary arrays. - initializeNecessary(codeAttribute); - - // Evaluate the method. - if (runPartialEvaluator) - { - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - } - - // Evaluate the method the way the JVM verifier would do it. - simplePartialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - - int codeLength = codeAttribute.u4codeLength; - - maxMarkedOffset = -1; - - // Mark any unused method parameters on the stack. - if (DEBUG) System.out.println("Invocation simplification:"); - - codeAttribute.instructionsAccept(clazz, method, - partialEvaluator.tracedInstructionFilter(parameterUsageMarker)); - - - // Mark all essential instructions that have been encountered as used. - // Also mark infinite loops and instructions that can have side effects. - if (DEBUG) System.out.println("Usage initialization: "); - - codeAttribute.instructionsAccept(clazz, method, - partialEvaluator.tracedInstructionFilter(initialUsageMarker)); - - if (DEBUG) System.out.println(); - - - // Globally mark instructions and their produced variables and stack - // entries on which necessary instructions depend. - // Instead of doing this recursively, we loop across all instructions, - // starting at the highest previously unmarked instruction that has - // been been marked. - if (DEBUG) System.out.println("Usage marking:"); - - while (maxMarkedOffset >= 0) - { - int offset = maxMarkedOffset; - - maxMarkedOffset = offset - 1; - - if (partialEvaluator.isTraced(offset)) - { - if (isInstructionNecessary(offset)) - { - // Mark the stack/variable producers of this instruction/ - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - - instruction.accept(clazz, method, codeAttribute, offset, producerMarker); - - // Also mark any reverse dependencies. - markReverseDependencies(offset); - } - - // Check if this instruction is a branch origin from a branch - // that straddles some marked code. - markStraddlingBranches(offset, - partialEvaluator.branchTargets(offset), - true); - - // Check if this instruction is a branch target from a branch - // that straddles some marked code. - markStraddlingBranches(offset, - partialEvaluator.branchOrigins(offset), - false); - } - - if (DEBUG) - { - if (maxMarkedOffset > offset) - { - System.out.println(" -> "+maxMarkedOffset); - } - } - } - if (DEBUG) System.out.println(); - - - // Mark variable initializations, even if they aren't strictly necessary. - // The virtual machine's verification step is not smart enough to see - // this, and may complain otherwise. - if (DEBUG) System.out.println("Initialization marking: "); - - codeAttribute.instructionsAccept(clazz, method, - necessaryInstructionFilter( - variableInitializationMarker)); - - if (DEBUG) System.out.println(); - - - // Mark produced stack entries, in order to keep the stack consistent. - if (DEBUG) System.out.println("Stack consistency fixing:"); - - maxMarkedOffset = codeLength - 1; - - while (maxMarkedOffset >= 0) - { - int offset = maxMarkedOffset; - - maxMarkedOffset = offset - 1; - - if (partialEvaluator.isTraced(offset)) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - - instruction.accept(clazz, method, codeAttribute, offset, stackConsistencyMarker); - - // Check if this instruction is a branch origin from a branch - // that straddles some marked code. - markStraddlingBranches(offset, - partialEvaluator.branchTargets(offset), - true); - - // Check if this instruction is a branch target from a branch - // that straddles some marked code. - markStraddlingBranches(offset, - partialEvaluator.branchOrigins(offset), - false); - } - } - if (DEBUG) System.out.println(); - - - // Mark unnecessary popping instructions, in order to keep the stack - // consistent. - if (DEBUG) System.out.println("Extra pop marking:"); - - maxMarkedOffset = codeLength - 1; - - while (maxMarkedOffset >= 0) - { - int offset = maxMarkedOffset; - - maxMarkedOffset = offset - 1; - - if (partialEvaluator.isTraced(offset) && - !isInstructionNecessary(offset)) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - - instruction.accept(clazz, method, codeAttribute, offset, extraPopInstructionMarker); - - // Check if this instruction is a branch origin from a branch - // that straddles some marked code. - markStraddlingBranches(offset, - partialEvaluator.branchTargets(offset), - true); - - // Check if this instruction is a branch target from a branch - // that straddles some marked code. - markStraddlingBranches(offset, - partialEvaluator.branchOrigins(offset), - false); - } - } - if (DEBUG) System.out.println(); - - - if (DEBUG_RESULTS) - { - System.out.println("Instruction usage results:"); - - int offset = 0; - do - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - System.out.println((isInstructionNecessary(offset) ? " + " : - isExtraPushPopInstructionNecessary(offset) ? " ~ " : - " - ") + - instruction.toString(offset)); - - offset += instruction.length(offset); - } - while (offset < codeLength); - } - } - - - /** - * This MemberVisitor marks stack entries that aren't necessary because - * parameters aren't used in the methods that are visited. - */ - private class MyParameterUsageMarker - extends SimplifiedVisitor - implements InstructionVisitor, - ConstantVisitor, - MemberVisitor - { - private int parameterSize; - private long usedParameters; - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - { - parameterSize = 0; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - - // Mark unused parameters. - for (int index = 0; index < parameterSize; index++) - { - if (index < 64 && - (usedParameters & (1L << index)) == 0L) - { - TracedStack stack = - partialEvaluator.getStackBefore(offset); - - int stackIndex = stack.size() - parameterSize + index; - - if (DEBUG) - { - System.out.println(" ["+offset+"] Ignoring parameter #"+index+" (stack entry #"+stackIndex+" ["+stack.getBottom(stackIndex)+"])"); - System.out.println(" Full stack: "+stack); - } - - markStackEntryUnwantedBefore(offset, stackIndex); - } - } - break; - } - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - refConstant.referencedMemberAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Get the total size of the parameters and the mask of the used - // parameters. - parameterSize = ParameterUsageMarker.getParameterSize(programMethod); - usedParameters = ParameterUsageMarker.getUsedParameters(programMethod); - } - } - - - /** - * This InstructionVisitor marks the instructions that are intrinsically - * necessary, because they have side effects. - */ - private class MyInitialUsageMarker - extends SimplifiedVisitor - implements InstructionVisitor, - ConstantVisitor, - ParameterVisitor - { - private final MemberVisitor reverseDependencyCreator = new AllParameterVisitor(true, this); - - // Parameters and values for visitor methods. - private int referencingOffset; - private int referencingPopCount; - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - if (sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - instruction)) - { - markInstruction(offset); - } - } - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_LASTORE: - case InstructionConstants.OP_FASTORE: - case InstructionConstants.OP_DASTORE: - case InstructionConstants.OP_AASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - createReverseDependencies(clazz, offset, simpleInstruction); - - // Also check for side-effects of the instruction itself. - visitAnyInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - break; - - default: - visitAnyInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - break; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_ANEWARRAY: - case InstructionConstants.OP_MULTIANEWARRAY: - // We may have to mark the instruction due to initializers. - referencingOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - - // Also check for side-effects of the instruction itself. - visitAnyInstruction(clazz, method, codeAttribute, offset, constantInstruction); - break; - - case InstructionConstants.OP_LDC: - case InstructionConstants.OP_LDC_W: - case InstructionConstants.OP_NEW: - case InstructionConstants.OP_GETSTATIC: - // We may have to mark the instruction due to initializers. - referencingOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_PUTFIELD: - createReverseDependencies(clazz, offset, constantInstruction); - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - referencingOffset = offset; - referencingPopCount = constantInstruction.stackPopCount(clazz); - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - default: - visitAnyInstruction(clazz, method, codeAttribute, offset, constantInstruction); - break; - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - if (branchInstruction.opcode == InstructionConstants.OP_GOTO && - branchInstruction.branchOffset == 0) - { - if (DEBUG) System.out.print("(infinite loop)"); - markInstruction(offset); - } - else - { - visitAnyInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - Clazz referencedClass = stringConstant.referencedClass; - - // If a static initializer may have side effects, the instruction - // has to be marked. - if (referencedClass != null && - SideEffectClassChecker.mayHaveSideEffects(clazz, - referencedClass)) - { - // Mark the invocation. - markInstruction(referencingOffset); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - Clazz referencedClass = classConstant.referencedClass; - - // If a static initializer may have side effects, the instruction - // has to be marked. - if (referencedClass == null || - SideEffectClassChecker.mayHaveSideEffects(clazz, - referencedClass)) - { - // Mark the invocation. - markInstruction(referencingOffset); - } - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - clazz.constantPoolEntryAccept(fieldrefConstant.u2classIndex, this); - } - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - Method referencedMethod = (Method)refConstant.referencedMember; - -// if (referencedMethod != null) -// { -// System.out.println("InstructionUsageMarker$MyInitialUsageMarker.visitAnyMethodrefConstant [" + refConstant.getClassName(clazz) + "." + refConstant.getName(clazz) + -// "]: mark! esc = " + ParameterEscapeMarker.getEscapingParameters(referencedMethod) + -// ", mod = " + ParameterEscapeMarker.modifiesAnything(referencedMethod) + -// ", side = " + SideEffectClassChecker.mayHaveSideEffects(clazz, -// refConstant.referencedClass, -// referencedMethod)); -// } - - // Is the method invocation really necessary? - if (SideEffectInstructionChecker.OPTIMIZE_CONSERVATIVELY && - referencedMethod != null && - SideEffectMethodMarker.hasSideEffects(referencedMethod) && - // Skip if the method was explicitly marked as having no external side-effects. - !NoExternalSideEffectMethodMarker.hasNoExternalSideEffects(referencedMethod)) - { - // In case we shall optimize conservatively, always mark the method - // call if the referenced method has side effects. - markInstruction(referencingOffset); - } - else if (referencedMethod == null || - ParameterEscapeMarker.getEscapingParameters(referencedMethod) != 0L || - ParameterEscapeMarker.modifiesAnything(referencedMethod) || - SideEffectClassChecker.mayHaveSideEffects(clazz, - refConstant.referencedClass, - referencedMethod)) - { -// System.out.println(" -> mark ["+referencingOffset+"]"); - // Mark the invocation. - markInstruction(referencingOffset); - } - else - { - if (DEBUG) - { - System.out.println(" ["+referencingOffset+"] Checking parameters of ["+refConstant.getClassName(clazz)+"."+refConstant.getName(clazz)+refConstant.getType(clazz)+"] (pop count = "+referencingPopCount+")"); - } - - // Create reverse dependencies for reference parameters that - // are modified. - refConstant.referencedMemberAccept(reverseDependencyCreator); - } - } - - - // Implementations for ParameterVisitor. - - public void visitParameter(Clazz clazz, Member member, int parameterIndex, int parameterCount, int parameterOffset, int parameterSize, String parameterType, Clazz referencedClass) - { - Method method = (Method)member; - - if (DEBUG) - { - System.out.println(" P"+parameterIndex+ - ": escaping = "+ParameterEscapeMarker.isParameterEscaping(method, parameterIndex)+ - ", modified = "+ParameterEscapeMarker.isParameterModified(method, parameterIndex)+ - ", returned = "+ParameterEscapeMarker.isParameterReturned(method, parameterIndex)); - } - - // Create a reverse dependency if the reference parameter is - // modified. - if (ParameterEscapeMarker.isParameterModified(method, parameterIndex)) - { - createReverseDependencies(referencingOffset, - parameterSize - parameterOffset - 1); - } - } - - - /** - * Marks the specified instruction offset or creates reverse - * dependencies to the producers of its bottom popped stack entry. - */ - private void createReverseDependencies(Clazz clazz, - int offset, - Instruction instruction) - { - createReverseDependencies(offset, - instruction.stackPopCount(clazz) - 1); - } - - - /** - * Marks the specified instruction offset or creates reverse - * dependencies to the producers of the specified stack entry, if it - * is a reference value. - */ - private void createReverseDependencies(int offset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(offset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); -// System.out.println(" ["+offset+"] s"+stackEntryIndex+": ["+stackEntry+"]"); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - ReferenceValue referenceValue = stackEntry.referenceValue(); -// System.out.println("EvaluationShrinker$MyInitialUsageMarker.createReverseDependencies: ["+offset+"] ["+referenceValue+"]?"); - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS) - { - if (referenceValue instanceof TracedReferenceValue) - { - TracedReferenceValue tracedReferenceValue = - (TracedReferenceValue)referenceValue; - - createReverseDependencies(offset, - tracedReferenceValue.getTraceValue().instructionOffsetValue()); - } - else - { -// System.out.println("InstructionUsageMarker$MyInitialUsageMarker.createReverseDependencies: not a TracedReferenceValue"); - markInstruction(offset); - } - } - } - } - - - /** - * Marks the specified instruction offset or creates reverse - * dependencies to the producers of the given reference value. - */ - private void createReverseDependencies(int offset, - InstructionOffsetValue producerOffsets) - { - InstructionOffsetValue consumerOffset = - new InstructionOffsetValue(offset); - - int offsetCount = producerOffsets.instructionOffsetCount(); - for (int offsetIndex = 0; offsetIndex < offsetCount; offsetIndex++) - { - if (producerOffsets.isNewinstance(offsetIndex)) - { - // Create a reverse dependency. If the creating instruction - // is necessary, then so is this one. - int producerOffset = producerOffsets.instructionOffset(offsetIndex); - - // Avoid circular dependencies in code that loops with - // instances on the stack (like the string encryption code). - if (producerOffset != offset) - { - if (DEBUG) System.out.println(" Inserting reverse dependency from instance producers ["+producerOffset+"] to ["+offset+"]"); - - InstructionOffsetValue reverseDependency = - reverseDependencies[producerOffset]; - - reverseDependencies[producerOffset] = - reverseDependency == null ? - consumerOffset : - reverseDependency.generalize(consumerOffset); - } - } - else - { - // Just mark the instruction. - markInstruction(offset); - } - } - } - } - - - /** - * This InstructionVisitor marks the producing instructions and produced - * variables and stack entries of the instructions that it visits. - * Simplified method arguments are ignored. - */ - private class MyProducerMarker - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - markStackProducers(clazz, offset, instruction); - } - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_DUP: - conditionallyMarkStackEntryProducers(offset, 0, 0); - conditionallyMarkStackEntryProducers(offset, 1, 0); - break; - case InstructionConstants.OP_DUP_X1: - conditionallyMarkStackEntryProducers(offset, 0, 0); - conditionallyMarkStackEntryProducers(offset, 1, 1); - conditionallyMarkStackEntryProducers(offset, 2, 0); - break; - case InstructionConstants.OP_DUP_X2: - conditionallyMarkStackEntryProducers(offset, 0, 0); - conditionallyMarkStackEntryProducers(offset, 1, 1); - conditionallyMarkStackEntryProducers(offset, 2, 2); - conditionallyMarkStackEntryProducers(offset, 3, 0); - break; - case InstructionConstants.OP_DUP2: - conditionallyMarkStackEntryProducers(offset, 0, 0); - conditionallyMarkStackEntryProducers(offset, 1, 1); - conditionallyMarkStackEntryProducers(offset, 2, 0); - conditionallyMarkStackEntryProducers(offset, 3, 1); - break; - case InstructionConstants.OP_DUP2_X1: - conditionallyMarkStackEntryProducers(offset, 0, 0); - conditionallyMarkStackEntryProducers(offset, 1, 1); - conditionallyMarkStackEntryProducers(offset, 2, 2); - conditionallyMarkStackEntryProducers(offset, 3, 0); - conditionallyMarkStackEntryProducers(offset, 4, 1); - break; - case InstructionConstants.OP_DUP2_X2: - conditionallyMarkStackEntryProducers(offset, 0, 0); - conditionallyMarkStackEntryProducers(offset, 1, 1); - conditionallyMarkStackEntryProducers(offset, 2, 2); - conditionallyMarkStackEntryProducers(offset, 3, 3); - conditionallyMarkStackEntryProducers(offset, 4, 0); - conditionallyMarkStackEntryProducers(offset, 5, 1); - break; - case InstructionConstants.OP_SWAP: - conditionallyMarkStackEntryProducers(offset, 0, 1); - conditionallyMarkStackEntryProducers(offset, 1, 0); - break; - default: - markStackProducers(clazz, offset, simpleInstruction); - break; - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - // Is the variable being loaded or incremented? - if (variableInstruction.isLoad()) - { - markVariableProducers(offset, variableInstruction.variableIndex); - } - else - { - markStackProducers(clazz, offset, variableInstruction); - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - markStackProducers(clazz, offset, constantInstruction); - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - // Explicitly mark the produced stack entry of a 'jsr' instruction, - // because the consuming 'astore' instruction of the subroutine is - // cleared every time it is traced. - if (branchInstruction.opcode == InstructionConstants.OP_JSR || - branchInstruction.opcode == InstructionConstants.OP_JSR_W) - { - markStackEntryAfter(offset, 0); - } - else - { - markStackProducers(clazz, offset, branchInstruction); - } - } - } - - - /** - * This InstructionVisitor marks variable initializations that are - * necessary to appease the JVM. - */ - private class MyVariableInitializationMarker - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - // Is the variable being loaded or incremented? - if (variableInstruction.isLoad()) - { - // Mark any variable initializations for this variable load that - // are required according to the JVM. - markVariableInitializersBefore(offset, variableInstruction.variableIndex, null); - } - } - } - - - /** - * This InstructionVisitor marks stack entries that should be pushed - * (and previously unnecessary pushing instructions) to keep the stack - * consistent at later points in the execution. - */ - private class MyStackConsistencyMarker - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // We check all entries to make sure the stack is also consistent - // at method exit points, where some stack entries might be - // discarded. - int stackSize = partialEvaluator.getStackBefore(offset).size(); - - for (int stackIndex = 0; stackIndex < stackSize; stackIndex++) - { - // Is this stack entry pushed by any producer - // (because it is required by other consumers)? - if (!isStackEntryUnwantedBefore(offset, stackIndex) && - isStackEntryPresentBefore(offset, stackIndex)) - { - // Mark all produced stack entries. - markStackEntryProducers(offset, stackIndex, false); - } - } - } - } - - - /** - * This InstructionVisitor marks unnecessary popping instructions that - * should still pop some values to keep the stack consistent. - */ - private class MyExtraPopInstructionMarker - extends SimplifiedVisitor - implements InstructionVisitor - { - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Check all stack entries that are popped. - // - // Typical case: a stack value that is required elsewhere or a - // pushed exception type that still has to be popped. - int stackSize = partialEvaluator.getStackBefore(offset).size(); - - int firstStackIndex = - stackSize - instruction.stackPopCount(clazz); - - for (int stackIndex = firstStackIndex; stackIndex < stackSize; stackIndex++) - { - // Is this stack entry pushed by any producer - // (because it is required by other consumers)? - if (!isStackEntryUnwantedBefore(offset, stackIndex) && - isStackEntryPresentBefore(offset, stackIndex)) - { - // Is it already a pop instruction? - if (isPop(instruction)) - { - // Just mark it as necessary, along with the stack - // entries at the producer offsets. This might happen - // in Kotlin code [DGD-481], with getstatic/pop. - markInstruction(offset); - markStackEntryProducers(offset, stackIndex, false); - } - else - { - // Mark that we'll need an extra pop instruction. - markExtraPushPopInstruction(offset); - } - } - } - } - } - - - // Small utility methods. - - /** - * Returns whether the given instruction is a pop instruction. - */ - private boolean isPop(Instruction instruction) - { - return instruction.opcode == InstructionConstants.OP_POP || - instruction.opcode == InstructionConstants.OP_POP2; - } - - - /** - * Marks the producing instructions of the variable consumer at the given - * offset. - * @param consumerOffset the offset of the variable consumer. - * @param variableIndex the index of the variable that is loaded. - */ - private void markVariableProducers(int consumerOffset, - int variableIndex) - { - InstructionOffsetValue producerOffsets = - partialEvaluator.getVariablesBefore(consumerOffset).getProducerValue(variableIndex).instructionOffsetValue(); - - if (producerOffsets != null) - { - int offsetCount = producerOffsets.instructionOffsetCount(); - for (int offsetIndex = 0; offsetIndex < offsetCount; offsetIndex++) - { - if (!producerOffsets.isMethodParameter(offsetIndex) && - !producerOffsets.isExceptionHandler(offsetIndex)) - { - // Make sure the variable and the instruction are marked - // at the producing offset. - int offset = producerOffsets.instructionOffset(offsetIndex); - - markInstruction(offset); - } - } - } - } - - - /** - * Ensures that the given variable is initialized before the specified - * consumer of that variable, in the JVM's view. - * @param consumerOffset the instruction offset before which the variable - * needs to be initialized. - * @param variableIndex the index of the variable. - * @param visitedOffsets the already visited consumer offsets, needed to - * prevent infinite loops. - */ - private void markVariableInitializersBefore(int consumerOffset, - int variableIndex, - InstructionOffsetValue visitedOffsets) - { - // Avoid infinite loops by stopping recursion if we encounter - // an already visited offset. - if (visitedOffsets != null && - visitedOffsets.contains(consumerOffset)) - { - return; - } - - visitedOffsets = visitedOffsets == null ? - new InstructionOffsetValue(consumerOffset) : - visitedOffsets.add(consumerOffset); - - // Make sure the variable is initialized after all producers. - // Use the simple evaluator, to get the JVM's view of what is - // initialized. - InstructionOffsetValue producerOffsets = - simplePartialEvaluator.getVariablesBefore(consumerOffset).getProducerValue(variableIndex).instructionOffsetValue(); - - int offsetCount = producerOffsets.instructionOffsetCount(); - for (int offsetIndex = 0; offsetIndex < offsetCount; offsetIndex++) - { - if (!producerOffsets.isMethodParameter(offsetIndex) && - !producerOffsets.isExceptionHandler(offsetIndex)) - { - int producerOffset = - producerOffsets.instructionOffset(offsetIndex); - markVariableInitializersAfter(producerOffset, variableIndex, visitedOffsets); - } - } - } - - - /** - * Ensures that the given variable is initialized after the specified - * producer of that variable, in the JVM's view. - * @param producerOffset the instruction offset after which the variable - * needs to be initialized. - * @param variableIndex the index of the variable. - * @param visitedOffsets the already visited consumer offsets, needed to - * prevent infinite loops. - */ - private void markVariableInitializersAfter(int producerOffset, - int variableIndex, - InstructionOffsetValue visitedOffsets) - { - // No problem if the producer has already been marked. - if (!isInstructionNecessary(producerOffset)) - { - // Is the unmarked producer a variable initialization? - if (isVariableInitialization(producerOffset, variableIndex)) - { - // Mark the producer. - if (DEBUG) System.out.print(" Marking initialization of v"+variableIndex+" at "); - - markInstruction(producerOffset); - - if (DEBUG) System.out.println(); - } - else - { - // Don't mark the producer, but recursively look at the - // preceding producers of the same variable. Their values - // will fall through, replacing this producer. - markVariableInitializersBefore(producerOffset, variableIndex, visitedOffsets); - } - } - } - - - /** - * Marks the stack entries and their producing instructions of the - * consumer at the given offset. - * @param clazz the containing class. - * @param consumerOffset the offset of the consumer. - * @param consumer the consumer of the stack entries. - */ - private void markStackProducers(Clazz clazz, - int consumerOffset, - Instruction consumer) - { - TracedStack tracedStack = - partialEvaluator.getStackBefore(consumerOffset); - - int stackSize = tracedStack.size(); - - // Mark the producers of the popped values. - int popCount = consumer.stackPopCount(clazz); - for (int stackIndex = stackSize - popCount; stackIndex < stackSize; stackIndex++) - { - markStackEntryProducers(consumerOffset, stackIndex, true); - } - } - - - /** - * Marks the stack entry and the corresponding producing instructions - * of the consumer at the given offset, if the stack entry of the - * consumer is marked. - * @param consumerOffset the offset of the consumer. - * @param consumerTopStackIndex the index of the stack entry to be checked - * (counting from the top). - * @param producerTopStackIndex the index of the stack entry to be marked - * (counting from the top). - */ - private void conditionallyMarkStackEntryProducers(int consumerOffset, - int consumerTopStackIndex, - int producerTopStackIndex) - { - int consumerBottomStackIndex = partialEvaluator.getStackAfter(consumerOffset).size() - consumerTopStackIndex - 1; - - if (isStackEntryNecessaryAfter(consumerOffset, consumerBottomStackIndex)) - { - int producerBottomStackIndex = partialEvaluator.getStackBefore(consumerOffset).size() - producerTopStackIndex - 1; - - markStackEntryProducers(consumerOffset, producerBottomStackIndex, true); - } - } - - - /** - * Marks the stack entry and optionally the corresponding producing - * instructions of the consumer at the given offset. - * @param consumerOffset the offset of the consumer. - * @param stackIndex the index of the stack entry to be marked - * (counting from the bottom). - * @param markInstructions specifies whether the producing instructions - * should be marked. - */ - private void markStackEntryProducers(int consumerOffset, - int stackIndex, - boolean markInstructions) - { - if (!isStackEntryUnwantedBefore(consumerOffset, stackIndex)) - { - markStackEntryProducers(partialEvaluator.getStackBefore(consumerOffset).getBottomProducerValue(stackIndex).instructionOffsetValue(), - stackIndex, - markInstructions); - } - } - - - /** - * Marks the stack entry and optionally its producing instructions at the - * given offsets. - * @param producerOffsets the offsets of the producers to be marked. - * @param stackIndex the index of the stack entry to be marked - * (counting from the bottom). - * @param markInstructions specifies whether the producing instructions - * should be marked. - */ - private void markStackEntryProducers(InstructionOffsetValue producerOffsets, - int stackIndex, - boolean markInstructions) - { - if (producerOffsets != null) - { - int offsetCount = producerOffsets.instructionOffsetCount(); - for (int offsetIndex = 0; offsetIndex < offsetCount; offsetIndex++) - { - if (!producerOffsets.isExceptionHandler(offsetIndex)) - { - // Make sure the stack entry and the instruction are marked - // at the producing offset. - int offset = producerOffsets.instructionOffset(offsetIndex); - - markStackEntryAfter(offset, stackIndex); - - if (markInstructions) - { - // We can mark the producer. - markInstruction(offset); - } - else - { - // We'll need to push a stack entry at that point - // instead. - markExtraPushPopInstruction(offset); - } - } - } - } - } - - - /** - * Marks any modification instructions that are required by the specified - * creation instruction (new, newarray, method returning new - * instance,...), so this new instance is properly initialized. - * @param instructionOffset the offset of the creation instruction. - */ - private void markReverseDependencies(int instructionOffset) - { - InstructionOffsetValue reverseDependency = - reverseDependencies[instructionOffset]; - - if (reverseDependency != null) - { - markInstructions(reverseDependency); - } - } - - - /** - * Marks the branch instructions of straddling branches, if they straddle - * some code that has been marked. - * @param instructionOffset the offset of the branch origin or branch target. - * @param branchOffsets the offsets of the straddling branch targets - * or branch origins. - * @param isPointingToTargets true if the above offsets are - * branch targets, false if they - * are branch origins. - */ - private void markStraddlingBranches(int instructionOffset, - InstructionOffsetValue branchOffsets, - boolean isPointingToTargets) - { - if (branchOffsets != null) - { - // Loop over all branch offsets. - int branchCount = branchOffsets.instructionOffsetCount(); - for (int branchIndex = 0; branchIndex < branchCount; branchIndex++) - { - // Is the branch straddling forward any necessary instructions? - int branchOffset = branchOffsets.instructionOffset(branchIndex); - - // Is the offset pointing to a branch origin or to a branch target? - if (isPointingToTargets) - { - markStraddlingBranch(instructionOffset, - branchOffset, - instructionOffset, - branchOffset); - } - else - { - markStraddlingBranch(instructionOffset, - branchOffset, - branchOffset, - instructionOffset); - } - } - } - } - - - private void markStraddlingBranch(int instructionOffsetStart, - int instructionOffsetEnd, - int branchOrigin, - int branchTarget) - { - if (!isInstructionNecessary(branchOrigin) && - isAnyInstructionNecessary(instructionOffsetStart, instructionOffsetEnd)) - { - if (DEBUG) System.out.print("["+branchOrigin+"->"+branchTarget+"]"); - - // Mark the branch instruction. - markInstruction(branchOrigin); - } - } - - - /** - * Initializes the necessary data structure. - */ - private void initializeNecessary(CodeAttribute codeAttribute) - { - int codeLength = codeAttribute.u4codeLength; - int maxLocals = codeAttribute.u2maxLocals; - int maxStack = codeAttribute.u2maxStack; - - // Create new arrays for storing information at each instruction offset. - reverseDependencies = - ArrayUtil.ensureArraySize(reverseDependencies, codeLength, null); - - if (stacksNecessaryAfter.length < codeLength || - stacksNecessaryAfter[0].length < maxStack) - { - stacksNecessaryAfter = new boolean[codeLength][maxStack]; - } - else - { - for (int offset = 0; offset < codeLength; offset++) - { - Arrays.fill(stacksNecessaryAfter[offset], 0, maxStack, false); - } - } - - if (stacksUnwantedBefore.length < codeLength || - stacksUnwantedBefore[0].length < maxStack) - { - stacksUnwantedBefore = new boolean[codeLength][maxStack]; - } - else - { - for (int offset = 0; offset < codeLength; offset++) - { - Arrays.fill(stacksUnwantedBefore[offset], 0, maxStack, false); - } - } - - instructionsNecessary = - ArrayUtil.ensureArraySize(instructionsNecessary, - codeLength, - false); - - extraPushPopInstructionsNecessary = - ArrayUtil.ensureArraySize(extraPushPopInstructionsNecessary, - codeLength, - false); - } - - - /** - * Returns whether the specified variable is initialized at the specified - * offset. - */ - private boolean isVariableInitialization(int instructionOffset, - int variableIndex) - { - // Wasn't the variable set yet? - Value valueBefore = simplePartialEvaluator.getVariablesBefore(instructionOffset).getValue(variableIndex); - if (valueBefore == null) - { - return true; - } - - // Is the computational type different now? - Value valueAfter = simplePartialEvaluator.getVariablesAfter(instructionOffset).getValue(variableIndex); - if (valueAfter.computationalType() != valueBefore.computationalType()) - { - return true; - } - - // Is the reference type different now? - if (valueAfter.computationalType() == Value.TYPE_REFERENCE && - (valueAfter.referenceValue().isNull() == Value.ALWAYS || - !valueAfter.referenceValue().getType().equals(valueBefore.referenceValue().getType()))) - { - return true; - } - - // Was the producer an argument (which may be removed)? - InstructionOffsetValue producersBefore = simplePartialEvaluator.getVariablesBefore(instructionOffset).getProducerValue(variableIndex).instructionOffsetValue(); - return producersBefore.instructionOffsetCount() == 1 && - producersBefore.isMethodParameter(0); - } - - - /** - * Marks the stack entry after the given offset. - * @param instructionOffset the offset of the stack entry to be marked. - * @param stackIndex the index of the stack entry to be marked - * (counting from the bottom). - */ - private void markStackEntryAfter(int instructionOffset, - int stackIndex) - { - if (!isStackEntryNecessaryAfter(instructionOffset, stackIndex)) - { - if (DEBUG) System.out.print("["+instructionOffset+".s"+stackIndex+"],"); - - stacksNecessaryAfter[instructionOffset][stackIndex] = true; - - if (maxMarkedOffset < instructionOffset) - { - maxMarkedOffset = instructionOffset; - } - } - } - - - /** - * Marks the specified stack entry as unwanted, typically because it is - * an unused parameter of a method invocation. - * @param instructionOffset the offset of the consumer. - * @param stackIndex the index of the stack entry to be marked - * (counting from the bottom). - */ - private void markStackEntryUnwantedBefore(int instructionOffset, - int stackIndex) - { - stacksUnwantedBefore[instructionOffset][stackIndex] = true; - } - - - /** - * Marks the specified instructions as used. - * @param instructionOffsets the offsets of the instructions. - */ - private void markInstructions(InstructionOffsetValue instructionOffsets) - { - int count = instructionOffsets.instructionOffsetCount(); - - for (int index = 0; index < count; index++) - { - markInstruction(instructionOffsets.instructionOffset(index)); - } - } - - - /** - * Marks the specified instruction as used. - * @param instructionOffset the offset of the instruction. - */ - private void markInstruction(int instructionOffset) - { - if (!isInstructionNecessary(instructionOffset)) - { - if (DEBUG) System.out.print(instructionOffset+","); - - instructionsNecessary[instructionOffset] = true; - - if (maxMarkedOffset < instructionOffset) - { - maxMarkedOffset = instructionOffset; - } - } - } - - - /** - * Marks that an extra push/pop instruction is required at the given - * offset, if the current instruction at that offset is unused. - * @param instructionOffset the offset of the instruction. - */ - private void markExtraPushPopInstruction(int instructionOffset) - { - if (!isInstructionNecessary(instructionOffset) && - !isExtraPushPopInstructionNecessary(instructionOffset)) - { - if (DEBUG) System.out.print(instructionOffset+","); - - extraPushPopInstructionsNecessary[instructionOffset] = true; - - if (maxMarkedOffset < instructionOffset) - { - maxMarkedOffset = instructionOffset; - } - } - } - - - /** - * Returns whether any instruction in the specified sequence of - * instructions is necessary. - * @param startInstructionOffset the start offset of the instruction - * sequence (inclusive). - * @param endInstructionOffset the end offset of the instruction - * sequence (exclusive). - * @return whether any instruction is necessary. - */ - private boolean isAnyInstructionNecessary(int startInstructionOffset, - int endInstructionOffset) - { - for (int instructionOffset = startInstructionOffset; - instructionOffset < endInstructionOffset; - instructionOffset++) - { - if (isInstructionNecessary(instructionOffset) || - isExtraPushPopInstructionNecessary(instructionOffset)) - { - return true; - } - } - - return false; - } - - - /** - * This InstructionVisitor delegates its visits to a given - * InstructionVisitor, but only if the instruction has been marked as - * necessary (or not). - */ - private class MyNecessaryInstructionFilter implements InstructionVisitor - { - private final boolean necessary; - private final InstructionVisitor instructionVisitor; - - - public MyNecessaryInstructionFilter(boolean necessary, - InstructionVisitor instructionVisitor) - { - this.necessary = necessary; - this.instructionVisitor = instructionVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitSimpleInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitVariableInstruction(clazz, method, codeAttribute, offset, variableInstruction); - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitConstantInstruction(clazz, method, codeAttribute, offset, constantInstruction); - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitTableSwitchInstruction(clazz, method, codeAttribute, offset, tableSwitchInstruction); - } - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitLookUpSwitchInstruction(clazz, method, codeAttribute, offset, lookUpSwitchInstruction); - } - } - - - // Small utility methods. - - /** - * Returns whether the instruction at the given offset should be - * visited, depending on whether it is necessary or not. - */ - private boolean shouldVisit(int offset) - { - return isInstructionNecessary(offset) == necessary; - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/LivenessAnalyzer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/LivenessAnalyzer.java deleted file mode 100644 index 5bb977e4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/LivenessAnalyzer.java +++ /dev/null @@ -1,500 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.evaluation.BasicInvocationUnit; -import proguard.evaluation.value.*; -import proguard.util.ArrayUtil; - -/** - * This AttributeVisitor analyzes the liveness of the variables in the code - * attributes that it visits, based on partial evaluation. - * - * @author Eric Lafortune - */ -public class LivenessAnalyzer -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ExceptionInfoVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("la") != null; - //*/ - - private static final int MAX_VARIABLES_SIZE = 64; - - private final PartialEvaluator partialEvaluator; - private final boolean runPartialEvaluator; - private final InitializationFinder initializationFinder; - private final boolean runInitializationFinder; - - private long[] isAliveBefore = new long[ClassConstants.TYPICAL_CODE_LENGTH]; - private long[] isAliveAfter = new long[ClassConstants.TYPICAL_CODE_LENGTH]; - private long[] isCategory2 = new long[ClassConstants.TYPICAL_CODE_LENGTH]; - - // Fields acting as global temporary variables. - private boolean checkAgain; - private long alive; - - - /** - * Creates a new LivenessAnalyzer. - */ - public LivenessAnalyzer() - { - this(new ReferenceTracingValueFactory(new BasicValueFactory())); - } - - - /** - * Creates a new LivenessAnalyzer. This private constructor gets around - * the constraint that it's not allowed to add statements before calling - * 'this'. - */ - private LivenessAnalyzer(ReferenceTracingValueFactory referenceTracingValueFactory) - { - this(new PartialEvaluator(referenceTracingValueFactory, - new ReferenceTracingInvocationUnit(new BasicInvocationUnit(referenceTracingValueFactory)), - true, - referenceTracingValueFactory), - true); - } - - - /** - * Creates a new LivenessAnalyzer. This private constructor gets around - * the constraint that it's not allowed to add statements before calling - * 'this'. - */ - private LivenessAnalyzer(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator) - { - this(partialEvaluator, - runPartialEvaluator, - new InitializationFinder(partialEvaluator, false), - true); - } - - - /** - * Creates a new LivenessAnalyzer that will use the given partial evaluator - * and initialization finder. - * @param partialEvaluator the evaluator to be used for the analysis. - * @param runPartialEvaluator specifies whether to run this evaluator on - * every code attribute that is visited. - * @param initializationFinder the initialization finder to be used for - * the analysis. - * @param runInitializationFinder specifies whether to run this - * initialization finder on every code - * attribute that is visited. - */ - public LivenessAnalyzer(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator, - InitializationFinder initializationFinder, - boolean runInitializationFinder) - { - this.partialEvaluator = partialEvaluator; - this.runPartialEvaluator = runPartialEvaluator; - this.initializationFinder = initializationFinder; - this.runInitializationFinder = runInitializationFinder; - } - - - /** - * Returns whether the instruction at the given offset has ever been - * executed during the partial evaluation. - */ - public boolean isTraced(int instructionOffset) - { - return partialEvaluator.isTraced(instructionOffset); - } - - - /** - * Returns whether the specified variable is alive before the instruction - * at the given offset. - */ - public boolean isAliveBefore(int instructionOffset, int variableIndex) - { - return variableIndex >= MAX_VARIABLES_SIZE ? - partialEvaluator.getVariablesBefore(instructionOffset).getValue(variableIndex) != null : - (isAliveBefore[instructionOffset] & (1L << variableIndex)) != 0; - } - - - /** - * Sets whether the specified variable is alive before the instruction - * at the given offset. - */ - public void setAliveBefore(int instructionOffset, int variableIndex, boolean alive) - { - if (variableIndex < MAX_VARIABLES_SIZE) - { - if (alive) - { - isAliveBefore[instructionOffset] |= 1L << variableIndex; - } - else - { - isAliveBefore[instructionOffset] &= ~(1L << variableIndex); - } - } - } - - - /** - * Returns whether the specified variable is alive after the instruction - * at the given offset. - */ - public boolean isAliveAfter(int instructionOffset, int variableIndex) - { - return variableIndex >= MAX_VARIABLES_SIZE ? - partialEvaluator.getVariablesAfter(instructionOffset).getValue(variableIndex) != null : - (isAliveAfter[instructionOffset] & (1L << variableIndex)) != 0; - } - - - /** - * Sets whether the specified variable is alive after the instruction - * at the given offset. - */ - public void setAliveAfter(int instructionOffset, int variableIndex, boolean alive) - { - if (variableIndex < MAX_VARIABLES_SIZE) - { - if (alive) - { - isAliveAfter[instructionOffset] |= 1L << variableIndex; - } - else - { - isAliveAfter[instructionOffset] &= ~(1L << variableIndex); - } - } - } - - - /** - * Returns whether the specified variable takes up two entries after the - * instruction at the given offset. - */ - public boolean isCategory2(int instructionOffset, int variableIndex) - { - return variableIndex >= MAX_VARIABLES_SIZE ? - partialEvaluator.getVariablesBefore(instructionOffset).getValue(variableIndex) != null && - partialEvaluator.getVariablesBefore(instructionOffset).getValue(variableIndex).isCategory2() : - (isCategory2[instructionOffset] & (1L << variableIndex)) != 0; - } - - - /** - * Sets whether the specified variable takes up two entries after the - * instruction at the given offset. - */ - public void setCategory2(int instructionOffset, int variableIndex, boolean category2) - { - if (variableIndex < MAX_VARIABLES_SIZE) - { - if (category2) - { - isCategory2[instructionOffset] |= 1L << variableIndex; - } - else - { - isCategory2[instructionOffset] &= ~(1L << variableIndex); - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - if (DEBUG) - { - System.out.println(); - System.out.println("Liveness analysis: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - int codeLength = codeAttribute.u4codeLength; - int variablesSize = codeAttribute.u2maxLocals; - - // Initialize the global arrays. - isAliveBefore = ArrayUtil.ensureArraySize(isAliveBefore, codeLength, 0L); - isAliveAfter = ArrayUtil.ensureArraySize(isAliveAfter, codeLength, 0L); - isCategory2 = ArrayUtil.ensureArraySize(isCategory2, codeLength, 0L); - - // Evaluate the method. - if (runPartialEvaluator) - { - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - } - - if (runInitializationFinder) - { - initializationFinder.visitCodeAttribute(clazz, method, codeAttribute); - } - - // We'll only really analyze the first 64 variables. - if (variablesSize > MAX_VARIABLES_SIZE) - { - variablesSize = MAX_VARIABLES_SIZE; - } - - // Mark liveness blocks, as many times as necessary. - do - { - checkAgain = false; - alive = 0L; - - // Loop over all traced instructions, backward. - for (int offset = codeLength - 1; offset >= 0; offset--) - { - if (partialEvaluator.isTraced(offset)) - { - // Update the liveness based on the branch targets. - InstructionOffsetValue branchTargets = partialEvaluator.branchTargets(offset); - if (branchTargets != null) - { - // Update the liveness right after the branch instruction. - alive = combinedLiveness(branchTargets); - } - - // Merge the current liveness. - alive |= isAliveAfter[offset]; - - // Update the liveness after the instruction. - isAliveAfter[offset] = alive; - - // Update the current liveness based on the instruction. - codeAttribute.instructionAccept(clazz, method, offset, this); - - // Merge the current liveness. - alive |= isAliveBefore[offset]; - - // Update the liveness before the instruction. - if ((~isAliveBefore[offset] & alive) != 0L) - { - isAliveBefore[offset] = alive; - - // Do we have to check again after this loop? - InstructionOffsetValue branchOrigins = partialEvaluator.branchOrigins(offset); - if (branchOrigins != null && - offset < branchOrigins.maximumValue()) - { - checkAgain = true; - } - } - } - } - - // Account for the liveness at the start of the exception handlers. - codeAttribute.exceptionsAccept(clazz, method, this); - } - while (checkAgain); - - // Loop over all instructions, to mark variables that take up two entries. - for (int offset = 0; offset < codeLength; offset++) - { - if (partialEvaluator.isTraced(offset)) - { - // Loop over all variables. - for (int variableIndex = 0; variableIndex < variablesSize; variableIndex++) - { - // Is the variable alive and a category 2 type? - if (isAliveBefore(offset, variableIndex)) - { - Value value = partialEvaluator.getVariablesBefore(offset).getValue(variableIndex); - if (value != null && value.isCategory2()) - { - // Mark it as such. - setCategory2(offset, variableIndex, true); - - // Mark the next variable as well. - setAliveBefore(offset, variableIndex + 1, true); - setCategory2( offset, variableIndex + 1, true); - } - } - - // Is the variable alive and a category 2 type? - if (isAliveAfter(offset, variableIndex)) - { - Value value = partialEvaluator.getVariablesAfter(offset).getValue(variableIndex); - if (value != null && value.isCategory2()) - { - // Mark it as such. - setCategory2(offset, variableIndex, true); - - // Mark the next variable as well. - setAliveAfter(offset, variableIndex + 1, true); - setCategory2( offset, variableIndex + 1, true); - } - } - } - } - } - - if (DEBUG) - { - // Loop over all instructions. - for (int offset = 0; offset < codeLength; offset++) - { - if (partialEvaluator.isTraced(offset)) - { - long aliveBefore = isAliveBefore[offset]; - long aliveAfter = isAliveAfter[offset]; - long category2 = isCategory2[offset]; - - // Print out the liveness of all variables before the instruction. - for (int variableIndex = 0; variableIndex < variablesSize; variableIndex++) - { - long variableMask = (1L << variableIndex); - System.out.print((aliveBefore & variableMask) == 0L ? '.' : - (category2 & variableMask) == 0L ? 'x' : - '*'); - } - - // Print out the instruction itself. - System.out.println(" "+ InstructionFactory.create(codeAttribute.code, offset).toString(offset)); - - // Print out the liveness of all variables after the instruction. - for (int variableIndex = 0; variableIndex < variablesSize; variableIndex++) - { - long variableMask = (1L << variableIndex); - System.out.print((aliveAfter & variableMask) == 0L ? '.' : - (category2 & variableMask) == 0L ? 'x' : - '='); - } - - System.out.println(); - } - } - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - int variableIndex = variableInstruction.variableIndex; - if (variableIndex < MAX_VARIABLES_SIZE) - { - long livenessMask = 1L << variableIndex; - - // Is it a load instruction or a store instruction? - if (variableInstruction.isLoad()) - { - // Start marking the variable before the load instruction. - alive |= livenessMask; - } - else - { - // Stop marking the variable before the store instruction. - alive &= ~livenessMask; - - // But do mark the variable right after the store instruction. - isAliveAfter[offset] |= livenessMask; - } - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Special case: variable 0 ('this') in an initializer has to be alive - // as long as it hasn't been initialized. - if (offset == initializationFinder.superInitializationOffset()) - { - alive |= 1L; - } - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - // Are any variables alive at the start of the handler? - long alive = isAliveBefore[exceptionInfo.u2handlerPC]; - if (alive != 0L) - { - // Set the same liveness flags for the entire try block. - int startOffset = exceptionInfo.u2startPC; - int endOffset = exceptionInfo.u2endPC; - - for (int offset = startOffset; offset < endOffset; offset++) - { - if (partialEvaluator.isTraced(offset)) - { - if ((~(isAliveBefore[offset] & isAliveAfter[offset]) & alive) != 0L) - { - isAliveBefore[offset] |= alive; - isAliveAfter[offset] |= alive; - - // Check again after having marked this try block. - checkAgain = true; - } - } - } - } - } - - - // Small utility methods. - - /** - * Returns the combined liveness mask of the variables right before the - * specified instruction offsets. - */ - private long combinedLiveness(InstructionOffsetValue instructionOffsetValue) - { - long alive = 0L; - - int count = instructionOffsetValue.instructionOffsetCount(); - for (int index = 0; index < count; index++) - { - alive |= isAliveBefore[instructionOffsetValue.instructionOffset(index)]; - } - - return alive; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/LoadingInvocationUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/LoadingInvocationUnit.java deleted file mode 100644 index 771064a5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/LoadingInvocationUnit.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.constant.RefConstant; -import proguard.evaluation.BasicInvocationUnit; -import proguard.evaluation.value.*; - -/** - * This InvocationUnit loads parameter values and return values that were - * previously stored with the methods that are invoked. - * - * @see StoringInvocationUnit - * @author Eric Lafortune - */ -public class LoadingInvocationUnit -extends BasicInvocationUnit -{ - private final boolean loadFieldValues; - private final boolean loadMethodParameterValues; - private final boolean loadMethodReturnValues; - - - /** - * Creates a new LoadingInvocationUnit with the given value factory. - */ - public LoadingInvocationUnit(ValueFactory valueFactory) - { - this(valueFactory, true, true, true); - } - - - /** - * Creates a new LoadingInvocationUnit with the given value factory, for - * loading the specified values. - */ - public LoadingInvocationUnit(ValueFactory valueFactory, - boolean loadFieldValues, - boolean loadMethodParameterValues, - boolean loadMethodReturnValues) - { - super(valueFactory); - - this.loadFieldValues = loadFieldValues; - this.loadMethodParameterValues = loadMethodParameterValues; - this.loadMethodReturnValues = loadMethodReturnValues; - } - - - // Implementations for BasicInvocationUnit. - - public Value getFieldClassValue(Clazz clazz, - RefConstant refConstant, - String type) - { - if (loadFieldValues) - { - // Do we know this field? - Member referencedMember = refConstant.referencedMember; - if (referencedMember != null) - { - // Retrieve the stored field class value. - ReferenceValue value = StoringInvocationUnit.getFieldClassValue((Field)referencedMember); - if (value != null) - { - return value; - } - } - } - - return super.getFieldClassValue(clazz, refConstant, type); - } - - - public Value getFieldValue(Clazz clazz, - RefConstant refConstant, - String type) - { - if (loadFieldValues) - { - // Do we know this field? - Member referencedMember = refConstant.referencedMember; - if (referencedMember != null) - { - // Retrieve the stored field value. - Value value = StoringInvocationUnit.getFieldValue((Field)referencedMember); - if (value != null) - { - return value; - } - } - } - - return super.getFieldValue(clazz, refConstant, type); - } - - - public Value getMethodParameterValue(Clazz clazz, - Method method, - int parameterIndex, - String type, - Clazz referencedClass) - { - if (loadMethodParameterValues) - { - // Retrieve the stored method parameter value. - Value value = StoringInvocationUnit.getMethodParameterValue(method, parameterIndex); - if (value != null) - { - return value; - } - } - - return super.getMethodParameterValue(clazz, - method, - parameterIndex, - type, - referencedClass); - } - - - public Value getMethodReturnValue(Clazz clazz, - RefConstant refConstant, - String type) - { - if (loadMethodReturnValues) - { - // Do we know this method? - Member referencedMember = refConstant.referencedMember; - if (referencedMember != null) - { - // Retrieve the stored method return value. - Value value = StoringInvocationUnit.getMethodReturnValue((Method)referencedMember); - if (value != null) - { - return value; - } - } - } - - return super.getMethodReturnValue(clazz, - refConstant, - type); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ParameterTracingInvocationUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ParameterTracingInvocationUnit.java deleted file mode 100644 index b5dea742..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ParameterTracingInvocationUnit.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.constant.RefConstant; -import proguard.classfile.util.ClassUtil; -import proguard.evaluation.SimplifiedInvocationUnit; -import proguard.evaluation.value.*; -import proguard.optimize.info.ParameterEscapeMarker; - -/** - * This InvocationUnit tags reference values like - * {@link ReferenceTracingInvocationUnit}, but adds detail to return values - * from invoked methods. - * - * @see ReferenceTracingInvocationUnit - * @see TracedReferenceValue - * @see InstructionOffsetValue - * @author Eric Lafortune - */ -public class ParameterTracingInvocationUnit -extends ReferenceTracingInvocationUnit -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("ptiu") != null; - //*/ - - - private Value[] parameters = new Value[256]; - - - /** - * Creates a new ParameterTracingInvocationUnit that attaches trace - * values specifying the parameter index to each parameter. - * @param invocationUnit the invocation unit to which invocations will - * be delegated. - */ - public ParameterTracingInvocationUnit(SimplifiedInvocationUnit invocationUnit) - { - super(invocationUnit); - } - - - // Implementations for SimplifiedInvocationUnit. - - public void setMethodParameterValue(Clazz clazz, RefConstant refConstant, int parameterIndex, Value value) - { - super.setMethodParameterValue(clazz, refConstant, parameterIndex, value); - - parameters[parameterIndex] = value; - } - - - public Value getMethodReturnValue(Clazz clazz, RefConstant refConstant, String type) - { - Value returnValue = - super.getMethodReturnValue(clazz, refConstant, type); - - // We only need to worry about reference values. - if (returnValue.computationalType() != Value.TYPE_REFERENCE) - { - return returnValue; - } - - Method referencedMethod = (Method)refConstant.referencedMember; - if (referencedMethod != null) - { - // Start figuring out which trace value to attach to the return value. - int offset = - ((TracedReferenceValue)returnValue).getTraceValue().instructionOffsetValue().instructionOffset(0); - - // The trace value might be any external value or just a new instance. - InstructionOffsetValue traceValue = - ParameterEscapeMarker.returnsExternalValues(referencedMethod) ? new InstructionOffsetValue(offset | InstructionOffsetValue.FIELD_VALUE) : - ParameterEscapeMarker.returnsNewInstances(referencedMethod) ? new InstructionOffsetValue(offset | InstructionOffsetValue.NEW_INSTANCE) : - null; - - long returnedParameters = - ParameterEscapeMarker.getReturnedParameters(referencedMethod); - - int parameterCount = - ClassUtil.internalMethodParameterCount(refConstant.getType(clazz), isStatic); - - for (int parameterIndex = 0; parameterIndex < parameterCount; parameterIndex++) - { - if ((returnedParameters & (1L << parameterIndex)) != 0L) - { - Value parameterValue = parameters[parameterIndex]; - if (parameterValue instanceof TracedReferenceValue) - { - TracedReferenceValue tracedParameterValue = - (TracedReferenceValue)parameterValue; - - if (mayReturnType(refConstant.referencedClass, - referencedMethod, - tracedParameterValue)) - { - InstructionOffsetValue parameterTraceValue = - tracedParameterValue.getTraceValue().instructionOffsetValue(); - - traceValue = traceValue == null ? - parameterTraceValue : - traceValue.generalize(parameterTraceValue); - } - } - } - } - - if (DEBUG) - { - System.out.println("ParameterTracingInvocationUnit.getMethodReturnValue: calling ["+refConstant.getClassName(clazz)+"."+refConstant.getName(clazz)+refConstant.getType(clazz)+"] returns ["+traceValue+" "+returnValue+"]"); - } - - // Did we find more detailed information on the return value? - // We should, unless the return value is always null. - if (traceValue != null) - { - return trace(returnValue, traceValue); - } - } - - return returnValue; - } - - - // Small utility methods. - - /** - * Returns whether the given method may return the given type of reference - * value - */ - private boolean mayReturnType(Clazz clazz, - Method method, - ReferenceValue referenceValue) - { - String returnType = - ClassUtil.internalMethodReturnType(method.getDescriptor(clazz)); - - Clazz[] referencedClasses = method instanceof ProgramMethod ? - ((ProgramMethod)method).referencedClasses : - ((LibraryMethod)method).referencedClasses; - - Clazz referencedClass = - referencedClasses == null || - !ClassUtil.isInternalClassType(returnType) ? null : - referencedClasses[referencedClasses.length - 1]; - - return referenceValue.instanceOf(returnType, - referencedClass) != Value.NEVER; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/PartialEvaluator.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/PartialEvaluator.java deleted file mode 100644 index 28e58269..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/PartialEvaluator.java +++ /dev/null @@ -1,1532 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.peephole.BranchTargetFinder; - -import java.util.Arrays; - -/** - * This AttributeVisitor performs partial evaluation on the code attributes - * that it visits. - * - * @author Eric Lafortune - */ -public class PartialEvaluator -extends SimplifiedVisitor -implements AttributeVisitor, - ExceptionInfoVisitor -{ - //* - private static final boolean DEBUG = false; - private static final boolean DEBUG_RESULTS = false; - /*/ - public static boolean DEBUG = System.getProperty("pe") != null; - public static boolean DEBUG_RESULTS = DEBUG; - //*/ - - private static final int MAXIMUM_EVALUATION_COUNT = 5; - - public static final int NONE = -2; - public static final int AT_METHOD_ENTRY = -1; - public static final int AT_CATCH_ENTRY = -1; - - private final ValueFactory valueFactory; - private final InvocationUnit invocationUnit; - private final boolean evaluateAllCode; - private final InstructionVisitor extraInstructionVisitor; - - private InstructionOffsetValue[] branchOriginValues = new InstructionOffsetValue[ClassConstants.TYPICAL_CODE_LENGTH]; - private InstructionOffsetValue[] branchTargetValues = new InstructionOffsetValue[ClassConstants.TYPICAL_CODE_LENGTH]; - private TracedVariables[] variablesBefore = new TracedVariables[ClassConstants.TYPICAL_CODE_LENGTH]; - private TracedStack[] stacksBefore = new TracedStack[ClassConstants.TYPICAL_CODE_LENGTH]; - private TracedVariables[] variablesAfter = new TracedVariables[ClassConstants.TYPICAL_CODE_LENGTH]; - private TracedStack[] stacksAfter = new TracedStack[ClassConstants.TYPICAL_CODE_LENGTH]; - private boolean[] generalizedContexts = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - private int[] evaluationCounts = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - private boolean evaluateExceptions; - private int codeLength; - - private final BasicBranchUnit branchUnit; - private final BranchTargetFinder branchTargetFinder; - - private final java.util.Stack callingInstructionBlockStack; - private final java.util.Stack instructionBlockStack = new java.util.Stack(); - - - /** - * Creates a simple PartialEvaluator. - */ - public PartialEvaluator() - { - this(new BasicValueFactory()); - } - - - /** - * Creates a new PartialEvaluator. - * @param valueFactory the value factory that will create all values - * during evaluation. - */ - public PartialEvaluator(ValueFactory valueFactory) - { - this(valueFactory, - new BasicInvocationUnit(valueFactory), - true); - } - - - /** - * Creates a new PartialEvaluator. - * @param valueFactory the value factory that will create all values - * during the evaluation. - * @param invocationUnit the invocation unit that will handle all - * communication with other fields and methods. - * @param evaluateAllCode a flag that specifies whether all casts, branch - * targets, and exception handlers should be - * evaluated, even if they are unnecessary or - * unreachable. - */ - public PartialEvaluator(ValueFactory valueFactory, - InvocationUnit invocationUnit, - boolean evaluateAllCode) - { - this(valueFactory, - invocationUnit, - evaluateAllCode, - null); - } - - - /** - * Creates a new PartialEvaluator. - * @param valueFactory the value factory that will create all - * values during the evaluation. - * @param invocationUnit the invocation unit that will handle all - * communication with other fields and - * methods. - * @param evaluateAllCode a flag that specifies whether all branch - * targets and exception handlers should be - * evaluated, even if they are unreachable. - * @param extraInstructionVisitor an optional extra visitor for all - * instructions right before they are - * executed. - */ - public PartialEvaluator(ValueFactory valueFactory, - InvocationUnit invocationUnit, - boolean evaluateAllCode, - InstructionVisitor extraInstructionVisitor) - { - this(valueFactory, - invocationUnit, - evaluateAllCode, - extraInstructionVisitor, - evaluateAllCode ? - new BasicBranchUnit() : - new TracedBranchUnit(), - new BranchTargetFinder(), - null); - } - - - /** - * Creates a new PartialEvaluator, based on an existing one. - * @param partialEvaluator the subroutine calling partial evaluator. - */ - private PartialEvaluator(PartialEvaluator partialEvaluator) - { - this(partialEvaluator.valueFactory, - partialEvaluator.invocationUnit, - partialEvaluator.evaluateAllCode, - partialEvaluator.extraInstructionVisitor, - partialEvaluator.branchUnit, - partialEvaluator.branchTargetFinder, - partialEvaluator.instructionBlockStack); - } - - - /** - * Creates a new PartialEvaluator. - * @param valueFactory the value factory that will create - * all values during evaluation. - * @param invocationUnit the invocation unit that will handle - * all communication with other fields - * and methods. - * @param evaluateAllCode a flag that specifies whether all - * casts, branch targets, and exception - * handlers should be evaluated, even - * if they are unnecessary or - * unreachable. - * @param branchUnit the branch unit that will handle all - * branches. - * @param branchTargetFinder the utility class that will find all - * branches. - * @param callingInstructionBlockStack the stack of instruction blocks to - * be evaluated - */ - private PartialEvaluator(ValueFactory valueFactory, - InvocationUnit invocationUnit, - boolean evaluateAllCode, - InstructionVisitor extraInstructionVisitor, - BasicBranchUnit branchUnit, - BranchTargetFinder branchTargetFinder, - java.util.Stack callingInstructionBlockStack) - { - this.valueFactory = valueFactory; - this.invocationUnit = invocationUnit; - this.evaluateAllCode = evaluateAllCode; - this.extraInstructionVisitor = extraInstructionVisitor; - this.branchUnit = branchUnit; - this.branchTargetFinder = branchTargetFinder; - this.callingInstructionBlockStack = callingInstructionBlockStack == null ? - this.instructionBlockStack : - callingInstructionBlockStack; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = DEBUG_RESULTS = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // TODO: Remove this when the partial evaluator has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while performing partial evaluation:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - if (DEBUG) - { - method.accept(clazz, new ClassPrinter()); - - System.out.println("Evaluation results:"); - - int offset = 0; - do - { - if (isBranchOrExceptionTarget(offset)) - { - System.out.println("Branch target from ["+branchOriginValues[offset]+"]:"); - if (isTraced(offset)) - { - System.out.println(" Vars: "+variablesBefore[offset]); - System.out.println(" Stack: "+stacksBefore[offset]); - } - } - - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - System.out.println(instruction.toString(offset)); - - if (isTraced(offset)) - { -// int initializationOffset = branchTargetFinder.initializationOffset(offset); -// if (initializationOffset != NONE) -// { -// System.out.println(" is to be initialized at ["+initializationOffset+"]"); -// } - - InstructionOffsetValue branchTargets = branchTargets(offset); - if (branchTargets != null) - { - System.out.println(" has overall been branching to "+branchTargets); - } - - System.out.println(" Vars: "+variablesAfter[offset]); - System.out.println(" Stack: "+stacksAfter[offset]); - } - - offset += instruction.length(offset); - } - while (offset < codeAttribute.u4codeLength); - } - - throw ex; - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Evaluate the instructions, starting at the entry point. - if (DEBUG) - { - System.out.println(); - System.out.println("Partial evaluation: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - System.out.println(" Max locals = "+codeAttribute.u2maxLocals); - System.out.println(" Max stack = "+codeAttribute.u2maxStack); - } - - // Reuse the existing variables and stack objects, ensuring the right size. - TracedVariables variables = new TracedVariables(codeAttribute.u2maxLocals); - TracedStack stack = new TracedStack(codeAttribute.u2maxStack); - - // Initialize the reusable arrays and variables. - initializeArrays(codeAttribute); - initializeParameters(clazz, method, codeAttribute, variables); - - // Reset stacks. - instructionBlockStack.clear(); - callingInstructionBlockStack.clear(); - - // Find all instruction offsets,... - codeAttribute.accept(clazz, method, branchTargetFinder); - - // Start executing the first instruction block. - evaluateInstructionBlockAndExceptionHandlers(clazz, - method, - codeAttribute, - variables, - stack, - 0, - codeAttribute.u4codeLength); - - if (DEBUG_RESULTS) - { - System.out.println("Evaluation results:"); - - int offset = 0; - do - { - if (isBranchOrExceptionTarget(offset)) - { - System.out.println("Branch target from ["+branchOriginValues[offset]+"]:"); - if (isTraced(offset)) - { - System.out.println(" Vars: "+variablesBefore[offset]); - System.out.println(" Stack: "+stacksBefore[offset]); - } - } - - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - System.out.println(instruction.toString(offset)); - - if (isTraced(offset)) - { -// int initializationOffset = branchTargetFinder.initializationOffset(offset); -// if (initializationOffset != NONE) -// { -// System.out.println(" is to be initialized at ["+initializationOffset+"]"); -// } - - InstructionOffsetValue branchTargets = branchTargets(offset); - if (branchTargets != null) - { - System.out.println(" has overall been branching to "+branchTargets); - } - - System.out.println(" Vars: "+variablesAfter[offset]); - System.out.println(" Stack: "+stacksAfter[offset]); - } - - offset += instruction.length(offset); - } - while (offset < codeAttribute.u4codeLength); - } - } - - - /** - * Returns whether a block of instructions is ever used. - */ - public boolean isTraced(int startOffset, int endOffset) - { - for (int index = startOffset; index < endOffset; index++) - { - if (isTraced(index)) - { - return true; - } - } - - return false; - } - - - /** - * Returns whether the instruction at the given offset has ever been - * executed during the partial evaluation. - */ - public boolean isTraced(int instructionOffset) - { - return evaluationCounts[instructionOffset] > 0; - } - - - /** - * Returns whether there is an instruction at the given offset. - */ - public boolean isInstruction(int instructionOffset) - { - return branchTargetFinder.isInstruction(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is the target of - * any kind. - */ - public boolean isTarget(int instructionOffset) - { - return branchTargetFinder.isTarget(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is the origin of a - * branch instruction. - */ - public boolean isBranchOrigin(int instructionOffset) - { - return branchTargetFinder.isBranchOrigin(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is the target of a - * branch instruction. - */ - public boolean isBranchTarget(int instructionOffset) - { - return branchTargetFinder.isBranchTarget(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is the target of a - * branch instruction or an exception. - */ - public boolean isBranchOrExceptionTarget(int instructionOffset) - { - return branchTargetFinder.isBranchTarget(instructionOffset) || - branchTargetFinder.isExceptionHandler(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is the start of - * an exception handler. - */ - public boolean isExceptionHandler(int instructionOffset) - { - return branchTargetFinder.isExceptionHandler(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is the start of a - * subroutine. - */ - public boolean isSubroutineStart(int instructionOffset) - { - return branchTargetFinder.isSubroutineStart(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is a subroutine - * invocation. - */ - public boolean isSubroutineInvocation(int instructionOffset) - { - return branchTargetFinder.isSubroutineInvocation(instructionOffset); - } - - - /** - * Returns whether the instruction at the given offset is part of a - * subroutine. - */ - public boolean isSubroutine(int instructionOffset) - { - return branchTargetFinder.isSubroutine(instructionOffset); - } - - - /** - * Returns whether the subroutine at the given offset is ever returning - * by means of a regular 'ret' instruction. - */ - public boolean isSubroutineReturning(int instructionOffset) - { - return branchTargetFinder.isSubroutineReturning(instructionOffset); - } - - - /** - * Returns the offset after the subroutine that starts at the given - * offset. - */ - public int subroutineEnd(int instructionOffset) - { - return branchTargetFinder.subroutineEnd(instructionOffset); - } - - -// /** -// * Returns the instruction offset at which the object instance that is -// * created at the given 'new' instruction offset is initialized, or -// * NONE if it is not being created. -// */ -// public int initializationOffset(int instructionOffset) -// { -// return branchTargetFinder.initializationOffset(instructionOffset); -// } - - -// /** -// * Returns whether the method is an instance initializer. -// */ -// public boolean isInitializer() -// { -// return branchTargetFinder.isInitializer(); -// } - - -// /** -// * Returns the instruction offset at which this initializer is calling -// * the "super" or "this" initializer method, or NONE if it is -// * not an initializer. -// */ -// public int superInitializationOffset() -// { -// return branchTargetFinder.superInitializationOffset(); -// } - - - /** - * Returns whether the instruction at the given offset creates a new, - * uninitialized instance. - */ - public boolean isCreation(int offset) - { - return branchTargetFinder.isCreation(offset); - } - - - /** - * Returns whether the instruction at the given offset is the special - * invocation of an instance initializer. - */ - public boolean isInitializer(int offset) - { - return branchTargetFinder.isInitializer(offset); - } - - - /** - * Returns the variables before execution of the instruction at the given - * offset. - */ - public TracedVariables getVariablesBefore(int instructionOffset) - { - return variablesBefore[instructionOffset]; - } - - - /** - * Returns the variables after execution of the instruction at the given - * offset. - */ - public TracedVariables getVariablesAfter(int instructionOffset) - { - return variablesAfter[instructionOffset]; - } - - - /** - * Returns the stack before execution of the instruction at the given - * offset. - */ - public TracedStack getStackBefore(int instructionOffset) - { - return stacksBefore[instructionOffset]; - } - - - /** - * Returns the stack after execution of the instruction at the given - * offset. - */ - public TracedStack getStackAfter(int instructionOffset) - { - return stacksAfter[instructionOffset]; - } - - - /** - * Returns the instruction offsets that branch to the given instruction - * offset. - */ - public InstructionOffsetValue branchOrigins(int instructionOffset) - { - return branchOriginValues[instructionOffset]; - } - - - /** - * Returns the instruction offsets to which the given instruction offset - * branches. - */ - public InstructionOffsetValue branchTargets(int instructionOffset) - { - return branchTargetValues[instructionOffset]; - } - - - /** - * Returns a filtering version of the given instruction visitor that only - * visits traced instructions. - */ - public InstructionVisitor tracedInstructionFilter(InstructionVisitor instructionVisitor) - { - return tracedInstructionFilter(true, instructionVisitor); - } - - - /** - * Returns a filtering version of the given instruction visitor that only - * visits traced or untraced instructions. - */ - public InstructionVisitor tracedInstructionFilter(boolean traced, - InstructionVisitor instructionVisitor) - { - return new MyTracedInstructionFilter(traced, instructionVisitor); - } - - - // Utility methods to evaluate instruction blocks. - - /** - * Pushes block of instructions to be executed in the calling partial - * evaluator. - */ - private void pushCallingInstructionBlock(TracedVariables variables, - TracedStack stack, - int startOffset) - { - callingInstructionBlockStack.push(new MyInstructionBlock(variables, - stack, - startOffset)); - } - - - /** - * Pushes block of instructions to be executed in this partial evaluator. - */ - private void pushInstructionBlock(TracedVariables variables, - TracedStack stack, - int startOffset) - { - instructionBlockStack.push(new MyInstructionBlock(variables, - stack, - startOffset)); - } - - - /** - * Evaluates the instruction block and the exception handlers covering the - * given instruction range in the given code. - */ - private void evaluateInstructionBlockAndExceptionHandlers(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - TracedVariables variables, - TracedStack stack, - int startOffset, - int endOffset) - { - evaluateInstructionBlock(clazz, - method, - codeAttribute, - variables, - stack, - startOffset); - - evaluateExceptionHandlers(clazz, - method, - codeAttribute, - startOffset, - endOffset); - } - - - /** - * Evaluates a block of instructions, starting at the given offset and ending - * at a branch instruction, a return instruction, or a throw instruction. - */ - private void evaluateInstructionBlock(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - TracedVariables variables, - TracedStack stack, - int startOffset) - { - // Execute the initial instruction block. - evaluateSingleInstructionBlock(clazz, - method, - codeAttribute, - variables, - stack, - startOffset); - - // Execute all resulting instruction blocks on the execution stack. - while (!instructionBlockStack.empty()) - { - if (DEBUG) System.out.println("Popping alternative branch out of "+instructionBlockStack.size()+" blocks"); - - MyInstructionBlock instructionBlock = - (MyInstructionBlock)instructionBlockStack.pop(); - - evaluateSingleInstructionBlock(clazz, - method, - codeAttribute, - instructionBlock.variables, - instructionBlock.stack, - instructionBlock.startOffset); - } - } - - - /** - * Evaluates a block of instructions, starting at the given offset and ending - * at a branch instruction, a return instruction, or a throw instruction. - * Instruction blocks that are to be evaluated as a result are pushed on - * the given stack. - */ - private void evaluateSingleInstructionBlock(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - TracedVariables variables, - TracedStack stack, - int startOffset) - { - byte[] code = codeAttribute.code; - - if (DEBUG) - { - System.out.println("Instruction block starting at ["+startOffset+"] in "+ - ClassUtil.externalFullMethodDescription(clazz.getName(), - 0, - method.getName(clazz), - method.getDescriptor(clazz))); - System.out.println("Init vars: "+variables); - System.out.println("Init stack: "+stack); - } - - Processor processor = new Processor(variables, - stack, - valueFactory, - branchUnit, - invocationUnit, - evaluateAllCode); - - int instructionOffset = startOffset; - - int maxOffset = startOffset; - - // Evaluate the subsequent instructions. - while (true) - { - if (maxOffset < instructionOffset) - { - maxOffset = instructionOffset; - } - - // Maintain a generalized local variable frame and stack at this - // instruction offset, before execution. - int evaluationCount = evaluationCounts[instructionOffset]; - if (evaluationCount == 0) - { - // First time we're passing by this instruction. - if (variablesBefore[instructionOffset] == null) - { - // There's not even a context at this index yet. - variablesBefore[instructionOffset] = new TracedVariables(variables); - stacksBefore[instructionOffset] = new TracedStack(stack); - } - else - { - // Reuse the context objects at this index. - variablesBefore[instructionOffset].initialize(variables); - stacksBefore[instructionOffset].copy(stack); - } - - // We'll execute in the generalized context, because it is - // the same as the current context. - generalizedContexts[instructionOffset] = true; - } - else - { - // Merge in the current context. - boolean variablesChanged = variablesBefore[instructionOffset].generalize(variables, true); - boolean stackChanged = stacksBefore[instructionOffset].generalize(stack); - - //System.out.println("GVars: "+variablesBefore[instructionOffset]); - //System.out.println("GStack: "+stacksBefore[instructionOffset]); - - // Bail out if the current context is the same as last time. - if (!variablesChanged && - !stackChanged && - generalizedContexts[instructionOffset]) - { - if (DEBUG) System.out.println("Repeated variables, stack, and branch targets"); - - break; - } - - // See if this instruction has been evaluated an excessive number - // of times. - if (evaluationCount >= MAXIMUM_EVALUATION_COUNT) - { - if (DEBUG) System.out.println("Generalizing current context after "+evaluationCount+" evaluations"); - - // Continue, but generalize the current context. - // Note that the most recent variable values have to remain - // last in the generalizations, for the sake of the ret - // instruction. - variables.generalize(variablesBefore[instructionOffset], false); - stack.generalize(stacksBefore[instructionOffset]); - - // We'll execute in the generalized context. - generalizedContexts[instructionOffset] = true; - } - else - { - // We'll execute in the current context. - generalizedContexts[instructionOffset] = false; - } - } - - // We'll evaluate this instruction. - evaluationCounts[instructionOffset]++; - - // Remember this instruction's offset with any stored value. - Value storeValue = new InstructionOffsetValue(instructionOffset); - variables.setProducerValue(storeValue); - stack.setProducerValue(storeValue); - - // Decode the instruction. - Instruction instruction = InstructionFactory.create(code, instructionOffset); - - // Reset the branch unit. - branchUnit.reset(); - - if (DEBUG) - { - System.out.println(instruction.toString(instructionOffset)); - } - - if (extraInstructionVisitor != null) - { - // Visit the instruction with the optional visitor. - instruction.accept(clazz, - method, - codeAttribute, - instructionOffset, - extraInstructionVisitor); - } - - try - { - // Process the instruction. The processor may modify the - // variables and the stack, and it may call the branch unit - // and the invocation unit. - instruction.accept(clazz, - method, - codeAttribute, - instructionOffset, - processor); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while evaluating instruction:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Instruction = "+instruction.toString(instructionOffset)); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - throw ex; - } - - // Collect the branch targets from the branch unit. - InstructionOffsetValue branchTargets = branchUnit.getTraceBranchTargets(); - int branchTargetCount = branchTargets.instructionOffsetCount(); - - if (DEBUG) - { - if (branchUnit.wasCalled()) - { - System.out.println(" is branching to "+branchTargets); - } - if (branchTargetValues[instructionOffset] != null) - { - System.out.println(" has up till now been branching to "+branchTargetValues[instructionOffset]); - } - - System.out.println(" Vars: "+variables); - System.out.println(" Stack: "+stack); - } - - // Maintain a generalized local variable frame and stack at this - // instruction offset, after execution. - if (evaluationCount == 0) - { - // First time we're passing by this instruction. - if (variablesAfter[instructionOffset] == null) - { - // There's not even a context at this index yet. - variablesAfter[instructionOffset] = new TracedVariables(variables); - stacksAfter[instructionOffset] = new TracedStack(stack); - } - else - { - // Reuse the context objects at this index. - variablesAfter[instructionOffset].initialize(variables); - stacksAfter[instructionOffset].copy(stack); - } - } - else - { - // Merge in the current context. - variablesAfter[instructionOffset].generalize(variables, true); - stacksAfter[instructionOffset].generalize(stack); - } - - // Did the branch unit get called? - if (branchUnit.wasCalled()) - { - // Accumulate the branch targets at this offset. - branchTargetValues[instructionOffset] = branchTargetValues[instructionOffset] == null ? - branchTargets : - branchTargetValues[instructionOffset].generalize(branchTargets); - - // Are there no branch targets at all? - if (branchTargetCount == 0) - { - // Exit from this code block. - break; - } - - // Accumulate the branch origins at the branch target offsets. - InstructionOffsetValue instructionOffsetValue = new InstructionOffsetValue(instructionOffset); - for (int index = 0; index < branchTargetCount; index++) - { - int branchTarget = branchTargets.instructionOffset(index); - branchOriginValues[branchTarget] = branchOriginValues[branchTarget] == null ? - instructionOffsetValue: - branchOriginValues[branchTarget].generalize(instructionOffsetValue); - } - - // Are there multiple branch targets? - if (branchTargetCount > 1) - { - // Push them on the execution stack and exit from this block. - for (int index = 0; index < branchTargetCount; index++) - { - if (DEBUG) System.out.println("Pushing alternative branch #"+index+" out of "+branchTargetCount+", from ["+instructionOffset+"] to ["+branchTargets.instructionOffset(index)+"]"); - - pushInstructionBlock(new TracedVariables(variables), - new TracedStack(stack), - branchTargets.instructionOffset(index)); - } - - break; - } - - if (DEBUG) System.out.println("Definite branch from ["+instructionOffset+"] to ["+branchTargets.instructionOffset(0)+"]"); - - // Continue at the definite branch target. - instructionOffset = branchTargets.instructionOffset(0); - } - else - { - // Just continue with the next instruction. - instructionOffset += instruction.length(instructionOffset); - } - - // Is this a subroutine invocation? - if (instruction.opcode == InstructionConstants.OP_JSR || - instruction.opcode == InstructionConstants.OP_JSR_W) - { - // Evaluate the subroutine in another partial evaluator. - evaluateSubroutine(clazz, - method, - codeAttribute, - variables, - stack, - instructionOffset); - - break; - } - else if (instruction.opcode == InstructionConstants.OP_RET) - { - // Let the partial evaluator that has called the subroutine - // handle the evaluation after the return. - pushCallingInstructionBlock(new TracedVariables(variables), - new TracedStack(stack), - instructionOffset); - break; - } - } - - if (DEBUG) System.out.println("Ending processing of instruction block starting at ["+startOffset+"]"); - } - - - /** - * Evaluates a subroutine and its exception handlers, starting at the given - * offset and ending at a subroutine return instruction. - */ - private void evaluateSubroutine(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - TracedVariables variables, - TracedStack stack, - int subroutineStart) - { - int subroutineEnd = branchTargetFinder.subroutineEnd(subroutineStart); - - if (DEBUG) System.out.println("Evaluating subroutine from "+subroutineStart+" to "+subroutineEnd); - - // Create a temporary partial evaluator, so there are no conflicts - // with variables that are alive across subroutine invocations, between - // different invocations. - PartialEvaluator subroutinePartialEvaluator = - new PartialEvaluator(this); - - subroutinePartialEvaluator.initializeArrays(codeAttribute); - - // Evaluate the subroutine. - subroutinePartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(clazz, - method, - codeAttribute, - variables, - stack, - subroutineStart, - subroutineEnd); - - // Merge back the temporary partial evaluator. This way, we'll get - // the lowest common denominator of stacks and variables. - generalize(subroutinePartialEvaluator, 0, codeAttribute.u4codeLength); - - if (DEBUG) System.out.println("Ending subroutine from "+subroutineStart+" to "+subroutineEnd); - } - - - /** - * Generalizes the results of this partial evaluator with those of another - * given partial evaluator, over a given range of instructions. - */ - private void generalize(PartialEvaluator other, - int codeStart, - int codeEnd) - { - if (DEBUG) System.out.println("Generalizing with temporary partial evaluation"); - - for (int offset = codeStart; offset < codeEnd; offset++) - { - if (other.branchOriginValues[offset] != null) - { - branchOriginValues[offset] = branchOriginValues[offset] == null ? - other.branchOriginValues[offset] : - branchOriginValues[offset].generalize(other.branchOriginValues[offset]); - } - - if (other.isTraced(offset)) - { - if (other.branchTargetValues[offset] != null) - { - branchTargetValues[offset] = branchTargetValues[offset] == null ? - other.branchTargetValues[offset] : - branchTargetValues[offset].generalize(other.branchTargetValues[offset]); - } - - if (evaluationCounts[offset] == 0) - { - variablesBefore[offset] = other.variablesBefore[offset]; - stacksBefore[offset] = other.stacksBefore[offset]; - variablesAfter[offset] = other.variablesAfter[offset]; - stacksAfter[offset] = other.stacksAfter[offset]; - generalizedContexts[offset] = other.generalizedContexts[offset]; - evaluationCounts[offset] = other.evaluationCounts[offset]; - } - else - { - variablesBefore[offset].generalize(other.variablesBefore[offset], false); - stacksBefore[offset] .generalize(other.stacksBefore[offset]); - variablesAfter[offset] .generalize(other.variablesAfter[offset], false); - stacksAfter[offset] .generalize(other.stacksAfter[offset]); - //generalizedContexts[offset] - evaluationCounts[offset] += other.evaluationCounts[offset]; - } - } - } - } - - - /** - * Evaluates the exception handlers covering and targeting the given - * instruction range in the given code. - */ - private void evaluateExceptionHandlers(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int startOffset, - int endOffset) - { - if (DEBUG) System.out.println("Evaluating exceptions covering ["+startOffset+" -> "+endOffset+"]:"); - - ExceptionHandlerFilter exceptionEvaluator = - new ExceptionHandlerFilter(startOffset, - endOffset, - this); - - // Evaluate the exception catch blocks, until their entry variables - // have stabilized. - do - { - // Reset the flag to stop evaluating. - evaluateExceptions = false; - - // Evaluate all relevant exception catch blocks once. - codeAttribute.exceptionsAccept(clazz, - method, - startOffset, - endOffset, - exceptionEvaluator); - } - while (evaluateExceptions); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - int startPC = exceptionInfo.u2startPC; - int endPC = exceptionInfo.u2endPC; - - // Do we have to evaluate this exception catch block? - if (mayThrowExceptions(clazz, method, codeAttribute, startPC, endPC)) - { - int handlerPC = exceptionInfo.u2handlerPC; - int catchType = exceptionInfo.u2catchType; - - if (DEBUG) System.out.println("Evaluating exception ["+startPC +" -> "+endPC +": "+handlerPC+"]:"); - - // Reuse the existing variables and stack objects, ensuring the - // right size. - TracedVariables variables = new TracedVariables(codeAttribute.u2maxLocals); - TracedStack stack = new TracedStack(codeAttribute.u2maxStack); - - // Initialize the trace values. - Value storeValue = new InstructionOffsetValue(handlerPC | InstructionOffsetValue.EXCEPTION_HANDLER); - variables.setProducerValue(storeValue); - stack.setProducerValue(storeValue); - - // Initialize the variables by generalizing the variables of the - // try block. Make sure to include the results of the last - // instruction for preverification. - generalizeVariables(startPC, - endPC, - evaluateAllCode, - variables); - - // Initialize the stack. - invocationUnit.enterExceptionHandler(clazz, - method, - codeAttribute, - handlerPC, - catchType, - stack); - - int evaluationCount = evaluationCounts[handlerPC]; - - // Evaluate the instructions, starting at the entry point. - evaluateInstructionBlock(clazz, - method, - codeAttribute, - variables, - stack, - handlerPC); - - // Remember to evaluate all exception handlers once more. - if (!evaluateExceptions) - { - evaluateExceptions = evaluationCount < evaluationCounts[handlerPC]; - } - } -// else if (evaluateAllCode) -// { -// if (DEBUG) System.out.println("No information for partial evaluation of exception ["+startPC +" -> "+endPC +": "+exceptionInfo.u2handlerPC+"] yet"); -// -// // We don't have any information on the try block yet, but we do -// // have to evaluate the exception handler. -// // Remember to evaluate all exception handlers once more. -// evaluateExceptions = true; -// } - else - { - if (DEBUG) System.out.println("No information for partial evaluation of exception ["+startPC +" -> "+endPC +": "+exceptionInfo.u2handlerPC+"]"); - } - } - - - // Small utility methods. - - /** - * Initializes the data structures for the variables, stack, etc. - */ - private void initializeArrays(CodeAttribute codeAttribute) - { - int newCodeLength = codeAttribute.u4codeLength; - - // Create new arrays for storing information at each instruction offset. - if (branchOriginValues.length < newCodeLength) - { - // Create new arrays. - branchOriginValues = new InstructionOffsetValue[newCodeLength]; - branchTargetValues = new InstructionOffsetValue[newCodeLength]; - variablesBefore = new TracedVariables[newCodeLength]; - stacksBefore = new TracedStack[newCodeLength]; - variablesAfter = new TracedVariables[newCodeLength]; - stacksAfter = new TracedStack[newCodeLength]; - generalizedContexts = new boolean[newCodeLength]; - evaluationCounts = new int[newCodeLength]; - } - else - { - // Reset the old arrays. - Arrays.fill(branchOriginValues, 0, codeLength, null); - Arrays.fill(branchTargetValues, 0, codeLength, null); - Arrays.fill(generalizedContexts, 0, codeLength, false); - Arrays.fill(evaluationCounts, 0, codeLength, 0); - - for (int index = 0; index < newCodeLength; index++) - { - if (variablesBefore[index] != null) - { - variablesBefore[index].reset(codeAttribute.u2maxLocals); - } - - if (stacksBefore[index] != null) - { - stacksBefore[index].reset(codeAttribute.u2maxStack); - } - - if (variablesAfter[index] != null) - { - variablesAfter[index].reset(codeAttribute.u2maxLocals); - } - - if (stacksAfter[index] != null) - { - stacksAfter[index].reset(codeAttribute.u2maxStack); - } - } - - for (int index = newCodeLength; index < codeLength; index++) - { - if (variablesBefore[index] != null) - { - variablesBefore[index].reset(0); - } - - if (stacksBefore[index] != null) - { - stacksBefore[index].reset(0); - } - - if (variablesAfter[index] != null) - { - variablesAfter[index].reset(0); - } - - if (stacksAfter[index] != null) - { - stacksAfter[index].reset(0); - } - } - } - - codeLength = newCodeLength; - } - - - /** - * Initializes the data structures for the variables, stack, etc. - */ - private void initializeParameters(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - TracedVariables variables) - { -// // Create the method parameters. -// TracedVariables parameters = new TracedVariables(codeAttribute.u2maxLocals); -// -// // Remember this instruction's offset with any stored value. -// Value storeValue = new InstructionOffsetValue(AT_METHOD_ENTRY); -// parameters.setProducerValue(storeValue); - - // Create the method parameters. - Variables parameters = new Variables(codeAttribute.u2maxLocals); - - // Initialize the method parameters. - invocationUnit.enterMethod(clazz, method, parameters); - - if (DEBUG) - { - System.out.println(" Params: "+parameters); - } - - // Initialize the variables with the parameters. - variables.initialize(parameters); - - // Set the store value of each parameter variable. We store the - // variable indices of the parameters. These parameter offsets take - // into account Category 2 types. - for (int index = 0; index < parameters.size(); index++) - { - InstructionOffsetValue producerValue = - new InstructionOffsetValue(index | InstructionOffsetValue.METHOD_PARAMETER); - - variables.setProducerValue(index, producerValue); - } - } - - - /** - * Returns whether a block of instructions may ever throw an exception. - */ - private boolean mayThrowExceptions(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int startOffset, - int endOffset) - { - for (int index = startOffset; index < endOffset; index++) - { - if (isTraced(index) && - (evaluateAllCode || - InstructionFactory.create(codeAttribute.code, index).mayThrowExceptions())) - { - return true; - } - } - - return false; - } - - - /** - * Generalize the local variable frames of a block of instructions. - */ - private void generalizeVariables(int startOffset, - int endOffset, - boolean includeAfterLastInstruction, - TracedVariables generalizedVariables) - { - boolean first = true; - int lastIndex = -1; - - // Generalize the variables before each of the instructions in the block. - for (int index = startOffset; index < endOffset; index++) - { - if (isTraced(index)) - { - TracedVariables tracedVariables = variablesBefore[index]; - - if (first) - { - // Initialize the variables with the first traced local - // variable frame. - generalizedVariables.initialize(tracedVariables); - - first = false; - } - else - { - // Generalize the variables with the traced local variable - // frame. We can't use the return value, because local - // generalization can be different a couple of times, - // with the global generalization being the same. - generalizedVariables.generalize(tracedVariables, false); - } - - lastIndex = index; - } - } - - // Generalize the variables after the last instruction in the block, - // if required. - if (includeAfterLastInstruction && - lastIndex >= 0) - { - TracedVariables tracedVariables = variablesAfter[lastIndex]; - - if (first) - { - // Initialize the variables with the local variable frame. - generalizedVariables.initialize(tracedVariables); - } - else - { - // Generalize the variables with the local variable frame. - generalizedVariables.generalize(tracedVariables, false); - } - } - - // Just clear the variables if there aren't any traced instructions - // in the block. - if (first) - { - generalizedVariables.reset(generalizedVariables.size()); - } - } - - - /** - * This class represents an instruction block that has to be executed, - * starting with a given state at a given instruction offset. - */ - private static class MyInstructionBlock - { - private TracedVariables variables; - private TracedStack stack; - private int startOffset; - - - private MyInstructionBlock(TracedVariables variables, - TracedStack stack, - int startOffset) - { - this.variables = variables; - this.stack = stack; - this.startOffset = startOffset; - } - } - - - /** - * This InstructionVisitor delegates its visits to a given - * InstructionVisitor, but only if the instruction has been traced (or not). - */ - private class MyTracedInstructionFilter implements InstructionVisitor - { - private final boolean traced; - private final InstructionVisitor instructionVisitor; - - - public MyTracedInstructionFilter(boolean traced, - InstructionVisitor instructionVisitor) - { - this.traced = traced; - this.instructionVisitor = instructionVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitSimpleInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitVariableInstruction(clazz, method, codeAttribute, offset, variableInstruction); - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitConstantInstruction(clazz, method, codeAttribute, offset, constantInstruction); - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitTableSwitchInstruction(clazz, method, codeAttribute, offset, tableSwitchInstruction); - } - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - if (shouldVisit(offset)) - { - instructionVisitor.visitLookUpSwitchInstruction(clazz, method, codeAttribute, offset, lookUpSwitchInstruction); - } - } - - - private boolean shouldVisit(int offset) - { - return isTraced(offset) == traced; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ReferenceTracingInvocationUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ReferenceTracingInvocationUnit.java deleted file mode 100644 index e3b6bf38..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ReferenceTracingInvocationUnit.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.instruction.ConstantInstruction; -import proguard.evaluation.*; -import proguard.evaluation.value.*; - -/** - * This InvocationUnit tags reference values of retrieved fields, passed method - * parameters, method return values, and caught exceptions, so they can be - * traced throughout the execution of a method. The tags are instruction offsets - * or parameter indices (not parameter offsets). - * - * @see TracedReferenceValue - * @see InstructionOffsetValue - * @author Eric Lafortune - */ -public class ReferenceTracingInvocationUnit -extends SimplifiedInvocationUnit -{ - private final SimplifiedInvocationUnit invocationUnit; - - private int offset; - - - /** - * Creates a new ReferenceTracingInvocationUnit. - * @param invocationUnit the invocation unit to which invocations will - * be delegated. - */ - public ReferenceTracingInvocationUnit(SimplifiedInvocationUnit invocationUnit) - { - this.invocationUnit = invocationUnit; - } - - - // Implementations for InvocationUnit. - - public void enterExceptionHandler(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - int catchType, - Stack stack) - { - this.offset = offset; - - super.enterExceptionHandler(clazz, - method, - codeAttribute, - offset, - catchType, - stack); - } - - - public void invokeMember(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction, Stack stack) - { - this.offset = offset; - - super.invokeMember(clazz, - method, - codeAttribute, - offset, - constantInstruction, - stack); - } - - - // Implementations for SimplifiedInvocationUnit. - - public Value getExceptionValue(Clazz clazz, - ClassConstant catchClassConstant) - { - return trace(invocationUnit.getExceptionValue(clazz, catchClassConstant), - offset | InstructionOffsetValue.EXCEPTION_HANDLER); - } - - - public void setFieldClassValue(Clazz clazz, RefConstant refConstant, ReferenceValue value) - { - invocationUnit.setFieldClassValue(clazz, refConstant, value); - } - - - public Value getFieldClassValue(Clazz clazz, RefConstant refConstant, String type) - { - return trace(invocationUnit.getFieldClassValue(clazz, refConstant, type), - offset | InstructionOffsetValue.FIELD_VALUE); - } - - - public void setFieldValue(Clazz clazz, RefConstant refConstant, Value value) - { - invocationUnit.setFieldValue(clazz, refConstant, value); - } - - - public Value getFieldValue(Clazz clazz, RefConstant refConstant, String type) - { - return trace(invocationUnit.getFieldValue(clazz, refConstant, type), - offset | InstructionOffsetValue.FIELD_VALUE); - } - - - public void setMethodParameterValue(Clazz clazz, RefConstant refConstant, int parameterIndex, Value value) - { - invocationUnit.setMethodParameterValue(clazz, refConstant, parameterIndex, value); - } - - - public Value getMethodParameterValue(Clazz clazz, Method method, int parameterIndex, String type, Clazz referencedClass) - { - Value parameterValue = - invocationUnit.getMethodParameterValue(clazz, method, parameterIndex, type, referencedClass); - - // We're attaching the parameter index as a trace value. It doesn't - // take into account Category 2 values, so it is not compatible with - // variable indices. - return trace(parameterValue, - parameterIndex | InstructionOffsetValue.METHOD_PARAMETER); - } - - - public void setMethodReturnValue(Clazz clazz, Method method, Value value) - { - invocationUnit.setMethodReturnValue(clazz, method, value); - } - - - public Value getMethodReturnValue(Clazz clazz, RefConstant refConstant, String type) - { - Value returnValue = - invocationUnit.getMethodReturnValue(clazz, refConstant, type); - - return trace(returnValue, - offset | InstructionOffsetValue.METHOD_RETURN_VALUE); - } - - - public Value getMethodReturnValue(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant, String type) - { - Value returnValue = - invocationUnit.getMethodReturnValue(clazz, invokeDynamicConstant, type); - - return trace(returnValue, - offset | InstructionOffsetValue.METHOD_RETURN_VALUE); - } - - - // Small utility methods. - - /** - * Sets or replaces the trace value on a given value, if it's a - * reference value, returning the result. - */ - protected Value trace(Value value, int trace) - { - if (value.computationalType() != Value.TYPE_REFERENCE) - { - return value; - } - - return trace(value, new InstructionOffsetValue(trace)); - } - - - /** - * Sets or replaces the trace value on a given value, returning the result. - */ - protected Value trace(Value value, InstructionOffsetValue traceValue) - { - return new TracedReferenceValue(untrace(value).referenceValue(), - traceValue); - } - - - /** - * Removes the trace value from a given value, if present, returning the - * result. - */ - private Value untrace(Value value) - { - return value instanceof TracedReferenceValue ? - ((TracedReferenceValue)value).getReferenceValue() : - value; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ReferenceTracingValueFactory.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ReferenceTracingValueFactory.java deleted file mode 100644 index ad1adb38..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/ReferenceTracingValueFactory.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.evaluation.value.*; - -/** - * This ValueFactory tags newly created reference values so they can be traced - * throughout the execution of a method. - * - * @see TracedReferenceValue - * @see InstructionOffsetValue - * @author Eric Lafortune - */ -public class ReferenceTracingValueFactory -extends SimplifiedVisitor -implements InstructionVisitor, - ValueFactory -{ - private final ValueFactory valueFactory; - private final boolean preserveTraceValueOnCasts; - - private Value traceValue; - - - /** - * Creates a new ReferenceTracingValueFactory that attaches instruction - * offset values based on being used as an instruction visitor. This - * instance preserves trace values in the {@link #cast} method. - * @param valueFactory the value factory that creates the actual values. - */ - public ReferenceTracingValueFactory(ValueFactory valueFactory) - { - this(valueFactory, true); - } - - - /** - * Creates a new ReferenceTracingValueFactory that attaches instruction - * offset values based on being used as an instruction visitor. - * @param valueFactory the value factory that creates the - * actual values. - * @param preserveTraceValueOnCasts specifies whether to preserve the - * trace value for reference values that - * are passed to the {@link #cast} method. - */ - public ReferenceTracingValueFactory(ValueFactory valueFactory, - boolean preserveTraceValueOnCasts) - { - this.valueFactory = valueFactory; - this.preserveTraceValueOnCasts = preserveTraceValueOnCasts; - } - - - public void setTraceValue(Value traceValue) - { - this.traceValue = traceValue; - } - - - /** - * Casts a given traced reference value to the given type, either keeping - * its trace value or setting a new one. - */ - public TracedReferenceValue cast(TracedReferenceValue referenceValue, - String type, - Clazz referencedClass, - boolean alwaysCast) - { - // Cast the value. - ReferenceValue castValue = - referenceValue.getReferenceValue().cast(type, - referencedClass, - valueFactory, - alwaysCast); - - // Trace it. - return new TracedReferenceValue(castValue, - preserveTraceValueOnCasts ? - referenceValue.getTraceValue() : - traceValue); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - traceValue = null; - } - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_ACONST_NULL: - case InstructionConstants.OP_NEWARRAY: - case InstructionConstants.OP_ATHROW: - traceValue = new InstructionOffsetValue(offset | InstructionOffsetValue.NEW_INSTANCE); - break; - - case InstructionConstants.OP_AALOAD: - traceValue = new InstructionOffsetValue(offset); - break; - - default: - traceValue = null; - break; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_LDC: - case InstructionConstants.OP_LDC_W: - case InstructionConstants.OP_NEW: - case InstructionConstants.OP_ANEWARRAY: - case InstructionConstants.OP_MULTIANEWARRAY: - traceValue = new InstructionOffsetValue(offset | InstructionOffsetValue.NEW_INSTANCE); - break; - - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_GETFIELD: - traceValue = new InstructionOffsetValue(offset | InstructionOffsetValue.FIELD_VALUE); - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - traceValue = new InstructionOffsetValue(offset | InstructionOffsetValue.METHOD_RETURN_VALUE); - break; - - case InstructionConstants.OP_CHECKCAST: - traceValue = new InstructionOffsetValue(offset | InstructionOffsetValue.CAST); - break; - - default: - traceValue = null; - break; - } - } - - - // Implementations for BasicValueFactory. - - public Value createValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - return trace(valueFactory.createValue(type, - referencedClass, - mayBeExtension, - mayBeNull)); - } - - - public IntegerValue createIntegerValue() - { - return valueFactory.createIntegerValue(); - } - - - public IntegerValue createIntegerValue(int value) - { - return valueFactory.createIntegerValue(value); - } - - - public LongValue createLongValue() - { - return valueFactory.createLongValue(); - } - - - public LongValue createLongValue(long value) - { - return valueFactory.createLongValue(value); - } - - - public FloatValue createFloatValue() - { - return valueFactory.createFloatValue(); - } - - - public FloatValue createFloatValue(float value) - { - return valueFactory.createFloatValue(value); - } - - - public DoubleValue createDoubleValue() - { - return valueFactory.createDoubleValue(); - } - - - public DoubleValue createDoubleValue(double value) - { - return valueFactory.createDoubleValue(value); - } - - - public ReferenceValue createReferenceValue() - { - return trace(valueFactory.createReferenceValue()); - } - - - public ReferenceValue createReferenceValueNull() - { - return trace(valueFactory.createReferenceValueNull()); - } - - - public ReferenceValue createReferenceValue(String type, - Clazz referencedClass, - boolean mayBeExtension, - boolean mayBeNull) - { - return trace(valueFactory.createReferenceValue(type, - referencedClass, - mayBeExtension, - mayBeNull)); - } - - - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength) - { - return trace(valueFactory.createArrayReferenceValue(type, referencedClass, arrayLength)); - } - - - /** - * Creates a new ReferenceValue that represents an array with elements of - * the given type, with the given length and initial element values. - */ - public ReferenceValue createArrayReferenceValue(String type, - Clazz referencedClass, - IntegerValue arrayLength, - Value elementValue) - { - return trace(valueFactory.createArrayReferenceValue(type, referencedClass, arrayLength, elementValue)); - } - - - // Small utility methods. - - /** - * Attaches the current trace value to given value, if it is a reference - * value. - */ - public Value trace(Value value) - { - return value.computationalType() == Value.TYPE_REFERENCE ? - trace(value.referenceValue()) : - value; - } - - /** - * Attaches the current trace value to given reference value. - */ - public ReferenceValue trace(ReferenceValue referenceValue) - { - return traceValue != null ? - new TracedReferenceValue(referenceValue, traceValue) : - referenceValue; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumArrayPropagator.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumArrayPropagator.java deleted file mode 100644 index 552bee96..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumArrayPropagator.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.evaluation.value.*; -import proguard.optimize.OptimizationInfoMemberFilter; -import proguard.optimize.info.*; - -/** - * This ClassVisitor propagates the value of the $VALUES field to the values() - * method in the simple enum classes that it visits. - * - * @see SimpleEnumMarker - * @author Eric Lafortune - */ -public class SimpleEnumArrayPropagator -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("enum") != null; - //*/ - - - private final MemberVisitor fieldArrayFinder = new MemberDescriptorFilter("[I", this); - private final MemberVisitor methodArrayPropagator = new OptimizationInfoMemberFilter( - new MemberDescriptorFilter("()[I", this)); - private final ValueFactory valueFactory = new ParticularValueFactory(); - - private Value array; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Find the array of the "int[] $VALUES" field. - array = null; - - programClass.fieldsAccept(fieldArrayFinder); - - if (array != null) - { - // Update the return value of the "int[] values()" method. - programClass.methodsAccept(methodArrayPropagator); - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - array = StoringInvocationUnit.getFieldValue(programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Set the array value with the found array length. We can't use - // the original array, because its elements might get overwritten. - Value propagatedArray = - valueFactory.createArrayReferenceValue("I", - null, - array.referenceValue().arrayLength(valueFactory)); - - if (DEBUG) - { - System.out.println("SimpleEnumArrayPropagator: ["+programClass.getName()+"."+programMethod.getName(programClass)+programMethod.getDescriptor(programClass)+"]: propagating ["+propagatedArray+"] as return value"); - } - - setMethodReturnValue(programMethod, propagatedArray); - } - - - // Small utility methods. - - private static void setMethodReturnValue(Method method, Value value) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setReturnValue( value); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumClassChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumClassChecker.java deleted file mode 100644 index af6f2911..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumClassChecker.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; -import proguard.optimize.OptimizationInfoClassFilter; -import proguard.optimize.info.SimpleEnumMarker; - -/** - * This ClassVisitor marks all program classes that it visits as simple enums, - * if their methods qualify. - * - * @author Eric Lafortune - */ -public class SimpleEnumClassChecker -implements ClassVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("enum") != null; - //*/ - - - private final ClassVisitor simpleEnumMarker = new OptimizationInfoClassFilter( - new SimpleEnumMarker(true)); - private final MemberVisitor virtualMemberChecker = new MemberAccessFilter(0, - ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC, - new MemberToClassVisitor( - new SimpleEnumMarker(false))); - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - public void visitProgramClass(ProgramClass programClass) - { - // Does the class have the simple enum constructor? - if (programClass.findMethod(ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT_ENUM) != null) - { - if (DEBUG) - { - System.out.println("SimpleEnumClassChecker: ["+programClass.getName()+"] is a candidate simple enum, without extra fields"); - } - - // Mark it. - simpleEnumMarker.visitProgramClass(programClass); - - // However, unmark it again if it has any non-private, non-static - // fields or methods. - programClass.fieldsAccept(virtualMemberChecker); - programClass.methodsAccept(virtualMemberChecker); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumClassSimplifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumClassSimplifier.java deleted file mode 100644 index caea0fe6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumClassSimplifier.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.optimize.info.SimpleEnumMarker; -import proguard.optimize.peephole.*; - -/** - * This ClassVisitor simplifies the classes that it visits to simple enums. - * - * @see SimpleEnumMarker - * @see MemberReferenceFixer - * @author Eric Lafortune - */ -public class SimpleEnumClassSimplifier -extends SimplifiedVisitor -implements ClassVisitor, - AttributeVisitor, - InstructionVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("enum") != null; - //*/ - - - private static final int ENUM_CLASS_NAME = InstructionSequenceReplacer.A; - private static final int ENUM_TYPE_NAME = InstructionSequenceReplacer.B; - private static final int ENUM_CONSTANT_NAME = InstructionSequenceReplacer.X; - private static final int ENUM_CONSTANT_ORDINAL = InstructionSequenceReplacer.Y; - private static final int ENUM_CONSTANT_FIELD_NAME = InstructionSequenceReplacer.Z; - - private static final int STRING_ENUM_CONSTANT_NAME = 0; - - private static final int METHOD_ENUM_INIT = 1; - private static final int FIELD_ENUM_CONSTANT = 2; - - private static final int CLASS_ENUM = 3; - - private static final int NAME_AND_TYPE_ENUM_INIT = 4; - private static final int NAME_AND_TYPE_ENUM_CONSTANT = 5; - - private static final int UTF8_INIT = 6; - private static final int UTF8_STRING_I = 7; - - - private static final Constant[] CONSTANTS = new Constant[] - { - new StringConstant(ENUM_CONSTANT_NAME, null, null), - - new MethodrefConstant(CLASS_ENUM, NAME_AND_TYPE_ENUM_INIT, null, null), - new FieldrefConstant( CLASS_ENUM, NAME_AND_TYPE_ENUM_CONSTANT, null, null), - - new ClassConstant(ENUM_CLASS_NAME, null), - - new NameAndTypeConstant(UTF8_INIT, UTF8_STRING_I), - new NameAndTypeConstant(ENUM_CONSTANT_FIELD_NAME, ENUM_TYPE_NAME), - - new Utf8Constant(ClassConstants.METHOD_NAME_INIT), - new Utf8Constant(ClassConstants.METHOD_TYPE_INIT_ENUM), - }; - - private static final Instruction[][][] INSTRUCTION_SEQUENCES = new Instruction[][][] - { - { - // Replace new Enum("name", constant) - // by constant + 1. - { - new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_ENUM), - new SimpleInstruction(InstructionConstants.OP_DUP), - new ConstantInstruction(InstructionConstants.OP_LDC, STRING_ENUM_CONSTANT_NAME), - new SimpleInstruction(InstructionConstants.OP_ICONST_0, ENUM_CONSTANT_ORDINAL), - new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_ENUM_INIT), - }, - { - new SimpleInstruction(InstructionConstants.OP_SIPUSH, ENUM_CONSTANT_ORDINAL), - new SimpleInstruction(InstructionConstants.OP_ICONST_1), - new SimpleInstruction(InstructionConstants.OP_IADD), - } - }, - { - // The name constants may have been encrypted. - // Replace (..., constant) - // by (..., 0); pop; constant + 1. - { - new SimpleInstruction(InstructionConstants.OP_ICONST_0, ENUM_CONSTANT_ORDINAL), - new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_ENUM_INIT), - }, - { - new SimpleInstruction(InstructionConstants.OP_ICONST_0), - new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_ENUM_INIT), - new SimpleInstruction(InstructionConstants.OP_POP), - new SimpleInstruction(InstructionConstants.OP_SIPUSH, ENUM_CONSTANT_ORDINAL), - new SimpleInstruction(InstructionConstants.OP_ICONST_1), - new SimpleInstruction(InstructionConstants.OP_IADD), - } - }, - }; - - private final CodeAttributeEditor codeAttributeEditor = - new CodeAttributeEditor(true, true); - - private final InstructionSequencesReplacer instructionSequenceReplacer = - new InstructionSequencesReplacer(CONSTANTS, - INSTRUCTION_SEQUENCES, - null, - codeAttributeEditor); - - private final MemberVisitor initializerSimplifier = new AllAttributeVisitor(this); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (DEBUG) - { - System.out.println("SimpleEnumClassSimplifier: ["+programClass.getName()+"]"); - } - - // Unmark the class as an enum. - programClass.u2accessFlags &= ~ClassConstants.ACC_ENUM; - - // Remove the valueOf method, if present. - Method valueOfMethod = - programClass.findMethod(ClassConstants.METHOD_NAME_VALUEOF, null); - if (valueOfMethod != null) - { - new ClassEditor(programClass).removeMethod(valueOfMethod); - } - - // Simplify the static initializer. - programClass.methodAccept(ClassConstants.METHOD_NAME_CLINIT, - ClassConstants.METHOD_TYPE_CLINIT, - initializerSimplifier); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Set up the code attribute editor. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Find the peephole changes. - codeAttribute.instructionsAccept(clazz, method, instructionSequenceReplacer); - - // Apply the peephole changes. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumDescriptorSimplifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumDescriptorSimplifier.java deleted file mode 100644 index 85ffd0b3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumDescriptorSimplifier.java +++ /dev/null @@ -1,797 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.KeepMarker; -import proguard.optimize.info.*; - -/** - * This ClassVisitor simplifies the descriptors that contain simple enums in - * the program classes that it visits. - * - * @see SimpleEnumMarker - * @see MemberReferenceFixer - * @author Eric Lafortune - */ -public class SimpleEnumDescriptorSimplifier -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor, - AttributeVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("enum") != null; - //*/ - - private static final boolean DEBUG_EXTRA = false; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (DEBUG) - { - System.out.println("SimpleEnumDescriptorSimplifier: "+programClass.getName()); - } - - // Simplify the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Simplify the attributes. - //programClass.attributesAccept(this); - - // Simplify the simple enum array constants. - programClass.constantPoolEntriesAccept(this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Does the constant refer to a simple enum type? - Clazz referencedClass = stringConstant.referencedClass; - if (isSimpleEnum(referencedClass)) - { - // Is it an array type? - String name = stringConstant.getString(clazz); - if (ClassUtil.isInternalArrayType(name)) - { - // Update the type. - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - String newName = simplifyDescriptor(name, referencedClass); - - stringConstant.u2stringIndex = - constantPoolEditor.addUtf8Constant(newName); - - // Clear the referenced class. - stringConstant.referencedClass = null; - } - } - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Update the descriptor if it has any simple enum classes. - String descriptor = invokeDynamicConstant.getType(clazz); - String newDescriptor = simplifyDescriptor(descriptor, invokeDynamicConstant.referencedClasses); - - if (!descriptor.equals(newDescriptor)) - { - // Update the descriptor. - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - invokeDynamicConstant.u2nameAndTypeIndex = - constantPoolEditor.addNameAndTypeConstant(invokeDynamicConstant.getName(clazz), - newDescriptor); - - // Update the referenced classes. - invokeDynamicConstant.referencedClasses = - simplifyReferencedClasses(descriptor, invokeDynamicConstant.referencedClasses); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Does the constant refer to a simple enum type? - Clazz referencedClass = classConstant.referencedClass; - if (isSimpleEnum(referencedClass)) - { - // Is it an array type? - String name = classConstant.getName(clazz); - if (ClassUtil.isInternalArrayType(name)) - { - // Update the type. - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - String newName = simplifyDescriptor(name, referencedClass); - - classConstant.u2nameIndex = - constantPoolEditor.addUtf8Constant(newName); - - // Clear the referenced class. - classConstant.referencedClass = null; - } - } - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - // Update the descriptor if it has any simple enum classes. - String descriptor = methodTypeConstant.getType(clazz); - String newDescriptor = simplifyDescriptor(descriptor, methodTypeConstant.referencedClasses); - - if (!descriptor.equals(newDescriptor)) - { - // Update the descriptor. - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor((ProgramClass)clazz); - - methodTypeConstant.u2descriptorIndex = - constantPoolEditor.addUtf8Constant(newDescriptor); - - // Update the referenced classes. - methodTypeConstant.referencedClasses = - simplifyReferencedClasses(descriptor, methodTypeConstant.referencedClasses); - } - } - - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Update the descriptor if it has a simple enum class. - String descriptor = programField.getDescriptor(programClass); - String newDescriptor = simplifyDescriptor(descriptor, programField.referencedClass); - - if (!descriptor.equals(newDescriptor)) - { - String name = programField.getName(programClass); - String newName = name + ClassConstants.SPECIAL_MEMBER_SEPARATOR + Long.toHexString(Math.abs((descriptor).hashCode())); - - if (DEBUG) - { - System.out.println("SimpleEnumDescriptorSimplifier: ["+programClass.getName()+"."+name+" "+descriptor + "] -> ["+newName+" "+newDescriptor+"]"); - } - - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor(programClass); - - // Update the name. - programField.u2nameIndex = - constantPoolEditor.addUtf8Constant(newName); - - // Update the descriptor itself. - programField.u2descriptorIndex = - constantPoolEditor.addUtf8Constant(newDescriptor); - - // Clear the referenced class. - programField.referencedClass = null; - - // Clear the enum flag. - programField.u2accessFlags &= ~ClassConstants.ACC_ENUM; - - // Clear the field value. - if (!KeepMarker.isKept(programField)) - { - ProgramFieldOptimizationInfo.getProgramFieldOptimizationInfo(programField).resetValue(programClass, programField); - } - - // Simplify the signature. - programField.attributesAccept(programClass, this); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { -// // Skip the valueOf method. -// if (programMethod.getName(programClass).equals(ClassConstants.METHOD_NAME_VALUEOF)) -// { -// return; -// } - - // Simplify the code, the signature, and the parameter annotations, - // before simplifying the descriptor. - programMethod.attributesAccept(programClass, this); - - // Update the descriptor if it has any simple enum classes. - String descriptor = programMethod.getDescriptor(programClass); - String newDescriptor = simplifyDescriptor(descriptor, programMethod.referencedClasses); - - if (!descriptor.equals(newDescriptor)) - { - String name = programMethod.getName(programClass); - String newName = name; - - // Append a code, if the method isn't a class instance initializer. - if (!name.equals(ClassConstants.METHOD_NAME_INIT)) - { - newName += ClassConstants.SPECIAL_MEMBER_SEPARATOR + Long.toHexString(Math.abs((descriptor).hashCode())); - } - - if (DEBUG) - { - System.out.println("SimpleEnumDescriptorSimplifier: ["+programClass.getName()+"."+name+descriptor+"] -> ["+newName+newDescriptor+"]"); - } - - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor(programClass); - - // Update the name, if necessary. - if (!newName.equals(name)) - { - programMethod.u2nameIndex = - constantPoolEditor.addUtf8Constant(newName); - } - - // Update the descriptor itself. - programMethod.u2descriptorIndex = - constantPoolEditor.addUtf8Constant(newDescriptor); - - // Update the referenced classes. - programMethod.referencedClasses = - simplifyReferencedClasses(descriptor, programMethod.referencedClasses); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Simplify the local variable descriptors. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Change the references of the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Change the references of the local variables. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - // Compute the new signature. - String signature = signatureAttribute.getSignature(clazz); - String newSignature = simplifyDescriptor(signature, - signatureAttribute.referencedClasses); - - if (!signature.equals(newSignature)) - { - // Update the signature. - signatureAttribute.u2signatureIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSignature); - - // Update the referenced classes. - signatureAttribute.referencedClasses = - simplifyReferencedClasses(signature, signatureAttribute.referencedClasses); - } - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Update the descriptor if it has a simple enum class. - String descriptor = localVariableInfo.getDescriptor(clazz); - String newDescriptor = simplifyDescriptor(descriptor, localVariableInfo.referencedClass); - - if (!descriptor.equals(newDescriptor)) - { - // Update the descriptor. - localVariableInfo.u2descriptorIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newDescriptor); - - // Clear the referenced class. - localVariableInfo.referencedClass = null; - } - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // We're only looking at the base type for now. - if (localVariableTypeInfo.referencedClasses != null && - localVariableTypeInfo.referencedClasses.length > 0) - { - // Update the signature if it has any simple enum classes. - String signature = localVariableTypeInfo.getSignature(clazz); - String newSignature = simplifyDescriptor(signature, - localVariableTypeInfo.referencedClasses[0]); - - if (!signature.equals(newSignature)) - { - // Update the signature. - localVariableTypeInfo.u2signatureIndex = - new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newSignature); - - // Clear the referenced class. - localVariableTypeInfo.referencedClasses[0] = null; - } - } - } - - - // Small utility methods. - - /** - * Returns the descriptor with simplified enum type. - */ - private String simplifyDescriptor(String descriptor, - Clazz referencedClass) - { - return isSimpleEnum(referencedClass) ? - descriptor.substring(0, ClassUtil.internalArrayTypeDimensionCount(descriptor)) + ClassConstants.TYPE_INT : - descriptor; - } - - - /** - * Returns the descriptor with simplified enum types. - */ - private String simplifyDescriptor(String descriptor, - Clazz[] referencedClasses) - { - if (referencedClasses != null) - { - if (DEBUG_EXTRA) - { - System.out.println(" Before: ["+descriptor+"]"); - } - - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(descriptor); - - int referencedClassIndex = 0; - - StringBuffer newDescriptorBuffer = - new StringBuffer(descriptor.length()); - - // Go over the formal type parameters. - if (typeEnumeration.hasFormalTypeParameters()) - { - // Consider the classes referenced by this formal type - // parameter. - String type = typeEnumeration.formalTypeParameters(); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(type); - - newDescriptorBuffer.append(classEnumeration.nextFluff()); - - // Replace any simple enum types. - while (classEnumeration.hasMoreClassNames()) - { - // Get the class. - String className = - classEnumeration.nextClassName(); - - Clazz referencedClass = - referencedClasses[referencedClassIndex++]; - - // Is this class a simple enum type? - if (isSimpleEnum(referencedClass)) - { - // Let's replace it by java.lang.Integer. - className = ClassConstants.NAME_JAVA_LANG_INTEGER; - } - - newDescriptorBuffer.append(className); - newDescriptorBuffer.append(classEnumeration.nextFluff()); - } - } - - if (typeEnumeration.isMethodSignature()) - { - newDescriptorBuffer.append(ClassConstants.METHOD_ARGUMENTS_OPEN); - } - - // Go over the main types (class types or parameter types). - while (typeEnumeration.hasMoreTypes()) - { - // Consider the classes referenced by this parameter type. - String type = typeEnumeration.nextType(); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(type); - - String firstFluff = classEnumeration.nextFluff(); - - if (classEnumeration.hasMoreClassNames()) - { - // Get the first class. - String firstClassName = - classEnumeration.nextClassName(); - - Clazz firstReferencedClass = - referencedClasses[referencedClassIndex++]; - - // Is the first class a simple enum type? - if (isSimpleEnum(firstReferencedClass)) - { - // Replace it by a primitive int, with any array - // prefix. - newDescriptorBuffer.append(type.substring(0, ClassUtil.internalArrayTypeDimensionCount(type))); - newDescriptorBuffer.append(ClassConstants.TYPE_INT); - - // Skip any other classes of this type. - classEnumeration.nextFluff(); - while (classEnumeration.hasMoreClassNames()) - { - classEnumeration.nextClassName(); - classEnumeration.nextFluff(); - - referencedClassIndex++; - } - } - else - { - newDescriptorBuffer.append(firstFluff); - newDescriptorBuffer.append(firstClassName); - newDescriptorBuffer.append(classEnumeration.nextFluff()); - - // Replace any other simple enum types. - while (classEnumeration.hasMoreClassNames()) - { - // Get the class. - String className = - classEnumeration.nextClassName(); - - Clazz referencedClass = - referencedClasses[referencedClassIndex++]; - - // Is this class a simple enum type? - if (isSimpleEnum(referencedClass)) - { - // Let's replace it by java.lang.Integer. - className = ClassConstants.NAME_JAVA_LANG_INTEGER; - } - - newDescriptorBuffer.append(className); - newDescriptorBuffer.append(classEnumeration.nextFluff()); - } - } - } - else - { - newDescriptorBuffer.append(firstFluff); - } - } - - if (typeEnumeration.isMethodSignature()) - { - newDescriptorBuffer.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); - - // Consider the classes referenced by the return type. - String type = typeEnumeration.returnType(); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(type); - - String firstFluff = classEnumeration.nextFluff(); - - if (classEnumeration.hasMoreClassNames()) - { - // Get the first class. - String firstClassName = - classEnumeration.nextClassName(); - - Clazz firstReferencedClass = - referencedClasses[referencedClassIndex++]; - - // Is the first class a simple enum type? - if (isSimpleEnum(firstReferencedClass)) - { - // Replace it by a primitive int, with any array - // prefix. - newDescriptorBuffer.append(type.substring(0, ClassUtil.internalArrayTypeDimensionCount(type))); - newDescriptorBuffer.append(ClassConstants.TYPE_INT); - } - else - { - newDescriptorBuffer.append(firstFluff); - newDescriptorBuffer.append(firstClassName); - newDescriptorBuffer.append(classEnumeration.nextFluff()); - - // Replace any other simple enum types. - while (classEnumeration.hasMoreClassNames()) - { - // Get the class. - String className = - classEnumeration.nextClassName(); - - Clazz referencedClass = - referencedClasses[referencedClassIndex++]; - - // Is this class a simple enum type? - if (isSimpleEnum(referencedClass)) - { - // Let's replace it by java.lang.Integer. - className = ClassConstants.NAME_JAVA_LANG_INTEGER; - } - - newDescriptorBuffer.append(className); - newDescriptorBuffer.append(classEnumeration.nextFluff()); - } - } - } - else - { - newDescriptorBuffer.append(firstFluff); - } - } - - descriptor = newDescriptorBuffer.toString(); - - if (DEBUG_EXTRA) - { - System.out.println(" After: ["+descriptor+"]"); - } - } - - return descriptor; - } - - - /** - * Returns the simplified and shrunk array of referenced classes for the - * given descriptor. - */ - private Clazz[] simplifyReferencedClasses(String descriptor, - Clazz[] referencedClasses) - { - if (referencedClasses != null) - { - if (DEBUG_EXTRA) - { - System.out.print(" Referenced before:"); - for (int index = 0; index < referencedClasses.length; index++) - { - System.out.print(" ["+(referencedClasses[index] == null ? null : referencedClasses[index].getName())+"]"); - } - System.out.println(); - } - - InternalTypeEnumeration typeEnumeration = - new InternalTypeEnumeration(descriptor); - - int referencedClassIndex = 0; - int newReferencedClassIndex = 0; - - // Go over the formal type parameters. - if (typeEnumeration.hasFormalTypeParameters()) - { - // Consider the classes referenced by this formal type - // parameter. - String type = typeEnumeration.formalTypeParameters(); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(type); - - classEnumeration.nextFluff(); - - // Replace any simple enum types. - while (classEnumeration.hasMoreClassNames()) - { - // Get the class. - classEnumeration.nextClassName(); - classEnumeration.nextFluff(); - - Clazz referencedClass = - referencedClasses[referencedClassIndex++]; - - // Clear the referenced class if it is a simple - // enum type (now java.lang.Integer). - referencedClasses[newReferencedClassIndex++] = - isSimpleEnum(referencedClass) ? null : referencedClass; - } - } - - // Go over the main types (class types or parameter types). - while (typeEnumeration.hasMoreTypes()) - { - // Consider the classes referenced by this parameter type. - String type = typeEnumeration.nextType(); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(type); - - classEnumeration.nextFluff(); - - if (classEnumeration.hasMoreClassNames()) - { - // Get the first class. - classEnumeration.nextClassName(); - classEnumeration.nextFluff(); - - Clazz firstReferencedClass = - referencedClasses[referencedClassIndex++]; - - // Is the first class a simple enum type? - if (isSimpleEnum(firstReferencedClass)) - { - // Replace it by a primitive int. - - // Skip any other classes of this type. - classEnumeration.nextFluff(); - while (classEnumeration.hasMoreClassNames()) - { - classEnumeration.nextClassName(); - classEnumeration.nextFluff(); - - referencedClassIndex++; - } - } - else - { - referencedClasses[newReferencedClassIndex++] = - firstReferencedClass; - - // Replace any other simple enum types. - while (classEnumeration.hasMoreClassNames()) - { - // Get the class. - classEnumeration.nextClassName(); - classEnumeration.nextFluff(); - - Clazz referencedClass = - referencedClasses[referencedClassIndex++]; - - // Clear the referenced class if it is a simple - // enum type (now java.lang.Integer). - referencedClasses[newReferencedClassIndex++] = - isSimpleEnum(referencedClass) ? null : referencedClass; - } - } - } - } - - if (typeEnumeration.isMethodSignature()) - { - // Consider the classes referenced by the return type. - String type = typeEnumeration.returnType(); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(type); - - classEnumeration.nextFluff(); - - if (classEnumeration.hasMoreClassNames()) - { - // Get the first class. - classEnumeration.nextClassName(); - classEnumeration.nextFluff(); - - Clazz firstReferencedClass = - referencedClasses[referencedClassIndex++]; - - // Is the first class a simple enum type? - if (isSimpleEnum(firstReferencedClass)) - { - // Replace it by a primitive int. - // Clear all remaining referenced classes. - } - else - { - referencedClasses[newReferencedClassIndex++] = - firstReferencedClass; - - // Replace any other simple enum types. - while (classEnumeration.hasMoreClassNames()) - { - // Get the class. - classEnumeration.nextClassName(); - classEnumeration.nextFluff(); - - Clazz referencedClass = - referencedClasses[referencedClassIndex++]; - - // Clear the referenced class if it is a simple - // enum type (now java.lang.Integer). - referencedClasses[newReferencedClassIndex++] = - isSimpleEnum(referencedClass) ? null : referencedClass; - } - } - } - } - - // Shrink the array to the proper size. - if (newReferencedClassIndex == 0) - { - referencedClasses = null; - } - else if (newReferencedClassIndex < referencedClassIndex) - { - Clazz[] newReferencedClasses = new Clazz[newReferencedClassIndex]; - System.arraycopy(referencedClasses, 0, - newReferencedClasses, 0, - newReferencedClassIndex); - - referencedClasses = newReferencedClasses; - - if (DEBUG_EXTRA) - { - System.out.print(" Referenced after: "); - for (int index = 0; index < referencedClasses.length; index++) - { - System.out.print(" ["+(referencedClasses[index] == null ? null : referencedClasses[index].getName())+"]"); - } - System.out.println(); - } - } - } - - return referencedClasses; - } - - - /** - * Returns whether the given class is not null and a simple enum class. - */ - private boolean isSimpleEnum(Clazz clazz) - { - return clazz != null && - SimpleEnumMarker.isSimpleEnum(clazz); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumUseChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumUseChecker.java deleted file mode 100644 index bb06134f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumUseChecker.java +++ /dev/null @@ -1,767 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.OptimizationInfoClassFilter; -import proguard.optimize.info.SimpleEnumMarker; - -/** - * This ClassVisitor marks enums that can't be simplified due to the way they - * are used in the classes that it visits. - * - * @see SimpleEnumMarker - * @author Eric Lafortune - */ -public class SimpleEnumUseChecker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - ParameterVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("enum") != null; - //*/ - - private final PartialEvaluator partialEvaluator; - private final MemberVisitor methodCodeChecker = new AllAttributeVisitor(this); - private final ConstantVisitor invokedMethodChecker = new ReferencedMemberVisitor(this); - private final ConstantVisitor parameterChecker = new ReferencedMemberVisitor(new AllParameterVisitor(false, this)); - private final ClassVisitor complexEnumMarker = new OptimizationInfoClassFilter(new SimpleEnumMarker(false)); - private final ReferencedClassVisitor referencedComplexEnumMarker = new ReferencedClassVisitor(complexEnumMarker); - - - // Fields acting as parameters and return values for the visitor methods. - private int invocationOffset; - - - /** - * Creates a new SimpleEnumUseSimplifier. - */ - public SimpleEnumUseChecker() - { - this(new PartialEvaluator(new TypedReferenceValueFactory())); - } - - - /** - * Creates a new SimpleEnumUseChecker. - * @param partialEvaluator the partial evaluator that will execute the code - * and provide information about the results. - */ - public SimpleEnumUseChecker(PartialEvaluator partialEvaluator) - { - this.partialEvaluator = partialEvaluator; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if ((programClass.getAccessFlags() & ClassConstants.ACC_ANNOTATION) != 0) - { - // Unmark the simple enum classes in annotations. - programClass.methodsAccept(referencedComplexEnumMarker); - } - else - { - // Unmark the simple enum classes that are used in a complex way. - programClass.methodsAccept(methodCodeChecker); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Evaluate the method. - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - - int codeLength = codeAttribute.u4codeLength; - - // Check all traced instructions. - for (int offset = 0; offset < codeLength; offset++) - { - if (partialEvaluator.isTraced(offset)) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - - instruction.accept(clazz, method, codeAttribute, offset, this); - - // Check generalized stacks and variables at branch targets. - if (partialEvaluator.isBranchOrExceptionTarget(offset)) - { - checkMixedStackEntriesBefore(offset); - - checkMixedVariablesBefore(offset); - } - } - } - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_AASTORE: - { - // Check if the instruction is storing a simple enum in a - // more general array. - if (!isPoppingSimpleEnumType(offset, 2)) - { - if (DEBUG) - { - if (isPoppingSimpleEnumType(offset)) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] stores enum ["+ - partialEvaluator.getStackBefore(offset).getTop(0).referenceValue().getType()+"] in more general array ["+ - partialEvaluator.getStackBefore(offset).getTop(2).referenceValue().getType()+"]"); - } - } - - markPoppedComplexEnumType(offset); - } - break; - } - case InstructionConstants.OP_ARETURN: - { - // Check if the instruction is returning a simple enum as a - // more general type. - if (!isReturningSimpleEnumType(clazz, method)) - { - if (DEBUG) - { - if (isPoppingSimpleEnumType(offset)) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] returns enum [" + - partialEvaluator.getStackBefore(offset).getTop(0).referenceValue().getType()+"] as more general type"); - } - } - - markPoppedComplexEnumType(offset); - } - break; - } - case InstructionConstants.OP_MONITORENTER: - case InstructionConstants.OP_MONITOREXIT: - { - // Make sure the popped type is not a simple enum type. - if (DEBUG) - { - if (isPoppingSimpleEnumType(offset)) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] uses enum ["+ - partialEvaluator.getStackBefore(offset).getTop(0).referenceValue().getType()+"] as monitor"); - } - } - - markPoppedComplexEnumType(offset); - - break; - } - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_PUTSTATIC: - case InstructionConstants.OP_PUTFIELD: - { - // Check if the instruction is generalizing a simple enum to a - // different type. - invocationOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - parameterChecker); - break; - } - case InstructionConstants.OP_INVOKEVIRTUAL: - { - // Check if the instruction is calling a simple enum. - String invokedMethodName = - clazz.getRefName(constantInstruction.constantIndex); - String invokedMethodType = - clazz.getRefType(constantInstruction.constantIndex); - int stackEntryIndex = - ClassUtil.internalMethodParameterSize(invokedMethodType); - if (isPoppingSimpleEnumType(offset, stackEntryIndex) && - !isSupportedMethod(invokedMethodName, - invokedMethodType)) - { - if (DEBUG) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] calls ["+partialEvaluator.getStackBefore(offset).getTop(stackEntryIndex).referenceValue().getType()+"."+invokedMethodName+"]"); - } - - markPoppedComplexEnumType(offset, stackEntryIndex); - } - - // Check if any of the parameters is generalizing a simple - // enum to a different type. - invocationOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - parameterChecker); - break; - } - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - { - // Check if it is calling a method that we can't simplify. - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - invokedMethodChecker); - - // Check if any of the parameters is generalizing a simple - // enum to a different type. - invocationOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - parameterChecker); - break; - } - case InstructionConstants.OP_CHECKCAST: - case InstructionConstants.OP_INSTANCEOF: - { - // Check if the instruction is popping a different type. - if (!isPoppingExpectedType(offset, - clazz, - constantInstruction.constantIndex)) - { - if (DEBUG) - { - if (isPoppingSimpleEnumType(offset)) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] is casting or checking ["+ - partialEvaluator.getStackBefore(offset).getTop(0).referenceValue().getType()+"] as ["+ - clazz.getClassName(constantInstruction.constantIndex)+"]"); - } - } - - // Make sure the popped type is not a simple enum type. - markPoppedComplexEnumType(offset); - - // Make sure the checked type is not a simple enum type. - // Casts in values() and valueOf(String) are ok. - if (constantInstruction.opcode != InstructionConstants.OP_CHECKCAST || - !isSimpleEnum(clazz) || - (method.getAccessFlags() & ClassConstants.ACC_STATIC) == 0 || - !isMethodSkippedForCheckcast(method.getName(clazz), - method.getDescriptor(clazz))) - { - if (DEBUG) - { - if (isSimpleEnum(((ClassConstant)((ProgramClass)clazz).getConstant(constantInstruction.constantIndex)).referencedClass)) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] is casting or checking ["+ - partialEvaluator.getStackBefore(offset).getTop(0).referenceValue().getType()+"] as ["+ - clazz.getClassName(constantInstruction.constantIndex)+"]"); - } - } - - markConstantComplexEnumType(clazz, constantInstruction.constantIndex); - } - } - break; - } - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - switch (branchInstruction.opcode) - { - case InstructionConstants.OP_IFACMPEQ: - case InstructionConstants.OP_IFACMPNE: - { - // Check if the instruction is comparing different types. - if (!isPoppingIdenticalTypes(offset, 0, 1)) - { - if (DEBUG) - { - if (isPoppingSimpleEnumType(offset, 0)) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] compares ["+partialEvaluator.getStackBefore(offset).getTop(0).referenceValue().getType()+"] to plain type"); - } - - if (isPoppingSimpleEnumType(offset, 1)) - { - System.out.println("SimpleEnumUseChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] compares ["+partialEvaluator.getStackBefore(offset).getTop(1).referenceValue().getType()+"] to plain type"); - } - } - - // Make sure the first popped type is not a simple enum type. - markPoppedComplexEnumType(offset, 0); - - // Make sure the second popped type is not a simple enum type. - markPoppedComplexEnumType(offset, 1); - } - break; - } - } - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - } - - - // Implementations for MemberVisitor. - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (isSimpleEnum(programClass) && - isUnsupportedMethod(programMethod.getName(programClass), - programMethod.getDescriptor(programClass))) - { - if (DEBUG) - { - System.out.println("SimpleEnumUseChecker: invocation of ["+programClass.getName()+"."+programMethod.getName(programClass)+programMethod.getDescriptor(programClass)+"]"); - } - - complexEnumMarker.visitProgramClass(programClass); - } - } - - - // Implementations for ParameterVisitor. - - public void visitParameter(Clazz clazz, Member member, int parameterIndex, int parameterCount, int parameterOffset, int parameterSize, String parameterType, Clazz referencedClass) - { - // Check if the parameter is passing a simple enum as a more general - // type. - int stackEntryIndex = parameterSize - parameterOffset - 1; - if (ClassUtil.isInternalClassType(parameterType) && - !isPoppingExpectedType(invocationOffset, stackEntryIndex, - ClassUtil.isInternalArrayType(parameterType) ? - parameterType : - ClassUtil.internalClassNameFromClassType(parameterType))) - { - if (DEBUG) - { - ReferenceValue poppedValue = - partialEvaluator.getStackBefore(invocationOffset).getTop(stackEntryIndex).referenceValue(); - if (isSimpleEnumType(poppedValue)) - { - System.out.println("SimpleEnumUseChecker: ["+poppedValue.getType()+"] "+ - (member instanceof Field ? - ("is stored as more general type ["+parameterType+"] in field ["+clazz.getName()+"."+member.getName(clazz)+"]") : - ("is passed as more general argument #"+parameterIndex+" ["+parameterType+"] to ["+clazz.getName()+"."+member.getName(clazz)+"]"))); - } - } - - // Make sure the popped type is not a simple enum type. - markPoppedComplexEnumType(invocationOffset, stackEntryIndex); - } - } - - - // Small utility methods. - - /** - * Returns whether the specified enum method is supported for simple enums. - */ - private boolean isSupportedMethod(String name, String type) - { - return name.equals(ClassConstants.METHOD_NAME_ORDINAL) && - type.equals(ClassConstants.METHOD_TYPE_ORDINAL) || - - name.equals(ClassConstants.METHOD_NAME_CLONE) && - type.equals(ClassConstants.METHOD_TYPE_CLONE); - } - - - /** - * Returns whether the specified enum method is unsupported for simple enums. - */ - private boolean isUnsupportedMethod(String name, String type) - { - return name.equals(ClassConstants.METHOD_NAME_VALUEOF); - } - - - /** - * Returns whether the specified enum method shall be skipped when - * analyzing checkcast instructions. - */ - private boolean isMethodSkippedForCheckcast(String name, String type) - { - return name.equals(ClassConstants.METHOD_NAME_VALUEOF) || - name.equals(ClassConstants.METHOD_NAME_VALUES); - } - - - /** - * Unmarks simple enum classes that are mixed with incompatible reference - * types in the stack before the given instruction offset. - */ - private void checkMixedStackEntriesBefore(int offset) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(offset); - - // Check all stack entries. - int stackSize = stackBefore.size(); - - for (int stackEntryIndex = 0; stackEntryIndex < stackSize; stackEntryIndex++) - { - // Check reference entries. - Value stackEntry = stackBefore.getBottom(stackEntryIndex); - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - // Check reference entries with multiple producers. - InstructionOffsetValue producerOffsets = - stackBefore.getBottomActualProducerValue(stackEntryIndex).instructionOffsetValue(); - - int producerCount = producerOffsets.instructionOffsetCount(); - if (producerCount > 1) - { - // Is the consumed stack entry not a simple enum? - ReferenceValue consumedStackEntry = - stackEntry.referenceValue(); - - if (!isSimpleEnumType(consumedStackEntry)) - { - // Check all producers. - for (int producerIndex = 0; producerIndex < producerCount; producerIndex++) - { - if (!producerOffsets.isExceptionHandler(producerIndex)) - { - int producerOffset = - producerOffsets.instructionOffset(producerIndex); - - if (DEBUG) - { - ReferenceValue producedValue = - partialEvaluator.getStackAfter(producerOffset).getTop(0).referenceValue(); - if (isSimpleEnumType(producedValue)) - { - System.out.println("SimpleEnumUseChecker: ["+producedValue.getType()+"] mixed with general type on stack"); - } - } - - // Make sure the produced stack entry isn't a - // simple enum either. - markPushedComplexEnumType(producerOffset); - } - } - } - } - } - } - } - - - /** - * Unmarks simple enum classes that are mixed with incompatible reference - * types in the variables before the given instruction offset. - */ - private void checkMixedVariablesBefore(int offset) - { - TracedVariables variablesBefore = - partialEvaluator.getVariablesBefore(offset); - - // Check all variables. - int variablesSize = variablesBefore.size(); - - for (int variableIndex = 0; variableIndex < variablesSize; variableIndex++) - { - // Check reference variables. - Value variable = variablesBefore.getValue(variableIndex); - if (variable != null && - variable.computationalType() == Value.TYPE_REFERENCE) - { - // Check reference variables with multiple producers. - InstructionOffsetValue producerOffsets = - variablesBefore.getProducerValue(variableIndex).instructionOffsetValue(); - - int producerCount = producerOffsets.instructionOffsetCount(); - if (producerCount > 1) - { - // Is the consumed variable not a simple enum? - ReferenceValue consumedVariable = - variable.referenceValue(); - - if (!isSimpleEnumType(consumedVariable)) - { - // Check all producers. - for (int producerIndex = 0; producerIndex < producerCount; producerIndex++) - { - if (!producerOffsets.isMethodParameter(producerIndex)) - { - int producerOffset = - producerOffsets.instructionOffset(producerIndex); - - if (DEBUG) - { - ReferenceValue producedValue = - partialEvaluator.getVariablesAfter(producerOffset).getValue(variableIndex).referenceValue(); - if (isSimpleEnumType(producedValue)) - { - System.out.println("SimpleEnumUseChecker: ["+producedValue.getType()+"] mixed with general type in variables"); - } - } - - // Make sure the stored variable entry isn't a - // simple enum either. - markStoredComplexEnumType(producerOffset, variableIndex); - } - } - } - } - } - } - } - - - /** - * Returns whether the instruction at the given offset is popping two - * identical reference types. - */ - private boolean isPoppingIdenticalTypes(int offset, - int stackEntryIndex1, - int stackEntryIndex2) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(offset); - - String type1 = - stackBefore.getTop(stackEntryIndex1).referenceValue().getType(); - String type2 = - stackBefore.getTop(stackEntryIndex2).referenceValue().getType(); - - return type1 == null ? type2 == null : type1.equals(type2); - } - - - /** - * Returns whether the instruction at the given offset is popping exactly - * the reference type of the specified class constant. - */ - private boolean isPoppingExpectedType(int offset, - Clazz clazz, - int constantIndex) - { - return isPoppingExpectedType(offset, 0, clazz, constantIndex); - } - - - /** - * Returns whether the instruction at the given offset is popping exactly - * the reference type of the specified class constant. - */ - private boolean isPoppingExpectedType(int offset, - int stackEntryIndex, - Clazz clazz, - int constantIndex) - { - return isPoppingExpectedType(offset, - stackEntryIndex, - clazz.getClassName(constantIndex)); - } - - - /** - * Returns whether the instruction at the given offset is popping exactly - * the given reference type. - */ - private boolean isPoppingExpectedType(int offset, - int stackEntryIndex, - String expectedType) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(offset); - - String poppedType = - stackBefore.getTop(stackEntryIndex).referenceValue().getType(); - - return expectedType.equals(poppedType); - } - - - /** - * Returns whether the given method is returning a simple enum type. - * This includes simple enum arrays. - */ - private boolean isReturningSimpleEnumType(Clazz clazz, Method method) - { - String descriptor = method.getDescriptor(clazz); - String returnType = ClassUtil.internalMethodReturnType(descriptor); - - if (ClassUtil.isInternalClassType(returnType)) - { - Clazz[] referencedClasses = - ((ProgramMethod)method).referencedClasses; - - if (referencedClasses != null) - { - Clazz referencedClass = - referencedClasses[referencedClasses.length - 1]; - - return isSimpleEnum(referencedClass); - } - } - - return false; - } - - - /** - * Returns whether the instruction at the given offset is popping a type - * with a simple enum class. This includes simple enum arrays. - */ - private boolean isPoppingSimpleEnumType(int offset) - { - return isPoppingSimpleEnumType(offset, 0); - } - - - /** - * Returns whether the instruction at the given offset is popping a type - * with a simple enum class. This includes simple enum arrays. - */ - private boolean isPoppingSimpleEnumType(int offset, int stackEntryIndex) - { - ReferenceValue referenceValue = - partialEvaluator.getStackBefore(offset).getTop(stackEntryIndex).referenceValue(); - - return isSimpleEnumType(referenceValue); - } - - - /** - * Returns whether the given value is a simple enum type. This includes - * simple enum arrays. - */ - private boolean isSimpleEnumType(ReferenceValue referenceValue) - { - return isSimpleEnum(referenceValue.getReferencedClass()); - } - - - /** - * Returns whether the given class is not null and a simple enum class. - */ - private boolean isSimpleEnum(Clazz clazz) - { - return clazz != null && - SimpleEnumMarker.isSimpleEnum(clazz); - } - - - /** - * Marks the enum class of the popped type as complex. - */ - private void markConstantComplexEnumType(Clazz clazz, int constantIndex) - { - clazz.constantPoolEntryAccept(constantIndex, - referencedComplexEnumMarker); - } - - - /** - * Marks the enum class of the popped type as complex. - */ - private void markPoppedComplexEnumType(int offset) - { - markPoppedComplexEnumType(offset, 0); - } - - - /** - * Marks the enum class of the specified popped type as complex. - */ - private void markPoppedComplexEnumType(int offset, int stackEntryIndex) - { - ReferenceValue referenceValue = - partialEvaluator.getStackBefore(offset).getTop(stackEntryIndex).referenceValue(); - - markComplexEnumType(referenceValue); - } - - - /** - * Marks the enum class of the specified pushed type as complex. - */ - private void markPushedComplexEnumType(int offset) - { - ReferenceValue referenceValue = - partialEvaluator.getStackAfter(offset).getTop(0).referenceValue(); - - markComplexEnumType(referenceValue); - } - - - /** - * Marks the enum class of the specified stored type as complex. - */ - private void markStoredComplexEnumType(int offset, int variableIndex) - { - ReferenceValue referenceValue = - partialEvaluator.getVariablesAfter(offset).getValue(variableIndex).referenceValue(); - - markComplexEnumType(referenceValue); - } - - - /** - * Marks the enum class of the specified value as complex. - */ - private void markComplexEnumType(ReferenceValue referenceValue) - { - Clazz clazz = referenceValue.getReferencedClass(); - if (clazz != null) - { - clazz.accept(complexEnumMarker); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumUseSimplifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumUseSimplifier.java deleted file mode 100644 index 340faf30..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/SimpleEnumUseSimplifier.java +++ /dev/null @@ -1,822 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.value.*; -import proguard.optimize.info.SimpleEnumMarker; - -/** - * This AttributeVisitor simplifies the use of enums in the code attributes that - * it visits. - * - * @see SimpleEnumMarker - * @see MemberReferenceFixer - * @author Eric Lafortune - */ -public class SimpleEnumUseSimplifier -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - ParameterVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("enum") != null; - //*/ - - - private final InstructionVisitor extraInstructionVisitor; - - private final PartialEvaluator partialEvaluator; - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(true, true); - private final ConstantVisitor nullParameterFixer = new ReferencedMemberVisitor(new AllParameterVisitor(false, this)); - - // Fields acting as parameters and return values for the visitor methods. - private Clazz invocationClazz; - private Method invocationMethod; - private CodeAttribute invocationCodeAttribute; - private int invocationOffset; - private boolean isSimpleEnum; - - - /** - * Creates a new SimpleEnumUseSimplifier. - */ - public SimpleEnumUseSimplifier() - { - this(new PartialEvaluator(new TypedReferenceValueFactory()), null); - } - - - /** - * Creates a new SimpleEnumDescriptorSimplifier. - * @param partialEvaluator the partial evaluator that will - * execute the code and provide - * information about the results. - * @param extraInstructionVisitor an optional extra visitor for all - * simplified instructions. - */ - public SimpleEnumUseSimplifier(PartialEvaluator partialEvaluator, - InstructionVisitor extraInstructionVisitor) - { - this.partialEvaluator = partialEvaluator; - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("SimpleEnumUseSimplifier: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - // Skip the non-static methods of simple enum classes. - if (SimpleEnumMarker.isSimpleEnum(clazz) && - (method.getAccessFlags() & ClassConstants.ACC_STATIC) == 0) - { - return; - } - - // Evaluate the method. - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - - int codeLength = codeAttribute.u4codeLength; - - // Reset the code changes. - codeAttributeEditor.reset(codeLength); - - // Replace any instructions that can be simplified. - for (int offset = 0; offset < codeLength; offset++) - { - if (partialEvaluator.isTraced(offset)) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, - offset); - - instruction.accept(clazz, method, codeAttribute, offset, this); - } - } - - // Apply all accumulated changes to the code. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_AALOAD: - { - if (isPushingSimpleEnum(offset)) - { - // Load a simple enum integer from an integer array. - replaceInstruction(clazz, - offset, - simpleInstruction, - new SimpleInstruction( - InstructionConstants.OP_IALOAD)); - } - break; - } - case InstructionConstants.OP_AASTORE: - { - if (isPoppingSimpleEnumArray(offset, 2)) - { - // Store a simple enum integer in an integer array. - replaceInstruction(clazz, - offset, - simpleInstruction, - new SimpleInstruction(InstructionConstants.OP_IASTORE)); - - // Replace any producers of null constants. - replaceNullStackEntryProducers(clazz, method, codeAttribute, offset); - } - break; - } - case InstructionConstants.OP_ARETURN: - { - if (isReturningSimpleEnum(clazz, method)) - { - // Return a simple enum integer instead of an enum. - replaceInstruction(clazz, - offset, - simpleInstruction, - new SimpleInstruction(InstructionConstants.OP_IRETURN)); - - // Replace any producers of null constants. - replaceNullStackEntryProducers(clazz, method, codeAttribute, offset); - } - break; - } - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - int variableIndex = variableInstruction.variableIndex; - - switch (variableInstruction.opcode) - { - case InstructionConstants.OP_ALOAD: - case InstructionConstants.OP_ALOAD_0: - case InstructionConstants.OP_ALOAD_1: - case InstructionConstants.OP_ALOAD_2: - case InstructionConstants.OP_ALOAD_3: - { - if (isPushingSimpleEnum(offset)) - { - // Load a simple enum integer instead of an enum. - replaceInstruction(clazz, - offset, - variableInstruction, - new VariableInstruction(InstructionConstants.OP_ILOAD, - variableIndex)); - - // Replace any producers of null constants. - replaceNullVariableProducers(clazz, - method, - codeAttribute, - offset, - variableIndex); - } - break; - } - case InstructionConstants.OP_ASTORE: - case InstructionConstants.OP_ASTORE_0: - case InstructionConstants.OP_ASTORE_1: - case InstructionConstants.OP_ASTORE_2: - case InstructionConstants.OP_ASTORE_3: - { - if (!partialEvaluator.isSubroutineStart(offset) && - isPoppingSimpleEnum(offset)) - { - // Store a simple enum integer instead of an enum. - replaceInstruction(clazz, - offset, - variableInstruction, - new VariableInstruction(InstructionConstants.OP_ISTORE, - variableIndex)); - - // Replace any producers of null constants. - replaceNullStackEntryProducers(clazz, method, codeAttribute, offset); - } - break; - } - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_PUTSTATIC: - case InstructionConstants.OP_PUTFIELD: - { - // Replace any producers of null constants. - invocationClazz = clazz; - invocationMethod = method; - invocationCodeAttribute = codeAttribute; - invocationOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - nullParameterFixer); - break; - } - case InstructionConstants.OP_INVOKEVIRTUAL: - { - // Check if the instruction is calling a simple enum. - String invokedMethodName = - clazz.getRefName(constantInstruction.constantIndex); - String invokedMethodType = - clazz.getRefType(constantInstruction.constantIndex); - int stackEntryIndex = - ClassUtil.internalMethodParameterSize(invokedMethodType); - if (isPoppingSimpleEnum(offset, stackEntryIndex)) - { - replaceSupportedMethod(clazz, - offset, - constantInstruction, - invokedMethodName, - invokedMethodType); - } - - // Fall through to check the parameters. - } - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - { - // Replace any producers of null constants. - invocationClazz = clazz; - invocationMethod = method; - invocationCodeAttribute = codeAttribute; - invocationOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - nullParameterFixer); - break; - } - case InstructionConstants.OP_ANEWARRAY: - { - int constantIndex = constantInstruction.constantIndex; - - if (isReferencingSimpleEnum(clazz, constantIndex) && - !ClassUtil.isInternalArrayType(clazz.getClassName(constantIndex))) - { - // Create an integer array instead of an enum array. - replaceInstruction(clazz, - offset, - constantInstruction, - new SimpleInstruction(InstructionConstants.OP_NEWARRAY, - InstructionConstants.ARRAY_T_INT)); - } - break; - } - case InstructionConstants.OP_CHECKCAST: - { - if (isPoppingSimpleEnum(offset)) - { - // Enum classes can only be simple if the checkcast - // succeeds, so we can delete it. - deleteInstruction(clazz, - offset, - constantInstruction); - - // Replace any producers of null constants. - replaceNullStackEntryProducers(clazz, method, codeAttribute, offset); - } - break; - } - case InstructionConstants.OP_INSTANCEOF: - { - if (isPoppingSimpleEnum(offset)) - { - // Enum classes can only be simple if the instanceof - // succeeds, so we can push a constant result. - replaceInstruction(clazz, - offset, - constantInstruction, - new SimpleInstruction(InstructionConstants.OP_ICONST_1)); - - // Replace any producers of null constants. - replaceNullStackEntryProducers(clazz, method, codeAttribute, offset); - } - break; - } - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - switch (branchInstruction.opcode) - { - case InstructionConstants.OP_IFACMPEQ: - { - if (isPoppingSimpleEnum(offset)) - { - // Compare simple enum integers instead of enums. - replaceInstruction(clazz, - offset, - branchInstruction, - new BranchInstruction(InstructionConstants.OP_IFICMPEQ, - branchInstruction.branchOffset)); - } - break; - } - case InstructionConstants.OP_IFACMPNE: - { - if (isPoppingSimpleEnum(offset)) - { - // Compare simple enum integers instead of enums. - replaceInstruction(clazz, - offset, - branchInstruction, - new BranchInstruction(InstructionConstants.OP_IFICMPNE, - branchInstruction.branchOffset)); - } - break; - } - case InstructionConstants.OP_IFNULL: - { - if (isPoppingSimpleEnum(offset)) - { - // Compare with 0 instead of null. - replaceInstruction(clazz, - offset, - branchInstruction, - new BranchInstruction( - InstructionConstants.OP_IFEQ, - branchInstruction.branchOffset)); - } - break; - } - case InstructionConstants.OP_IFNONNULL: - { - if (isPoppingSimpleEnum(offset)) - { - // Compare with 0 instead of null. - replaceInstruction(clazz, - offset, - branchInstruction, - new BranchInstruction(InstructionConstants.OP_IFNE, - branchInstruction.branchOffset)); - } - break; - } - } - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Does the constant refer to a simple enum type? - isSimpleEnum = isSimpleEnum(stringConstant.referencedClass); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Does the constant refer to a simple enum type? - isSimpleEnum = isSimpleEnum(classConstant.referencedClass); - } - - - // Implementations for ParameterVisitor. - - public void visitParameter(Clazz clazz, Member member, int parameterIndex, int parameterCount, int parameterOffset, int parameterSize, String parameterType, Clazz referencedClass) - { - // Check if the parameter is passing a simple enum as a more general type. - if (!ClassUtil.isInternalPrimitiveType(parameterType.charAt(0)) && - !ClassUtil.isInternalArrayType(parameterType) && - isSimpleEnum(referencedClass)) - { - // Replace any producers of null constants for this parameter. - int stackEntryIndex = parameterSize - parameterOffset - 1; - - replaceNullStackEntryProducers(invocationClazz, - invocationMethod, - invocationCodeAttribute, - invocationOffset, - stackEntryIndex); - } - } - - - // Small utility methods. - - /** - * Returns whether the constant at the given offset is referencing a - * simple enum class. - */ - private boolean isReferencingSimpleEnum(Clazz clazz, int constantIndex) - { - isSimpleEnum = false; - - clazz.constantPoolEntryAccept(constantIndex, this); - - return isSimpleEnum; - } - - - /** - * Returns whether the given method is returning a simple enum class. - */ - private boolean isReturningSimpleEnum(Clazz clazz, Method method) - { - String descriptor = method.getDescriptor(clazz); - String returnType = ClassUtil.internalMethodReturnType(descriptor); - - if (ClassUtil.isInternalClassType(returnType) && - !ClassUtil.isInternalArrayType(returnType)) - { - Clazz[] referencedClasses = - ((ProgramMethod)method).referencedClasses; - - if (referencedClasses != null) - { - Clazz returnedClass = - referencedClasses[referencedClasses.length - 1]; - - return isSimpleEnum(returnedClass); - } - } - - return false; - } - - - /** - * Returns whether the instruction at the given offset is pushing a simple - * enum class. - */ - private boolean isPushingSimpleEnum(int offset) - { - ReferenceValue referenceValue = - partialEvaluator.getStackAfter(offset).getTop(0).referenceValue(); - - Clazz referencedClass = referenceValue.getReferencedClass(); - - return isSimpleEnum(referencedClass) && - !ClassUtil.isInternalArrayType(referenceValue.getType()); - } - - - /** - * Returns whether the instruction at the given offset is popping a simple - * enum class. - */ - private boolean isPoppingSimpleEnum(int offset) - { - return isPoppingSimpleEnum(offset, 0); - } - - - /** - * Returns whether the instruction at the given offset is popping a simple - * enum class. - */ - private boolean isPoppingSimpleEnum(int offset, int stackEntryIndex) - { - ReferenceValue referenceValue = - partialEvaluator.getStackBefore(offset).getTop(stackEntryIndex).referenceValue(); - - return isSimpleEnum(referenceValue.getReferencedClass()) && - !ClassUtil.isInternalArrayType(referenceValue.getType()); - } - - - /** - * Returns whether the instruction at the given offset is popping a simple - * enum type. This includes simple enum arrays. - */ - private boolean isPoppingSimpleEnumType(int offset, int stackEntryIndex) - { - ReferenceValue referenceValue = - partialEvaluator.getStackBefore(offset).getTop(stackEntryIndex).referenceValue(); - - return isSimpleEnum(referenceValue.getReferencedClass()); - } - - - /** - * Returns whether the instruction at the given offset is popping a - * one-dimensional simple enum array. - */ - private boolean isPoppingSimpleEnumArray(int offset, int stackEntryIndex) - { - ReferenceValue referenceValue = - partialEvaluator.getStackBefore(offset).getTop(stackEntryIndex).referenceValue(); - - return isSimpleEnum(referenceValue.getReferencedClass()) && - ClassUtil.internalArrayTypeDimensionCount(referenceValue.getType()) == 1; - } - - - /** - * Returns whether the given class is not null and a simple enum class. - */ - private boolean isSimpleEnum(Clazz clazz) - { - return clazz != null && - SimpleEnumMarker.isSimpleEnum(clazz); - } - - - /** - * Returns whether the specified enum method is supported for simple enums. - */ - private void replaceSupportedMethod(Clazz clazz, - int offset, - Instruction instruction, - String name, - String type) - { - if (name.equals(ClassConstants.METHOD_NAME_ORDINAL) && - type.equals(ClassConstants.METHOD_TYPE_ORDINAL)) - { - Instruction[] replacementInstructions = new Instruction[] - { - new SimpleInstruction(InstructionConstants.OP_ICONST_1), - new SimpleInstruction(InstructionConstants.OP_ISUB), - }; - - replaceInstructions(clazz, - offset, - instruction, - replacementInstructions); - } - } - - - /** - * Replaces the instruction at the given offset by the given instructions. - */ - private void replaceInstructions(Clazz clazz, - int offset, - Instruction instruction, - Instruction[] replacementInstructions) - { - if (DEBUG) System.out.println(" Replacing instruction "+instruction.toString(offset)+" -> "+replacementInstructions.length+" instructions"); - - codeAttributeEditor.replaceInstruction(offset, replacementInstructions); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - // Note: we're not passing the right arguments for now, knowing that - // they aren't used anyway. - instruction.accept(clazz, null, null, offset, extraInstructionVisitor); - } - } - - - /** - * Replaces the instruction at the given offset by the given instruction, - * popping any now unused stack entries. - */ - private void replaceInstruction(Clazz clazz, - int offset, - Instruction instruction, - Instruction replacementInstruction) - { - // Pop unneeded stack entries if necessary. - int popCount = - instruction.stackPopCount(clazz) - - replacementInstruction.stackPopCount(clazz); - - insertPopInstructions(offset, popCount); - - if (DEBUG) System.out.println(" Replacing instruction "+instruction.toString(offset)+" -> "+replacementInstruction.toString()+(popCount == 0 ? "" : " ("+popCount+" pops)")); - - codeAttributeEditor.replaceInstruction(offset, replacementInstruction); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - // Note: we're not passing the right arguments for now, knowing that - // they aren't used anyway. - instruction.accept(clazz, null, null, offset, extraInstructionVisitor); - } - } - - - /** - * Deletes the instruction at the given offset, popping any now unused - * stack entries. - */ - private void deleteInstruction(Clazz clazz, - int offset, - Instruction instruction) - { - // Pop unneeded stack entries if necessary. - //int popCount = instruction.stackPopCount(clazz); - // - //insertPopInstructions(offset, popCount); - // - //if (DEBUG) System.out.println(" Deleting instruction "+instruction.toString(offset)+(popCount == 0 ? "" : " ("+popCount+" pops)")); - - if (DEBUG) System.out.println(" Deleting instruction "+instruction.toString(offset)); - - codeAttributeEditor.deleteInstruction(offset); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - // Note: we're not passing the right arguments for now, knowing that - // they aren't used anyway. - instruction.accept(clazz, null, null, offset, extraInstructionVisitor); - } - } - - - /** - * Pops the given number of stack entries before the instruction at the - * given offset. - */ - private void insertPopInstructions(int offset, int popCount) - { - switch (popCount) - { - case 0: - { - break; - } - case 1: - { - // Insert a single pop instruction. - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP); - - codeAttributeEditor.insertBeforeInstruction(offset, - popInstruction); - break; - } - case 2: - { - // Insert a single pop2 instruction. - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP2); - - codeAttributeEditor.insertBeforeInstruction(offset, - popInstruction); - break; - } - default: - { - // Insert the specified number of pop instructions. - Instruction[] popInstructions = - new Instruction[popCount / 2 + popCount % 2]; - - Instruction popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP2); - - for (int index = 0; index < popCount / 2; index++) - { - popInstructions[index] = popInstruction; - } - - if (popCount % 2 == 1) - { - popInstruction = - new SimpleInstruction(InstructionConstants.OP_POP); - - popInstructions[popCount / 2] = popInstruction; - } - - codeAttributeEditor.insertBeforeInstruction(offset, - popInstructions); - break; - } - } - } - - - /** - * Replaces aconst_null producers of the consumer of the top stack entry - * at the given offset by iconst_0. - */ - private void replaceNullStackEntryProducers(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int consumerOffset) - { - replaceNullStackEntryProducers(clazz, method, codeAttribute, consumerOffset, 0); - } - - - /** - * Replaces aconst_null producers of the specified stack entry by - * iconst_0. - */ - private void replaceNullStackEntryProducers(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int consumerOffset, - int stackEntryIndex) - { - InstructionOffsetValue producerOffsets = - partialEvaluator.getStackBefore(consumerOffset).getTopActualProducerValue(stackEntryIndex).instructionOffsetValue(); - - for (int index = 0; index < producerOffsets.instructionOffsetCount(); index++) - { - int producerOffset = producerOffsets.instructionOffset(index); - - // TODO: A method might be pushing the null constant. - if (producerOffset >= 0 && - codeAttribute.code[producerOffset] == InstructionConstants.OP_ACONST_NULL) - { - // Replace pushing null by pushing 0. - replaceInstruction(clazz, - producerOffset, - new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), - new SimpleInstruction(InstructionConstants.OP_ICONST_0)); - } - } - } - - - /** - * Replaces aconst_null/astore producers of the specified reference variable by - * iconst_0/istore. - */ - private void replaceNullVariableProducers(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int consumerOffset, - int variableIndex) - { - InstructionOffsetValue producerOffsets = - partialEvaluator.getVariablesBefore(consumerOffset).getProducerValue(variableIndex).instructionOffsetValue(); - - for (int index = 0; index < producerOffsets.instructionOffsetCount(); index++) - { - if (!producerOffsets.isMethodParameter(index) && - !producerOffsets.isExceptionHandler(index)) - { - int producerOffset = producerOffsets.instructionOffset(index); - - if (partialEvaluator.getVariablesAfter(producerOffset).getValue(variableIndex).referenceValue().isNull() == Value.ALWAYS) - { - // Replace loading null by loading 0. - replaceInstruction(clazz, - producerOffset, - new VariableInstruction(InstructionConstants.OP_ASTORE, variableIndex), - new VariableInstruction(InstructionConstants.OP_ISTORE, variableIndex)); - - // Replace pushing null by pushing 0. - replaceNullStackEntryProducers(clazz, method, codeAttribute, producerOffset); - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/StoringInvocationUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/StoringInvocationUnit.java deleted file mode 100644 index 6de19c81..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/StoringInvocationUnit.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.constant.RefConstant; -import proguard.evaluation.BasicInvocationUnit; -import proguard.evaluation.value.*; -import proguard.optimize.KeepMarker; -import proguard.optimize.info.*; - -/** - * This InvocationUnit stores parameter values and return values with the - * methods that are invoked. - * - * @see LoadingInvocationUnit - * @author Eric Lafortune - */ -public class StoringInvocationUnit -extends BasicInvocationUnit -{ - private boolean storeFieldValues; - private boolean storeMethodParameterValues; - private boolean storeMethodReturnValues; - - - /** - * Creates a new StoringInvocationUnit with the given value factory. - */ - public StoringInvocationUnit(ValueFactory valueFactory) - { - this(valueFactory, true, true, true); - } - - - /** - * Creates a new StoringInvocationUnit with the given value factory, for - * storing the specified values. - */ - public StoringInvocationUnit(ValueFactory valueFactory, - boolean storeFieldValues, - boolean storeMethodParameterValues, - boolean storeMethodReturnValues) - { - super(valueFactory); - - this.storeFieldValues = storeFieldValues; - this.storeMethodParameterValues = storeMethodParameterValues; - this.storeMethodReturnValues = storeMethodReturnValues; - } - - - // Implementations for BasicInvocationUnit. - - public void setFieldClassValue(Clazz clazz, - RefConstant refConstant, - ReferenceValue value) - { - if (storeFieldValues) - { - Member referencedMember = refConstant.referencedMember; - if (referencedMember != null) - { - generalizeFieldClassValue((Field)referencedMember, value); - } - } - } - - - public void setFieldValue(Clazz clazz, - RefConstant refConstant, - Value value) - { - if (storeFieldValues) - { - Member referencedMember = refConstant.referencedMember; - if (referencedMember != null) - { - generalizeFieldValue((Field)referencedMember, value); - } - } - } - - - public void setMethodParameterValue(Clazz clazz, - RefConstant refConstant, - int parameterIndex, - Value value) - { - if (storeMethodParameterValues) - { - Member referencedMember = refConstant.referencedMember; - if (referencedMember != null) - { - generalizeMethodParameterValue((Method)referencedMember, - parameterIndex, - value); - } - } - } - - - public void setMethodReturnValue(Clazz clazz, - Method method, - Value value) - { - if (storeMethodReturnValues) - { - generalizeMethodReturnValue(method, value); - } - } - - - // Small utility methods. - - private static void generalizeFieldClassValue(Field field, ReferenceValue value) - { - if (!KeepMarker.isKept(field)) - { - ProgramFieldOptimizationInfo.getProgramFieldOptimizationInfo(field).generalizeReferencedClass(value); - } - } - - - public static ReferenceValue getFieldClassValue(Field field) - { - return FieldOptimizationInfo.getFieldOptimizationInfo(field).getReferencedClass(); - } - - - private static void generalizeFieldValue(Field field, Value value) - { - if (!KeepMarker.isKept(field)) - { - ProgramFieldOptimizationInfo.getProgramFieldOptimizationInfo(field).generalizeValue(value); - } - } - - - public static Value getFieldValue(Field field) - { - return FieldOptimizationInfo.getFieldOptimizationInfo(field).getValue(); - } - - - private static void generalizeMethodParameterValue(Method method, int parameterIndex, Value value) - { - if (!KeepMarker.isKept(method)) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).generalizeParameterValue(parameterIndex, value); - } - } - - - public static Value getMethodParameterValue(Method method, int parameterIndex) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getParameterValue(parameterIndex); - } - - - private static void generalizeMethodReturnValue(Method method, Value value) - { - if (!KeepMarker.isKept(method)) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).generalizeReturnValue(value); - } - } - - - public static Value getMethodReturnValue(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getReturnValue(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/TracedBranchUnit.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/TracedBranchUnit.java deleted file mode 100644 index 019897dc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/TracedBranchUnit.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.Clazz; -import proguard.classfile.attribute.CodeAttribute; -import proguard.evaluation.BasicBranchUnit; -import proguard.evaluation.value.Value; - -/** - * This BranchUnit remembers the branch unit commands that are invoked on it. - * - * @author Eric Lafortune - */ -class TracedBranchUnit -extends BasicBranchUnit -{ - private boolean isFixed; - - - // Implementations for BasicBranchUnit. - - public void reset() - { - super.reset(); - - isFixed = false; - } - - - // Implementations for BranchUnit. - - public void branch(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - int branchTarget) - { - super.branch(clazz, codeAttribute, offset, branchTarget); - - isFixed = true; - } - - - public void branchConditionally(Clazz clazz, - CodeAttribute codeAttribute, - int offset, - int branchTarget, - int conditional) - { - if (conditional == Value.ALWAYS) - { - // Always branch. - super.branch(clazz, codeAttribute, offset, branchTarget); - - isFixed = true; - } - else if (conditional == Value.MAYBE) - { - if (!isFixed) - { - // Maybe branch. - super.branchConditionally(clazz, codeAttribute, offset, branchTarget, conditional); - } - } - else - { - super.wasCalled = true; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/VariableOptimizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/VariableOptimizer.java deleted file mode 100644 index 9b709f92..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/VariableOptimizer.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.evaluation; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This AttributeVisitor optimizes variable allocation based on their the liveness, - * in the code attributes that it visits. - * - * @author Eric Lafortune - */ -public class VariableOptimizer -extends SimplifiedVisitor -implements AttributeVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - private static final int MAX_VARIABLES_SIZE = 64; - - - private final boolean reuseThis; - private final MemberVisitor extraVariableMemberVisitor; - - private final LivenessAnalyzer livenessAnalyzer = new LivenessAnalyzer(); - private final VariableRemapper variableRemapper = new VariableRemapper(); - private VariableCleaner variableCleaner = new VariableCleaner(); - - private int[] variableMap = new int[ClassConstants.TYPICAL_VARIABLES_SIZE]; - - - /** - * Creates a new VariableOptimizer. - * @param reuseThis specifies whether the 'this' variable can be reused. - * Many JVMs for JME and IBM's JVMs for JSE can't handle - * such reuse. - */ - public VariableOptimizer(boolean reuseThis) - { - this(reuseThis, null); - } - - - /** - * Creates a new VariableOptimizer with an extra visitor. - * @param reuseThis specifies whether the 'this' variable - * can be reused. Many JVMs for JME and - * IBM's JVMs for JSE can't handle such - * reuse. - * @param extraVariableMemberVisitor an optional extra visitor for all - * removed variables. - */ - public VariableOptimizer(boolean reuseThis, - MemberVisitor extraVariableMemberVisitor) - { - this.reuseThis = reuseThis; - this.extraVariableMemberVisitor = extraVariableMemberVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // Initialize the global arrays. - initializeArrays(codeAttribute); - - // Analyze the liveness of the variables in the code. - livenessAnalyzer.visitCodeAttribute(clazz, method, codeAttribute); - - // Trim the variables in the local variable tables, because even - // clipping the tables individually may leave some inconsistencies - // between them. - codeAttribute.attributesAccept(clazz, method, this); - - int startIndex = - (method.getAccessFlags() & ClassConstants.ACC_STATIC) != 0 || - reuseThis ? 0 : 1; - - int parameterSize = - ClassUtil.internalMethodParameterSize(method.getDescriptor(clazz), - method.getAccessFlags()); - - int variableSize = codeAttribute.u2maxLocals; - int codeLength = codeAttribute.u4codeLength; - - boolean remapping = false; - - // Loop over all variables. - for (int oldIndex = 0; oldIndex < variableSize; oldIndex++) - { - // By default, the variable will be mapped onto itself. - variableMap[oldIndex] = oldIndex; - - // Only try remapping the variable if it's not a parameter. - if (oldIndex >= parameterSize && - oldIndex < MAX_VARIABLES_SIZE) - { - // Try to remap the variable to a variable with a smaller index. - for (int newIndex = startIndex; newIndex < oldIndex; newIndex++) - { - if (areNonOverlapping(oldIndex, newIndex, codeLength)) - { - variableMap[oldIndex] = newIndex; - - updateLiveness(oldIndex, newIndex, codeLength); - - remapping = true; - - // This variable has been remapped. Go to the next one. - break; - } - } - } - } - - // Have we been able to remap any variables? - if (remapping) - { - if (DEBUG) - { - System.out.println("VariableOptimizer: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - for (int index= 0; index < variableSize; index++) - { - System.out.println(" v"+index+" -> "+variableMap[index]); - } - } - - // Remap the variables. - variableRemapper.setVariableMap(variableMap); - variableRemapper.visitCodeAttribute(clazz, method, codeAttribute); - - // Visit the method, if required. - if (extraVariableMemberVisitor != null) - { - method.accept(clazz, extraVariableMemberVisitor); - } - } - else - { - // Just clean up any empty variables. - variableCleaner.visitCodeAttribute(clazz, method, codeAttribute); - } - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Trim the variables in the local variable table. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Trim the variables in the local variable type table. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Trim the local variable to the instructions at which it is alive. - int variable = localVariableInfo.u2index; - int startPC = localVariableInfo.u2startPC; - int endPC = startPC + localVariableInfo.u2length; - - startPC = firstLiveness(startPC, endPC, variable); - endPC = lastLiveness(startPC, endPC, variable); - - // Leave the start address of unused variables unchanged. - int length = endPC - startPC; - if (length > 0) - { - localVariableInfo.u2startPC = startPC; - } - - localVariableInfo.u2length = length; - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Trim the local variable type to the instructions at which it is alive. - int variable = localVariableTypeInfo.u2index; - int startPC = localVariableTypeInfo.u2startPC; - int endPC = startPC + localVariableTypeInfo.u2length; - - startPC = firstLiveness(startPC, endPC, variable); - endPC = lastLiveness(startPC, endPC, variable); - - // Leave the start address of unused variables unchanged. - int length = endPC - startPC; - if (length > 0) - { - localVariableTypeInfo.u2startPC = startPC; - } - - localVariableTypeInfo.u2length = length; - } - - - // Small utility methods. - - /** - * Initializes the global arrays. - */ - private void initializeArrays(CodeAttribute codeAttribute) - { - int codeLength = codeAttribute.u4codeLength; - - // Create new arrays for storing information at each instruction offset. - if (variableMap.length < codeLength) - { - variableMap = new int[codeLength]; - } - } - - - /** - * Returns whether the given variables are never alive at the same time. - */ - private boolean areNonOverlapping(int variableIndex1, - int variableIndex2, - int codeLength) - { - // Loop over all instructions. - for (int offset = 0; offset < codeLength; offset++) - { - if ((livenessAnalyzer.isAliveBefore(offset, variableIndex1) && - livenessAnalyzer.isAliveBefore(offset, variableIndex2)) || - - (livenessAnalyzer.isAliveAfter(offset, variableIndex1) && - livenessAnalyzer.isAliveAfter(offset, variableIndex2)) || - - // For now, exclude Category 2 variables. - livenessAnalyzer.isCategory2(offset, variableIndex1)) - { - return false; - } - } - - return true; - } - - - /** - * Updates the liveness resulting from mapping the given old variable on - * the given new variable. - */ - private void updateLiveness(int oldVariableIndex, - int newVariableIndex, - int codeLength) - { - // Loop over all instructions. - for (int offset = 0; offset < codeLength; offset++) - { - // Update the liveness before the instruction. - if (livenessAnalyzer.isAliveBefore(offset, oldVariableIndex)) - { - livenessAnalyzer.setAliveBefore(offset, oldVariableIndex, false); - livenessAnalyzer.setAliveBefore(offset, newVariableIndex, true); - } - - // Update the liveness after the instruction. - if (livenessAnalyzer.isAliveAfter(offset, oldVariableIndex)) - { - livenessAnalyzer.setAliveAfter(offset, oldVariableIndex, false); - livenessAnalyzer.setAliveAfter(offset, newVariableIndex, true); - } - } - } - - - /** - * Returns the first instruction offset between the given offsets at which - * the given variable goes alive. - */ - private int firstLiveness(int startOffset, int endOffset, int variableIndex) - { - for (int offset = startOffset; offset < endOffset; offset++) - { - if (livenessAnalyzer.isTraced(offset) && - livenessAnalyzer.isAliveBefore(offset, variableIndex)) - { - return offset; - } - } - - return endOffset; - } - - - /** - * Returns the last instruction offset between the given offsets before - * which the given variable is still alive. - */ - private int lastLiveness(int startOffset, int endOffset, int variableIndex) - { - int previousOffset = endOffset; - - for (int offset = endOffset-1; offset >= startOffset; offset--) - { - if (livenessAnalyzer.isTraced(offset)) - { - if (livenessAnalyzer.isAliveBefore(offset, variableIndex)) - { - return previousOffset; - } - - previousOffset = offset; - } - } - - return endOffset; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/package.html deleted file mode 100644 index 5341f9f8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/evaluation/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains visitors that perform partial evaluation and subsequent -optimizations on byte code. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/AccessMethodMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/AccessMethodMarker.java deleted file mode 100644 index 1b03afc6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/AccessMethodMarker.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This InstructionVisitor marks the types of class accesses and class member - * accesses of the methods whose instructions it visits. - * - * @author Eric Lafortune - */ -public class AccessMethodMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - ClassVisitor, - MemberVisitor -{ - private Method invokingMethod; - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - invokingMethod = method; - - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Check the referenced class or class member, if any. - stringConstant.referencedClassAccept(this); - stringConstant.referencedMemberAccept(this); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Check the bootstrap method. - invokeDynamicConstant.bootstrapMethodHandleAccept(clazz, this); - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - // Check the method reference. - clazz.constantPoolEntryAccept(methodHandleConstant.u2referenceIndex, this); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - // Check the referenced class. - clazz.constantPoolEntryAccept(refConstant.u2classIndex, this); - - // Check the referenced class member itself. - refConstant.referencedClassAccept(this); - refConstant.referencedMemberAccept(this); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Check the referenced class. - classConstant.referencedClassAccept(this); - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - int accessFlags = clazz.getAccessFlags(); - - if ((accessFlags & ClassConstants.ACC_PUBLIC) == 0) - { - setAccessesPackageCode(invokingMethod); - } - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - int accessFlags = member.getAccessFlags(); - - if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) - { - setAccessesPrivateCode(invokingMethod); - } - else if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) - { - setAccessesProtectedCode(invokingMethod); - } - else if ((accessFlags & ClassConstants.ACC_PUBLIC) == 0) - { - setAccessesPackageCode(invokingMethod); - } - } - - - // Small utility methods. - - private static void setAccessesPrivateCode(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setAccessesPrivateCode(); - } - - - /** - * Returns whether the given method accesses private class members. - */ - public static boolean accessesPrivateCode(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).accessesPrivateCode(); - } - - - private static void setAccessesPackageCode(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setAccessesPackageCode(); - } - - - /** - * Returns whether the given method accesses package visible classes or class - * members. - */ - public static boolean accessesPackageCode(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).accessesPackageCode(); - } - - - private static void setAccessesProtectedCode(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setAccessesProtectedCode(); - } - - - /** - * Returns whether the given method accesses protected class members. - */ - public static boolean accessesProtectedCode(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).accessesProtectedCode(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/BackwardBranchMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/BackwardBranchMarker.java deleted file mode 100644 index 3da8806f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/BackwardBranchMarker.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor marks all methods that branch backward in any of the - * instructions that it visits. - * - * @author Eric Lafortune - */ -public class BackwardBranchMarker -extends SimplifiedVisitor -implements InstructionVisitor -{ - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - markBackwardBranch(method, branchInstruction.branchOffset); - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - markBackwardBranch(method, switchInstruction.defaultOffset); - - for (int index = 0; index < switchInstruction.jumpOffsets.length; index++) - { - markBackwardBranch(method, switchInstruction.jumpOffsets[index]); - } - } - - - // Small utility methods. - - /** - * Marks the given method if the given branch offset is negative. - */ - private void markBackwardBranch(Method method, int branchOffset) - { - if (branchOffset < 0) - { - setBranchesBackward(method); - } - } - - - private static void setBranchesBackward(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setBranchesBackward(); - } - - - public static boolean branchesBackward(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).branchesBackward(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CatchExceptionMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CatchExceptionMarker.java deleted file mode 100644 index 213963f9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CatchExceptionMarker.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor marks all methods that catch exceptions. - * - * @author Eric Lafortune - */ -public class CatchExceptionMarker -extends SimplifiedVisitor -implements AttributeVisitor -{ - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (codeAttribute.u2exceptionTableLength > 0) - { - markCatchException(method); - } - } - - - // Small utility methods. - - private static void markCatchException(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setCatchesExceptions(); - } - - - public static boolean catchesExceptions(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).catchesExceptions(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CaughtClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CaughtClassFilter.java deleted file mode 100644 index 1a63c50f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CaughtClassFilter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates all its method calls to another ClassVisitor, - * but only for Clazz objects that are caught as exceptions. - * - * @see CaughtClassMarker - * @author Eric Lafortune - */ -public class CaughtClassFilter -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - public CaughtClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (CaughtClassMarker.isCaught(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (CaughtClassMarker.isCaught(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CaughtClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CaughtClassMarker.java deleted file mode 100644 index a124aaf4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CaughtClassMarker.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor marks all program classes that it visits as caught. - * This means that these classes are exception classes that occur in exception - * handlers. - * - * @author Eric Lafortune - */ -public class CaughtClassMarker -implements ClassVisitor -{ - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - public void visitProgramClass(ProgramClass programClass) - { - setCaught(programClass); - } - - - // Small utility methods. - - private static void setCaught(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setCaught(); - } - - - public static boolean isCaught(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).isCaught(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ClassOptimizationInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ClassOptimizationInfo.java deleted file mode 100644 index 4789bc69..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ClassOptimizationInfo.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.Clazz; - -/** - * This class stores some optimization information that can be attached to - * a class. - * - * @author Eric Lafortune - */ -public class ClassOptimizationInfo -{ - protected boolean hasNoSideEffects = false; - - - public void setNoSideEffects() - { - hasNoSideEffects = true; - } - - - public boolean hasNoSideEffects() - { - return hasNoSideEffects; - } - - - public boolean isKept() - { - return true; - } - - - public boolean isInstantiated() - { - return true; - } - - - public boolean isInstanceofed() - { - // We're relaxing the strict assumption of "true". - return !hasNoSideEffects; - } - - - public boolean isDotClassed() - { - // We're relaxing the strict assumption of "true". - return !hasNoSideEffects; - } - - - public boolean isCaught() - { - return true; - } - - - public boolean isSimpleEnum() - { - return false; - } - - - public boolean isWrapper() - { - return false; - } - - - public boolean isEscaping() - { - return true; - } - - - public boolean hasSideEffects() - { - return !hasNoSideEffects; - } - - - public boolean containsPackageVisibleMembers() - { - return true; - } - - - public boolean invokesPackageVisibleMembers() - { - return true; - } - - - public boolean mayBeMerged() - { - return false; - } - - - public Clazz getWrappedClass() - { - return null; - } - - - public Clazz getTargetClass() - { - return null; - } - - - public static void setClassOptimizationInfo(Clazz clazz) - { - clazz.setVisitorInfo(new ClassOptimizationInfo()); - } - - - public static ClassOptimizationInfo getClassOptimizationInfo(Clazz clazz) - { - return (ClassOptimizationInfo)clazz.getVisitorInfo(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CodeAttributeOptimizationInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CodeAttributeOptimizationInfo.java deleted file mode 100644 index aa41d358..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/CodeAttributeOptimizationInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.attribute.CodeAttribute; - -/** - * This class stores some optimization information that can be attached - * to a code attribute. - * - * @author Thomas Neidhart - */ -public class CodeAttributeOptimizationInfo -{ - - public boolean isKept() - { - return true; - } - - - public static void setCodeAttributeOptimizationInfo(CodeAttribute codeAttribute) - { - codeAttribute.setVisitorInfo(new CodeAttributeOptimizationInfo()); - } - - - public static CodeAttributeOptimizationInfo getCodeAttributeOptimizationInfo(CodeAttribute codeAttribute) - { - return (CodeAttributeOptimizationInfo)codeAttribute.getVisitorInfo(); - } - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DotClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DotClassFilter.java deleted file mode 100644 index 739ba577..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DotClassFilter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates all its method calls to another ClassVisitor, - * but only for Clazz objects that are used in a .class construct. - * - * @see DotClassMarker - * @author Eric Lafortune - */ -public class DotClassFilter -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - public DotClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (DotClassMarker.isDotClassed(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (DotClassMarker.isDotClassed(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DotClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DotClassMarker.java deleted file mode 100644 index 0989a927..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DotClassMarker.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; -import proguard.optimize.OptimizationInfoClassFilter; - -/** - * This InstructionVisitor marks all classes that are used in a .class - * construct by any of the instructions that it visits. - * - * @author Eric Lafortune - */ -public class DotClassMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - ClassVisitor -{ - private final OptimizationInfoClassFilter filteredClassMarker = new OptimizationInfoClassFilter(this); - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_LDC || - constantInstruction.opcode == InstructionConstants.OP_LDC_W) - { - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.referencedClassAccept(filteredClassMarker); - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - setDotClassed(clazz); - } - - - // Small utility methods. - - private static void setDotClassed(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setDotClassed(); - } - - - public static boolean isDotClassed(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).isDotClassed(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DynamicInvocationMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DynamicInvocationMarker.java deleted file mode 100644 index 0b50a3b7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/DynamicInvocationMarker.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This InstructionVisitor marks whether the methods whose instructions it - * visits contain the invokedynamic instruction. - * - * @author Eric Lafortune - */ -public class DynamicInvocationMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - ClassVisitor, - MemberVisitor -{ - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_INVOKEDYNAMIC) - { - setInvokesDynamically(method); - } - } - - - // Small utility methods. - - private static void setInvokesDynamically(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setInvokesDynamically(); - } - - - /** - * Returns whether the given method calls the invokedynamic instruction. - */ - public static boolean invokesDynamically(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).invokesDynamically(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/EscapingClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/EscapingClassFilter.java deleted file mode 100644 index 0c514194..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/EscapingClassFilter.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates its visits to one of two other given - * ClassVisitor instances, depending on whether the classes are marked to be - * escaping or not. - * - * @see EscapingClassMarker - * - * @author Eric Lafortune - */ -public class EscapingClassFilter -implements ClassVisitor -{ - private final ClassVisitor escapingClassVisitor; - private final ClassVisitor otherClassVisitor; - - - /** - * Creates a new EscapingClassFilter. - * @param escapingClassVisitor the class visitor to which visits to - * classes that are marked to be escaping - * will be delegated. - */ - public EscapingClassFilter(ClassVisitor escapingClassVisitor) - { - this(escapingClassVisitor, null); - } - - - /** - * Creates a new EscapingClassFilter. - * @param escapingClassVisitor the class visitor to which visits to - * classes that are marked to be escaping - * will be delegated. - * @param otherClassVisitor the class visitor to which visits to - * classes that are not marked to be escaping - * will be delegated. - */ - public EscapingClassFilter(ClassVisitor escapingClassVisitor, - ClassVisitor otherClassVisitor) - { - this.escapingClassVisitor = escapingClassVisitor; - this.otherClassVisitor = otherClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Is the class marked to be escaping? - ClassVisitor classVisitor = EscapingClassMarker.isClassEscaping(libraryClass) ? - escapingClassVisitor : - otherClassVisitor; - - if (classVisitor != null) - { - classVisitor.visitLibraryClass(libraryClass); - } - } - - - public void visitProgramClass(ProgramClass programClass) - { - // Is the class marked to be escaping? - ClassVisitor classVisitor = EscapingClassMarker.isClassEscaping(programClass) ? - escapingClassVisitor : - otherClassVisitor; - - if (classVisitor != null) - { - classVisitor.visitProgramClass(programClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/EscapingClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/EscapingClassMarker.java deleted file mode 100644 index a34c39af..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/EscapingClassMarker.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassVisitor; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.*; - -/** - * This AttributeVisitor marks the classes that are escaping from the visited - * code attributes. - * - * @see ReferenceEscapeChecker - * @author Eric Lafortune - */ -public class EscapingClassMarker -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ClassVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("ecm") != null; - //*/ - - - private final PartialEvaluator partialEvaluator; - private final boolean runPartialEvaluator; - private final ReferenceEscapeChecker referenceEscapeChecker; - private final boolean runReferenceEscapeChecker; - - - /** - * Creates a new EscapingClassMarker. - */ - public EscapingClassMarker() - { - // We need typed references. - this(new TypedReferenceValueFactory()); - } - - - /** - * Creates a new EscapingClassMarker. - */ - public EscapingClassMarker(ValueFactory valueFactory) - { - this(valueFactory, - new ReferenceTracingValueFactory(valueFactory)); - } - - - /** - * Creates a new EscapingClassMarker. - */ - public EscapingClassMarker(ValueFactory valueFactory, - ReferenceTracingValueFactory tracingValueFactory) - { - this(new PartialEvaluator(tracingValueFactory, - new ReferenceTracingInvocationUnit(new BasicInvocationUnit(tracingValueFactory)), - true, - tracingValueFactory), - true); - } - - - /** - * Creates a new EscapingClassMarker. - */ - public EscapingClassMarker(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator) - { - this(partialEvaluator, - runPartialEvaluator, - new ReferenceEscapeChecker(partialEvaluator, false), - true); - } - - - /** - * Creates a new EscapingClassMarker. - */ - public EscapingClassMarker(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator, - ReferenceEscapeChecker referenceEscapeChecker, - boolean runReferenceEscapeChecker) - { - this.partialEvaluator = partialEvaluator; - this.runPartialEvaluator = runPartialEvaluator; - this.referenceEscapeChecker = referenceEscapeChecker; - this.runReferenceEscapeChecker = runReferenceEscapeChecker; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Evaluate the code. - if (runPartialEvaluator) - { - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - } - - if (runReferenceEscapeChecker) - { - referenceEscapeChecker.visitCodeAttribute(clazz, method, codeAttribute); - } - - // Mark all escaping classes. - codeAttribute.instructionsAccept(clazz, - method, - partialEvaluator.tracedInstructionFilter(this)); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Does the instruction push a value that escapes? - // We'll also count values that are returned, since they may be - // downcast and the downcast type may escape in some calling - // method. - // TODO: Refine check: is a value is downcast to an escaping class, while it is being returned? - if (instruction.stackPushCount(clazz) == 1 && - (referenceEscapeChecker.isInstanceEscaping(offset) || - referenceEscapeChecker.isInstanceReturned(offset))) - { - TracedStack stackAfter = partialEvaluator.getStackAfter(offset); - Value stackEntry = stackAfter.getTop(0); - - // Is it really a reference type? - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - // Is it a plain class reference type? - ReferenceValue referenceValue = stackEntry.referenceValue(); - if (referenceValue.isNull() != Value.ALWAYS && - !ClassUtil.isInternalArrayType(referenceValue.getType())) - { - // Do we know the class? - Clazz referencedClass = referenceValue.getReferencedClass(); - if (referencedClass != null) - { - if (DEBUG) - { - System.out.println("EscapingClassMarker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]: "+instruction.toString(offset)+" pushes escaping ["+referencedClass.getName()+"]"); - } - - // Mark it, along with its superclasses. - referencedClass.hierarchyAccept(true, true, true, false, this); - } - } - } - } - } - - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - public void visitProgramClass(ProgramClass programClass) - { - markClassEscaping(programClass); - } - - - // Small utility methods. - - /** - * Marks the given class as escaping. - */ - private void markClassEscaping(Clazz clazz) - { - ClassOptimizationInfo info = ProgramClassOptimizationInfo.getClassOptimizationInfo(clazz); - if (info instanceof ProgramClassOptimizationInfo) - { - ((ProgramClassOptimizationInfo)info).setEscaping(); - } - } - - - /** - * Returns whether the given class is escaping. - */ - public static boolean isClassEscaping(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).isEscaping(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ExceptionInstructionChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ExceptionInstructionChecker.java deleted file mode 100644 index 5b945c37..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ExceptionInstructionChecker.java +++ /dev/null @@ -1,354 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This class can tell whether an instruction might throw exceptions. - * - * @author Eric Lafortune - */ -public class ExceptionInstructionChecker -extends SimplifiedVisitor -implements InstructionVisitor -// ConstantVisitor, -// MemberVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = System.getProperty("eic") != null; - //*/ - - - // A return value for the visitor methods. - private boolean mayThrowExceptions; - - - /** - * Returns whether the specified method may throw exceptions. - */ - public boolean mayThrowExceptions(Clazz clazz, - Method method, - CodeAttribute codeAttribute) - { - return mayThrowExceptions(clazz, - method, - codeAttribute, - 0, - codeAttribute.u4codeLength); - } - - - /** - * Returns whether the specified block of code may throw exceptions. - */ - public boolean mayThrowExceptions(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int startOffset, - int endOffset) - { - if (DEBUG) - { - System.out.println("ExceptionInstructionChecker.mayThrowExceptions ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]: "+startOffset+" -> "+endOffset); - } - - return firstExceptionThrowingInstructionOffset(clazz, - method, - codeAttribute, - startOffset, - endOffset) < endOffset; - } - - - /** - * Returns the offset of the first instruction in the specified block of - * code that may throw exceptions, or the end offset if there is none. - */ - public int firstExceptionThrowingInstructionOffset(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int startOffset, - int endOffset) - { - if (DEBUG) - { - System.out.println("ExceptionInstructionChecker.firstExceptionThrowingInstructionOffset ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]: "+startOffset+" -> "+endOffset); - } - - byte[] code = codeAttribute.code; - - // Go over all instructions. - int offset = startOffset; - while (offset < endOffset) - { - // Get the current instruction. - Instruction instruction = InstructionFactory.create(code, offset); - - // Check if it may be throwing exceptions. - if (mayThrowExceptions(clazz, - method, - codeAttribute, - offset, - instruction)) - { - if (DEBUG) - { - System.out.println(" "+instruction.toString(offset)); - } - - return offset; - } - - // Go to the next instruction. - offset += instruction.length(offset); - } - - return endOffset; - } - - - /** - * Returns the offset after the last instruction in the specified block of - * code that may throw exceptions, or the start offset if there is none. - */ - public int lastExceptionThrowingInstructionOffset(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int startOffset, - int endOffset) - { - if (DEBUG) - { - System.out.println("ExceptionInstructionChecker.lastExceptionThrowingInstructionOffset ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]: "+startOffset+" -> "+endOffset); - } - - byte[] code = codeAttribute.code; - - int lastOffset = startOffset; - - // Go over all instructions. - int offset = startOffset; - while (offset < endOffset) - { - // Get the current instruction. - Instruction instruction = InstructionFactory.create(code, offset); - - // Check if it may be throwing exceptions. - if (mayThrowExceptions(clazz, - method, - codeAttribute, - offset, - instruction)) - { - if (DEBUG) - { - System.out.println(" "+instruction.toString(offset)); - } - - // Go to the next instruction. - offset += instruction.length(offset); - - lastOffset = offset; - } - else - { - // Go to the next instruction. - offset += instruction.length(offset); - } - } - - return lastOffset; - } - - - /** - * Returns whether the specified instruction may throw exceptions. - */ - public boolean mayThrowExceptions(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, offset); - - return mayThrowExceptions(clazz, - method, - codeAttribute, - offset, - instruction); - } - - - /** - * Returns whether the given instruction may throw exceptions. - */ - public boolean mayThrowExceptions(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int offset, - Instruction instruction) - { - return instruction.mayThrowExceptions(); - -// mayThrowExceptions = false; -// -// instruction.accept(clazz, method, codeAttribute, offset, this); -// -// return mayThrowExceptions; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - // Check for instructions that may throw exceptions. - // Note that monitorexit can not sensibly throw exceptions, except the - // broken and deprecated asynchronous ThreadDeath. Removing the - // artificial infinite looping exception blocks that recent compilers - // add does not strictly follow the JVM specs, but it does have the - // additional benefit of avoiding a bug in the JVM in JDK 1.1. - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_IDIV: - case InstructionConstants.OP_LDIV: - case InstructionConstants.OP_IREM: - case InstructionConstants.OP_LREM: - case InstructionConstants.OP_IALOAD: - case InstructionConstants.OP_LALOAD: - case InstructionConstants.OP_FALOAD: - case InstructionConstants.OP_DALOAD: - case InstructionConstants.OP_AALOAD: - case InstructionConstants.OP_BALOAD: - case InstructionConstants.OP_CALOAD: - case InstructionConstants.OP_SALOAD: - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_LASTORE: - case InstructionConstants.OP_FASTORE: - case InstructionConstants.OP_DASTORE: - case InstructionConstants.OP_AASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - case InstructionConstants.OP_NEWARRAY: - case InstructionConstants.OP_ARRAYLENGTH: - case InstructionConstants.OP_ATHROW: - case InstructionConstants.OP_MONITORENTER: - // These instructions may throw exceptions. - mayThrowExceptions = true; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Check for instructions that may throw exceptions. - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_PUTSTATIC: - case InstructionConstants.OP_GETFIELD: - case InstructionConstants.OP_PUTFIELD: - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - case InstructionConstants.OP_INVOKEDYNAMIC: - case InstructionConstants.OP_NEW: - case InstructionConstants.OP_ANEWARRAY: - case InstructionConstants.OP_CHECKCAST: - case InstructionConstants.OP_INSTANCEOF: - case InstructionConstants.OP_MULTIANEWARRAY: - // These instructions may throw exceptions. - mayThrowExceptions = true; - -// case InstructionConstants.OP_INVOKEVIRTUAL: -// case InstructionConstants.OP_INVOKESPECIAL: -// case InstructionConstants.OP_INVOKESTATIC: -// case InstructionConstants.OP_INVOKEINTERFACE: -// // Check if the invoking the method may throw an exception. -// clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - } - - -// // Implementations for ConstantVisitor. -// -// public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) -// { -// Member referencedMember = refConstant.referencedMember; -// -// // Do we have a reference to the method? -// if (referencedMember == null) -// { -// // We'll have to assume invoking the unknown method may throw an -// // an exception. -// mayThrowExceptions = true; -// } -// else -// { -// // First check the referenced method itself. -// refConstant.referencedMemberAccept(this); -// -// // If the result isn't conclusive, check down the hierarchy. -// if (!mayThrowExceptions) -// { -// Clazz referencedClass = refConstant.referencedClass; -// Method referencedMethod = (Method)referencedMember; -// -// // Check all other implementations of the method in the class -// // hierarchy. -// referencedClass.methodImplementationsAccept(referencedMethod, -// false, -// false, -// true, -// true, -// this); -// } -// } -// } -// -// -// // Implementations for MemberVisitor. -// -// public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) -// { -// mayThrowExceptions = mayThrowExceptions || -// ExceptionMethodMarker.mayThrowExceptions(programMethod); -// } -// -// -// public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) -// { -// mayThrowExceptions = mayThrowExceptions || -// !NoExceptionMethodMarker.doesntThrowExceptions(libraryMethod); -// } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/FieldOptimizationInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/FieldOptimizationInfo.java deleted file mode 100644 index cf8a56eb..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/FieldOptimizationInfo.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.evaluation.value.*; - -/** - * This class stores some optimization information that can be attached to - * a field. - * - * @author Eric Lafortune - */ -public class FieldOptimizationInfo -extends SimplifiedVisitor -{ - public boolean isKept() - { - return true; - } - - - public boolean isWritten() - { - return true; - } - - - public boolean isRead() - { - return true; - } - - - public boolean canBeMadePrivate() - { - return false; - } - - - public ReferenceValue getReferencedClass() - { - return null; - } - - - public Value getValue() - { - return null; - } - - - public static void setFieldOptimizationInfo(Clazz clazz, Field field) - { - field.setVisitorInfo(new FieldOptimizationInfo()); - } - - - public static FieldOptimizationInfo getFieldOptimizationInfo(Field field) - { - return (FieldOptimizationInfo)field.getVisitorInfo(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstanceofClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstanceofClassFilter.java deleted file mode 100644 index 0906914d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstanceofClassFilter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates all its method calls to another ClassVisitor, - * but only for Clazz objects that are used in an 'instanceof' test. - * - * @see InstanceofClassMarker - * @author Eric Lafortune - */ -public class InstanceofClassFilter -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - public InstanceofClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (InstanceofClassMarker.isInstanceofed(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (InstanceofClassMarker.isInstanceofed(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstanceofClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstanceofClassMarker.java deleted file mode 100644 index 47ac03a3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstanceofClassMarker.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; -import proguard.optimize.OptimizationInfoClassFilter; - -/** - * This InstructionVisitor marks all classes that are used in an 'instanceof' - * test by any of the instructions that it visits. - * - * @author Eric Lafortune - */ -public class InstanceofClassMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - ClassVisitor -{ - private final OptimizationInfoClassFilter filteredClassMarker = new OptimizationInfoClassFilter(this); - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_INSTANCEOF) - { - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.referencedClassAccept(filteredClassMarker); - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - setInstanceofed(clazz); - } - - - // Small utility methods. - - private static void setInstanceofed(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setInstanceofed(); - } - - - public static boolean isInstanceofed(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).isInstanceofed(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstantiationClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstantiationClassFilter.java deleted file mode 100644 index cf9952a6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstantiationClassFilter.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates all its method calls to another ClassVisitor, - * but only for Clazz objects that are instantiated. - * - * @author Eric Lafortune - */ -public class InstantiationClassFilter -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - public InstantiationClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (InstantiationClassMarker.isInstantiated(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (InstantiationClassMarker.isInstantiated(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstantiationClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstantiationClassMarker.java deleted file mode 100644 index 577bfa5c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/InstantiationClassMarker.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; -import proguard.optimize.OptimizationInfoClassFilter; - -/** - * This InstructionVisitor marks all classes that are instantiated by any of - * the instructions that it visits. - * - * @author Eric Lafortune - */ -public class InstantiationClassMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - ClassVisitor -{ - private final OptimizationInfoClassFilter filteredClassMarker = new OptimizationInfoClassFilter(this); - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_NEW) - { - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classConstant.referencedClassAccept(filteredClassMarker); - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - setInstantiated(clazz); - } - - - // Small utility methods. - - private static void setInstantiated(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setInstantiated(); - } - - - public static boolean isInstantiated(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).isInstantiated(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MethodInvocationMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MethodInvocationMarker.java deleted file mode 100644 index bc5ec5b9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MethodInvocationMarker.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.OptimizationInfoMemberFilter; - -/** - * This InstructionVisitor counts the number of times methods are invoked from - * the instructions that are visited. - * - * @author Eric Lafortune - */ -public class MethodInvocationMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - MemberVisitor -{ - private final OptimizationInfoMemberFilter filteredMethodMarker = new OptimizationInfoMemberFilter(this); - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Mark the referenced method, if any. - stringConstant.referencedMemberAccept(filteredMethodMarker); - } - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - // Mark the referenced method. - refConstant.referencedMemberAccept(filteredMethodMarker); - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz Clazz, Member member) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - incrementInvocationCount(programMethod); - } - - - // Small utility methods. - - private static void incrementInvocationCount(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).incrementInvocationCount(); - } - - - /** - * Returns the number of times the given method was invoked by the - * instructions that were visited. - */ - public static int getInvocationCount(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getInvocationCount(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MethodOptimizationInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MethodOptimizationInfo.java deleted file mode 100644 index 50299a22..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MethodOptimizationInfo.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.MethodLinker; -import proguard.evaluation.value.Value; - -/** - * This class stores some optimization information that can be attached to - * a method. - * - * @author Eric Lafortune - */ -public class MethodOptimizationInfo -{ - protected boolean hasNoSideEffects = false; - protected boolean hasNoExternalSideEffects = false; - protected boolean hasNoEscapingParameters = false; - protected boolean hasNoExternalReturnValues = false; - - - public boolean isKept() - { - return true; - } - - - public void setNoSideEffects() - { - hasNoSideEffects = true; - hasNoExternalSideEffects = true; - hasNoEscapingParameters = true; - } - - - public boolean hasNoSideEffects() - { - return hasNoSideEffects; - } - - - public void setNoExternalSideEffects() - { - hasNoExternalSideEffects = true; - hasNoEscapingParameters = true; - } - - - public boolean hasNoExternalSideEffects() - { - return hasNoExternalSideEffects; - } - - - public void setNoEscapingParameters() - { - hasNoEscapingParameters = true; - } - - - public boolean hasNoEscapingParameters() - { - return hasNoEscapingParameters; - } - - - public void setNoExternalReturnValues() - { - hasNoExternalReturnValues = true; - } - - - public boolean hasNoExternalReturnValues() - { - return hasNoExternalReturnValues; - } - - - // Methods that may be specialized. - - public boolean hasSideEffects() - { - return !hasNoSideEffects; - } - - - public boolean canBeMadePrivate() - { - return false; - } - - - public boolean catchesExceptions() - { - return true; - } - - - public boolean branchesBackward() - { - return true; - } - - - public boolean invokesSuperMethods() - { - return true; - } - - - public boolean invokesDynamically() - { - return true; - } - - - public boolean accessesPrivateCode() - { - return true; - } - - - public boolean accessesPackageCode() - { - return true; - } - - - public boolean accessesProtectedCode() - { - return true; - } - - - public boolean hasSynchronizedBlock() - { - return true; - } - - - public boolean returnsWithNonEmptyStack() - { - return false; - } - - - public int getInvocationCount() - { - return Integer.MAX_VALUE; - } - - - public int getParameterSize() - { - return 0; - } - - - public boolean hasUnusedParameters() - { - return false; - } - - - public boolean isParameterUsed(int variableIndex) - { - return true; - } - - - public long getUsedParameters() - { - return -1L; - } - - - public boolean hasParameterEscaped(int parameterIndex) - { - return true; - } - - - public long getEscapedParameters() - { - return -1L; - } - - - public boolean isParameterEscaping(int parameterIndex) - { - return !hasNoEscapingParameters; - } - - - public long getEscapingParameters() - { - return hasNoEscapingParameters ? 0L : -1L; - } - - - public boolean isParameterModified(int parameterIndex) - { - // TODO: Refine for static methods. - return - !hasNoSideEffects && - (!hasNoExternalSideEffects || parameterIndex == 0); - } - - - public long getModifiedParameters() - { - // TODO: Refine for static methods. - return - hasNoSideEffects ? 0L : - hasNoExternalSideEffects ? 1L : - -1L; - } - - - public boolean modifiesAnything() - { - return !hasNoExternalSideEffects; - } - - - public Value getParameterValue(int parameterIndex) - { - return null; - } - - - public boolean returnsParameter(int parameterIndex) - { - return true; - } - - - public long getReturnedParameters() - { - return -1L; - } - - - public boolean returnsNewInstances() - { - return true; - } - - - public boolean returnsExternalValues() - { - return !hasNoExternalReturnValues; - } - - - public Value getReturnValue() - { - return null; - } - - - public static void setMethodOptimizationInfo(Clazz clazz, Method method) - { - MethodLinker.lastMember(method).setVisitorInfo(new MethodOptimizationInfo()); - } - - - public static MethodOptimizationInfo getMethodOptimizationInfo(Method method) - { - return (MethodOptimizationInfo)MethodLinker.lastMember(method).getVisitorInfo(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MutableBoolean.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MutableBoolean.java deleted file mode 100644 index a4f56ccf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/MutableBoolean.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.info; - -/** - * This class provides a mutable boolean flag. - */ -public class MutableBoolean -{ - private boolean flag; - /* - private int resetCounter; - private int setCounter; - private int totalCounter; - //*/ - - - public void set() - { - flag = true; - - /* - System.out.println("MutableBoolean.set: "+resetCounter+", "+setCounter++ +", "+totalCounter++); - if (totalCounter > 5000) - { - Thread.dumpStack(); - } - //*/ - } - - - public void reset() - { - flag = false; - - /* - resetCounter++; - setCounter = 0; - //*/ - } - - - public boolean isSet() - { - return flag; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoEscapingParametersMethodMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoEscapingParametersMethodMarker.java deleted file mode 100644 index 18e9dd08..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoEscapingParametersMethodMarker.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor marks all methods that it visits as not having any - * escaping parameters (including 'this'). It will make the - * ParameterEscapeMarker consider them as such without further analysis. - * - * @see ParameterEscapeMarker - * @author Eric Lafortune - */ -public class NoEscapingParametersMethodMarker -extends SimplifiedVisitor -implements MemberVisitor -{ - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz Clazz, Member member) - { - // Ignore any attempts to mark fields. - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - markNoParameterEscaping(programMethod); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - markNoParameterEscaping(libraryMethod); - } - - - // Small utility methods. - - private static void markNoParameterEscaping(Method method) - { - MethodOptimizationInfo.getMethodOptimizationInfo(method).setNoEscapingParameters(); - } - - - public static boolean hasNoParameterEscaping(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasNoEscapingParameters(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoExternalReturnValuesMethodMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoExternalReturnValuesMethodMarker.java deleted file mode 100644 index 07419e3e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoExternalReturnValuesMethodMarker.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor marks all methods that it visits as not having any - * return values that are external reference values (only parameters or new - * instances). It will make the ParameterEscapeMarker consider them as - * such without further analysis. - * - * @see ParameterEscapeMarker - * @author Eric Lafortune - */ -public class NoExternalReturnValuesMethodMarker -extends SimplifiedVisitor -implements MemberVisitor -{ - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz Clazz, Member member) - { - // Ignore any attempts to mark fields. - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - markNoExternalReturnValues(programMethod); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - markNoExternalReturnValues(libraryMethod); - } - - - // Small utility methods. - - private static void markNoExternalReturnValues(Method method) - { - MethodOptimizationInfo.getMethodOptimizationInfo(method).setNoExternalReturnValues(); - } - - - public static boolean hasNoExternalReturnValues(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasNoExternalReturnValues(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoExternalSideEffectMethodMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoExternalSideEffectMethodMarker.java deleted file mode 100644 index f8b507f0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoExternalSideEffectMethodMarker.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor marks all methods that it visits as not having any - * external side effects. It will make the SideEffectMethodMarker consider them - * as such without further analysis. - * - * @see SideEffectMethodMarker - * @author Eric Lafortune - */ -public class NoExternalSideEffectMethodMarker -extends SimplifiedVisitor -implements MemberVisitor -{ - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz Clazz, Member member) - { - // Ignore any attempts to mark fields. - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - markNoExternalSideEffects(programMethod); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - markNoExternalSideEffects(libraryMethod); - } - - - // Small utility methods. - - private static void markNoExternalSideEffects(Method method) - { - MethodOptimizationInfo.getMethodOptimizationInfo(method).setNoExternalSideEffects(); - } - - - public static boolean hasNoExternalSideEffects(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasNoExternalSideEffects(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoSideEffectClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoSideEffectClassMarker.java deleted file mode 100644 index ea4c0edc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoSideEffectClassMarker.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.info; - -import proguard.classfile.Clazz; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor marks all classes that it visits as not having any side - * effects. It will make the SideEffectClassMarker consider them as such - * without further analysis. - * - * @see SideEffectMethodMarker - * @author Eric Lafortune - */ -public class NoSideEffectClassMarker -extends SimplifiedVisitor -implements ClassVisitor -{ - // Implementations for MemberVisitor. - - public void visitAnyClass(Clazz clazz) - { - markNoSideEffects(clazz); - } - - - // Small utility methods. - - private static void markNoSideEffects(Clazz Clazz) - { - ClassOptimizationInfo.getClassOptimizationInfo(Clazz).setNoSideEffects(); - } - - - public static boolean hasNoSideEffects(Clazz Clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(Clazz).hasNoSideEffects(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoSideEffectMethodMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoSideEffectMethodMarker.java deleted file mode 100644 index e51faf9f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NoSideEffectMethodMarker.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor marks all methods that it visits as not having any side - * effects. It will make the SideEffectMethodMarker consider them as such - * without further analysis. - * - * @see SideEffectMethodMarker - * @author Eric Lafortune - */ -public class NoSideEffectMethodMarker -extends SimplifiedVisitor -implements MemberVisitor -{ - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz Clazz, Member member) - { - // Ignore any attempts to mark fields. - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - markNoSideEffects(programMethod); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - markNoSideEffects(libraryMethod); - } - - - // Small utility methods. - - private static void markNoSideEffects(Method method) - { - MethodOptimizationInfo.getMethodOptimizationInfo(method).setNoSideEffects(); - } - - - public static boolean hasNoSideEffects(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasNoSideEffects(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NonEmptyStackReturnMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NonEmptyStackReturnMarker.java deleted file mode 100644 index 9e2194a3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NonEmptyStackReturnMarker.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.visitor.StackSizeComputer; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor marks all methods that return with a non-empty stack - * (other than the return value). - * - * @author Eric Lafortune - */ -public class NonEmptyStackReturnMarker -extends SimplifiedVisitor -implements InstructionVisitor -{ - private final StackSizeComputer stackSizeComputer; - - - /** - * Creates a new NonEmptyStackReturnMarker - * @param stackSizeComputer the stack size computer that can return the - * stack sizes at the instructions that are - * visited. - */ - public NonEmptyStackReturnMarker(StackSizeComputer stackSizeComputer) - { - this.stackSizeComputer = stackSizeComputer; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_LRETURN: - case InstructionConstants.OP_DRETURN: - markReturnWithNonEmptyStack(method, offset, 2); - break; - - case InstructionConstants.OP_IRETURN: - case InstructionConstants.OP_FRETURN: - case InstructionConstants.OP_ARETURN: - markReturnWithNonEmptyStack(method, offset, 1); - break; - - case InstructionConstants.OP_RETURN: - markReturnWithNonEmptyStack(method, offset, 0); - break; - } - } - - - // Small utility methods. - - /** - * Marks the given method if the stack before the given instruction offset - * has a size larger than the given size. - */ - private void markReturnWithNonEmptyStack(Method method, - int offset, - int stackSize) - { - if (!stackSizeComputer.isReachable(offset) || - stackSizeComputer.getStackSizeBefore(offset) > stackSize) - { - setReturnsWithNonEmptyStack(method); - } - } - - - private static void setReturnsWithNonEmptyStack(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setReturnsWithNonEmptyStack(); - } - - - public static boolean returnsWithNonEmptyStack(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).returnsWithNonEmptyStack(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NonPrivateMemberMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NonPrivateMemberMarker.java deleted file mode 100644 index 9218c8f1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/NonPrivateMemberMarker.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.optimize.OptimizationInfoMemberFilter; - -/** - * This ClassVisitor marks all class members that can not be made private in the - * classes that it visits, and in the classes to which they refer. - * - * @author Eric Lafortune - */ -public class NonPrivateMemberMarker -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor -{ - private final MemberVisitor filteredMemberMarker = new OptimizationInfoMemberFilter(this); - private final MemberVisitor implementedMethodMarker = new OptimizationInfoMemberFilter( - new MethodImplementationFilter(this)); - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Mark all referenced class members in different classes. - programClass.constantPoolEntriesAccept(this); - - // Explicitly mark the method. - programClass.methodAccept(ClassConstants.METHOD_NAME_CLINIT, - ClassConstants.METHOD_TYPE_CLINIT, - filteredMemberMarker); - - // Explicitly mark the parameterless method. - programClass.methodAccept(ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT, - filteredMemberMarker); - - // Mark all methods that may have implementations. - programClass.methodsAccept(implementedMethodMarker); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // The referenced class member, if any, can never be made private, - // even if it's in the same class. - stringConstant.referencedMemberAccept(filteredMemberMarker); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - Clazz referencedClass = refConstant.referencedClass; - - // Is it referring to a class member in another class? - // The class member might be in another class, or - // it may be referenced through another class. - if (referencedClass != null && - !referencedClass.equals(clazz) || - !refConstant.getClassName(clazz).equals(clazz.getName())) - { - // The referenced class member can never be made private. - refConstant.referencedMemberAccept(filteredMemberMarker); - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - markCanNotBeMadePrivate(programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - markCanNotBeMadePrivate(programMethod); - } - - - // Small utility methods. - - private static void markCanNotBeMadePrivate(Field field) - { - ProgramFieldOptimizationInfo.getProgramFieldOptimizationInfo(field).setCanNotBeMadePrivate(); - } - - - /** - * Returns whether the given field can be made private. - */ - public static boolean canBeMadePrivate(Field field) - { - return FieldOptimizationInfo.getFieldOptimizationInfo(field).canBeMadePrivate(); - } - - - private static void markCanNotBeMadePrivate(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setCanNotBeMadePrivate(); - } - - - /** - * Returns whether the given method can be made private. - */ - public static boolean canBeMadePrivate(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).canBeMadePrivate(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/OptimizationCodeAttributeFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/OptimizationCodeAttributeFilter.java deleted file mode 100644 index 81c1e6d4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/OptimizationCodeAttributeFilter.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.optimize.KeepMarker; - -/** - * This AttributeVisitor delegates calls for code attributes to another - * AttributeVisitor, but only if they can be optimized. - *

- * Note: any other attribute will not be delegated. - *

- * - * @author Thomas Neidhart - */ -public class OptimizationCodeAttributeFilter -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final AttributeVisitor attributeVisitor; - private final AttributeVisitor otherAttributeVisitor; - - - /** - * Creates a new OptimizationCodeAttributeFilter. - * @param attributeVisitor the AttributeVisitor to which visits will - * be delegated. - */ - public OptimizationCodeAttributeFilter(AttributeVisitor attributeVisitor) - { - this(attributeVisitor, null); - } - - - /** - * Creates a new OptimizationCodeAttributeFilter. - * @param attributeVisitor the AttributeVisitor to which visits will - * be delegated if the code attribute can be optimized. - * @param otherAttributeVisitor the AttributeVisitor to which visits will - * be delegated if the code attribute must be kept. - */ - public OptimizationCodeAttributeFilter(AttributeVisitor attributeVisitor, - AttributeVisitor otherAttributeVisitor) - { - this.attributeVisitor = attributeVisitor; - this.otherAttributeVisitor = otherAttributeVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - AttributeVisitor visitor = !KeepMarker.isKept(codeAttribute) ? - attributeVisitor : otherAttributeVisitor; - - if (visitor != null) - { - visitor.visitCodeAttribute(clazz, method, codeAttribute); - } - } - -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/PackageVisibleMemberContainingClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/PackageVisibleMemberContainingClassMarker.java deleted file mode 100644 index 16939703..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/PackageVisibleMemberContainingClassMarker.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor marks all classes that contain package visible members. - * - * @author Eric Lafortune - */ -public class PackageVisibleMemberContainingClassMarker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor -{ - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - // Check the class itself. - if ((clazz.getAccessFlags() & ClassConstants.ACC_PUBLIC) == 0) - { - setPackageVisibleMembers(clazz); - } - else - { - // Check the members. - clazz.fieldsAccept(this); - clazz.methodsAccept(this); - } - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - if ((member.getAccessFlags() & - (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_PUBLIC)) == 0) - { - setPackageVisibleMembers(clazz); - } - } - - - // Small utility methods. - - private static void setPackageVisibleMembers(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setContainsPackageVisibleMembers(); - } - - - public static boolean containsPackageVisibleMembers(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).containsPackageVisibleMembers(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/PackageVisibleMemberInvokingClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/PackageVisibleMemberInvokingClassMarker.java deleted file mode 100644 index 4a98b8f2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/PackageVisibleMemberInvokingClassMarker.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ConstantVisitor marks all classes that refer to package visible classes - * or class members. - * - * @author Eric Lafortune - */ -public class PackageVisibleMemberInvokingClassMarker -extends SimplifiedVisitor -implements ConstantVisitor, - ClassVisitor, - MemberVisitor -{ - private Clazz referencingClass; - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Check the referenced class and class member, if any. - if (stringConstant.referencedClass != clazz) - { - referencingClass = clazz; - - stringConstant.referencedClassAccept(this); - stringConstant.referencedMemberAccept(this); - } - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - // Check the referenced class and class member. - if (refConstant.referencedClass != clazz) - { - referencingClass = clazz; - - refConstant.referencedClassAccept(this); - refConstant.referencedMemberAccept(this); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Check the referenced class. - if (classConstant.referencedClass != clazz) - { - referencingClass = clazz; - - classConstant.referencedClassAccept(this); - } - } - - - // Implementations for ClassVisitor. - - public void visitAnyClass(Clazz clazz) - { - if ((clazz.getAccessFlags() & - ClassConstants.ACC_PUBLIC) == 0) - { - setInvokesPackageVisibleMembers(referencingClass); - } - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz clazz, Member member) - { - if ((member.getAccessFlags() & - (ClassConstants.ACC_PUBLIC | - ClassConstants.ACC_PRIVATE)) == 0) - { - setInvokesPackageVisibleMembers(referencingClass); - } - } - - - // Small utility methods. - - private static void setInvokesPackageVisibleMembers(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setInvokesPackageVisibleMembers(); - } - - - public static boolean invokesPackageVisibleMembers(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).invokesPackageVisibleMembers(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterEscapeMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterEscapeMarker.java deleted file mode 100644 index 710e2043..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterEscapeMarker.java +++ /dev/null @@ -1,924 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.*; - -/** - * This MemberVisitor, AttributeVisitor, and InstructionVisitor marks the - * reference parameters that are escaping, that are modified, or that are - * returned. - * - * It also marks methods that may modify anything on the heap. - * - * The class must be called as a MemberVisitor on all members (to mark the - * parameters of native methods, without code attributes), then as an - * AttributeVisitor on their code attributes (so it can run its PartialEvaluator - * and ReferenceEscapeChecker), and finally as an InstructionVisitor on its - * instructions (to actually mark the parameters). - * - * @see SideEffectClassChecker - * @see SideEffectClassMarker - * @author Eric Lafortune - */ -public class ParameterEscapeMarker -extends SimplifiedVisitor -implements MemberVisitor, - AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - ParameterVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("pem") != null; - //*/ - - - private final MutableBoolean repeatTrigger; - private final PartialEvaluator partialEvaluator; - private final boolean runPartialEvaluator; - private final ReferenceEscapeChecker referenceEscapeChecker; - private final boolean runReferenceEscapeChecker; - - private final MemberVisitor parameterMarker = new AllParameterVisitor(true, this); - - // Parameters and values for visitor methods. - private Method referencingMethod; - private int referencingOffset; - private int referencingPopCount; - private boolean isReturnValueEscaping; - private boolean isReturnValueModified; - - - /** - * Creates a new ParameterEscapeMarker. - */ - public ParameterEscapeMarker(MutableBoolean repeatTrigger) - { - this(repeatTrigger, - new BasicValueFactory()); - } - - - /** - * Creates a new ParameterEscapeMarker. - */ - public ParameterEscapeMarker(MutableBoolean repeatTrigger, - ValueFactory valueFactory) - { - this(repeatTrigger, - valueFactory, - new ReferenceTracingValueFactory(valueFactory)); - } - - - /** - * Creates a new ParameterEscapeMarker. - */ - public ParameterEscapeMarker(MutableBoolean repeatTrigger, - ValueFactory valueFactory, - ReferenceTracingValueFactory tracingValueFactory) - { - this(repeatTrigger, - new PartialEvaluator(tracingValueFactory, - new ParameterTracingInvocationUnit(new BasicInvocationUnit(tracingValueFactory)), - true, - tracingValueFactory), - true); - } - - - /** - * Creates a new ParameterEscapeMarker. - */ - public ParameterEscapeMarker(MutableBoolean repeatTrigger, - PartialEvaluator partialEvaluator, - boolean runPartialEvaluator) - { - this(repeatTrigger, - partialEvaluator, - runPartialEvaluator, - new ReferenceEscapeChecker(partialEvaluator, false), - true); - } - - - /** - * Creates a new ParameterEscapeMarker. - */ - public ParameterEscapeMarker(MutableBoolean repeatTrigger, - PartialEvaluator partialEvaluator, - boolean runPartialEvaluator, - ReferenceEscapeChecker referenceEscapeChecker, - boolean runReferenceEscapeChecker) - { - this.repeatTrigger = repeatTrigger; - this.partialEvaluator = partialEvaluator; - this.runPartialEvaluator = runPartialEvaluator; - this.referenceEscapeChecker = referenceEscapeChecker; - this.runReferenceEscapeChecker = runReferenceEscapeChecker; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - int accessFlags = programMethod.getAccessFlags(); - - // Is it a native method? - if ((accessFlags & ClassConstants.ACC_NATIVE) != 0) - { - // Mark all parameters. - markModifiedParameters(programMethod, -1L); - markEscapingParameters(programMethod, -1L); - markReturnedParameters(programMethod, -1L); - markAnythingModified(programMethod); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Evaluate the code. - if (runPartialEvaluator) - { - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - } - - if (runReferenceEscapeChecker) - { - referenceEscapeChecker.visitCodeAttribute(clazz, method, codeAttribute); - } - - if (DEBUG) - { - // These results are not complete yet, since this class must still - // be called as an InstructionVisitor. - System.out.println("ParameterEscapeMarker: [" + clazz.getName() + "." + method.getName(clazz) + method.getDescriptor(clazz) + "]"); - - int parameterCount = - ClassUtil.internalMethodParameterCount(method.getDescriptor(clazz), - method.getAccessFlags()); - - for (int index = 0; index < parameterCount; index++) - { - System.out.println(" " + -// (hasParameterEscaped(method, index) ? 'e' : '.') + - (isParameterEscaping(method, index) ? 'E' : '.') + - (isParameterReturned(method, index) ? 'R' : '.') + - (isParameterModified(method, index) ? 'M' : '.') + - " P" + index); - } - - System.out.println(" " + - (returnsExternalValues(method) ? 'X' : '.') + - " Return value"); - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_AASTORE: - // Mark array parameters whose element is modified. - markModifiedParameters(method, - offset, - simpleInstruction.stackPopCount(clazz) - 1); - - // Mark reference values that are put in the array. - markEscapingParameters(method, offset, 0); - break; - - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_LASTORE: - case InstructionConstants.OP_FASTORE: - case InstructionConstants.OP_DASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - // Mark array parameters whose element is modified. - markModifiedParameters(method, - offset, - simpleInstruction.stackPopCount(clazz) - 1); - break; - - case InstructionConstants.OP_ARETURN: - // Mark returned reference values. - markReturnedParameters(clazz, method, offset, 0); - break; - - case InstructionConstants.OP_ATHROW: - // Mark the escaping reference values. - markEscapingParameters(method, offset, 0); - break; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_LDC: - case InstructionConstants.OP_LDC_W: - case InstructionConstants.OP_NEW: - case InstructionConstants.OP_ANEWARRAY: - case InstructionConstants.OP_MULTIANEWARRAY: - case InstructionConstants.OP_GETSTATIC: - // Mark possible modifications due to initializers. - referencingMethod = method; - referencingOffset = offset; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_PUTSTATIC: - // Mark some global modification. - markAnythingModified(method); - - // Mark reference values that are put in the field. - markEscapingParameters(method, offset, 0); - break; - - case InstructionConstants.OP_PUTFIELD: - // Mark reference parameters whose field is modified. - markModifiedParameters(method, - offset, - constantInstruction.stackPopCount(clazz) - 1); - - // Mark reference values that are put in the field. - markEscapingParameters(method, offset, 0); - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - case InstructionConstants.OP_INVOKEDYNAMIC: - // Mark reference parameters that are modified as parameters - // of the invoked method. - // Mark reference values that are escaping as parameters - // of the invoked method. - // Mark escaped reference parameters in the invoked method. - referencingMethod = method; - referencingOffset = offset; - referencingPopCount = constantInstruction.stackPopCount(clazz); - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - Clazz referencedClass = stringConstant.referencedClass; - - // If a static initializer may modify anything, so does the referencing - // method. - if (referencedClass == null || - SideEffectClassChecker.mayHaveSideEffects(clazz, - referencedClass)) - { - markAnythingModified(referencingMethod); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - Clazz referencedClass = classConstant.referencedClass; - - // If a static initializer may modify anything, so does the referencing - // method. - if (referencedClass == null || - SideEffectClassChecker.mayHaveSideEffects(clazz, - referencedClass)) - { - markAnythingModified(referencingMethod); - } - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - markAnythingModified(referencingMethod); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - clazz.constantPoolEntryAccept(fieldrefConstant.u2classIndex, this); - } - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - Method referencedMethod = (Method)refConstant.referencedMember; - - // If the referenced method or a static initializer may modify anything, - // so does the referencing method. - if (referencedMethod == null || - modifiesAnything(referencedMethod) || - SideEffectClassChecker.mayHaveSideEffects(clazz, - refConstant.referencedClass, - referencedMethod)) - { - markAnythingModified(referencingMethod); - } - - // Do we know the invoked method? - if (referencedMethod == null) - { - // Mark all parameters of the invoking method that are passed to - // the invoked method, since they may escape or or be modified - // there. - for (int parameterOffset = 0; parameterOffset < referencingPopCount; parameterOffset++) - { - int stackEntryIndex = referencingPopCount - parameterOffset - 1; - - markEscapingParameters(referencingMethod, - referencingOffset, - stackEntryIndex); - - markModifiedParameters(referencingMethod, - referencingOffset, - stackEntryIndex); - } - } - else - { - // Remember whether the return value of the method is escaping or - // modified later on. - isReturnValueEscaping = - referenceEscapeChecker.isInstanceEscaping(referencingOffset); - - isReturnValueModified = - referenceEscapeChecker.isInstanceModified(referencingOffset); - - // Mark parameters of the invoking method that are passed to the - // invoked method and escaping or modified there. - refConstant.referencedMemberAccept(parameterMarker); - } - } - - - // Implementations for ParameterVisitor. - - public void visitParameter(Clazz clazz, Member member, int parameterIndex, int parameterCount, int parameterOffset, int parameterSize, String parameterType, Clazz referencedClass) - { - if (!ClassUtil.isInternalPrimitiveType(parameterType.charAt(0))) - { - Method method = (Method)member; - - // Is the parameter escaping from the method, - // or is it returned and then escaping? - if (isParameterEscaping(method, parameterIndex) || - (isParameterReturned(method, parameterIndex) && - isReturnValueEscaping)) - { - markEscapingParameters(referencingMethod, - referencingOffset, - parameterSize - parameterOffset - 1); - } - - // Is the parameter being modified in the method. - // or is it returned and then modified? - if (isParameterModified(method, parameterIndex) || - (isParameterReturned(method, parameterIndex) && - isReturnValueModified)) - { - markModifiedParameters(referencingMethod, - referencingOffset, - parameterSize - parameterOffset - 1); - } - } - } - - - // Small utility methods. - - /** - * Marks the producing reference parameters (and the classes) of the - * specified stack entry at the given instruction offset. - */ - private void markEscapingParameters(Method method, - int consumerOffset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(consumerOffset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - ReferenceValue referenceValue = stackEntry.referenceValue(); - - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS) - { - markEscapingParameters(method, referenceValue); - } - } - } - - - /** - * Marks the producing parameters (and the classes) of the given - * reference value. - */ - private void markEscapingParameters(Method method, - ReferenceValue referenceValue) - { - TracedReferenceValue tracedReferenceValue = (TracedReferenceValue)referenceValue; - InstructionOffsetValue producers = tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - int producerCount = producers.instructionOffsetCount(); - for (int index = 0; index < producerCount; index++) - { - if (producers.isMethodParameter(index)) - { - // We know exactly which parameter is escaping. - markParameterEscaping(method, producers.methodParameter(index)); - } - } - } - - - /** - * Marks the given parameter as escaping from the given method. - */ - private void markParameterEscaping(Method method, int parameterIndex) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - if (!methodOptimizationInfo.isParameterEscaping(parameterIndex) && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).setParameterEscaping(parameterIndex); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.isParameterEscaping(parameterIndex)) - { - repeatTrigger.set(); - } - } - } - - - /** - * Marks the given parameters as escaping from the given method. - */ - private void markEscapingParameters(Method method, long escapingParameters) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - long oldEscapingParameters = - methodOptimizationInfo.getEscapingParameters(); - - if ((~oldEscapingParameters & escapingParameters) != 0 && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).updateEscapingParameters(escapingParameters); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.getEscapingParameters() != oldEscapingParameters) - { - repeatTrigger.set(); - } - } - } - - - /** - * Returns whether the given parameter is escaping from the given method. - */ - public static boolean isParameterEscaping(Method method, int parameterIndex) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).isParameterEscaping(parameterIndex); - } - - - /** - * Returns which parameters are escaping from the given method. - */ - public static long getEscapingParameters(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getEscapingParameters(); - } - - - /** - * Marks the method and the returned reference parameters of the specified - * stack entry at the given instruction offset. - */ - private void markReturnedParameters(Clazz clazz, - Method method, - int returnOffset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(returnOffset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - ReferenceValue referenceValue = stackEntry.referenceValue(); - - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS && - mayReturnType(clazz, method, referenceValue)) - { - markReturnedParameters(method, referenceValue); - } - } - } - - - /** - * Marks the method and the producing parameters of the given reference - * value. - */ - private void markReturnedParameters(Method method, - ReferenceValue referenceValue) - { - TracedReferenceValue tracedReferenceValue = (TracedReferenceValue)referenceValue; - InstructionOffsetValue producers = tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - int producerCount = producers.instructionOffsetCount(); - for (int index = 0; index < producerCount; index++) - { - if (producers.isMethodParameter(index)) - { - // We know exactly which parameter is returned. - markParameterReturned(method, producers.methodParameter(index)); - } - else if (producers.isFieldValue(index)) - { - markReturnsExternalValues(method); - } - else if (producers.isNewinstance(index) || - producers.isExceptionHandler(index)) - { - markReturnsNewInstances(method); - } - } - } - - - /** - * Marks the given parameter as returned from the given method. - */ - private void markParameterReturned(Method method, int parameterIndex) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - if (!methodOptimizationInfo.returnsParameter(parameterIndex) && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).setParameterReturned(parameterIndex); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.returnsParameter(parameterIndex)) - { - repeatTrigger.set(); - } - } - } - - - /** - * Marks the given parameters as returned from the given method. - */ - private void markReturnedParameters(Method method, long returnedParameters) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - long oldReturnedParameters = - methodOptimizationInfo.getReturnedParameters(); - - if ((~oldReturnedParameters & returnedParameters) != 0 && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).updateReturnedParameters(returnedParameters); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.getReturnedParameters() != oldReturnedParameters) - { - repeatTrigger.set(); - } - } - } - - - /** - * Returns whether the given parameter is returned from the given method. - */ - public static boolean isParameterReturned(Method method, int parameterIndex) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).returnsParameter(parameterIndex); - } - - - /** - * Returns which parameters are returned from the given method. - */ - public static long getReturnedParameters(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getReturnedParameters(); - } - - - /** - * Marks that the given method returns new instances (created inside the - * method). - */ - private void markReturnsNewInstances(Method method) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - if (!methodOptimizationInfo.returnsNewInstances() && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).setReturnsNewInstances(); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.returnsNewInstances()) - { - repeatTrigger.set(); - } - } - } - - - /** - * Returns whether the given method returns new instances (created inside - * the method). - */ - public static boolean returnsNewInstances(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).returnsNewInstances(); - } - - - /** - * Marks that the given method returns external reference values (not - * parameter or new instance). - */ - private void markReturnsExternalValues(Method method) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - if (!methodOptimizationInfo.returnsExternalValues() && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).setReturnsExternalValues(); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.returnsExternalValues()) - { - repeatTrigger.set(); - } - } - } - - - /** - * Returns whether the given method returns external reference values - * (not parameter or new instance). - */ - public static boolean returnsExternalValues(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).returnsExternalValues(); - } - - - /** - * Returns whether the given method may return the given type of reference - * value - */ - private boolean mayReturnType(Clazz clazz, - Method method, - ReferenceValue referenceValue) - { - String returnType = - ClassUtil.internalMethodReturnType(method.getDescriptor(clazz)); - - Clazz[] referencedClasses = method instanceof ProgramMethod ? - ((ProgramMethod)method).referencedClasses : - ((LibraryMethod)method).referencedClasses; - - Clazz referencedClass = - referencedClasses == null || - !ClassUtil.isInternalClassType(returnType) ? null : - referencedClasses[referencedClasses.length - 1]; - - return referenceValue.instanceOf(returnType, - referencedClass) != Value.NEVER; - } - - - /** - * Marks the producing reference parameters of the specified stack entry at - * the given instruction offset. - */ - private void markModifiedParameters(Method method, - int offset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(offset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - ReferenceValue referenceValue = stackEntry.referenceValue(); - - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS) - { - markModifiedParameters(method, referenceValue); - } - } - } - - - /** - * Marks the producing parameters of the given reference value. - */ - private void markModifiedParameters(Method method, - ReferenceValue referenceValue) - { - TracedReferenceValue tracedReferenceValue = (TracedReferenceValue)referenceValue; - InstructionOffsetValue producers = tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - int producerCount = producers.instructionOffsetCount(); - for (int index = 0; index < producerCount; index++) - { - if (producers.isMethodParameter(index)) - { - // We know exactly which parameter is being modified. - markParameterModified(method, producers.methodParameter(index)); - } - else if (!producers.isNewinstance(index) && - !producers.isExceptionHandler(index)) - { - // If some unknown instance is modified, any escaping parameters - // may be modified. - markModifiedParameters(method, getEscapingParameters(method)); - markAnythingModified(method); - } - } - } - - - /** - * Marks the given parameter as modified by the given method. - */ - private void markParameterModified(Method method, int parameterIndex) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - if (!methodOptimizationInfo.isParameterModified(parameterIndex) && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).setParameterModified(parameterIndex); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.isParameterModified(parameterIndex)) - { - repeatTrigger.set(); - } - } - } - - - /** - * Marks the given parameters as modified by the given method. - */ - private void markModifiedParameters(Method method, long modifiedParameters) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - long oldModifiedParameters = - methodOptimizationInfo.getModifiedParameters(); - - if ((~oldModifiedParameters & modifiedParameters) != 0 && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).updateModifiedParameters(modifiedParameters); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.getModifiedParameters() != oldModifiedParameters) - { - repeatTrigger.set(); - } - } - } - - - /** - * Returns whether the given parameter is modified by the given method. - */ - public static boolean isParameterModified(Method method, int parameterIndex) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).isParameterModified(parameterIndex); - } - - - /** - * Returns which parameters are modified by the given method. - */ - public static long getModifiedParameters(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getModifiedParameters(); - } - - - /** - * Marks that anything may be modified by the given method. - */ - private void markAnythingModified(Method method) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - if (!methodOptimizationInfo.modifiesAnything() && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).setModifiesAnything(); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.modifiesAnything()) - { - repeatTrigger.set(); - } - } - } - - - /** - * Returns whether anything may be modified by the given method. This takes - * into account the side effects of static initializers, except the static - * initializer of the invoked method (because it is better checked - * explicitly as a function of the referencing class). - * - * @see SideEffectClassChecker#mayHaveSideEffects(Clazz, Clazz, Member) - */ - public static boolean modifiesAnything(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).modifiesAnything(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterEscapedMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterEscapedMarker.java deleted file mode 100644 index 04faf1fd..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterEscapedMarker.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.*; - -/** - * This ClassPoolVisitor marks the reference parameters that have escaped or - * that are escaping, outside or inside their methods. - * - * @see ReferenceEscapeChecker - * @see ParameterEscapeMarker - * @author Eric Lafortune - */ -public class ParameterEscapedMarker -extends SimplifiedVisitor -implements ClassPoolVisitor, - ClassVisitor, - MemberVisitor, - AttributeVisitor, - InstructionVisitor, - ConstantVisitor -{ - /* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("pem") != null; - //*/ - - - private final ClassVisitor parameterEscapedMarker = - new AllMethodVisitor( - new AllAttributeVisitor(this)); - private final ValueFactory valueFactory = new BasicValueFactory(); - private final ReferenceTracingValueFactory tracingValueFactory = new ReferenceTracingValueFactory(valueFactory); - private final PartialEvaluator partialEvaluator = - new PartialEvaluator(tracingValueFactory, - new ParameterTracingInvocationUnit(new BasicInvocationUnit(tracingValueFactory)), - true, - tracingValueFactory); - private final ReferenceEscapeChecker referenceEscapeChecker = new ReferenceEscapeChecker(partialEvaluator, false); - - // Parameters and values for visitor methods. - private boolean newEscapes; - private Method referencingMethod; - private int referencingOffset; - private int referencingPopCount; - - - /** - * Creates a new ParameterModificationMarker. - */ - public ParameterEscapedMarker() - { - } - - - // Implementations for ClassPoolVisitor. - - public void visitClassPool(ClassPool classPool) - { - // Go over all classes and their methods, marking if parameters are - // modified, until no new cases can be found. - do - { - newEscapes = false; - - if (DEBUG) - { - System.out.println("ParameterEscapedMarker: new iteration"); - } - - // Go over all classes and their methods once. - classPool.classesAccept(parameterEscapedMarker); - } - while (newEscapes); - - if (DEBUG) - { - classPool.classesAccept(new AllMethodVisitor(this)); - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (DEBUG) - { - System.out.println("ParameterEscapedMarker: [" + programClass.getName() + "." + programMethod.getName(programClass) + programMethod.getDescriptor(programClass) + "]"); - - int parameterSize = - ClassUtil.internalMethodParameterSize(programMethod.getDescriptor(programClass), - programMethod.getAccessFlags()); - - for (int index = 0; index < parameterSize; index++) - { - System.out.println(" " + - (hasParameterEscaped(programMethod, index) ? 'e' : '.') + - " P" + index); - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Evaluate the code. - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - referenceEscapeChecker.visitCodeAttribute(clazz, method, codeAttribute); - - // Mark the parameters that are modified from the code. - codeAttribute.instructionsAccept(clazz, method, partialEvaluator.tracedInstructionFilter(this)); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - // Mark escaped reference parameters in the invoked method. - referencingMethod = method; - referencingOffset = offset; - referencingPopCount = constantInstruction.stackPopCount(clazz); - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - Method referencedMethod = (Method)refConstant.referencedMember; - - if (referencedMethod != null && - MethodOptimizationInfo.getMethodOptimizationInfo(referencedMethod) instanceof ProgramMethodOptimizationInfo) - { - // Mark reference parameters that are passed to the method. - for (int parameterIndex = 0; parameterIndex < referencingPopCount; parameterIndex++) - { - int stackEntryIndex = referencingPopCount - parameterIndex - 1; - - TracedStack stackBefore = partialEvaluator.getStackBefore(referencingOffset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - // Has the parameter escaped outside or inside the referencing - // method? - if (hasEscapedBefore(referencingOffset, stackEntryIndex)) - { - markParameterEscaped(referencedMethod, parameterIndex); - } - } - } - } - } - - - // Small utility methods. - - /** - * Returns whether any of the producing reference values of the specified - * stack entry before the given instruction offset are escaping or have - * escaped. - */ - private boolean hasEscapedBefore(int instructionOffset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(instructionOffset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - ReferenceValue referenceValue = stackEntry.referenceValue(); - - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS && - hasEscaped(referenceValue)) - { - return true; - } - } - - return false; - } - - - /** - * Returns whether the producing reference value is escaping or has escaped. - */ - private boolean hasEscaped(ReferenceValue referenceValue) - { - TracedReferenceValue tracedReferenceValue = (TracedReferenceValue)referenceValue; - InstructionOffsetValue instructionOffsetValue = tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - int count = instructionOffsetValue.instructionOffsetCount(); - for (int index = 0; index < count; index++) - { - if (instructionOffsetValue.isMethodParameter(index) ? - hasParameterEscaped(referencingMethod, instructionOffsetValue.methodParameter(index)) : - referenceEscapeChecker.isInstanceEscaping(instructionOffsetValue.instructionOffset(index))) - { - return true; - } - } - - return false; - } - - - /** - * Marks the given parameter as escaped from the given method. - */ - private void markParameterEscaped(Method method, int parameterIndex) - { - ProgramMethodOptimizationInfo info = ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method); - if (!info.hasParameterEscaped(parameterIndex)) - { - info.setParameterEscaped(parameterIndex); - - newEscapes = true; - } - } - - - /** - * Marks the given parameters as escaped from the given method. - */ - private void markEscapedParameters(Method method, long escapedParameters) - { - ProgramMethodOptimizationInfo info = ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method); - if ((~info.getEscapedParameters() & escapedParameters) != 0) - { - info.updateEscapedParameters(escapedParameters); - - newEscapes = true; - } - } - - - /** - * Returns whether the given parameter is escaped from the given method. - */ - public static boolean hasParameterEscaped(Method method, int parameterIndex) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasParameterEscaped(parameterIndex); - } - - - /** - * Returns which parameters are escaped from the given method. - */ - public static long getEscapedParameters(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getEscapedParameters(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterUsageMarker.java deleted file mode 100644 index d7be40ac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ParameterUsageMarker.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.PartialEvaluator; - -/** - * This MemberVisitor counts the parameters and marks the used parameters - * of the methods that it visits. It also marks the 'this' parameters of - * methods that have hierarchies. - * - * @author Eric Lafortune - */ -public class ParameterUsageMarker -extends SimplifiedVisitor -implements MemberVisitor, - AttributeVisitor, - InstructionVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("pum") != null; - //*/ - - - private final boolean markThisParameter; - private final boolean markAllParameters; - private final boolean analyzeCode; - private final PartialEvaluator partialEvaluator = new PartialEvaluator(); - - - /** - * Creates a new ParameterUsageMarker. - */ - public ParameterUsageMarker() - { - this(false, false); - } - - - /** - * Creates a new ParameterUsageMarker that optionally marks all parameters. - * @param markThisParameter specifies whether all 'this' parameters should - * be marked as being used. - * @param markAllParameters specifies whether all other parameters should - * be marked as being used. - */ - public ParameterUsageMarker(boolean markThisParameter, - boolean markAllParameters) - { - this(markThisParameter, markAllParameters, true); - } - - - /** - * Creates a new ParameterUsageMarker that optionally marks all parameters. - * @param markThisParameter specifies whether all 'this' parameters should - * be marked as being used. - * @param markAllParameters specifies whether all other parameters should - * be marked as being used. - * @param analyzeCode specifies whether the code of visited methods - * should be analyzed for used parameters. - */ - public ParameterUsageMarker(boolean markThisParameter, - boolean markAllParameters, - boolean analyzeCode) - { - this.markThisParameter = markThisParameter; - this.markAllParameters = markAllParameters; - this.analyzeCode = analyzeCode; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - int parameterSize = - ClassUtil.internalMethodParameterSize(programMethod.getDescriptor(programClass), - programMethod.getAccessFlags()); - - if (parameterSize > 0) - { - int accessFlags = programMethod.getAccessFlags(); - - // Must we mark the 'this' parameter? - if (markThisParameter && - (accessFlags & ClassConstants.ACC_STATIC) == 0) - { - // Mark the 'this' parameter. - markParameterUsed(programMethod, 0); - } - - // Must we mark all other parameters? - if (markAllParameters) - { - // Mark all parameters, without the 'this' parameter. - markUsedParameters(programMethod, - (accessFlags & ClassConstants.ACC_STATIC) != 0 ? - -1L : -2L); - } - - // Is it a native method? - if ((accessFlags & ClassConstants.ACC_NATIVE) != 0) - { - // Mark all parameters. - markUsedParameters(programMethod, -1L); - } - - // Is it an abstract method? - else if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) - { - // Mark the 'this' parameter. - markParameterUsed(programMethod, 0); - } - - // Is it a non-native, concrete method? - else - { - // Is the method not static, but synchronized, or can it have - // other implementations, or is it a class instance initializer? - if ((accessFlags & ClassConstants.ACC_STATIC) == 0 && - ((accessFlags & ClassConstants.ACC_SYNCHRONIZED) != 0 || - programClass.mayHaveImplementations(programMethod) || - programMethod.getName(programClass).equals(ClassConstants.METHOD_NAME_INIT))) - { - // Mark the 'this' parameter. - markParameterUsed(programMethod, 0); - } - - if (analyzeCode) - { - // Mark the parameters that are used by the code. - programMethod.attributesAccept(programClass, this); - } - } - - if (DEBUG) - { - System.out.print("ParameterUsageMarker: ["+programClass.getName() +"."+programMethod.getName(programClass)+programMethod.getDescriptor(programClass)+"]: "); - for (int variableIndex = 0; variableIndex < parameterSize; variableIndex++) - { - System.out.print(isParameterUsed(programMethod, variableIndex) ? '+' : '-'); - } - System.out.println(); - } - - } - - // Set the parameter size. - setParameterSize(programMethod, parameterSize); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - // Can the method have other implementations? - if (libraryClass.mayHaveImplementations(libraryMethod)) - { - // All implementations must keep all parameters of this method, - // including the 'this' parameter. - markUsedParameters(libraryMethod, -1L); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Evaluate the code. - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - - // Mark the parameters that are used by the code. - codeAttribute.instructionsAccept(clazz, method, this); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - if (partialEvaluator.isTraced(offset) && - variableInstruction.isLoad()) - { - int variableIndex = variableInstruction.variableIndex; - if (variableIndex < codeAttribute.u2maxLocals) - { - // The parameter indices stored in the producer values are - // parameter offsets, taking into account Category 2 types, - // and therefore compatible with variable indices. - Value producer = - partialEvaluator.getVariablesBefore(offset).getProducerValue(variableIndex); - if (producer != null && - producer.instructionOffsetValue().contains(variableIndex | InstructionOffsetValue.METHOD_PARAMETER)) - { - // Mark the variable. - markParameterUsed(method, variableIndex); - - // Account for Category 2 instructions, which take up two entries. - if (variableInstruction.stackPopCount(clazz) == 2 || - variableInstruction.stackPushCount(clazz) == 2) - { - markParameterUsed(method, variableIndex + 1); - } - } - } - } - } - - - // Small utility methods. - - /** - * Sets the total size of the parameters. - */ - private static void setParameterSize(Method method, int parameterSize) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setParameterSize(parameterSize); - } - - - /** - * Returns the total size of the parameters. - */ - public static int getParameterSize(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getParameterSize(); - } - - - /** - * Marks the given parameter as being used. - */ - public static void markParameterUsed(Method method, int variableIndex) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setParameterUsed(variableIndex); - } - - - /** - * Marks the given parameters as being used. - */ - private static void markUsedParameters(Method method, long usedParameters) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).updateUsedParameters(usedParameters); - } - - - /** - * Returns whether the given method has any unused parameters. - */ - public static boolean hasUnusedParameters(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasUnusedParameters(); - } - - - /** - * Returns whether the given parameter is being used. - */ - public static boolean isParameterUsed(Method method, int variableIndex) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).isParameterUsed(variableIndex); - } - - - /** - * Returns which parameters are being used. - */ - public static long getUsedParameters(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).getUsedParameters(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramClassOptimizationInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramClassOptimizationInfo.java deleted file mode 100644 index 0851cd15..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramClassOptimizationInfo.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.Clazz; - -/** - * This class stores some optimization information that can be attached to - * a class. - * - * @author Eric Lafortune - */ -public class ProgramClassOptimizationInfo -extends ClassOptimizationInfo -{ - private volatile boolean isInstantiated = false; - private volatile boolean isInstanceofed = false; - private volatile boolean isDotClassed = false; - private volatile boolean isCaught = false; - private volatile boolean isSimpleEnum = false; - private volatile boolean isEscaping = false; - private volatile boolean hasSideEffects = false; - private volatile boolean containsPackageVisibleMembers = false; - private volatile boolean invokesPackageVisibleMembers = false; - private volatile boolean mayBeMerged = true; - private volatile Clazz wrappedClass; - private volatile Clazz targetClass; - - - public boolean isKept() - { - return false; - } - - - public void setInstantiated() - { - isInstantiated = true; - } - - - public boolean isInstantiated() - { - return isInstantiated; - } - - - public void setInstanceofed() - { - isInstanceofed = true; - } - - - public boolean isInstanceofed() - { - return isInstanceofed; - } - - - public void setDotClassed() - { - isDotClassed = true; - } - - - public boolean isDotClassed() - { - return isDotClassed; - } - - - public void setCaught() - { - isCaught = true; - } - - - public boolean isCaught() - { - return isCaught; - } - - - public void setSimpleEnum(boolean simple) - { - isSimpleEnum = simple; - } - - - public boolean isSimpleEnum() - { - return isSimpleEnum; - } - - - public void setEscaping() - { - isEscaping = true; - } - - - public boolean isEscaping() - { - return isEscaping; - } - - - public void setSideEffects() - { - hasSideEffects = true; - } - - - public boolean hasSideEffects() - { - return !hasNoSideEffects && hasSideEffects; - } - - - public void setContainsPackageVisibleMembers() - { - containsPackageVisibleMembers = true; - } - - - public boolean containsPackageVisibleMembers() - { - return containsPackageVisibleMembers; - } - - - public void setInvokesPackageVisibleMembers() - { - invokesPackageVisibleMembers = true; - } - - - public boolean invokesPackageVisibleMembers() - { - return invokesPackageVisibleMembers; - } - - - public void setMayNotBeMerged() - { - mayBeMerged = false; - } - - - public boolean mayBeMerged() - { - return mayBeMerged; - } - - - public void setWrappedClass(Clazz wrappedClass) - { - this.wrappedClass = wrappedClass; - } - - - public Clazz getWrappedClass() - { - return wrappedClass; - } - - - public void setTargetClass(Clazz targetClass) - { - this.targetClass = targetClass; - } - - - public Clazz getTargetClass() - { - return targetClass; - } - - - public void merge(ClassOptimizationInfo other) - { - this.isInstantiated |= other.isInstantiated(); - this.isInstanceofed |= other.isInstanceofed(); - this.isDotClassed |= other.isDotClassed(); - this.isCaught |= other.isCaught(); - this.isSimpleEnum |= other.isSimpleEnum(); - this.isEscaping |= other.isEscaping(); - this.hasSideEffects |= other.hasSideEffects(); - this.containsPackageVisibleMembers |= other.containsPackageVisibleMembers(); - this.invokesPackageVisibleMembers |= other.invokesPackageVisibleMembers(); - } - - - public static void setProgramClassOptimizationInfo(Clazz clazz) - { - clazz.setVisitorInfo(new ProgramClassOptimizationInfo()); - } - - - public static ProgramClassOptimizationInfo getProgramClassOptimizationInfo(Clazz clazz) - { - return (ProgramClassOptimizationInfo)clazz.getVisitorInfo(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramClassOptimizationInfoSetter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramClassOptimizationInfoSetter.java deleted file mode 100644 index 5b6d37c1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramClassOptimizationInfoSetter.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.ProgramClass; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor attaches a ProgramClassOptimizationInfo instance to every - * class that is not being kept that it visits. - * - * @author Eric Lafortune - */ -public class ProgramClassOptimizationInfoSetter -extends SimplifiedVisitor -implements ClassVisitor -{ - private final boolean overwrite; - - - /** - * Creates a new ProgramClassOptimizationInfoSetter. - * Existing visitor info is not overridden. - */ - public ProgramClassOptimizationInfoSetter() - { - this(false); - } - - - /** - * Creates a new ProgramClassOptimizationInfoSetter. - * - * @param overwrite true if existing visitor info should be overridden, - * false otherwise. - */ - public ProgramClassOptimizationInfoSetter(boolean overwrite) - { - this.overwrite = overwrite; - } - - // Implementations for MemberVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (programClass.getVisitorInfo() == null || overwrite) - { - ProgramClassOptimizationInfo.setProgramClassOptimizationInfo(programClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramFieldOptimizationInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramFieldOptimizationInfo.java deleted file mode 100644 index 07d1bfc6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramFieldOptimizationInfo.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.evaluation.ConstantValueFactory; -import proguard.evaluation.value.*; - -/** - * This class stores some optimization information that can be attached to - * a field. - * - * @author Eric Lafortune - */ -public class ProgramFieldOptimizationInfo -extends FieldOptimizationInfo -implements AttributeVisitor -{ - private static final ValueFactory VALUE_FACTORY = new ParticularValueFactory(); - private static final ConstantValueFactory CONSTANT_VALUE_FACTORY = new ConstantValueFactory(VALUE_FACTORY); - private static final InitialValueFactory INITIAL_VALUE_FACTORY = new InitialValueFactory(VALUE_FACTORY); - - - private volatile boolean isWritten; - private volatile boolean isRead; - private volatile boolean canBeMadePrivate = true; - private volatile ReferenceValue referencedClass; - private volatile Value value; - - - public ProgramFieldOptimizationInfo(Clazz clazz, Field field) - { - int accessFlags = field.getAccessFlags(); - - isWritten = - isRead = (accessFlags & ClassConstants.ACC_VOLATILE) != 0; - - resetValue(clazz, field); - } - - - public ProgramFieldOptimizationInfo(ProgramFieldOptimizationInfo programFieldOptimizationInfo) - { - this.isWritten = programFieldOptimizationInfo.isWritten; - this.isRead = programFieldOptimizationInfo.isRead; - this.canBeMadePrivate = programFieldOptimizationInfo.canBeMadePrivate; - this.referencedClass = programFieldOptimizationInfo.referencedClass; - this.value = programFieldOptimizationInfo.value; - } - - - public boolean isKept() - { - return false; - } - - - public void setWritten() - { - isWritten = true; - } - - - public boolean isWritten() - { - return isWritten; - } - - - public void setRead() - { - isRead = true; - } - - - public boolean isRead() - { - return isRead; - } - - - public void setCanNotBeMadePrivate() - { - canBeMadePrivate = false; - } - - - public boolean canBeMadePrivate() - { - return canBeMadePrivate; - } - - - public synchronized void generalizeReferencedClass(ReferenceValue referencedClass) - { - this.referencedClass = this.referencedClass != null ? - this.referencedClass.generalize(referencedClass) : - referencedClass; - } - - - public ReferenceValue getReferencedClass() - { - return referencedClass; - } - - - public void resetValue(Clazz clazz, Field field) - { - int accessFlags = field.getAccessFlags(); - - value = null; - - // See if we can initialize the static field with a constant value. - if ((accessFlags & ClassConstants.ACC_STATIC) != 0) - { - field.accept(clazz, new AllAttributeVisitor(this)); - } - - // Otherwise initialize a non-final field with the default value. - // Conservatively, even a final field needs to be initialized with the - // default value, because it may be accessed before it is set. - if (value == null && - (SideEffectInstructionChecker.OPTIMIZE_CONSERVATIVELY || - (accessFlags & ClassConstants.ACC_FINAL) == 0)) - { - // Otherwise initialize the non-final field with the default value. - value = INITIAL_VALUE_FACTORY.createValue(field.getDescriptor(clazz)); - } - } - - - public synchronized void generalizeValue(Value value) - { - this.value = this.value != null ? - this.value.generalize(value) : - value; - } - - - public Value getValue() - { - return value; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - // Retrieve the initial static field value. - value = CONSTANT_VALUE_FACTORY.constantValue(clazz, constantValueAttribute.u2constantValueIndex); - } - - - // Small utility methods. - - public static void setProgramFieldOptimizationInfo(Clazz clazz, Field field) - { - field.setVisitorInfo(new ProgramFieldOptimizationInfo(clazz, field)); - } - - - public static ProgramFieldOptimizationInfo getProgramFieldOptimizationInfo(Field field) - { - return (ProgramFieldOptimizationInfo)field.getVisitorInfo(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramMemberOptimizationInfoSetter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramMemberOptimizationInfoSetter.java deleted file mode 100644 index 7c6f9802..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramMemberOptimizationInfoSetter.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor attaches a ProgramFieldOptimizationInfo instance to every - * field and a ProgramMethodOptimizationInfo instance to every method that is - * not being kept that it visits. - * - * @author Eric Lafortune - */ -public class ProgramMemberOptimizationInfoSetter -extends SimplifiedVisitor -implements MemberVisitor -{ - private final boolean overwrite; - - - /** - * Creates a new ProgramMemberOptimizationInfoSetter that only attaches a - * ProgramFieldOptimizationInfo to a member if no other info is present - * on the member yet. - */ - public ProgramMemberOptimizationInfoSetter() - { - this(false); - } - - - /** - * Creates a new ProgramMemberOptimizationInfoSetter. - * - * @param overwrite boolean indicating whether an existing visitor info on - * a visited member should be overwritten or not. - */ - public ProgramMemberOptimizationInfoSetter(boolean overwrite) - { - this.overwrite = overwrite; - } - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (programField.getVisitorInfo() == null || overwrite) - { - ProgramFieldOptimizationInfo.setProgramFieldOptimizationInfo(programClass, - programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (MethodLinker.lastMember(programMethod).getVisitorInfo() == null || overwrite) - { - ProgramMethodOptimizationInfo.setProgramMethodOptimizationInfo(programClass, - programMethod); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramMethodOptimizationInfo.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramMethodOptimizationInfo.java deleted file mode 100644 index 7b37a0ea..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ProgramMethodOptimizationInfo.java +++ /dev/null @@ -1,588 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.evaluation.value.Value; -import proguard.util.ArrayUtil; - -/** - * This class stores some optimization information that can be attached to - * a method. - * - * @author Eric Lafortune - */ -public class ProgramMethodOptimizationInfo -extends MethodOptimizationInfo -{ - private static final Value[] EMPTY_PARAMETERS = new Value[0]; - - - private volatile boolean hasSideEffects = false; - private volatile boolean canBeMadePrivate = true; - private volatile boolean catchesExceptions = false; - private volatile boolean branchesBackward = false; - private volatile boolean invokesSuperMethods = false; - private volatile boolean invokesDynamically = false; - private volatile boolean accessesPrivateCode = false; - private volatile boolean accessesPackageCode = false; - private volatile boolean accessesProtectedCode = false; - private volatile boolean hasSynchronizedBlock = false; - private volatile boolean returnsWithNonEmptyStack = false; - private volatile int invocationCount = 0; - private volatile int parameterSize = 0; - private volatile long usedParameters = 0L; - private volatile long escapedParameters = 0L; - private volatile long escapingParameters = 0L; - private volatile long modifiedParameters = 0L; - private volatile boolean modifiesAnything = false; - private volatile Value[] parameters; - private volatile long returnedParameters = 0L; - private volatile boolean returnsNewInstances = false; - private volatile boolean returnsExternalValues = false; - private volatile Value returnValue; - - - /** - * Creates a new MethodOptimizationInfo for the given method. - */ - public ProgramMethodOptimizationInfo(Clazz clazz, Method method) - { - // Set up an array of the right size for storing information about the - // passed parameters. - int parameterCount = - ClassUtil.internalMethodParameterCount(method.getDescriptor(clazz)); - - if ((method.getAccessFlags() & ClassConstants.ACC_STATIC) == 0) - { - parameterCount++; - } - - parameters = parameterCount == 0 ? - EMPTY_PARAMETERS : - new Value[parameterCount]; - } - - - public boolean isKept() - { - return false; - } - - - public void setSideEffects() - { - hasSideEffects = true; - } - - - public boolean hasSideEffects() - { - return !hasNoSideEffects && hasSideEffects; - } - - - public void setCanNotBeMadePrivate() - { - canBeMadePrivate = false; - } - - - public boolean canBeMadePrivate() - { - return canBeMadePrivate; - } - - - public void setCatchesExceptions() - { - catchesExceptions = true; - } - - - public boolean catchesExceptions() - { - return catchesExceptions; - } - - - public void setBranchesBackward() - { - branchesBackward = true; - } - - - public boolean branchesBackward() - { - return branchesBackward; - } - - - public void setInvokesSuperMethods() - { - invokesSuperMethods = true; - } - - - public boolean invokesSuperMethods() - { - return invokesSuperMethods; - } - - - public void setInvokesDynamically() - { - invokesDynamically = true; - } - - - public boolean invokesDynamically() - { - return invokesDynamically; - } - - - public void setAccessesPrivateCode() - { - accessesPrivateCode = true; - } - - - public boolean accessesPrivateCode() - { - return accessesPrivateCode; - } - - - public void setAccessesPackageCode() - { - accessesPackageCode = true; - } - - - public boolean accessesPackageCode() - { - return accessesPackageCode; - } - - - public void setAccessesProtectedCode() - { - accessesProtectedCode = true; - } - - - public boolean accessesProtectedCode() - { - return accessesProtectedCode; - } - - - public void setHasSynchronizedBlock() - { - hasSynchronizedBlock = true; - } - - - public boolean hasSynchronizedBlock() - { - return hasSynchronizedBlock; - } - - - public void setReturnsWithNonEmptyStack() - { - returnsWithNonEmptyStack = true; - } - - - public boolean returnsWithNonEmptyStack() - { - return returnsWithNonEmptyStack; - } - - - public void incrementInvocationCount() - { - invocationCount++; - } - - - public int getInvocationCount() - { - return invocationCount; - } - - - public synchronized void setParameterSize(int parameterSize) - { - this.parameterSize = parameterSize; - } - - - public int getParameterSize() - { - return parameterSize; - } - - - public synchronized void setParameterUsed(int variableIndex) - { - usedParameters = setBit(usedParameters, variableIndex); - } - - - public synchronized void updateUsedParameters(long usedParameters) - { - this.usedParameters |= usedParameters; - } - - - public boolean hasUnusedParameters() - { - return (usedParameters | -1L << parameterSize) != -1L; - } - - - public boolean isParameterUsed(int variableIndex) - { - return isBitSet(usedParameters, variableIndex); - } - - - public long getUsedParameters() - { - return usedParameters; - } - - - /** - * Notifies this object that a parameter is inserted at the given - * index. - * @param parameterIndex the parameter index, - * not taking into account the entry size, - * but taking into account the 'this' parameter, - * if any. - */ - public synchronized void insertParameter(int parameterIndex) - { - // The used parameter bits are indexed with their variable indices - // (which take into account the sizes of the entries). - //usedParameters = insertBit(usedParameters, parameterIndex, 1L); - //parameterSize++; - - escapedParameters = insertBit(escapedParameters, parameterIndex, 1L); - escapingParameters = insertBit(escapingParameters, parameterIndex, 1L); - modifiedParameters = insertBit(modifiedParameters, parameterIndex, 1L); - returnedParameters = insertBit(returnedParameters, parameterIndex, 1L); - parameters = ArrayUtil.insert(parameters, parameters.length, parameterIndex, null); - } - - - /** - * Notifies this object that the specified parameter is removed. - * @param parameterIndex the parameter index, - * not taking into account the entry size, - * but taking into account the 'this' parameter, - * if any. - */ - public synchronized void removeParameter(int parameterIndex) - { - // The used parameter bits are indexed with their variable indices - // (which take into account the sizes of the entries). - //usedParameters = removeBit(usedParameters, parameterIndex, 1L); - //parameterSize--; - - escapedParameters = removeBit(escapedParameters, parameterIndex, 1L); - escapingParameters = removeBit(escapingParameters, parameterIndex, 1L); - modifiedParameters = removeBit(modifiedParameters, parameterIndex, 1L); - returnedParameters = removeBit(returnedParameters, parameterIndex, 1L); - ArrayUtil.remove(parameters, parameters.length, parameterIndex); - } - - - public synchronized void setParameterEscaped(int parameterIndex) - { - escapedParameters = setBit(escapedParameters, parameterIndex); - } - - - public synchronized void updateEscapedParameters(long escapedParameters) - { - this.escapedParameters |= escapedParameters; - } - - - public boolean hasParameterEscaped(int parameterIndex) - { - return isBitSet(escapedParameters, parameterIndex); - } - - - public long getEscapedParameters() - { - return escapedParameters; - } - - - public synchronized void setParameterEscaping(int parameterIndex) - { - escapingParameters = setBit(escapingParameters, parameterIndex); - } - - - public synchronized void updateEscapingParameters(long escapingParameters) - { - this.escapingParameters |= escapingParameters; - } - - - public boolean isParameterEscaping(int parameterIndex) - { - return - !hasNoEscapingParameters && - (isBitSet(escapingParameters, parameterIndex)); - } - - - public long getEscapingParameters() - { - return hasNoEscapingParameters ? 0L : escapingParameters; - } - - - public synchronized void setParameterModified(int parameterIndex) - { - modifiedParameters = setBit(modifiedParameters, parameterIndex); - } - - - public synchronized void updateModifiedParameters(long modifiedParameters) - { - this.modifiedParameters |= modifiedParameters; - } - - - public boolean isParameterModified(int parameterIndex) - { - // TODO: Refine for static methods. - return - !hasNoSideEffects && - (!hasNoExternalSideEffects || parameterIndex == 0) && - (isBitSet((modifiesAnything ? - modifiedParameters | escapedParameters : - modifiedParameters), parameterIndex)); - } - - - public long getModifiedParameters() - { - // TODO: Refine for static methods. - return - hasNoSideEffects ? 0L : - hasNoExternalSideEffects ? modifiedParameters & 1L : - modifiedParameters; - } - - - public void setModifiesAnything() - { - modifiesAnything = true; - } - - - public boolean modifiesAnything() - { - return !hasNoExternalSideEffects && modifiesAnything; - } - - - public synchronized void generalizeParameterValue(int parameterIndex, Value parameter) - { - parameters[parameterIndex] = parameters[parameterIndex] != null ? - parameters[parameterIndex].generalize(parameter) : - parameter; - } - - - public Value getParameterValue(int parameterIndex) - { - return parameters != null ? - parameters[parameterIndex] : - null; - } - - - public synchronized void setParameterReturned(int parameterIndex) - { - returnedParameters = setBit(returnedParameters, parameterIndex); - } - - - public synchronized void updateReturnedParameters(long returnedParameters) - { - this.returnedParameters |= returnedParameters; - } - - - public boolean returnsParameter(int parameterIndex) - { - return isBitSet(returnedParameters, parameterIndex); - } - - - public long getReturnedParameters() - { - return returnedParameters; - } - - - public void setReturnsNewInstances() - { - returnsNewInstances = true; - } - - - public boolean returnsNewInstances() - { - return returnsNewInstances; - } - - - public void setReturnsExternalValues() - { - returnsExternalValues = true; - } - - - public boolean returnsExternalValues() - { - return - !hasNoExternalReturnValues && - returnsExternalValues; - } - - - public synchronized void generalizeReturnValue(Value returnValue) - { - this.returnValue = this.returnValue != null ? - this.returnValue.generalize(returnValue) : - returnValue; - } - - - public Value getReturnValue() - { - return returnValue; - } - - - // For setting enum return values. - public synchronized void setReturnValue(Value returnValue) - { - this.returnValue = returnValue; - } - - - public synchronized void merge(MethodOptimizationInfo other) - { - this.catchesExceptions |= other.catchesExceptions(); - this.branchesBackward |= other.branchesBackward(); - this.invokesSuperMethods |= other.invokesSuperMethods(); - this.invokesDynamically |= other.invokesDynamically(); - this.accessesPrivateCode |= other.accessesPrivateCode(); - this.accessesPackageCode |= other.accessesPackageCode(); - this.accessesProtectedCode |= other.accessesProtectedCode(); - this.hasSynchronizedBlock |= other.hasSynchronizedBlock(); - - // Some of these should actually be recomputed, since these are - // relative to the method: - // this.invokesSuperMethods - // this.accessesPrivateCode - // this.accessesPackageCode - // this.accessesProtectedCode - } - - - public static void setProgramMethodOptimizationInfo(Clazz clazz, Method method) - { - MethodLinker.lastMember(method).setVisitorInfo(new ProgramMethodOptimizationInfo(clazz, method)); - } - - - public static ProgramMethodOptimizationInfo getProgramMethodOptimizationInfo(Method method) - { - return (ProgramMethodOptimizationInfo)MethodLinker.lastMember(method).getVisitorInfo(); - } - - - // Small utility methods. - - /** - * Returns the given value with the specified bit set. - */ - private long setBit(long bits, int index) - { - return index < 64 ? - bits | (1L << index) : - bits; - } - - - /** - * Returns whether the specified bit is set in the given value - * (or if the index exceeds the size of the long). - */ - private boolean isBitSet(long bits, int index) - { - return index >= 64 || (bits & (1L << index)) != 0; - } - - - /** - * Returns the given value with a given bit inserted at the given index. - */ - private long insertBit(long value, int bitIndex, long bitValue) - { - long higherMask = -1L << bitIndex; - long lowerMask = ~higherMask; - - return ((value & higherMask) << 1) | - ( value & lowerMask ) | - (bitValue << bitIndex); - } - - - /** - * Returns the given value with a bit removed at the given index. - * The given given bit value is shifted in as the new most significant bit. - */ - private long removeBit(long value, int bitIndex, long highBitValue) - { - long higherMask = -1L << bitIndex; - long lowerMask = ~higherMask; - - return ((value & (higherMask<<1)) >>> 1) | - ( value & lowerMask ) | - (highBitValue << 63); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ReadWriteFieldMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ReadWriteFieldMarker.java deleted file mode 100644 index 15a3a9d6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ReadWriteFieldMarker.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This InstructionVisitor marks all fields that are write-only. - * - * @author Eric Lafortune - */ -public class ReadWriteFieldMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - MemberVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("rwfm") != null; - //*/ - - - private final MutableBoolean repeatTrigger; - - - // Parameters for the visitor methods. - // We'll set them to true by default, in case this class is being used - // as a field visitor. - private boolean reading = true; - private boolean writing = true; - - - /** - * Creates a new ReadWriteFieldMarker. - */ - public ReadWriteFieldMarker(MutableBoolean repeatTrigger) - { - this.repeatTrigger = repeatTrigger; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - byte opcode = constantInstruction.opcode; - - // Check for instructions that involve fields. - switch (opcode) - { - case InstructionConstants.OP_LDC: - case InstructionConstants.OP_LDC_W: - // Mark the field, if any, as being read from and written to. - reading = true; - writing = true; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_GETFIELD: - // Mark the field as being read from. - reading = true; - writing = false; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_PUTSTATIC: - case InstructionConstants.OP_PUTFIELD: - // Mark the field as being written to. - reading = false; - writing = true; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Mark the referenced field, if any. - stringConstant.referencedMemberAccept(this); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - // Mark the referenced field. - fieldrefConstant.referencedMemberAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz Clazz, Member member) {} - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Mark the field if it is being read from. - if (reading) - { - markAsRead(programField); - } - - // Mark the field if it is being written to. - if (writing) - { - markAsWritten(programField); - } - } - - - // Small utility methods. - - private void markAsRead(Field field) - { - FieldOptimizationInfo fieldOptimizationInfo = - FieldOptimizationInfo.getFieldOptimizationInfo(field); - - if (!fieldOptimizationInfo.isRead() && - fieldOptimizationInfo instanceof ProgramFieldOptimizationInfo) - { - ((ProgramFieldOptimizationInfo)fieldOptimizationInfo).setRead(); - - repeatTrigger.set(); - } - } - - - public static boolean isRead(Field field) - { - return FieldOptimizationInfo.getFieldOptimizationInfo(field).isRead(); - } - - - private void markAsWritten(Field field) - { - FieldOptimizationInfo fieldOptimizationInfo = - FieldOptimizationInfo.getFieldOptimizationInfo(field); - - if (!fieldOptimizationInfo.isWritten() && - fieldOptimizationInfo instanceof ProgramFieldOptimizationInfo) - { - ((ProgramFieldOptimizationInfo)fieldOptimizationInfo).setWritten(); - - repeatTrigger.set(); - } - } - - - public static boolean isWritten(Field field) - { - return FieldOptimizationInfo.getFieldOptimizationInfo(field).isWritten(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ReferenceEscapeChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ReferenceEscapeChecker.java deleted file mode 100644 index cd30c436..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/ReferenceEscapeChecker.java +++ /dev/null @@ -1,466 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.*; -import proguard.util.ArrayUtil; - -/** - * This AttributeVisitor can tell whether reference parameters and instances - * are escaping, are modified, or are returned. - * - * @see ParameterEscapeMarker - * @author Eric Lafortune - */ -public class ReferenceEscapeChecker -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("rec") != null; - //*/ - - - private boolean[] instanceEscaping = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - private boolean[] instanceReturned = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - private boolean[] instanceModified = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - private boolean[] externalInstance = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; -// private boolean[] exceptionEscaping = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; -// private boolean[] exceptionReturned = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; -// private boolean[] exceptionModified = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - - private final PartialEvaluator partialEvaluator; - private final boolean runPartialEvaluator; - - // Parameters and values for visitor methods. - private Method referencingMethod; - private int referencingOffset; - private int referencingPopCount; - - - /** - * Creates a new ReferenceEscapeChecker. - */ - public ReferenceEscapeChecker() - { - this(new ReferenceTracingValueFactory(new BasicValueFactory())); - } - - - /** - * Creates a new ReferenceEscapeChecker. This private constructor gets around - * the constraint that it's not allowed to add statements before calling - * 'this'. - */ - private ReferenceEscapeChecker(ReferenceTracingValueFactory referenceTracingValueFactory) - { - this(new PartialEvaluator(referenceTracingValueFactory, - new ParameterTracingInvocationUnit(new BasicInvocationUnit(referenceTracingValueFactory)), - true, - referenceTracingValueFactory), - true); - } - - - /** - * Creates a new ReferenceEscapeChecker. - * @param partialEvaluator the evaluator to be used for the analysis. - * @param runPartialEvaluator specifies whether to run this evaluator on - * every code attribute that is visited. - */ - public ReferenceEscapeChecker(PartialEvaluator partialEvaluator, - boolean runPartialEvaluator) - { - this.partialEvaluator = partialEvaluator; - this.runPartialEvaluator = runPartialEvaluator; - } - - - /** - * Returns whether the instance created or retrieved at the specified - * instruction offset is escaping. - */ - public boolean isInstanceEscaping(int instructionOffset) - { - return instanceEscaping[instructionOffset]; - } - - - /** - * Returns whether the instance created or retrieved at the specified - * instruction offset is being returned. - */ - public boolean isInstanceReturned(int instructionOffset) - { - return instanceReturned[instructionOffset]; - } - - - /** - * Returns whether the instance created or retrieved at the specified - * instruction offset is being modified. - */ - public boolean isInstanceModified(int instructionOffset) - { - return instanceModified[instructionOffset]; - } - - - /** - * Returns whether the instance created or retrieved at the specified - * instruction offset is external to this method and its invoked methods. - */ - public boolean isInstanceExternal(int instructionOffset) - { - return externalInstance[instructionOffset]; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Evaluate the method. - if (runPartialEvaluator) - { - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - } - - int codeLength = codeAttribute.u4codeLength; - - // Initialize the global arrays. - instanceEscaping = ArrayUtil.ensureArraySize(instanceEscaping, codeLength, false); - instanceReturned = ArrayUtil.ensureArraySize(instanceReturned, codeLength, false); - instanceModified = ArrayUtil.ensureArraySize(instanceModified, codeLength, false); - externalInstance = ArrayUtil.ensureArraySize(externalInstance, codeLength, false); - - // Mark the parameters and instances that are escaping from the code. - codeAttribute.instructionsAccept(clazz, method, partialEvaluator.tracedInstructionFilter(this)); - - if (DEBUG) - { - System.out.println(); - System.out.println("ReferenceEscapeChecker: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - - for (int index = 0; index < codeLength; index++) - { - if (partialEvaluator.isInstruction(index)) - { - System.out.println(" " + - (instanceEscaping[index] ? 'E' : '.') + - (instanceReturned[index] ? 'R' : '.') + - (instanceModified[index] ? 'M' : '.') + - (externalInstance[index] ? 'X' : '.') + - ' ' + - InstructionFactory.create(codeAttribute.code, index).toString(index)); - } - } - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_AASTORE: - // Mark array reference values whose element is modified. - markModifiedReferenceValues(offset, - simpleInstruction.stackPopCount(clazz) - 1); - - // Mark reference values that are put in the array. - markEscapingReferenceValues(offset, 0); - break; - - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_LASTORE: - case InstructionConstants.OP_FASTORE: - case InstructionConstants.OP_DASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - // Mark array reference values whose element is modified. - markModifiedReferenceValues(offset, - simpleInstruction.stackPopCount(clazz) - 1); - break; - - case InstructionConstants.OP_ARETURN: - // Mark the returned reference values. - markReturnedReferenceValues(offset, 0); - break; - - case InstructionConstants.OP_ATHROW: - // Mark the escaping reference values. - markEscapingReferenceValues(offset, 0); - break; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_GETSTATIC: - case InstructionConstants.OP_GETFIELD: - // Mark external reference values. - markExternalReferenceValue(offset); - break; - - case InstructionConstants.OP_PUTSTATIC: - // Mark reference values that are put in the field. - markEscapingReferenceValues(offset, 0); - break; - - case InstructionConstants.OP_PUTFIELD: - // Mark reference reference values whose field is modified. - markModifiedReferenceValues(offset, - constantInstruction.stackPopCount(clazz) - 1); - - // Mark reference values that are put in the field. - markEscapingReferenceValues(offset, 0); - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - // Mark reference reference values that are modified as parameters - // of the invoked method. - // Mark reference values that are escaping as parameters - // of the invoked method. - // Mark escaped reference reference values in the invoked method. - referencingMethod = method; - referencingOffset = offset; - referencingPopCount = constantInstruction.stackPopCount(clazz); - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - clazz.constantPoolEntryAccept(fieldrefConstant.u2classIndex, this); - } - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - Method referencedMethod = (Method)refConstant.referencedMember; - - // Mark reference reference values that are passed to the method. - for (int index = 0; index < referencingPopCount; index++) - { - int stackEntryIndex = referencingPopCount - index - 1; - - TracedStack stackBefore = partialEvaluator.getStackBefore(referencingOffset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - // Is the parameter escaping from the referenced method? - if (referencedMethod == null || - ParameterEscapeMarker.isParameterEscaping(referencedMethod, index)) - { - markEscapingReferenceValues(referencingOffset, - stackEntryIndex); - } - - // Is the parameter being modified in the referenced method? - if (referencedMethod == null || - ParameterEscapeMarker.isParameterModified(referencedMethod, index)) - { - markModifiedReferenceValues(referencingOffset, - stackEntryIndex); - } - } - } - - // Is the return value from the referenced method external? - String returnType = - ClassUtil.internalMethodReturnType(refConstant.getType(clazz)); - - if (referencedMethod == null || - ((ClassUtil.isInternalClassType(returnType) || - ClassUtil.isInternalArrayType(returnType)) && - ParameterEscapeMarker.returnsExternalValues(referencedMethod))) - { - markExternalReferenceValue(referencingOffset); - } - } - - - // Small utility methods. - - /** - * Marks the producing offsets of the specified stack entry at the given - * instruction offset. - */ - private void markEscapingReferenceValues(int instructionOffset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(instructionOffset); - Value stackEntry = stackBefore.getTop(stackEntryIndex); - - if (stackEntry.computationalType() == Value.TYPE_REFERENCE) - { - ReferenceValue referenceValue = stackEntry.referenceValue(); - - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS) - { - markEscapingReferenceValues(referenceValue); - } - } - } - - - /** - * Marks the producing offsets of the given traced reference value. - */ - private void markEscapingReferenceValues(ReferenceValue referenceValue) - { - TracedReferenceValue tracedReferenceValue = (TracedReferenceValue)referenceValue; - InstructionOffsetValue instructionOffsetValue = tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - int parameterCount = instructionOffsetValue.instructionOffsetCount(); - for (int index = 0; index < parameterCount; index++) - { - if (!instructionOffsetValue.isMethodParameter(index)) - { - instanceEscaping[instructionOffsetValue.instructionOffset(index)] = true; - } - } - } - - - /** - * Marks the producing offsets of the specified stack entry at the given - * instruction offset. - */ - private void markReturnedReferenceValues(int instructionOffset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(instructionOffset); - ReferenceValue referenceValue = stackBefore.getTop(stackEntryIndex).referenceValue(); - - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS) - { - markReturnedReferenceValues(referenceValue); - } - } - - - /** - * Marks the producing offsets of the given traced reference value. - */ - private void markReturnedReferenceValues(ReferenceValue referenceValue) - { - TracedReferenceValue tracedReferenceValue = (TracedReferenceValue)referenceValue; - InstructionOffsetValue instructionOffsetValue = tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - int parameterCount = instructionOffsetValue.instructionOffsetCount(); - for (int index = 0; index < parameterCount; index++) - { - if (!instructionOffsetValue.isMethodParameter(index)) - { - instanceReturned[instructionOffsetValue.instructionOffset(index)] = true; - } - } - } - - - /** - * Marks the producing offsets of the specified stack entry at the given - * instruction offset. - */ - private void markModifiedReferenceValues(int instructionOffset, - int stackEntryIndex) - { - TracedStack stackBefore = partialEvaluator.getStackBefore(instructionOffset); - ReferenceValue referenceValue = stackBefore.getTop(stackEntryIndex).referenceValue(); - - // The null reference value may not have a trace value. - if (referenceValue.isNull() != Value.ALWAYS) - { - markModifiedReferenceValues(referenceValue); - } - } - - - /** - * Marks the producing offsets of the given traced reference value. - */ - private void markModifiedReferenceValues(ReferenceValue referenceValue) - { - TracedReferenceValue tracedReferenceValue = (TracedReferenceValue)referenceValue; - InstructionOffsetValue instructionOffsetValue = tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - int parameterCount = instructionOffsetValue.instructionOffsetCount(); - for (int index = 0; index < parameterCount; index++) - { - if (!instructionOffsetValue.isMethodParameter(index)) - { - instanceModified[instructionOffsetValue.instructionOffset(index)] = true; - } - } - } - - - /** - * Marks the producing offsets of the specified stack entry at the given - * instruction offset. - */ - private void markExternalReferenceValue(int offset) - { - externalInstance[offset] = true; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/RepeatedClassPoolVisitor.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/RepeatedClassPoolVisitor.java deleted file mode 100644 index 6dd48185..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/RepeatedClassPoolVisitor.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.info; - -import proguard.classfile.ClassPool; -import proguard.classfile.visitor.ClassPoolVisitor; - -/** - * This ClassPoolVisitor repeatedly delegates to a given class pool visitor, as - * long as it keeps setting a given flag. - * - * @author Eric Lafortune - */ -public class RepeatedClassPoolVisitor -implements ClassPoolVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("rcpv") != null; - //*/ - - - private final MutableBoolean repeatTrigger; - private final ClassPoolVisitor classPoolVisitor; - - - /** - * Creates a new RepeatedClassPoolVisitor. - * @param repeatTrigger the mutable boolean flag that the class pool - * visitor can set to indicate that the class pool - * should be visited again. - * @param classPoolVisitor the class pool visitor to apply. - */ - public RepeatedClassPoolVisitor(MutableBoolean repeatTrigger, - ClassPoolVisitor classPoolVisitor) - { - this.repeatTrigger = repeatTrigger; - this.classPoolVisitor = classPoolVisitor; - } - - - // Implementations for ClassPoolVisitor. - - public void visitClassPool(ClassPool classPool) - { - // Visit all classes at least once, until the class visitors stop - // setting the repeat trigger. - do - { - if (DEBUG) - { - System.out.println("RepeatedClassPoolVisitor: new iteration"); - } - - repeatTrigger.reset(); - - // Visit over all classes once. - classPoolVisitor.visitClassPool(classPool); - } - while (repeatTrigger.isSet()); - - if (DEBUG) - { - System.out.println("RepeatedClassPoolVisitor: done iterating"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassChecker.java deleted file mode 100644 index 44e985b8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassChecker.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassCollector; - -import java.util.*; - -/** - * This utility class contains methods to check whether referencing classes - * may have side effects due to them being loaded and initialized. - * - * @see NoSideEffectClassMarker - * @see SideEffectClassMarker - * @author Eric Lafortune - */ -public class SideEffectClassChecker -{ - /** - * Returns whether accessing the given class member from the given class may - * have side effects when they are initialized. - */ - public static boolean mayHaveSideEffects(Clazz referencingClass, - Clazz referencedClass, - Member referencedMember) - { - // Is the referenced class member static or an initializer method? - // Does accessing the referenced class then have side effects? - return - ((referencedMember.getAccessFlags() & ClassConstants.ACC_STATIC) != 0 || - referencedMember.getName(referencedClass).equals(ClassConstants.METHOD_NAME_INIT)) && - mayHaveSideEffects(referencingClass, referencedClass); - } - - - /** - * Returns whether accessing the given class from another given class may - * have side effects when they are initialized. - */ - public static boolean mayHaveSideEffects(Clazz referencingClass, - Clazz referencedClass) - { - return - !NoSideEffectClassMarker.hasNoSideEffects(referencedClass) && - !referencingClass.extendsOrImplements(referencedClass) && - !sideEffectSuperClasses(referencingClass).containsAll(sideEffectSuperClasses(referencedClass)); - } - - - /** - * Returns the set of superclasses and interfaces that are initialized. - */ - private static Set sideEffectSuperClasses(Clazz clazz) - { - Set set = new HashSet(); - - // Visit all superclasses and interfaces, collecting the ones that have - // side effects when they are initialized. - clazz.hierarchyAccept(true, true, true, false, - new SideEffectClassFilter( - new ClassCollector(set))); - - return set; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassFilter.java deleted file mode 100644 index ab5e2b82..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassFilter.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates all its method calls to another ClassVisitor, - * but only for Clazz objects that have side effects when they are initialized. - * - * @author Eric Lafortune - */ -public class SideEffectClassFilter -implements ClassVisitor -{ - private final ClassVisitor classVisitor; - - - public SideEffectClassFilter(ClassVisitor classVisitor) - { - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (SideEffectClassMarker.hasSideEffects(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (SideEffectClassMarker.hasSideEffects(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassMarker.java deleted file mode 100644 index 46d7e13c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectClassMarker.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor marks all classes that it visits as having side effects. - * - * @author Eric Lafortune - */ -public class SideEffectClassMarker -extends SimplifiedVisitor -implements ClassVisitor -{ - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - markSideEffects(programClass); - } - - - // Small utility methods. - - private static void markSideEffects(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setSideEffects(); - } - - - public static boolean hasSideEffects(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).hasSideEffects(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectInstructionChecker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectInstructionChecker.java deleted file mode 100644 index 8dd4602e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectInstructionChecker.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This class can tell whether an instruction has any side effects. Return - * instructions and array store instructions can be included or not. - * - * @see ReadWriteFieldMarker - * @see SideEffectClassMarker - * @see NoSideEffectMethodMarker - * @see SideEffectMethodMarker - * @author Eric Lafortune - */ -public class SideEffectInstructionChecker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor, - MemberVisitor -{ - public static final boolean OPTIMIZE_CONSERVATIVELY = System.getProperty("optimize.conservatively") != null; - - - private final boolean includeReturnInstructions; - private final boolean includeArrayStoreInstructions; - - // Parameters and return values for the visitor methods. - private boolean writingField; - private Clazz referencingClass; - private boolean hasSideEffects; - - - /** - * Creates a new SideEffectInstructionChecker - * @param includeReturnInstructions specifies whether return - * instructions count as side - * effects. - * @param includeArrayStoreInstructions specifies whether storing values - * in arrays counts as side effects. - */ - public SideEffectInstructionChecker(boolean includeReturnInstructions, - boolean includeArrayStoreInstructions) - { - this.includeReturnInstructions = includeReturnInstructions; - this.includeArrayStoreInstructions = includeArrayStoreInstructions; - } - - - public boolean hasSideEffects(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - hasSideEffects = false; - - instruction.accept(clazz, method, codeAttribute, offset, this); - - return hasSideEffects; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - byte opcode = simpleInstruction.opcode; - - // Check for instructions that might cause side effects. - switch (opcode) - { - case InstructionConstants.OP_IDIV: - case InstructionConstants.OP_LDIV: - case InstructionConstants.OP_IREM: - case InstructionConstants.OP_LREM: - case InstructionConstants.OP_FDIV: - case InstructionConstants.OP_FREM: - case InstructionConstants.OP_DDIV: - case InstructionConstants.OP_DREM: - case InstructionConstants.OP_IALOAD: - case InstructionConstants.OP_LALOAD: - case InstructionConstants.OP_FALOAD: - case InstructionConstants.OP_DALOAD: - case InstructionConstants.OP_AALOAD: - case InstructionConstants.OP_BALOAD: - case InstructionConstants.OP_CALOAD: - case InstructionConstants.OP_SALOAD: - case InstructionConstants.OP_NEWARRAY: - case InstructionConstants.OP_ARRAYLENGTH: - // These instructions strictly taken may cause a side effect - // (ArithmeticException, NullPointerException, - // ArrayIndexOutOfBoundsException, NegativeArraySizeException). - hasSideEffects = OPTIMIZE_CONSERVATIVELY; - break; - - case InstructionConstants.OP_IASTORE: - case InstructionConstants.OP_LASTORE: - case InstructionConstants.OP_FASTORE: - case InstructionConstants.OP_DASTORE: - case InstructionConstants.OP_AASTORE: - case InstructionConstants.OP_BASTORE: - case InstructionConstants.OP_CASTORE: - case InstructionConstants.OP_SASTORE: - // These instructions may cause a side effect. - hasSideEffects = includeArrayStoreInstructions; - break; - - case InstructionConstants.OP_ATHROW : - case InstructionConstants.OP_MONITORENTER: - case InstructionConstants.OP_MONITOREXIT: - // These instructions always cause a side effect. - hasSideEffects = true; - break; - - case InstructionConstants.OP_IRETURN: - case InstructionConstants.OP_LRETURN: - case InstructionConstants.OP_FRETURN: - case InstructionConstants.OP_DRETURN: - case InstructionConstants.OP_ARETURN: - case InstructionConstants.OP_RETURN: - // These instructions may have a side effect. - hasSideEffects = includeReturnInstructions; - break; - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - byte opcode = variableInstruction.opcode; - - // Check for instructions that might cause side effects. - switch (opcode) - { - case InstructionConstants.OP_RET: - // This instruction may have a side effect. - hasSideEffects = includeReturnInstructions; - break; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - byte opcode = constantInstruction.opcode; - - // Check for instructions that might cause side effects. - switch (opcode) - { - case InstructionConstants.OP_GETSTATIC: - // Check if accessing the field might cause any side effects. - writingField = false; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_PUTSTATIC: - // Check if accessing the field might cause any side effects. - writingField = true; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_GETFIELD: - if (OPTIMIZE_CONSERVATIVELY) - { - // These instructions strictly taken may cause a side effect - // (NullPointerException). - hasSideEffects = true; - } - else - { - // Check if the field is write-only or volatile. - writingField = false; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - break; - - case InstructionConstants.OP_PUTFIELD: - if (OPTIMIZE_CONSERVATIVELY) - { - // These instructions strictly taken may cause a side effect - // (NullPointerException). - hasSideEffects = true; - } - else - { - // Check if the field is write-only or volatile. - writingField = true; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - break; - - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - // Check if the invoked method is causing any side effects. - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKEINTERFACE: - case InstructionConstants.OP_INVOKEDYNAMIC: - if (OPTIMIZE_CONSERVATIVELY) - { - // These instructions strictly taken may cause a side effect - // (NullPointerException). - hasSideEffects = true; - } - else - { - // Check if the invoked method is causing any side effects. - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - } - break; - - case InstructionConstants.OP_ANEWARRAY: - case InstructionConstants.OP_MULTIANEWARRAY: - case InstructionConstants.OP_CHECKCAST: - // This instructions strictly taken may cause a side effect - // (ClassCastException, NegativeArraySizeException). - hasSideEffects = OPTIMIZE_CONSERVATIVELY; - break; - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - byte opcode = branchInstruction.opcode; - - // Check for instructions that might cause side effects. - switch (opcode) - { - case InstructionConstants.OP_JSR: - case InstructionConstants.OP_JSR_W: - hasSideEffects = includeReturnInstructions; - break; - } - } - - - // Implementations for ConstantVisitor. - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // We'll have to assume invoking an unknown method has side effects. - hasSideEffects = true; - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - // Pass the referencing class. - referencingClass = clazz; - - // We'll have to assume accessing an unknown field has side effects. - hasSideEffects = true; - - // Check the referenced field, if known. - fieldrefConstant.referencedMemberAccept(this); - } - - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - // Pass the referencing class. - referencingClass = clazz; - - // We'll have to assume invoking an unknown method has side effects. - hasSideEffects = true; - - // Check the referenced method, if known. - refConstant.referencedMemberAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - hasSideEffects = - (writingField && ReadWriteFieldMarker.isRead(programField)) || - (programField.getAccessFlags() & ClassConstants.ACC_VOLATILE) != 0 || - SideEffectClassChecker.mayHaveSideEffects(referencingClass, - programClass, - programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Note that side effects already include synchronization of some - // implementation of the method. - hasSideEffects = - SideEffectMethodMarker.hasSideEffects(programMethod) || - SideEffectClassChecker.mayHaveSideEffects(referencingClass, - programClass, - programMethod); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - hasSideEffects = true; - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - hasSideEffects = - !NoSideEffectMethodMarker.hasNoSideEffects(libraryMethod); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectMethodFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectMethodFilter.java deleted file mode 100644 index dd0765b2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectMethodFilter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor delegates all its method calls to another MemberVisitor, - * but only for Method objects that are marked as having side effects. - * - * @see SideEffectMethodMarker - * - * @author Eric Lafortune - */ -public class SideEffectMethodFilter -implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new SideEffectMethodFilter. - * @param memberVisitor the member visitor to which the visiting will be - * delegated. - */ - public SideEffectMethodFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) {} - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (SideEffectMethodMarker.hasSideEffects(programMethod)) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (SideEffectMethodMarker.hasSideEffects(libraryMethod)) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectMethodMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectMethodMarker.java deleted file mode 100644 index a94a62e2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SideEffectMethodMarker.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.optimize.OptimizationInfoClassFilter; - -/** - * This MemberVisitor and InstructionVisitor marks all methods and classes - * that have side effects. - * - * @see NoSideEffectMethodMarker - * @author Eric Lafortune - */ -public class SideEffectMethodMarker -extends SimplifiedVisitor -implements MemberVisitor, - InstructionVisitor -{ - private final MutableBoolean repeatTrigger; - - private final SideEffectInstructionChecker sideEffectInstructionChecker = new SideEffectInstructionChecker(false, true); - private final ClassVisitor sideEffectClassMarker = new OptimizationInfoClassFilter( - new SideEffectClassMarker()); - - - - /** - * Creates a new SideEffectMethodMarker. - */ - public SideEffectMethodMarker(MutableBoolean repeatTrigger) - { - this.repeatTrigger = repeatTrigger; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if ((programMethod.getAccessFlags() & - (ClassConstants.ACC_NATIVE | - ClassConstants.ACC_SYNCHRONIZED)) != 0) - { - markSideEffects(programClass, programMethod); - } - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Check if it may be throwing exceptions. - if (sideEffectInstructionChecker.hasSideEffects(clazz, - method, - codeAttribute, - offset, - instruction)) - { - markSideEffects(clazz, method); - } - } - - - // Small utility methods. - - private void markSideEffects(Clazz clazz, Method method) - { - MethodOptimizationInfo methodOptimizationInfo = - MethodOptimizationInfo.getMethodOptimizationInfo(method); - - if (!methodOptimizationInfo.hasSideEffects() && - methodOptimizationInfo instanceof ProgramMethodOptimizationInfo) - { - ((ProgramMethodOptimizationInfo)methodOptimizationInfo).setSideEffects(); - - // Trigger the repeater if the setter has changed the value. - if (methodOptimizationInfo.hasSideEffects()) - { - repeatTrigger.set(); - - // Also mark the class if the method is a static initializer. - if (method.getName(clazz).equals(ClassConstants.METHOD_NAME_CLINIT)) - { - clazz.accept(sideEffectClassMarker); - } - } - } - } - - - public static boolean hasSideEffects(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasSideEffects(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SimpleEnumFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SimpleEnumFilter.java deleted file mode 100644 index b076b31c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SimpleEnumFilter.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates its visits to one of two other given - * ClassVisitor instances, depending on whether the classes are marked - * as simple enums or not. - * - * @see SimpleEnumMarker - * - * @author Eric Lafortune - */ -public class SimpleEnumFilter -implements ClassVisitor -{ - private final ClassVisitor simpleEnumClassVisitor; - private final ClassVisitor otherClassVisitor; - - - /** - * Creates a new SimpleEnumClassFilter. - * - * @param simpleEnumClassVisitor the class visitor to which visits to - * classes that are marked to be simpleEnum - * will be delegated. - */ - public SimpleEnumFilter(ClassVisitor simpleEnumClassVisitor) - { - this(simpleEnumClassVisitor, null); - } - - - /** - * Creates a new SimpleEnumClassFilter. - * - * @param simpleEnumClassVisitor the class visitor to which visits to - * classes that are marked as simple enums - * will be delegated. - * @param otherClassVisitor the class visitor to which visits to - * classes that are not marked as simple - * enums will be delegated. - */ - public SimpleEnumFilter(ClassVisitor simpleEnumClassVisitor, - ClassVisitor otherClassVisitor) - { - this.simpleEnumClassVisitor = simpleEnumClassVisitor; - this.otherClassVisitor = otherClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Is the class marked as a simple enum? - ClassVisitor classVisitor = SimpleEnumMarker.isSimpleEnum(programClass) ? - simpleEnumClassVisitor : otherClassVisitor; - - if (classVisitor != null) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // A library class can't be marked as a simple enum. - if (otherClassVisitor != null) - { - otherClassVisitor.visitLibraryClass(libraryClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SimpleEnumMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SimpleEnumMarker.java deleted file mode 100644 index bd4f4bac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SimpleEnumMarker.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor marks all program classes that it visits with a given - * flag for simple enums. - * - * @author Eric Lafortune - */ -public class SimpleEnumMarker -implements ClassVisitor -{ - private final boolean simple; - - - /** - * Creates a new SimpleEnumMarker that marks visited classes with the - * given flag. - */ - public SimpleEnumMarker(boolean simple) - { - this.simple = simple; - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - public void visitProgramClass(ProgramClass programClass) - { - setSimpleEnum(programClass); - } - - - // Small utility methods. - - private void setSimpleEnum(Clazz clazz) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setSimpleEnum(simple); - } - - - public static boolean isSimpleEnum(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).isSimpleEnum(); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SuperInvocationMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SuperInvocationMarker.java deleted file mode 100644 index e3a670af..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SuperInvocationMarker.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.constant.RefConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor marks all methods that invoke super methods (other - * than initializers) from the instructions that it visits. - * - * @author Eric Lafortune - */ -public class SuperInvocationMarker -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor -{ - private boolean invokesSuperMethods; - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - if (constantInstruction.opcode == InstructionConstants.OP_INVOKESPECIAL) - { - invokesSuperMethods = false; - - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - - if (invokesSuperMethods) - { - setInvokesSuperMethods(method); - } - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - invokesSuperMethods = - !clazz.equals(refConstant.referencedClass) && - !refConstant.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT); - } - - - // Small utility methods. - - private static void setInvokesSuperMethods(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setInvokesSuperMethods(); - } - - - public static boolean invokesSuperMethods(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).invokesSuperMethods(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SynchronizedBlockMethodMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SynchronizedBlockMethodMarker.java deleted file mode 100644 index 963843e8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/SynchronizedBlockMethodMarker.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor marks the existence of synchronized blocks - * of the methods whose instructions it visits. - * - * @author Thomas Neidhart - */ -public class SynchronizedBlockMethodMarker -extends SimplifiedVisitor -implements InstructionVisitor -{ - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - if (simpleInstruction.opcode == InstructionConstants.OP_MONITORENTER || - simpleInstruction.opcode == InstructionConstants.OP_MONITOREXIT) - { - setHasSynchronizedBlock(method); - } - } - - // Small utility methods. - - private static void setHasSynchronizedBlock(Method method) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method).setHasSynchronizedBlock(); - } - - - /** - * Returns whether the given method accesses private class members. - */ - public static boolean hasSynchronizedBlock(Method method) - { - return MethodOptimizationInfo.getMethodOptimizationInfo(method).hasSynchronizedBlock(); - } - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UnusedParameterMethodFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UnusedParameterMethodFilter.java deleted file mode 100644 index 47f500f3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UnusedParameterMethodFilter.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor delegates all its method calls to another MemberVisitor, - * but only for Method objects that are marked as having unused parameters. - * - * @see ParameterUsageMarker - * - * @author Eric Lafortune - */ -public class UnusedParameterMethodFilter -implements MemberVisitor -{ - private final MemberVisitor memberVisitor; - - - /** - * Creates a new UnusedParameterMethodFilter. - * @param memberVisitor the member visitor to which the visiting will be - * delegated. - */ - public UnusedParameterMethodFilter(MemberVisitor memberVisitor) - { - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) {} - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (ParameterUsageMarker.hasUnusedParameters(programMethod)) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UnusedParameterOptimizationInfoUpdater.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UnusedParameterOptimizationInfoUpdater.java deleted file mode 100644 index 6432d560..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UnusedParameterOptimizationInfoUpdater.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.*; - -/** - * This AttributeVisitor removes unused parameters from the optimization info - * of the methods that it visits. This includes 'this' parameters. - * - * @see ParameterUsageMarker - * @see MethodStaticizer - * @see MethodDescriptorShrinker - * @author Eric Lafortune - */ -public class UnusedParameterOptimizationInfoUpdater -extends SimplifiedVisitor -implements AttributeVisitor, - - // Internal implementations. - ParameterVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("upoiu") != null; - //*/ - - - private final MemberVisitor extraUnusedParameterMethodVisitor; - - private final MemberVisitor unusedParameterRemover = new AllParameterVisitor(true, - new UsedParameterFilter(null, this)); - - // Parameters and return values for visitor methods. - private int removedParameterSize; - private int removedParameterCount; - - - /** - * Creates a new UnusedParameterOptimizationInfoUpdater. - */ - public UnusedParameterOptimizationInfoUpdater() - { - this(null); - } - - - /** - * Creates a new UnusedParameterOptimizationInfoUpdater with an extra - * visitor. - * @param extraUnusedParameterMethodVisitor an optional extra visitor for - * all removed parameters. - */ - public UnusedParameterOptimizationInfoUpdater(MemberVisitor extraUnusedParameterMethodVisitor) - { - this.extraUnusedParameterMethodVisitor = extraUnusedParameterMethodVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("UnusedParameterOptimizationInfoUpdater: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - // Update the optimization info. - removedParameterCount = 0; - removedParameterSize = 0; - - method.accept(clazz, unusedParameterRemover); - - // Compute the new parameter size from the shrunk descriptor. - ProgramMethodOptimizationInfo programMethodOptimizationInfo = - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method); - - int newParameterSize = - programMethodOptimizationInfo.getParameterSize() - removedParameterSize; - - programMethodOptimizationInfo.setParameterSize(newParameterSize); - programMethodOptimizationInfo.updateUsedParameters(-1L); - } - - - // Implementations for ParameterVisitor. - - public void visitParameter(Clazz clazz, Member member, int parameterIndex, int parameterCount, int parameterOffset, int parameterSize, String parameterType, Clazz referencedClass) - { - if (DEBUG) - { - System.out.println(" Deleting parameter #"+parameterIndex+" (v"+parameterOffset+")"); - } - - Method method = (Method)member; - - // Remove the unused parameter in the optimization info. - // Take into acount the delta from previously removed parameters. - ProgramMethodOptimizationInfo programMethodOptimizationInfo = - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(method); - - programMethodOptimizationInfo.removeParameter(parameterIndex - removedParameterCount++); - - removedParameterSize += ClassUtil.internalTypeSize(parameterType); - - // Visit the method, if required. - if (extraUnusedParameterMethodVisitor != null) - { - method.accept(clazz, extraUnusedParameterMethodVisitor); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UsedParameterFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UsedParameterFilter.java deleted file mode 100644 index c3f293f0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/UsedParameterFilter.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; - -/** - * This ParameterVisitor delegates all its visits to one of two other - * ParameterVisitor instances, depending on whether the parameter is - * used or not. - * - * @see ParameterUsageMarker - * @author Eric Lafortune - */ -public class UsedParameterFilter -implements ParameterVisitor -{ - private final ParameterVisitor usedParameterVisitor; - private final ParameterVisitor unusedParameterVisitor; - - - /** - * Creates a new UsedParameterFilter that delegates visits to used - * parameters to the given parameter visitor. - */ - public UsedParameterFilter(ParameterVisitor usedParameterVisitor) - { - this(usedParameterVisitor, null); - } - - - /** - * Creates a new UsedParameterFilter that delegates to one of the two - * given parameter visitors. - */ - public UsedParameterFilter(ParameterVisitor usedParameterVisitor, - ParameterVisitor unusedParameterVisitor) - { - this.usedParameterVisitor = usedParameterVisitor; - this.unusedParameterVisitor = unusedParameterVisitor; - } - - - // Implementations for ParameterVisitor. - - public void visitParameter(Clazz clazz, Member member, int parameterIndex, int parameterCount, int parameterOffset, int parameterSize, String parameterType, Clazz referencedClass) - { - ParameterVisitor parameterVisitor = - ParameterUsageMarker.isParameterUsed((Method)member, - parameterOffset) ? - usedParameterVisitor : - unusedParameterVisitor; - - if (parameterVisitor != null) - { - parameterVisitor.visitParameter(clazz, - member, - parameterIndex, - parameterCount, - parameterOffset, - parameterSize, - parameterType, - referencedClass); - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/VariableUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/VariableUsageMarker.java deleted file mode 100644 index 11cf2744..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/VariableUsageMarker.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Arrays; - -/** - * This AttributeVisitor marks the local variables that are used in the code - * attributes that it visits. - * - * @author Eric Lafortune - */ -public class VariableUsageMarker -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor -{ - private boolean[] variableUsed = new boolean[ClassConstants.TYPICAL_VARIABLES_SIZE]; - - - /** - * Returns whether the given variable has been marked as being used. - */ - public boolean isVariableUsed(int variableIndex) - { - return variableUsed[variableIndex]; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - int maxLocals = codeAttribute.u2maxLocals; - - // Try to reuse the previous array. - if (variableUsed.length < maxLocals) - { - // Create a new array. - variableUsed = new boolean[maxLocals]; - } - else - { - // Reset the array. - Arrays.fill(variableUsed, 0, maxLocals, false); - } - - codeAttribute.instructionsAccept(clazz, method, this); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - // Mark the variable. - variableUsed[variableInstruction.variableIndex] = true; - - // Account for Category 2 instructions, which take up two entries. - if (variableInstruction.stackPopCount(clazz) == 2 || - variableInstruction.stackPushCount(clazz) == 2) - { - variableUsed[variableInstruction.variableIndex + 1] = true; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/WrapperClassMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/WrapperClassMarker.java deleted file mode 100644 index aebb682d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/WrapperClassMarker.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.info; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.instruction.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.StoringInvocationUnit; - -/** - * This ClassVisitor marks all program classes that are a simple wrapper for a - * single non-null instance of another class. - * - * A wrapper class has - * - exactly one non-static field, which references an object, - * - exactly one initializer, with a single parameter that is never null, - * that initializes the field, - * - no subclasses. - * - * @see StoringInvocationUnit - * @author Eric Lafortune - */ -public class WrapperClassMarker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = System.getProperty("wcm") != null; - //*/ - - - private final Constant[] INITIALIZER_CONSTANTS = new Constant[] - { - new FieldrefConstant(InstructionSequenceMatcher.A, - InstructionSequenceMatcher.B, null, null), - }; - - // Instruction pattern: - // this.x = arg0; - // super.; - // return; - private final Instruction[] INITIALIZER_INSTRUCTIONS = new Instruction[] - { - new VariableInstruction(InstructionConstants.OP_ALOAD_0, 0), - new VariableInstruction(InstructionConstants.OP_ALOAD_1, 1), - new ConstantInstruction(InstructionConstants.OP_PUTFIELD, 0), - new VariableInstruction(InstructionConstants.OP_ALOAD_0, 0), - new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, InstructionSequenceMatcher.X), - new SimpleInstruction(InstructionConstants.OP_RETURN), - }; - - private final InstructionSequenceMatcher INITIALIZER_MATCHER = new InstructionSequenceMatcher(INITIALIZER_CONSTANTS, INITIALIZER_INSTRUCTIONS); - - // Fields acting as parameters and return values for the visitor methods. - private Clazz wrappedClass; - private int wrapCounter; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (programClass.subClasses == null || - programClass.subClasses.length == 0) - { - wrappedClass = null; - - // Can we find one non-static field with a class type? - wrapCounter = 0; - programClass.fieldsAccept(this); - if (wrapCounter == 1) - { - // Can we find exactly one initializer that initializes this - // field? - wrapCounter = 0; - programClass.methodsAccept(this); - if (wrapCounter == 1) - { - setWrappedClass(programClass, wrappedClass); - } - } - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Is the field non-static and of a class type? - if ((programField.getAccessFlags() & ClassConstants.ACC_STATIC) == 0 && - ClassUtil.isInternalClassType(programField.getDescriptor(programClass)) && - !ClassUtil.isInternalArrayType(programField.getDescriptor(programClass))) - { - wrappedClass = programField.referencedClass; - if (wrappedClass != null) - { - wrapCounter++; - } - else - { - wrapCounter = Integer.MIN_VALUE; - } - } - else - { - wrapCounter = Integer.MIN_VALUE; - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Is the method an initializer? - if (ClassUtil.isInitializer(programMethod.getName(programClass))) - { - // Does it have exactly one parameter? - if (ClassUtil.internalMethodParameterCount(programMethod.getDescriptor(programClass)) == 1) - { - // Is the parameter a non-null reference? - Value value = - StoringInvocationUnit.getMethodParameterValue(programMethod, 1); - - if (value != null && - value.computationalType() == Value.TYPE_REFERENCE && - value.referenceValue().isNotNull() == Value.ALWAYS) - { - // Does the method initialize the field? - programMethod.attributesAccept(programClass, this); - } - else - { - wrapCounter = Integer.MIN_VALUE; - } - } - else - { - wrapCounter = Integer.MIN_VALUE; - } - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Is the initializer initializing the field? - if (codeAttribute.u4codeLength == 10) - { - INITIALIZER_MATCHER.reset(); - codeAttribute.instructionsAccept(clazz, method, INITIALIZER_MATCHER); - if (INITIALIZER_MATCHER.isMatching()) - { - String initializerClassName = clazz.getName(); - String fieldClassName = clazz.getClassName(INITIALIZER_MATCHER.matchedConstantIndex(InstructionSequenceMatcher.A)); - if (fieldClassName.equals(initializerClassName)) - { - wrapCounter++; - } - else - { - wrapCounter = Integer.MIN_VALUE; - } - } - else - { - wrapCounter = Integer.MIN_VALUE; - } - } - else - { - wrapCounter = Integer.MIN_VALUE; - } - } - - - // Small utility methods. - - private static void setWrappedClass(Clazz clazz, Clazz wrappedClass) - { - if (DEBUG) - { - System.out.println("WrapperClassMarker: ["+clazz.getName()+"] wraps ["+wrappedClass.getName()+"]"); - } - - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setWrappedClass(wrappedClass); - } - - - public static Clazz getWrappedClass(Clazz clazz) - { - return ClassOptimizationInfo.getClassOptimizationInfo(clazz).getWrappedClass(); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/package.html deleted file mode 100644 index d16486e8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/info/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains classes to collect additional information about classes -and class members, which can then be used for optimization. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/package.html deleted file mode 100644 index 3ee13532..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains visitors that assist with various optimizations of byte -code. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/BranchTargetFinder.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/BranchTargetFinder.java deleted file mode 100644 index 195020d8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/BranchTargetFinder.java +++ /dev/null @@ -1,723 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.optimize.evaluation.InitializationFinder; - -import java.util.Arrays; - -/** - * This AttributeVisitor finds all instruction offsets, branch targets, and - * exception targets in the CodeAttribute objects that it visits. - * - * @see InitializationFinder - * @author Eric Lafortune - */ -public class BranchTargetFinder -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ExceptionInfoVisitor, - ConstantVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("btf") != null; - //*/ - - // We'll explicitly mark instructions that are not part of a subroutine, - // with NO_SUBROUTINE. Subroutines may just branch back into normal code - // (e.g. due to a break instruction in Java code), and we want to avoid - // marking such normal code as subroutine. The first mark wins, so we're - // assuming that such code is marked as normal code before it is marked - // as subroutine. - public static final int UNKNOWN = -1; - public static final int NO_SUBROUTINE = -2; - - private static final short INSTRUCTION = 1 << 0; - private static final short CREATION = 1 << 1; - private static final short INITIALIZER = 1 << 2; - private static final short BRANCH_ORIGIN = 1 << 3; - private static final short BRANCH_TARGET = 1 << 4; - private static final short AFTER_BRANCH = 1 << 5; - private static final short EXCEPTION_START = 1 << 6; - private static final short EXCEPTION_END = 1 << 7; - private static final short EXCEPTION_HANDLER = 1 << 8; - private static final short SUBROUTINE_INVOCATION = 1 << 9; - private static final short SUBROUTINE_RETURNING = 1 << 10; - - - private short[] instructionMarks = new short[ClassConstants.TYPICAL_CODE_LENGTH + 1]; - private int[] subroutineStarts = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - private int[] subroutineEnds = new int[ClassConstants.TYPICAL_CODE_LENGTH]; - private boolean containsSubroutines; - - private boolean repeat; - private int currentSubroutineStart; - private boolean isInitializer; - - - /** - * Returns whether there is an instruction at the given offset in the - * CodeAttribute that was visited most recently. - */ - public boolean isInstruction(int offset) - { - return (instructionMarks[offset] & INSTRUCTION) != 0; - } - - - /** - * Returns whether the instruction at the given offset creates a new, - * uninitialized object instance, in the CodeAttribute that was visited - * most recently. - */ - public boolean isCreation(int offset) - { - return (instructionMarks[offset] & CREATION) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the special - * invocation of an instance initializer, in the CodeAttribute that was - * visited most recently. - */ - public boolean isInitializer(int offset) - { - return (instructionMarks[offset] & INITIALIZER) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the target of - * any kind in the CodeAttribute that was visited most recently. - */ - public boolean isTarget(int offset) - { - return offset == 0 || - (instructionMarks[offset] & (BRANCH_TARGET | - EXCEPTION_START | - EXCEPTION_END | - EXCEPTION_HANDLER)) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the origin of a - * branch instruction in the CodeAttribute that was visited most recently. - */ - public boolean isBranchOrigin(int offset) - { - return (instructionMarks[offset] & BRANCH_ORIGIN) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the target of a - * branch instruction in the CodeAttribute that was visited most recently. - */ - public boolean isBranchTarget(int offset) - { - return (instructionMarks[offset] & BRANCH_TARGET) != 0; - } - - - /** - * Returns whether the instruction at the given offset comes right after a - * definite branch instruction in the CodeAttribute that was visited most - * recently. - */ - public boolean isAfterBranch(int offset) - { - return (instructionMarks[offset] & AFTER_BRANCH) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the start of an - * exception try block in the CodeAttribute that was visited most recently. - */ - public boolean isExceptionStart(int offset) - { - return (instructionMarks[offset] & EXCEPTION_START) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the end of an - * exception try block in the CodeAttribute that was visited most recently. - */ - public boolean isExceptionEnd(int offset) - { - return (instructionMarks[offset] & EXCEPTION_END) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the start of an - * exception handler in the CodeAttribute that was visited most recently. - */ - public boolean isExceptionHandler(int offset) - { - return (instructionMarks[offset] & EXCEPTION_HANDLER) != 0; - } - - - /** - * Returns whether the instruction at the given offset is a subroutine - * invocation in the CodeAttribute that was visited most recently. - */ - public boolean isSubroutineInvocation(int offset) - { - return (instructionMarks[offset] & SUBROUTINE_INVOCATION) != 0; - } - - - /** - * Returns whether the instruction at the given offset is the start of a - * subroutine in the CodeAttribute that was visited most recently. - */ - public boolean isSubroutineStart(int offset) - { - return subroutineStarts[offset] == offset; - } - - - /** - * Returns whether the instruction at the given offset is part of a - * subroutine in the CodeAttribute that was visited most recently. - */ - public boolean isSubroutine(int offset) - { - return subroutineStarts[offset] >= 0; - } - - - /** - * Returns whether the subroutine at the given offset is ever returning - * by means of a regular 'ret' instruction. - */ - public boolean isSubroutineReturning(int offset) - { - return (instructionMarks[offset] & SUBROUTINE_RETURNING) != 0; - } - - - /** - * Returns the start offset of the subroutine at the given offset, in the - * CodeAttribute that was visited most recently. - */ - public int subroutineStart(int offset) - { - return subroutineStarts[offset]; - } - - - /** - * Returns the offset after the subroutine at the given offset, in the - * CodeAttribute that was visited most recently. - */ - public int subroutineEnd(int offset) - { - return subroutineEnds[offset]; - } - - -// /** -// * Returns the instruction offset at which the object instance that is -// * created at the given 'new' instruction offset is initialized, or -// * NONE if it is not being created. -// */ -// public int initializationOffset(int offset) -// { -// return initializationOffsets[offset]; -// } - - -// /** -// * Returns whether the method is an instance initializer, in the -// * CodeAttribute that was visited most recently. -// */ -// public boolean isInitializer() -// { -// return superInitializationOffset != NONE; -// } - - -// /** -// * Returns the instruction offset at which this initializer is calling -// * the "super" or "this" initializer method, or NONE if it is -// * not an initializer. -// */ -// public int superInitializationOffset() -// { -// return superInitializationOffset; -// } - - - /** - * Returns whether the method contains subroutines, in the CodeAttribute - * that was visited most recently. - */ - public boolean containsSubroutines() - { - return containsSubroutines; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // Make sure there are sufficiently large arrays. - int codeLength = codeAttribute.u4codeLength; - if (subroutineStarts.length < codeLength) - { - // Create new arrays. - instructionMarks = new short[codeLength + 1]; - subroutineStarts = new int[codeLength]; - subroutineEnds = new int[codeLength]; -// initializationOffsets = new int[codeLength]; - - // Reset the arrays. - Arrays.fill(subroutineStarts, 0, codeLength, UNKNOWN); - Arrays.fill(subroutineEnds, 0, codeLength, UNKNOWN); -// Arrays.fill(initializationOffsets, 0, codeLength, NONE); - } - else - { - // Reset the arrays. - Arrays.fill(instructionMarks, 0, codeLength, (short)0); - Arrays.fill(subroutineStarts, 0, codeLength, UNKNOWN); - Arrays.fill(subroutineEnds, 0, codeLength, UNKNOWN); -// Arrays.fill(initializationOffsets, 0, codeLength, NONE); - - instructionMarks[codeLength] = 0; - } - -// superInitializationOffset = NONE; - containsSubroutines = false; - - // Iterate until all subroutines have been fully marked. - do - { - repeat = false; - currentSubroutineStart = NO_SUBROUTINE; - - // Mark branch targets by going over all instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Mark branch targets in the exception table. - codeAttribute.exceptionsAccept(clazz, method, this); - } - while (repeat); - - // The end of the code is a branch target sentinel. - instructionMarks[codeLength] = BRANCH_TARGET; - - if (containsSubroutines) - { - // Set the subroutine returning flag and the subroutine end at each - // subroutine start. - int previousSubroutineStart = NO_SUBROUTINE; - - - for (int offset = 0; offset < codeLength; offset++) - { - if (isInstruction(offset)) - { - int subroutineStart = subroutineStarts[offset]; - - if (subroutineStart >= 0 && - isSubroutineReturning(offset)) - { - instructionMarks[subroutineStart] |= SUBROUTINE_RETURNING; - } - - if (previousSubroutineStart >= 0) - { - subroutineEnds[previousSubroutineStart] = offset; - } - - previousSubroutineStart = subroutineStart; - } - } - - if (previousSubroutineStart >= 0) - { - subroutineEnds[previousSubroutineStart] = codeLength; - } - - // Set the subroutine returning flag and the subroutine end at each - // subroutine instruction, based on the marks at the subroutine - // start. - for (int offset = 0; offset < codeLength; offset++) - { - if (isSubroutine(offset)) - { - int subroutineStart = subroutineStarts[offset]; - - if (isSubroutineReturning(subroutineStart)) - { - instructionMarks[offset] |= SUBROUTINE_RETURNING; - } - - subroutineEnds[offset] = subroutineEnds[subroutineStart]; - } - } - } - - if (DEBUG) - { - System.out.println(); - System.out.println("Branch targets: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - - for (int index = 0; index < codeLength; index++) - { - if (isInstruction(index)) - { - System.out.println("" + - (isInitializer(index) ? 'I' : '-') + - (isBranchOrigin(index) ? 'B' : '-') + - (isAfterBranch(index) ? 'b' : '-') + - (isBranchTarget(index) ? 'T' : '-') + - (isExceptionStart(index) ? 'E' : '-') + - (isExceptionEnd(index) ? 'e' : '-') + - (isExceptionHandler(index) ? 'H' : '-') + - (isSubroutineInvocation(index) ? 'J' : '-') + - (isSubroutineStart(index) ? 'S' : '-') + - (isSubroutineReturning(index) ? 'r' : '-') + - (isSubroutine(index) ? " ["+subroutineStart(index)+" -> "+subroutineEnd(index)+"]" : "") + - InstructionFactory.create(codeAttribute.code, index).toString(index)); - } - } - } - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - // Mark the instruction. - instructionMarks[offset] |= INSTRUCTION; - - // Check if this is an instruction of a subroutine. - checkSubroutine(offset); - - byte opcode = simpleInstruction.opcode; - if (opcode == InstructionConstants.OP_IRETURN || - opcode == InstructionConstants.OP_LRETURN || - opcode == InstructionConstants.OP_FRETURN || - opcode == InstructionConstants.OP_DRETURN || - opcode == InstructionConstants.OP_ARETURN || - opcode == InstructionConstants.OP_RETURN || - opcode == InstructionConstants.OP_ATHROW) - { - // Mark the branch origin. - markBranchOrigin(offset); - - // Mark the next instruction. - markAfterBranchOrigin(offset + simpleInstruction.length(offset)); - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Mark the instruction. - instructionMarks[offset] |= INSTRUCTION; - - // Check if this is an instruction of a subroutine. - checkSubroutine(offset); - - byte opcode = constantInstruction.opcode; - if (opcode == InstructionConstants.OP_NEW) - { - // Mark the creation. - instructionMarks[offset] |= CREATION; - } - else if (opcode == InstructionConstants.OP_INVOKESPECIAL) - { - // Is it calling an instance initializer? - isInitializer = false; - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - if (isInitializer) - { - // Mark the initializer. - instructionMarks[offset] |= INITIALIZER; - } - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - // Mark the instruction. - instructionMarks[offset] |= INSTRUCTION; - - // Check if this is an instruction of a subroutine. - checkSubroutine(offset); - - if (variableInstruction.opcode == InstructionConstants.OP_RET) - { - // Mark the method. - containsSubroutines = true; - - // Mark the branch origin. - markBranchOrigin(offset); - - // Mark the subroutine return at its return instruction. - instructionMarks[offset] |= SUBROUTINE_RETURNING; - - // Mark the next instruction. - markAfterBranchOrigin(offset + variableInstruction.length(offset)); - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - int branchOffset = branchInstruction.branchOffset; - int targetOffset = offset + branchOffset; - - // Mark the branch origin. - markBranchOrigin(offset); - - // Check if this is an instruction of a subroutine. - checkSubroutine(offset); - - // Mark the branch target. - markBranchTarget(offset, branchOffset); - - byte opcode = branchInstruction.opcode; - if (opcode == InstructionConstants.OP_JSR || - opcode == InstructionConstants.OP_JSR_W) - { - // Mark the method. - containsSubroutines = true; - - // Mark the subroutine invocation. - instructionMarks[offset] |= SUBROUTINE_INVOCATION; - - // Mark the new subroutine start. - markBranchSubroutineStart(offset, branchOffset, targetOffset); - } - else if (currentSubroutineStart != UNKNOWN) - { - // Mark the continued subroutine start. - markBranchSubroutineStart(offset, branchOffset, currentSubroutineStart); - } - - if (opcode == InstructionConstants.OP_GOTO || - opcode == InstructionConstants.OP_GOTO_W) - { - // Mark the next instruction. - markAfterBranchOrigin(offset + branchInstruction.length(offset)); - } - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - // Mark the branch origin. - markBranchOrigin(offset); - - // Check if this is an instruction of a subroutine. - checkSubroutine(offset); - - // Mark the branch targets of the default jump offset. - markBranch(offset, switchInstruction.defaultOffset); - - // Mark the branch targets of the jump offsets. - markBranches(offset, switchInstruction.jumpOffsets); - - // Mark the next instruction. - markAfterBranchOrigin(offset + switchInstruction.length(offset)); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - // Remember whether the method is an initializer. - isInitializer = methodrefConstant.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - int startPC = exceptionInfo.u2startPC; - int endPC = exceptionInfo.u2endPC; - int handlerPC = exceptionInfo.u2handlerPC; - - // Mark the exception offsets. - instructionMarks[startPC] |= EXCEPTION_START; - instructionMarks[endPC] |= EXCEPTION_END; - instructionMarks[handlerPC] |= EXCEPTION_HANDLER; - - // Mark the handler as part of a subroutine if necessary. - if (subroutineStarts[handlerPC] == UNKNOWN && - subroutineStarts[startPC] != UNKNOWN) - { - subroutineStarts[handlerPC] = subroutineStarts[startPC]; - - // We'll have to go over all instructions again. - repeat = true; - } - } - - - // Small utility methods. - - /** - * Marks the branch targets and their subroutine starts at the given - * offsets. - */ - private void markBranches(int offset, int[] jumpOffsets) - { - for (int index = 0; index < jumpOffsets.length; index++) - { - markBranch(offset, jumpOffsets[index]); - } - } - - - /** - * Marks the branch target and its subroutine start at the given offset. - */ - private void markBranch(int offset, int jumpOffset) - { - markBranchTarget(offset, jumpOffset); - - if (currentSubroutineStart != UNKNOWN) - { - markBranchSubroutineStart(offset, jumpOffset, currentSubroutineStart); - } - } - - /** - * Marks the branch origin at the given offset. - */ - private void markBranchOrigin(int offset) - { - instructionMarks[offset] |= INSTRUCTION | BRANCH_ORIGIN; - } - - - /** - * Marks the branch target at the given offset. - */ - private void markBranchTarget(int offset, int jumpOffset) - { - int targetOffset = offset + jumpOffset; - - instructionMarks[targetOffset] |= BRANCH_TARGET; - } - - - /** - * Marks the subroutine start at the given offset, if applicable. - */ - private void markBranchSubroutineStart(int offset, - int jumpOffset, - int subroutineStart) - { - int targetOffset = offset + jumpOffset; - - // Are we marking a subroutine and branching to an offset that hasn't - // been marked yet? - if (subroutineStarts[targetOffset] == UNKNOWN) - { - // Is it a backward branch? - if (jumpOffset < 0) - { - // Remember the smallest subroutine start. - if (subroutineStart > targetOffset) - { - subroutineStart = targetOffset; - } - - // We'll have to go over all instructions again. - repeat = true; - } - - // Mark the subroutine start of the target. - subroutineStarts[targetOffset] = subroutineStart; - } - } - - - /** - * Marks the instruction at the given offset, after a branch. - */ - private void markAfterBranchOrigin(int nextOffset) - { - instructionMarks[nextOffset] |= AFTER_BRANCH; - - // Stop marking a subroutine. - currentSubroutineStart = UNKNOWN; - } - - - /** - * Checks if the specified instruction is inside a subroutine. - */ - private void checkSubroutine(int offset) - { - // Are we inside a previously marked subroutine? - if (subroutineStarts[offset] != UNKNOWN) - { - // Start marking a subroutine. - currentSubroutineStart = subroutineStarts[offset]; - } - - // Are we marking a subroutine? - else if (currentSubroutineStart != UNKNOWN) - { - // Mark the subroutine start. - subroutineStarts[offset] = currentSubroutineStart; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ClassFinalizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ClassFinalizer.java deleted file mode 100644 index b0523370..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ClassFinalizer.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; -import proguard.optimize.KeepMarker; - -/** - * This ClassVisitor makes the program classes that it visits - * final, if possible. - * - * @author Eric Lafortune - */ -public class ClassFinalizer -extends SimplifiedVisitor -implements ClassVisitor -{ - private final ClassVisitor extraClassVisitor; - - - /** - * Creates a new ClassFinalizer. - */ - public ClassFinalizer() - { - this(null); - } - - - /** - * Creates a new ClassFinalizer. - * @param extraClassVisitor an optional extra visitor for all finalized - * classes. - */ - public ClassFinalizer(ClassVisitor extraClassVisitor) - { - this.extraClassVisitor = extraClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // If the class is not final/interface/abstract, - // and it is not being kept, - // and it doesn't have any subclasses, - // then make it final. - if ((programClass.u2accessFlags & (ClassConstants.ACC_FINAL | - ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_ABSTRACT)) == 0 && - !KeepMarker.isKept(programClass) && - programClass.subClasses == null) - { - programClass.u2accessFlags |= ClassConstants.ACC_FINAL; - - // Visit the class, if required. - if (extraClassVisitor != null) - { - extraClassVisitor.visitProgramClass(programClass); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ClassMerger.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ClassMerger.java deleted file mode 100644 index 9fcb8d2c..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ClassMerger.java +++ /dev/null @@ -1,797 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.editor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.KeepMarker; -import proguard.optimize.info.*; -import proguard.util.*; - -import java.util.*; - -/** - * This ClassVisitor inlines the classes that it visits in a given target class, - * whenever possible. - * - * @see RetargetedInnerClassAttributeRemover - * @see TargetClassChanger - * @see ClassReferenceFixer - * @see MemberReferenceFixer - * @see AccessFixer - * @author Eric Lafortune - */ -public class ClassMerger -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor -{ - //* - private static final boolean DEBUG = false; - private static final boolean DETAILS = false; - /*/ - private static boolean DEBUG = System.getProperty("cm") != null; - private static boolean DETAILS = System.getProperty("cmd") != null; - //*/ - - - private final ProgramClass targetClass; - private final boolean allowAccessModification; - private final boolean mergeInterfacesAggressively; - private final boolean mergeWrapperClasses; - private final ClassVisitor extraClassVisitor; - - private final MemberVisitor fieldOptimizationInfoCopier = new FieldOptimizationInfoCopier(); - - - /** - * Creates a new ClassMerger that will merge classes into the given target - * class. - * @param targetClass the class into which all visited - * classes will be merged. - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - * @param mergeInterfacesAggressively specifies whether interfaces may - * be merged aggressively. - */ - public ClassMerger(ProgramClass targetClass, - boolean allowAccessModification, - boolean mergeInterfacesAggressively, - boolean mergeWrapperClasses) - { - this(targetClass, - allowAccessModification, - mergeInterfacesAggressively, - mergeWrapperClasses, - null); - } - - - /** - * Creates a new ClassMerger that will merge classes into the given target - * class. - * @param targetClass the class into which all visited - * classes will be merged. - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - * @param mergeInterfacesAggressively specifies whether interfaces may - * be merged aggressively. - * @param extraClassVisitor an optional extra visitor for all - * merged classes. - */ - public ClassMerger(ProgramClass targetClass, - boolean allowAccessModification, - boolean mergeInterfacesAggressively, - boolean mergeWrapperClasses, - ClassVisitor extraClassVisitor) - { - this.targetClass = targetClass; - this.allowAccessModification = allowAccessModification; - this.mergeInterfacesAggressively = mergeInterfacesAggressively; - this.mergeWrapperClasses = mergeWrapperClasses; - this.extraClassVisitor = extraClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - //final String CLASS_NAME = "abc/Def"; - //DEBUG = programClass.getName().equals(CLASS_NAME) || - // targetClass.getName().equals(CLASS_NAME); - - // TODO: Remove this when the class merger has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - visitProgramClass0(programClass); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while merging classes:"); - System.err.println(" Class = ["+programClass.getName()+"]"); - System.err.println(" Target class = ["+targetClass.getName()+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - if (DEBUG) - { - programClass.accept(new ClassPrinter()); - targetClass.accept(new ClassPrinter()); - } - - throw ex; - } - } - - public void visitProgramClass0(ProgramClass programClass) - { - if (!programClass.equals(targetClass) && - - // Don't merge classes that must be preserved. - !KeepMarker.isKept(programClass) && - !KeepMarker.isKept(targetClass) && - - // Only merge classes that haven't been retargeted yet. - getTargetClass(programClass) == null && - getTargetClass(targetClass) == null && - - // Don't merge annotation classes, with all their reflection and - // infinite recursion. - (programClass.getAccessFlags() & ClassConstants.ACC_ANNOTATION) == 0 && - - (!DETAILS || print(programClass, "Version?")) && - - // Only merge classes with equal class versions. - programClass.u4version == targetClass.u4version && - - (!DETAILS || print(programClass, "Package visibility?")) && - - // Only merge classes if we can change the access permissions, or - // if they are in the same package, or - // if they are public and don't contain or invoke package visible - // class members. - (allowAccessModification || - ((programClass.getAccessFlags() & - targetClass.getAccessFlags() & - ClassConstants.ACC_PUBLIC) != 0 && - !PackageVisibleMemberContainingClassMarker.containsPackageVisibleMembers(programClass) && - !PackageVisibleMemberInvokingClassMarker.invokesPackageVisibleMembers(programClass)) || - ClassUtil.internalPackageName(programClass.getName()).equals( - ClassUtil.internalPackageName(targetClass.getName()))) && - - (!DETAILS || print(programClass, "Interface/abstract/single?")) && - - // Only merge two classes or two interfaces or two abstract classes, - // or a single implementation into its interface. - ((programClass.getAccessFlags() & - (ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_ABSTRACT)) == - (targetClass.getAccessFlags() & - (ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_ABSTRACT)) || - (isOnlySubClass(programClass, targetClass) && - programClass.getSuperClass() != null && - (programClass.getSuperClass().equals(targetClass) || - programClass.getSuperClass().equals(targetClass.getSuperClass())))) && - - (!DETAILS || print(programClass, "Indirect implementation?")) && - - // One class must not implement the other class indirectly. - !indirectlyImplementedInterfaces(programClass).contains(targetClass) && - !targetClass.extendsOrImplements(programClass) && - - (!DETAILS || print(programClass, "Interfaces same subinterfaces?")) && - - // Interfaces must have exactly the same subinterfaces, not - // counting themselves, to avoid any loops in the interface - // hierarchy. - ((programClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0 || - (targetClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0 || - subInterfaces(programClass, targetClass).equals(subInterfaces(targetClass, programClass))) && - - (!DETAILS || print(programClass, "Same initialized superclasses?")) && - - // The two classes must have the same superclasses and interfaces - // with static initializers. - sideEffectSuperClasses(programClass).equals(sideEffectSuperClasses(targetClass)) && - - (!DETAILS || print(programClass, "Same instanceofed superclasses?")) && - - // The two classes must have the same superclasses and interfaces - // that are tested with 'instanceof'. - instanceofedSuperClasses(programClass).equals(instanceofedSuperClasses(targetClass)) && - - (!DETAILS || print(programClass, "Same caught superclasses?")) && - - // The two classes must have the same superclasses that are caught - // as exceptions. - caughtSuperClasses(programClass).equals(caughtSuperClasses(targetClass)) && - - (!DETAILS || print(programClass, "Not .classed?")) && - - // The two classes must not both be part of a .class construct. - !(DotClassMarker.isDotClassed(programClass) && - DotClassMarker.isDotClassed(targetClass)) && - - (!DETAILS || print(programClass, "No clashing fields?")) && - - // The classes must not have clashing fields. - (mergeWrapperClasses || - !haveAnyIdenticalFields(programClass, targetClass)) && - - (!DETAILS || print(programClass, "No unwanted fields?")) && - - // The two classes must not introduce any unwanted fields. - (mergeWrapperClasses || - !introducesUnwantedFields(programClass, targetClass) && - !introducesUnwantedFields(targetClass, programClass)) && - - (!DETAILS || print(programClass, "No shadowed fields?")) && - - // The two classes must not shadow each others fields. - (mergeWrapperClasses || - !shadowsAnyFields(programClass, targetClass) && - !shadowsAnyFields(targetClass, programClass)) && - - (!DETAILS || print(programClass, "No clashing methods?")) && - - // The classes must not have clashing methods. - !haveAnyIdenticalMethods(programClass, targetClass) && - - (!DETAILS || print(programClass, "No abstract methods?")) && - - // The classes must not introduce abstract methods, unless - // explicitly allowed. - (mergeInterfacesAggressively || - (!introducesUnwantedAbstractMethods(programClass, targetClass) && - !introducesUnwantedAbstractMethods(targetClass, programClass))) && - - (!DETAILS || print(programClass, "No overridden methods?")) && - - // The classes must not override each others concrete methods. - !overridesAnyMethods(programClass, targetClass) && - !overridesAnyMethods(targetClass, programClass) && - - (!DETAILS || print(programClass, "No shadowed methods?")) && - - // The classes must not shadow each others non-private methods. - !shadowsAnyMethods(programClass, targetClass) && - !shadowsAnyMethods(targetClass, programClass) && - - (!DETAILS || print(programClass, "No non-copiable attributes?")) && - - // The class to be merged into the target class must not have - // non-copiable attributes (InnerClass, EnclosingMethod), - // unless it is a synthetic class. - (mergeWrapperClasses || - (programClass.getAccessFlags() & ClassConstants.ACC_SYNTHETIC) != 0 || - !hasNonCopiableAttributes(programClass))) - { - // We're not actually merging the classes, but only copying the - // contents from the source class to the target class. We'll - // then let all other classes point to it. The shrinking step - // will finally remove the source class. - if (DEBUG) - { - System.out.println("ClassMerger ["+programClass.getName()+"] -> ["+targetClass.getName()+"]"); - System.out.println(" Source interface? ["+((programClass.getAccessFlags() & ClassConstants.ACC_INTERFACE)!=0)+"]"); - System.out.println(" Target interface? ["+((targetClass.getAccessFlags() & ClassConstants.ACC_INTERFACE)!=0)+"]"); - System.out.println(" Source subclasses ["+programClass.subClasses+"]"); - System.out.println(" Target subclasses ["+targetClass.subClasses+"]"); - System.out.println(" Source superclass ["+programClass.getSuperClass().getName()+"]"); - System.out.println(" Target superclass ["+targetClass.getSuperClass().getName()+"]"); - - //System.out.println("=== Before ==="); - //programClass.accept(new ClassPrinter()); - //targetClass.accept(new ClassPrinter()); - } - - // Combine the access flags. - int targetAccessFlags = targetClass.getAccessFlags(); - int sourceAccessFlags = programClass.getAccessFlags(); - - targetClass.u2accessFlags = - ((targetAccessFlags & - sourceAccessFlags) & - (ClassConstants.ACC_INTERFACE | - ClassConstants.ACC_ABSTRACT)) | - ((targetAccessFlags | - sourceAccessFlags) & - (ClassConstants.ACC_PUBLIC | - ClassConstants.ACC_SUPER | - ClassConstants.ACC_ANNOTATION | - ClassConstants.ACC_ENUM)); - - // Copy over the superclass, if it's a non-interface class being - // merged into an interface class. - // However, we're currently never merging in a way that changes the - // superclass. - //if ((programClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) == 0 && - // (targetClass.getAccessFlags() & ClassConstants.ACC_INTERFACE) != 0) - //{ - // targetClass.u2superClass = - // new ConstantAdder(targetClass).addConstant(programClass, programClass.u2superClass); - //} - - // Copy over the interfaces that aren't present yet and that - // wouldn't cause loops in the class hierarchy. - // Note that the code shouldn't be iterating over the original - // list at this point. This is why we only add subclasses in - // a separate step. - programClass.interfaceConstantsAccept( - new ExceptClassConstantFilter(targetClass.getName(), - new ImplementedClassConstantFilter(targetClass, - new ImplementingClassConstantFilter(targetClass, - new InterfaceAdder(targetClass))))); - - // Copy over the class members. - MemberAdder memberAdder = - new MemberAdder(targetClass, fieldOptimizationInfoCopier); - - programClass.fieldsAccept(mergeWrapperClasses ? - new MemberAccessFilter(ClassConstants.ACC_STATIC, 0, memberAdder) : - memberAdder); - - programClass.methodsAccept(mergeWrapperClasses ? - new MemberNameFilter(new NotMatcher(new FixedStringMatcher(ClassConstants.METHOD_NAME_INIT)), memberAdder) : - memberAdder); - - // Copy over the other attributes. - programClass.attributesAccept( - new AttributeNameFilter(new NotMatcher( - new OrMatcher(new FixedStringMatcher(ClassConstants.ATTR_BootstrapMethods), - new OrMatcher(new FixedStringMatcher(ClassConstants.ATTR_SourceFile), - new OrMatcher(new FixedStringMatcher(ClassConstants.ATTR_InnerClasses), - new FixedStringMatcher(ClassConstants.ATTR_EnclosingMethod))))), - new AttributeAdder(targetClass, true))); - - // Update the optimization information of the target class. - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(targetClass) - .merge(ClassOptimizationInfo.getClassOptimizationInfo(programClass)); - - // Remember to replace the inlined class by the target class. - setTargetClass(programClass, targetClass); - - //if (DEBUG) - //{ - // System.out.println("=== After ===="); - // targetClass.accept(new ClassPrinter()); - //} - - // Visit the merged class, if required. - if (extraClassVisitor != null) - { - extraClassVisitor.visitProgramClass(programClass); - } - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Ignore attempts to merge with a library class. - } - - - private boolean print(ProgramClass programClass, String message) - { - System.out.println("Merge ["+targetClass.getName()+"] <- ["+programClass.getName()+"] "+message); - - return true; - } - - - // Small utility methods. - - /** - * Returns whether a given class is the only subclass of another given class. - */ - private boolean isOnlySubClass(Clazz subClass, - ProgramClass clazz) - { - // TODO: The list of subclasses is not up to date. - return clazz.subClasses != null && - clazz.subClasses.length == 1 && - clazz.subClasses[0].equals(subClass); - } - - - /** - * Returns the set of indirectly implemented interfaces. - */ - private Set indirectlyImplementedInterfaces(Clazz clazz) - { - Set set = new HashSet(); - - ReferencedClassVisitor referencedInterfaceCollector = - new ReferencedClassVisitor( - new ClassHierarchyTraveler(false, false, true, false, - new ClassCollector(set))); - - // Visit all superclasses and collect their interfaces. - clazz.superClassConstantAccept(referencedInterfaceCollector); - - // Visit all interfaces and collect their interfaces. - clazz.interfaceConstantsAccept(referencedInterfaceCollector); - - return set; - } - - - /** - * Returns the set of interface subclasses, not including the given class. - */ - private Set subInterfaces(Clazz clazz, Clazz exceptClass) - { - Set set = new HashSet(); - - // Visit all subclasses, collecting the interface classes. - clazz.hierarchyAccept(false, false, false, true, - new ClassAccessFilter(ClassConstants.ACC_INTERFACE, 0, - new ExceptClassesFilter(new Clazz[] { exceptClass }, - new ClassCollector(set)))); - - return set; - } - - - /** - * Returns the set of superclasses and interfaces that are initialized. - */ - private Set sideEffectSuperClasses(Clazz clazz) - { - Set set = new HashSet(); - - // Visit all superclasses and interfaces, collecting the ones that have - // static initializers. - clazz.hierarchyAccept(true, true, true, false, - new SideEffectClassFilter( - new ClassCollector(set))); - - return set; - } - - - /** - * Returns the set of superclasses and interfaces that are used in - * 'instanceof' tests. - */ - private Set instanceofedSuperClasses(Clazz clazz) - { - Set set = new HashSet(); - - // Visit all superclasses and interfaces, collecting the ones that are - // used in an 'instanceof' test. - clazz.hierarchyAccept(true, true, true, false, - new InstanceofClassFilter( - new ClassCollector(set))); - - return set; - } - - - /** - * Returns the set of superclasses that are caught as exceptions. - */ - private Set caughtSuperClasses(Clazz clazz) - { - // Don't bother if this isn't an exception at all. - if (!clazz.extends_(ClassConstants.NAME_JAVA_LANG_THROWABLE)) - { - return Collections.EMPTY_SET; - } - - // Visit all superclasses, collecting the ones that are caught - // (plus java.lang.Object, in the current implementation). - Set set = new HashSet(); - - clazz.hierarchyAccept(true, true, false, false, - new CaughtClassFilter( - new ClassCollector(set))); - - return set; - } - - - /** - * Returns whether the two given classes have fields with the same - * names and descriptors. - */ - private boolean haveAnyIdenticalFields(Clazz clazz, - Clazz targetClass) - { - MemberCounter counter = new MemberCounter(); - - // Visit all fields, counting the with the same name and descriptor in - // the target class. - clazz.fieldsAccept(new SimilarMemberVisitor(targetClass, true, false, false, false, - counter)); - - return counter.getCount() > 0; - } - - - /** - * Returns whether the given class would introduce any unwanted fields - * in the target class. - */ - private boolean introducesUnwantedFields(Clazz programClass, - ProgramClass targetClass) - { - // It's ok if the target class is never instantiated and does not - // have any subclasses except for maybe the source class. - if (!InstantiationClassMarker.isInstantiated(targetClass) && - (targetClass.subClasses == null || - isOnlySubClass(programClass, targetClass))) - { - return false; - } - - MemberCounter counter = new MemberCounter(); - - // Count all non-static fields in the the source class. - programClass.fieldsAccept(new MemberAccessFilter(0, ClassConstants.ACC_STATIC, - counter)); - - return counter.getCount() > 0; - } - - - /** - * Returns whether the given class or its subclasses shadow any fields in - * the given target class. - */ - private boolean shadowsAnyFields(Clazz clazz, - Clazz targetClass) - { - MemberCounter counter = new MemberCounter(); - - // Visit all fields, counting the ones that are shadowing non-private - // fields in the class hierarchy of the target class. - clazz.hierarchyAccept(true, false, false, true, - new AllFieldVisitor( - new SimilarMemberVisitor(targetClass, true, true, true, false, - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - counter)))); - - return counter.getCount() > 0; - } - - - /** - * Returns whether the two given classes have class members with the same - * name and descriptor. - */ - private boolean haveAnyIdenticalMethods(Clazz clazz, - Clazz targetClass) - { - MemberCounter counter = new MemberCounter(); - - // Visit all non-abstract methods, counting the ones that are also - // present in the target class. - clazz.methodsAccept(new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT, - new SimilarMemberVisitor(targetClass, true, false, false, false, - new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT, - counter)))); - - return counter.getCount() > 0; - } - - - /** - * Returns whether the given class would introduce any abstract methods - * in the target class. - */ - private boolean introducesUnwantedAbstractMethods(Clazz clazz, - ProgramClass targetClass) - { - // It's ok if the target class is already abstract and does not - // have any subclasses except for maybe the source class. - if ((targetClass.getAccessFlags() & - (ClassConstants.ACC_ABSTRACT | - ClassConstants.ACC_INTERFACE)) != 0 && - (targetClass.subClasses == null || - isOnlySubClass(clazz, targetClass))) - { - return false; - } - - MemberCounter counter = new MemberCounter(); - Set targetSet = new HashSet(); - - // Collect all abstract methods, and similar abstract methods in the - // class hierarchy of the target class. - clazz.methodsAccept(new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - new MultiMemberVisitor( - counter, - - new SimilarMemberVisitor(targetClass, true, true, true, false, - new MemberAccessFilter(ClassConstants.ACC_ABSTRACT, 0, - new MemberCollector(false, true, true, targetSet))) - ))); - - return targetSet.size() < counter.getCount(); - } - - - /** - * Returns whether the given class overrides any methods in the given - * target class. - */ - private boolean overridesAnyMethods(Clazz clazz, - ProgramClass targetClass) - { - // It's ok if the target class is never instantiated and does - // not have any subclasses except for maybe the source class. - if (!InstantiationClassMarker.isInstantiated(targetClass) && - (targetClass.subClasses == null || - isOnlySubClass(clazz, targetClass))) - { - return false; - } - - MemberCounter counter = new MemberCounter(); - - // Visit all non-abstract methods, counting the ones that are - // overriding methods in the class hierarchy of the target class. - clazz.methodsAccept(new MemberAccessFilter(0, ClassConstants.ACC_ABSTRACT, - new InitializerMethodFilter(null, - new SimilarMemberVisitor(targetClass, true, true, false, false, - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE | ClassConstants.ACC_STATIC | ClassConstants.ACC_ABSTRACT, - counter))))); - - return counter.getCount() > 0; - } - - - /** - * Returns whether the given class or its subclasses have private or - * static methods that shadow any methods in the given target class. - */ - private boolean shadowsAnyMethods(Clazz clazz, - Clazz targetClass) - { - // It's ok if the source class already extends the target class - // or (in practice) vice versa. - if (clazz.extends_(targetClass) || - targetClass.extends_(clazz)) - { - return false; - } - - MemberCounter counter = new MemberCounter(); - - // Visit all methods, counting the ones that are shadowing - // final methods in the class hierarchy of the target class. - clazz.hierarchyAccept(true, false, false, true, - new AllMethodVisitor( - new InitializerMethodFilter(null, - new SimilarMemberVisitor(targetClass, true, true, false, false, - new MemberAccessFilter(ClassConstants.ACC_FINAL, 0, - counter))))); - if (counter.getCount() > 0) - { - return true; - } - - // Visit all private methods, counting the ones that are shadowing - // non-private methods in the class hierarchy of the target class. - clazz.hierarchyAccept(true, false, false, true, - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_PRIVATE, 0, - new InitializerMethodFilter(null, - new SimilarMemberVisitor(targetClass, true, true, true, false, - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - counter)))))); - if (counter.getCount() > 0) - { - return true; - } - - // Visit all static methods, counting the ones that are shadowing - // non-private methods in the class hierarchy of the target class. - clazz.hierarchyAccept(true, false, false, true, - new AllMethodVisitor( - new MemberAccessFilter(ClassConstants.ACC_STATIC, 0, - new InitializerMethodFilter(null, - new SimilarMemberVisitor(targetClass, true, true, true, false, - new MemberAccessFilter(0, ClassConstants.ACC_PRIVATE, - counter)))))); - - return counter.getCount() > 0; - } - - - /** - * Returns whether the given class has any attributes that can not be copied when - * merging it into another class. - */ - private boolean hasNonCopiableAttributes(Clazz clazz) - { - AttributeCounter counter = new AttributeCounter(); - - // Copy over the other attributes. - clazz.attributesAccept( - new AttributeNameFilter( - new OrMatcher(new FixedStringMatcher(ClassConstants.ATTR_InnerClasses), - new FixedStringMatcher(ClassConstants.ATTR_EnclosingMethod)), - counter)); - - return counter.getCount() > 0; - } - - - public static void setTargetClass(Clazz clazz, Clazz targetClass) - { - ProgramClassOptimizationInfo.getProgramClassOptimizationInfo(clazz).setTargetClass(targetClass); - } - - - public static Clazz getTargetClass(Clazz clazz) - { - Clazz targetClass = null; - - // Return the last target class, if any. - while (true) - { - clazz = ClassOptimizationInfo.getClassOptimizationInfo(clazz).getTargetClass(); - if (clazz == null) - { - return targetClass; - } - - targetClass = clazz; - } - } - - - /** - * This MemberVisitor copies field optimization info from copied fields. - */ - private static class FieldOptimizationInfoCopier - extends SimplifiedVisitor - implements MemberVisitor - { - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Copy the optimization info from the field that was just copied. - ProgramField copiedField = (ProgramField)programField.getVisitorInfo(); - Object info = copiedField.getVisitorInfo(); - - programField.setVisitorInfo(info instanceof ProgramFieldOptimizationInfo ? - new ProgramFieldOptimizationInfo((ProgramFieldOptimizationInfo)info) : - info); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Linked methods share their optimization info. - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoCommonCodeReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoCommonCodeReplacer.java deleted file mode 100644 index 6d7db5a7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoCommonCodeReplacer.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor redirects unconditional branches so any common code - * is shared, and the code preceding the branch can be removed, in the code - * attributes that it visits. - * - * @author Eric Lafortune - */ -public class GotoCommonCodeReplacer -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - - private final InstructionVisitor extraInstructionVisitor; - - private final BranchTargetFinder branchTargetFinder = new BranchTargetFinder(); - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - - /** - * Creates a new GotoCommonCodeReplacer. - * @param extraInstructionVisitor an optional extra visitor for all replaced - * goto instructions. - */ - public GotoCommonCodeReplacer(InstructionVisitor extraInstructionVisitor) - { - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // Mark all branch targets. - branchTargetFinder.visitCodeAttribute(clazz, method, codeAttribute); - - // Reset the code attribute editor. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Remap the variables of the instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Apply the code atribute editor. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - // Check if the instruction is an unconditional goto instruction that - // isn't the target of a branch itself. - byte opcode = branchInstruction.opcode; - if ((opcode == InstructionConstants.OP_GOTO || - opcode == InstructionConstants.OP_GOTO_W) && - !branchTargetFinder.isBranchTarget(offset)) - { - int branchOffset = branchInstruction.branchOffset; - int targetOffset = offset + branchOffset; - - // Get the number of common bytes. - int commonCount = commonByteCodeCount(codeAttribute, offset, targetOffset); - - if (commonCount > 0 && - !exceptionBoundary(codeAttribute, offset, targetOffset)) - { - if (DEBUG) - { - System.out.println("GotoCommonCodeReplacer: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+" (["+(offset-commonCount)+"] - "+branchInstruction.toString(offset)+" -> "+targetOffset+")"); - } - - // Delete the common instructions. - for (int delta = 0; delta <= commonCount; delta++) - { - int deleteOffset = offset - delta; - if (branchTargetFinder.isInstruction(deleteOffset)) - { - codeAttributeEditor.clearModifications(deleteOffset); - codeAttributeEditor.deleteInstruction(deleteOffset); - } - } - - // Redirect the goto instruction, if it is still necessary. - int newBranchOffset = branchOffset - commonCount; - if (newBranchOffset != branchInstruction.length(offset)) - { - Instruction newGotoInstruction = - new BranchInstruction(opcode, newBranchOffset); - codeAttributeEditor.replaceInstruction(offset, - newGotoInstruction); - } - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - extraInstructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - } - } - } - - - // Small utility methods. - - /** - * Returns the number of common bytes preceding the given offsets, - * avoiding branches and exception blocks. - */ - private int commonByteCodeCount(CodeAttribute codeAttribute, int offset1, int offset2) - { - // Find the block of common instructions preceding it. - byte[] code = codeAttribute.code; - - int successfulDelta = 0; - - for (int delta = 1; - delta <= offset1 && - delta <= offset2 && - offset2 - delta != offset1; - delta++) - { - int newOffset1 = offset1 - delta; - int newOffset2 = offset2 - delta; - - // Is the code identical at both offsets? - if (code[newOffset1] != code[newOffset2]) - { - break; - } - - // Are there instructions at either offset but not both? - if (branchTargetFinder.isInstruction(newOffset1) ^ - branchTargetFinder.isInstruction(newOffset2)) - { - break; - } - - // Are there instructions at both offsets? - if (branchTargetFinder.isInstruction(newOffset1) && - branchTargetFinder.isInstruction(newOffset2)) - { - // Are the offsets involved in some branches? - // Note that the preverifier doesn't like initializer - // invocations to be moved around. - // Also note that the preverifier doesn't like pop instructions - // that work on different operands. - if (branchTargetFinder.isBranchOrigin(newOffset1) || - branchTargetFinder.isBranchTarget(newOffset1) || - branchTargetFinder.isExceptionStart(newOffset1) || - branchTargetFinder.isExceptionEnd(newOffset1) || - branchTargetFinder.isInitializer(newOffset1) || - branchTargetFinder.isExceptionStart(newOffset2) || - branchTargetFinder.isExceptionEnd(newOffset2) || - isPop(code[newOffset1])) - { - break; - } - - // Make sure the new branch target was a branch target before, - // in order not to introduce new entries in the stack map table. - if (branchTargetFinder.isBranchTarget(newOffset2)) - { - successfulDelta = delta; - } - - if (branchTargetFinder.isBranchTarget(newOffset1)) - { - break; - } - } - } - - return successfulDelta; - } - - - /** - * Returns whether the given opcode represents a pop instruction that must - * get a consistent type (pop, pop2, arraylength). - */ - private boolean isPop(byte opcode) - { - return opcode == InstructionConstants.OP_POP || - opcode == InstructionConstants.OP_POP2 || - opcode == InstructionConstants.OP_ARRAYLENGTH; - } - - - /** - * Returns the whether there is a boundary of an exception block between - * the given offsets (including both). - */ - private boolean exceptionBoundary(CodeAttribute codeAttribute, int offset1, int offset2) - { - // Swap the offsets if the second one is smaller than the first one. - if (offset2 < offset1) - { - int offset = offset1; - offset1 = offset2; - offset2 = offset; - } - - // Check if there is a boundary of an exception block. - for (int offset = offset1; offset <= offset2; offset++) - { - if (branchTargetFinder.isExceptionStart(offset) || - branchTargetFinder.isExceptionEnd(offset)) - { - return true; - } - } - - return false; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoGotoReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoGotoReplacer.java deleted file mode 100644 index c9d8e0d8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoGotoReplacer.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor simplifies unconditional branches to other - * unconditional branches. - * - * @author Eric Lafortune - */ -public class GotoGotoReplacer -extends SimplifiedVisitor -implements InstructionVisitor -{ - private final CodeAttributeEditor codeAttributeEditor; - private final InstructionVisitor extraInstructionVisitor; - - - /** - * Creates a new GotoGotoReplacer. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - */ - public GotoGotoReplacer(CodeAttributeEditor codeAttributeEditor) - { - this(codeAttributeEditor, null); - } - - - /** - * Creates a new GotoGotoReplacer. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all replaced - * goto instructions. - */ - public GotoGotoReplacer(CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - this.codeAttributeEditor = codeAttributeEditor; - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - // Check if the instruction is an unconditional goto instruction. - byte opcode = branchInstruction.opcode; - if (opcode == InstructionConstants.OP_GOTO || - opcode == InstructionConstants.OP_GOTO_W) - { - // Check if the goto instruction points to another simple goto - // instruction. - int branchOffset = branchInstruction.branchOffset; - int targetOffset = offset + branchOffset; - - if (branchOffset != 0 && - branchOffset != branchInstruction.length(offset) && - !codeAttributeEditor.isModified(offset) && - !codeAttributeEditor.isModified(targetOffset)) - { - Instruction targetInstruction = - InstructionFactory.create(codeAttribute.code, targetOffset); - - if (targetInstruction.opcode == InstructionConstants.OP_GOTO) - { - // Simplify the goto instruction. - int targetBranchOffset = ((BranchInstruction)targetInstruction).branchOffset; - - Instruction newBranchInstruction = - new BranchInstruction(opcode, - (branchOffset + targetBranchOffset)); - codeAttributeEditor.replaceInstruction(offset, - newBranchInstruction); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - extraInstructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoReturnReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoReturnReplacer.java deleted file mode 100644 index 2f2efd2f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/GotoReturnReplacer.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor replaces unconditional branches to return instructions - * by these same return instructions. - * - * @author Eric Lafortune - */ -public class GotoReturnReplacer -extends SimplifiedVisitor -implements InstructionVisitor -{ - private final CodeAttributeEditor codeAttributeEditor; - private final InstructionVisitor extraInstructionVisitor; - - - /** - * Creates a new GotoReturnReplacer. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - */ - public GotoReturnReplacer(CodeAttributeEditor codeAttributeEditor) - { - this(codeAttributeEditor, null); - } - - - /** - * Creates a new GotoReturnReplacer. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all replaced - * goto instructions. - */ - public GotoReturnReplacer(CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - this.codeAttributeEditor = codeAttributeEditor; - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - // Check if the instruction is an unconditional goto instruction. - byte opcode = branchInstruction.opcode; - if (opcode == InstructionConstants.OP_GOTO || - opcode == InstructionConstants.OP_GOTO_W) - { - // Check if the goto instruction points to a return instruction. - int targetOffset = offset + branchInstruction.branchOffset; - - if (!codeAttributeEditor.isModified(offset) && - !codeAttributeEditor.isModified(targetOffset)) - { - Instruction targetInstruction = InstructionFactory.create(codeAttribute.code, - targetOffset); - switch (targetInstruction.opcode) - { - case InstructionConstants.OP_IRETURN: - case InstructionConstants.OP_LRETURN: - case InstructionConstants.OP_FRETURN: - case InstructionConstants.OP_DRETURN: - case InstructionConstants.OP_ARETURN: - case InstructionConstants.OP_RETURN: - // Replace the goto instruction by the return instruction. - Instruction returnInstruction = - new SimpleInstruction(targetInstruction.opcode); - codeAttributeEditor.replaceInstruction(offset, - returnInstruction); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - extraInstructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction); - } - - break; - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/HorizontalClassMerger.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/HorizontalClassMerger.java deleted file mode 100644 index 3809946f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/HorizontalClassMerger.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.ProgramClass; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor inlines siblings in the program classes that it visits, - * whenever possible. - * - * @see ClassMerger - * @author Eric Lafortune - */ -public class HorizontalClassMerger -extends SimplifiedVisitor -implements ClassVisitor -{ - private final boolean allowAccessModification; - private final boolean mergeInterfacesAggressively; - private final ClassVisitor extraClassVisitor; - - - /** - * Creates a new HorizontalClassMerger. - * - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - * @param mergeInterfacesAggressively specifies whether interfaces may - * be merged aggressively. - */ - public HorizontalClassMerger(boolean allowAccessModification, - boolean mergeInterfacesAggressively) - { - this(allowAccessModification, mergeInterfacesAggressively, null); - } - - - /** - * Creates a new VerticalClassMerger. - * - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - * @param mergeInterfacesAggressively specifies whether interfaces may - * be merged aggressively. - * @param extraClassVisitor an optional extra visitor for all - * merged classes. - */ - public HorizontalClassMerger(boolean allowAccessModification, - boolean mergeInterfacesAggressively, - ClassVisitor extraClassVisitor ) - { - this.allowAccessModification = allowAccessModification; - this.mergeInterfacesAggressively = mergeInterfacesAggressively; - this.extraClassVisitor = extraClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - programClass.superClassConstantAccept(new ReferencedClassVisitor( - new SubclassTraveler( - new ClassMerger(programClass, - allowAccessModification, - mergeInterfacesAggressively, - false, - extraClassVisitor)))); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequenceConstants.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequenceConstants.java deleted file mode 100644 index 574daf75..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequenceConstants.java +++ /dev/null @@ -1,4772 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.visitor.ClassPrinter; - -/** - * This class contains a set of instruction sequences with their suggested - * more compact or more efficient replacements. - * - * @see InstructionSequencesReplacer - * @see InstructionSequenceReplacer - * @author Eric Lafortune - */ -public class InstructionSequenceConstants -{ - // The arrays with constants and instructions used to be static, - // but now they are initialized with references to classes and - // class members, inside an instance of this class. As an added - // benefit, they can be garbage collected after they have been used. - public final Instruction[][][] VARIABLE_SEQUENCES; - public final Instruction[][][] ARITHMETIC_SEQUENCES; - public final Instruction[][][] FIELD_SEQUENCES; - public final Instruction[][][] CAST_SEQUENCES; - public final Instruction[][][] BRANCH_SEQUENCES; - public final Instruction[][][] STRING_SEQUENCES; - public final Instruction[][][] OBJECT_SEQUENCES; - public final Instruction[][][] MATH_SEQUENCES; - public final Instruction[][][] MATH_ANDROID_SEQUENCES; - - public final Constant[] CONSTANTS; - - // Internal short-hand constants. - private static final String BOOLEAN = ClassConstants.NAME_JAVA_LANG_BOOLEAN; - private static final String BYTE = ClassConstants.NAME_JAVA_LANG_BYTE; - private static final String CHARACTER = ClassConstants.NAME_JAVA_LANG_CHARACTER; - private static final String SHORT = ClassConstants.NAME_JAVA_LANG_SHORT; - private static final String INTEGER = ClassConstants.NAME_JAVA_LANG_INTEGER; - private static final String LONG = ClassConstants.NAME_JAVA_LANG_LONG; - private static final String FLOAT = ClassConstants.NAME_JAVA_LANG_FLOAT; - private static final String DOUBLE = ClassConstants.NAME_JAVA_LANG_DOUBLE; - private static final String STRING = ClassConstants.NAME_JAVA_LANG_STRING; - private static final String STRING_BUFFER = ClassConstants.NAME_JAVA_LANG_STRING_BUFFER; - private static final String STRING_BUILDER = ClassConstants.NAME_JAVA_LANG_STRING_BUILDER; - private static final String MATH = ClassConstants.NAME_JAVA_LANG_MATH; - private static final String FLOAT_MATH = ClassConstants.NAME_ANDROID_UTIL_FLOAT_MATH; - - private static final int X = InstructionSequenceReplacer.X; - private static final int Y = InstructionSequenceReplacer.Y; - private static final int Z = InstructionSequenceReplacer.Z; - - private static final int A = InstructionSequenceReplacer.A; - private static final int B = InstructionSequenceReplacer.B; - private static final int C = InstructionSequenceReplacer.C; - private static final int D = InstructionSequenceReplacer.D; - - // Replacement constants that are derived from matched variables. - private static final int STRING_A_LENGTH = InstructionSequenceReplacer.STRING_A_LENGTH; - private static final int BOOLEAN_A_STRING = InstructionSequenceReplacer.BOOLEAN_A_STRING; - private static final int CHAR_A_STRING = InstructionSequenceReplacer.CHAR_A_STRING; - private static final int INT_A_STRING = InstructionSequenceReplacer.INT_A_STRING; - private static final int LONG_A_STRING = InstructionSequenceReplacer.LONG_A_STRING; - private static final int FLOAT_A_STRING = InstructionSequenceReplacer.FLOAT_A_STRING; - private static final int DOUBLE_A_STRING = InstructionSequenceReplacer.DOUBLE_A_STRING; - private static final int STRING_A_STRING = InstructionSequenceReplacer.STRING_A_STRING; - private static final int BOOLEAN_B_STRING = InstructionSequenceReplacer.BOOLEAN_B_STRING; - private static final int CHAR_B_STRING = InstructionSequenceReplacer.CHAR_B_STRING; - private static final int INT_B_STRING = InstructionSequenceReplacer.INT_B_STRING; - private static final int LONG_B_STRING = InstructionSequenceReplacer.LONG_B_STRING; - private static final int FLOAT_B_STRING = InstructionSequenceReplacer.FLOAT_B_STRING; - private static final int DOUBLE_B_STRING = InstructionSequenceReplacer.DOUBLE_B_STRING; - private static final int STRING_B_STRING = InstructionSequenceReplacer.STRING_B_STRING; - - - /** - * Creates a new instance of InstructionSequenceConstants, with constants - * that reference classes from the given class pools. - */ - public InstructionSequenceConstants(ClassPool programClassPool, - ClassPool libraryClassPool) - { - InstructionSequenceBuilder ____ = - new InstructionSequenceBuilder(programClassPool, - libraryClassPool); - - // Create fieldref constants with wildcards, for fields in class X, - // with name Y, and the given primitive types. - ConstantPoolEditor constantPoolEditor = ____.getConstantPoolEditor(); - final int FIELD_Z = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("Z"))), null, null)); - final int FIELD_B = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("B"))), null, null)); - final int FIELD_C = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("C"))), null, null)); - final int FIELD_S = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("S"))), null, null)); - final int FIELD_I = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("I"))), null, null)); - final int FIELD_F = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("F"))), null, null)); - final int FIELD_J = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("J"))), null, null)); - final int FIELD_D = constantPoolEditor.addConstant(new FieldrefConstant(X, constantPoolEditor.addConstant(new NameAndTypeConstant(Y, constantPoolEditor.addUtf8Constant("D"))), null, null)); - - // Create methodref constants with wildcards, for methods in class X, - // with the given names and descriptors. - final int EQUALS = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant(ClassConstants.METHOD_NAME_EQUALS, ClassConstants.METHOD_TYPE_EQUALS), null, null)); - final int TO_STRING = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant(ClassConstants.METHOD_NAME_TOSTRING, ClassConstants.METHOD_TYPE_TOSTRING), null, null)); - final int BOOLEAN_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("booleanValue", "()Z"), null, null)); - final int BYTE_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("byteValue", "()B"), null, null)); - final int CHAR_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("charValue", "()C"), null, null)); - final int SHORT_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("shortValue", "()S"), null, null)); - final int INT_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("intValue", "()I"), null, null)); - final int FLOAT_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("floatValue", "()F"), null, null)); - final int LONG_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("longValue", "()J"), null, null)); - final int DOUBLE_VALUE = constantPoolEditor.addConstant(new MethodrefConstant(X, constantPoolEditor.addNameAndTypeConstant("doubleValue", "()D"), null, null)); - - final InstructionSequenceReplacer.Label TRY_START = InstructionSequenceReplacer.label(); - final InstructionSequenceReplacer.Label TRY_END = InstructionSequenceReplacer.label(); - final InstructionSequenceReplacer.Label CATCH_END = InstructionSequenceReplacer.label(); - - final InstructionSequenceReplacer.Label CATCH_EXCEPTION = InstructionSequenceReplacer.catch_(TRY_START.offset(), TRY_END.offset(), constantPoolEditor.addClassConstant(ClassConstants.NAME_JAVA_LANG_EXCEPTION, null)); - - VARIABLE_SEQUENCES = new Instruction[][][] - { - { // nop = nothing - ____.nop().__(), - }, - { // iload/pop = nothing - ____.iload(X) - .pop().__(), - }, - { // lload/pop2 = nothing - ____.lload(X) - .pop2().__(), - }, - { // fload/pop = nothing - ____.fload(X) - .pop().__(), - }, - { // dload/pop2 = nothing - ____.dload(X) - .pop2().__(), - }, - { // aload/pop = nothing - ____.aload(X) - .pop().__(), - }, - { // i = i = nothing - ____.iload(X) - .istore(X).__(), - }, - { // l = l = nothing - ____.lload(X) - .lstore(X).__(), - }, - { // f = f = nothing - ____.fload(X) - .fstore(X).__(), - }, - { // d = d = nothing - ____.dload(X) - .dstore(X).__(), - }, - { // a = a = nothing - ____.aload(X) - .astore(X).__(), - }, - { // iload/iload = iload/dup - ____.iload(X) - .iload(X).__(), - - ____.iload(X) - .dup().__() - }, - { // lload/lload = lload/dup2 - ____.lload(X) - .lload(X).__(), - - ____.lload(X) - .dup2().__() - }, - { // fload/fload = fload/dup - ____.fload(X) - .fload(X).__(), - - ____.fload(X) - .dup().__() - }, - { // dload/dload = dload/dup2 - ____.dload(X) - .dload(X).__(), - - ____.dload(X) - .dup2().__() - }, - { // aload/aload = aload/dup - ____.aload(X) - .aload(X).__(), - - ____.aload(X) - .dup().__() - }, - { // istore/istore = pop/istore - ____.istore(X) - .istore(X).__(), - - ____.pop() - .istore(X).__() - }, - { // lstore/lstore = pop2/lstore - ____.lstore(X) - .lstore(X).__(), - - ____.pop2() - .lstore(X).__() - }, - { // fstore/fstore = pop/fstore - ____.fstore(X) - .fstore(X).__(), - - ____.pop() - .fstore(X).__() - }, - { // dstore/dstore = pop2/dstore - ____.dstore(X) - .dstore(X).__(), - - ____.pop2() - .dstore(X).__() - }, - { // astore/astore = pop/astore - ____.astore(X) - .astore(X).__(), - - ____.pop() - .astore(X).__() - }, - { // istore/iload = dup/istore - ____.istore(X) - .iload(X).__(), - - ____.dup() - .istore(X).__() - }, - { // lstore/lload = dup2/lstore - ____.lstore(X) - .lload(X).__(), - - ____.dup2() - .lstore(X).__() - }, - { // fstore/fload = dup/fstore - ____.fstore(X) - .fload(X).__(), - - ____.dup() - .fstore(X).__() - }, - { // dstore/dload = dup2/dstore - ____.dstore(X) - .dload(X).__(), - - ____.dup2() - .dstore(X).__() - }, - { // astore/aload = dup/astore - ____.astore(X) - .aload(X).__(), - - ____.dup() - .astore(X).__() - }, - { // iload/dup/istore = iload - ____.iload(X) - .dup() - .istore(X).__(), - - ____.iload(X).__() - }, - { // lload/dup2/lstore = lload - ____.lload(X) - .dup2() - .lstore(X).__(), - - ____.lload(X).__() - }, - { // fload/dup/fstore = iload - ____.fload(X) - .dup() - .fstore(X).__(), - - ____.fload(X).__() - }, - { // dload/dup2/dstore = dload - ____.dload(X) - .dup2() - .dstore(X).__(), - - ____.dload(X).__() - }, - { // aload/dup/astore = aload - ____.aload(X) - .dup() - .astore(X).__(), - - ____.aload(X).__() - }, - }; - - ARITHMETIC_SEQUENCES = new Instruction[][][] - { - { // c + i = i + c - ____.iconst(A) - .iload(X) - .iadd().__(), - - ____.iload(X) - .iconst(A) - .iadd().__() - }, - { // b + i = i + b - ____.bipush(A) - .iload(X) - .iadd().__(), - - ____.iload(X) - .bipush(A) - .iadd().__() - }, - { // s + i = i + s - ____.sipush(A) - .iload(X) - .iadd().__(), - - ____.iload(X) - .sipush(A) - .iadd().__() - }, - { // c + i = i + c - ____.ldc_(A) - .iload(X) - .iadd().__(), - - ____.iload(X) - .ldc_(A) - .iadd().__() - }, - { // c * i = i * c - ____.sipush(A) - .iload(X) - .imul().__(), - - ____.iload(X) - .sipush(A) - .imul().__() - }, - { // b * i = i * b - ____.bipush(A) - .iload(X) - .imul().__(), - - ____.iload(X) - .bipush(A) - .imul().__() - }, - { // s * i = i * s - ____.sipush(A) - .iload(X) - .imul().__(), - - ____.iload(X) - .sipush(A) - .imul().__() - }, - { // c * i = i * c - ____.ldc_(A) - .iload(X) - .imul().__(), - - ____.iload(X) - .ldc_(A) - .imul().__() - }, - { // c + l = l + c - ____.lconst(A) - .lload(X) - .ladd().__(), - - ____.lload(X) - .lconst(A) - .ladd().__() - }, - { // c + l = l + c - ____.ldc2_w(A) - .lload(X) - .ladd().__(), - - ____.lload(X) - .ldc2_w(A) - .ladd().__() - }, - { // c * l = l * c - ____.lconst(A) - .lload(X) - .lmul().__(), - - ____.lload(X) - .lconst(A) - .lmul().__() - }, - { // c + f = f + c - ____.fconst(A) - .fload(X) - .fadd().__(), - - ____.fload(X) - .fconst(A) - .fadd().__() - }, - { // c + f = f + c - ____.ldc_(A) - .fload(X) - .fadd().__(), - - ____.fload(X) - .ldc_(A) - .fadd().__() - }, - { // c * f = f * c - ____.fconst(A) - .fload(X) - .fmul().__(), - - ____.fload(X) - .fconst(A) - .fmul().__() - }, - { // c * f = f * c - ____.ldc_(A) - .fload(X) - .lmul().__(), - - ____.fload(X) - .ldc_(A) - .lmul().__() - }, - { // c + d = d + c - ____.dconst(A) - .dload(X) - .dadd().__(), - - ____.dload(X) - .dconst(A) - .dadd().__() - }, - { // c + d = d + c - ____.ldc2_w(A) - .dload(X) - .dadd().__(), - - ____.dload(X) - .ldc2_w(A) - .dadd().__() - }, - { // c * d = d * c - ____.dconst(A) - .dload(X) - .dmul().__(), - - ____.dload(X) - .dconst(A) - .dmul().__() - }, - { // c * d = d * c - ____.ldc2_w(A) - .dload(X) - .dmul().__(), - - ____.dload(X) - .ldc2_w(A) - .dmul().__() - }, - { // i = i + c = i += c - ____.iload(X) - .sipush(A) - .iadd() - .istore(X).__(), - - ____.iinc(X, A).__() - }, - { // i = i + b = i += b - ____.iload(X) - .bipush(A) - .iadd() - .istore(X).__(), - - ____.iinc(X, A).__() - }, - { // i = i + s = i += s - ____.iload(X) - .sipush(A) - .iadd() - .istore(X).__(), - - ____.iinc(X, A).__() - }, - { // i = i - -1 = i++ - ____.iload(X) - .iconst_m1() - .isub() - .istore(X).__(), - - ____.iinc(X, 1).__() - }, - { // i = i - 1 = i-- - ____.iload(X) - .iconst_1() - .isub() - .istore(X).__(), - - ____.iinc(X, -1).__() - }, - { // i = i - 2 = i -= 2 - ____.iload(X) - .iconst_2() - .isub() - .istore(X).__(), - - ____.iinc(X, -2).__() - }, - { // i = i - 3 = i -= 3 - ____.iload(X) - .iconst_3() - .isub() - .istore(X).__(), - - ____.iinc(X, -3).__() - }, - { // i = i - 4 = i -= 4 - ____.iload(X) - .iconst_4() - .isub() - .istore(X).__(), - - ____.iinc(X, -4).__() - }, - { // i = i - 5 = i -= 5 - ____.iload(X) - .iconst_5() - .isub() - .istore(X).__(), - - ____.iinc(X, -5).__() - }, - { // ... + 0 = ... - ____.iconst_0() - .iadd().__(), - }, - { // ... + 0L = ... - ____.lconst_0() - .ladd().__(), - }, - // Not valid for -0.0. -// { // ... + 0f = ... -// ____.fconst_0() -// .fadd().__(), -// -// }, -// { // ... + 0d = ... -// ____.dconst_0() -// .dadd().__(), -// -// }, - { // ... - 0 = ... - ____.iconst_0() - .isub().__(), - }, - { // ... - 0L = ... - ____.lconst_0() - .lsub().__(), - }, - { // ... - 0f = ... - ____.fconst_0() - .fsub().__(), - }, - { // ... - 0d = ... - ____.dconst_0() - .dsub().__(), - }, - { // ... * -1 = -... - ____.iconst_m1() - .imul().__(), - - ____.ineg().__() - }, - { // ... * 0 = 0 - ____.iconst_0() - .imul().__(), - - ____.pop() - .iconst_0().__() - }, - { // ... * 1 = ... - ____.iconst_1() - .imul().__(), - }, - { // ... * 2 = ... << 1 - ____.iconst_2() - .imul().__(), - - ____.iconst_1() - .ishl().__() - }, - { // ... * 4 = ... << 2 - ____.iconst_4() - .imul().__(), - - ____.iconst_2() - .ishl().__() - }, - { // ... * 8 = ... << 3 - ____.bipush(8) - .imul().__(), - - ____.iconst_3() - .ishl().__() - }, - { // ... * 16 = ... << 4 - ____.bipush(16) - .imul().__(), - - ____.bipush(4) - .ishl().__() - }, - { // ... * 32 = ... << 5 - ____.bipush(32) - .imul().__(), - - ____.bipush(5) - .ishl().__() - }, - { // ... * 64 = ... << 6 - ____.bipush(64) - .imul().__(), - - ____.bipush(6) - .ishl().__() - }, - { // ... * 128 = ... << 7 - ____.sipush(128) - .imul().__(), - - ____.bipush(7) - .ishl().__() - }, - { // ... * 256 = ... << 8 - ____.sipush(256) - .imul().__(), - - ____.bipush(8) - .ishl().__() - }, - { // ... * 512 = ... << 9 - ____.sipush(512) - .imul().__(), - - ____.bipush(9) - .ishl().__() - }, - { // ... * 1024 = ... << 10 - ____.sipush(1024) - .imul().__(), - - ____.bipush(10) - .ishl().__() - }, - { // ... * 2048 = ... << 11 - ____.sipush(2048) - .imul().__(), - - ____.bipush(11) - .ishl().__() - }, - { // ... * 4096 = ... << 12 - ____.sipush(4096) - .imul().__(), - - ____.bipush(12) - .ishl().__() - }, - { // ... * 8192 = ... << 13 - ____.sipush(8192) - .imul().__(), - - ____.bipush(13) - .ishl().__() - }, - { // ... * 16384 = ... << 14 - ____.sipush(16384) - .imul().__(), - - ____.bipush(14) - .ishl().__() - }, - { // ... * 32768 = ... << 15 - ____.ldc(32768) - .imul().__(), - - ____.bipush(15) - .ishl().__() - }, - { // ... * 65536 = ... << 16 - ____.ldc(65536) - .imul().__(), - - ____.bipush(16) - .ishl().__() - }, - { // ... * 16777216 = ... << 24 - ____.ldc(16777216) - .imul().__(), - - ____.bipush(24) - .ishl().__() - }, - { // ... * -1L = -... - ____.ldc2_w(-1L) - .lmul().__(), - - ____.lneg().__() - }, - { // ... * 0L = 0L - ____.lconst_0() - .lmul().__(), - - ____.pop2() - .lconst_0().__() - }, - { // ... * 1L = ... - ____.lconst_1() - .lmul().__(), - }, - { // ... * 2L = ... << 1 - ____.ldc2_w(2L) - .lmul().__(), - - ____.iconst_1() - .lshl().__() - }, - { // ... * 4L = ... << 2 - ____.ldc2_w(4L) - .lmul().__(), - - ____.iconst_2() - .lshl().__() - }, - { // ... * 8L = ... << 3 - ____.ldc2_w(8L) - .lmul().__(), - - ____.iconst_3() - .lshl().__() - }, - { // ... * 16L = ... << 4 - ____.ldc2_w(16L) - .lmul().__(), - - ____.bipush(4) - .lshl().__() - }, - { // ... * 32L = ... << 5 - ____.ldc2_w(32L) - .lmul().__(), - - ____.bipush(5) - .lshl().__() - }, - { // ... * 64L = ... << 6 - ____.ldc2_w(64L) - .lmul().__(), - - ____.bipush(6) - .lshl().__() - }, - { // ... * 128L = ... << 7 - ____.ldc2_w(128L) - .lmul().__(), - - ____.bipush(7) - .lshl().__() - }, - { // ... * 256L = ... << 8 - ____.ldc2_w(256L) - .lmul().__(), - - ____.bipush(8) - .lshl().__() - }, - { // ... * 512L = ... << 9 - ____.ldc2_w(512L) - .lmul().__(), - - ____.bipush(9) - .lshl().__() - }, - { // ... * 1024L = ... << 10 - ____.ldc2_w(1024L) - .lmul().__(), - - ____.bipush(10) - .lshl().__() - }, - { // ... * 2048L = ... << 11 - ____.ldc2_w(2048L) - .lmul().__(), - - ____.bipush(11) - .lshl().__() - }, - { // ... * 4096L = ... << 12 - ____.ldc2_w(4096L) - .lmul().__(), - - ____.bipush(12) - .lshl().__() - }, - { // ... * 8192L = ... << 13 - ____.ldc2_w(8192L) - .lmul().__(), - - ____.bipush(13) - .lshl().__() - }, - { // ... * 16384L = ... << 14 - ____.ldc2_w(16384L) - .lmul().__(), - - ____.bipush(14) - .lshl().__() - }, - { // ... * 32768L = ... << 15 - ____.ldc2_w(32768L) - .lmul().__(), - - ____.bipush(15) - .lshl().__() - }, - { // ... * 65536LL = ... << 16 - ____.ldc2_w(65536L) - .lmul().__(), - - ____.bipush(16) - .lshl().__() - }, - { // ... * 16777216L = ... << 24 - ____.ldc2_w(16777216L) - .lmul().__(), - - ____.bipush(24) - .lshl().__() - }, - { // ... * 4294967296L = ... << 32 - ____.ldc2_w(4294967296L) - .lmul().__(), - - ____.bipush(32) - .lshl().__() - }, - { // ... * -1f = -... - ____.ldc(-1f) - .fmul().__(), - - ____.fneg().__() - }, - // Not valid for -0.0 and for NaN. -// { // ... * 0f = 0f -// ____.fconst_0() -// .fmul().__(), -// -// ____.pop() -// .fconst_0().__() -// }, - { // ... * 1f = ... - ____.fconst_1() - .fmul().__(), - }, - { // ... * -1d = -... - ____.ldc2_w(-1.) - .dmul().__(), - - ____.dneg().__() - }, - // Not valid for -0.0 and for NaN. -// { // ... * 0d = 0d -// ____.dconst_0() -// .dmul().__(), -// -// ____.pop2() -// .dconst_0().__() -// }, - { // ... * 1d = ... - ____.dconst_1() - .dmul().__(), - }, - { // ... / -1 = -... - ____.iconst_m1() - .idiv().__(), - - ____.ineg().__() - }, - { // ... / 1 = ... - ____.iconst_1() - .idiv().__(), - }, - // Not valid for negative values. -// { // ... / 2 = ... >> 1 -// ____.iconst_2() -// .idiv().__(), -// -// ____.iconst_1() -// .ishr().__() -// }, -// { // ... / 4 = ... >> 2 -// ____.iconst_4() -// .idiv().__(), -// -// ____.iconst_2() -// .ishr().__() -// }, -// { // ... / 8 = ... >> 3 -// ____.bipush(8) -// .idiv().__(), -// -// ____.iconst_3() -// .ishr().__() -// }, -// { // ... / 16 = ... >> 4 -// ____.bipush(16) -// .idiv().__(), -// -// ____.bipush(4) -// .ishr().__() -// }, -// { // ... / 32 = ... >> 5 -// ____.bipush(32) -// .idiv().__(), -// -// ____.bipush(5) -// .ishr().__() -// }, -// { // ... / 64 = ... >> 6 -// ____.bipush(64) -// .idiv().__(), -// -// ____.bipush(6) -// .ishr().__() -// }, -// { // ... / 128 = ... >> 7 -// ____.sipush(128) -// .idiv().__(), -// -// ____.bipush(7) -// .ishr().__() -// }, -// { // ... / 256 = ... >> 8 -// ____.sipush(256) -// .idiv().__(), -// -// ____.bipush(8) -// .ishr().__() -// }, -// { // ... / 512 = ... >> 9 -// ____.sipush(512) -// .idiv().__(), -// -// ____.bipush(9) -// .ishr().__() -// }, -// { // ... / 1024 = ... >> 10 -// ____.sipush(1024) -// .idiv().__(), -// -// ____.bipush(10) -// .ishr().__() -// }, -// { // ... / 2048 = ... >> 11 -// ____.sipush(2048) -// .idiv().__(), -// -// ____.bipush(11) -// .ishr().__() -// }, -// { // ... / 4096 = ... >> 12 -// ____.sipush(4096) -// .idiv().__(), -// -// ____.bipush(12) -// .ishr().__() -// }, -// { // ... / 8192 = ... >> 13 -// ____.sipush(8192) -// .idiv().__(), -// -// ____.bipush(13) -// .ishr().__() -// }, -// { // ... / 16384 = ... >> 14 -// ____.sipush(16384) -// .idiv().__(), -// -// ____.bipush(14) -// .ishr().__() -// }, -// { // ... / 32768 = ... >> 15 -// ____.ldc(32768) -// .idiv().__(), -// -// ____.bipush(15) -// .ishr().__() -// }, -// { // ... / 65536 = ... >> 16 -// ____.ldc(65536) -// .idiv().__(), -// -// ____.bipush(16) -// .ishr().__() -// }, -// { // ... / 16777216 = ... >> 24 -// ____.ldc(16777216) -// .idiv().__(), -// -// ____.bipush(24) -// .ishr().__() -// }, - { // ... / -1L = -... - ____.ldc2_w(-1L) - .ldiv().__(), - - ____.lneg().__() - }, - { // ... / 1L = ... - ____.lconst_1() - .ldiv().__(), - }, - // Not valid for negative values. -// { // ... / 2L = ... >> 1 -// ____.ldc2_w(2L) -// .ldiv().__(), -// -// ____.iconst_1() -// .lshr().__() -// }, -// { // ... / 4L = ... >> 2 -// ____.ldc2_w(4L) -// .ldiv().__(), -// -// ____.iconst_2() -// .lshr().__() -// }, -// { // ... / 8L = ... >> 3 -// ____.ldc2_w(8L) -// .ldiv().__(), -// -// ____.iconst_3() -// .lshr().__() -// }, -// { // ... / 16L = ... >> 4 -// ____.ldc2_w(16L) -// .ldiv().__(), -// -// ____.bipush(4) -// .lshr().__() -// }, -// { // ... / 32L = ... >> 5 -// ____.ldc2_w(32L) -// .ldiv().__(), -// -// ____.bipush(5) -// .lshr().__() -// }, -// { // ... / 64L = ... >> 6 -// ____.ldc2_w(64L) -// .ldiv().__(), -// -// ____.bipush(6) -// .lshr().__() -// }, -// { // ... / 128L = ... >> 7 -// ____.ldc2_w(128L) -// .ldiv().__(), -// -// ____.bipush(7) -// .lshr().__() -// }, -// { // ... / 256L = ... >> 8 -// ____.ldc2_w(256L) -// .ldiv().__(), -// -// ____.bipush(8) -// .lshr().__() -// }, -// { // ... / 512L = ... >> 9 -// ____.ldc2_w(512L) -// .ldiv().__(), -// -// ____.bipush(9) -// .lshr().__() -// }, -// { // ... / 1024L = ... >> 10 -// ____.ldc2_w(1024L) -// .ldiv().__(), -// -// ____.bipush(10) -// .lshr().__() -// }, -// { // ... / 2048L = ... >> 11 -// ____.ldc2_w(2048L) -// .ldiv().__(), -// -// ____.bipush(11) -// .lshr().__() -// }, -// { // ... / 4096L = ... >> 12 -// ____.ldc2_w(4096L) -// .ldiv().__(), -// -// ____.bipush(12) -// .lshr().__() -// }, -// { // ... / 8192L = ... >> 13 -// ____.ldc2_w(8192L) -// .ldiv().__(), -// -// ____.bipush(13) -// .lshr().__() -// }, -// { // ... / 16384L = ... >> 14 -// ____.ldc2_w(16384L) -// .ldiv().__(), -// -// ____.bipush(14) -// .lshr().__() -// }, -// { // ... / 32768L = ... >> 15 -// ____.ldc2_w(32768L) -// .ldiv().__(), -// -// ____.bipush(15) -// .lshr().__() -// }, -// { // ... / 65536LL = ... >> 16 -// ____.ldc2_w(65536L) -// .ldiv().__(), -// -// ____.bipush(16) -// .lshr().__() -// }, -// { // ... / 16777216L = ... >> 24 -// ____.ldc2_w(16777216L) -// .ldiv().__(), -// -// ____.bipush(24) -// .lshr().__() -// }, -// { // ... / 4294967296L = ... >> 32 -// ____.ldc2_w(4294967296L) -// .ldiv().__(), -// -// ____.bipush(32) -// .lshr().__() -// }, - { // ... / -1f = -... - ____.ldc(-1f) - .fdiv().__(), - - ____.fneg().__() - }, - { // ... / 1f = ... - ____.fconst_1() - .fdiv().__(), - }, - { // ... / -1d = -... - ____.ldc2_w(-1.) - .ddiv().__(), - - ____.dneg().__() - }, - { // ... / 1d = ... - ____.dconst_1() - .ddiv().__(), - }, - { // ... % 1 = 0 - ____.iconst_1() - .irem().__(), - - ____.pop() - .iconst_0().__() - }, - // Not valid for negative values. -// { // ... % 2 = ... & 0x1 -// ____.iconst_2() -// .irem().__(), -// -// ____.iconst_1() -// .iand().__() -// }, -// { // ... % 4 = ... & 0x3 -// ____.iconst_4() -// .irem().__(), -// -// ____.iconst_3() -// .iand().__() -// }, -// { // ... % 8 = ... & 0x07 -// ____.bipush(8) -// .irem().__(), -// -// ____.bipush(0x07) -// .iand().__() -// }, -// { // ... % 16 = ... & 0x0f -// ____.bipush(16) -// .irem().__(), -// -// ____.bipush(0x0f) -// .iand().__() -// }, -// { // ... % 32 = ... & 0x1f -// ____.bipush(32) -// .irem().__(), -// -// ____.bipush(0x1f) -// .iand().__() -// }, -// { // ... % 64 = ... & 0x3f -// ____.bipush(64) -// .irem().__(), -// -// ____.bipush(0x3f) -// .iand().__() -// }, -// { // ... % 128 = ... & 0x7f -// ____.sipush(128) -// .irem().__(), -// -// ____.bipush(0x7f) -// .iand().__() -// }, -// { // ... % 256 = ... & 0x00ff -// ____.sipush(256) -// .irem().__(), -// -// ____.sipush(0x00ff) -// .iand().__() -// }, -// { // ... % 512 = ... & 0x01ff -// ____.sipush(512) -// .irem().__(), -// -// ____.sipush(0x01ff) -// .iand().__() -// }, -// { // ... % 1024 = ... & 0x03ff -// ____.sipush(1024) -// .irem().__(), -// -// ____.sipush(0x03ff) -// .iand().__() -// }, -// { // ... % 2048 = ... & 0x07ff -// ____.sipush(2048) -// .irem().__(), -// -// ____.sipush(0x07ff) -// .iand().__() -// }, -// { // ... % 4096 = ... & 0x0fff -// ____.sipush(4096) -// .irem().__(), -// -// ____.sipush(0x0fff) -// .iand().__() -// }, -// { // ... % 8192 = ... & 0x1fff -// ____.sipush(8192) -// .irem().__(), -// -// ____.sipush(0x1fff) -// .iand().__() -// }, -// { // ... % 16384 = ... & 0x3fff -// ____.sipush(16384) -// .irem().__(), -// -// ____.sipush(0x3fff) -// .iand().__() -// }, - { // ... % 1L = 0L - ____.lconst_1() - .lrem().__(), - - ____.pop2() - .lconst_0().__() - }, -// { // ... % 1f = 0f -// ____.fconst_1() -// .frem().__(), -// -// ____.pop() -// .fconst_0().__() -// }, -// { // ... % 1d = 0d -// ____.dconst_1() -// .drem().__(), -// -// ____.pop2() -// .dconst_0().__() -// }, - { // -(-...) = ... - ____.ineg() - .ineg().__(), - }, - { // -(-...) = ... - ____.lneg() - .lneg().__(), - }, - { // -(-...) = ... - ____.fneg() - .fneg().__(), - }, - { // -(-...) = ... - ____.dneg() - .dneg().__(), - }, - { // +(-...) = -... - ____.ineg() - .iadd().__(), - - ____.isub().__() - }, - { // +(-...) = -... - ____.lneg() - .ladd().__(), - - ____.lsub().__() - }, - { // +(-...) = -... - ____.fneg() - .fadd().__(), - - ____.fsub().__() - }, - { // +(-...) = -... - ____.dneg() - .dadd().__(), - - ____.dsub().__() - }, - { // ... << 0 = ... - ____.iconst_0() - .ishl().__(), - }, - { // ... << 0 = ... - ____.iconst_0() - .lshl().__(), - }, - { // ... >> 0 = ... - ____.iconst_0() - .ishr().__(), - }, - { // ... >> 0 = ... - ____.iconst_0() - .lshr().__(), - }, - { // ... >>> 0 = ... - ____.iconst_0() - .iushr().__(), - }, - { // ... >>> 0 = ... - ____.iconst_0() - .lushr().__(), - }, - { // ... & -1 = ... - ____.iconst_m1() - .iand().__(), - }, - { // ... & 0 = 0 - ____.iconst_0() - .iand().__(), - - ____.pop() - .iconst_0().__() - }, - { // ... & -1L = ... - ____.ldc2_w(-1L) - .land().__(), - }, - { // ... & 0L = 0L - ____.lconst_0() - .land().__(), - - ____.pop2() - .lconst_0().__() - }, - { // ... | -1 = -1 - ____.iconst_m1() - .ior().__(), - - ____.pop() - .iconst_m1().__() - }, - { // ... | 0 = ... - ____.iconst_0() - .ior().__(), - }, - { // ... | -1L = -1L - ____.ldc2_w(-1L) - .land().__(), - - ____.pop2() - .ldc2_w(-1L).__() - }, - { // ... | 0L = ... - ____.lconst_0() - .lor().__(), - }, - { // ... ^ 0 = ... - ____.iconst_0() - .ixor().__(), - }, - { // ... ^ 0L = ... - ____.lconst_0() - .lxor().__(), - }, - { // (... & 0x0000ff00) >> 8 = (... >> 8) & 0xff - ____.ldc(0x0000ff00) - .iand() - .bipush(8) - .ishr().__(), - - ____.bipush(8) - .ishr() - .sipush(0xff) - .iand().__() - }, - { // (... & 0x0000ff00) >>> 8 = (... >>> 8) & 0xff - ____.ldc(0x0000ff00) - .iand() - .bipush(8) - .iushr().__(), - - ____.bipush(8) - .iushr() - .sipush(0xff) - .iand().__() - }, - { // (... & 0x00ff0000) >> 16 = (... >> 16) & 0xff - ____.ldc(0x00ff0000) - .iand() - .bipush(16) - .ishr().__(), - - ____.bipush(16) - .ishr() - .sipush(0xff) - .iand().__() - }, - { // (... & 0x00ff0000) >>> 16 = (... >>> 16) & 0xff - ____.ldc(0x00ff0000) - .iand() - .bipush(16) - .iushr().__(), - - ____.bipush(16) - .iushr() - .sipush(0xff) - .iand().__() - }, - { // (... & 0xff000000) >> 24 = ... >> 24 - ____.ldc(0xff000000) - .iand() - .bipush(24) - .ishr().__(), - - ____.bipush(24) - .ishr().__() - }, - { // (... & 0xffff0000) >> 16 = ... >> 16 - ____.ldc(0xffff0000) - .iand() - .bipush(16) - .ishr().__(), - - ____.bipush(16) - .ishr().__() - }, - { // (... & 0xffff0000) >>> 16 = ... >>> 16 - ____.ldc(0xffff0000) - .iand() - .bipush(16) - .iushr().__(), - - ____.bipush(16) - .iushr().__() - }, - { // (... >> 24) & 0xff = ... >>> 24 - ____.bipush(24) - .ishr() - .sipush(0xff) - .iand().__(), - - ____.bipush(24) - .iushr().__() - }, - { // (... >>> 24) & 0xff = ... >>> 24 - ____.bipush(24) - .iushr() - .sipush(0xff) - .iand().__(), - - ____.bipush(24) - .iushr().__() - }, - { // (byte)(... & 0x000000ff) = (byte)... - ____.sipush(0xff) - .iand() - .i2b().__(), - - ____.i2b().__() - }, - { // (char)(... & 0x0000ffff) = (char)... - ____.ldc(0x0000ffff) - .iand() - .i2c().__(), - - ____.i2c().__() - }, - { // (short)(... & 0x0000ffff) = (short)... - ____.ldc(0x0000ffff) - .iand() - .i2s().__(), - - ____.i2s().__() - }, - // The Dalvik VM on Android 4.4 throws a VFY error or crashes if - // the byte/short cast is removed before an array store. -// { // (byte)(... >> 24) = ... >> 24 -// ____.bipush(24) -// .ishr() -// .i2b().__(), -// -// ____.bipush(24) -// .ishr().__() -// }, -// { // (byte)(... >>> 24) = ... >> 24 -// ____.bipush(24) -// .iushr() -// .i2b().__(), -// -// ____.bipush(24) -// .ishr().__() -// }, -// { // (char)(... >> 16) = ... >>> 16 -// ____.bipush(16) -// .ishr() -// .i2c().__(), -// -// ____.bipush(16) -// .iushr().__() -// }, -// { // (char)(... >>> 16) = ... >>> 16 -// ____.bipush(16) -// .iushr() -// .i2c().__(), -// -// ____.bipush(16) -// .iushr().__() -// }, -// { // (short)(... >> 16) = ... >> 16 -// ____.bipush(16) -// .ishr() -// .i2s().__(), -// -// ____.bipush(16) -// .ishr().__() -// }, -// { // (short)(... >>> 16) = ... >> 16 -// ____.bipush(16) -// .iushr() -// .i2s().__(), -// -// ____.bipush(16) -// .ishr().__() -// }, - { // ... << 24 >> 24 = (byte)... - ____.bipush(24) - .ishl() - .bipush(24) - .ishr().__(), - - ____.i2b().__() - }, - { // ... << 16 >>> 16 = (char)... - ____.bipush(16) - .ishl() - .bipush(16) - .iushr().__(), - - ____.i2c().__() - }, - { // ... << 16 >> 16 = (short)... - ____.bipush(16) - .ishl() - .bipush(16) - .ishr().__(), - - ____.i2s().__() - }, - { // ... << 32 >> 32 = (long)(int)... - ____.bipush(32) - .lshl() - .bipush(32) - .lshr().__(), - - ____.l2i() - .i2l().__() - }, - { // (int)(... & 0x00000000ffffffffL) = (int)... - ____.ldc2_w(0x00000000ffffffffL) - .land() - .l2i().__(), - - ____.l2i().__() - }, - { // (... & 0xffffffff00000000L) >> 32 = ... >> 32 - ____.ldc2_w(0xffffffff00000000L) - .land() - .bipush(32) - .lshr().__(), - - ____.bipush(32) - .lshr().__() - }, - { // (... & 0xffffffff00000000L) >>> 32 = ... >>> 32 - ____.ldc2_w(0xffffffff00000000L) - .land() - .bipush(32) - .lushr().__(), - - ____.bipush(32) - .lushr().__() - }, - { // ... += 0 = nothing - ____.iinc(X, 0).__(), - }, - }; - - FIELD_SEQUENCES = new Instruction[][][] - { - { // getfield/putfield = nothing - ____.aload(X) - .aload(X) - .getfield(Y) - .putfield(Y).__(), - }, -// { // putfield_L/putfield_L = pop2_x1/putfield -// ____.aload(X) -// // ... -// .putfield(FIELD_J) -// .aload(X) -// // ... -// .putfield(FIELD_J).__(), -// -// ____.aload(X) -// // ... -// .pop2() -// // ... -// .putfield(FIELD_J).__() -// }, -// { // putfield_D/putfield_D = pop2_x1/putfield -// ____.aload(X) -// // ... -// .putfield(FIELD_D) -// .aload(X) -// // ... -// .putfield(FIELD_D).__(), -// -// ____.aload(X) -// // ... -// .pop2() -// // ... -// .putfield(FIELD_D).__() -// }, -// { // putfield/putfield = pop_x1/putfield -// ____.aload(X) -// // ... -// .putfield(Y) -// .aload(X) -// // ... -// .putfield(Y).__(), -// -// ____.aload(X) -// // ... -// .pop() -// // ... -// .putfield(Y).__() -// }, -// { // putfield_L/getfield_L = dup2_x1/putfield -// ____.aload(X) -// // ... -// .putfield(FIELD_J) -// .aload(X) -// .getfield(FIELD_J).__(), -// -// ____.aload(X) -// // ... -// .dup2_x1() -// .putfield(FIELD_J).__() -// }, -// { // putfield_D/getfield_D = dup2_x1/putfield -// ____.aload(X) -// // ... -// .putfield(FIELD_D) -// .aload(X) -// .getfield(FIELD_D).__(), -// -// ____.aload(X) -// // ... -// .dup2_x1() -// .putfield(FIELD_D).__() -// }, -// { // putfield/getfield = dup_x1/putfield -// ____.aload(X) -// // ... -// .putfield(Y) -// .aload(X) -// .getfield(Y).__(), -// -// ____.aload(X) -// // ... -// .dup_x1() -// .putfield(Y).__() -// }, - { // getstatic/putstatic = nothing - ____.getstatic(X) - .putstatic(X).__(), - }, - { // getstatic_L/getstatic_L = getstatic/dup2 - ____.getstatic(FIELD_J) - .getstatic(FIELD_J).__(), - - ____.getstatic(FIELD_J) - .dup2().__() - }, - { // getstatic_D/getstatic_D = getstatic/dup2 - ____.getstatic(FIELD_D) - .getstatic(FIELD_D).__(), - - ____.getstatic(FIELD_D) - .dup2().__() - }, - { // getstatic/getstatic = getstatic/dup - ____.getstatic(X) - .getstatic(X).__(), - - ____.getstatic(X) - .dup().__() - }, - { // putstatic_L/putstatic_L = pop2/putstatic - ____.putstatic(FIELD_J) - .putstatic(FIELD_J).__(), - - ____.pop2() - .putstatic(FIELD_J).__() - }, - { // putstatic_D/putstatic_D = pop2/putstatic - ____.putstatic(FIELD_D) - .putstatic(FIELD_D).__(), - - ____.pop2() - .putstatic(FIELD_D).__() - }, - { // putstatic/putstatic = pop/putstatic - ____.putstatic(X) - .putstatic(X).__(), - - ____.pop() - .putstatic(X).__() - }, - { // putstatic_L/getstatic_L = dup2/putstatic - ____.putstatic(FIELD_J) - .getstatic(FIELD_J).__(), - - ____.dup2() - .putstatic(FIELD_J).__() - }, - { // putstatic_D/getstatic_D = dup2/putstatic - ____.putstatic(FIELD_D) - .getstatic(FIELD_D).__(), - - ____.dup2() - .putstatic(FIELD_D).__() - }, - { // putstatic/getstatic = dup/putstatic - ____.putstatic(X) - .getstatic(X).__(), - - ____.dup() - .putstatic(X).__() - }, - { // L i L: getfield_L/iload/getfield_L = iload/getfield_L/dup2_x1 - ____.aload(A) - .getfield(FIELD_J) - .iload(B) - .aload(A) - .getfield(FIELD_J).__(), - - ____.iload(B) - .aload(A) - .getfield(FIELD_J) - .dup2_x1().__() - }, - { // D i D: getfield_D/iload/getfield_D = iload/getfield_D/dup2_x1 - ____.aload(A) - .getfield(FIELD_D) - .iload(B) - .aload(A) - .getfield(FIELD_D).__(), - - ____.iload(B) - .aload(A) - .getfield(FIELD_D) - .dup2_x1().__() - }, - { // X i X (e.g. X[i] = X[.] ...): getfield/iload/getfield = iload/getfield/dup_x1 - ____.aload(A) - .getfield(X) - .iload(B) - .aload(A) - .getfield(X).__(), - - ____.iload(B) - .aload(A) - .getfield(X) - .dup_x1().__() - }, - { // L i L: getstatic_L/iload/getstatic_L = iload/getstatic_L/dup2_x1 - ____.getstatic(FIELD_J) - .iload(A) - .getstatic(FIELD_J).__(), - - ____.iload(A) - .getstatic(FIELD_J) - .dup2_x1().__() - }, - { // D i D: getstatic_D/iload/getstatic_D = iload/getstatic_D/dup2_x1 - ____.getstatic(FIELD_D) - .iload(A) - .getstatic(FIELD_D).__(), - - ____.iload(A) - .getstatic(FIELD_D) - .dup2_x1().__() - }, - { // X i X (e.g. X[i] = X[.] ...): getstatic/iload/getstatic = iload/getstatic/dup_x1 - ____.getstatic(X) - .iload(A) - .getstatic(X).__(), - - ____.iload(A) - .getstatic(X) - .dup_x1().__() - }, - { // X[i] j X[i] (e.g. X[i][j] = X[i][.] ...): getfield/iload/aaload/iload/getfield/iload/aaload = iload/getfield//iload/aaload/iload/dup_x1 - ____.aload(A) - .getfield(X) - .iload(B) - .aaload() - .iload(C) - .aload(A) - .getfield(X) - .iload(B) - .aaload().__(), - - ____.iload(C) - .aload(A) - .getfield(X) - .iload(B) - .aaload() - .dup_x1().__() - }, - { // X[i] j X[i] (e.g. X[i][j] = X[i][.] ...): getstatic/iload/aaload/iload/getstatic/iload/aaload = iload/getstatic//iload/aaload/iload/dup_x1 - ____.getstatic(X) - .iload(B) - .aaload() - .iload(C) - .getstatic(X) - .iload(B) - .aaload().__(), - - ____.iload(C) - .getstatic(X) - .iload(B) - .aaload() - .dup_x1().__() - }, - }; - - CAST_SEQUENCES = new Instruction[][][] - { - { // (byte)(byte)... = (byte)... - ____.i2b() - .i2b().__(), - - ____.i2b().__() - }, - { // (byte)(char)... = (byte)... - ____.i2c() - .i2b().__(), - - ____.i2b().__() - }, - { // (byte)(short)... = (byte)... - ____.i2s() - .i2b().__(), - - ____.i2b().__() - }, - { // (char)(char)... = (char)... - ____.i2c() - .i2c().__(), - - ____.i2c().__() - }, - { // (char)(short)... = (char)... - ____.i2s() - .i2c().__(), - - ____.i2c().__() - }, -// { // (short)(byte)... = (byte)... -// ____.i2b() -// .i2s().__(), -// -// ____.i2b().__() -// }, - { // (short)(char)... = (short)... - ____.i2c() - .i2s().__(), - - ____.i2s().__() - }, - { // (short)(short)... = (short)... - ____.i2s() - .i2s().__(), - - ____.i2s().__() - }, - { // (int)(long)... = ... - ____.i2l() - .l2i().__(), - }, - { // (int)(double)... = ... - ____.i2d() - .d2i().__(), - }, - { // (float)(double)... = (float)... for ints - ____.i2d() - .d2f().__(), - - ____.i2f().__() - }, - { // (float)(double)... = (float)... for longs - ____.l2d() - .d2f().__(), - - ____.l2f().__() - }, - { // (int)(double)... = (int)... - ____.f2d() - .d2i().__(), - - ____.f2i().__() - }, - { // (long)(double)... = (long)... - ____.f2d() - .d2l().__(), - - ____.f2l().__() - }, - { // (X)(X)... = (X)... - ____.checkcast(X) - .checkcast(X).__(), - - ____.checkcast(X).__() - }, - // Not handled correctly in all cases by VMs prior to Java 6... -// { // (byte)bytes[...] = bytes[...] -// ____.baload() -// .i2b().__(), -// -// ____.baload().__() -// }, -// { // (short)bytes[...] = bytes[...] -// ____.baload() -// .i2s().__(), -// -// ____.baload().__() -// }, -// { // (char)chars[...] = chars[...] -// ____.caload() -// .i2c().__(), -// -// ____.caload().__() -// }, -// { // (short)shorts[...] = shorts[...] -// ____.saload() -// .i2s().__(), -// -// ____.saload().__() -// }, -// { // bytes[...] = (byte)... = bytes[...] = ... -// ____.i2b() -// .bastore().__(), -// -// ____.bastore().__() -// }, -// { // chars[...] = (char)... = chars[...] = ... -// ____.i2c() -// .castore().__(), -// -// ____.castore().__() -// }, -// { // shorts[...] = (short)... = shorts[...] = ... -// ____.i2s() -// .sastore().__(), -// -// ____.sastore().__() -// }, - }; - - BRANCH_SEQUENCES = new Instruction[][][] - { - { // goto +3 = nothing - ____.goto_(3).__(), - }, - { // ifeq +3 = pop - ____.ifeq(3).__(), - - ____.pop().__() - }, - { // ifne +3 = pop - ____.ifne(3).__(), - - ____.pop().__() - }, - { // iflt +3 = pop - ____.iflt(3).__(), - - ____.pop().__() - }, - { // ifge +3 = pop - ____.ifge(3).__(), - - ____.pop().__() - }, - { // ifgt +3 = pop - ____.ifgt(3).__(), - - ____.pop().__() - }, - { // ifle +3 = pop - ____.ifle(3).__(), - - ____.pop().__() - }, - { // ificmpeq +3 = pop2 - ____.ificmpeq(3).__(), - - ____.pop2().__() - }, - { // ificmpne +3 = pop2 - ____.ificmpne(3).__(), - - ____.pop2().__() - }, - { // ificmplt +3 = pop2 - ____.ificmplt(3).__(), - - ____.pop2().__() - }, - { // ificmpge +3 = pop2 - ____.ificmpge(3).__(), - - ____.pop2().__() - }, - { // ificmpgt +3 = pop2 - ____.ificmpgt(3).__(), - - ____.pop2().__() - }, - { // ificmple +3 = pop2 - ____.ificmple(3).__(), - - ____.pop2().__() - }, - { // ifacmpeq +3 = pop2 - ____.ifacmpeq(3).__(), - - ____.pop2().__() - }, - { // ifacmpne +3 = pop2 - ____.ifacmpne(3).__(), - - ____.pop2().__() - }, - { // ifnull +3 = pop - ____.ifnull(3).__(), - - ____.pop().__() - }, - { // ifnonnull +3 = pop - ____.ifnonnull(3).__(), - - ____.pop().__() - }, - { // if (... == 0) = ifeq - ____.iconst_0() - .ificmpeq(X).__(), - - ____.ifeq(X).__() - }, - { // if (0 == i) = iload/ifeq - ____.iconst_0() - .iload(Y) - .ificmpeq(X).__(), - - ____.iload(Y) - .ifeq(X).__() - }, - { // if (0 == i) = getstatic/ifeq - ____.iconst_0() - .getstatic(Y) - .ificmpeq(X).__(), - - ____.getstatic(Y) - .ifeq(X).__() - }, - { // if (0 == i) = getfield/ifeq - ____.iconst_0() - .aload(Y) - .getfield(Z) - .ificmpeq(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifeq(X).__() - }, - { // if (... != 0) = ifne - ____.iconst_0() - .ificmpne(X).__(), - - ____.ifne(X).__() - }, - { // if (0 != i) = iload/ifeq - ____.iconst_0() - .iload(Y) - .ificmpne(X).__(), - - ____.iload(Y) - .ifne(X).__() - }, - { // if (0 != i) = getstatic/ifeq - ____.iconst_0() - .getstatic(Y) - .ificmpne(X).__(), - - ____.getstatic(Y) - .ifne(X).__() - }, - { // if (0 != i) = getfield/ifeq - ____.iconst_0() - .aload(Y) - .getfield(Z) - .ificmpne(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifne(X).__() - }, - { // if (... < 0) = iflt - ____.iconst_0() - .ificmplt(X).__(), - - ____.iflt(X).__() - }, - { // if (... < 1) = ifle - ____.iconst_1() - .ificmplt(X).__(), - - ____.ifle(X).__() - }, - { // if (0 > i) = iload/iflt - ____.iconst_0() - .iload(Y) - .ificmpgt(X).__(), - - ____.iload(Y) - .iflt(X).__() - }, - { // if (1 > i) = iload/ifle - ____.iconst_1() - .iload(Y) - .ificmpgt(X).__(), - - ____.iload(Y) - .ifle(X).__() - }, - { // if (0 > i) = getstatic/iflt - ____.iconst_0() - .getstatic(Y) - .ificmpgt(X).__(), - - ____.getstatic(Y) - .iflt(X).__() - }, - { // if (1 > i) = getstatic/ifle - ____.iconst_1() - .getstatic(Y) - .ificmpgt(X).__(), - - ____.getstatic(Y) - .ifle(X).__() - }, - { // if (0 > i) = getfield/iflt - ____.iconst_0() - .aload(Y) - .getfield(Z) - .ificmpgt(X).__(), - - ____.aload(Y) - .getfield(Z) - .iflt(X).__() - }, - { // if (1 > i) = getfield/ifle - ____.iconst_1() - .aload(Y) - .getfield(Z) - .ificmpgt(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifle(X).__() - }, - { // if (... >= 0) = ifge - ____.iconst_0() - .ificmpge(X).__(), - - ____.ifge(X).__() - }, - { // if (... >= 1) = ifgt - ____.iconst_1() - .ificmpge(X).__(), - - ____.ifgt(X).__() - }, - { // if (0 <= i) = iload/ifge - ____.iconst_0() - .iload(Y) - .ificmple(X).__(), - - ____.iload(Y) - .ifge(X).__() - }, - { // if (1 <= i) = iload/ifgt - ____.iconst_1() - .iload(Y) - .ificmple(X).__(), - - ____.iload(Y) - .ifgt(X).__() - }, - { // if (0 <= i) = getstatic/ifge - ____.iconst_0() - .getstatic(Y) - .ificmple(X).__(), - - ____.getstatic(Y) - .ifge(X).__() - }, - { // if (1 <= i) = getstatic/ifgt - ____.iconst_1() - .getstatic(Y) - .ificmple(X).__(), - - ____.getstatic(Y) - .ifgt(X).__() - }, - { // if (0 <= i) = getfield/ifge - ____.iconst_0() - .aload(Y) - .getfield(Z) - .ificmple(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifge(X).__() - }, - { // if (1 <= i) = getfield/ifgt - ____.iconst_1() - .aload(Y) - .getfield(Z) - .ificmple(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifgt(X).__() - }, - { // if (... > 0) = ifgt - ____.iconst_0() - .ificmpgt(X).__(), - - ____.ifgt(X).__() - }, - { // if (... > -1) = ifge - ____.iconst_m1() - .ificmpgt(X).__(), - - ____.ifge(X).__() - }, - { // if (0 < i) = iload/ifgt - ____.iconst_0() - .iload(Y) - .ificmplt(X).__(), - - ____.iload(Y) - .ifgt(X).__() - }, - { // if (-1 < i) = iload/ifge - ____.iconst_m1() - .iload(Y) - .ificmplt(X).__(), - - ____.iload(Y) - .ifge(X).__() - }, - { // if (0 < i) = getstatic/ifgt - ____.iconst_0() - .getstatic(Y) - .ificmplt(X).__(), - - ____.getstatic(Y) - .ifgt(X).__() - }, - { // if (-1 < i) = getstatic/ifge - ____.iconst_m1() - .getstatic(Y) - .ificmplt(X).__(), - - ____.getstatic(Y) - .ifge(X).__() - }, - { // if (0 < i) = getfield/ifgt - ____.iconst_0() - .aload(Y) - .getfield(Z) - .ificmplt(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifgt(X).__() - }, - { // if (-1 < i) = getfield/ifge - ____.iconst_m1() - .aload(Y) - .getfield(Z) - .ificmplt(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifge(X).__() - }, - { // if (... <= 0) = ifle - ____.iconst_0() - .ificmple(X).__(), - - ____.ifle(X).__() - }, - { // if (... <= -1) = iflt - ____.iconst_m1() - .ificmple(X).__(), - - ____.iflt(X).__() - }, - { // if (0 >= i) = iload/ifle - ____.iconst_0() - .iload(Y) - .ificmpge(X).__(), - - ____.iload(Y) - .ifle(X).__() - }, - { // if (-1 >= i) = iload/iflt - ____.iconst_m1() - .iload(Y) - .ificmpge(X).__(), - - ____.iload(Y) - .iflt(X).__() - }, - { // if (0 >= i) = getstatic/ifle - ____.iconst_0() - .getstatic(Y) - .ificmpge(X).__(), - - ____.getstatic(Y) - .ifle(X).__() - }, - { // if (-1 >= i) = getstatic/iflt - ____.iconst_m1() - .getstatic(Y) - .ificmpge(X).__(), - - ____.getstatic(Y) - .iflt(X).__() - }, - { // if (0 >= i) = getfield/ifle - ____.iconst_0() - .aload(Y) - .getfield(Z) - .ificmpge(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifle(X).__() - }, - { // if (-1 >= i) = getfield/iflt - ____.iconst_m1() - .aload(Y) - .getfield(Z) - .ificmpge(X).__(), - - ____.aload(Y) - .getfield(Z) - .iflt(X).__() - }, - { // if (... == null) = ifnull - ____.aconst_null() - .ifacmpeq(X).__(), - - ____.ifnull(X).__() - }, - { // if (null == a) = aload/ifnull - ____.aconst_null() - .aload(Y) - .ifacmpeq(X).__(), - - ____.aload(Y) - .ifnull(X).__() - }, - { // if (null == a) = getstatic/ifnull - ____.aconst_null() - .getstatic(Y) - .ifacmpeq(X).__(), - - ____.getstatic(Y) - .ifnull(X).__() - }, - { // if (null == a) = getfield/ifnull - ____.aconst_null() - .aload(Y) - .getfield(Z) - .ifacmpeq(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifnull(X).__() - }, - { // if (... != null) = ifnonnull - ____.aconst_null() - .ifacmpne(X).__(), - - ____.ifnonnull(X).__() - }, - { // if (null != a) = aload/ifnonnull - ____.aconst_null() - .aload(Y) - .ifacmpne(X).__(), - - ____.aload(Y) - .ifnonnull(X).__() - }, - { // if (null != a) = getstatic/ifnonnull - ____.aconst_null() - .getstatic(Y) - .ifacmpne(X).__(), - - ____.getstatic(Y) - .ifnonnull(X).__() - }, - { // if (null != a) = getfield/ifnonnull - ____.aconst_null() - .aload(Y) - .getfield(Z) - .ifacmpne(X).__(), - - ____.aload(Y) - .getfield(Z) - .ifnonnull(X).__() - }, - { // iconst_0/ifeq = goto - ____.iconst_0() - .ifeq(X).__(), - - ____.goto_(X).__() - }, - { // iconst/ifeq = nothing - ____.iconst(A) - .ifeq(X).__(), - }, - { // bipush/ifeq = nothing - ____.bipush(A) - .ifeq(X).__(), - }, - { // sipush/ifeq = nothing - ____.sipush(A) - .ifeq(X).__(), - }, - { // iconst_0/ifne = nothing - ____.iconst_0() - .ifne(X).__(), - }, - { // iconst/ifne = goto - ____.iconst(A) - .ifne(X).__(), - - ____.goto_(X).__() - }, - { // bipush/ifne = goto - ____.bipush(A) - .ifne(X).__(), - - ____.goto_(X).__() - }, - { // sipush/ifne = goto - ____.sipush(A) - .ifne(X).__(), - - ____.goto_(X).__() - }, - { // iconst_0/iflt = nothing - ____.iconst_0() - .iflt(X).__(), - }, - { // iconst_0/ifge = goto - ____.iconst_0() - .ifge(X).__(), - - ____.goto_(X).__() - }, - { // iconst_0/ifgt = nothing - ____.iconst_0() - .ifgt(X).__(), - }, - { // iconst_0/ifle = goto - ____.iconst_0() - .ifle(X).__(), - - ____.goto_(X).__() - }, - { // aconst_null/ifnull = goto - ____.aconst_null() - .ifnull(X).__(), - - ____.goto_(X).__() - }, - { // aconst_null/ifnonnul = nothing - ____.aconst_null() - .ifnonnull(X).__(), - }, - { // ifeq/goto = ifne - ____.ifeq(6) - .goto_(X).__(), - - ____.ifne(X).__() - }, - { // ifne/goto = ifeq - ____.ifne(6) - .goto_(X).__(), - - ____.ifeq(X).__() - }, - { // iflt/goto = ifge - ____.iflt(6) - .goto_(X).__(), - - ____.ifge(X).__() - }, - { // ifge/goto = iflt - ____.ifge(6) - .goto_(X).__(), - - ____.iflt(X).__() - }, - { // ifgt/goto = ifle - ____.ifgt(6) - .goto_(X).__(), - - ____.ifle(X).__() - }, - { // ifle/goto = ifgt - ____.ifle(6) - .goto_(X).__(), - - ____.ifgt(X).__() - }, - { // ificmpeq/goto = ificmpne - ____.ificmpeq(6) - .goto_(X).__(), - - ____.ificmpne(X).__() - }, - { // ificmpne/goto = ificmpeq - ____.ificmpne(6) - .goto_(X).__(), - - ____.ificmpeq(X).__() - }, - { // ificmplt/goto = ificmpge - ____.ificmplt(6) - .goto_(X).__(), - - ____.ificmpge(X).__() - }, - { // ificmpge/goto = ificmplt - ____.ificmpge(6) - .goto_(X).__(), - - ____.ificmplt(X).__() - }, - { // ificmpgt/goto = ificmple - ____.ificmpgt(6) - .goto_(X).__(), - - ____.ificmple(X).__() - }, - { // ificmple/goto = ificmpgt - ____.ificmple(6) - .goto_(X).__(), - - ____.ificmpgt(X).__() - }, - { // ifacmpeq/goto = ifacmpne - ____.ifacmpeq(6) - .goto_(X).__(), - - ____.ifacmpne(X).__() - }, - { // ifacmpne/goto = ifacmpeq - ____.ifacmpne(6) - .goto_(X).__(), - - ____.ifacmpeq(X).__() - }, - { // ifnull/goto = ifnonnull - ____.ifnull(6) - .goto_(X).__(), - - ____.ifnonnull(X).__() - }, - { // ifnonnull/goto = ifnull - ____.ifnonnull(6) - .goto_(X).__(), - - ____.ifnull(X).__() - }, -// { // switch (...) { default: ... } = pop/goto ... -// ____.tableswitch(A, X, Y, 0, new int[0]).__(), -// -// ____.pop() -// .goto_(A).__() -// }, -// { // switch (...) { default: ... } = pop/goto ... -// ____.lookupswitch(A, 0, new int[0], new int[0]).__(), -// -// ____.pop() -// .goto_(A).__() -// }, - { // switch (...) { case/case/default: ... } = switch (...) { case/default: ... } - ____.lookupswitch(A, new int[] { X, Y }, new int[] { A, B }).__(), - - ____.lookupswitch(A, new int[] { Y }, new int[] { B }).__() - }, - { // switch (...) { case/case/default: ... } = switch (...) { case/default: ... } - ____.lookupswitch(B, new int[] { X, Y }, new int[] { A, B }).__(), - - ____.lookupswitch(B, new int[] { X }, new int[] { A }).__() - }, - { // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... } - ____.lookupswitch(A, new int[] { X, Y, Z }, new int[] { A, B, C }).__(), - - ____.lookupswitch(A, new int[] { Y, Z }, new int[] { B, C }).__() - }, - { // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... } - ____.lookupswitch(B, new int[] { X, Y, Z }, new int[] { A, B, C }).__(), - - ____.lookupswitch(B, new int[] { X, Z }, new int[] { A, C }).__() - }, - { // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... } - ____.lookupswitch(C, new int[] { X, Y, Z }, new int[] { A, B, C }).__(), - - ____.lookupswitch(C, new int[] { X, Y }, new int[] { A, B }).__() - }, -// { // switch (...) { case ...: ... default: ... } -// // = if (... == ...) ... else ... -// ____.tableswitch(A, X, Y, 1, new int[] { B }).__(), -// -// ____.sipush(X) -// .ificmpne(A) -// .goto_(B).__() -// }, -// { // switch (...) { case ...: ... default: ... } -// // = if (... == ...) ... else ... -// ____.lookupswitch(A, 1, new int[] { X }, new int[] { B }).__(), -// -// ____.sipush(X) -// .ificmpne(A) -// .goto_(B).__() -// } - }; - - OBJECT_SEQUENCES = new Instruction[][][] - { - { // "...".equals("...") = X.class.equals(X.class) = true (ignoring class loader) - ____.ldc_(A) - .ldc_(A) - .invokevirtual(EQUALS).__(), - - ____.iconst_1().__() - }, - { // ....equals(dup) = true (discarding any NullPointerException) - ____.dup() - .invokevirtual(EQUALS).__(), - - ____.pop() - .iconst_1().__() - }, - { // object.equals(object) = true (ignoring implementation and discarding any NullPointerException) - ____.aload(A) - .aload(A) - .invokevirtual(EQUALS).__(), - - ____.iconst_1().__() - }, - { // object.equals(object) = true (ignoring implementation and discarding any NullPointerException) - ____.getstatic(A) - .getstatic(A) - .invokevirtual(EQUALS).__(), - - ____.iconst_1().__() - }, - { // object.equals(object) = true (ignoring implementation and discarding any NullPointerException) - ____.aload(A) - .getfield(B) - .aload(A) - .getfield(B) - .invokevirtual(EQUALS).__(), - - ____.iconst_1().__() - }, - { // Boolean.valueOf(false) = Boolean.FALSE - ____.iconst_0() - .invokestatic(BOOLEAN, "valueOf", "(Z)Ljava/lang/Boolean;").__(), - - ____.getstatic(BOOLEAN, "FALSE", "Ljava/lang/Boolean;").__() - }, - { // Boolean.valueOf(true) = Boolean.TRUE - ____.iconst_1() - .invokestatic(BOOLEAN, "valueOf", "(Z)Ljava/lang/Boolean;").__(), - - ____.getstatic(BOOLEAN, "TRUE", "Ljava/lang/Boolean;").__() - }, - { // new Boolean(false) = Boolean.FALSE (ignoring identity) - ____.new_(BOOLEAN) - .dup() - .iconst_0() - .invokespecial(BOOLEAN, "", "(Z)V").__(), - - ____.getstatic(BOOLEAN, "FALSE", "Ljava/lang/Boolean;").__() - }, - { // new Boolean(true) = Boolean.TRUE (ignoring identity) - ____.new_(BOOLEAN) - .dup() - .iconst_1() - .invokespecial(BOOLEAN, "", "(Z)V").__(), - - ____.getstatic(BOOLEAN, "TRUE", "Ljava/lang/Boolean;").__() - }, - { // new Boolean(v) = Boolean.valueof(v) (ignoring identity) - ____.new_(BOOLEAN) - .dup() - .iload(A) - .invokespecial(BOOLEAN, "", "(Z)V").__(), - - ____.iload(A) - .invokestatic(BOOLEAN, "valueOf", "(Z)Ljava/lang/Boolean;").__() - }, - { // new Boolean(s) = Boolean.valueof(s) (ignoring identity) - ____.new_(BOOLEAN) - .dup() - .getstatic(FIELD_Z) - .invokespecial(BOOLEAN, "", "(Z)V").__(), - - ____.getstatic(FIELD_Z) - .invokestatic(BOOLEAN, "valueOf", "(Z)Ljava/lang/Boolean;").__() - }, - { // new Boolean(v.f) = Boolean.valueof(v.f) (ignoring identity) - ____.new_(BOOLEAN) - .dup() - .aload(A) - .getfield(FIELD_Z) - .invokespecial(BOOLEAN, "", "(Z)V").__(), - - ____.aload(A) - .getfield(FIELD_Z) - .invokestatic(BOOLEAN, "valueOf", "(Z)Ljava/lang/Boolean;").__() - }, - { // Boolean.FALSE.booleanValue() = false - ____.getstatic(BOOLEAN, "FALSE", "Ljava/lang/Boolean;") - .invokevirtual(BOOLEAN_VALUE).__(), - - ____.iconst_0().__() - }, - { // Boolean.TRUE.booleanValue() = true - ____.getstatic(BOOLEAN, "TRUE", "Ljava/lang/Boolean;") - .invokevirtual(BOOLEAN_VALUE).__(), - - ____.iconst_1().__() - }, - { // Boolean.valueOf(...).booleanValue() = nothing - ____.invokestatic(BOOLEAN, "valueOf", "(Z)Ljava/lang/Boolean;") - .invokevirtual(BOOLEAN_VALUE).__(), - }, - { // new Byte(B) = Byte.valueof(B) (ignoring identity) - ____.new_(BYTE) - .dup() - .iconst(A) - .invokespecial(BYTE, "", "(B)V").__(), - - ____.iconst(A) - .invokestatic(BYTE, "valueOf", "(B)Ljava/lang/Byte;").__() - }, - { // new Byte(v) = Byte.valueof(v) (ignoring identity) - ____.new_(BYTE) - .dup() - .iload(A) - .invokespecial(BYTE, "", "(B)V").__(), - - ____.iload(A) - .invokestatic(BYTE, "valueOf", "(B)Ljava/lang/Byte;").__() - }, - { // new Byte(s) = Byte.valueof(s) (ignoring identity) - ____.new_(BYTE) - .dup() - .getstatic(FIELD_B) - .invokespecial(BYTE, "", "(B)V").__(), - - ____.getstatic(FIELD_B) - .invokestatic(BYTE, "valueOf", "(B)Ljava/lang/Byte;").__() - }, - { // new Byte(v.f) = Byte.valueof(v.f) (ignoring identity) - ____.new_(BYTE) - .dup() - .aload(A) - .getfield(FIELD_B) - .invokespecial(BYTE, "", "(B)V").__(), - - ____.aload(A) - .getfield(FIELD_B) - .invokestatic(BYTE, "valueOf", "(B)Ljava/lang/Byte;").__() - }, - { // Byte.valueOf(...).byteValue() = nothing - ____.invokestatic(BYTE, "valueOf", "(B)Ljava/lang/Byte;") - .invokevirtual(BYTE_VALUE).__(), - }, - { // new Character(C) = Character.valueof(C) (ignoring identity) - ____.new_(CHARACTER) - .dup() - .iconst(A) - .invokespecial(CHARACTER, "", "(C)V").__(), - - ____.iconst(A) - .invokestatic(CHARACTER, "valueOf", "(C)Ljava/lang/Character;").__() - }, - { // new Character(v) = Character.valueof(v) (ignoring identity) - ____.new_(CHARACTER) - .dup() - .iload(A) - .invokespecial(CHARACTER, "", "(C)V").__(), - - ____.iload(A) - .invokestatic(CHARACTER, "valueOf", "(C)Ljava/lang/Character;").__() - }, - { // new Character(s) = Character.valueof(s) (ignoring identity) - ____.new_(CHARACTER) - .dup() - .getstatic(FIELD_C) - .invokespecial(CHARACTER, "", "(C)V").__(), - - ____.getstatic(FIELD_C) - .invokestatic(CHARACTER, "valueOf", "(C)Ljava/lang/Character;").__() - }, - { // new Character(v.f) = Character.valueof(v.f) (ignoring identity) - ____.new_(CHARACTER) - .dup() - .aload(A) - .getfield(FIELD_C) - .invokespecial(CHARACTER, "", "(C)V").__(), - - ____.aload(A) - .getfield(FIELD_C) - .invokestatic(CHARACTER, "valueOf", "(C)Ljava/lang/Character;").__() - }, - { // Character.valueOf(...).charValue() = nothing - ____.invokestatic(CHARACTER, "valueOf", "(C)Ljava/lang/Character;") - .invokevirtual(CHAR_VALUE).__(), - }, - { // new Short(S) = Short.valueof(S) (ignoring identity) - ____.new_(SHORT) - .dup() - .iconst(A) - .invokespecial(SHORT, "", "(S)V").__(), - - ____.iconst(A) - .invokestatic(SHORT, "valueOf", "(S)Ljava/lang/Short;").__() - }, - { // new Short(v) = Short.valueof(v) (ignoring identity) - ____.new_(SHORT) - .dup() - .iload(A) - .invokespecial(SHORT, "", "(S)V").__(), - - ____.iload(A) - .invokestatic(SHORT, "valueOf", "(S)Ljava/lang/Short;").__() - }, - { // new Short(s) = Short.valueof(s) (ignoring identity) - ____.new_(SHORT) - .dup() - .getstatic(FIELD_S) - .invokespecial(SHORT, "", "(S)V").__(), - - ____.getstatic(FIELD_S) - .invokestatic(SHORT, "valueOf", "(S)Ljava/lang/Short;").__() - }, - { // new Short(v.f) = Short.valueof(v.f) (ignoring identity) - ____.new_(SHORT) - .dup() - .aload(A) - .getfield(FIELD_S) - .invokespecial(SHORT, "", "(S)V").__(), - - ____.aload(A) - .getfield(FIELD_S) - .invokestatic(SHORT, "valueOf", "(S)Ljava/lang/Short;").__() - }, - { // Short.valueOf(...).shortValue() = nothing - ____.invokestatic(SHORT, "valueOf", "(S)Ljava/lang/Short;") - .invokevirtual(SHORT_VALUE).__(), - }, - { // new Integer(I) = Integer.valueof(I) (ignoring identity) - ____.new_(INTEGER) - .dup() - .iconst(A) - .invokespecial(INTEGER, "", "(I)V").__(), - - ____.iconst(A) - .invokestatic(INTEGER, "valueOf", "(I)Ljava/lang/Integer;").__() - }, - { // new Integer(I) = Integer.valueof(I) (ignoring identity) - ____.new_(INTEGER) - .dup() - .ldc_(A) - .invokespecial(INTEGER, "", "(I)V").__(), - - ____.ldc_(A) - .invokestatic(INTEGER, "valueOf", "(I)Ljava/lang/Integer;").__() - }, - { // new Integer(v) = Integer.valueof(v) (ignoring identity) - ____.new_(INTEGER) - .dup() - .iload(A) - .invokespecial(INTEGER, "", "(I)V").__(), - - ____.iload(A) - .invokestatic(INTEGER, "valueOf", "(I)Ljava/lang/Integer;").__() - }, - { // new Integer(c) = Integer.valueof(c) (ignoring identity) - ____.new_(INTEGER) - .dup() - .getstatic(FIELD_I) - .invokespecial(INTEGER, "", "(I)V").__(), - - ____.getstatic(FIELD_I) - .invokestatic(INTEGER, "valueOf", "(I)Ljava/lang/Integer;").__() - }, - { // new Integer(v.f) = Integer.valueof(v.f) (ignoring identity) - ____.new_(INTEGER) - .dup() - .aload(A) - .getfield(FIELD_I) - .invokespecial(INTEGER, "", "(I)V").__(), - - ____.aload(A) - .getfield(FIELD_I) - .invokestatic(INTEGER, "valueOf", "(I)Ljava/lang/Integer;").__() - }, - { // Integer.valueOf(...).intValue() = nothing - ____.invokestatic(INTEGER, "valueOf", "(I)Ljava/lang/Integer;") - .invokevirtual(INT_VALUE).__(), - }, - { // new Float(F) = Float.valueof(F) (ignoring identity) - ____.new_(FLOAT) - .dup() - .fconst(A) - .invokespecial(FLOAT, "", "(F)V").__(), - - ____.fconst(A) - .invokestatic(FLOAT, "valueOf", "(F)Ljava/lang/Float;").__() - }, - { // new Float(F) = Float.valueof(F) (ignoring identity) - ____.new_(FLOAT) - .dup() - .ldc_(A) - .invokespecial(FLOAT, "", "(F)V").__(), - - ____.ldc_(A) - .invokestatic(FLOAT, "valueOf", "(F)Ljava/lang/Float;").__() - }, - { // new Float(v) = Float.valueof(v) (ignoring identity) - ____.new_(FLOAT) - .dup() - .fload(A) - .invokespecial(FLOAT, "", "(F)V").__(), - - ____.fload(A) - .invokestatic(FLOAT, "valueOf", "(F)Ljava/lang/Float;").__() - }, - { // new Float(s) = Float.valueof(s) (ignoring identity) - ____.new_(FLOAT) - .dup() - .getstatic(FIELD_F) - .invokespecial(FLOAT, "", "(F)V").__(), - - ____.getstatic(FIELD_F) - .invokestatic(FLOAT, "valueOf", "(F)Ljava/lang/Float;").__() - }, - { // new Float(v.f) = Float.valueof(v.f) (ignoring identity) - ____.new_(FLOAT) - .dup() - .aload(A) - .getfield(FIELD_F) - .invokespecial(FLOAT, "", "(F)V").__(), - - ____.aload(A) - .getfield(FIELD_F) - .invokestatic(FLOAT, "valueOf", "(F)Ljava/lang/Float;").__() - }, - { // Float.valueOf(...).floatValue() = nothing - ____.invokestatic(FLOAT, "valueOf", "(F)Ljava/lang/Float;") - .invokevirtual(FLOAT_VALUE).__(), - }, - { // new Long(J) = Long.valueof(J) (ignoring identity) - ____.new_(LONG) - .dup() - .lconst(A) - .invokespecial(LONG, "", "(J)V").__(), - - ____.lconst(A) - .invokestatic(LONG, "valueOf", "(J)Ljava/lang/Long;").__() - }, - { // new Long(J) = Long.valueof(J) (ignoring identity) - ____.new_(LONG) - .dup() - .ldc2_w(A) - .invokespecial(LONG, "", "(J)V").__(), - - ____.ldc2_w(A) - .invokestatic(LONG, "valueOf", "(J)Ljava/lang/Long;").__() - }, - { // new Long(v) = Long.valueof(v) (ignoring identity) - ____.new_(LONG) - .dup() - .iload(A) - .invokespecial(LONG, "", "(J)V").__(), - - ____.iload(A) - .invokestatic(LONG, "valueOf", "(J)Ljava/lang/Long;").__() - }, - { // new Long(s) = Long.valueof(s) (ignoring identity) - ____.new_(LONG) - .dup() - .getstatic(FIELD_J) - .invokespecial(LONG, "", "(J)V").__(), - - ____.getstatic(FIELD_J) - .invokestatic(LONG, "valueOf", "(J)Ljava/lang/Long;").__() - }, - { // new Long(v.f) = Long.valueof(v.f) (ignoring identity) - ____.new_(LONG) - .dup() - .aload(A) - .getfield(FIELD_J) - .invokespecial(LONG, "", "(J)V").__(), - - ____.aload(A) - .getfield(FIELD_J) - .invokestatic(LONG, "valueOf", "(J)Ljava/lang/Long;").__() - }, - { // Long.valueOf(...).longValue() = nothing - ____.invokestatic(LONG, "valueOf", "(J)Ljava/lang/Long;") - .invokevirtual(LONG_VALUE).__(), - }, - { // new Double(D) = Double.valueof(D) (ignoring identity) - ____.new_(DOUBLE) - .dup() - .dconst(A) - .invokespecial(DOUBLE, "", "(D)V").__(), - - ____.dconst(A) - .invokestatic(DOUBLE, "valueOf", "(D)Ljava/lang/Double;").__() - }, - { // new Double(D) = Double.valueof(D) (ignoring identity) - ____.new_(DOUBLE) - .dup() - .ldc2_w(A) - .invokespecial(DOUBLE, "", "(D)V").__(), - - ____.ldc2_w(A) - .invokestatic(DOUBLE, "valueOf", "(D)Ljava/lang/Double;").__() - }, - { // new Double(v) = Double.valueof(v) (ignoring identity) - ____.new_(DOUBLE) - .dup() - .dload(A) - .invokespecial(DOUBLE, "", "(D)V").__(), - - ____.dload(A) - .invokestatic(DOUBLE, "valueOf", "(D)Ljava/lang/Double;").__() - }, - { // new Double(s) = Double.valueof(s) (ignoring identity) - ____.new_(DOUBLE) - .dup() - .getstatic(FIELD_D) - .invokespecial(DOUBLE, "", "(D)V").__(), - - ____.getstatic(FIELD_D) - .invokestatic(DOUBLE, "valueOf", "(D)Ljava/lang/Double;").__() - }, - { // new Double(v.f) = Double.valueof(v.f) (ignoring identity) - ____.new_(DOUBLE) - .dup() - .aload(A) - .getfield(FIELD_D) - .invokespecial(DOUBLE, "", "(D)V").__(), - - ____.aload(A) - .getfield(FIELD_D) - .invokestatic(DOUBLE, "valueOf", "(D)Ljava/lang/Double;").__() - }, - { // Double.valueOf(...).doubleValue() = nothing - ____.invokestatic(DOUBLE, "valueOf", "(D)Ljava/lang/Double;") - .invokevirtual(DOUBLE_VALUE).__(), - }, - }; - - STRING_SEQUENCES = new Instruction[][][] - { - { // "...".equals("...") = true - ____.ldc_(A) - .ldc_(A) - .invokevirtual(STRING, "equals", "(Ljava/lang/Object;)Z").__(), - - ____.iconst_1().__() - }, - { // "...".length() = ... - ____.ldc_(A) - .invokevirtual(STRING, "length", "()I").__(), - - ____.sipush(STRING_A_LENGTH).__() - }, - { // String.valueOf(Z) = ".... - ____.iconst(A) - .invokestatic(STRING, "valueOf", "(Z)Ljava/lang/String;").__(), - - ____.ldc_(BOOLEAN_A_STRING).__() - }, - { // String.valueOf(C) = "...." - ____.iconst(A) - .invokestatic(STRING, "valueOf", "(C)Ljava/lang/String;").__(), - - ____.ldc_(CHAR_A_STRING).__() - }, - { // String.valueOf(Cc) = "...." - ____.ldc_(A) - .invokestatic(STRING, "valueOf", "(C)Ljava/lang/String;").__(), - - ____.ldc_(CHAR_A_STRING).__() - }, - { // String.valueOf(I) = "...." - ____.iconst(A) - .invokestatic(STRING, "valueOf", "(I)Ljava/lang/String;").__(), - - ____.ldc_(INT_A_STRING).__() - }, - { // String.valueOf(Ic) = "...." - ____.ldc_(A) - .invokestatic(STRING, "valueOf", "(I)Ljava/lang/String;").__(), - - ____.ldc_(INT_A_STRING).__() - }, - { // String.valueOf(J) = "...." - ____.lconst(A) - .invokestatic(STRING, "valueOf", "(J)Ljava/lang/String;").__(), - - ____.ldc_(LONG_A_STRING).__() - }, - { // String.valueOf(Jc) = "...." - ____.ldc2_w(A) - .invokestatic(STRING, "valueOf", "(J)Ljava/lang/String;").__(), - - ____.ldc_(LONG_A_STRING).__() - }, - { // String.valueOf(F) = "...." - ____.fconst(A) - .invokestatic(STRING, "valueOf", "(F)Ljava/lang/String;").__(), - - ____.ldc_(FLOAT_A_STRING).__() - }, - { // String.valueOf(Fc) = "...." - ____.ldc_(A) - .invokestatic(STRING, "valueOf", "(F)Ljava/lang/String;").__(), - - ____.ldc_(FLOAT_A_STRING).__() - }, - { // String.valueOf(D) = "...." - ____.dconst(A) - .invokestatic(STRING, "valueOf", "(D)Ljava/lang/String;").__(), - - ____.ldc_(DOUBLE_A_STRING).__() - }, - { // String.valueOf(Dc) = "...." - ____.ldc2_w(A) - .invokestatic(STRING, "valueOf", "(D)Ljava/lang/String;").__(), - - ____.ldc_(DOUBLE_A_STRING).__() - }, - { // "...".concat("...") = "......" - ____.ldc_(A) - .ldc_(B) - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__(), - - ____.ldc_(STRING_A_STRING | STRING_B_STRING).__(), - }, - - { // new StringBuffer("...").toString() = "..." (ignoring identity) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A).__() - }, - { // new StringBuffer(string).toString() = string (ignoring identity and discarding any NullPointerException) - ____.new_(STRING_BUFFER) - .dup() - .aload(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .invokevirtual(TO_STRING).__(), - - ____.aload(A).__() - }, - { // new StringBuffer("...").length() = length - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .invokevirtual(STRING_BUFFER, "length", "()I").__(), - - ____.sipush(STRING_A_LENGTH).__() - }, - { // new StringBuffer() (without dup) = nothing - ____.new_(STRING_BUFFER) - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "()V").__(), - }, - { // new StringBuffer("...") (without dup) = nothing - ____.new_(STRING_BUFFER) - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__(), - }, - { // new StringBuffer()/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "()V") - .pop().__(), - }, - { // new StringBuffer("...")/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .pop().__(), - }, - { // new StringBuffer("...").append(z)/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUFFER, "append", "(Z)Ljava/lang/StringBuffer;") - .pop().__(), - }, - { // new StringBuffer("...").append(c)/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;") - .pop().__(), - }, - { // new StringBuffer("...").append(i)/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;") - .pop().__(), - }, - { // new StringBuffer("...").append(l)/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .lload(B) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;") - .pop().__(), - }, - { // new StringBuffer("...").append(f)/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .fload(B) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;") - .pop().__(), - }, - { // new StringBuffer("...").append(d)/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .dload(B) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;") - .pop().__(), - }, - { // new StringBuffer("...").append(s)/pop = nothing - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .aload(B) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .pop().__(), - }, - { // StringBuffer#toString()/pop = pop - ____.invokevirtual(TO_STRING) - .pop().__(), - - ____.pop().__() - }, - { // StringBuffer#append("") = nothing - ____.ldc("") - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__(), - }, - { // new StringBuffer().append(Z) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .iconst(A) - .invokevirtual(STRING_BUFFER, "append", "(Z)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(BOOLEAN_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(C) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .iconst(A) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(CHAR_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(Cc) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(CHAR_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(I) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .iconst(A) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(INT_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(Ic) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(INT_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(J) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .lconst(A) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(LONG_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(Jc) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .ldc2_w(A) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(LONG_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(F) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .fconst(A) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(FLOAT_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(Fc) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(FLOAT_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(D) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .dconst(A) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(DOUBLE_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append(Dc) = new StringBuffer("....") - ____.invokespecial(STRING_BUFFER, "", "()V") - .ldc2_w(A) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(DOUBLE_A_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer().append("...") = new StringBuffer("...") - ____.invokespecial(STRING_BUFFER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(Z) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iconst(B) - .invokevirtual(STRING_BUFFER, "append", "(Z)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | BOOLEAN_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(C) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iconst(B) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(Cc) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(I) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iconst(B) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(Ic) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(J) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .lconst(B) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(Jc) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .ldc2_w(B) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(F) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .fconst(B) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(Fc) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(D) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .dconst(B) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(Dc) = new StringBuffer("....") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .ldc2_w(B) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append("...") = new StringBuffer("......") - ____.ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | STRING_B_STRING) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuffer("...").append(z).toString() = "...".concat(String.valueOf(z)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUFFER, "append", "(Z)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .iload(B) - .invokestatic(STRING, "valueOf", "(Z)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuffer("...").append(c).toString() = "...".concat(String.valueOf(c)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .iload(B) - .invokestatic(STRING, "valueOf", "(C)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuffer("...").append(i).toString() = "...".concat(String.valueOf(i)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .iload(B) - .invokestatic(STRING, "valueOf", "(I)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuffer("...").append(l).toString() = "...".concat(String.valueOf(l)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .lload(B) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .lload(B) - .invokestatic(STRING, "valueOf", "(J)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuffer("...").append(f).toString() = "...".concat(String.valueOf(f)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .fload(B) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .fload(B) - .invokestatic(STRING, "valueOf", "(F)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuffer("...").append(d).toString() = "...".concat(String.valueOf(d)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .dload(B) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .dload(B) - .invokestatic(STRING, "valueOf", "(D)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuffer("...").append(string).toString() = "...".concat(String.valueOf(string)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .aload(B) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .aload(B) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuffer("...").append(object).toString() = "...".concat(String.valueOf(object)) - ____.new_(STRING_BUFFER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUFFER, "", "(Ljava/lang/String;)V") - .aload(B) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/Object;)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .aload(B) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // StringBuffer#append("...").append(Z) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .iconst(B) - .invokevirtual(STRING_BUFFER, "append", "(Z)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | BOOLEAN_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(C) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .iconst(B) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(Cc) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(I) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .iconst(B) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(Ic) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(J) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .lconst(B) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(Jc) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .ldc2_w(B) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(F) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .fconst(B) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(Fc) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(D) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .dconst(B) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append(Dc) = StringBuffer#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .ldc2_w(B) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // StringBuffer#append("...").append("...") = StringBuffer#append("......") - ____.ldc_(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .ldc_(B) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__(), - - ____.ldc_(STRING_A_STRING | STRING_B_STRING) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;").__() - }, - { // new StringBuffer().append(z).toString() = String.valueOf(z) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .iload(A) - .invokevirtual(STRING_BUFFER, "append", "(Z)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.iload(A) - .invokestatic(STRING, "valueOf", "(Z)Ljava/lang/String;").__() - }, - { // new StringBuffer().append(c).toString() = String.valueOf(c) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .iload(A) - .invokevirtual(STRING_BUFFER, "append", "(C)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.iload(A) - .invokestatic(STRING, "valueOf", "(C)Ljava/lang/String;").__() - }, - { // new StringBuffer().append(i).toString() = String.valueOf(i) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .iload(A) - .invokevirtual(STRING_BUFFER, "append", "(I)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.iload(A) - .invokestatic(STRING, "valueOf", "(I)Ljava/lang/String;").__() - }, - { // new StringBuffer().append(j).toString() = String.valueOf(j) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .lload(A) - .invokevirtual(STRING_BUFFER, "append", "(J)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.lload(A) - .invokestatic(STRING, "valueOf", "(J)Ljava/lang/String;").__() - }, - { // new StringBuffer().append(f).toString() = String.valueOf(f) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .fload(A) - .invokevirtual(STRING_BUFFER, "append", "(F)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.fload(A) - .invokestatic(STRING, "valueOf", "(F)Ljava/lang/String;").__() - }, - { // new StringBuffer().append(d).toString() = String.valueOf(d) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .dload(A) - .invokevirtual(STRING_BUFFER, "append", "(D)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.dload(A) - .invokestatic(STRING, "valueOf", "(D)Ljava/lang/String;").__() - }, - { // new StringBuffer().append(string).toString() = String.valueOf(string) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .aload(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.aload(A) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;").__() - }, - { // new StringBuffer().append(object).toString() = String.valueOf(object) - ____.new_(STRING_BUFFER) - .dup() - .invokespecial(STRING_BUFFER, "", "()V") - .aload(A) - .invokevirtual(STRING_BUFFER, "append", "(Ljava/lang/Object;)Ljava/lang/StringBuffer;") - .invokevirtual(TO_STRING).__(), - - ____.aload(A) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;").__() - }, - - { // new StringBuilder("...").toString() = "..." (ignoring identity) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A).__() - }, - { // new StringBuilder(string).toString() = string (ignoring identity and discarding any NullPointerException) - ____.new_(STRING_BUILDER) - .dup() - .aload(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .invokevirtual(TO_STRING).__(), - - ____.aload(A).__() - }, - { // new StringBuilder("...").length() = length - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .invokevirtual(STRING_BUILDER, "length", "()I").__(), - - ____.sipush(STRING_A_LENGTH).__() - }, - { // new StringBuilder() (without dup) = nothing - ____.new_(STRING_BUILDER) - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "()V").__(), - }, - { // new StringBuilder("...") (without dup) = nothing - ____.new_(STRING_BUILDER) - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__(), - }, - { // new StringBuilder()/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "()V") - .pop().__(), - }, - { // new StringBuilder("...")/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .pop().__(), - }, - { // new StringBuilder("...").append(z)/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUILDER, "append", "(Z)Ljava/lang/StringBuilder;") - .pop().__(), - }, - { // new StringBuilder("...").append(c)/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;") - .pop().__(), - }, - { // new StringBuilder("...").append(i)/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;") - .pop().__(), - }, - { // new StringBuilder("...").append(l)/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .lload(B) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;") - .pop().__(), - }, - { // new StringBuilder("...").append(f)/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .fload(B) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;") - .pop().__(), - }, - { // new StringBuilder("...").append(d)/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .dload(B) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;") - .pop().__(), - }, - { // new StringBuilder("...").append(s)/pop = nothing - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .aload(B) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .pop().__(), - }, - { // StringBuilder#toString()/pop = pop - ____.invokevirtual(TO_STRING) - .pop().__(), - - ____.pop().__() - }, - { // StringBuilder#append("") = nothing - ____.ldc("") - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__(), - }, - { // new StringBuilder().append(Z) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .iconst(A) - .invokevirtual(STRING_BUILDER, "append", "(Z)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(BOOLEAN_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(C) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .iconst(A) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(CHAR_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(Cc) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(CHAR_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(I) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .iconst(A) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(INT_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(Ic) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(INT_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(J) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .lconst(A) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(LONG_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(Jc) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .ldc2_w(A) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(LONG_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(F) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .fconst(A) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(FLOAT_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(Fc) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(FLOAT_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(D) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .dconst(A) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(DOUBLE_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append(Dc) = new StringBuilder("....") - ____.invokespecial(STRING_BUILDER, "", "()V") - .ldc2_w(A) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(DOUBLE_A_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder().append("...") = new StringBuilder("...") - ____.invokespecial(STRING_BUILDER, "", "()V") - .ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(Z) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iconst(B) - .invokevirtual(STRING_BUILDER, "append", "(Z)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | BOOLEAN_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(C) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iconst(B) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(Cc) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(I) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iconst(B) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(Ic) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(J) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .lconst(B) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(Jc) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .ldc2_w(B) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(F) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .fconst(B) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(Fc) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(D) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .dconst(B) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(Dc) = new StringBuilder("....") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .ldc2_w(B) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append("...") = new StringBuilder("......") - ____.ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | STRING_B_STRING) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V").__() - }, - { // new StringBuilder("...").append(z).toString() = "...".concat(String.valueOf(z)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUILDER, "append", "(Z)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .iload(B) - .invokestatic(STRING, "valueOf", "(Z)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuilder("...").append(c).toString() = "...".concat(String.valueOf(c)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .iload(B) - .invokestatic(STRING, "valueOf", "(C)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuilder("...").append(i).toString() = "...".concat(String.valueOf(i)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .iload(B) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .iload(B) - .invokestatic(STRING, "valueOf", "(I)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuilder("...").append(l).toString() = "...".concat(String.valueOf(l)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .lload(B) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .lload(B) - .invokestatic(STRING, "valueOf", "(J)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuilder("...").append(f).toString() = "...".concat(String.valueOf(f)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .fload(B) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .fload(B) - .invokestatic(STRING, "valueOf", "(F)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuilder("...").append(d).toString() = "...".concat(String.valueOf(d)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .dload(B) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .dload(B) - .invokestatic(STRING, "valueOf", "(D)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuilder("...").append(string).toString() = "...".concat(String.valueOf(string)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .aload(B) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .aload(B) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // new StringBuilder("...").append(object).toString() = "...".concat(String.valueOf(object)) - ____.new_(STRING_BUILDER) - .dup() - .ldc_(A) - .invokespecial(STRING_BUILDER, "", "(Ljava/lang/String;)V") - .aload(B) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/Object;)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.ldc_(A) - .aload(B) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;") - .invokevirtual(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;").__() - }, - { // StringBuilder#append("...").append(Z) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .iconst(B) - .invokevirtual(STRING_BUILDER, "append", "(Z)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | BOOLEAN_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(C) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .iconst(B) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(Cc) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | CHAR_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(I) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .iconst(B) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(Ic) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | INT_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(J) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .lconst(B) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(Jc) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .ldc2_w(B) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | LONG_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(F) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .fconst(B) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(Fc) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | FLOAT_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(D) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .dconst(B) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append(Dc) = StringBuilder#append("....") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .ldc2_w(B) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | DOUBLE_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // StringBuilder#append("...").append("...") = StringBuilder#append("......") - ____.ldc_(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .ldc_(B) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__(), - - ____.ldc_(STRING_A_STRING | STRING_B_STRING) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;").__() - }, - { // new StringBuilder().append(z).toString() = String.valueOf(z) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .iload(A) - .invokevirtual(STRING_BUILDER, "append", "(Z)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.iload(A) - .invokestatic(STRING, "valueOf", "(Z)Ljava/lang/String;").__() - }, - { // new StringBuilder().append(c).toString() = String.valueOf(c) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .iload(A) - .invokevirtual(STRING_BUILDER, "append", "(C)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.iload(A) - .invokestatic(STRING, "valueOf", "(C)Ljava/lang/String;").__() - }, - { // new StringBuilder().append(i).toString() = String.valueOf(i) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .iload(A) - .invokevirtual(STRING_BUILDER, "append", "(I)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.iload(A) - .invokestatic(STRING, "valueOf", "(I)Ljava/lang/String;").__() - }, - { // new StringBuilder().append(j).toString() = String.valueOf(j) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .lload(A) - .invokevirtual(STRING_BUILDER, "append", "(J)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.lload(A) - .invokestatic(STRING, "valueOf", "(J)Ljava/lang/String;").__() - }, - { // new StringBuilder().append(f).toString() = String.valueOf(f) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .fload(A) - .invokevirtual(STRING_BUILDER, "append", "(F)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.fload(A) - .invokestatic(STRING, "valueOf", "(F)Ljava/lang/String;").__() - }, - { // new StringBuilder().append(d).toString() = String.valueOf(d) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .dload(A) - .invokevirtual(STRING_BUILDER, "append", "(D)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.dload(A) - .invokestatic(STRING, "valueOf", "(D)Ljava/lang/String;").__() - }, - { // new StringBuilder().append(string).toString() = String.valueOf(string) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .aload(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.aload(A) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;").__() - }, - { // new StringBuilder().append(object).toString() = String.valueOf(object) - ____.new_(STRING_BUILDER) - .dup() - .invokespecial(STRING_BUILDER, "", "()V") - .aload(A) - .invokevirtual(STRING_BUILDER, "append", "(Ljava/lang/Object;)Ljava/lang/StringBuilder;") - .invokevirtual(TO_STRING).__(), - - ____.aload(A) - .invokestatic(STRING, "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;").__() - }, - }; - - MATH_SEQUENCES = new Instruction[][][] - { - { // (float)Math.abs((double)...) = Math.abs(...) - ____.f2d() - .invokestatic(MATH, "abs", "(D)D") - .d2f().__(), - - ____.invokestatic(MATH, "abs", "(F)F").__() - }, - { // (float)Math.abs(...) = Math.abs((float)...) - ____.invokestatic(MATH, "abs", "(D)D") - .d2f().__(), - - ____.d2f() - .invokestatic(MATH, "abs", "(F)F").__() - }, - { // (int)Math.floor((double)...) = ... - ____.i2d() - .invokestatic(MATH, "floor", "(D)D") - .d2i().__(), - }, - { // (int)Math.ceil((double)...) = ... - ____.i2d() - .invokestatic(MATH, "ceil", "(D)D") - .d2i().__(), - }, - { // (float)Math.min((double)..., 0.0) = Math.min(..., 0f) - ____.f2d() - .dconst_0() - .invokestatic(MATH, "min", "(DD)D") - .d2f().__(), - - ____.fconst_0() - .invokestatic(MATH, "min", "(FF)F").__() - }, - { // (float)Math.min(..., 0.0) = Math.min((float)..., 0f) (assuming in float range) - ____.dconst_0() - .invokestatic(MATH, "min", "(DD)D") - .d2f().__(), - - ____.d2f() - .fconst_0() - .invokestatic(MATH, "min", "(FF)F").__() - }, - { // (float)Math.max((double)..., 0.0) = Math.max(..., 0f) - ____.f2d() - .dconst_0() - .invokestatic(MATH, "max", "(DD)D") - .d2f().__(), - - ____.fconst_0() - .invokestatic(MATH, "max", "(FF)F").__() - }, - { // (float)Math.max(..., 0.0) = Math.max((float)..., 0f) (assuming in float range) - ____.dconst_0() - .invokestatic(MATH, "max", "(DD)D") - .d2f().__(), - - ____.d2f() - .fconst_0() - .invokestatic(MATH, "max", "(FF)F").__() - }, - }; - - MATH_ANDROID_SEQUENCES = new Instruction[][][] - { - // As of API level 22, FloatMath has been deprecated, as the - // equivalent methods in Math are faster on Android versions - // with a JIT. We therefore now convert from FloatMath to Math. - - { // FloatMath.sqrt((float)...) = (float)Math.sqrt(...) - ____.d2f() - .invokestatic(FLOAT_MATH, "sqrt", "(F)F").__(), - - ____.invokestatic(MATH, "sqrt", "(D)D") - .d2f().__() - }, - { // FloatMath.sqrt(...) = (float)Math.sqrt((double)...) - ____.invokestatic(FLOAT_MATH, "sqrt", "(F)F").__(), - - ____.f2d() - .invokestatic(MATH, "sqrt", "(D)D") - .d2f().__() - }, - { // FloatMath.cos((float)...) = (float)Math.cos(...) - ____.d2f() - .invokestatic(FLOAT_MATH, "cos", "(F)F").__(), - - ____.invokestatic(MATH, "cos", "(D)D") - .d2f().__() - }, - { // FloatMath.cos(...) = (float)Math.cos((double)...) - ____.invokestatic(FLOAT_MATH, "cos", "(F)F").__(), - - ____.f2d() - .invokestatic(MATH, "cos", "(D)D") - .d2f().__() - }, - { // FloatMath.sin((float)...) = (float)Math.sin(...) - ____.d2f() - .invokestatic(FLOAT_MATH, "sin", "(F)F").__(), - - ____.invokestatic(MATH, "sin", "(D)D") - .d2f().__() - }, - { // FloatMath.sin(...) = (float)Math.sin((double)...) - ____.invokestatic(FLOAT_MATH, "sin", "(F)F").__(), - - ____.f2d() - .invokestatic(MATH, "sin", "(D)D") - .d2f().__() - }, - { // FloatMath.floor((float)...) = (float)Math.floor(...) - ____.d2f() - .invokestatic(FLOAT_MATH, "floor", "(F)F").__(), - - ____.invokestatic(MATH, "floor", "(D)D") - .d2f().__() - }, - { // FloatMath.floor(...) = (float)Math.floor((double)...) - ____.invokestatic(FLOAT_MATH, "floor", "(F)F").__(), - - ____.f2d() - .invokestatic(MATH, "floor", "(D)D") - .d2f().__() - }, - { // FloatMath.ceil((float)...) = (float)Math.ceil(...) - ____.d2f() - .invokestatic(FLOAT_MATH, "ceil", "(F)F").__(), - - ____.invokestatic(MATH, "ceil", "(D)D") - .d2f().__() - }, - { // FloatMath.ceil(...) = (float)Math.ceil((double)...) - ____.invokestatic(FLOAT_MATH, "ceil", "(F)F").__(), - - ____.f2d() - .invokestatic(MATH, "ceil", "(D)D") - .d2f().__() - }, - }; - - CONSTANTS = ____.constants(); - } - - - /** - * Prints out the instruction sequences. - */ - public static void main(String[] args) - { - InstructionSequenceConstants instructionSequenceConstants = - new InstructionSequenceConstants(new ClassPool(), - new ClassPool()); - - Instruction[][][][] sets = new Instruction[][][][] - { - instructionSequenceConstants.VARIABLE_SEQUENCES, - instructionSequenceConstants.ARITHMETIC_SEQUENCES, - instructionSequenceConstants.FIELD_SEQUENCES, - instructionSequenceConstants.CAST_SEQUENCES, - instructionSequenceConstants.BRANCH_SEQUENCES, - instructionSequenceConstants.STRING_SEQUENCES, - instructionSequenceConstants.OBJECT_SEQUENCES, - instructionSequenceConstants.MATH_SEQUENCES, - instructionSequenceConstants.MATH_ANDROID_SEQUENCES, - }; - - ProgramClass clazz = new ProgramClass(); - clazz.constantPool = instructionSequenceConstants.CONSTANTS; - - for (int setIndex = 0; setIndex < sets.length; setIndex++) - { - Instruction[][][] sequencePairs = sets[setIndex]; - - for (int sequencePairIndex = 0; sequencePairIndex < sequencePairs.length; sequencePairIndex++) - { - Instruction[][] sequencePair = sequencePairs[sequencePairIndex]; - - // Print out the pattern instructions. - Instruction[] sequence = sequencePair[0]; - for (int index = 0; index < sequence.length; index++) - { - Instruction instruction = sequence[index]; - try - { - instruction.accept(clazz, null, null, index, new ClassPrinter()); - } - catch (Exception e) {} - } - - // Are there any replacement instructions? - if (sequencePair.length < 2) - { - System.out.println("=> delete"); - } - else - { - System.out.println("=>"); - - // Print out the replacement instructions. - sequence = sequencePair[1]; - for (int index = 0; index < sequence.length; index++) - { - Instruction instruction = sequence[index]; - try - { - instruction.accept(clazz, null, null, index, new ClassPrinter()); - } - catch (Exception e) {} - } - } - System.out.println(); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequenceReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequenceReplacer.java deleted file mode 100644 index 16cd0ae8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequenceReplacer.java +++ /dev/null @@ -1,875 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; - -/** - * This InstructionVisitor replaces a given pattern instruction sequence by - * another given replacement instruction sequence. The arguments of the - * instruction sequences can be wildcards that are matched and replaced. - * - * The class also supports labels ({@link #label()}) and exception handlers - * ({@link #catch_(int,int,int)}) in replacement sequences. They provide - * local branch offsets inside the replacement sequences - * ({@link Label#offset()}). For example, creating a replacement sequence - * with the help of {@link InstructionSequenceBuilder}: - * - * final InstructionSequenceReplacer.Label TRY_START = InstructionSequenceReplacer.label(); - * final InstructionSequenceReplacer.Label TRY_END = InstructionSequenceReplacer.label(); - * final InstructionSequenceReplacer.Label CATCH_END = InstructionSequenceReplacer.label(); - * - * final InstructionSequenceReplacer.Label CATCH_EXCEPTION = - * InstructionSequenceReplacer.catch_(TRY_START.offset(), - * TRY_END.offset(), - * constantPoolEditor.addClassConstant("java/lang/Exception", null)); - * - * Instructions[] replacementInstructions = builder - * .label(TRY_START) - * ...... - * .label(TRY_END) - * .goto_(CATCH_END.offset()) - * .catch_(CATCH_EXCEPTION) - * ...... - * .athrow() - * .label(CATCH_END) - * ...... - * .instructions(); - * - * - * @see InstructionSequenceMatcher - * @author Eric Lafortune - */ -public class InstructionSequenceReplacer -extends SimplifiedVisitor -implements InstructionVisitor, - ConstantVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = System.getProperty("isr") != null; - //*/ - - public static final int X = InstructionSequenceMatcher.X; - public static final int Y = InstructionSequenceMatcher.Y; - public static final int Z = InstructionSequenceMatcher.Z; - - public static final int A = InstructionSequenceMatcher.A; - public static final int B = InstructionSequenceMatcher.B; - public static final int C = InstructionSequenceMatcher.C; - public static final int D = InstructionSequenceMatcher.D; - public static final int E = InstructionSequenceMatcher.E; - public static final int F = InstructionSequenceMatcher.F; - public static final int G = InstructionSequenceMatcher.G; - public static final int H = InstructionSequenceMatcher.H; - public static final int I = InstructionSequenceMatcher.I; - public static final int J = InstructionSequenceMatcher.J; - public static final int K = InstructionSequenceMatcher.K; - public static final int L = InstructionSequenceMatcher.L; - public static final int M = InstructionSequenceMatcher.M; - public static final int N = InstructionSequenceMatcher.N; - public static final int O = InstructionSequenceMatcher.O; - public static final int P = InstructionSequenceMatcher.P; - public static final int Q = InstructionSequenceMatcher.Q; - public static final int R = InstructionSequenceMatcher.R; - - private static final int LABEL_FLAG = 0x20000000; - - private static final int BOOLEAN_STRING = 0x1; - private static final int CHAR_STRING = 0x2; - private static final int INT_STRING = 0x3; - private static final int LONG_STRING = 0x4; - private static final int FLOAT_STRING = 0x5; - private static final int DOUBLE_STRING = 0x6; - private static final int STRING_STRING = 0x7; - - // Replacement constants that are derived from matched variables. - public static final int STRING_A_LENGTH = 0x20000000; - public static final int BOOLEAN_A_STRING = 0x20000001; - public static final int CHAR_A_STRING = 0x20000002; - public static final int INT_A_STRING = 0x20000003; - public static final int LONG_A_STRING = 0x20000004; - public static final int FLOAT_A_STRING = 0x20000005; - public static final int DOUBLE_A_STRING = 0x20000006; - public static final int STRING_A_STRING = 0x20000007; - public static final int BOOLEAN_B_STRING = 0x20000010; - public static final int CHAR_B_STRING = 0x20000020; - public static final int INT_B_STRING = 0x20000030; - public static final int LONG_B_STRING = 0x20000040; - public static final int FLOAT_B_STRING = 0x20000050; - public static final int DOUBLE_B_STRING = 0x20000060; - public static final int STRING_B_STRING = 0x20000070; - - private static int labelCounter; - - - private final InstructionSequenceMatcher instructionSequenceMatcher; - private final Constant[] patternConstants; - private final Instruction[] replacementInstructions; - private final BranchTargetFinder branchTargetFinder; - private final CodeAttributeEditor codeAttributeEditor; - private final InstructionVisitor extraInstructionVisitor; - - private final MyReplacementInstructionFactory replacementInstructionFactory = new MyReplacementInstructionFactory(); - - - /** - * Creates a new InstructionSequenceReplacer. - * @param patternConstants any constants referenced by the pattern - * instructions. - * @param patternInstructions the pattern instruction sequence. - * @param replacementConstants any constants referenced by the - * replacement instructions. - * @param replacementInstructions the replacement instruction sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - */ - public InstructionSequenceReplacer(Constant[] patternConstants, - Instruction[] patternInstructions, - Constant[] replacementConstants, - Instruction[] replacementInstructions, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor) - { - this(patternConstants, - patternInstructions, - replacementConstants, - replacementInstructions, - branchTargetFinder, - codeAttributeEditor, - null); - } - - - /** - * Creates a new InstructionSequenceReplacer. - * @param patternConstants any constants referenced by the pattern - * instructions. - * @param patternInstructions the pattern instruction sequence. - * @param replacementConstants any constants referenced by the - * replacement instructions. - * @param replacementInstructions the replacement instruction sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all deleted - * load instructions. - */ - public InstructionSequenceReplacer(Constant[] patternConstants, - Instruction[] patternInstructions, - Constant[] replacementConstants, - Instruction[] replacementInstructions, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - this(new InstructionSequenceMatcher(patternConstants, patternInstructions), - patternConstants, - patternInstructions, - replacementConstants, - replacementInstructions, - branchTargetFinder, - codeAttributeEditor, - extraInstructionVisitor); - } - - - - /** - * Creates a new InstructionSequenceReplacer. - * @param instructionSequenceMatcher a suitable instruction sequence matcher. - * @param patternConstants any constants referenced by the pattern - * instructions. - * @param patternInstructions the pattern instruction sequence. - * @param replacementConstants any constants referenced by the - * replacement instructions. - * @param replacementInstructions the replacement instruction sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all deleted - * load instructions. - */ - protected InstructionSequenceReplacer(InstructionSequenceMatcher instructionSequenceMatcher, - Constant[] patternConstants, - Instruction[] patternInstructions, - Constant[] replacementConstants, - Instruction[] replacementInstructions, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - this.instructionSequenceMatcher = instructionSequenceMatcher; - this.patternConstants = patternConstants; - this.replacementInstructions = replacementInstructions; - this.branchTargetFinder = branchTargetFinder; - this.codeAttributeEditor = codeAttributeEditor; - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - // Reset the instruction sequence matcher if the instruction is a branch - // target or if it has already been modified. - if ((branchTargetFinder != null && - branchTargetFinder.isTarget(offset)) || - codeAttributeEditor.isModified(offset)) - { - instructionSequenceMatcher.reset(); - } - - // Try to match the instruction. - instruction.accept(clazz, method, codeAttribute, offset, instructionSequenceMatcher); - - // Did the instruction sequence match and is it still unmodified? - if (instructionSequenceMatcher.isMatching() && - matchedInstructionsUnmodified()) - { - int patternCount = instructionSequenceMatcher.instructionCount(); - int replacementCount = replacementInstructions.length; - - if (DEBUG) - { - System.out.println("InstructionSequenceReplacer: ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.out.println(" Matched:"); - for (int index = 0; index < patternCount; index++) - { - int matchedOffset = instructionSequenceMatcher.matchedInstructionOffset(index); - System.out.println(" "+InstructionFactory.create(codeAttribute.code, matchedOffset).toString(matchedOffset)); - } - System.out.println(" Replacement:"); - for (int index = 0; index < replacementCount; index++) - { - int matchedOffset = instructionSequenceMatcher.matchedInstructionOffset(Math.min(index, patternCount-1)); - System.out.println(" " + replacementInstructionFactory.create(clazz, codeAttribute, index).shrink().toString(matchedOffset)); - } - } - - // Is the replacement sequence shorter than the pattern sequence? - if (replacementCount <= patternCount) - { - // Replace the instruction sequence. - for (int index = 0; index < replacementCount; index++) - { - codeAttributeEditor.replaceInstruction(instructionSequenceMatcher.matchedInstructionOffset(index), - replacementInstructionFactory.create(clazz, codeAttribute, index)); - } - - // Delete any remaining instructions in the matched sequence. - for (int index = replacementCount; index < patternCount; index++) - { - codeAttributeEditor.deleteInstruction(instructionSequenceMatcher.matchedInstructionOffset(index)); - } - } - else - { - // Replace the instruction sequence. - for (int index = 0; index < patternCount; index++) - { - codeAttributeEditor.replaceInstruction(instructionSequenceMatcher.matchedInstructionOffset(index), - replacementInstructionFactory.create(clazz, codeAttribute, index)); - } - - // Append the remaining instructions in the replacement - // sequence. - Instruction[] extraInstructions = new Instruction[replacementCount - patternCount]; - for (int index = 0; index < extraInstructions.length; index++) - { - extraInstructions[index] = replacementInstructionFactory.create(clazz, codeAttribute, patternCount + index); - } - - codeAttributeEditor.insertAfterInstruction(instructionSequenceMatcher.matchedInstructionOffset(patternCount - 1), - extraInstructions); - } - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - instruction.accept(clazz, - method, - codeAttribute, - offset, - extraInstructionVisitor); - } - } - } - - - // Small utility methods. - - /** - * Returns whether the matched pattern instructions haven't been modified - * before. - */ - private boolean matchedInstructionsUnmodified() - { - for (int index = 0; index < instructionSequenceMatcher.instructionCount(); index++) - { - if (codeAttributeEditor.isModified(instructionSequenceMatcher.matchedInstructionOffset(index))) - { - return false; - } - } - - return true; - } - - - /** - * This class creates replacement instructions for matched sequences, with - * any matched arguments filled out. - */ - private class MyReplacementInstructionFactory - implements InstructionVisitor - { - private Instruction replacementInstruction; - - - /** - * Creates the replacement instruction for the given index in the - * instruction sequence. - */ - public Instruction create(Clazz clazz, CodeAttribute codeAttribute, int index) - { - int matchedInstructionIndex = - index < instructionSequenceMatcher.instructionCount() ? - index : - instructionSequenceMatcher.instructionCount() - 1; - - int matchedInstructionOffset = - instructionSequenceMatcher.matchedInstructionOffset(matchedInstructionIndex); - - // Create the instruction. - replacementInstructions[index].accept(clazz, - null, - codeAttribute, - matchedInstructionOffset, - this); - - // Return it. - return replacementInstruction; - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - replacementInstruction = - new SimpleInstruction(simpleInstruction.opcode, - matchedArgument(clazz, method, codeAttribute, offset, simpleInstruction.constant)); - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - replacementInstruction = - new VariableInstruction(variableInstruction.opcode, - matchedArgument(clazz, method, codeAttribute, offset, variableInstruction.variableIndex), - instructionSequenceMatcher.matchedArgument(variableInstruction.constant)); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - replacementInstruction = - new ConstantInstruction(constantInstruction.opcode, - matchedConstantIndex((ProgramClass)clazz, - constantInstruction.constantIndex), - instructionSequenceMatcher.matchedArgument(constantInstruction.constant)); - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - replacementInstruction = - new BranchInstruction(branchInstruction.opcode, - matchedBranchOffset(offset, branchInstruction.branchOffset)); - } - - - public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) - { - replacementInstruction = - new TableSwitchInstruction(tableSwitchInstruction.opcode, - matchedBranchOffset(offset, tableSwitchInstruction.defaultOffset), - instructionSequenceMatcher.matchedArgument(tableSwitchInstruction.lowCase), - instructionSequenceMatcher.matchedArgument(tableSwitchInstruction.highCase), - matchedJumpOffsets(offset, tableSwitchInstruction.jumpOffsets)); - - } - - - public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) - { - replacementInstruction = - new LookUpSwitchInstruction(lookUpSwitchInstruction.opcode, - matchedBranchOffset(offset, lookUpSwitchInstruction.defaultOffset), - instructionSequenceMatcher.matchedArguments(lookUpSwitchInstruction.cases), - matchedJumpOffsets(offset, lookUpSwitchInstruction.jumpOffsets)); - } - - - // Similar methods for pseudo-instructions. - - public void visitLabelInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Label label) - { - // Convert this pseudo-instruction into a corresponding - // pseudo-instruction for the code attribute editor. - // Then make sure we create a unique label, because - // there may be other matching sequences. - replacementInstruction = - codeAttributeEditor.label(uniqueLabel(label.identifier)); - } - - - public void visitCatchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Catch catch_) - { - // Convert this pseudo-instruction into a corresponding - // pseudo-instruction for the code attribute editor. - // Then make sure we create and reference unique labels, - // because there may be other matching sequences. - replacementInstruction = - codeAttributeEditor.catch_(uniqueLabel(catch_.identifier), - uniqueLabel(catch_.startOfffset), - uniqueLabel(catch_.endOffset), - matchedConstantIndex((ProgramClass)clazz, - catch_.catchType)); - } - } - - - /** - * Returns the matched argument for the given pattern argument. - */ - protected int matchedArgument(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int argument) - { - return matchedArgument(clazz, argument); - } - - - /** - * Returns the matched argument for the given pattern argument. - */ - protected int matchedArgument(Clazz clazz, int argument) - { - // Special case: do we have to compute the string length? - if (argument == STRING_A_LENGTH) - { - // Return the string length. - return clazz.getStringString(instructionSequenceMatcher.matchedArgument(A)).length(); - } - - // Otherwise, just return the matched argument. - return instructionSequenceMatcher.matchedArgument(argument); - } - - - /** - * Returns the matched or newly created constant index for the given - * pattern constant index. - */ - protected int matchedConstantIndex(ProgramClass programClass, int constantIndex) - { - // Special case: do we have to create a concatenated string? - if (constantIndex >= BOOLEAN_A_STRING && - constantIndex <= (STRING_A_STRING | STRING_B_STRING)) - { - // Create a new string constant and return its index. - return new ConstantPoolEditor(programClass).addStringConstant( - argumentAsString(programClass, constantIndex & 0xf, A) + - argumentAsString(programClass, (constantIndex >>> 4) & 0xf, B), - null, - null); - } - - int matchedConstantIndex = - instructionSequenceMatcher.matchedConstantIndex(constantIndex); - - // Do we have a matched constant index? - if (matchedConstantIndex > 0) - { - // Return its index. - return matchedConstantIndex; - } - - // Otherwise, we still have to create a new constant. - // This currently only works for constants without any wildcards. - ProgramClass dummyClass = new ProgramClass(); - dummyClass.constantPool = patternConstants; - - return new ConstantAdder(programClass).addConstant(dummyClass, constantIndex); - } - - - /** - * Returns the value of the specified matched branch offset. - */ - protected int matchedBranchOffset(int offset, int branchOffset) - { - // Special case: is it a label? - if (isLabel(branchOffset)) - { - // Then make sure we reference a unique label, because - // there may be other matching sequences. - return uniqueLabel(branchOffset); - } - - // Otherwise, just return the matched branch offset. - return instructionSequenceMatcher.matchedBranchOffset(offset, branchOffset); - } - - - /** - * Returns the values of the specified matched jump offsets. - */ - protected int[] matchedJumpOffsets(int offset, int[] jumpOffsets) - { - // Special cases: are there any labels? - for (int index = 0; index < jumpOffsets.length; index++) - { - if (isLabel(jumpOffsets[index])) - { - // Then make sure we reference a unique label, because - // there may be other matching sequences. - jumpOffsets[index] = uniqueLabel(jumpOffsets[index]); - } - } - - // Match any other jump offsets. - return instructionSequenceMatcher.matchedJumpOffsets(offset, jumpOffsets); - } - - - private String argumentAsString(ProgramClass programClass, - int valueType, - int argument) - { - switch (valueType) - { - case BOOLEAN_STRING: - return Boolean.toString((wasConstant(argument) ? - ((IntegerConstant)matchedConstant(programClass, argument)).getValue() : - matchedArgument(argument)) != 0); - - case CHAR_STRING: - return Character.toString((char)(wasConstant(argument) ? - ((IntegerConstant)(matchedConstant(programClass, argument))).getValue() : - matchedArgument(argument))); - - case INT_STRING: - return Integer.toString(wasConstant(argument) ? - ((IntegerConstant)(matchedConstant(programClass, argument))).getValue() : - matchedArgument(argument)); - - case LONG_STRING: - return Long.toString(wasConstant(argument) ? - ((LongConstant)(matchedConstant(programClass, argument))).getValue() : - matchedArgument(argument)); - - case FLOAT_STRING: - return Float.toString(wasConstant(argument) ? - ((FloatConstant)(matchedConstant(programClass, argument))).getValue() : - matchedArgument(argument)); - - case DOUBLE_STRING: - return Double.toString(wasConstant(argument) ? - ((DoubleConstant)(matchedConstant(programClass, argument))).getValue() : - matchedArgument(argument)); - - case STRING_STRING: - return - programClass.getStringString(instructionSequenceMatcher.matchedConstantIndex(argument)); - - default: - return ""; - } - } - - - protected InstructionSequenceMatcher getInstructionSequenceMatcher() - { - return instructionSequenceMatcher; - } - - - protected boolean wasConstant(int argument) - { - return instructionSequenceMatcher.wasConstant(argument); - } - - - protected Constant matchedConstant(ProgramClass programClass, - int argument) - { - return programClass.getConstant(instructionSequenceMatcher.matchedConstantIndex(argument)); - } - - - protected int matchedArgument(int argument) - { - return instructionSequenceMatcher.matchedArgument(argument); - } - - - /** - * Makes the given label identifier or offset unique for the current - * matching instruction sequence. - */ - private int uniqueLabel(int labelIdentifier) - { - return labelIdentifier | - (instructionSequenceMatcher.matchedInstructionOffset(0) << 8); - } - - - // For convenience, we also define two pseudo-instructions, to conveniently - // mark local labels and create new exceptions handlers. - - /** - * Creates a new label that can be used as a pseudo-instruction to mark - * a local offset. Its offset can be used as a branch target in - * replacement instructions ({@link Label#offset()}). - */ - public static Label label() - { - return new Label(labelCounter++); - } - - - /** - * Creates a new catch instance that can be used as a pseudo-instruction - * to mark the start of an exception handler. Its offset can be used as - * a branch target in replacement instructions ({@link Label#offset()}). - */ - public static Label catch_(int startOffset, - int endOffset, - int catchType) - { - return new Catch(labelCounter++, - startOffset, - endOffset, - catchType); - } - - - /** - * Returns whether the given instruction offset actually represents a - * label (which contains the actual offset). - */ - private static boolean isLabel(int instructionOffset) - { - return (instructionOffset & 0xff000000) == LABEL_FLAG; - } - - - /** - * This pseudo-instruction represents a label that marks an instruction - * offset, for use in the context of the sequence replacer only. - */ - public static class Label - extends Instruction - { - protected final int identifier; - - - /** - * Creates a new Label. - * @param identifier an identifier that can be chosen freely. - */ - private Label(int identifier) - { - this.identifier = identifier; - } - - - /** - * Returns the offset that can then be used as a branch target in - * other replacement instructions. - */ - public int offset() - { - return LABEL_FLAG | identifier; - } - - - // Implementations for Instruction. - - public Instruction shrink() - { - return this; - } - - - public void write(byte[] code, int offset) - { - } - - - protected void readInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't read label instruction"); - } - - - protected void writeInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't write label instruction"); - } - - - public int length(int offset) - { - return 0; - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - // Since this is not a standard instruction, it only works with - // our own instruction visitor. - MyReplacementInstructionFactory replacementInstructionFactory = - (MyReplacementInstructionFactory)instructionVisitor; - - replacementInstructionFactory.visitLabelInstruction(clazz, - method, - codeAttribute, - offset, - this); - } - - - // Implementations for Object. - - public String toString() - { - return "label_"+offset(); - } - } - - - /** - * This pseudo-instruction represents an exception handler, - * for use in the context of the sequence replacer only. - */ - private static class Catch - extends Label - { - private final int startOfffset; - private final int endOffset; - private final int catchType; - - - /** - * Creates a new Catch instance. - * @param identifier an identifier that can be chosen freely. - * @param startOffset the start offset of the catch block. - * @param endOffset the end offset of the catch block. - * @param catchType the index of the catch type in the constant pool. - */ - private Catch(int identifier, - int startOffset, - int endOffset, - int catchType) - { - super(identifier); - - this.startOfffset = startOffset; - this.endOffset = endOffset; - this.catchType = catchType; - } - - - // Implementations for Instruction. - - public Instruction shrink() - { - return this; - } - - - public void write(byte[] code, int offset) - { - } - - - protected void readInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't read catch instruction"); - } - - - protected void writeInfo(byte[] code, int offset) - { - throw new UnsupportedOperationException("Can't write catch instruction"); - } - - - public int length(int offset) - { - return super.length(offset); - } - - - public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor) - { - // Since this is not a standard instruction, it only works with - // our own instruction visitor. - MyReplacementInstructionFactory replacementInstructionFactory = - (MyReplacementInstructionFactory)instructionVisitor; - - replacementInstructionFactory.visitCatchInstruction(clazz, - method, - codeAttribute, - offset, - this); - } - - - // Implementations for Object. - - public String toString() - { - return "catch " + - (isLabel(startOfffset) ? "label_" : "") + startOfffset + ", " + - (isLabel(endOffset) ? "label_" : "") + endOffset + ", #" + - catchType; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequencesReplacer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequencesReplacer.java deleted file mode 100644 index faa27fd5..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/InstructionSequencesReplacer.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.constant.Constant; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.*; - -/** - * This InstructionVisitor replaces multiple instruction sequences at once. - * - * The replacement sequences are optional, defaulting to the empty sequence, - * to delete the matched pattern sequences. - * - * @see InstructionSequenceReplacer - * @author Eric Lafortune - */ -public class InstructionSequencesReplacer -extends MultiInstructionVisitor -implements InstructionVisitor -{ - private static final int PATTERN_INDEX = 0; - private static final int REPLACEMENT_INDEX = 1; - - private static final Instruction[] EMPTY_INSTRUCTIONS = new Instruction[0]; - - - /** - * Creates a new InstructionSequencesReplacer. - * @param constants any constants referenced by the pattern - * instructions and replacement instructions. - * @param instructionSequences the instruction sequences to be replaced, - * with subsequently the sequence pair index, - * the patten/replacement index (0 or 1), - * and the instruction index in the sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - */ - public InstructionSequencesReplacer(Constant[] constants, - Instruction[][][] instructionSequences, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor) - { - this(constants, - instructionSequences, - branchTargetFinder, - codeAttributeEditor, - null); - } - - - /** - * Creates a new InstructionSequenceReplacer. - * @param constants any constants referenced by the pattern - * instructions and replacement instructions. - * @param instructionSequences the instruction sequences to be replaced, - * with subsequently the sequence pair index, - * the patten/replacement index (0 or 1), - * and the instruction index in the sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all deleted - * load instructions. - */ - public InstructionSequencesReplacer(Constant[] constants, - Instruction[][][] instructionSequences, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - super(createInstructionSequenceReplacers(constants, - instructionSequences, - branchTargetFinder, - codeAttributeEditor, - extraInstructionVisitor)); - } - - - /** - * Creates an array of InstructionSequenceReplacer instances. - * @param constants any constants referenced by the pattern - * instructions and replacement instructions. - * @param instructionSequences the instruction sequences to be replaced, - * with subsequently the sequence pair index, - * the from/to index (0 or 1), and the - * instruction index in the sequence. - * @param branchTargetFinder a branch target finder that has been - * initialized to indicate branch targets - * in the visited code. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all deleted - * load instructions. - */ - private static InstructionVisitor[] createInstructionSequenceReplacers(Constant[] constants, - Instruction[][][] instructionSequences, - BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - InstructionVisitor[] instructionSequenceReplacers = - new InstructionVisitor[instructionSequences.length]; - - for (int index = 0; index < instructionSequenceReplacers.length; index++) - { - Instruction[][] instructionSequencePair = - instructionSequences[index]; - - Instruction[] patternInstructions = - instructionSequencePair[PATTERN_INDEX]; - - // The replacement sequence is optional. - Instruction[] replacementInstructions = - instructionSequencePair.length > REPLACEMENT_INDEX ? - instructionSequencePair[REPLACEMENT_INDEX] : - EMPTY_INSTRUCTIONS; - - instructionSequenceReplacers[index] = - new InstructionSequenceReplacer(constants, - patternInstructions, - constants, - replacementInstructions, - branchTargetFinder, - codeAttributeEditor, - extraInstructionVisitor); - } - - return instructionSequenceReplacers; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/LineNumberLinearizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/LineNumberLinearizer.java deleted file mode 100644 index a8772615..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/LineNumberLinearizer.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.util.*; - -/** - * This ClassVisitor disambiguates line numbers, in the classes that it - * visits. It shifts line numbers that originate from different classes - * (e.g. due to method inlining or class merging) to blocks that don't - * overlap with the main line numbers and with each other. The line numbers - * then uniquely identify the inlined and merged code in the classes. - * - * @author Eric Lafortune - */ -public class LineNumberLinearizer -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor, - LineNumberInfoVisitor -{ - private static final boolean DEBUG = false; - - public static final int SHIFT_ROUNDING = 1000; - private static final int SHIFT_ROUNDING_LIMIT = 50000; - - - private Stack enclosingLineNumbers = new Stack(); - private LineNumberInfo previousLineNumberInfo; - private int highestUsedLineNumber; - private int currentLineNumberShift; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Find the highest line number in the entire class. - LineNumberRangeFinder lineNumberRangeFinder = - new LineNumberRangeFinder(); - - programClass.methodsAccept(new AllAttributeVisitor(true, - new AllLineNumberInfoVisitor( - lineNumberRangeFinder))); - - // Are there any inlined line numbers? - if (lineNumberRangeFinder.hasSource()) - { - // Remember the minimum initial shift. - highestUsedLineNumber = lineNumberRangeFinder.getHighestLineNumber(); - - // Shift the inlined line numbers. - programClass.methodsAccept(this); - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - programMethod.attributesAccept(programClass, this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - if (DEBUG) - { - System.out.println("LineNumberLinearizer ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]:"); - } - - enclosingLineNumbers.clear(); - previousLineNumberInfo = null; - - // Process all line numbers. - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this); - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - String source = lineNumberInfo.getSource(); - - if (DEBUG) - { - System.out.print(" [" + lineNumberInfo.u2startPC + "] line " + lineNumberInfo.u2lineNumber + (source == null ? "" : " [" + source + "]")); - } - - // Is it an inlined line number? - if (source != null) - { - ExtendedLineNumberInfo extendedLineNumberInfo = - (ExtendedLineNumberInfo)lineNumberInfo; - - int lineNumber = extendedLineNumberInfo.u2lineNumber; - - // Are we entering or exiting a new inlined block? - if (previousLineNumberInfo == null || - previousLineNumberInfo.getSource() != source) - { - // Are we entering a new inlined block? - if (lineNumber != MethodInliner.INLINED_METHOD_END_LINE_NUMBER) - { - // Remember information about the inlined block. - enclosingLineNumbers.push(previousLineNumberInfo != null ? - new MyLineNumberBlock(currentLineNumberShift, - previousLineNumberInfo.u2lineNumber, - previousLineNumberInfo.getSource()) : - new MyLineNumberBlock(0, 0, null)); - - // Parse the end line number from the source string, - // so we know how large a block this will be. - int separatorIndex1 = source.indexOf(':'); - int separatorIndex2 = source.indexOf(':', separatorIndex1 + 1); - - int startLineNumber = Integer.parseInt(source.substring(separatorIndex1 + 1, separatorIndex2)); - int endLineNumber = Integer.parseInt(source.substring(separatorIndex2 + 1)); - - // Start shifting, if necessary, so the block ends up beyond - // the highest used line number. We're striving for rounded - // shifts, unless we've reached a given limit, to avoid - // running out of line numbers too quickly. - currentLineNumberShift = - highestUsedLineNumber > SHIFT_ROUNDING_LIMIT ? - highestUsedLineNumber - startLineNumber + 1 : - startLineNumber > highestUsedLineNumber ? 0 : - (highestUsedLineNumber - startLineNumber + SHIFT_ROUNDING) - / SHIFT_ROUNDING * SHIFT_ROUNDING; - - highestUsedLineNumber = endLineNumber + currentLineNumberShift; - - if (DEBUG) - { - System.out.print(" (enter with shift "+currentLineNumberShift+")"); - } - - // Apply the shift. - lineNumberInfo.u2lineNumber += currentLineNumberShift; - } - - // TODO: There appear to be cases where the stack is empty at this point, so we've added a check. - else if (enclosingLineNumbers.isEmpty()) - { - if (DEBUG) - { - System.err.println("Problem linearizing line numbers for optimized code ("+clazz.getName()+"."+method.getName(clazz)+")"); - } - } - - // Are we exiting an inlined block? - else - { - // Pop information about the enclosing line number. - MyLineNumberBlock lineNumberBlock = - (MyLineNumberBlock)enclosingLineNumbers.pop(); - - // Set this end of the block to the line at which it was - // inlined. - extendedLineNumberInfo.u2lineNumber = lineNumberBlock.enclosingLineNumber; - extendedLineNumberInfo.source = lineNumberBlock.enclosingSource; - - // Reset the shift to the shift of the block. - currentLineNumberShift = lineNumberBlock.lineNumberShift; - - if (DEBUG) - { - System.out.print(" (exit to shift "+currentLineNumberShift+")"); - } - } - } - else - { - if (DEBUG) - { - System.out.print(" (apply shift "+currentLineNumberShift+")"); - } - - // Apply the shift. - lineNumberInfo.u2lineNumber += currentLineNumberShift; - } - } - - previousLineNumberInfo = lineNumberInfo; - - if (DEBUG) - { - System.out.println(" -> line " + lineNumberInfo.u2lineNumber); - } - } - - - /** - * This class represents a block of line numbers that originates from the - * same inlined method. - */ - private static class MyLineNumberBlock - { - public final int lineNumberShift; - public final int enclosingLineNumber; - public final String enclosingSource; - - public MyLineNumberBlock(int lineNumberShift, - int enclosingLineNumber, - String enclosingSource) - { - this.lineNumberShift = lineNumberShift; - this.enclosingLineNumber = enclosingLineNumber; - this.enclosingSource = enclosingSource; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MemberPrivatizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MemberPrivatizer.java deleted file mode 100644 index 027fa073..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MemberPrivatizer.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.editor.MethodInvocationFixer; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.info.NonPrivateMemberMarker; - -/** - * This MemberVisitor makes all class members that it visits private, unless - * they have been marked by a NonPrivateMemberMarker. The invocations of - * privatized methods still have to be fixed. - * - * @see NonPrivateMemberMarker - * @see MethodInvocationFixer - * @author Eric Lafortune - */ -public class MemberPrivatizer -extends SimplifiedVisitor -implements MemberVisitor -{ - private final MemberVisitor extraMemberVisitor; - - - /** - * Creates a new MemberPrivatizer. - */ - public MemberPrivatizer() - { - this(null); - } - - - /** - * Creates a new MemberPrivatizer. - * @param extraMemberVisitor an optional extra visitor for all privatized - * class members. - */ - public MemberPrivatizer(MemberVisitor extraMemberVisitor) - { - this.extraMemberVisitor = extraMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Is the field unmarked? - if (NonPrivateMemberMarker.canBeMadePrivate(programField)) - { - // Make the field private. - programField.u2accessFlags = - AccessUtil.replaceAccessFlags(programField.u2accessFlags, - ClassConstants.ACC_PRIVATE); - - // Visit the field, if required. - if (extraMemberVisitor != null) - { - extraMemberVisitor.visitProgramField(programClass, programField); - } - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Is the method unmarked? - if (NonPrivateMemberMarker.canBeMadePrivate(programMethod)) - { - // Make the method private and no longer final. - programMethod.u2accessFlags = - AccessUtil.replaceAccessFlags(programMethod.u2accessFlags, - ClassConstants.ACC_PRIVATE); - - // Visit the method, if required. - if (extraMemberVisitor != null) - { - extraMemberVisitor.visitProgramMethod(programClass, programMethod); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MethodFinalizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MethodFinalizer.java deleted file mode 100644 index 7ba5c874..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MethodFinalizer.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.KeepMarker; - -/** - * This MemberVisitor makes the program methods that it visits - * final, if possible. - * - * @author Eric Lafortune - */ -public class MethodFinalizer -extends SimplifiedVisitor -implements MemberVisitor -{ - private final MemberVisitor extraMemberVisitor; - - private final MemberFinder memberFinder = new MemberFinder(); - - - /** - * Creates a new ClassFinalizer. - */ - public MethodFinalizer() - { - this(null); - } - - - /** - * Creates a new ClassFinalizer. - * @param extraMemberVisitor an optional extra visitor for all finalized - * methods. - */ - public MethodFinalizer(MemberVisitor extraMemberVisitor) - { - this.extraMemberVisitor = extraMemberVisitor; - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - String name = programMethod.getName(programClass); - - // If the method is not already private/static/final/abstract, - // and it is not a constructor, - // and its class is final, - // or it is not being kept and it is not overridden, - // then make it final. - if ((programMethod.u2accessFlags & (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC | - ClassConstants.ACC_FINAL | - ClassConstants.ACC_ABSTRACT)) == 0 && - !name.equals(ClassConstants.METHOD_NAME_INIT) && - ((programClass.u2accessFlags & ClassConstants.ACC_FINAL) != 0 || - (!KeepMarker.isKept(programMethod) && - (programClass.subClasses == null || - !memberFinder.isOverriden(programClass, programMethod))))) - { - programMethod.u2accessFlags |= ClassConstants.ACC_FINAL; - - // Visit the method, if required. - if (extraMemberVisitor != null) - { - extraMemberVisitor.visitProgramMethod(programClass, programMethod); - } - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MethodInliner.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MethodInliner.java deleted file mode 100644 index 67ec01e9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/MethodInliner.java +++ /dev/null @@ -1,743 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; -import proguard.optimize.*; -import proguard.optimize.info.*; - -import java.util.Stack; - -/** - * This AttributeVisitor inlines short methods or methods that are only invoked - * once, in the code attributes that it visits. - * - * @author Eric Lafortune - */ -public class MethodInliner -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - MemberVisitor, - ExceptionInfoVisitor, - LineNumberInfoVisitor -{ - private static final int MAXIMUM_INLINED_CODE_LENGTH_JVM = Integer.parseInt(System.getProperty("maximum.inlined.code.length", "8")); - private static final int MAXIMUM_INLINED_CODE_LENGTH_android= Integer.parseInt(System.getProperty("maximum.inlined.code.length", "32")); - private static final int MAXIMUM_RESULTING_CODE_LENGTH_JSE = Integer.parseInt(System.getProperty("maximum.resulting.code.length", "7000")); - private static final int MAXIMUM_RESULTING_CODE_LENGTH_JME = Integer.parseInt(System.getProperty("maximum.resulting.code.length", "2000")); - - static final int METHOD_DUMMY_START_LINE_NUMBER = 0; - static final int INLINED_METHOD_END_LINE_NUMBER = -1; - - //* - private static final boolean DEBUG = false; - /*/ - public static boolean DEBUG = System.getProperty("mi") != null; - //*/ - - - private final boolean microEdition; - private final boolean android; - private final boolean allowAccessModification; - private final boolean inlineSingleInvocations; - private final InstructionVisitor extraInlinedInvocationVisitor; - - private final CodeAttributeComposer codeAttributeComposer = new CodeAttributeComposer(); - private final MemberVisitor accessMethodMarker = new OptimizationInfoMemberFilter( - new AllAttributeVisitor( - new AllInstructionVisitor( - new MultiInstructionVisitor( - new SuperInvocationMarker(), - new AccessMethodMarker() - )))); - private final AttributeVisitor methodInvocationMarker = new AllInstructionVisitor( - new MethodInvocationMarker()); - private final StackSizeComputer stackSizeComputer = new StackSizeComputer(); - - private ProgramClass targetClass; - private ProgramMethod targetMethod; - private ConstantAdder constantAdder; - private ExceptionInfoAdder exceptionInfoAdder; - private int estimatedResultingCodeLength; - private boolean inlining; - private Stack inliningMethods = new Stack(); - private boolean emptyInvokingStack; - private boolean coveredByCatchAllHandler; - private int exceptionInfoCount; - private int uninitializedObjectCount; - private int variableOffset; - private boolean inlined; - private boolean inlinedAny; - private boolean copiedLineNumbers; - private String source; - private int minimumLineNumberIndex; - - - /** - * Creates a new MethodInliner. - * @param microEdition indicates whether the resulting code is - * targeted at Java Micro Edition. - * @param android indicates whether the resulting code is - * targeted at the androidVM. - * @param allowAccessModification indicates whether the access modifiers of - * classes and class members can be changed - * in order to inline methods. - * @param inlineSingleInvocations indicates whether the single invocations - * should be inlined, or, alternatively, - * short methods. - */ - public MethodInliner(boolean microEdition, - boolean android, - boolean allowAccessModification, - boolean inlineSingleInvocations) - { - this(microEdition, - android, - allowAccessModification, - inlineSingleInvocations, - null); - } - - - /** - * Creates a new MethodInliner. - * @param microEdition indicates whether the resulting code is - * targeted at Java Micro Edition. - * @param android indicates whether the resulting code is - * targeted at the androidVM. - * @param allowAccessModification indicates whether the access modifiers of - * classes and class members can be changed - * in order to inline methods. - * @param inlineSingleInvocations indicates whether the single invocations - * should be inlined, or, alternatively, - * short methods. - * @param extraInlinedInvocationVisitor an optional extra visitor for all - * inlined invocation instructions. - */ - public MethodInliner(boolean microEdition, - boolean android, - boolean allowAccessModification, - boolean inlineSingleInvocations, - InstructionVisitor extraInlinedInvocationVisitor) - { - this.microEdition = microEdition; - this.android = android; - this.allowAccessModification = allowAccessModification; - this.inlineSingleInvocations = inlineSingleInvocations; - this.extraInlinedInvocationVisitor = extraInlinedInvocationVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // TODO: Remove this when the method inliner has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while inlining method:"); - System.err.println(" Target class = ["+targetClass.getName()+"]"); - System.err.println(" Target method = ["+targetMethod.getName(targetClass)+targetMethod.getDescriptor(targetClass)+"]"); - if (inlining) - { - System.err.println(" Inlined class = ["+clazz.getName()+"]"); - System.err.println(" Inlined method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - } - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - ex.printStackTrace(); - System.err.println("Not inlining this method"); - - if (DEBUG) - { - targetMethod.accept(targetClass, new ClassPrinter()); - if (inlining) - { - method.accept(clazz, new ClassPrinter()); - } - - throw ex; - } - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (!inlining) - { -// codeAttributeComposer.DEBUG = DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - targetClass = (ProgramClass)clazz; - targetMethod = (ProgramMethod)method; - constantAdder = new ConstantAdder(targetClass); - exceptionInfoAdder = new ExceptionInfoAdder(targetClass, codeAttributeComposer); - estimatedResultingCodeLength = codeAttribute.u4codeLength; - inliningMethods.clear(); - uninitializedObjectCount = method.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT) ? 1 : 0; - inlinedAny = false; - codeAttributeComposer.reset(); - stackSizeComputer.visitCodeAttribute(clazz, method, codeAttribute); - - // Append the body of the code. - copyCode(clazz, method, codeAttribute); - - // Update the code attribute if any code has been inlined. - if (inlinedAny) - { - codeAttributeComposer.visitCodeAttribute(clazz, method, codeAttribute); - - // Update the super/private/package/protected accessing flags. - method.accept(clazz, accessMethodMarker); - } - - targetClass = null; - targetMethod = null; - constantAdder = null; - } - - // Only inline the method if it is invoked once or if it is short. - else if ((inlineSingleInvocations ? - MethodInvocationMarker.getInvocationCount(method) == 1 : - codeAttribute.u4codeLength <= - (android? - MAXIMUM_INLINED_CODE_LENGTH_android: - MAXIMUM_INLINED_CODE_LENGTH_JVM)) && - estimatedResultingCodeLength + codeAttribute.u4codeLength < - (microEdition ? - MAXIMUM_RESULTING_CODE_LENGTH_JME : - MAXIMUM_RESULTING_CODE_LENGTH_JSE)) - { - if (DEBUG) - { - System.out.println("MethodInliner: inlining ["+ - clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"] in ["+ - targetClass.getName()+"."+targetMethod.getName(targetClass)+targetMethod.getDescriptor(targetClass)+"]"); - } - - // Ignore the removal of the original method invocation, - // the addition of the parameter setup, and - // the modification of a few inlined instructions. - estimatedResultingCodeLength += codeAttribute.u4codeLength; - - // Append instructions to store the parameters. - storeParameters(clazz, method); - - // Inline the body of the code. - copyCode(clazz, method, codeAttribute); - - inlined = true; - inlinedAny = true; - } - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - // Remember the source if we're inlining a method. - source = inlining ? - clazz.getName() + '.' + - method.getName(clazz) + - method.getDescriptor(clazz) + ':' + - lineNumberTableAttribute.getLowestLineNumber() + ':' + - lineNumberTableAttribute.getHighestLineNumber() : - null; - - // Insert all line numbers, possibly partly before previously inserted - // line numbers. - lineNumberTableAttribute.lineNumbersAccept(clazz, method, codeAttribute, this); - - copiedLineNumbers = true; - } - - - /** - * Appends instructions to pop the parameters for the given method, storing - * them in new local variables. - */ - private void storeParameters(Clazz clazz, Method method) - { - String descriptor = method.getDescriptor(clazz); - - boolean isStatic = - (method.getAccessFlags() & ClassConstants.ACC_STATIC) != 0; - - // Count the number of parameters, taking into account their categories. - int parameterCount = ClassUtil.internalMethodParameterCount(descriptor); - int parameterSize = ClassUtil.internalMethodParameterSize(descriptor); - int parameterOffset = isStatic ? 0 : 1; - - // Store the parameter types. - String[] parameterTypes = new String[parameterSize]; - - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(descriptor); - - for (int parameterIndex = 0; parameterIndex < parameterSize; parameterIndex++) - { - String parameterType = internalTypeEnumeration.nextType(); - parameterTypes[parameterIndex] = parameterType; - if (ClassUtil.internalTypeSize(parameterType) == 2) - { - parameterIndex++; - } - } - - codeAttributeComposer.beginCodeFragment(parameterSize+1); - - // Go over the parameter types backward, storing the stack entries - // in their corresponding variables. - for (int parameterIndex = parameterSize-1; parameterIndex >= 0; parameterIndex--) - { - String parameterType = parameterTypes[parameterIndex]; - if (parameterType != null) - { - byte opcode; - switch (parameterType.charAt(0)) - { - case ClassConstants.TYPE_BOOLEAN: - case ClassConstants.TYPE_BYTE: - case ClassConstants.TYPE_CHAR: - case ClassConstants.TYPE_SHORT: - case ClassConstants.TYPE_INT: - opcode = InstructionConstants.OP_ISTORE; - break; - - case ClassConstants.TYPE_LONG: - opcode = InstructionConstants.OP_LSTORE; - break; - - case ClassConstants.TYPE_FLOAT: - opcode = InstructionConstants.OP_FSTORE; - break; - - case ClassConstants.TYPE_DOUBLE: - opcode = InstructionConstants.OP_DSTORE; - break; - - default: - opcode = InstructionConstants.OP_ASTORE; - break; - } - - codeAttributeComposer.appendInstruction(parameterSize-parameterIndex-1, - new VariableInstruction(opcode, variableOffset + parameterOffset + parameterIndex)); - } - } - - // Put the 'this' reference in variable 0 (plus offset). - if (!isStatic) - { - codeAttributeComposer.appendInstruction(parameterSize, - new VariableInstruction(InstructionConstants.OP_ASTORE, variableOffset)); - } - - codeAttributeComposer.endCodeFragment(); - } - - - /** - * Appends the code of the given code attribute. - */ - private void copyCode(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // The code may expand, due to expanding constant and variable - // instructions. - codeAttributeComposer.beginCodeFragment(codeAttribute.u4codeLength); - - // Copy the instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Append a label just after the code. - codeAttributeComposer.appendLabel(codeAttribute.u4codeLength); - - // Copy the exceptions. - codeAttribute.exceptionsAccept(clazz, method, exceptionInfoAdder); - - // Copy the line numbers. - copiedLineNumbers = false; - - // The line numbers need to be inserted sequentially. - minimumLineNumberIndex = 0; - - codeAttribute.attributesAccept(clazz, method, this); - - // Make sure we at least have some entry at the start of the method. - if (!copiedLineNumbers) - { - String source = inlining ? - clazz.getName() + '.' + - method.getName(clazz) + - method.getDescriptor(clazz) + - ":0:0" : - null; - - minimumLineNumberIndex = - codeAttributeComposer.insertLineNumber(minimumLineNumberIndex, - new ExtendedLineNumberInfo(0, - METHOD_DUMMY_START_LINE_NUMBER, - source)) + 1; - } - - // Add a marker at the end of an inlined method. - // The marker will be corrected in LineNumberLinearizer, - // so it points to the line of the enclosing method. - if (inlining) - { - String source = - clazz.getName() + '.' + - method.getName(clazz) + - method.getDescriptor(clazz) + - ":0:0"; - - minimumLineNumberIndex = - codeAttributeComposer.insertLineNumber(minimumLineNumberIndex, - new ExtendedLineNumberInfo(codeAttribute.u4codeLength, - INLINED_METHOD_END_LINE_NUMBER, - source)) + 1; - } - - codeAttributeComposer.endCodeFragment(); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - codeAttributeComposer.appendInstruction(offset, instruction); - } - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - // Are we inlining this instruction? - if (inlining) - { - // Replace any return instructions by branches to the end of the code. - switch (simpleInstruction.opcode) - { - case InstructionConstants.OP_IRETURN: - case InstructionConstants.OP_LRETURN: - case InstructionConstants.OP_FRETURN: - case InstructionConstants.OP_DRETURN: - case InstructionConstants.OP_ARETURN: - case InstructionConstants.OP_RETURN: - // Are we not at the last instruction? - if (offset < codeAttribute.u4codeLength-1) - { - // Replace the return instruction by a branch instruction. - Instruction branchInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO_W, - codeAttribute.u4codeLength - offset); - - codeAttributeComposer.appendInstruction(offset, - branchInstruction); - } - else - { - // Just leave out the instruction, but put in a label, - // for the sake of any other branch instructions. - codeAttributeComposer.appendLabel(offset); - } - - return; - } - } - - codeAttributeComposer.appendInstruction(offset, simpleInstruction); - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - // Are we inlining this instruction? - if (inlining) - { - // Update the variable index. - variableInstruction.variableIndex += variableOffset; - } - - codeAttributeComposer.appendInstruction(offset, variableInstruction); - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - // Is it a method invocation? - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_NEW: - uninitializedObjectCount++; - break; - - case InstructionConstants.OP_INVOKEVIRTUAL: - case InstructionConstants.OP_INVOKESPECIAL: - case InstructionConstants.OP_INVOKESTATIC: - case InstructionConstants.OP_INVOKEINTERFACE: - // See if we can inline it. - inlined = false; - - // Append a label, in case the invocation will be inlined. - codeAttributeComposer.appendLabel(offset); - - emptyInvokingStack = - !inlining && - stackSizeComputer.isReachable(offset) && - stackSizeComputer.getStackSizeAfter(offset) == 0; - - variableOffset += codeAttribute.u2maxLocals; - - // Check if the method invocation is covered by a catch-all - // exception handler. - coveredByCatchAllHandler = false; - exceptionInfoCount = 0; - codeAttribute.exceptionsAccept(clazz, method, offset, this); - coveredByCatchAllHandler = exceptionInfoCount > 0 ? coveredByCatchAllHandler : true; - - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); - - variableOffset -= codeAttribute.u2maxLocals; - - // Was the method inlined? - if (inlined) - { - if (extraInlinedInvocationVisitor != null) - { - extraInlinedInvocationVisitor.visitConstantInstruction(clazz, method, codeAttribute, offset, constantInstruction); - } - - // The invocation itself is no longer necessary. - return; - } - - break; - } - - // Are we inlining this instruction? - if (inlining) - { - // Make sure the constant is present in the constant pool of the - // target class. - constantInstruction.constantIndex = - constantAdder.addConstant(clazz, constantInstruction.constantIndex); - } - - codeAttributeComposer.appendInstruction(offset, constantInstruction); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) - { - refConstant.referencedMemberAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitAnyMember(Clazz Clazz, Member member) {} - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - int accessFlags = programMethod.getAccessFlags(); - - if (// Don't inline methods that must be preserved. - !KeepMarker.isKept(programMethod) && - - // Only inline the method if it is private, static, or final. - // This currently precludes default interface methods, because - // they can't be final. - (accessFlags & (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC | - ClassConstants.ACC_FINAL)) != 0 && - - // Only inline the method if it is not synchronized, etc. - (accessFlags & (ClassConstants.ACC_SYNCHRONIZED | - ClassConstants.ACC_NATIVE | - ClassConstants.ACC_ABSTRACT)) == 0 && - - // Don't inline an method, except in an method in the - // same class. -// (!programMethod.getName(programClass).equals(ClassConstants.METHOD_NAME_INIT) || -// (programClass.equals(targetClass) && -// targetMethod.getName(targetClass).equals(ClassConstants.METHOD_NAME_INIT))) && - !programMethod.getName(programClass).equals(ClassConstants.METHOD_NAME_INIT) && - - // Don't inline a method into itself. - (!programMethod.equals(targetMethod) || - !programClass.equals(targetClass)) && - - // Only inline the method if it isn't recursing. - !inliningMethods.contains(programMethod) && - - // Only inline the method if its target class has at least the - // same version number as the source class, in order to avoid - // introducing incompatible constructs. - targetClass.u4version >= programClass.u4version && - - // Only inline the method if it doesn't invoke a super method or a - // dynamic method, or if it is in the same class. - (!SuperInvocationMarker.invokesSuperMethods(programMethod) && - !DynamicInvocationMarker.invokesDynamically(programMethod) || - programClass.equals(targetClass)) && - - // Only inline the method if it doesn't branch backward while there - // are uninitialized objects. - (!BackwardBranchMarker.branchesBackward(programMethod) || - uninitializedObjectCount == 0) && - - // Only inline if the code access of the inlined method allows it. - (allowAccessModification || - ((!AccessMethodMarker.accessesPrivateCode(programMethod) || - programClass.equals(targetClass)) && - - (!AccessMethodMarker.accessesPackageCode(programMethod) || - ClassUtil.internalPackageName(programClass.getName()).equals( - ClassUtil.internalPackageName(targetClass.getName()))))) && - -// (!AccessMethodMarker.accessesProtectedCode(programMethod) || -// targetClass.extends_(programClass) || -// targetClass.implements_(programClass)) || - (!AccessMethodMarker.accessesProtectedCode(programMethod) || - programClass.equals(targetClass)) && - - // if the method to be inlined has a synchronized block only inline it into - // the target method if its invocation is covered by a catchall handler or - // none at all. This might happen if the target method has been obfuscated - // with fake exception handlers. - (!SynchronizedBlockMethodMarker.hasSynchronizedBlock(programMethod) || - coveredByCatchAllHandler) && - - // Only inline the method if it doesn't catch exceptions, or if it - // is invoked with an empty stack. - (!CatchExceptionMarker.catchesExceptions(programMethod) || - emptyInvokingStack) && - - // Only inline the method if it always returns with an empty - // stack. - !NonEmptyStackReturnMarker.returnsWithNonEmptyStack(programMethod) && - - // Only inline the method if its related static initializers don't - // have any side effects. - !SideEffectClassChecker.mayHaveSideEffects(targetClass, - programClass, - programMethod)) - { - boolean oldInlining = inlining; - - inlining = true; - inliningMethods.push(programMethod); - - // Inline the method body. - programMethod.attributesAccept(programClass, this); - - // Update the optimization information of the target method. - if (!KeepMarker.isKept(targetMethod)) - { - ProgramMethodOptimizationInfo.getProgramMethodOptimizationInfo(targetMethod) - .merge(MethodOptimizationInfo.getMethodOptimizationInfo(programMethod)); - } - - // Increment the invocation count of referenced methods again, - // since they are now invoked from the inlined code too. - programMethod.attributesAccept(programClass, methodInvocationMarker); - - inlining = oldInlining; - inliningMethods.pop(); - } - else if (programMethod.getName(programClass).equals(ClassConstants.METHOD_NAME_INIT)) - { - uninitializedObjectCount--; - } - } - - - // Implementations for LineNumberInfoVisitor. - - public void visitLineNumberInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberInfo lineNumberInfo) - { - try - { - String newSource = lineNumberInfo.getSource() != null ? - lineNumberInfo.getSource() : - source; - - LineNumberInfo newLineNumberInfo = newSource != null ? - new ExtendedLineNumberInfo(lineNumberInfo.u2startPC, - lineNumberInfo.u2lineNumber, - newSource) : - new LineNumberInfo(lineNumberInfo.u2startPC, - lineNumberInfo.u2lineNumber); - - minimumLineNumberIndex = - codeAttributeComposer.insertLineNumber(minimumLineNumberIndex, newLineNumberInfo) + 1; - } - catch (IllegalArgumentException e) - { - if (DEBUG) - { - System.err.println("Invalid line number while inlining method:"); - System.err.println(" Target class = ["+targetClass.getName()+"]"); - System.err.println(" Target method = ["+targetMethod.getName(targetClass)+targetMethod.getDescriptor(targetClass)+"]"); - if (inlining) - { - System.err.println(" Inlined class = ["+clazz.getName()+"]"); - System.err.println(" Inlined method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - } - System.err.println(" Exception = ["+e.getClass().getName()+"] ("+e.getMessage()+")"); - } - } - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - exceptionInfoCount++; - coveredByCatchAllHandler |= exceptionInfo.u2catchType == 0; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/NopRemover.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/NopRemover.java deleted file mode 100644 index 1fd4ac2e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/NopRemover.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor removes all nop instructions that it encounters. - * - * @author Eric Lafortune - */ -public class NopRemover -extends SimplifiedVisitor -implements InstructionVisitor -{ - private final CodeAttributeEditor codeAttributeEditor; - private final InstructionVisitor extraInstructionVisitor; - - - /** - * Creates a new NopRemover. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - */ - public NopRemover(CodeAttributeEditor codeAttributeEditor) - { - this(codeAttributeEditor, null); - } - - - /** - * Creates a new NopRemover. - * @param codeAttributeEditor a code editor that can be used for - * accumulating changes to the code. - * @param extraInstructionVisitor an optional extra visitor for all removed - * nop instructions. - */ - public NopRemover(CodeAttributeEditor codeAttributeEditor, - InstructionVisitor extraInstructionVisitor) - { - this.codeAttributeEditor = codeAttributeEditor; - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - // Check if the instruction is a nop instruction. - if (simpleInstruction.opcode == InstructionConstants.OP_NOP && - !codeAttributeEditor.isModified(offset)) - { - codeAttributeEditor.deleteInstruction(offset); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - extraInstructionVisitor.visitSimpleInstruction(clazz, method, codeAttribute, offset, simpleInstruction); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/PeepholeOptimizer.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/PeepholeOptimizer.java deleted file mode 100644 index 3d0b3c42..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/PeepholeOptimizer.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This AttributeVisitor sets up and applies the peephole optimizations of its - * instruction visitor. The instruction visitor should be using the same - * (optional) branch target finder and code attribute editor. - * - * @author Eric Lafortune - */ -public class PeepholeOptimizer -extends SimplifiedVisitor -implements AttributeVisitor -{ - private final BranchTargetFinder branchTargetFinder; - private final CodeAttributeEditor codeAttributeEditor; - private final InstructionVisitor instructionVisitor; - - - /** - * Creates a new PeepholeOptimizer. - * @param codeAttributeEditor the code attribute editor that will be reset - * and then executed. - * @param instructionVisitor the instruction visitor that performs - * peephole optimizations using the above code - * attribute editor. - */ - public PeepholeOptimizer(CodeAttributeEditor codeAttributeEditor, - InstructionVisitor instructionVisitor) - { - this(null, codeAttributeEditor, instructionVisitor); - } - - - /** - * Creates a new PeepholeOptimizer. - * @param branchTargetFinder branch target finder that will be initialized - * to indicate branch targets in the visited code. - * @param codeAttributeEditor the code attribute editor that will be reset - * and then executed. - * @param instructionVisitor the instruction visitor that performs - * peephole optimizations using the above code - * attribute editor. - */ - public PeepholeOptimizer(BranchTargetFinder branchTargetFinder, - CodeAttributeEditor codeAttributeEditor, - InstructionVisitor instructionVisitor) - { - this.branchTargetFinder = branchTargetFinder; - this.codeAttributeEditor = codeAttributeEditor; - this.instructionVisitor = instructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (branchTargetFinder != null) - { - // Set up the branch target finder. - branchTargetFinder.visitCodeAttribute(clazz, method, codeAttribute); - } - - // Set up the code attribute editor. - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - // Find the peephole optimizations. - codeAttribute.instructionsAccept(clazz, method, instructionVisitor); - - // Apply the peephole optimizations. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ReachableCodeMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ReachableCodeMarker.java deleted file mode 100644 index 30c32804..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/ReachableCodeMarker.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -import java.util.Arrays; - -/** - * This AttributeVisitor finds all instruction offsets, branch targets, and - * exception targets in the CodeAttribute objects that it visits. - * - * @author Eric Lafortune - */ -public class ReachableCodeMarker -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ExceptionInfoVisitor -{ - private boolean[] isReachable = new boolean[ClassConstants.TYPICAL_CODE_LENGTH]; - - private boolean next; - private boolean evaluateExceptions; - - - /** - * Returns whether the instruction at the given offset is reachable in - * the CodeAttribute that was visited most recently. - */ - public boolean isReachable(int offset) - { - return isReachable[offset]; - } - - - /** - * Returns whether any of the instructions at the given offsets are - * reachable in the CodeAttribute that was visited most recently. - */ - public boolean isReachable(int startOffset, int endOffset) - { - // Check if any of the instructions is reachable. - for (int offset = startOffset; offset < endOffset; offset++) - { - if (isReachable[offset]) - { - return true; - } - } - - return false; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Make sure there is a sufficiently large array. - int codeLength = codeAttribute.u4codeLength; - if (isReachable.length < codeLength) - { - // Create a new array. - isReachable = new boolean[codeLength]; - } - else - { - // Reset the array. - Arrays.fill(isReachable, 0, codeLength, false); - } - - // Mark the code, starting at the entry point. - markCode(clazz, method, codeAttribute, 0); - - // Mark the exception handlers, iterating as long as necessary. - do - { - evaluateExceptions = false; - - codeAttribute.exceptionsAccept(clazz, method, this); - } - while (evaluateExceptions); - } - - - // Implementations for InstructionVisitor. - - public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction) - { - byte opcode = simpleInstruction.opcode; - if (opcode == InstructionConstants.OP_IRETURN || - opcode == InstructionConstants.OP_LRETURN || - opcode == InstructionConstants.OP_FRETURN || - opcode == InstructionConstants.OP_DRETURN || - opcode == InstructionConstants.OP_ARETURN || - opcode == InstructionConstants.OP_RETURN || - opcode == InstructionConstants.OP_ATHROW) - { - next = false; - } - } - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - if (variableInstruction.opcode == InstructionConstants.OP_RET) - { - next = false; - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - // Mark the branch target. - markBranchTarget(clazz, - method, - codeAttribute, - offset + branchInstruction.branchOffset); - - byte opcode = branchInstruction.opcode; - if (opcode == InstructionConstants.OP_GOTO || - opcode == InstructionConstants.OP_GOTO_W) - { - next = false; - } - } - - - public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) - { - // Mark the branch targets of the default jump offset. - markBranchTarget(clazz, - method, - codeAttribute, - offset + switchInstruction.defaultOffset); - - // Mark the branch targets of the jump offsets. - markBranchTargets(clazz, - method, - codeAttribute, - offset, - switchInstruction.jumpOffsets); - - next = false; - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - // Mark the exception handler if it's relevant. - if (!isReachable(exceptionInfo.u2handlerPC) && - isReachable(exceptionInfo.u2startPC, exceptionInfo.u2endPC)) - { - markCode(clazz, method, codeAttribute, exceptionInfo.u2handlerPC); - - evaluateExceptions = true; - } - } - - - // Small utility methods. - - /** - * Marks the branch targets of the given jump offsets for the instruction - * at the given offset. - */ - private void markBranchTargets(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, int[] jumpOffsets) - { - for (int index = 0; index < jumpOffsets.length; index++) - { - markCode(clazz, method, codeAttribute, offset + jumpOffsets[index]); - } - } - - - /** - * Marks the branch target at the given offset. - */ - private void markBranchTarget(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset) - { - boolean oldNext = next; - - markCode(clazz, method, codeAttribute, offset); - - next = oldNext; - } - - - /** - * Marks the code starting at the given offset. - */ - private void markCode(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset) - { - boolean oldNext = next; - - byte[] code = codeAttribute.code; - - // Continue with the current instruction as long as we haven't marked it - // yet. - while (!isReachable[offset]) - { - // Get the current instruction. - Instruction instruction = InstructionFactory.create(code, offset); - - // Mark it as reachable. - isReachable[offset] = true; - - // By default, we'll assume we can continue with the next - // instruction in a moment. - next = true; - - // Mark the branch targets, if any. - instruction.accept(clazz, method, codeAttribute, offset, this); - - // Can we really continue with the next instruction? - if (!next) - { - break; - } - - // Go to the next instruction. - offset += instruction.length(offset); - } - - next = oldNext; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/RetargetedClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/RetargetedClassFilter.java deleted file mode 100644 index 248ab2c2..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/RetargetedClassFilter.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates its visits to one of two other given - * ClassVisitor instances, depending on whether the classes are marked to be - * retargeted or not. - * - * @see ClassMerger - * - * @author Eric Lafortune - */ -public class RetargetedClassFilter -implements ClassVisitor -{ - private final ClassVisitor retargetedClassVisitor; - private final ClassVisitor otherClassVisitor; - - - /** - * Creates a new RetargetedClassFilter. - * - * @param retargetedClassVisitor the class visitor to which visits to - * classes that are marked to be retargeted - * will be delegated. - */ - public RetargetedClassFilter(ClassVisitor retargetedClassVisitor) - { - this(retargetedClassVisitor, null); - } - - - /** - * Creates a new RetargetedClassFilter. - * - * @param retargetedClassVisitor the class visitor to which visits to - * classes that are marked to be retargeted - * will be delegated. - * @param otherClassVisitor the class visitor to which visits to - * classes that are not marked to be - * retargeted will be delegated. - */ - public RetargetedClassFilter(ClassVisitor retargetedClassVisitor, - ClassVisitor otherClassVisitor) - { - this.retargetedClassVisitor = retargetedClassVisitor; - this.otherClassVisitor = otherClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Is the class marked to be retargeted? - ClassVisitor classVisitor = ClassMerger.getTargetClass(programClass) != null ? - retargetedClassVisitor : otherClassVisitor; - - if (classVisitor != null) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // A library class can't be retargeted. - if (otherClassVisitor != null) - { - otherClassVisitor.visitLibraryClass(libraryClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/RetargetedInnerClassAttributeRemover.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/RetargetedInnerClassAttributeRemover.java deleted file mode 100644 index fe6f1011..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/RetargetedInnerClassAttributeRemover.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -import java.util.Arrays; - -/** - * This ClassVisitor removes InnerClasses and EnclosingMethod attributes in - * classes that are retargeted or that refer to classes that are retargeted. - * - * @see ClassMerger - * @author Eric Lafortune - */ -public class RetargetedInnerClassAttributeRemover -extends SimplifiedVisitor -implements ClassVisitor, - AttributeVisitor, - InnerClassesInfoVisitor, - ConstantVisitor -{ - private boolean retargeted; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - int attributesCount = programClass.u2attributesCount; - Attribute[] attributes = programClass.attributes; - - int newAtributesCount = 0; - - // Copy over all non-retargeted attributes. - for (int index = 0; index < attributesCount; index++) - { - Attribute attribute = attributes[index]; - - // Check if it's an InnerClasses or EnclosingMethod attribute in - // a retargeted class or referring to a retargeted class. - retargeted = false; - attribute.accept(programClass, this); - if (!retargeted) - { - attributes[newAtributesCount++] = attribute; - } - } - - // Clean up any remaining array elements. - Arrays.fill(attributes, newAtributesCount, attributesCount, null); - - // Update the number of attributes. - programClass.u2attributesCount = newAtributesCount; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Check whether the class itself is retargeted. - checkTarget(clazz); - - if (!retargeted) - { - // Check whether the referenced classes are retargeted. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - int classesCount = innerClassesAttribute.u2classesCount; - InnerClassesInfo[] classes = innerClassesAttribute.classes; - - int newClassesCount = 0; - - // Copy over all non-retargeted attributes. - for (int index = 0; index < classesCount; index++) - { - InnerClassesInfo classInfo = classes[index]; - - // Check if the outer class or inner class is a retargeted class. - retargeted = false; - classInfo.outerClassConstantAccept(clazz, this); - classInfo.innerClassConstantAccept(clazz, this); - if (!retargeted) - { - classes[newClassesCount++] = classInfo; - } - } - - // Clean up any remaining array elements. - Arrays.fill(classes, newClassesCount, classesCount, null); - - // Update the number of classes. - innerClassesAttribute.u2classesCount = newClassesCount; - - // Remove the attribute altogether if it's empty. - retargeted = newClassesCount == 0; - } - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - // Check whether the class itself is retargeted. - checkTarget(clazz); - - // Check whether the referenced class is retargeted. - checkTarget(enclosingMethodAttribute.referencedClass); - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - // Check whether the inner class or the outer class are retargeted. - innerClassesInfo.innerClassConstantAccept(clazz, this); - innerClassesInfo.outerClassConstantAccept(clazz, this); - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Check whether the referenced class is retargeted. - checkTarget(classConstant.referencedClass); - } - - - // Small utility methods. - - /** - * Sets the global return value to true if the given class is retargeted. - */ - private void checkTarget(Clazz clazz) - { - if (clazz != null && - ClassMerger.getTargetClass(clazz) != null) - { - retargeted = true; - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/TargetClassChanger.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/TargetClassChanger.java deleted file mode 100644 index d95d8141..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/TargetClassChanger.java +++ /dev/null @@ -1,508 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor replaces references to classes and class members if the - * classes have targets that are intended to replace them. - * - * @see VerticalClassMerger - * @see ClassReferenceFixer - * @see MemberReferenceFixer - * @author Eric Lafortune - */ -public class TargetClassChanger -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor, - MemberVisitor, - AttributeVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - private static final boolean DEBUG = false; - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // We're only making changes locally in the class. - // Not all other classes may have been retargeted yet. - - // Change the references of the constant pool. - programClass.constantPoolEntriesAccept(this); - - // Change the references of the class members. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - // Change the references of the attributes. - programClass.attributesAccept(this); - - // Remove duplicate interfaces and interface classes that have ended - // up pointing to the class itself. - boolean[] delete = null; - for (int index = 0; index < programClass.u2interfacesCount; index++) - { - Clazz interfaceClass = programClass.getInterface(index); - if (interfaceClass != null && - (programClass.equals(interfaceClass) || - containsInterfaceClass(programClass, - index, - interfaceClass))) - { - // Lazily create the array. - if (delete == null) - { - delete = new boolean[programClass.u2interfacesCount]; - } - - delete[index] = true; - } - } - - if (delete != null) - { - new InterfaceDeleter(delete).visitProgramClass(programClass); - } - - // Is the class being retargeted? - Clazz targetClass = ClassMerger.getTargetClass(programClass); - if (targetClass != null) - { - // We're not changing anything special in the superclass and - // interface hierarchy of the retargeted class. The shrinking - // step will remove the class for us. - - // Restore the class name. We have to add a new class entry - // to avoid an existing entry with the same name being reused. The - // names have to be fixed later, based on their referenced classes. - programClass.u2thisClass = - addNewClassConstant(programClass, - programClass.getName(), - programClass); - - // This class will no longer have any subclasses, because their - // subclasses and interfaces will be retargeted. - programClass.subClasses = null; - } - else - { - // This class has become the subclass of its possibly new - // superclass and of any new interfaces. - ConstantVisitor subclassAdder = - new ReferencedClassVisitor( - new SubclassFilter(programClass, - new SubclassAdder(programClass))); - - programClass.superClassConstantAccept(subclassAdder); - programClass.interfaceConstantsAccept(subclassAdder); - - // TODO: Maybe restore private method references. - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Change the references of the class members. - libraryClass.fieldsAccept(this); - libraryClass.methodsAccept(this); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Change the referenced class. - programField.referencedClass = - updateReferencedClass(programField.referencedClass); - - // Change the references of the attributes. - programField.attributesAccept(programClass, this); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Change the referenced classes. - updateReferencedClasses(programMethod.referencedClasses); - - // Change the references of the attributes. - programMethod.attributesAccept(programClass, this); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - // Change the referenced class. - libraryField.referencedClass = - updateReferencedClass(libraryField.referencedClass); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - // Change the referenced classes. - updateReferencedClasses(libraryMethod.referencedClasses); - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - // Does the string refer to a class, due to a Class.forName construct? - Clazz referencedClass = stringConstant.referencedClass; - Clazz newReferencedClass = updateReferencedClass(referencedClass); - if (referencedClass != newReferencedClass) - { - // Change the referenced class. - stringConstant.referencedClass = newReferencedClass; - - // Change the referenced class member, if applicable. - stringConstant.referencedMember = - updateReferencedMember(stringConstant.referencedMember, - stringConstant.getString(clazz), - null, - newReferencedClass); - } - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - // Change the referenced classes. - updateReferencedClasses(invokeDynamicConstant.referencedClasses); - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - Clazz referencedClass = refConstant.referencedClass; - Clazz newReferencedClass = updateReferencedClass(referencedClass); - if (referencedClass != newReferencedClass) - { - if (DEBUG) - { - System.out.println("TargetClassChanger:"); - System.out.println(" ["+clazz.getName()+"] changing reference from ["+refConstant.referencedClass+"."+refConstant.referencedMember.getName(refConstant.referencedClass)+refConstant.referencedMember.getDescriptor(refConstant.referencedClass)+"]"); - } - - // Change the referenced class. - refConstant.referencedClass = newReferencedClass; - - // Change the referenced class member. - refConstant.referencedMember = - updateReferencedMember(refConstant.referencedMember, - refConstant.getName(clazz), - refConstant.getType(clazz), - newReferencedClass); - - if (DEBUG) - { - System.out.println(" ["+clazz.getName()+"] to ["+refConstant.referencedClass+"."+refConstant.referencedMember.getName(refConstant.referencedClass)+refConstant.referencedMember.getDescriptor(refConstant.referencedClass)+"]"); - } - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Change the referenced class. - classConstant.referencedClass = - updateReferencedClass(classConstant.referencedClass); - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - updateReferencedClasses(methodTypeConstant.referencedClasses); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Change the references of the attributes. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Change the references of the local variables. - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Change the references of the local variables. - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - // Change the referenced classes. - updateReferencedClasses(signatureAttribute.referencedClasses); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Change the references of the annotations. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Change the references of the annotations. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Change the references of the annotation. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Change the referenced class. - localVariableInfo.referencedClass = - updateReferencedClass(localVariableInfo.referencedClass); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Change the referenced classes. - updateReferencedClasses(localVariableTypeInfo.referencedClasses); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - // Change the referenced classes. - updateReferencedClasses(annotation.referencedClasses); - - // Change the references of the element values. - annotation.elementValuesAccept(clazz, this); - } - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) - { - Clazz referencedClass = elementValue.referencedClass; - Clazz newReferencedClass = updateReferencedClass(referencedClass); - if (referencedClass != newReferencedClass) - { - // Change the referenced annotation class. - elementValue.referencedClass = newReferencedClass; - - // Change the referenced method. - elementValue.referencedMethod = - (Method)updateReferencedMember(elementValue.referencedMethod, - elementValue.getMethodName(clazz), - null, - newReferencedClass); - } - } - - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - // Change the referenced annotation class and method. - visitAnyElementValue(clazz, annotation, constantElementValue); - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - // Change the referenced annotation class and method. - visitAnyElementValue(clazz, annotation, enumConstantElementValue); - - // Change the referenced classes. - updateReferencedClasses(enumConstantElementValue.referencedClasses); - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - // Change the referenced annotation class and method. - visitAnyElementValue(clazz, annotation, classElementValue); - - // Change the referenced classes. - updateReferencedClasses(classElementValue.referencedClasses); - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - // Change the referenced annotation class and method. - visitAnyElementValue(clazz, annotation, annotationElementValue); - - // Change the references of the annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - // Change the referenced annotation class and method. - visitAnyElementValue(clazz, annotation, arrayElementValue); - - // Change the references of the element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - // Small utility methods. - - /** - * Returns whether the given class contains the given interface - * class in its first given number of interfaces. - */ - private boolean containsInterfaceClass(Clazz clazz, - int interfaceCount, - Clazz interfaceClass) - { - for (int index = 0; index < interfaceCount; index++) - { - if (interfaceClass.equals(clazz.getInterface(index))) - { - return true; - } - } - - return false; - } - - - /** - * Updates the retargeted classes in the given array of classes. - */ - private void updateReferencedClasses(Clazz[] referencedClasses) - { - if (referencedClasses == null) - { - return; - } - - for (int index = 0; index < referencedClasses.length; index++) - { - referencedClasses[index] = - updateReferencedClass(referencedClasses[index]); - } - } - - - /** - * Returns the retargeted class of the given class. - */ - private Clazz updateReferencedClass(Clazz referencedClass) - { - if (referencedClass == null) - { - return null; - } - - Clazz targetClazz = ClassMerger.getTargetClass(referencedClass); - return targetClazz != null ? - targetClazz : - referencedClass; - } - - - /** - * Returns the retargeted class member of the given class member. - */ - private Member updateReferencedMember(Member referencedMember, - String name, - String type, - Clazz newReferencedClass) - { - if (referencedMember == null) - { - return null; - } - - return referencedMember instanceof Field ? - (Member)newReferencedClass.findField(name, type) : - (Member)newReferencedClass.findMethod(name, type); - } - - - /** - * Explicitly adds a new class constant for the given class in the given - * program class. - */ - private int addNewClassConstant(ProgramClass programClass, - String className, - Clazz referencedClass) - { - ConstantPoolEditor constantPoolEditor = - new ConstantPoolEditor(programClass); - - int nameIndex = - constantPoolEditor.addUtf8Constant(className); - - int classConstantIndex = - constantPoolEditor.addConstant(new ClassConstant(nameIndex, - referencedClass)); - return classConstantIndex; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/UnreachableCodeRemover.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/UnreachableCodeRemover.java deleted file mode 100644 index 44ea3786..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/UnreachableCodeRemover.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.Instruction; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; - -/** - * This InstructionVisitor deletes blocks of code that can never be reached by - * regular calls or branches. - * - * @author Eric Lafortune - */ -public class UnreachableCodeRemover -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = true; - //*/ - - private final InstructionVisitor extraInstructionVisitor; - - private final ReachableCodeMarker reachableCodeMarker = new ReachableCodeMarker(); - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - - /** - * Creates a new UnreachableCodeRemover. - */ - public UnreachableCodeRemover() - { - this(null); - } - - - /** - * Creates a new UnreachableCodeRemover. - * @param extraInstructionVisitor an optional extra visitor for all - * deleted instructions. - */ - public UnreachableCodeRemover(InstructionVisitor extraInstructionVisitor) - { - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - // TODO: Remove this when the code has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while removing unreachable code:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - throw ex; - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("UnreachableCodeRemover: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - reachableCodeMarker.visitCodeAttribute(clazz, method, codeAttribute); - - codeAttributeEditor.reset(codeAttribute.u4codeLength); - - codeAttribute.instructionsAccept(clazz, method, this); - - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - if (DEBUG) - { - System.out.println(" "+(reachableCodeMarker.isReachable(offset) ? "+" : "-")+" "+instruction.toString(offset)); - } - - // Is this instruction unreachable? - if (!reachableCodeMarker.isReachable(offset)) - { - // Then delete it. - codeAttributeEditor.deleteInstruction(offset); - - // Visit the instruction, if required. - if (extraInstructionVisitor != null) - { - instruction.accept(clazz, method, codeAttribute, offset, extraInstructionVisitor); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/UnreachableExceptionRemover.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/UnreachableExceptionRemover.java deleted file mode 100644 index 79584398..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/UnreachableExceptionRemover.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.optimize.info.ExceptionInstructionChecker; - -/** - * This AttributeVisitor removes exception handlers that are unreachable in the - * code attributes that it visits. - * - * @author Eric Lafortune - */ -public class UnreachableExceptionRemover -extends SimplifiedVisitor -implements AttributeVisitor, - ExceptionInfoVisitor -{ - private final ExceptionInfoVisitor extraExceptionInfoVisitor; - - - /** - * Creates a new UnreachableExceptionRemover. - */ - public UnreachableExceptionRemover() - { - this(null); - } - - - /** - * Creates a new UnreachableExceptionRemover. - * @param extraExceptionInfoVisitor an optional extra visitor for all - * removed exceptions. - */ - public UnreachableExceptionRemover(ExceptionInfoVisitor extraExceptionInfoVisitor) - { - this.extraExceptionInfoVisitor = extraExceptionInfoVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Go over the exception table. - codeAttribute.exceptionsAccept(clazz, method, this); - - // Remove exceptions with empty code blocks. - codeAttribute.u2exceptionTableLength = - removeEmptyExceptions(codeAttribute.exceptionTable, - codeAttribute.u2exceptionTableLength); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - if (!mayThrowExceptions(clazz, - method, - codeAttribute, - exceptionInfo.u2startPC, - exceptionInfo.u2endPC)) - { - // Make the code block empty. - exceptionInfo.u2endPC = exceptionInfo.u2startPC; - - if (extraExceptionInfoVisitor != null) - { - extraExceptionInfoVisitor.visitExceptionInfo(clazz, method, codeAttribute, exceptionInfo); - } - } - } - - - // Small utility methods. - - /** - * Returns whether the specified block of code may throw exceptions. - */ - private boolean mayThrowExceptions(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int startOffset, - int endOffset) - { - byte[] code = codeAttribute.code; - - // Go over all instructions. - int offset = startOffset; - while (offset < endOffset) - { - // Get the current instruction. - Instruction instruction = InstructionFactory.create(code, offset); - - // Check if it may be throwing exceptions. - if (instruction.mayThrowExceptions()) - { - return true; - } - - // Go to the next instruction. - offset += instruction.length(offset); - } - - return false; - } - - - /** - * Returns the given list of exceptions, without the ones that have empty - * code blocks. - */ - private int removeEmptyExceptions(ExceptionInfo[] exceptionInfos, - int exceptionInfoCount) - { - // Overwrite all empty exceptions. - int newIndex = 0; - for (int index = 0; index < exceptionInfoCount; index++) - { - ExceptionInfo exceptionInfo = exceptionInfos[index]; - if (exceptionInfo.u2startPC < exceptionInfo.u2endPC) - { - exceptionInfos[newIndex++] = exceptionInfo; - } - } - - return newIndex; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/VariableShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/VariableShrinker.java deleted file mode 100644 index afe0de24..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/VariableShrinker.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.VariableEditor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.MemberVisitor; -import proguard.optimize.*; -import proguard.optimize.info.*; - -/** - * This MemberVisitor removes unused local variables from the code of the methods - * that it visits. - * - * @see ParameterUsageMarker - * @see MethodStaticizer - * @see MethodDescriptorShrinker - * @author Eric Lafortune - */ -public class VariableShrinker -extends SimplifiedVisitor -implements AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("vs") != null; - //*/ - - - private final MemberVisitor extraVariableMemberVisitor; - - private final VariableUsageMarker variableUsageMarker = new VariableUsageMarker(); - private final VariableEditor variableEditor = new VariableEditor(); - - - /** - * Creates a new VariableShrinker. - */ - public VariableShrinker() - { - this(null); - } - - - /** - * Creates a new VariableShrinker with an extra visitor. - * @param extraVariableMemberVisitor an optional extra visitor for all - * removed variables. - */ - public VariableShrinker(MemberVisitor extraVariableMemberVisitor) - { - this.extraVariableMemberVisitor = extraVariableMemberVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if ((method.getAccessFlags() & ClassConstants.ACC_ABSTRACT) == 0) - { - // Compute the parameter size. - int parameterSize = - ClassUtil.internalMethodParameterSize(method.getDescriptor(clazz), - method.getAccessFlags()); - - // Get the total size of the local variable frame. - int maxLocals = codeAttribute.u2maxLocals; - - if (DEBUG) - { - System.out.println("VariableShrinker: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - System.out.println(" Parameter size = " + parameterSize); - System.out.println(" Max locals = " + maxLocals); - } - - // Figure out the local variables that are used by the code. - variableUsageMarker.visitCodeAttribute(clazz, method, codeAttribute); - - // Delete unused local variables from the local variable frame. - variableEditor.reset(maxLocals); - - for (int variableIndex = parameterSize; variableIndex < maxLocals; variableIndex++) - { - // Is the variable not required? - if (!variableUsageMarker.isVariableUsed(variableIndex)) - { - if (DEBUG) - { - System.out.println(" Deleting local variable #"+variableIndex); - } - - // Delete the unused variable. - variableEditor.deleteVariable(variableIndex); - - // Visit the method, if required. - if (extraVariableMemberVisitor != null) - { - method.accept(clazz, extraVariableMemberVisitor); - } - } - } - - // Shift all remaining parameters and variables in the byte code. - variableEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/VerticalClassMerger.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/VerticalClassMerger.java deleted file mode 100644 index 4ad1bd4f..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/VerticalClassMerger.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.ProgramClass; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor inlines the direct subclasses into the program classes - * that it visits, whenever possible. - * - * @see ClassMerger - * @author Eric Lafortune - */ -public class VerticalClassMerger -extends SimplifiedVisitor -implements ClassVisitor -{ - private final boolean allowAccessModification; - private final boolean mergeInterfacesAggressively; - private final ClassVisitor extraClassVisitor; - - - /** - * Creates a new VerticalClassMerger. - * - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - * @param mergeInterfacesAggressively specifies whether interfaces may - * be merged aggressively. - */ - public VerticalClassMerger(boolean allowAccessModification, - boolean mergeInterfacesAggressively) - { - this(allowAccessModification, mergeInterfacesAggressively, null); - } - - - /** - * Creates a new VerticalClassMerger. - - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - * @param mergeInterfacesAggressively specifies whether interfaces may - * be merged aggressively. - * @param extraClassVisitor an optional extra visitor for all - * merged classes. - */ - public VerticalClassMerger(boolean allowAccessModification, - boolean mergeInterfacesAggressively, - ClassVisitor extraClassVisitor ) - { - this.allowAccessModification = allowAccessModification; - this.mergeInterfacesAggressively = mergeInterfacesAggressively; - this.extraClassVisitor = extraClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Try inlining all immediate subclasses into this class. - programClass.subclassesAccept(new ClassMerger(programClass, - allowAccessModification, - mergeInterfacesAggressively, - false, - extraClassVisitor)); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WildcardConstantFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WildcardConstantFilter.java deleted file mode 100644 index f9619838..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WildcardConstantFilter.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.Clazz; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.*; - -/** - * This ConstantVisitor delegates to a given constant visitor, except for - * constants that contain wildcards (indices larger than 0xffff). - * - * @see InstructionSequenceMatcher - * @author Eric Lafortune - */ -public class WildcardConstantFilter -implements ConstantVisitor -{ - private static final int WILDCARD = InstructionSequenceMatcher.X; - - - private final ConstantVisitor constantVisitor; - - private final MyWildcardChecker wildcardChecker = new MyWildcardChecker(); - - - /** - * Creates a new WildcardClassReferenceInitializer that delegates to the - * given constant visitor. - */ - public WildcardConstantFilter(ConstantVisitor constantVisitor) - { - this.constantVisitor = constantVisitor; - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - constantVisitor.visitIntegerConstant(clazz, integerConstant); - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - constantVisitor.visitLongConstant(clazz, longConstant); - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - constantVisitor.visitFloatConstant(clazz, floatConstant); - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - constantVisitor.visitDoubleConstant(clazz, doubleConstant); - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - constantVisitor.visitPrimitiveArrayConstant(clazz, primitiveArrayConstant); - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - if (!containsWildcard(clazz, stringConstant)) - { - constantVisitor.visitStringConstant(clazz, stringConstant); - } - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - constantVisitor.visitUtf8Constant(clazz, utf8Constant); - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - if (!containsWildcard(clazz, invokeDynamicConstant)) - { - constantVisitor.visitInvokeDynamicConstant(clazz, invokeDynamicConstant); - } - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - constantVisitor.visitMethodHandleConstant(clazz, methodHandleConstant); - } - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - if (!containsWildcard(clazz, fieldrefConstant)) - { - constantVisitor.visitFieldrefConstant(clazz, fieldrefConstant); - } - } - - - public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) - { - if (!containsWildcard(clazz, interfaceMethodrefConstant)) - { - constantVisitor.visitInterfaceMethodrefConstant(clazz, interfaceMethodrefConstant); - } - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - if (!containsWildcard(clazz, methodrefConstant)) - { - constantVisitor.visitMethodrefConstant(clazz, methodrefConstant); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - if (!containsWildcard(clazz, classConstant)) - { - constantVisitor.visitClassConstant(clazz, classConstant); - } - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - if (!containsWildcard(clazz, methodTypeConstant)) - { - constantVisitor.visitMethodTypeConstant(clazz, methodTypeConstant); - } - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - if (!containsWildcard(clazz, nameAndTypeConstant)) - { - constantVisitor.visitNameAndTypeConstant(clazz, nameAndTypeConstant); - } - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - if (!containsWildcard(clazz, moduleConstant)) - { - constantVisitor.visitModuleConstant(clazz, moduleConstant); - } - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - if (!containsWildcard(clazz, packageConstant)) - { - constantVisitor.visitPackageConstant(clazz, packageConstant); - } - } - - - // Small utility methods. - - /** - * Checks whether the given constant contains wildcard indices. - */ - private boolean containsWildcard(Clazz clazz, Constant constant) - { - wildcardChecker.containsWildcard = false; - constant.accept(clazz, wildcardChecker); - return wildcardChecker.containsWildcard; - } - - - - private static class MyWildcardChecker - extends SimplifiedVisitor - implements ConstantVisitor - { - public boolean containsWildcard; - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - if (stringConstant.u2stringIndex >= WILDCARD) - { - containsWildcard = true; - } - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - if (invokeDynamicConstant.u2nameAndTypeIndex >= WILDCARD) - { - containsWildcard = true; - } - else - { - // Recursively check the referenced constant. - clazz.constantPoolEntryAccept(invokeDynamicConstant.u2nameAndTypeIndex, this); - } - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - if (refConstant.u2classIndex >= WILDCARD || - refConstant.u2nameAndTypeIndex >= WILDCARD) - { - containsWildcard = true; - } - else - { - // Recursively check the referenced constants. - clazz.constantPoolEntryAccept(refConstant.u2classIndex, this); - clazz.constantPoolEntryAccept(refConstant.u2nameAndTypeIndex, this); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - if (classConstant.u2nameIndex >= WILDCARD) - { - containsWildcard = true; - } - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - if (methodTypeConstant.u2descriptorIndex >= WILDCARD) - { - containsWildcard = true; - } - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - if (nameAndTypeConstant.u2nameIndex >= WILDCARD || - nameAndTypeConstant.u2descriptorIndex >= WILDCARD) - { - containsWildcard = true; - } - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - if (moduleConstant.u2nameIndex >= WILDCARD) - { - containsWildcard = true; - } - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - if (packageConstant.u2nameIndex >= WILDCARD) - { - containsWildcard = true; - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WrapperClassMerger.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WrapperClassMerger.java deleted file mode 100644 index 83cd9af8..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WrapperClassMerger.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.optimize.peephole; - -import proguard.classfile.ClassConstants; -import proguard.classfile.Clazz; -import proguard.classfile.ProgramClass; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; -import proguard.optimize.info.WrapperClassMarker; - -/** - * This ClassVisitor inlines the wrapper classes that it visits into their - * wrapped classes, whenever possible. - * - * A wrapper class can be a simple (anonymous) inner class that implements - * some interface, for example. - * - * @see WrapperClassMarker - * @see ClassMerger - * @author Eric Lafortune - */ -public class WrapperClassMerger -extends SimplifiedVisitor -implements ClassVisitor -{ - private final boolean allowAccessModification; - private final ClassVisitor extraClassVisitor; - - - /** - * Creates a new WrappedClassMerger. - * - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - */ - public WrapperClassMerger(boolean allowAccessModification) - { - this(allowAccessModification, null); - } - - - /** - * Creates a new WrappedClassMerger. - - * @param allowAccessModification specifies whether the access modifiers - * of classes can be changed in order to - * merge them. - * @param extraClassVisitor an optional extra visitor for all - * merged classes. - */ - public WrapperClassMerger(boolean allowAccessModification, - ClassVisitor extraClassVisitor) - { - this.allowAccessModification = allowAccessModification; - this.extraClassVisitor = extraClassVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Only merge wrapper classes that extend java.lang.Object. - if (ClassConstants.NAME_JAVA_LANG_OBJECT.equals(programClass.getSuperName())) - { - // Do we have a wrapped program class? - Clazz wrappedClass = WrapperClassMarker.getWrappedClass(programClass); - if (wrappedClass instanceof ProgramClass) - { - // Try inlining the wrapper class into the wrapped class. - new ClassMerger((ProgramClass)wrappedClass, - allowAccessModification, - false, - true, - extraClassVisitor).visitProgramClass(programClass); - } - } - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WrapperClassUseSimplifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WrapperClassUseSimplifier.java deleted file mode 100644 index d2f48214..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/WrapperClassUseSimplifier.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.optimize.peephole; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.CodeAttribute; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.ClassConstant; -import proguard.classfile.constant.Constant; -import proguard.classfile.constant.FieldrefConstant; -import proguard.classfile.constant.MethodrefConstant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.editor.CodeAttributeEditor; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; -import proguard.optimize.info.WrapperClassMarker; - -/** - * This AttributeVisitor simplifies the use of retargeted wrapper classes in - * the code attributes that it visits. More specifically, it replaces - * "new Wrapper(targetClass)" by "targetClass", and - * "wrapper.field" by "wrapper". - * You still need to retarget all class references, replacing references to - * the wrapper class by references to the target class. - * - * @see WrapperClassMarker - * @see ClassMerger - * @see RetargetedClassFilter - * @see TargetClassChanger - * @author Eric Lafortune - */ -public class WrapperClassUseSimplifier -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ConstantVisitor, - ClassVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("wc") != null; - //*/ - - - private final InstructionVisitor extraInstructionVisitor; - - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(true, true); - - // Fields acting as parameters and return values for the visitor methods. - private Clazz wrappedClass; - private Instruction popInstruction; - - - /** - * Creates a new WrapperClassUseSimplifier. - */ - public WrapperClassUseSimplifier() - { - this(null); - } - - - /** - * Creates a new WrapperClassUseSimplifier. - * @param extraInstructionVisitor an optional extra visitor for all - * simplified instructions. - */ - public WrapperClassUseSimplifier(InstructionVisitor extraInstructionVisitor) - { - this.extraInstructionVisitor = extraInstructionVisitor; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (DEBUG) - { - System.out.println("WrapperClassUseSimplifier: "+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)); - } - - int codeLength = codeAttribute.u4codeLength; - - // Reset the code changes. - codeAttributeEditor.reset(codeLength); - - // Edit the instructions. - codeAttribute.instructionsAccept(clazz, method, this); - - // Apply all accumulated changes to the code. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - switch (constantInstruction.opcode) - { - case InstructionConstants.OP_NEW: - { - // Is it instantiating a wrapper class? - if (isReferencingWrapperClass(clazz, constantInstruction.constantIndex)) - { - // Is the next instruction a typical dup instruction? - int nextOffset = offset + constantInstruction.length(offset); - popInstruction = InstructionFactory.create(codeAttribute.code, nextOffset); - switch (popInstruction.canonicalOpcode()) - { - case InstructionConstants.OP_DUP: - { - // Delete the new and dup instructions: - // new Wrapper - // dup - codeAttributeEditor.deleteInstruction(offset); - codeAttributeEditor.deleteInstruction(nextOffset); - popInstruction = null; - break; - } - case InstructionConstants.OP_ASTORE: - { - // Replace the new instance by a dummy null - // and remember to store the target instance: - // new Wrapper -> aconst_null - // astore x -> remember - // aload x - codeAttributeEditor.replaceInstruction(offset, new SimpleInstruction(InstructionConstants.OP_ACONST_NULL)); - break; - } - default: - { - // Replace the new instance by a dummy null - // and remember to pop the target instance: - // new Wrapper -> aconst_null - codeAttributeEditor.replaceInstruction(offset, new SimpleInstruction(InstructionConstants.OP_ACONST_NULL)); - popInstruction = new SimpleInstruction(InstructionConstants.OP_POP); - } - } - - if (extraInstructionVisitor != null) - { - extraInstructionVisitor.visitConstantInstruction(clazz, method, codeAttribute, offset, constantInstruction); - } - } - break; - } - case InstructionConstants.OP_INVOKESPECIAL: - { - // Is it initializing a wrapper class? - if (isReferencingWrapperClass(clazz, constantInstruction.constantIndex)) - { - // Do we have a special pop instruction? - // TODO: May still fail with nested initializers. - if (popInstruction == null) - { - // Delete the initializer invocation (with the - // wrapper instance no longer on the stack): - // Wrapper.(target) -> target - codeAttributeEditor.deleteInstruction(offset); - } - else - { - // Delete the initializer invocation, and store - // the target instance again: - // invokespecial Wrapper.(target) -> astore x / pop - codeAttributeEditor.replaceInstruction(offset, new Instruction[] - { - popInstruction, - new SimpleInstruction(InstructionConstants.OP_POP), - }); - } - } - break; - } - case InstructionConstants.OP_GETFIELD: - { - // Is it retrieving the field of the wrapper class? - if (isReferencingWrapperClass(clazz, constantInstruction.constantIndex)) - { - // Delete the retrieval: - // wrapper.field -> wrapper. - codeAttributeEditor.deleteInstruction(offset); - } - break; - } - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) {} - - - public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) - { - // Is the constant retrieving from a wrapper class? - fieldrefConstant.referencedClassAccept(this); - } - - - public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) - { - if (methodrefConstant.getName(clazz).equals(ClassConstants.METHOD_NAME_INIT)) - { - // Is the constant referring to a wrapper class? - methodrefConstant.referencedClassAccept(this); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Is the constant referring to a wrapper class? - classConstant.referencedClassAccept(this); - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - wrappedClass = ClassMerger.getTargetClass(programClass); - } - - - // Small utility methods. - - /** - * Returns whether the constant at the given offset is referencing a - * wrapper class (different from the given class) that is being retargeted. - */ - private boolean isReferencingWrapperClass(Clazz clazz, int constantIndex) - { - wrappedClass = null; - - clazz.constantPoolEntryAccept(constantIndex, this); - - return wrappedClass != null; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/package.html deleted file mode 100644 index e0eeb514..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/optimize/peephole/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains visitors that perform various peephole optimizations. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/package.html deleted file mode 100644 index 986cad89..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -This package contains the main ProGuard application. -ProGuard can read jar files, shrink and obfuscate them, and write out the -resulting jar file. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/CodePreverifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/preverify/CodePreverifier.java deleted file mode 100644 index db2e11b1..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/CodePreverifier.java +++ /dev/null @@ -1,645 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.preverify; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.editor.*; -import proguard.classfile.instruction.InstructionConstants; -import proguard.classfile.util.*; -import proguard.classfile.visitor.ClassPrinter; -import proguard.evaluation.*; -import proguard.evaluation.value.*; -import proguard.optimize.evaluation.*; - -import java.util.*; - -/** - * This class can preverify methods in program class pools, according to a given - * specification. - * - * @author Eric Lafortune - */ -public class CodePreverifier -extends SimplifiedVisitor -implements AttributeVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("cp") != null; - //*/ - - private static final int AT_METHOD_ENTRY = -1; - - - private final boolean microEdition; - - private final ReferenceTracingValueFactory referenceTracingValueFactory = new ReferenceTracingValueFactory(new TypedReferenceValueFactory()); - private final PartialEvaluator partialEvaluator = new PartialEvaluator(referenceTracingValueFactory, - new ReferenceTracingInvocationUnit(new BasicInvocationUnit(referenceTracingValueFactory)), - true, - referenceTracingValueFactory); - private final InitializationFinder initializationFinder = new InitializationFinder(partialEvaluator, false); - private final LivenessAnalyzer livenessAnalyzer = new LivenessAnalyzer(partialEvaluator, false, initializationFinder, false); - private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor(); - - - /** - * Creates a new CodePreverifier. - */ - public CodePreverifier(boolean microEdition) - { - this.microEdition = microEdition; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // TODO: Remove this when the preverifier has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while preverifying:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - throw ex; - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); - - ProgramClass programClass = (ProgramClass)clazz; - ProgramMethod programMethod = (ProgramMethod)method; - - int codeLength = codeAttribute.u4codeLength; - - // Evaluate the method. - partialEvaluator.visitCodeAttribute(clazz, method, codeAttribute); - initializationFinder.visitCodeAttribute(clazz, method, codeAttribute); - livenessAnalyzer.visitCodeAttribute(clazz, method, codeAttribute); - - // We may have to remove unreachable code. - codeAttributeEditor.reset(codeLength); - - // Collect the stack map frames. - List stackMapFrameList = new ArrayList(); - - for (int offset = 0; offset < codeLength; offset++) - { - // Only store frames at the beginning of code blocks. - if (!partialEvaluator.isTraced(offset)) - { - // Mark the unreachable instruction for deletion. - codeAttributeEditor.deleteInstruction(offset); - } - else if (partialEvaluator.isBranchOrExceptionTarget(offset)) - { - // Convert the variable values to types. - VerificationType[] variableTypes = - correspondingVerificationTypes(programClass, - programMethod, - codeAttribute, - offset, - partialEvaluator.getVariablesBefore(offset)); - - // Convert the stack values to types. - VerificationType[] stackTypes = - correspondingVerificationTypes(programClass, - programMethod, - codeAttribute, - offset, - partialEvaluator.getStackBefore(offset)); - // Create and store a new frame. - stackMapFrameList.add(new FullFrame(offset, - variableTypes, - stackTypes)); - } - } - - // Compress the stack map frames if the target is not Java Micro Edition. - if (!microEdition && !stackMapFrameList.isEmpty()) - { - // Convert the initial variable values to types. - VerificationType[] initialVariables = - correspondingVerificationTypes(programClass, - programMethod, - codeAttribute, - AT_METHOD_ENTRY, - partialEvaluator.getVariablesBefore(0)); - - // Special case: the method. - if (method.getName(programClass).equals(ClassConstants.METHOD_NAME_INIT)) - { - initialVariables[0] = VerificationTypeFactory.createUninitializedThisType(); - } - - compressStackMapFrames(initialVariables, - stackMapFrameList); - } - - // Get the proper name for the attribute to be added/replaced/deleted. - String stackMapAttributeName = microEdition ? - ClassConstants.ATTR_StackMap : - ClassConstants.ATTR_StackMapTable; - - int frameCount = stackMapFrameList.size(); - - if (DEBUG) - { - Attribute originalStackMapAttribute = codeAttribute.getAttribute(clazz, - stackMapAttributeName); - - if (originalStackMapAttribute != null) - { - int originalFrameCount = microEdition ? - ((StackMapAttribute)originalStackMapAttribute).u2stackMapFramesCount : - ((StackMapTableAttribute)originalStackMapAttribute).u2stackMapFramesCount; - - StackMapFrame[] originalFrames = microEdition ? - ((StackMapAttribute)originalStackMapAttribute).stackMapFrames : - ((StackMapTableAttribute)originalStackMapAttribute).stackMapFrames; - - if (frameCount != originalFrameCount || - !Arrays.equals(stackMapFrameList.toArray(), originalFrames)) - { - System.out.println("Original preverification ["+clazz.getName()+"]:"); - new ClassPrinter().visitProgramMethod(programClass, programMethod); - } - } - else if (frameCount != 0) - { - System.out.println("Original preverification empty ["+clazz.getName()+"."+method.getName(clazz)+"]"); - } - } - - if (frameCount == 0) - { - // Remove any stack map (table) attribute from the code attribute. - new AttributesEditor(programClass, programMethod, codeAttribute, true).deleteAttribute(stackMapAttributeName); - } - else - { - Attribute stackMapAttribute; - - // Create the appropriate attribute. - if (microEdition) - { - // Copy the frames into an array. - FullFrame[] stackMapFrames = new FullFrame[frameCount]; - stackMapFrameList.toArray(stackMapFrames); - - // Put the frames into a stack map attribute. - stackMapAttribute = new StackMapAttribute(stackMapFrames); - } - else - { - // Copy the frames into an array. - StackMapFrame[] stackMapFrames = new StackMapFrame[frameCount]; - stackMapFrameList.toArray(stackMapFrames); - - // Put the frames into a stack map table attribute. - stackMapAttribute = new StackMapTableAttribute(stackMapFrames); - } - - // Fill out the name of the stack map attribute. - stackMapAttribute.u2attributeNameIndex = - new ConstantPoolEditor(programClass).addUtf8Constant(stackMapAttributeName); - - // Add the new stack map (table) attribute to the code attribute. - new AttributesEditor(programClass, programMethod, codeAttribute, true).addAttribute(stackMapAttribute); - - if (DEBUG) - { - System.out.println("Preverifier ["+programClass.getName()+"."+programMethod.getName(programClass)+"]:"); - stackMapAttribute.accept(programClass, programMethod, codeAttribute, new ClassPrinter()); - } - } - - // Apply code modifications, deleting unreachable code. - codeAttributeEditor.visitCodeAttribute(clazz, method, codeAttribute); - } - - - // Small utility methods. - - /** - * Creates and returns the verification types corresponding to the given - * variables. If necessary, class constants are added to the constant pool - * of the given class. - */ - private VerificationType[] correspondingVerificationTypes(ProgramClass programClass, - ProgramMethod programMethod, - CodeAttribute codeAttribute, - int offset, - TracedVariables variables) - { - int typeCount = 0; - if (offset == AT_METHOD_ENTRY) - { - // Count the number of parameters, including any parameters - // that are unused and overwritten right away. - typeCount = ClassUtil.internalMethodParameterCount( - programMethod.getDescriptor(programClass), - programMethod.getAccessFlags()); - } - else - { - typeCount = 0; - - int maximumVariablesSize = variables.size(); - int typeIndex = 0; - - // Count the the number of verification types, ignoring any nulls at - // the end. - for (int index = 0; index < maximumVariablesSize; index++) - { - Value value = variables.getValue(index); - - typeIndex++; - - // Remember the maximum live type index. - if (value != null && - livenessAnalyzer.isAliveBefore(offset, index)) - { - typeCount = typeIndex; - - // Category 2 types that are alive are stored as single entries. - if (value.isCategory2()) - { - index++; - } - } - } - } - - // Create and fill out the verification types. - VerificationType[] types = new VerificationType[typeCount]; - - int typeIndex = 0; - - // Note the slightly different terminating condition, because the - // types may have been truncated. - for (int index = 0; typeIndex < typeCount; index++) - { - Value value = variables.getValue(index); - Value producerValue = variables.getProducerValue(index); - - // Fill out the type. - VerificationType type; - - if (value != null && - (offset == AT_METHOD_ENTRY || - livenessAnalyzer.isAliveBefore(offset, index))) - { - type = correspondingVerificationType(programClass, - programMethod, - codeAttribute, - offset, - value, - producerValue); - - // Category 2 types that are alive are stored as single entries. - if (value.isCategory2()) - { - index++; - } - } - else - { - // A null value at method entry means that there was a branch to - // offset 0 that has cleared the value. Then pick a dummy value so - // it never matches the next frame at offset 0. - type = offset == AT_METHOD_ENTRY ? - VerificationTypeFactory.createUninitializedThisType() : - VerificationTypeFactory.createTopType(); - } - - types[typeIndex++] = type; - } - - return types; - } - - - /** - * Creates and returns the verification types corresponding to the given - * stack. If necessary, class constants are added to the constant pool - * of the given class. - */ - private VerificationType[] correspondingVerificationTypes(ProgramClass programClass, - ProgramMethod programMethod, - CodeAttribute codeAttribute, - int offset, - TracedStack stack) - { - int maximumStackSize = stack.size(); - int typeCount = 0; - - // Count the the number of verification types. - for (int index = 0; index < maximumStackSize; index++) - { - // We have to work down from the top of the stack. - Value value = stack.getTop(index); - - typeCount++; - - // Category 2 types are stored as single entries. - if (value.isCategory2()) - { - index++; - } - } - - // Create and fill out the verification types. - VerificationType[] types = new VerificationType[typeCount]; - - int typeIndex = typeCount; - - for (int index = 0; index < maximumStackSize; index++) - { - // We have to work down from the top of the stack. - Value value = stack.getTop(index); - Value producerValue = stack.getTopProducerValue(index); - - // Fill out the type. - types[--typeIndex] = - correspondingVerificationType(programClass, - programMethod, - codeAttribute, - offset, - value, - producerValue); - - // Category 2 types are stored as single entries. - if (value.isCategory2()) - { - index++; - } - } - - return types; - } - - - /** - * Creates and returns the verification type corresponding to the given - * value. If necessary, a class constant is added to the constant pool of - * the given class. - */ - private VerificationType correspondingVerificationType(ProgramClass programClass, - ProgramMethod programMethod, - CodeAttribute codeAttribute, - int offset, - Value value, - Value producerValue) - { - if (value == null) - { - return VerificationTypeFactory.createTopType(); - } - - int type = value.computationalType(); - - switch (type) - { - case Value.TYPE_INSTRUCTION_OFFSET: - case Value.TYPE_INTEGER: return VerificationTypeFactory.createIntegerType(); - case Value.TYPE_LONG: return VerificationTypeFactory.createLongType(); - case Value.TYPE_FLOAT: return VerificationTypeFactory.createFloatType(); - case Value.TYPE_DOUBLE: return VerificationTypeFactory.createDoubleType(); - case Value.TYPE_TOP: return VerificationTypeFactory.createTopType(); - - case Value.TYPE_REFERENCE: - // Is it a Null type? - ReferenceValue referenceValue = value.referenceValue(); - if (referenceValue.isNull() == Value.ALWAYS) - { - return VerificationTypeFactory.createNullType(); - } - - // Does the reference type have a single producer? - if (offset != AT_METHOD_ENTRY) - { - TracedReferenceValue tracedReferenceValue = - (TracedReferenceValue)referenceValue; - - InstructionOffsetValue instructionOffsetValue = - tracedReferenceValue.getTraceValue().instructionOffsetValue(); - - if (instructionOffsetValue.instructionOffsetCount() == 1) - { - if (instructionOffsetValue.isMethodParameter(0)) - { - // Are we in an instance initialization method, - // before the super initialization, loading "this"? - if (instructionOffsetValue.methodParameter(0) == 0 && - initializationFinder.isInitializer() && - offset <= initializationFinder.superInitializationOffset()) - { - // It's an UninitializedThis type. - return VerificationTypeFactory.createUninitializedThisType(); - } - } - else if (instructionOffsetValue.isNewinstance(0)) - { - int producerOffset = instructionOffsetValue.instructionOffset(0); - - // Is the reference type newly created and still - // uninitialized? - if (!initializationFinder.isInitializedBefore(offset, instructionOffsetValue)) - { - // It's an Uninitialized type. - return VerificationTypeFactory.createUninitializedType(producerOffset); - } - } - } - } - - // It's an ordinary Object type. - return VerificationTypeFactory.createObjectType(createClassConstant(programClass, referenceValue)); - } - - throw new IllegalArgumentException("Unknown computational type ["+type+"]"); - } - - - /** - * Finds or creates a class constant for the given reference value, and - * returns its index in the constant pool. - */ - private int createClassConstant(ProgramClass programClass, - ReferenceValue referenceValue) - { - return new ConstantPoolEditor(programClass).addClassConstant(referenceValue.getType(), - referenceValue.getReferencedClass()); - } - - - /** - * Compresses the given list of full frames, for use in a stack map table. - */ - private void compressStackMapFrames(VerificationType[] initialVariableTypes, - List stackMapFrameList) - { - int previousVariablesCount = initialVariableTypes.length; - VerificationType[] previousVariableTypes = initialVariableTypes; - - int previousOffset = -1; - - for (int index = 0; index < stackMapFrameList.size(); index++) - { - FullFrame fullFrame = (FullFrame)stackMapFrameList.get(index); - - int variablesCount = fullFrame.variablesCount; - VerificationType[] variables = fullFrame.variables; - int stackCount = fullFrame.stackCount; - VerificationType[] stack = fullFrame.stack; - - // Start computing the compressed frame. - // The default is the full frame. - StackMapFrame compressedFrame = fullFrame; - - // Are all variables equal? - if (variablesCount == previousVariablesCount && - equalVerificationTypes(variables, previousVariableTypes, variablesCount)) - { - // Are the stacks equal? - //if (stackCount == previousStackCount && - // equalVerificationTypes(stack, previousStack, stackCount)) - //{ - // // Remove the identical frame. - // stackMapFrameList.remove(index--); - // - // // Move on to the next frame (at the same index). - // continue; - //} - // Is the new stack empty? - //else - if (stackCount == 0) - { - compressedFrame = new SameZeroFrame(); - } - // Does the new stack contain a single element? - else if (stackCount == 1) - { - compressedFrame = new SameOneFrame(stack[0]); - } - } - // Is the stack empty? - else if (stackCount == 0) - { - int additionalVariablesCount = variablesCount - previousVariablesCount; - - // Are the variables chopped? - if (additionalVariablesCount < 0 && - additionalVariablesCount > -4 && - equalVerificationTypes(variables, previousVariableTypes, variablesCount)) - { - compressedFrame = new LessZeroFrame((byte)-additionalVariablesCount); - } - // Are the variables extended? - else if (//previousVariablesCount > 0 && - additionalVariablesCount > 0 && - additionalVariablesCount < 4 && - equalVerificationTypes(variables, previousVariableTypes, previousVariablesCount)) - { - // Copy the additional variables into an array. - VerificationType[] additionalVariables = new VerificationType[additionalVariablesCount]; - System.arraycopy(variables, variablesCount - additionalVariablesCount, - additionalVariables, 0, - additionalVariablesCount); - - compressedFrame = new MoreZeroFrame(additionalVariables); - } - } - - // Compress the instruction offset. - int offset = fullFrame.u2offsetDelta; - compressedFrame.u2offsetDelta = offset - previousOffset - 1; - previousOffset = offset; - - // Remember this frame. - previousVariablesCount = fullFrame.variablesCount; - previousVariableTypes = fullFrame.variables; - - // Replace the full frame. - stackMapFrameList.set(index, compressedFrame); - } - } - - - /** - * Returns whether the given arrays of verification types are equal, up to - * the given length. - */ - private boolean equalVerificationTypes(VerificationType[] types1, - VerificationType[] types2, - int length) - { - if (length > 0 && - (types1.length < length || - types2.length < length)) - { - return false; - } - - for (int index = 0; index < length; index++) - { - if (!types1[index].equals(types2[index])) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the given instruction opcode represents a dup or swap - * instruction (dup, dup_x1, dup_x2, dup2, dup2_x1, dup2_x2, swap). - */ - private boolean isDupOrSwap(int opcode) - { - return opcode >= InstructionConstants.OP_DUP && - opcode <= InstructionConstants.OP_SWAP; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/CodeSubroutineInliner.java b/tools/proguard/proguard6.0.3/core/src/proguard/preverify/CodeSubroutineInliner.java deleted file mode 100644 index 2851a1c3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/CodeSubroutineInliner.java +++ /dev/null @@ -1,402 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.preverify; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.editor.CodeAttributeComposer; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; -import proguard.optimize.peephole.BranchTargetFinder; - -/** - * This AttributeVisitor inlines local subroutines (jsr/ret) in the code - * attributes that it visits. - * - * @author Eric Lafortune - */ -public class CodeSubroutineInliner -extends SimplifiedVisitor -implements AttributeVisitor, - InstructionVisitor, - ExceptionInfoVisitor -{ - //* - private static final boolean DEBUG = false; - /*/ - private static boolean DEBUG = System.getProperty("csi") != null; - //*/ - - private final BranchTargetFinder branchTargetFinder = new BranchTargetFinder(); - private final CodeAttributeComposer codeAttributeComposer = new CodeAttributeComposer(true, true, true); - - private ExceptionInfoVisitor subroutineExceptionInliner = this; - private int clipStart = 0; - private int clipEnd = Integer.MAX_VALUE; - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { -// DEBUG = -// clazz.getName().equals("abc/Def") && -// method.getName(clazz).equals("abc"); -// CodeAttributeComposer.DEBUG = DEBUG; - - // TODO: Remove this when the subroutine inliner has stabilized. - // Catch any unexpected exceptions from the actual visiting method. - try - { - // Process the code. - visitCodeAttribute0(clazz, method, codeAttribute); - } - catch (RuntimeException ex) - { - System.err.println("Unexpected error while inlining subroutines:"); - System.err.println(" Class = ["+clazz.getName()+"]"); - System.err.println(" Method = ["+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - System.err.println(" Exception = ["+ex.getClass().getName()+"] ("+ex.getMessage()+")"); - - if (DEBUG) - { - method.accept(clazz, new ClassPrinter()); - } - - throw ex; - } - } - - - public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - branchTargetFinder.visitCodeAttribute(clazz, method, codeAttribute); - - // Don't bother if there aren't any subroutines anyway. - if (!branchTargetFinder.containsSubroutines()) - { - return; - } - - if (DEBUG) - { - System.out.println("SubroutineInliner: processing ["+clazz.getName()+"."+method.getName(clazz)+method.getDescriptor(clazz)+"]"); - } - - // Append the body of the code. - codeAttributeComposer.reset(); - codeAttributeComposer.beginCodeFragment(codeAttribute.u4codeLength); - - // Copy the non-subroutine instructions. - int offset = 0; - while (offset < codeAttribute.u4codeLength) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, offset); - int instructionLength = instruction.length(offset); - - // Is this a returning subroutine? - if (branchTargetFinder.isSubroutine(offset) && - branchTargetFinder.isSubroutineReturning(offset)) - { - // Skip the subroutine. - if (DEBUG) - { - System.out.println(" Skipping original subroutine instruction "+instruction.toString(offset)); - } - - // Append a label at this offset instead. - codeAttributeComposer.appendLabel(offset); - } - else - { - // Copy the instruction, inlining any subroutine call recursively. - instruction.accept(clazz, method, codeAttribute, offset, this); - } - - offset += instructionLength; - } - - // Copy the exceptions. Note that exceptions with empty try blocks - // are automatically removed. - codeAttribute.exceptionsAccept(clazz, - method, - subroutineExceptionInliner); - - if (DEBUG) - { - System.out.println(" Appending label after code at ["+offset+"]"); - } - - // Append a label just after the code. - codeAttributeComposer.appendLabel(codeAttribute.u4codeLength); - - // End and update the code attribute. - codeAttributeComposer.endCodeFragment(); - codeAttributeComposer.visitCodeAttribute(clazz, method, codeAttribute); - } - - - /** - * Appends the specified subroutine. - */ - private void inlineSubroutine(Clazz clazz, - Method method, - CodeAttribute codeAttribute, - int subroutineInvocationOffset, - int subroutineStart) - { - int subroutineEnd = branchTargetFinder.subroutineEnd(subroutineStart); - - if (DEBUG) - { - System.out.println(" Inlining subroutine ["+subroutineStart+" -> "+subroutineEnd+"] at ["+subroutineInvocationOffset+"]"); - } - - // Don't go inlining exceptions that are already applicable to this - // subroutine invocation. - ExceptionInfoVisitor oldSubroutineExceptionInliner = subroutineExceptionInliner; - int oldClipStart = clipStart; - int oldClipEnd = clipEnd; - - subroutineExceptionInliner = - new ExceptionExcludedOffsetFilter(subroutineInvocationOffset, - subroutineExceptionInliner); - clipStart = subroutineStart; - clipEnd = subroutineEnd; - - codeAttributeComposer.beginCodeFragment(codeAttribute.u4codeLength); - - // Copy the subroutine instructions, inlining any subroutine calls - // recursively. - codeAttribute.instructionsAccept(clazz, - method, - subroutineStart, - subroutineEnd, - this); - - if (DEBUG) - { - System.out.println(" Appending label after inlined subroutine at ["+subroutineEnd+"]"); - } - - // Append a label just after the code. - codeAttributeComposer.appendLabel(subroutineEnd); - - // Inline the subroutine exceptions. - codeAttribute.exceptionsAccept(clazz, - method, - subroutineStart, - subroutineEnd, - subroutineExceptionInliner); - - // We can again inline exceptions that are applicable to this - // subroutine invocation. - subroutineExceptionInliner = oldSubroutineExceptionInliner; - clipStart = oldClipStart; - clipEnd = oldClipEnd; - - codeAttributeComposer.endCodeFragment(); - } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) - { - if (branchTargetFinder.isSubroutineStart(offset)) - { - if (DEBUG) - { - System.out.println(" Replacing first subroutine instruction "+instruction.toString(offset)+" by a label"); - } - - // Append a label at this offset instead of saving the subroutine - // return address. - codeAttributeComposer.appendLabel(offset); - } - else - { - // Append the instruction. - codeAttributeComposer.appendInstruction(offset, instruction); - } - } - - - public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction) - { - byte opcode = variableInstruction.opcode; - if (opcode == InstructionConstants.OP_RET) - { - // Is the return instruction the last instruction of the subroutine? - if (branchTargetFinder.subroutineEnd(offset) == offset + variableInstruction.length(offset)) - { - if (DEBUG) - { - System.out.println(" Replacing subroutine return at ["+offset+"] by a label"); - } - - // Append a label at this offset instead of the subroutine return. - codeAttributeComposer.appendLabel(offset); - } - else - { - if (DEBUG) - { - System.out.println(" Replacing subroutine return at ["+offset+"] by a simple branch"); - } - - // Replace the instruction by a branch. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO, - branchTargetFinder.subroutineEnd(offset) - offset); - - codeAttributeComposer.appendInstruction(offset, replacementInstruction); - } - } - else if (branchTargetFinder.isSubroutineStart(offset)) - { - if (DEBUG) - { - System.out.println(" Replacing first subroutine instruction "+variableInstruction.toString(offset)+" by a label"); - } - - // Append a label at this offset instead of saving the subroutine - // return address. - codeAttributeComposer.appendLabel(offset); - } - else - { - // Append the instruction. - codeAttributeComposer.appendInstruction(offset, variableInstruction); - } - } - - - public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) - { - byte opcode = branchInstruction.opcode; - if (opcode == InstructionConstants.OP_JSR || - opcode == InstructionConstants.OP_JSR_W) - { - int branchOffset = branchInstruction.branchOffset; - int branchTarget = offset + branchOffset; - - // Is the subroutine ever returning? - if (branchTargetFinder.isSubroutineReturning(branchTarget)) - { - // Append a label at this offset instead of the subroutine invocation. - codeAttributeComposer.appendLabel(offset); - - // Inline the invoked subroutine. - inlineSubroutine(clazz, - method, - codeAttribute, - offset, - branchTarget); - } - else - { - if (DEBUG) - { - System.out.println("Replacing subroutine invocation at ["+offset+"] by a simple branch"); - } - - // Replace the subroutine invocation by a simple branch. - Instruction replacementInstruction = - new BranchInstruction(InstructionConstants.OP_GOTO, - branchOffset); - - codeAttributeComposer.appendInstruction(offset, replacementInstruction); - } - } - else - { - // Append the instruction. - codeAttributeComposer.appendInstruction(offset, branchInstruction); - } - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - int startPC = Math.max(exceptionInfo.u2startPC, clipStart); - int endPC = Math.min(exceptionInfo.u2endPC, clipEnd); - int handlerPC = exceptionInfo.u2handlerPC; - int catchType = exceptionInfo.u2catchType; - - // Exclude any subroutine invocations that jump out of the try block, - // by adding a try block before (and later on, after) each invocation. - for (int offset = startPC; offset < endPC; offset++) - { - if (branchTargetFinder.isSubroutineInvocation(offset)) - { - Instruction instruction = InstructionFactory.create(codeAttribute.code, offset); - int instructionLength = instruction.length(offset); - - // Is it a subroutine invocation? - if (!exceptionInfo.isApplicable(offset + ((BranchInstruction)instruction).branchOffset)) - { - if (DEBUG) - { - System.out.println(" Appending extra exception ["+startPC+" -> "+offset+"] -> "+handlerPC); - } - - // Append a try block that ends before the subroutine invocation. - codeAttributeComposer.appendException(new ExceptionInfo(startPC, - offset, - handlerPC, - catchType)); - - // The next try block will start after the subroutine invocation. - startPC = offset + instructionLength; - } - } - } - - if (DEBUG) - { - if (startPC == exceptionInfo.u2startPC && - endPC == exceptionInfo.u2endPC) - { - System.out.println(" Appending exception ["+startPC+" -> "+endPC+"] -> "+handlerPC); - } - else - { - System.out.println(" Appending clipped exception ["+exceptionInfo.u2startPC+" -> "+exceptionInfo.u2endPC+"] ~> ["+startPC+" -> "+endPC+"] -> "+handlerPC); - } - } - - // Append the exception. Note that exceptions with empty try blocks - // are automatically ignored. - codeAttributeComposer.appendException(new ExceptionInfo(startPC, - endPC, - handlerPC, - catchType)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/Preverifier.java b/tools/proguard/proguard6.0.3/core/src/proguard/preverify/Preverifier.java deleted file mode 100644 index 3f80ec64..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/Preverifier.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.preverify; - -import proguard.Configuration; -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AllAttributeVisitor; -import proguard.classfile.visitor.*; - -/** - * This class can preverify methods in program class pools, according to a given - * configuration. - * - * @author Eric Lafortune - */ -public class Preverifier -{ - private final Configuration configuration; - - - /** - * Creates a new Preverifier. - */ - public Preverifier(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Performs preverification of the given program class pool. - */ - public void execute(ClassPool programClassPool) - { - // Clean up any old visitor info. - programClassPool.classesAccept(new ClassCleaner()); - - // Preverify all methods. - // Classes for JME must be preverified. - // Classes for JSE 6 may optionally be preverified. - // Classes for JSE 7 or higher must be preverified. - programClassPool.classesAccept( - new ClassVersionFilter(configuration.microEdition ? - ClassConstants.CLASS_VERSION_1_0 : - ClassConstants.CLASS_VERSION_1_6, - new AllMethodVisitor( - new AllAttributeVisitor( - new CodePreverifier(configuration.microEdition))))); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/SubroutineInliner.java b/tools/proguard/proguard6.0.3/core/src/proguard/preverify/SubroutineInliner.java deleted file mode 100644 index 24837244..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/preverify/SubroutineInliner.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.preverify; - -import proguard.Configuration; -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.AllAttributeVisitor; -import proguard.classfile.visitor.*; - -/** - * This class can inline subroutines in methods. This is generally useful (i.e. - * required) for preverifying code. - * - * @author Eric Lafortune - */ -public class SubroutineInliner -{ - private final Configuration configuration; - - - /** - * Creates a new SubroutineInliner. - */ - public SubroutineInliner(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Performs subroutine inlining of the given program class pool. - */ - public void execute(ClassPool programClassPool) - { - // Clean up any old visitor info. - programClassPool.classesAccept(new ClassCleaner()); - - // Inline all subroutines. - ClassVisitor inliner = - new AllMethodVisitor( - new AllAttributeVisitor( - new CodeSubroutineInliner())); - - // In Java Standard Edition, only class files from Java 6 or higher - // should be preverified. - if (!configuration.microEdition && - !configuration.android) - { - inliner = - new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_6, - inliner); - } - - programClassPool.classesAccept(inliner); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/AnnotationUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/AnnotationUsageMarker.java deleted file mode 100644 index ab73aa02..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/AnnotationUsageMarker.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.attribute.Attribute; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.*; - -/** - * This AttributeVisitor recursively marks all necessary annotation information - * in the attributes that it visits. - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class AnnotationUsageMarker -extends SimplifiedVisitor -implements AttributeVisitor, - AnnotationVisitor, - ElementValueVisitor, - ConstantVisitor, - ClassVisitor, - MemberVisitor -{ - private final UsageMarker usageMarker; - - // Fields acting as a return parameters for several methods. - private boolean attributeUsed; - private boolean annotationUsed; - private boolean allClassesUsed; - private boolean methodUsed; - - - /** - * Creates a new AnnotationUsageMarker. - * @param usageMarker the usage marker that is used to mark the classes - * and class members. - */ - public AnnotationUsageMarker(UsageMarker usageMarker) - { - this.usageMarker = usageMarker; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Mark the necessary annotation information. - attributeUsed = false; - annotationsAttribute.annotationsAccept(clazz, this); - - if (attributeUsed) - { - // We got a positive used flag, so some annotation is being used. - // Mark this attribute as being used as well. - usageMarker.markAsUsed(annotationsAttribute); - - markConstant(clazz, annotationsAttribute.u2attributeNameIndex); - } - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Mark the necessary annotation information. - attributeUsed = false; - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - - if (attributeUsed) - { - // We got a positive used flag, so some annotation is being used. - // Mark this attribute as being used as well. - usageMarker.markAsUsed(parameterAnnotationsAttribute); - - markConstant(clazz, parameterAnnotationsAttribute.u2attributeNameIndex); - } - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Mark the necessary annotation information in any annotation elements. - annotationDefaultAttribute.defaultValueAccept(clazz, this); - - // Always mark annotation defaults. - usageMarker.markAsUsed(annotationDefaultAttribute); - - markConstant(clazz, annotationDefaultAttribute.u2attributeNameIndex); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - if (isReferencedClassUsed(annotation)) - { - // Mark the annotation as being used. - usageMarker.markAsUsed(annotation); - - markConstant(clazz, annotation.u2typeIndex); - - // Mark the necessary element values. - annotation.elementValuesAccept(clazz, this); - - // The return values. - annotationUsed = true; - attributeUsed = true; - } - } - - - // Implementations for ElementValueVisitor. - - public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) - { - if (isReferencedMethodUsed(constantElementValue)) - { - // Mark the element value as being used. - usageMarker.markAsUsed(constantElementValue); - - markConstant(clazz, constantElementValue.u2elementNameIndex); - markConstant(clazz, constantElementValue.u2constantValueIndex); - } - } - - - public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) - { - if (isReferencedMethodUsed(enumConstantElementValue)) - { - // Check the referenced classes. - allClassesUsed = true; - enumConstantElementValue.referencedClassesAccept(this); - - if (allClassesUsed) - { - // Mark the element value as being used. - usageMarker.markAsUsed(enumConstantElementValue); - - markConstant(clazz, enumConstantElementValue.u2elementNameIndex); - markConstant(clazz, enumConstantElementValue.u2typeNameIndex); - markConstant(clazz, enumConstantElementValue.u2constantNameIndex); - } - } - } - - - public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) - { - if (isReferencedMethodUsed(classElementValue)) - { - // Mark the element value as being used. - usageMarker.markAsUsed(classElementValue); - - markConstant(clazz, classElementValue.u2elementNameIndex); - markConstant(clazz, classElementValue.u2classInfoIndex); - - // Mark the referenced classes, since they can be retrieved from - // the annotation and then used. - // TODO: This could mark more annotation methods, affecting other annotations. - classElementValue.referencedClassesAccept(usageMarker); - } - } - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - if (isReferencedMethodUsed(annotationElementValue)) - { - boolean oldAnnotationUsed = annotationUsed; - - // Check and mark the contained annotation. - annotationUsed = false; - annotationElementValue.annotationAccept(clazz, this); - - if (annotationUsed) - { - // Mark the element value as being used. - usageMarker.markAsUsed(annotationElementValue); - - markConstant(clazz, annotationElementValue.u2elementNameIndex); - } - - annotationUsed = oldAnnotationUsed; - } - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - if (isReferencedMethodUsed(arrayElementValue)) - { - // Check and mark the contained element values. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - - // Mark the element value as being used. - usageMarker.markAsUsed(arrayElementValue); - - markConstant(clazz, arrayElementValue.u2elementNameIndex); - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - usageMarker.markAsUsed(constant); - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - // Is the class constant marked as being used? - if (!usageMarker.isUsed(classConstant)) - { - // Check the referenced class. - allClassesUsed = true; - classConstant.referencedClassAccept(this); - - // Is the referenced class marked as being used? - if (allClassesUsed) - { - // Mark the class constant and its Utf8 constant. - usageMarker.markAsUsed(classConstant); - - markConstant(clazz, classConstant.u2nameIndex); - } - } - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - allClassesUsed &= usageMarker.isUsed(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - } - - - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - methodUsed = usageMarker.isUsed(programMethod); - } - - - public void visitLibraryMethod(LibraryClass LibraryClass, LibraryMethod libraryMethod) - { - } - - - // Small utility methods. - - /** - * Returns whether the annotation class has been marked as being used. - */ - private boolean isReferencedClassUsed(Annotation annotation) - { - // Check if the referenced class is being used. - allClassesUsed = true; - annotation.referencedClassAccept(this); - - return allClassesUsed; - } - - - /** - * Returns whether the annotation method has been marked as being used. - */ - private boolean isReferencedMethodUsed(ElementValue elementValue) - { - // Check if the referenced method is being used. - methodUsed = true; - elementValue.referencedMethodAccept(this); - - return methodUsed; - } - - - /** - * Marks the specified constant pool entry. - */ - private void markConstant(Clazz clazz, int index) - { - if (index > 0) - { - clazz.constantPoolEntryAccept(index, this); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ClassShrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ClassShrinker.java deleted file mode 100644 index 9f016dc9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ClassShrinker.java +++ /dev/null @@ -1,575 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.annotation.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.editor.*; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.util.*; - -/** - * This ClassVisitor removes constant pool entries, class members, and other - * class elements that are not marked as being used. - * - * @author Eric Lafortune - */ -public class ClassShrinker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor, - AnnotationVisitor, - ElementValueVisitor -{ - private final UsageMarker usageMarker; - - private int[] constantIndexMap = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - private int[] bootstrapMethodIndexMap = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE]; - private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper(); - private final BootstrapMethodRemapper bootstrapMethodRemapper = new BootstrapMethodRemapper(); - - - /** - * Creates a new ClassShrinker. - * @param usageMarker the usage marker that is used to mark the classes - * and class members. - */ - public ClassShrinker(UsageMarker usageMarker) - { - this.usageMarker = usageMarker; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Shrink the arrays for constant pool, interfaces, fields, methods, - // and class attributes. - if (programClass.u2interfacesCount > 0) - { - new InterfaceDeleter(shrinkFlags(programClass.constantPool, - programClass.u2interfaces, - programClass.u2interfacesCount)) - .visitProgramClass(programClass); - } - - // Shrinking the constant pool also sets up an index map. - int newConstantPoolCount = - shrinkConstantPool(programClass.constantPool, - programClass.u2constantPoolCount); - - int oldFieldsCount = programClass.u2fieldsCount; - programClass.u2fieldsCount = - shrinkArray(programClass.fields, - programClass.u2fieldsCount); - if (programClass.u2fieldsCount < oldFieldsCount) - { - programClass.u2accessFlags |= ClassConstants.ACC_REMOVED_FIELDS; - } - - int oldMethodsCount = programClass.u2methodsCount; - programClass.u2methodsCount = - shrinkArray(programClass.methods, - programClass.u2methodsCount); - if (programClass.u2methodsCount < oldMethodsCount) - { - programClass.u2accessFlags |= ClassConstants.ACC_REMOVED_METHODS; - } - - programClass.u2attributesCount = - shrinkArray(programClass.attributes, - programClass.u2attributesCount); - - // Compact the remaining fields, methods, and attributes, - // and remap their references to the constant pool. - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - programClass.attributesAccept(this); - - // Remap the references to the constant pool if it has shrunk. - if (newConstantPoolCount < programClass.u2constantPoolCount) - { - programClass.u2constantPoolCount = newConstantPoolCount; - - // Remap all constant pool references. - constantPoolRemapper.setConstantIndexMap(constantIndexMap); - constantPoolRemapper.visitProgramClass(programClass); - } - - // Replace any unused classes in the signatures. - MySignatureCleaner signatureCleaner = new MySignatureCleaner(); - programClass.fieldsAccept(new AllAttributeVisitor(signatureCleaner)); - programClass.methodsAccept(new AllAttributeVisitor(signatureCleaner)); - programClass.attributesAccept(signatureCleaner); - - // Compact the extra field pointing to the subclasses of this class. - programClass.subClasses = - shrinkToNewArray(programClass.subClasses); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Library classes are left unchanged. - - // Compact the extra field pointing to the subclasses of this class. - libraryClass.subClasses = - shrinkToNewArray(libraryClass.subClasses); - } - - - // Implementations for MemberVisitor. - - public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) - { - // Shrink the attributes array. - programMember.u2attributesCount = - shrinkArray(programMember.attributes, - programMember.u2attributesCount); - - // Shrink any attributes. - programMember.attributesAccept(programClass, this); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - // Shrink the array of BootstrapMethodInfo objects. - int newBootstrapMethodsCount = - shrinkBootstrapMethodArray(bootstrapMethodsAttribute.bootstrapMethods, - bootstrapMethodsAttribute.u2bootstrapMethodsCount); - - if (newBootstrapMethodsCount < bootstrapMethodsAttribute.u2bootstrapMethodsCount) - { - bootstrapMethodsAttribute.u2bootstrapMethodsCount = newBootstrapMethodsCount; - - // Remap all bootstrap method references. - bootstrapMethodRemapper.setBootstrapMethodIndexMap(bootstrapMethodIndexMap); - clazz.constantPoolEntriesAccept(bootstrapMethodRemapper); - } - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Shrink the array of InnerClassesInfo objects. - innerClassesAttribute.u2classesCount = - shrinkArray(innerClassesAttribute.classes, - innerClassesAttribute.u2classesCount); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - // Sometimes, a class is still referenced (apparently as a dummy class), - // but its enclosing method is not. Then remove the reference to - // the enclosing method. - // E.g. the anonymous inner class javax.swing.JList$1 is defined inside - // a constructor of javax.swing.JList, but it is also referenced as a - // dummy argument in a constructor of javax.swing.JList$ListSelectionHandler. - if (enclosingMethodAttribute.referencedMethod != null && - !usageMarker.isUsed(enclosingMethodAttribute.referencedMethod)) - { - enclosingMethodAttribute.u2nameAndTypeIndex = 0; - - enclosingMethodAttribute.referencedMethod = null; - } - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - // Shrink the attributes array. - codeAttribute.u2attributesCount = - shrinkArray(codeAttribute.attributes, - codeAttribute.u2attributesCount); - - // Shrink the attributes themselves. - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Shrink the local variable info array. - localVariableTableAttribute.u2localVariableTableLength = - shrinkArray(localVariableTableAttribute.localVariableTable, - localVariableTableAttribute.u2localVariableTableLength); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Shrink the local variable type info array. - localVariableTypeTableAttribute.u2localVariableTypeTableLength = - shrinkArray(localVariableTypeTableAttribute.localVariableTypeTable, - localVariableTypeTableAttribute.u2localVariableTypeTableLength); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Shrink the annotations array. - annotationsAttribute.u2annotationsCount = - shrinkArray(annotationsAttribute.annotations, - annotationsAttribute.u2annotationsCount); - - // Shrink the annotations themselves. - annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Loop over all parameters. - for (int parameterIndex = 0; parameterIndex < parameterAnnotationsAttribute.u1parametersCount; parameterIndex++) - { - // Shrink the parameter annotations array. - parameterAnnotationsAttribute.u2parameterAnnotationsCount[parameterIndex] = - shrinkArray(parameterAnnotationsAttribute.parameterAnnotations[parameterIndex], - parameterAnnotationsAttribute.u2parameterAnnotationsCount[parameterIndex]); - } - - // Shrink the annotations themselves. - parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - // Implementations for AnnotationVisitor. - - public void visitAnnotation(Clazz clazz, Annotation annotation) - { - // Shrink the element values array. - annotation.u2elementValuesCount = - shrinkArray(annotation.elementValues, - annotation.u2elementValuesCount); - - // Shrink the element values themselves. - annotation.elementValuesAccept(clazz, this); - } - - - /** - * This AttributeVisitor updates the Utf8 constants of signatures - * of classes, fields, and methods. - */ - private class MySignatureCleaner - extends SimplifiedVisitor - implements AttributeVisitor - { - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - Clazz[] referencedClasses = signatureAttribute.referencedClasses; - if (referencedClasses != null) - { - // Go over the classes in the signature. - String signature = signatureAttribute.getSignature(clazz); - - DescriptorClassEnumeration classEnumeration = - new DescriptorClassEnumeration(signature); - - int referencedClassIndex = 0; - - // Start construction a new signature. - StringBuffer newSignatureBuffer = new StringBuffer(); - - newSignatureBuffer.append(classEnumeration.nextFluff()); - - while (classEnumeration.hasMoreClassNames()) - { - String className = classEnumeration.nextClassName(); - - // Replace the class name if it is unused. - Clazz referencedClass = referencedClasses[referencedClassIndex]; - if (referencedClass != null && - !usageMarker.isUsed(referencedClass)) - { - className = ClassConstants.NAME_JAVA_LANG_OBJECT; - - referencedClasses[referencedClassIndex] = null; - } - - // Use a short name if it's an inner class after a '.' - // separator. - else if (classEnumeration.isInnerClassName()) - { - className = className.substring(className.lastIndexOf(ClassConstants.INNER_CLASS_SEPARATOR)+1); - } - - referencedClassIndex++; - - newSignatureBuffer.append(className); - newSignatureBuffer.append(classEnumeration.nextFluff()); - } - - // Update the signature. - ((Utf8Constant)((ProgramClass)clazz).constantPool[signatureAttribute.u2signatureIndex]).setString(newSignatureBuffer.toString()); - } - } - } - - - // Implementations for ElementValueVisitor. - - public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) {} - - - public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) - { - // Shrink the contained annotation. - annotationElementValue.annotationAccept(clazz, this); - } - - - public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) - { - // Shrink the element values array. - arrayElementValue.u2elementValuesCount = - shrinkArray(arrayElementValue.elementValues, - arrayElementValue.u2elementValuesCount); - - // Shrink the element values themselves. - arrayElementValue.elementValuesAccept(clazz, annotation, this); - } - - - // Small utility methods. - - /** - * Removes all entries that are not marked as being used from the given - * constant pool. Creates a map from the old indices to the new indices - * as a side effect. - * @return the new number of entries. - */ - private int shrinkConstantPool(Constant[] constantPool, int length) - { - if (constantIndexMap.length < length) - { - constantIndexMap = new int[length]; - } - - int counter = 1; - boolean isUsed = false; - - // Shift the used constant pool entries together. - for (int index = 1; index < length; index++) - { - constantIndexMap[index] = counter; - - Constant constant = constantPool[index]; - - // Is the constant being used? Don't update the flag if this is the - // second half of a long entry. - if (constant != null) - { - isUsed = usageMarker.isUsed(constant); - } - - if (isUsed) - { - // Remember the new index. - constantIndexMap[index] = counter; - - // Shift the constant pool entry. - constantPool[counter++] = constant; - } - else - { - // Remember an invalid index. - constantIndexMap[index] = -1; - } - } - - // Clear the remaining constant pool elements. - Arrays.fill(constantPool, counter, length, null); - - return counter; - } - - - /** - * Creates an array marking unused constant pool entries for all the - * elements in the given array of constant pool indices. - * @return an array of flags indicating unused elements. - */ - private boolean[] shrinkFlags(Constant[] constantPool, int[] array, int length) - { - boolean[] unused = new boolean[length]; - - // Remember the unused constants. - for (int index = 0; index < length; index++) - { - if (!usageMarker.isUsed(constantPool[array[index]])) - { - unused[index] = true; - } - } - - return unused; - } - - - /** - * Removes all indices that point to unused constant pool entries - * from the given array. - * @return the new number of indices. - */ - private int shrinkConstantIndexArray(Constant[] constantPool, int[] array, int length) - { - int counter = 0; - - // Shift the used objects together. - for (int index = 0; index < length; index++) - { - if (usageMarker.isUsed(constantPool[array[index]])) - { - array[counter++] = array[index]; - } - } - - // Clear the remaining array elements. - Arrays.fill(array, counter, length, 0); - - return counter; - } - - - /** - * Removes all Clazz objects that are not marked as being used - * from the given array and returns the remaining objects in a an array - * of the right size. - * @return the new array. - */ - private Clazz[] shrinkToNewArray(Clazz[] array) - { - if (array == null) - { - return null; - } - - // Shrink the given array in-place. - int length = shrinkArray(array, array.length); - if (length == 0) - { - return null; - } - - // Return immediately if the array is of right size already. - if (length == array.length) - { - return array; - } - - // Copy the remaining elements into a new array of the right size. - Clazz[] newArray = new Clazz[length]; - System.arraycopy(array, 0, newArray, 0, length); - return newArray; - } - - - /** - * Removes all entries that are not marked as being used from the given - * array of bootstrap methods. Creates a map from the old indices to the - * new indices as a side effect. - * @return the new number of entries. - */ - private int shrinkBootstrapMethodArray(BootstrapMethodInfo[] bootstrapMethods, int length) - { - if (bootstrapMethodIndexMap.length < length) - { - bootstrapMethodIndexMap = new int[length]; - } - - int counter = 0; - - // Shift the used bootstrap methods together. - for (int index = 0; index < length; index++) - { - BootstrapMethodInfo bootstrapMethod = bootstrapMethods[index]; - - // Is the entry being used? - if (usageMarker.isUsed(bootstrapMethod)) - { - // Remember the new index. - bootstrapMethodIndexMap[index] = counter; - - // Shift the entry. - bootstrapMethods[counter++] = bootstrapMethod; - } - else - { - // Remember an invalid index. - bootstrapMethodIndexMap[index] = -1; - } - } - - // Clear the remaining bootstrap methods. - Arrays.fill(bootstrapMethods, counter, length, null); - - return counter; - } - - - /** - * Removes all VisitorAccepter objects that are not marked as being used - * from the given array. - * @return the new number of VisitorAccepter objects. - */ - private int shrinkArray(VisitorAccepter[] array, int length) - { - int counter = 0; - - // Shift the used objects together. - for (int index = 0; index < length; index++) - { - VisitorAccepter visitorAccepter = array[index]; - - if (usageMarker.isUsed(visitorAccepter)) - { - array[counter++] = visitorAccepter; - } - } - - // Clear any remaining array elements. - if (counter < length) - { - Arrays.fill(array, counter, length, null); - } - - return counter; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/InnerUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/InnerUsageMarker.java deleted file mode 100644 index e1a3ccc3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/InnerUsageMarker.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This AttributeVisitor recursively marks all necessary inner class information - * in the attributes that it visits. - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class InnerUsageMarker -extends SimplifiedVisitor -implements AttributeVisitor, - InnerClassesInfoVisitor, - ConstantVisitor, - ClassVisitor -{ - private final UsageMarker usageMarker; - - // Fields acting as a return parameters for several methods. - private boolean attributeUsed; - private boolean classUsed; - - - /** - * Creates a new InnerUsageMarker. - * @param usageMarker the usage marker that is used to mark the classes - * and class members. - */ - public InnerUsageMarker(UsageMarker usageMarker) - { - this.usageMarker = usageMarker; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Mark the necessary inner classes information. - attributeUsed = false; - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - - if (attributeUsed) - { - // We got a positive used flag, so some inner class is being used. - // Mark this attribute as being used as well. - usageMarker.markAsUsed(innerClassesAttribute); - - markConstant(clazz, innerClassesAttribute.u2attributeNameIndex); - } - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - boolean innerClassesInfoUsed = usageMarker.isUsed(innerClassesInfo); - - if (!innerClassesInfoUsed) - { - // Check if the inner class (if any) is marked as being used. - classUsed = true; - innerClassesInfo.innerClassConstantAccept(clazz, this); - innerClassesInfoUsed = classUsed; - - // Check if the outer class (if any) is marked as being used. - classUsed = true; - innerClassesInfo.outerClassConstantAccept(clazz, this); - innerClassesInfoUsed &= classUsed; - - // If both the inner class and the outer class are marked as being - // used, then mark this InnerClassesInfo as well. - if (innerClassesInfoUsed) - { - usageMarker.markAsUsed(innerClassesInfo); - - innerClassesInfo.innerNameConstantAccept(clazz, this); - } - } - - // The return value. - attributeUsed |= innerClassesInfoUsed; - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - classUsed = usageMarker.isUsed(classConstant); - - // Is the class constant marked as being used? - if (!classUsed) - { - // Check the referenced class. - classUsed = true; - classConstant.referencedClassAccept(this); - - // Is the referenced class marked as being used? - if (classUsed) - { - // Mark the class constant and its Utf8 constant. - usageMarker.markAsUsed(classConstant); - - markConstant(clazz, classConstant.u2nameIndex); - } - } - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - usageMarker.markAsUsed(utf8Constant); - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - classUsed = usageMarker.isUsed(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - classUsed = true; - } - - - // Small utility methods. - - /** - * Marks the given constant pool entry of the given class. This includes - * visiting any other referenced constant pool entries. - */ - private void markConstant(Clazz clazz, int index) - { - clazz.constantPoolEntryAccept(index, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/InterfaceUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/InterfaceUsageMarker.java deleted file mode 100644 index fed35843..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/InterfaceUsageMarker.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - - -/** - * This ClassVisitor recursively marks all interface - * classes that are being used in the visited class. - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class InterfaceUsageMarker -extends SimplifiedVisitor -implements ClassVisitor, - ConstantVisitor -{ - private final UsageMarker usageMarker; - - // Fields acting as return parameters for the visitor methods. - private boolean used; - private boolean anyUsed; - - - /** - * Creates a new InterfaceUsageMarker. - * @param usageMarker the usage marker that is used to mark the classes - * and class members. - */ - public InterfaceUsageMarker(UsageMarker usageMarker) - { - this.usageMarker = usageMarker; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - boolean classUsed = usageMarker.isUsed(programClass); - boolean classPossiblyUsed = usageMarker.isPossiblyUsed(programClass); - - if (classUsed || classPossiblyUsed) - { - // Check if any interfaces are being used. - boolean oldAnyUsed = anyUsed; - anyUsed = false; - - programClass.interfaceConstantsAccept(this); - - classUsed |= anyUsed; - anyUsed = oldAnyUsed; - - // Is this an interface with a preliminary mark? - if (classPossiblyUsed) - { - // Should it be included now? - if (classUsed) - { - // At least one if this interface's interfaces is being used. - // Mark this interface as well. - usageMarker.markAsUsed(programClass); - - // Mark this interface's name. - programClass.thisClassConstantAccept(this); - - // Mark the superclass (java/lang/Object). - programClass.superClassConstantAccept(this); - } - else - { - // Unmark this interface, so we don't bother looking at it again. - usageMarker.markAsUnused(programClass); - } - } - } - - // The return value. - used = classUsed; - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // The return values. - used = true; - anyUsed = true; - } - - - // Implementations for ConstantVisitor. - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - boolean classUsed = usageMarker.isUsed(classConstant); - - if (!classUsed) - { - // The ClassConstant isn't marked as being used yet. But maybe it - // should be included as an interface, so check the actual class. - classConstant.referencedClassAccept(this); - classUsed = used; - - if (classUsed) - { - // The class is being used. Mark the ClassConstant as being used - // as well. - usageMarker.markAsUsed(classConstant); - - clazz.constantPoolEntryAccept(classConstant.u2nameIndex, this); - } - } - - // The return values. - used = classUsed; - anyUsed |= classUsed; - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - if (!usageMarker.isUsed(utf8Constant)) - { - usageMarker.markAsUsed(utf8Constant); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/LocalVariableTypeUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/LocalVariableTypeUsageMarker.java deleted file mode 100644 index b21ef760..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/LocalVariableTypeUsageMarker.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.Constant; -import proguard.classfile.constant.visitor.ConstantVisitor; -import proguard.classfile.util.SimplifiedVisitor; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This AttributeVisitor recursively marks all information that points to used - * classes, in the LocalVariableTable and LocalVariableTypeTable attributes that - * it visits. - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class LocalVariableTypeUsageMarker -extends SimplifiedVisitor -implements AttributeVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - ClassVisitor, - ConstantVisitor -{ - private final UsageMarker usageMarker; - - // Fields acting as return values for several visitor methods. - private boolean tableUsed; - private boolean variableInfoUsed; - - - /** - * Creates a new LocalVariableTypeUsageMarker. - * @param usageMarker the usage marker that is used to mark the classes - * and class members. - */ - public LocalVariableTypeUsageMarker(UsageMarker usageMarker) - { - this.usageMarker = usageMarker; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Check and mark the individual entries. - tableUsed = false; - localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - - // Mark the table if any of the entries is marked. - if (tableUsed) - { - usageMarker.markAsUsed(localVariableTableAttribute); - - markConstant(clazz, localVariableTableAttribute.u2attributeNameIndex); - } - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Check and mark the individual entries. - tableUsed = false; - localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - - // Mark the table if any of the entries is marked. - if (tableUsed) - { - usageMarker.markAsUsed(localVariableTypeTableAttribute); - - markConstant(clazz, localVariableTypeTableAttribute.u2attributeNameIndex); - } - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - // Only keep the local variable info if all of its classes are used. - variableInfoUsed = true; - localVariableInfo.referencedClassAccept(this); - - if (variableInfoUsed) - { - // We got a positive used flag, so the local variable info is useful. - usageMarker.markAsUsed(localVariableInfo); - - markConstant(clazz, localVariableInfo.u2nameIndex); - markConstant(clazz, localVariableInfo.u2descriptorIndex); - - tableUsed = true; - } - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - // Only keep the local variable info if all of its classes are used. - variableInfoUsed = true; - localVariableTypeInfo.referencedClassesAccept(this); - - if (variableInfoUsed) - { - // We got a positive used flag, so the local variable info is useful. - usageMarker.markAsUsed(localVariableTypeInfo); - - markConstant(clazz, localVariableTypeInfo.u2nameIndex); - markConstant(clazz, localVariableTypeInfo.u2signatureIndex); - - tableUsed = true; - } - } - - - // Implementations for ClassVisitor. - - public void visitLibraryClass(LibraryClass libraryClass) {} - - - public void visitProgramClass(ProgramClass programClass) - { - // Don't keep the local variable info if one of its classes is not used. - if (!usageMarker.isUsed(programClass)) - { - variableInfoUsed = false; - } - } - - - // Implementations for ConstantVisitor. - - public void visitAnyConstant(Clazz clazz, Constant constant) - { - usageMarker.markAsUsed(constant); - } - - - // Small utility methods. - - /** - * Marks the given constant pool entry of the given class. - */ - private void markConstant(Clazz clazz, int index) - { - clazz.constantPoolEntryAccept(index, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsageMark.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsageMark.java deleted file mode 100644 index 4ffaedd4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsageMark.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; - - -/** - * This class can be used as a mark when keeping classes, class members, and - * other elements. It can be certain or preliminary. It also contains additional - * information about the reasons why an element is being kept. - * - * @see ClassShrinker - * - * @author Eric Lafortune - */ -final class ShortestUsageMark -{ - private final boolean certain; - private final String reason; - private final int depth; - private Clazz clazz; - private Member member; - - - /** - * Creates a new certain ShortestUsageMark. - * @param reason the reason for this mark. - */ - public ShortestUsageMark(String reason) - { - this.certain = true; - this.reason = reason; - this.depth = 0; - } - - - /** - * Creates a new certain ShortestUsageMark. - * @param previousUsageMark the previous mark to which this one is linked. - * @param reason the reason for this mark. - * @param clazz the class causing this mark. - */ - public ShortestUsageMark(ShortestUsageMark previousUsageMark, - String reason, - int cost, - Clazz clazz) - { - this(previousUsageMark, reason, cost, clazz, null); - } - - - /** - * Creates a new certain ShortestUsageMark. - * @param previousUsageMark the previous mark to which this one is linked. - * @param reason the reason for this mark. - * @param clazz the class causing this mark. - * @param member the member in the above class causing this mark. - * @param cost the added cost of following this path. - */ - public ShortestUsageMark(ShortestUsageMark previousUsageMark, - String reason, - int cost, - Clazz clazz, - Member member) - { - this.certain = true; - this.reason = reason; - this.depth = previousUsageMark.depth + cost; - this.clazz = clazz; - this.member = member; - } - - - /** - * Creates a new ShortestUsageMark, based on another mark. - * @param otherUsageMark the other mark, whose properties will be copied. - * @param certain specifies whether this is a certain mark. - */ - public ShortestUsageMark(ShortestUsageMark otherUsageMark, - boolean certain) - { - this.certain = certain; - this.reason = otherUsageMark.reason; - this.depth = otherUsageMark.depth; - this.clazz = otherUsageMark.clazz; - this.member = otherUsageMark.member; - } - - - /** - * Returns whether this is a certain mark. - */ - public boolean isCertain() - { - return certain; - } - - - /** - * Returns the reason for this mark. - */ - public String getReason() - { - return reason; - } - - - /** - * Returns whether this mark has a shorter chain of reasons than the - * given mark. - */ - public boolean isShorter(ShortestUsageMark otherUsageMark) - { - return this.depth < otherUsageMark.depth; - } - - - /** - * Returns whether this is mark is caused by the given class. - */ - public boolean isCausedBy(Clazz clazz) - { - return clazz.equals(this.clazz); - } - - - /** - * Applies the given class visitor to this mark's class, if any, - * and if this mark doesn't have a member. - */ - public void acceptClassVisitor(ClassVisitor classVisitor) - { - if (clazz != null && - member == null) - { - clazz.accept(classVisitor); - } - } - - - /** - * Applies the given class visitor to this mark's member, if any. - */ - public void acceptMemberVisitor(MemberVisitor memberVisitor) - { - if (clazz != null && - member != null) - { - member.accept(clazz, memberVisitor); - } - } - - - // Implementations for Object. - - public String toString() - { - return "certain=" + certain + ", depth="+depth+": " + - reason + - (clazz != null ? clazz.getName() : "(none)") + ": " + - (member != null ? member.getName(clazz) : "(none)"); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsageMarker.java deleted file mode 100644 index 73d5d378..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsageMarker.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.visitor.*; - - -/** - * This ClassVisitor and MemberVisitor recursively marks all classes - * and class elements that are being used. For each element, it finds the - * shortest chain of dependencies. - * - * @see ClassShrinker - * - * @author Eric Lafortune - */ -public class ShortestUsageMarker extends UsageMarker -{ - private static final ShortestUsageMark INITIAL_MARK = - new ShortestUsageMark("is kept by a directive in the configuration.\n\n"); - - - // A field acting as a parameter to the visitor methods. - private ShortestUsageMark currentUsageMark = INITIAL_MARK; - - // A utility object to check for recursive causes. - private final MyRecursiveCauseChecker recursiveCauseChecker = new MyRecursiveCauseChecker(); - - - // Overriding implementations for UsageMarker. - - protected void markProgramClassBody(ProgramClass programClass) - { - ShortestUsageMark previousUsageMark = currentUsageMark; - - currentUsageMark = new ShortestUsageMark(getShortestUsageMark(programClass), - "is extended by ", - 10000, - programClass); - - super.markProgramClassBody(programClass); - - currentUsageMark = previousUsageMark; - } - - - protected void markProgramFieldBody(ProgramClass programClass, ProgramField programField) - { - ShortestUsageMark previousUsageMark = currentUsageMark; - - currentUsageMark = new ShortestUsageMark(getShortestUsageMark(programField), - "is referenced by ", - 1, - programClass, - programField); - - super.markProgramFieldBody(programClass, programField); - - currentUsageMark = previousUsageMark; - } - - - protected void markProgramMethodBody(ProgramClass programClass, ProgramMethod programMethod) - { - ShortestUsageMark previousUsageMark = currentUsageMark; - - currentUsageMark = new ShortestUsageMark(getShortestUsageMark(programMethod), - "is invoked by ", - 1, - programClass, - programMethod); - - super.markProgramMethodBody(programClass, programMethod); - - currentUsageMark = previousUsageMark; - } - - - protected void markMethodHierarchy(Clazz clazz, Method method) - { - ShortestUsageMark previousUsageMark = currentUsageMark; - - currentUsageMark = new ShortestUsageMark(getShortestUsageMark(method), - "implements ", - 100, - clazz, - method); - - super.markMethodHierarchy(clazz, method); - - currentUsageMark = previousUsageMark; - } - - - // Small utility methods. - - protected void markAsUsed(VisitorAccepter visitorAccepter) - { - Object visitorInfo = visitorAccepter.getVisitorInfo(); - - ShortestUsageMark shortestUsageMark = - visitorInfo != null && - visitorInfo instanceof ShortestUsageMark && - !((ShortestUsageMark)visitorInfo).isCertain() && - !currentUsageMark.isShorter((ShortestUsageMark)visitorInfo) ? - new ShortestUsageMark((ShortestUsageMark)visitorInfo, true): - currentUsageMark; - - visitorAccepter.setVisitorInfo(shortestUsageMark); - } - - - protected boolean shouldBeMarkedAsUsed(VisitorAccepter visitorAccepter) - { - Object visitorInfo = visitorAccepter.getVisitorInfo(); - - return //!(visitorAccepter instanceof Clazz && - // isCausedBy(currentUsageMark, (Clazz)visitorAccepter)) && - (visitorInfo == null || - !(visitorInfo instanceof ShortestUsageMark) || - !((ShortestUsageMark)visitorInfo).isCertain() || - currentUsageMark.isShorter((ShortestUsageMark)visitorInfo)); - } - - - protected boolean isUsed(VisitorAccepter visitorAccepter) - { - Object visitorInfo = visitorAccepter.getVisitorInfo(); - - return visitorInfo != null && - visitorInfo instanceof ShortestUsageMark && - ((ShortestUsageMark)visitorInfo).isCertain(); - } - - - protected void markAsPossiblyUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(new ShortestUsageMark(currentUsageMark, false)); - } - - - protected boolean shouldBeMarkedAsPossiblyUsed(VisitorAccepter visitorAccepter) - { - Object visitorInfo = visitorAccepter.getVisitorInfo(); - - return visitorInfo == null || - !(visitorInfo instanceof ShortestUsageMark) || - (!((ShortestUsageMark)visitorInfo).isCertain() && - currentUsageMark.isShorter((ShortestUsageMark)visitorInfo)); - } - - - protected boolean isPossiblyUsed(VisitorAccepter visitorAccepter) - { - Object visitorInfo = visitorAccepter.getVisitorInfo(); - - return visitorInfo != null && - visitorInfo instanceof ShortestUsageMark && - !((ShortestUsageMark)visitorInfo).isCertain(); - } - - - protected ShortestUsageMark getShortestUsageMark(VisitorAccepter visitorAccepter) - { - Object visitorInfo = visitorAccepter.getVisitorInfo(); - - return (ShortestUsageMark)visitorInfo; - } - - - // Small utility methods. - - private boolean isCausedBy(ShortestUsageMark shortestUsageMark, - Clazz clazz) - { - return recursiveCauseChecker.check(shortestUsageMark, clazz); - } - - - private class MyRecursiveCauseChecker implements ClassVisitor, MemberVisitor - { - private Clazz checkClass; - private boolean isRecursing; - - - public boolean check(ShortestUsageMark shortestUsageMark, - Clazz clazz) - { - checkClass = clazz; - isRecursing = false; - - shortestUsageMark.acceptClassVisitor(this); - shortestUsageMark.acceptMemberVisitor(this); - - return isRecursing; - } - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - checkCause(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - checkCause(libraryClass); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - checkCause(programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - checkCause(programMethod); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - checkCause(libraryField); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - checkCause(libraryMethod); - } - - - // Small utility methods. - - private void checkCause(VisitorAccepter visitorAccepter) - { - if (ShortestUsageMarker.this.isUsed(visitorAccepter)) - { - ShortestUsageMark shortestUsageMark = ShortestUsageMarker.this.getShortestUsageMark(visitorAccepter); - - // Check the class of this mark, if any - isRecursing = shortestUsageMark.isCausedBy(checkClass); - - // Check the causing class or method, if still necessary. - if (!isRecursing) - { - shortestUsageMark.acceptClassVisitor(this); - shortestUsageMark.acceptMemberVisitor(this); - } - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsagePrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsagePrinter.java deleted file mode 100644 index eb6897ac..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/ShortestUsagePrinter.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.io.PrintStream; - - -/** - * This ClassVisitor and MemberVisitor prints out the reasons why - * classes and class members have been marked as being used. - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class ShortestUsagePrinter -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - private final ShortestUsageMarker shortestUsageMarker; - private final boolean verbose; - private final PrintStream ps; - - - /** - * Creates a new UsagePrinter that prints verbosely to System.out. - * @param shortestUsageMarker the usage marker that was used to mark the - * classes and class members. - */ - public ShortestUsagePrinter(ShortestUsageMarker shortestUsageMarker) - { - this(shortestUsageMarker, true); - } - - - /** - * Creates a new UsagePrinter that prints to the given stream. - * @param shortestUsageMarker the usage marker that was used to mark the - * classes and class members. - * @param verbose specifies whether the output should be verbose. - */ - public ShortestUsagePrinter(ShortestUsageMarker shortestUsageMarker, - boolean verbose) - { - this(shortestUsageMarker, verbose, System.out); - } - - /** - * Creates a new UsagePrinter that prints to the given stream. - * @param shortestUsageMarker the usage marker that was used to mark the - * classes and class members. - * @param verbose specifies whether the output should be verbose. - * @param printStream the stream to which to print. - */ - public ShortestUsagePrinter(ShortestUsageMarker shortestUsageMarker, - boolean verbose, - PrintStream printStream) - { - this.shortestUsageMarker = shortestUsageMarker; - this.verbose = verbose; - this.ps = printStream; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - // Print the name of this class. - ps.println(ClassUtil.externalClassName(programClass.getName())); - - // Print the reason for keeping this class. - printReason(programClass); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Print the name of this class. - ps.println(ClassUtil.externalClassName(libraryClass.getName())); - - // Print the reason for keeping this class. - ps.println(" is a library class.\n"); - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Print the name of this field. - String name = programField.getName(programClass); - String type = programField.getDescriptor(programClass); - - ps.println(ClassUtil.externalClassName(programClass.getName()) + - (verbose ? - ": " + ClassUtil.externalFullFieldDescription(0, name, type): - "." + name)); - - // Print the reason for keeping this method. - printReason(programField); - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Print the name of this method. - String name = programMethod.getName(programClass); - String type = programMethod.getDescriptor(programClass); - - ps.print(ClassUtil.externalClassName(programClass.getName()) + - (verbose ? - ": " + ClassUtil.externalFullMethodDescription(programClass.getName(), 0, name, type): - "." + name)); - programMethod.attributesAccept(programClass, this); - ps.println(); - - // Print the reason for keeping this method. - printReason(programMethod); - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - // Print the name of this field. - String name = libraryField.getName(libraryClass); - String type = libraryField.getDescriptor(libraryClass); - - ps.println(ClassUtil.externalClassName(libraryClass.getName()) + - (verbose ? - ": " + ClassUtil.externalFullFieldDescription(0, name, type): - "." + name)); - - // Print the reason for keeping this field. - ps.println(" is a library field.\n"); - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - // Print the name of this method. - String name = libraryMethod.getName(libraryClass); - String type = libraryMethod.getDescriptor(libraryClass); - - ps.println(ClassUtil.externalClassName(libraryClass.getName()) + - (verbose ? - ": " + ClassUtil.externalFullMethodDescription(libraryClass.getName(), 0, name, type): - "." + name)); - - // Print the reason for keeping this method. - ps.println(" is a library method.\n"); - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - ps.print(" (" + - lineNumberTableAttribute.getLowestLineNumber() + ":" + - lineNumberTableAttribute.getHighestLineNumber() + ")"); - } - - - // Small utility methods. - - private void printReason(VisitorAccepter visitorAccepter) - { - if (shortestUsageMarker.isUsed(visitorAccepter)) - { - ShortestUsageMark shortestUsageMark = shortestUsageMarker.getShortestUsageMark(visitorAccepter); - - // Print the reason for keeping this class. - ps.print(" " + shortestUsageMark.getReason()); - - // Print the class or method that is responsible, with its reasons. - shortestUsageMark.acceptClassVisitor(this); - shortestUsageMark.acceptMemberVisitor(this); - } - else - { - ps.println(" is not being kept.\n"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/Shrinker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/Shrinker.java deleted file mode 100644 index 758160cc..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/Shrinker.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.*; -import proguard.classfile.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.visitor.*; - -import java.io.*; - -/** - * This class shrinks class pools according to a given configuration. - * - * @author Eric Lafortune - */ -public class Shrinker -{ - private final Configuration configuration; - - - /** - * Creates a new Shrinker. - */ - public Shrinker(Configuration configuration) - { - this.configuration = configuration; - } - - - /** - * Performs shrinking of the given program class pool. - */ - public ClassPool execute(ClassPool programClassPool, - ClassPool libraryClassPool) throws IOException - { - // Check if we have at least some keep commands. - if (configuration.keep == null) - { - throw new IOException("You have to specify '-keep' options for the shrinking step."); - } - - // Clean up any old visitor info. - programClassPool.classesAccept(new ClassCleaner()); - libraryClassPool.classesAccept(new ClassCleaner()); - - // Create a visitor for marking the seeds. - UsageMarker usageMarker = configuration.whyAreYouKeeping == null ? - new UsageMarker() : - new ShortestUsageMarker(); - - // Automatically mark the parameterless constructors of seed classes, - // mainly for convenience and for backward compatibility. - ClassVisitor classUsageMarker = - new MultiClassVisitor(new ClassVisitor[] - { - usageMarker, - new NamedMethodVisitor(ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT, - usageMarker) - }); - - ClassPoolVisitor classPoolvisitor = - new KeepClassSpecificationVisitorFactory(true, false, false) - .createClassPoolVisitor(configuration.keep, - classUsageMarker, - usageMarker, - usageMarker, - usageMarker); - - // Mark the seeds. - programClassPool.accept(classPoolvisitor); - libraryClassPool.accept(classPoolvisitor); - libraryClassPool.classesAccept(usageMarker); - - // Mark interfaces that have to be kept. - programClassPool.classesAccept(new InterfaceUsageMarker(usageMarker)); - - // Mark the inner class and annotation information that has to be kept. - programClassPool.classesAccept( - new UsedClassFilter(usageMarker, - new AllAttributeVisitor(true, - new MultiAttributeVisitor(new AttributeVisitor[] - { - new InnerUsageMarker(usageMarker), - new AnnotationUsageMarker(usageMarker), - new LocalVariableTypeUsageMarker(usageMarker) - })))); - - // Should we explain ourselves? - if (configuration.whyAreYouKeeping != null) - { - System.out.println(); - - // Create a visitor for explaining classes and class members. - ShortestUsagePrinter shortestUsagePrinter = - new ShortestUsagePrinter((ShortestUsageMarker)usageMarker, - configuration.verbose); - - ClassPoolVisitor whyClassPoolvisitor = - new ClassSpecificationVisitorFactory() - .createClassPoolVisitor(configuration.whyAreYouKeeping, - shortestUsagePrinter, - shortestUsagePrinter, - shortestUsagePrinter, - null); - - // Mark the seeds. - programClassPool.accept(whyClassPoolvisitor); - libraryClassPool.accept(whyClassPoolvisitor); - } - - if (configuration.printUsage != null) - { - PrintStream ps = - configuration.printUsage == Configuration.STD_OUT ? System.out : - new PrintStream( - new BufferedOutputStream( - new FileOutputStream(configuration.printUsage))); - - // Print out items that will be removed. - programClassPool.classesAcceptAlphabetically( - new UsagePrinter(usageMarker, true, ps)); - - if (ps == System.out) - { - ps.flush(); - } - else - { - ps.close(); - } - } - - // Clean up used program classes and discard unused program classes. - int originalProgramClassPoolSize = programClassPool.size(); - - ClassPool newProgramClassPool = new ClassPool(); - programClassPool.classesAccept( - new UsedClassFilter(usageMarker, - new MultiClassVisitor( - new ClassShrinker(usageMarker), - new ClassPoolFiller(newProgramClassPool) - ))); - - programClassPool.clear(); - - // Clean up library classes. - libraryClassPool.classesAccept( - new ClassShrinker(usageMarker)); - - // Check if we have at least some output classes. - int newProgramClassPoolSize = newProgramClassPool.size(); - - if (configuration.verbose) - { - System.out.println("Removing unused program classes and class elements..."); - System.out.println(" Original number of program classes: " + originalProgramClassPoolSize); - System.out.println(" Final number of program classes: " + newProgramClassPoolSize); - } - - if (newProgramClassPoolSize == 0 && - (configuration.warn == null || !configuration.warn.isEmpty())) - { - if (configuration.ignoreWarnings) - { - System.err.println("Warning: the output jar is empty. Did you specify the proper '-keep' options?"); - } - else - { - throw new IOException("The output jar is empty. Did you specify the proper '-keep' options?"); - } - } - - return newProgramClassPool; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsageMarker.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsageMarker.java deleted file mode 100644 index acdfeda4..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsageMarker.java +++ /dev/null @@ -1,1248 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.annotation.*; -import proguard.classfile.attribute.module.*; -import proguard.classfile.attribute.module.visitor.*; -import proguard.classfile.attribute.preverification.*; -import proguard.classfile.attribute.preverification.visitor.*; -import proguard.classfile.attribute.visitor.*; -import proguard.classfile.constant.*; -import proguard.classfile.constant.visitor.*; -import proguard.classfile.instruction.*; -import proguard.classfile.instruction.visitor.InstructionVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -/** - * This ClassVisitor and MemberVisitor recursively marks all classes and class - * elements that are being used. - * - * @see ClassShrinker - * - * @author Eric Lafortune - */ -class UsageMarker -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - ConstantVisitor, - AttributeVisitor, - InnerClassesInfoVisitor, - ExceptionInfoVisitor, - StackMapFrameVisitor, - VerificationTypeVisitor, - ParameterInfoVisitor, - LocalVariableInfoVisitor, - LocalVariableTypeInfoVisitor, - RequiresInfoVisitor, - ExportsInfoVisitor, - OpensInfoVisitor, - ProvidesInfoVisitor, -// AnnotationVisitor, -// ElementValueVisitor, - InstructionVisitor -{ - // A visitor info flag to indicate the ProgramMember object is being used, - // if its Clazz can be determined as being used as well. - private static final Object POSSIBLY_USED = new Object(); - // A visitor info flag to indicate the visitor accepter is being used. - private static final Object USED = new Object(); - - - private final MyInterfaceUsageMarker interfaceUsageMarker = new MyInterfaceUsageMarker(); - private final MyDefaultMethodUsageMarker defaultMethodUsageMarker = new MyDefaultMethodUsageMarker(); - private final MyPossiblyUsedMemberUsageMarker possiblyUsedMemberUsageMarker = new MyPossiblyUsedMemberUsageMarker(); - private final MemberVisitor nonEmptyMethodUsageMarker = new AllAttributeVisitor( - new MyNonEmptyMethodUsageMarker()); - private final ConstantVisitor parameterlessConstructorMarker = new ConstantTagFilter(new int[] { ClassConstants.CONSTANT_String, ClassConstants.CONSTANT_Class }, - new ReferencedClassVisitor( - new NamedMethodVisitor(ClassConstants.METHOD_NAME_INIT, - ClassConstants.METHOD_TYPE_INIT, - this))); - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (shouldBeMarkedAsUsed(programClass)) - { - // Mark this class. - markAsUsed(programClass); - - markProgramClassBody(programClass); - } - } - - - protected void markProgramClassBody(ProgramClass programClass) - { - // Mark this class's name. - markConstant(programClass, programClass.u2thisClass); - - // Mark the superclass. - if (programClass.u2superClass != 0) - { - markConstant(programClass, programClass.u2superClass); - } - - // Give the interfaces preliminary marks. - programClass.hierarchyAccept(false, false, true, false, - interfaceUsageMarker); - - // Explicitly mark the method, if it's not empty. - programClass.methodAccept(ClassConstants.METHOD_NAME_CLINIT, - ClassConstants.METHOD_TYPE_CLINIT, - nonEmptyMethodUsageMarker); - - // Process all class members that have already been marked as possibly used. - programClass.fieldsAccept(possiblyUsedMemberUsageMarker); - programClass.methodsAccept(possiblyUsedMemberUsageMarker); - - // Mark the attributes. - programClass.attributesAccept(this); - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (shouldBeMarkedAsUsed(libraryClass)) - { - markAsUsed(libraryClass); - - // We're not going to analyze all library code. We're assuming that - // if this class is being used, all of its methods will be used as - // well. We'll mark them as such (here and in all subclasses). - - // Mark the superclass. - Clazz superClass = libraryClass.superClass; - if (superClass != null) - { - superClass.accept(this); - } - - // Mark the interfaces. - Clazz[] interfaceClasses = libraryClass.interfaceClasses; - if (interfaceClasses != null) - { - for (int index = 0; index < interfaceClasses.length; index++) - { - if (interfaceClasses[index] != null) - { - interfaceClasses[index].accept(this); - } - } - } - - // Mark all methods. - libraryClass.methodsAccept(this); - } - } - - - /** - * This ClassVisitor marks ProgramClass objects as possibly used, - * and it visits LibraryClass objects with its outer UsageMarker. - */ - private class MyInterfaceUsageMarker - implements ClassVisitor - { - public void visitProgramClass(ProgramClass programClass) - { - if (shouldBeMarkedAsPossiblyUsed(programClass)) - { - // We can't process the interface yet, because it might not - // be required. Give it a preliminary mark. - markAsPossiblyUsed(programClass); - } - } - - public void visitLibraryClass(LibraryClass libraryClass) - { - // Make sure all library interface methods are marked. - UsageMarker.this.visitLibraryClass(libraryClass); - } - } - - - /** - * This MemberVisitor marks ProgramMethod objects of default - * implementations that may be present in interface classes. - */ - private class MyDefaultMethodUsageMarker - extends SimplifiedVisitor - implements MemberVisitor - { - // Implementations for MemberVisitor. - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (shouldBeMarkedAsUsed(programMethod)) - { - markAsUsed(programMethod); - - // Mark the method body. - markProgramMethodBody(programClass, programMethod); - - // Note that, if the method has been marked as possibly used, - // the method hierarchy has already been marked (cfr. below). - } - } - } - - - /** - * This MemberVisitor marks ProgramField and ProgramMethod objects that - * have already been marked as possibly used. - */ - private class MyPossiblyUsedMemberUsageMarker - extends SimplifiedVisitor - implements MemberVisitor - { - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - // Has the method already been referenced? - if (isPossiblyUsed(programField)) - { - markAsUsed(programField); - - // Mark the name and descriptor. - markConstant(programClass, programField.u2nameIndex); - markConstant(programClass, programField.u2descriptorIndex); - - // Mark the attributes. - programField.attributesAccept(programClass, UsageMarker.this); - - // Mark the classes referenced in the descriptor string. - programField.referencedClassesAccept(UsageMarker.this); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - // Has the method already been referenced? - if (isPossiblyUsed(programMethod)) - { - markAsUsed(programMethod); - - // Mark the method body. - markProgramMethodBody(programClass, programMethod); - - // Note that, if the method has been marked as possibly used, - // the method hierarchy has already been marked (cfr. below). - } - } - } - - - /** - * This AttributeVisitor marks ProgramMethod objects of non-empty methods. - */ - private class MyNonEmptyMethodUsageMarker - extends SimplifiedVisitor - implements AttributeVisitor - { - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - if (codeAttribute.u4codeLength > 1) - { - method.accept(clazz, UsageMarker.this); - } - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (shouldBeMarkedAsUsed(programField)) - { - // Is the field's class used? - if (isUsed(programClass)) - { - markAsUsed(programField); - - // Mark the field body. - markProgramFieldBody(programClass, programField); - } - - // Hasn't the field been marked as possibly being used yet? - else if (shouldBeMarkedAsPossiblyUsed(programField)) - { - // We can't process the field yet, because the class isn't - // marked as being used (yet). Give it a preliminary mark. - markAsPossiblyUsed(programField); - } - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (shouldBeMarkedAsUsed(programMethod)) - { - // Is the method's class used? - if (isUsed(programClass)) - { - markAsUsed(programMethod); - - // Mark the method body. - markProgramMethodBody(programClass, programMethod); - - // Mark the method hierarchy. - markMethodHierarchy(programClass, programMethod); - } - - // Hasn't the method been marked as possibly being used yet? - else if (shouldBeMarkedAsPossiblyUsed(programMethod)) - { - // We can't process the method yet, because the class isn't - // marked as being used (yet). Give it a preliminary mark. - markAsPossiblyUsed(programMethod); - - // Mark the method hierarchy. - markMethodHierarchy(programClass, programMethod); - } - } - } - - - public void visitLibraryField(LibraryClass programClass, LibraryField programField) {} - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (shouldBeMarkedAsUsed(libraryMethod)) - { - markAsUsed(libraryMethod); - - // Mark the method hierarchy. - markMethodHierarchy(libraryClass, libraryMethod); - } - } - - - protected void markProgramFieldBody(ProgramClass programClass, ProgramField programField) - { - // Mark the name and descriptor. - markConstant(programClass, programField.u2nameIndex); - markConstant(programClass, programField.u2descriptorIndex); - - // Mark the attributes. - programField.attributesAccept(programClass, this); - - // Mark the classes referenced in the descriptor string. - programField.referencedClassesAccept(this); - } - - - protected void markProgramMethodBody(ProgramClass programClass, ProgramMethod programMethod) - { - // Mark the name and descriptor. - markConstant(programClass, programMethod.u2nameIndex); - markConstant(programClass, programMethod.u2descriptorIndex); - - // Mark the attributes. - programMethod.attributesAccept(programClass, this); - - // Mark the classes referenced in the descriptor string. - programMethod.referencedClassesAccept(this); - } - - - /** - * Marks the hierarchy of implementing or overriding methods corresponding - * to the given method, if any. - */ - protected void markMethodHierarchy(Clazz clazz, Method method) - { - // Only visit the hierarchy if the method is not private, static, or - // an initializer. - int accessFlags = method.getAccessFlags(); - if ((accessFlags & - (ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC)) == 0 && - !ClassUtil.isInitializer(method.getName(clazz))) - { - // We can skip private and static methods in the hierarchy, and - // also abstract methods, unless they might widen a current - // non-public access. - int requiredUnsetAccessFlags = - ClassConstants.ACC_PRIVATE | - ClassConstants.ACC_STATIC | - ((accessFlags & ClassConstants.ACC_PUBLIC) == 0 ? 0 : - ClassConstants.ACC_ABSTRACT); - - // Mark default implementations in interfaces down the hierarchy, - // if this is an interface itself. - // TODO: This may be premature if there aren't any concrete implementing classes. - clazz.accept(new ClassAccessFilter(ClassConstants.ACC_INTERFACE, 0, - new ClassHierarchyTraveler(false, false, false, true, - new ProgramClassFilter( - new ClassAccessFilter(ClassConstants.ACC_INTERFACE, 0, - new NamedMethodVisitor(method.getName(clazz), - method.getDescriptor(clazz), - new MemberAccessFilter(0, requiredUnsetAccessFlags, - defaultMethodUsageMarker))))))); - - // Mark other implementations. - clazz.accept(new ConcreteClassDownTraveler( - new ClassHierarchyTraveler(true, true, false, true, - new NamedMethodVisitor(method.getName(clazz), - method.getDescriptor(clazz), - new MemberAccessFilter(0, requiredUnsetAccessFlags, - this))))); - } - } - - - // Implementations for ConstantVisitor. - - public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) - { - if (shouldBeMarkedAsUsed(integerConstant)) - { - markAsUsed(integerConstant); - } - } - - - public void visitLongConstant(Clazz clazz, LongConstant longConstant) - { - if (shouldBeMarkedAsUsed(longConstant)) - { - markAsUsed(longConstant); - } - } - - - public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) - { - if (shouldBeMarkedAsUsed(floatConstant)) - { - markAsUsed(floatConstant); - } - } - - - public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) - { - if (shouldBeMarkedAsUsed(doubleConstant)) - { - markAsUsed(doubleConstant); - } - } - - - public void visitPrimitiveArrayConstant(Clazz clazz, PrimitiveArrayConstant primitiveArrayConstant) - { - if (shouldBeMarkedAsUsed(primitiveArrayConstant)) - { - markAsUsed(primitiveArrayConstant); - } - } - - - public void visitStringConstant(Clazz clazz, StringConstant stringConstant) - { - if (shouldBeMarkedAsUsed(stringConstant)) - { - markAsUsed(stringConstant); - - markConstant(clazz, stringConstant.u2stringIndex); - - // Mark the referenced class and class member, if any. - stringConstant.referencedClassAccept(this); - stringConstant.referencedMemberAccept(this); - } - } - - - public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) - { - if (shouldBeMarkedAsUsed(utf8Constant)) - { - markAsUsed(utf8Constant); - } - } - - - public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) - { - if (shouldBeMarkedAsUsed(invokeDynamicConstant)) - { - markAsUsed(invokeDynamicConstant); - - markConstant(clazz, invokeDynamicConstant.u2nameAndTypeIndex); - - // Mark the referenced descriptor classes. - invokeDynamicConstant.referencedClassesAccept(this); - - // Mark the bootstrap methods attribute. - clazz.attributesAccept(new MyBootStrapMethodUsageMarker(invokeDynamicConstant.u2bootstrapMethodAttributeIndex)); - } - } - - - public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstant methodHandleConstant) - { - if (shouldBeMarkedAsUsed(methodHandleConstant)) - { - markAsUsed(methodHandleConstant); - - markConstant(clazz, methodHandleConstant.u2referenceIndex); - } - } - - - public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) - { - if (shouldBeMarkedAsUsed(refConstant)) - { - markAsUsed(refConstant); - - markConstant(clazz, refConstant.u2classIndex); - markConstant(clazz, refConstant.u2nameAndTypeIndex); - - // When compiled with "-target 1.2" or higher, the class or - // interface actually containing the referenced class member may - // be higher up the hierarchy. Make sure it's marked, in case it - // isn't used elsewhere. - refConstant.referencedClassAccept(this); - - // Mark the referenced class member itself. - refConstant.referencedMemberAccept(this); - } - } - - - public void visitClassConstant(Clazz clazz, ClassConstant classConstant) - { - if (shouldBeMarkedAsUsed(classConstant)) - { - markAsUsed(classConstant); - - markConstant(clazz, classConstant.u2nameIndex); - - // Mark the referenced class itself. - classConstant.referencedClassAccept(this); - } - } - - - public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant methodTypeConstant) - { - if (shouldBeMarkedAsUsed(methodTypeConstant)) - { - markAsUsed(methodTypeConstant); - - markConstant(clazz, methodTypeConstant.u2descriptorIndex); - - // Mark the referenced descriptor classes. - methodTypeConstant.referencedClassesAccept(this); - } - } - - - public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) - { - if (shouldBeMarkedAsUsed(nameAndTypeConstant)) - { - markAsUsed(nameAndTypeConstant); - - markConstant(clazz, nameAndTypeConstant.u2nameIndex); - markConstant(clazz, nameAndTypeConstant.u2descriptorIndex); - } - } - - - public void visitModuleConstant(Clazz clazz, ModuleConstant moduleConstant) - { - if (shouldBeMarkedAsUsed(moduleConstant)) - { - markAsUsed(moduleConstant); - - markConstant(clazz, moduleConstant.u2nameIndex); - } - } - - - public void visitPackageConstant(Clazz clazz, PackageConstant packageConstant) - { - if (shouldBeMarkedAsUsed(packageConstant)) - { - markAsUsed(packageConstant); - - markConstant(clazz, packageConstant.u2nameIndex); - } - } - - - /** - * This AttributeVisitor marks the bootstrap methods attributes, their - * method entries, their method handles, and their arguments. - */ - private class MyBootStrapMethodUsageMarker - extends SimplifiedVisitor - implements AttributeVisitor, - BootstrapMethodInfoVisitor - { - private int bootstrapMethodIndex; - - - private MyBootStrapMethodUsageMarker(int bootstrapMethodIndex) - { - this.bootstrapMethodIndex = bootstrapMethodIndex; - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - if (shouldBeMarkedAsUsed(bootstrapMethodsAttribute)) - { - markAsUsed(bootstrapMethodsAttribute); - - markConstant(clazz, bootstrapMethodsAttribute.u2attributeNameIndex); - } - - bootstrapMethodsAttribute.bootstrapMethodEntryAccept(clazz, - bootstrapMethodIndex, - this); - } - - - // Implementations for BootstrapMethodInfoVisitor. - - public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo bootstrapMethodInfo) - { - markAsUsed(bootstrapMethodInfo); - - markConstant(clazz, bootstrapMethodInfo.u2methodHandleIndex); - - // Mark the constant pool entries referenced by the arguments. - bootstrapMethodInfo.methodArgumentsAccept(clazz, UsageMarker.this); - } - } - - - // Implementations for AttributeVisitor. - // Note that attributes are typically only referenced once, so we don't - // test if they have been marked already. - - public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) - { - // This is the best we can do for unknown attributes. - markAsUsed(unknownAttribute); - - markConstant(clazz, unknownAttribute.u2attributeNameIndex); - } - - - public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) - { - // Don't mark the attribute and its name here. We may mark it in - // MyBootStrapMethodsAttributeUsageMarker. - } - - - public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) - { - markAsUsed(sourceFileAttribute); - - markConstant(clazz, sourceFileAttribute.u2attributeNameIndex); - markConstant(clazz, sourceFileAttribute.u2sourceFileIndex); - } - - - public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) - { - markAsUsed(sourceDirAttribute); - - markConstant(clazz, sourceDirAttribute.u2attributeNameIndex); - markConstant(clazz, sourceDirAttribute.u2sourceDirIndex); - } - - - public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) - { - // Don't mark the attribute and its name yet. We may mark it later, in - // InnerUsageMarker. - //markAsUsed(innerClassesAttribute); - - //markConstant(clazz, innerClassesAttribute.u2attrNameIndex); - - // Do mark the outer class entries. - innerClassesAttribute.innerClassEntriesAccept(clazz, this); - } - - - public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) - { - markAsUsed(enclosingMethodAttribute); - - markConstant(clazz, enclosingMethodAttribute.u2attributeNameIndex); - markConstant(clazz, enclosingMethodAttribute.u2classIndex); - - if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) - { - markConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex); - } - } - - - public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAttribute) - { - markAsUsed(moduleAttribute); - - markConstant(clazz, moduleAttribute.u2attributeNameIndex); - markConstant(clazz, moduleAttribute.u2moduleNameIndex); - - if (moduleAttribute.u2moduleVersionIndex != 0) - { - markConstant(clazz, moduleAttribute.u2moduleVersionIndex); - } - moduleAttribute.requiresAccept(clazz, this); - moduleAttribute.exportsAccept(clazz, this); - moduleAttribute.opensAccept(clazz, this); - - for (int index = 0; index < moduleAttribute.u2usesCount; index++) - { - markConstant(clazz, moduleAttribute.u2uses[index]); - } - - moduleAttribute.providesAccept(clazz, this); - } - - - public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClassAttribute moduleMainClassAttribute) - { - markAsUsed(moduleMainClassAttribute); - - markConstant(clazz, moduleMainClassAttribute.u2attributeNameIndex); - markConstant(clazz, moduleMainClassAttribute.u2mainClass); - } - - - public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAttribute modulePackagesAttribute) - { - markAsUsed(modulePackagesAttribute); - - markConstant(clazz, modulePackagesAttribute.u2attributeNameIndex); - modulePackagesAttribute.packagesAccept(clazz, this); - } - - - public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) - { - markAsUsed(deprecatedAttribute); - - markConstant(clazz, deprecatedAttribute.u2attributeNameIndex); - } - - - public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) - { - markAsUsed(syntheticAttribute); - - markConstant(clazz, syntheticAttribute.u2attributeNameIndex); - } - - - public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) - { - markAsUsed(signatureAttribute); - - markConstant(clazz, signatureAttribute.u2attributeNameIndex); - markConstant(clazz, signatureAttribute.u2signatureIndex); - - // Don't mark the referenced classes. We'll clean them up in - // ClassShrinker, if they appear unused. - //// Mark the classes referenced in the descriptor string. - //signatureAttribute.referencedClassesAccept(this); - } - - - public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) - { - markAsUsed(constantValueAttribute); - - markConstant(clazz, constantValueAttribute.u2attributeNameIndex); - markConstant(clazz, constantValueAttribute.u2constantValueIndex); - } - - - public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute) - { - markAsUsed(methodParametersAttribute); - - markConstant(clazz, methodParametersAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the parameter information. - methodParametersAttribute.parametersAccept(clazz, method, this); - } - - - public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) - { - markAsUsed(exceptionsAttribute); - - markConstant(clazz, exceptionsAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the exceptions. - exceptionsAttribute.exceptionEntriesAccept((ProgramClass)clazz, this); - } - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - markAsUsed(codeAttribute); - - markConstant(clazz, codeAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the instructions, - // by the exceptions, and by the attributes. - codeAttribute.instructionsAccept(clazz, method, this); - codeAttribute.exceptionsAccept(clazz, method, this); - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) - { - markAsUsed(stackMapAttribute); - - markConstant(clazz, stackMapAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the stack map frames. - stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) - { - markAsUsed(stackMapTableAttribute); - - markConstant(clazz, stackMapTableAttribute.u2attributeNameIndex); - - // Mark the constant pool entries referenced by the stack map frames. - stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - markAsUsed(lineNumberTableAttribute); - - markConstant(clazz, lineNumberTableAttribute.u2attributeNameIndex); - } - - - public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) - { - // Don't mark the attribute and its contents yet. We may mark them later, - // in LocalVariableTypeUsageMarker. - //markAsUsed(localVariableTableAttribute); - // - //markConstant(clazz, localVariableTableAttribute.u2attributeNameIndex); - // - //// Mark the constant pool entries referenced by the local variables. - //localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) - { - // Don't mark the attribute and its contents yet. We may mark them later, - // in LocalVariableTypeUsageMarker. - //markAsUsed(localVariableTypeTableAttribute); - // - //markConstant(clazz, localVariableTypeTableAttribute.u2attributeNameIndex); - // - //// Mark the constant pool entries referenced by the local variable types. - //localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); - } - - - public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) - { - // Don't mark the attribute and its contents yet. We may mark them later, - // in AnnotationUsageMarker. - //markAsUsed(annotationsAttribute); - // - //markConstant(clazz, annotationsAttribute.u2attributeNameIndex); - // - //// Mark the constant pool entries referenced by the annotations. - //annotationsAttribute.annotationsAccept(clazz, this); - } - - - public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) - { - // Don't mark the attribute and its contents yet. We may mark them later, - // in AnnotationUsageMarker. - //markAsUsed(parameterAnnotationsAttribute); - // - //markConstant(clazz, parameterAnnotationsAttribute.u2attributeNameIndex); - // - //// Mark the constant pool entries referenced by the annotations. - //parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); - } - - - public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) - { - // Don't mark the attribute and its contents yet. We may mark them later, - // in AnnotationUsageMarker. - //markAsUsed(annotationDefaultAttribute); - // - //markConstant(clazz, annotationDefaultAttribute.u2attributeNameIndex); - // - //// Mark the constant pool entries referenced by the element value. - //annotationDefaultAttribute.defaultValueAccept(clazz, this); - } - - - // Implementations for ExceptionInfoVisitor. - - public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) - { - markAsUsed(exceptionInfo); - - if (exceptionInfo.u2catchType != 0) - { - markConstant(clazz, exceptionInfo.u2catchType); - } - } - - - // Implementations for InnerClassesInfoVisitor. - - public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) - { - // At this point, we only mark outer classes of this class. - // Inner class can be marked later, by InnerUsageMarker. - if (innerClassesInfo.u2innerClassIndex != 0 && - clazz.getName().equals(clazz.getClassName(innerClassesInfo.u2innerClassIndex))) - { - markAsUsed(innerClassesInfo); - - innerClassesInfo.innerClassConstantAccept(clazz, this); - innerClassesInfo.outerClassConstantAccept(clazz, this); - innerClassesInfo.innerNameConstantAccept(clazz, this); - } - } - - - // Implementations for StackMapFrameVisitor. - - public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) {} - - - public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) - { - // Mark the constant pool entries referenced by the verification types. - sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) - { - // Mark the constant pool entries referenced by the verification types. - moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); - } - - - public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) - { - // Mark the constant pool entries referenced by the verification types. - fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); - fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); - } - - - // Implementations for VerificationTypeVisitor. - - public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) {} - - - public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) - { - markConstant(clazz, objectType.u2classIndex); - } - - - // Implementations for ParameterInfoVisitor. - - public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo) - { - parameterInfo.nameConstantAccept (clazz, this); - } - - - // Implementations for LocalVariableInfoVisitor. - - public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) - { - markConstant(clazz, localVariableInfo.u2nameIndex); - markConstant(clazz, localVariableInfo.u2descriptorIndex); - } - - - // Implementations for LocalVariableTypeInfoVisitor. - - public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) - { - markConstant(clazz, localVariableTypeInfo.u2nameIndex); - markConstant(clazz, localVariableTypeInfo.u2signatureIndex); - } - - - // Implementations for RequiresInfoVisitor. - - public void visitRequiresInfo(Clazz clazz, RequiresInfo requiresInfo) - { - markConstant(clazz, requiresInfo.u2requiresIndex); - markConstant(clazz, requiresInfo.u2requiresVersionIndex); - } - - - // Implementations for ExportsInfoVisitor. - - public void visitExportsInfo(Clazz clazz, ExportsInfo exportsInfo) - { - markConstant(clazz, exportsInfo.u2exportsIndex); - - for (int index = 0; index < exportsInfo.u2exportsToCount; index++) - { - markConstant(clazz, exportsInfo.u2exportsToIndex[index]); - } - } - - - // Implementations for OpensInfoVisitor. - - public void visitOpensInfo(Clazz clazz, OpensInfo opensInfo) - { - markConstant(clazz, opensInfo.u2opensIndex); - - for (int index = 0; index < opensInfo.u2opensToCount; index++) - { - markConstant(clazz, opensInfo.u2opensToIndex[index]); - } - } - - - // Implementations for ProvidesInfoVisitor. - - public void visitProvidesInfo(Clazz clazz, ProvidesInfo providesInfo) - { - markConstant(clazz, providesInfo.u2providesIndex); - - for (int index = 0; index < providesInfo.u2providesWithCount; index++) - { - markConstant(clazz, providesInfo.u2providesWithIndex[index]); - } - } - -// // Implementations for AnnotationVisitor. -// -// public void visitAnnotation(Clazz clazz, Annotation annotation) -// { -// markConstant(clazz, annotation.u2typeIndex); -// -// // Mark the constant pool entries referenced by the element values. -// annotation.elementValuesAccept(clazz, this); -// } -// -// -// // Implementations for ElementValueVisitor. -// -// public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) -// { -// if (constantElementValue.u2elementNameIndex != 0) -// { -// markConstant(clazz, constantElementValue.u2elementNameIndex); -// } -// -// markConstant(clazz, constantElementValue.u2constantValueIndex); -// } -// -// -// public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) -// { -// if (enumConstantElementValue.u2elementNameIndex != 0) -// { -// markConstant(clazz, enumConstantElementValue.u2elementNameIndex); -// } -// -// markConstant(clazz, enumConstantElementValue.u2typeNameIndex); -// markConstant(clazz, enumConstantElementValue.u2constantNameIndex); -// } -// -// -// public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) -// { -// if (classElementValue.u2elementNameIndex != 0) -// { -// markConstant(clazz, classElementValue.u2elementNameIndex); -// } -// -// // Mark the referenced class constant pool entry. -// markConstant(clazz, classElementValue.u2classInfoIndex); -// } -// -// -// public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) -// { -// if (annotationElementValue.u2elementNameIndex != 0) -// { -// markConstant(clazz, annotationElementValue.u2elementNameIndex); -// } -// -// // Mark the constant pool entries referenced by the annotation. -// annotationElementValue.annotationAccept(clazz, this); -// } -// -// -// public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) -// { -// if (arrayElementValue.u2elementNameIndex != 0) -// { -// markConstant(clazz, arrayElementValue.u2elementNameIndex); -// } -// -// // Mark the constant pool entries referenced by the element values. -// arrayElementValue.elementValuesAccept(clazz, annotation, this); -// } - - - // Implementations for InstructionVisitor. - - public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} - - - public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) - { - markConstant(clazz, constantInstruction.constantIndex); - - // Also mark the parameterless constructor of the class, in case the - // string constant or class constant is being used in a Class.forName - // or a .class construct. - clazz.constantPoolEntryAccept(constantInstruction.constantIndex, - parameterlessConstructorMarker); - } - - - // Small utility methods. - - /** - * Marks the given visitor accepter as being used. - */ - protected void markAsUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(USED); - } - - - /** - * Returns whether the given visitor accepter should still be marked as - * being used. - */ - protected boolean shouldBeMarkedAsUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() != USED; - } - - - /** - * Returns whether the given visitor accepter has been marked as being used. - */ - protected boolean isUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == USED; - } - - - /** - * Marks the given visitor accepter as possibly being used. - */ - protected void markAsPossiblyUsed(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(POSSIBLY_USED); - } - - - /** - * Returns whether the given visitor accepter should still be marked as - * possibly being used. - */ - protected boolean shouldBeMarkedAsPossiblyUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() != USED && - visitorAccepter.getVisitorInfo() != POSSIBLY_USED; - } - - - /** - * Returns whether the given visitor accepter has been marked as possibly - * being used. - */ - protected boolean isPossiblyUsed(VisitorAccepter visitorAccepter) - { - return visitorAccepter.getVisitorInfo() == POSSIBLY_USED; - } - - - /** - * Clears any usage marks from the given visitor accepter. - */ - protected void markAsUnused(VisitorAccepter visitorAccepter) - { - visitorAccepter.setVisitorInfo(null); - } - - - /** - * Marks the given constant pool entry of the given class. This includes - * visiting any referenced objects. - */ - private void markConstant(Clazz clazz, int index) - { - clazz.constantPoolEntryAccept(index, this); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsagePrinter.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsagePrinter.java deleted file mode 100644 index f8325c43..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsagePrinter.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.attribute.*; -import proguard.classfile.attribute.visitor.AttributeVisitor; -import proguard.classfile.util.*; -import proguard.classfile.visitor.*; - -import java.io.PrintStream; - - -/** - * This ClassVisitor prints out the classes and class members that have been - * marked as being used (or not used). - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class UsagePrinter -extends SimplifiedVisitor -implements ClassVisitor, - MemberVisitor, - AttributeVisitor -{ - private final UsageMarker usageMarker; - private final boolean printUnusedItems; - private final PrintStream ps; - - // A field to remember the class name, if a header is needed for class members. - private String className; - - - /** - * Creates a new UsagePrinter that prints to System.out. - * @param usageMarker the usage marker that was used to mark the - * classes and class members. - * @param printUnusedItems a flag that indicates whether only unused items - * should be printed, or alternatively, only used - * items. - */ - public UsagePrinter(UsageMarker usageMarker, - boolean printUnusedItems) - { - this(usageMarker, printUnusedItems, System.out); - } - - - /** - * Creates a new UsagePrinter that prints to the given stream. - * @param usageMarker the usage marker that was used to mark the - * classes and class members. - * @param printUnusedItems a flag that indicates whether only unused items - * should be printed, or alternatively, only used - * items. - * @param printStream the stream to which to print. - */ - public UsagePrinter(UsageMarker usageMarker, - boolean printUnusedItems, - PrintStream printStream) - { - this.usageMarker = usageMarker; - this.printUnusedItems = printUnusedItems; - this.ps = printStream; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (usageMarker.isUsed(programClass)) - { - if (printUnusedItems) - { - className = programClass.getName(); - - programClass.fieldsAccept(this); - programClass.methodsAccept(this); - - className = null; - } - else - { - ps.println(ClassUtil.externalClassName(programClass.getName())); - } - } - else - { - if (printUnusedItems) - { - ps.println(ClassUtil.externalClassName(programClass.getName())); - } - } - } - - - // Implementations for MemberVisitor. - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (usageMarker.isUsed(programField) ^ printUnusedItems) - { - printClassNameHeader(); - - ps.println(" " + - ClassUtil.externalFullFieldDescription( - programField.getAccessFlags(), - programField.getName(programClass), - programField.getDescriptor(programClass))); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (usageMarker.isUsed(programMethod) ^ printUnusedItems) - { - printClassNameHeader(); - - ps.print(" "); - programMethod.attributesAccept(programClass, this); - ps.println(ClassUtil.externalFullMethodDescription( - programClass.getName(), - programMethod.getAccessFlags(), - programMethod.getName(programClass), - programMethod.getDescriptor(programClass))); - } - } - - - // Implementations for AttributeVisitor. - - public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} - - - public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) - { - codeAttribute.attributesAccept(clazz, method, this); - } - - - public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) - { - ps.print(lineNumberTableAttribute.getLowestLineNumber() + ":" + - lineNumberTableAttribute.getHighestLineNumber() + ":"); - } - - - // Small utility methods. - - /** - * Prints the class name field. The field is then cleared, so it is not - * printed again. - */ - private void printClassNameHeader() - { - if (className != null) - { - ps.println(ClassUtil.externalClassName(className) + ":"); - className = null; - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsedClassFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsedClassFilter.java deleted file mode 100644 index 8fc5e13b..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsedClassFilter.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.visitor.ClassVisitor; - -/** - * This ClassVisitor delegates all its method calls to another ClassVisitor, - * but only for Clazz objects that are marked as used. - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class UsedClassFilter -implements ClassVisitor -{ - private final UsageMarker usageMarker; - private final ClassVisitor classVisitor; - - - /** - * Creates a new UsedClassFilter. - * @param usageMarker the usage marker that is used to mark the classes - * and class members. - * @param classVisitor the class visitor to which the visiting will be - * delegated. - */ - public UsedClassFilter(UsageMarker usageMarker, - ClassVisitor classVisitor) - { - this.usageMarker = usageMarker; - this.classVisitor = classVisitor; - } - - - // Implementations for ClassVisitor. - - public void visitProgramClass(ProgramClass programClass) - { - if (usageMarker.isUsed(programClass)) - { - classVisitor.visitProgramClass(programClass); - } - } - - - public void visitLibraryClass(LibraryClass libraryClass) - { - if (usageMarker.isUsed(libraryClass)) - { - classVisitor.visitLibraryClass(libraryClass); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsedMemberFilter.java b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsedMemberFilter.java deleted file mode 100644 index 82809156..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/UsedMemberFilter.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.shrink; - -import proguard.classfile.*; -import proguard.classfile.visitor.MemberVisitor; - -/** - * This MemberVisitor delegates all its method calls to another MemberVisitor, - * but only for Member objects that are marked as used. - * - * @see UsageMarker - * - * @author Eric Lafortune - */ -public class UsedMemberFilter -implements MemberVisitor -{ - private final UsageMarker usageMarker; - private final MemberVisitor memberVisitor; - - - /** - * Creates a new UsedMemberFilter. - * @param usageMarker the usage marker that is used to mark the classes - * and class members. - * @param memberVisitor the member visitor to which the visiting will be - * delegated. - */ - public UsedMemberFilter(UsageMarker usageMarker, - MemberVisitor memberVisitor) - { - this.usageMarker = usageMarker; - this.memberVisitor = memberVisitor; - } - - - // Implementations for MemberVisitor. - - - public void visitProgramField(ProgramClass programClass, ProgramField programField) - { - if (usageMarker.isUsed(programField)) - { - memberVisitor.visitProgramField(programClass, programField); - } - } - - - public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) - { - if (usageMarker.isUsed(programMethod)) - { - memberVisitor.visitProgramMethod(programClass, programMethod); - } - } - - - public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) - { - if (usageMarker.isUsed(libraryField)) - { - memberVisitor.visitLibraryField(libraryClass, libraryField); - } - } - - - public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) - { - if (usageMarker.isUsed(libraryMethod)) - { - memberVisitor.visitLibraryMethod(libraryClass, libraryMethod); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/shrink/package.html deleted file mode 100644 index 89731988..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/shrink/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains classes to perform shrinking of class files. - diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/AndMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/AndMatcher.java deleted file mode 100644 index 5bb774f7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/AndMatcher.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings matches both given StringMatcher - * instances. - * - * @author Eric Lafortune - */ -public class AndMatcher extends StringMatcher -{ - private final StringMatcher matcher1; - private final StringMatcher matcher2; - - - /** - * Creates a new AndMatcher with the two given string matchers. - */ - public AndMatcher(StringMatcher matcher1, StringMatcher matcher2) - { - this.matcher1 = matcher1; - this.matcher2 = matcher2; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return matcher1.matches(string, beginOffset, endOffset) && - matcher2.matches(string, beginOffset, endOffset); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ArrayUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ArrayUtil.java deleted file mode 100644 index dc06db5d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ArrayUtil.java +++ /dev/null @@ -1,1787 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import java.lang.reflect.Array; -import java.util.Arrays; - -/** - * This class contains utility methods operating on arrays. - */ -public class ArrayUtil -{ - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(boolean[] array1, boolean[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(byte[] array1, byte[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(char[] array1, char[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(short[] array1, short[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(int[] array1, int[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(long[] array1, long[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(float[] array1, float[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(double[] array1, double[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (array1[index] != array2[index]) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equal(Object[] array1, Object[] array2, int size) - { - for (int index = 0; index < size; index++) - { - if (!array1[index].equals(array2[index])) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the elements of the two given arrays are the same, or - * both arrays are null. - * @param array1 the first array. - * @param array2 the second array. - * @return whether the elements are the same. - */ - public static boolean equalOrNull(Object[] array1, Object[] array2) - { - return array1 == null ? array2 == null : - equalOrNull(array1, array2, array1.length); - } - - - /** - * Returns whether the elements of the two given arrays are the same, or - * both arrays are null. - * @param array1 the first array. - * @param array2 the second array. - * @param size the size of the arrays to be checked. - * @return whether the elements are the same. - */ - public static boolean equalOrNull(Object[] array1, Object[] array2, int size) - { - return array1 == null ? array2 == null : - array2 != null && - equal(array1, array2, size); - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(boolean[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - if (array[index]) - { - hashCode ^= 1; - } - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(byte[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - hashCode ^= array[index] & 0xff; - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(char[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - hashCode ^= array[index]; - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(short[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - hashCode ^= array[index] & 0xffff; - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(int[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - hashCode ^= array[index]; - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(long[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - long longBits = array[index]; - - hashCode ^= longBits | (longBits >>> 32); - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(float[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - hashCode ^= Float.floatToRawIntBits(array[index]); - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(double[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - long longBits = Double.doubleToRawLongBits(array[index]); - - hashCode ^= longBits | (longBits >>> 32); - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCode(Object[] array, int size) - { - int hashCode = 0; - - for (int index = 0; index < size; index++) - { - // Rotate the hash code. - hashCode = (hashCode << 1) | (hashCode >>> 31); - - // XOR the element. - hashCode ^= array[index].hashCode(); - } - - return hashCode; - } - - - /** - * Returns a hash code for the elements of the given array, or 0 if it is - * null. - * @param array the array. - * @return a hash code. - */ - public static int hashCodeOrNull(Object[] array) - { - return array == null ? 0 : hashCode(array, array.length); - } - - - /** - * Returns a hash code for the elements of the given array, or 0 if it is - * null. - * @param array the array. - * @param size the size of the array to be taken into account. - * @return a hash code. - */ - public static int hashCodeOrNull(Object[] array, int size) - { - return array == null ? 0 : hashCode(array, size); - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(boolean[] array1, int size1, - boolean[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (!array1[index] && array2[index]) - { - return -1; - } - else if (array1[index] && !array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(byte[] array1, int size1, - byte[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (array1[index] < array2[index]) - { - return -1; - } - else if (array1[index] > array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(char[] array1, int size1, - char[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (array1[index] < array2[index]) - { - return -1; - } - else if (array1[index] > array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(short[] array1, int size1, - short[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (array1[index] < array2[index]) - { - return -1; - } - else if (array1[index] > array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(int[] array1, int size1, - int[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (array1[index] < array2[index]) - { - return -1; - } - else if (array1[index] > array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(long[] array1, int size1, - long[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (array1[index] < array2[index]) - { - return -1; - } - else if (array1[index] > array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(float[] array1, int size1, - float[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (array1[index] < array2[index]) - { - return -1; - } - else if (array1[index] > array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(double[] array1, int size1, - double[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - if (array1[index] < array2[index]) - { - return -1; - } - else if (array1[index] > array2[index]) - { - return 1; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Compares the elements of the two given arrays. - * @param array1 the first array. - * @param size1 the size of the first array. - * @param array2 the second array. - * @param size2 the size of the second array. - * @return 0 if all elements are the same, - * -1 if the first different element in the first array is smaller - * than the corresponding element in the second array, - * or 1 if it is larger. - */ - public static int compare(Comparable[] array1, int size1, - Comparable[] array2, int size2) - { - int minSize = Math.min(size1, size2); - - for (int index = 0; index < minSize; index++) - { - int comparison = ObjectUtil.compare(array1[index], array2[index]); - if (comparison != 0) - { - return comparison; - } - } - - return size1 < size2 ? -1 : - size1 == size2 ? 0 : - 1; - } - - - /** - * Returns a shallow copy of the given array, or null if the input is null. - * @param array the array. - * @return a shallow copy of the original array, or null if the array is null. - */ - public static T[] cloneOrNull(T[] array) - { - return array != null ? array.clone() : null; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static boolean[] extendArray(boolean[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - boolean[] newArray = new boolean[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static boolean[] ensureArraySize(boolean[] array, - int size, - boolean initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new boolean[size]; - - if (initialValue) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static byte[] add(byte[] array, int size, byte element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static byte[] insert(byte[] array, int size, int index, byte element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(byte[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = 0; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static byte[] extendArray(byte[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - byte[] newArray = new byte[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static byte[] ensureArraySize(byte[] array, - int size, - byte initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new byte[size]; - - if (initialValue != 0) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static char[] add(char[] array, int size, char element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static char[] insert(char[] array, int size, int index, char element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(char[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = 0; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static char[] extendArray(char[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - char[] newArray = new char[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static char[] ensureArraySize(char[] array, - int size, - char initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new char[size]; - - if (initialValue != 0) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static short[] add(short[] array, int size, short element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static short[] insert(short[] array, int size, int index, short element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(short[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = 0; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static short[] extendArray(short[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - short[] newArray = new short[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static short[] ensureArraySize(short[] array, - int size, - short initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new short[size]; - - if (initialValue != 0) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static int[] add(int[] array, int size, int element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static int[] insert(int[] array, int size, int index, int element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(int[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = 0; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static int[] extendArray(int[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - int[] newArray = new int[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static int[] ensureArraySize(int[] array, - int size, - int initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new int[size]; - - if (initialValue != 0) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static long[] add(long[] array, int size, long element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static long[] insert(long[] array, int size, int index, long element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(long[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = 0; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static long[] extendArray(long[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - long[] newArray = new long[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static long[] ensureArraySize(long[] array, - int size, - long initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new long[size]; - - if (initialValue != 0L) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static float[] add(float[] array, int size, float element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static float[] insert(float[] array, int size, int index, float element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(float[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = 0; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static float[] extendArray(float[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - float[] newArray = new float[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static float[] ensureArraySize(float[] array, - int size, - float initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new float[size]; - - if (initialValue != 0) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static double[] add(double[] array, int size, double element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static double[] insert(double[] array, int size, int index, double element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(double[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = 0; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static double[] extendArray(double[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - double[] newArray = new double[size]; - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static double[] ensureArraySize(double[] array, - int size, - double initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = new double[size]; - - if (initialValue != 0) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } - - - /** - * Adds the given element to the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static T[] add(T[] array, int size, T element) - { - array = extendArray(array, size + 1); - - array[size] = element; - - return array; - } - - - /** - * Inserts the given element in the given array. - * The array is extended if necessary. - * @param array the array. - * @param size the original size of the array. - * @param index the index at which the element is to be added. - * @param element the element to be added. - * @return the original array, or a copy if it had to be extended. - */ - public static T[] insert(T[] array, int size, int index, T element) - { - array = extendArray(array, size + 1); - - // Move the last part. - System.arraycopy(array, index, - array, index + 1, - size - index); - - array[index] = element; - - return array; - } - - - /** - * Removes the specified element from the given array. - * @param array the array. - * @param size the original size of the array. - * @param index the index of the element to be removed. - */ - public static void remove(Object[] array, int size, int index) - { - System.arraycopy(array, index + 1, - array, index, - array.length - index - 1); - - array[size - 1] = null; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @return the original array, or a copy if it had to be extended. - */ - public static T[] extendArray(T[] array, int size) - { - // Reuse the existing array if possible. - if (array.length >= size) - { - return array; - } - - // Otherwise create and initialize a new array. - T[] newArray = (T[])Array.newInstance(array.getClass().getComponentType(), size); - - System.arraycopy(array, 0, - newArray, 0, - array.length); - - return newArray; - } - - - /** - * Ensures the given array has a given size. - * @param array the array. - * @param size the target size of the array. - * @param initialValue the initial value of the elements. - * @return the original array, or a copy if it had to be - * extended. - */ - public static T[] ensureArraySize(T[] array, - int size, - T initialValue) - { - // Is the existing array large enough? - if (array.length >= size) - { - // Reinitialize the existing array. - Arrays.fill(array, 0, size, initialValue); - } - else - { - // Otherwise create and initialize a new array. - array = (T[])Array.newInstance(array.getClass().getComponentType(), size); - - if (initialValue != null) - { - Arrays.fill(array, 0, size, initialValue); - } - } - - return array; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ClassNameParser.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ClassNameParser.java deleted file mode 100644 index 5106ba8a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ClassNameParser.java +++ /dev/null @@ -1,364 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import proguard.classfile.ClassConstants; - -import java.util.*; - -/** - * This StringParser can create StringMatcher instances for regular expressions - * matching internal class names (or descriptors containing class names). - * The regular expressions can contain the following wildcards: - * '%' for a single internal primitive type character (V, Z, B, C, S, I, F, - * J, or D), - * '?' for a single regular class name character, - * '*' for any number of regular class name characters, - * '**' for any number of regular class name characters or package separator - * characters ('/'), - * 'L***;' for a single internal type (class name or primitive type, - * array or non-array), - * 'L///;' for any number of internal types (class names and primitive - * types), and - * '' for a reference to an earlier wildcard (n = 1, 2, ...) - * - * @author Eric Lafortune - */ -public class ClassNameParser implements StringParser -{ - private static final char[] PRIMITIVE_TYPES = new char[] - { - ClassConstants.TYPE_VOID, - ClassConstants.TYPE_BOOLEAN, - ClassConstants.TYPE_BYTE, - ClassConstants.TYPE_CHAR, - ClassConstants.TYPE_SHORT, - ClassConstants.TYPE_INT, - ClassConstants.TYPE_LONG, - ClassConstants.TYPE_FLOAT, - ClassConstants.TYPE_DOUBLE, - }; - - - private List variableStringMatchers; - - - /** - * Creates a new ClassNameParser. - */ - public ClassNameParser() - { - this(null); - } - - - /** - * Creates a new ClassNameParser that supports references to earlier - * wildcards. - * - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - */ - public ClassNameParser(List variableStringMatchers) - { - this.variableStringMatchers = variableStringMatchers; - } - - - // Implementations for StringParser. - - public StringMatcher parse(String regularExpression) - { - int index; - StringMatcher nextMatcher = new EmptyStringMatcher(); - - // Look for wildcards. - for (index = 0; index < regularExpression.length(); index++) - { - int wildCardIndex; - - // Is there an 'L///;' wildcard? - if (regularExpression.regionMatches(index, "L///;", 0, 5)) - { - SettableMatcher settableMatcher = new SettableMatcher(); - - // Create a matcher for the wildcard. - nextMatcher = rememberVariableStringMatcher( - new VariableStringMatcher(null, - new char[] { ClassConstants.METHOD_ARGUMENTS_CLOSE }, - 0, - Integer.MAX_VALUE, - settableMatcher)); - - settableMatcher.setMatcher(parse(regularExpression.substring(index + 5))); - break; - } - - // Is there an 'L***;' wildcard? - else if (regularExpression.regionMatches(index, "L***;", 0, 5)) - { - SettableMatcher settableMatcher = new SettableMatcher(); - - // Create a matcher for the wildcard. - // TODO: The returned variable matcher is actually a composite that doesn't return the entire matched string. - nextMatcher = rememberVariableStringMatcher( - createAnyTypeMatcher(settableMatcher)); - - // Recursively create a matcher for the rest of the string. - settableMatcher.setMatcher(parse(regularExpression.substring(index + 5))); - break; - } - - // Is there a '**' wildcard? - else if (regularExpression.regionMatches(index, "**", 0, 2)) - { - // Handle the end of the regular expression more efficiently, - // without any next matcher for the variable string matcher. - SettableMatcher settableMatcher = - index + 2 == regularExpression.length() ? null : - new SettableMatcher(); - - // Create a matcher for the wildcard. - nextMatcher = rememberVariableStringMatcher( - new VariableStringMatcher(null, - new char[] { ClassConstants.TYPE_CLASS_END }, - 0, - Integer.MAX_VALUE, - settableMatcher)); - - // Recursively create a matcher for the rest of the string. - if (settableMatcher != null) - { - settableMatcher.setMatcher(parse(regularExpression.substring(index + 2))); - } - break; - } - - // Is there a '*' wildcard? - else if (regularExpression.charAt(index) == '*') - { - SettableMatcher settableMatcher = new SettableMatcher(); - - // Create a matcher for the wildcard. - nextMatcher = rememberVariableStringMatcher( - new VariableStringMatcher(null, - new char[] { ClassConstants.TYPE_CLASS_END, ClassConstants.PACKAGE_SEPARATOR }, - 0, - Integer.MAX_VALUE, - settableMatcher)); - - // Recursively create a matcher for the rest of the string. - settableMatcher.setMatcher(parse(regularExpression.substring(index + 1))); - break; - } - - // Is there a '?' wildcard? - else if (regularExpression.charAt(index) == '?') - { - SettableMatcher settableMatcher = new SettableMatcher(); - - // Create a matcher for the wildcard. - nextMatcher = rememberVariableStringMatcher( - new VariableStringMatcher(null, - new char[] { ClassConstants.TYPE_CLASS_END, ClassConstants.PACKAGE_SEPARATOR }, - 1, - 1, - settableMatcher)); - - // Recursively create a matcher for the rest of the string. - settableMatcher.setMatcher(parse(regularExpression.substring(index + 1))); - break; - } - - // Is there a '%' wildcard? - else if (regularExpression.charAt(index) == '%') - { - SettableMatcher settableMatcher = new SettableMatcher(); - - // Create a matcher for the wildcard. - nextMatcher = rememberVariableStringMatcher( - new VariableStringMatcher(PRIMITIVE_TYPES, - null, - 1, - 1, - settableMatcher)); - - // Recursively create a matcher for the rest of the string. - settableMatcher.setMatcher(parse(regularExpression.substring(index + 1))); - break; - } - - // Is there a '' wildcard? - else if ((wildCardIndex = wildCardIndex(regularExpression, index)) > 0) - { - // Find the index of the closing bracket again. - int closingIndex = regularExpression.indexOf('>', index + 1); - - // Retrieve the specified variable string matcher and - // recursively create a matcher for the rest of the string. - nextMatcher = - new MatchedStringMatcher(retrieveVariableStringMatcher(wildCardIndex - 1), - parse(regularExpression.substring(closingIndex + 1))); - break; - } - } - - // Return a matcher for the fixed first part of the regular expression, - // if any, and the remainder. - return index != 0 ? - (StringMatcher)new FixedStringMatcher(regularExpression.substring(0, index), nextMatcher) : - (StringMatcher)nextMatcher; - } - - - // Small utility methods. - - /** - * Creates a StringMatcher that matches any type (class or primitive type, - * array or non-array) and then the given matcher. - */ - private VariableStringMatcher createAnyTypeMatcher(StringMatcher nextMatcher) - { - return - // Any number of '['. - new VariableStringMatcher(new char[] { ClassConstants.TYPE_ARRAY }, - null, - 0, - 255, - // Followed by: - new OrMatcher( - // A primitive type. - new VariableStringMatcher(PRIMITIVE_TYPES, - null, - 1, - 1, - nextMatcher), - - // Or a class type. - new VariableStringMatcher(new char[] { ClassConstants.TYPE_CLASS_START }, - null, - 1, - 1, - new VariableStringMatcher(null, - new char[] { ClassConstants.TYPE_CLASS_END }, - 0, - Integer.MAX_VALUE, - new VariableStringMatcher(new char[] { ClassConstants.TYPE_CLASS_END }, - null, - 1, - 1, - nextMatcher))))); - } - - - /** - * Adds the given variable string matcher to the list of string matchers. - */ - private VariableStringMatcher rememberVariableStringMatcher(VariableStringMatcher variableStringMatcher) - { - if (variableStringMatchers != null) - { - variableStringMatchers.add(variableStringMatcher); - } - - return variableStringMatcher; - } - - - /** - * Retrieves the specified variable string matcher from the list of string - * matchers. - */ - private VariableStringMatcher retrieveVariableStringMatcher(int index) - { - return (VariableStringMatcher) variableStringMatchers.get(index); - } - - - /** - * Parses a reference to a wildcard at the given index, if any. - * Returns the 1-based index, or 0 otherwise. - */ - private int wildCardIndex(String string, int index) - throws IllegalArgumentException - { - if (string.charAt(index) != '<') - { - return 0; - } - - int closingBracketIndex = string.indexOf('>', index); - if (closingBracketIndex < 0) - { - throw new IllegalArgumentException("Missing closing angular bracket"); - } - - if (variableStringMatchers == null) - { - System.err.println(string); - throw new IllegalArgumentException("References to wildcards are not supported in this argument"); - } - - String argumentBetweenBrackets = string.substring(index+1, closingBracketIndex); - - try - { - int wildcardIndex = Integer.parseInt(argumentBetweenBrackets); - if (wildcardIndex < 1 || - wildcardIndex > variableStringMatchers.size()) - { - throw new IllegalArgumentException("Invalid reference to wildcard ("+wildcardIndex+", must lie between 1 and "+variableStringMatchers.size()+")"); - } - - return wildcardIndex; - } - catch (NumberFormatException e) - { - throw new IllegalArgumentException("Reference to wildcard must be a number ("+argumentBetweenBrackets+")"); - } - } - - - /** - * A main method for testing class name matching. - */ - public static void main(String[] args) - { - try - { - System.out.println("Regular expression ["+args[0]+"]"); - ClassNameParser parser = new ClassNameParser(); - StringMatcher matcher = parser.parse(args[0]); - for (int index = 1; index < args.length; index++) - { - String string = args[index]; - System.out.print("String ["+string+"]"); - System.out.println(" -> match = "+matcher.matches(args[index])); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/CollectionMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/CollectionMatcher.java deleted file mode 100644 index 486a44db..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/CollectionMatcher.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import java.util.Set; - -/** - * This matcher tests whether strings match with a String in a given Set. - * - * @author Johan Leys - */ -public class CollectionMatcher extends StringMatcher -{ - private final Set set; - - - public CollectionMatcher(Set set) - { - this.set = set; - } - - - // Implementations for StringMatcher. - - @Override - public boolean matches(String string) - { - return set.contains(string); - } - - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return set.contains(string.substring(beginOffset, endOffset)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ConstantMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ConstantMatcher.java deleted file mode 100644 index 85d744dd..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ConstantMatcher.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher matches any string or no string at all. - * - * @author Eric Lafortune - */ -public class ConstantMatcher extends StringMatcher -{ - private boolean matches; - - - /** - * Creates a new ConstantMatcher that always returns the given result. - */ - public ConstantMatcher(boolean matches) - { - this.matches = matches; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return matches; - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/Counter.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/Counter.java deleted file mode 100644 index d92f4f08..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/Counter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This provides a counter that can be retrieved. - * - * @author Eric Lafortune - */ -public interface Counter -{ - /** - * Returns the current value of the counter. - */ - public int getCount(); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/EmptyStringMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/EmptyStringMatcher.java deleted file mode 100644 index 60bd0fd6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/EmptyStringMatcher.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings are empty. - * - * @author Eric Lafortune - */ -public class EmptyStringMatcher extends StringMatcher -{ - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return beginOffset == endOffset; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ExtensionMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ExtensionMatcher.java deleted file mode 100644 index 41ac8931..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ExtensionMatcher.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings end in a given extension, ignoring - * its case. - * - * @author Eric Lafortune - */ -public class ExtensionMatcher extends StringMatcher -{ - private final String extension; - - - /** - * Creates a new StringMatcher. - * - * @param extension the extension against which strings will be matched. - */ - public ExtensionMatcher(String extension) - { - this.extension = extension; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return endsWithIgnoreCase(string, beginOffset, endOffset, extension); - } - - - /** - * Returns whether the given string ends with the given suffix, ignoring its - * case. - */ - private static boolean endsWithIgnoreCase(String string, - int beginOffset, - int endOffset, - String suffix) - { - int suffixLength = suffix.length(); - - return string.regionMatches(true, endOffset - suffixLength, suffix, 0, suffixLength); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/FileNameParser.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/FileNameParser.java deleted file mode 100644 index aca32256..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/FileNameParser.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import java.io.File; - -/** - * This StringParser can create StringMatcher instances for regular expressions - * matching file names. The regular expressions can contain the following - * wildcards: - * '?' for a single regular file name character, - * '*' for any number of regular file name characters, and - * '**' for any number of regular file name characters or directory separator - * characters (always including '/'). - * - * @author Eric Lafortune - */ -public class FileNameParser implements StringParser -{ - // Implementations for StringParser. - - public StringMatcher parse(String regularExpression) - { - int index; - StringMatcher nextMatcher = new EmptyStringMatcher(); - - // Look for wildcards. - for (index = 0; index < regularExpression.length(); index++) - { - // Is there a '**' wildcard? - if (regularExpression.regionMatches(index, "**", 0, 2)) - { - // Create a matcher for the wildcard and, recursively, for the - // remainder of the string. - nextMatcher = - new VariableStringMatcher(null, - null, - 0, - Integer.MAX_VALUE, - parse(regularExpression.substring(index + 2))); - break; - } - - // Is there a '*' wildcard? - else if (regularExpression.charAt(index) == '*') - { - // Create a matcher for the wildcard and, recursively, for the - // remainder of the string. - nextMatcher = - new VariableStringMatcher(null, - new char[] { File.pathSeparatorChar, '/' }, - 0, - Integer.MAX_VALUE, - parse(regularExpression.substring(index + 1))); - break; - } - - // Is there a '?' wildcard? - else if (regularExpression.charAt(index) == '?') - { - // Create a matcher for the wildcard and, recursively, for the - // remainder of the string. - nextMatcher = - new VariableStringMatcher(null, - new char[] { File.pathSeparatorChar, '/' }, - 1, - 1, - parse(regularExpression.substring(index + 1))); - break; - } - } - - // Return a matcher for the fixed first part of the regular expression, - // if any, and the remainder. - return index != 0 ? - (StringMatcher)new FixedStringMatcher(regularExpression.substring(0, index), nextMatcher) : - (StringMatcher)nextMatcher; - } - - - /** - * A main method for testing file name matching. - */ - public static void main(String[] args) - { - try - { - System.out.println("Regular expression ["+args[0]+"]"); - FileNameParser parser = new FileNameParser(); - StringMatcher matcher = parser.parse(args[0]); - for (int index = 1; index < args.length; index++) - { - String string = args[index]; - System.out.print("String ["+string+"]"); - System.out.println(" -> match = "+matcher.matches(args[index])); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/FixedStringMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/FixedStringMatcher.java deleted file mode 100644 index 02181286..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/FixedStringMatcher.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings start with a given fixed string - * and then match another optional given StringMatcher. - * - * @author Eric Lafortune - */ -public class FixedStringMatcher extends StringMatcher -{ - private final String fixedString; - private final StringMatcher nextMatcher; - - - /** - * Creates a new FixedStringMatcher. - * - * @param fixedString the string to match. - */ - public FixedStringMatcher(String fixedString) - { - this(fixedString, null); - } - - - /** - * Creates a new FixedStringMatcher. - * - * @param fixedString the string prefix to match. - * @param nextMatcher an optional string matcher to match the remainder of - * the string. - */ - public FixedStringMatcher(String fixedString, StringMatcher nextMatcher) - { - this.fixedString = fixedString; - this.nextMatcher = nextMatcher; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - int stringLength = endOffset - beginOffset; - int fixedStringLength = fixedString.length(); - return stringLength >= fixedStringLength && - string.startsWith(fixedString, beginOffset) && - ((nextMatcher == null && stringLength == fixedStringLength) || - nextMatcher.matches(string, - beginOffset + fixedStringLength, - endOffset)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ListMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ListMatcher.java deleted file mode 100644 index ffc88a2d..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ListMatcher.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings match a given list of StringMatcher - * instances. The instances are considered sequentially. Each instance in the - * list can optionally be negated, meaning that a match makes the entire - * remaining match fail. - * - * @author Eric Lafortune - */ -public class ListMatcher extends StringMatcher -{ - private final StringMatcher[] matchers; - private final boolean[] negate; - - - public ListMatcher(StringMatcher... matchers) - { - this(matchers, null); - } - - - public ListMatcher(StringMatcher[] matchers, boolean[] negate) - { - this.matchers = matchers; - this.negate = negate; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - // Check the list of matchers. - for (int index = 0; index < matchers.length; index++) - { - StringMatcher matcher = matchers[index]; - if (matcher.matches(string, beginOffset, endOffset)) - { - return negate == null || - !negate[index]; - } - } - - return negate != null && - negate[negate.length - 1]; - - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ListParser.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ListParser.java deleted file mode 100644 index 9acba699..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ListParser.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import java.util.List; - -/** - * This StringParser can create StringMatcher instances for regular expressions. - * The regular expressions are either presented as a list, or they are - * interpreted as comma-separated lists, optionally prefixed with '!' negators. - * If an entry with a negator matches, a negative match is returned, without - * considering any subsequent entries in the list. The creation of StringMatcher - * instances for the entries is delegated to the given StringParser. - * - * @author Eric Lafortune - */ -public class ListParser implements StringParser -{ - private final StringParser stringParser; - - - /** - * Creates a new ListParser that parses individual elements in the - * comma-separated list with the given StringParser. - */ - public ListParser(StringParser stringParser) - { - this.stringParser = stringParser; - } - - - // Implementations for StringParser. - - public StringMatcher parse(String regularExpression) - { - // Does the regular expression contain a ',' list separator? - return parse(ListUtil.commaSeparatedList(regularExpression)); - } - - - /** - * Creates a StringMatcher for the given regular expression, which can - * be a list of optionally negated simple entries. - *

- * An empty list results in a StringMatcher that matches any string. - */ - public StringMatcher parse(List regularExpressions) - { - StringMatcher listMatcher = null; - - // Loop over all simple regular expressions, backward, creating a - // linked list of matchers. - for (int index = regularExpressions.size()-1; index >= 0; index--) - { - String regularExpression = (String)regularExpressions.get(index); - - StringMatcher entryMatcher = parseEntry(regularExpression); - - // Prepend the entry matcher. - listMatcher = - listMatcher == null ? - (StringMatcher)entryMatcher : - isNegated(regularExpression) ? - (StringMatcher)new AndMatcher(entryMatcher, listMatcher) : - (StringMatcher)new OrMatcher(entryMatcher, listMatcher); - } - - return listMatcher != null ? listMatcher : new ConstantMatcher(true); - } - - - // Small utility methods. - - /** - * Creates a StringMatcher for the given regular expression, which is a - * an optionally negated simple expression. - */ - private StringMatcher parseEntry(String regularExpression) - { - // Wrap the matcher if the regular expression starts with a '!' negator. - return isNegated(regularExpression) ? - new NotMatcher(stringParser.parse(regularExpression.substring(1))) : - stringParser.parse(regularExpression); - } - - - /** - * Returns whether the given simple regular expression is negated. - */ - private boolean isNegated(String regularExpression) - { - return regularExpression.length() > 0 && - regularExpression.charAt(0) == '!'; - } - - - /** - * A main method for testing name matching. - */ - public static void main(String[] args) - { - try - { - System.out.println("Regular expression ["+args[0]+"]"); - ListParser parser = new ListParser(new NameParser()); - StringMatcher matcher = parser.parse(args[0]); - for (int index = 1; index < args.length; index++) - { - String string = args[index]; - System.out.print("String ["+string+"]"); - System.out.println(" -> match = "+matcher.matches(args[index])); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ListUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ListUtil.java deleted file mode 100644 index 303c00ae..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ListUtil.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import java.util.*; - - -/** - * This class provides some utility methods for working with - * java.util.List objects. - * - * @author Eric Lafortune - */ -public class ListUtil -{ - /** - * Creates a comma-separated String from the given List of String objects. - */ - public static String commaSeparatedString(List list, boolean quoteStrings) - { - if (list == null) - { - return null; - } - - StringBuffer buffer = new StringBuffer(); - - for (int index = 0; index < list.size(); index++) - { - if (index > 0) - { - buffer.append(','); - } - - String string = (String)list.get(index); - - if (quoteStrings) - { - string = quotedString(string); - } - - buffer.append(string); - } - - return buffer.toString(); - } - - - /** - * Creates a List of String objects from the given comma-separated String. - */ - public static List commaSeparatedList(String string) - { - if (string == null) - { - return null; - } - - List list = new ArrayList(); - int index = 0; - while ((index = skipWhitespace(string, index)) < string.length()) - { - int nextIndex; - - // Do we have an opening quote? - if (string.charAt(index) == '\'') - { - // Parse a quoted string. - nextIndex = string.indexOf('\'', index + 1); - if (nextIndex < 0) - { - nextIndex = string.length(); - } - - list.add(string.substring(index + 1, nextIndex)); - } - else - { - // Parse a non-quoted string. - nextIndex = string.indexOf(',', index); - if (nextIndex < 0) - { - nextIndex = string.length(); - } - - String substring = string.substring(index, nextIndex).trim(); - if (substring.length() > 0) - { - list.add(substring); - } - } - - index = nextIndex + 1; - } - - return list; - } - - - /** - * Skips any whitespace characters. - */ - private static int skipWhitespace(String string, int index) - { - while (index < string.length() && - Character.isWhitespace(string.charAt(index))) - { - index++; - } - return index; - } - - - /** - * Returns a quoted version of the given string, if necessary. - */ - private static String quotedString(String string) - { - return string.length() == 0 || - string.indexOf(' ') >= 0 || - string.indexOf('@') >= 0 || - string.indexOf('{') >= 0 || - string.indexOf('}') >= 0 || - string.indexOf('(') >= 0 || - string.indexOf(')') >= 0 || - string.indexOf(':') >= 0 || - string.indexOf(';') >= 0 || - string.indexOf(',') >= 0 ? ("'" + string + "'") : - ( string ); - } - - - public static void main(String[] args) - { - if (args.length == 1) - { - System.out.println("Input string: ["+args[0]+"]"); - - List list = commaSeparatedList(args[0]); - - System.out.println("Resulting list:"); - for (int index = 0; index < list.size(); index++) - { - System.out.println("["+list.get(index)+"]"); - } - } - else - { - List list = Arrays.asList(args); - - System.out.println("Input list:"); - for (int index = 0; index < list.size(); index++) - { - System.out.println("["+list.get(index)+"]"); - } - - String string = commaSeparatedString(list, true); - - System.out.println("Resulting string: ["+string+"]"); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/MatchedStringMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/MatchedStringMatcher.java deleted file mode 100644 index 5cd862c9..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/MatchedStringMatcher.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings start with a specified variable - * string and then match another optional given StringMatcher. - * - * @see VariableStringMatcher - * @author Eric Lafortune - */ -public class MatchedStringMatcher extends StringMatcher -{ - private final VariableStringMatcher variableStringMatcher; - private final StringMatcher nextMatcher; - - - /** - * Creates a new MatchedStringMatcher - * - * @param variableStringMatcher the variable string matcher that can - * provide the string to match. - * @param nextMatcher an optional string matcher to match the - * remainder of the string. - */ - public MatchedStringMatcher(VariableStringMatcher variableStringMatcher, - StringMatcher nextMatcher) - { - this.variableStringMatcher = variableStringMatcher; - this.nextMatcher = nextMatcher; - } - - - // Implementation for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - String matchingString = variableStringMatcher.getMatchingString(); - if (matchingString == null) - { - return false; - } - - int stringLength = endOffset - beginOffset; - int matchngStringLength = matchingString.length(); - return stringLength >= matchngStringLength && - string.startsWith(matchingString, beginOffset) && - ((nextMatcher == null && stringLength == matchngStringLength) || - nextMatcher.matches(string, - beginOffset + matchngStringLength, - endOffset)); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/MultiValueMap.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/MultiValueMap.java deleted file mode 100644 index a4e2e0c6..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/MultiValueMap.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - - -import java.util.*; - -/** - * A key-values map that can have multiple values associated with each key. - * - * There is an efficient lookup method to retrieve all values of all keys. - * - * @param the key type - * @param the value type - * - * @author Johan Leys - */ -public class MultiValueMap -{ - private final Map> keyValueMap = new HashMap>(); - - private final Set values = new HashSet(); - - - public void put(K key, V value) - { - putAll(key, Collections.singleton(value)); - } - - - public void putAll(Set key, V value) - { - putAll(key, Collections.singleton(value)); - } - - - public void putAll(Set keys, Set values) - { - for (K key : keys) - { - putAll(key, values); - } - } - - - public void putAll(K key, Set values) - { - this.values.addAll(values); - Set existingValues = keyValueMap.get(key); - if (existingValues == null) - { - existingValues = new HashSet(); - keyValueMap.put(key, existingValues); - } - existingValues.addAll(values); - } - - - public Set get(K key) - { - return keyValueMap.get(key); - } - - - /** - * Returns a Set with all values of all keys. - * - * @return a Set with all values of all keys. - */ - public Set getValues() - { - return values; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/NameParser.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/NameParser.java deleted file mode 100644 index dd718999..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/NameParser.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import java.util.*; - -/** - * This StringParser can create StringMatcher instances for regular expressions - * matching names. The regular expressions are interpreted as comma-separated - * lists of names, optionally prefixed with '!' negators. - * If a name with a negator matches, a negative match is returned, without - * considering any subsequent entries in the list. - * The regular expressions can contain the following wildcards: - * '?' for a single character, - * '*' for any number of characters, and - * '' for a reference to an earlier wildcard (n = 1, 2, ...) - * - * @author Eric Lafortune - */ -public class NameParser implements StringParser -{ - private List variableStringMatchers; - - - /** - * Creates a new NameParser. - */ - public NameParser() - { - this(null); - } - - - /** - * Creates a new NameParser that supports references to earlier - * wildcards. - * - * @param variableStringMatchers an optional mutable list of - * VariableStringMatcher instances that match - * the wildcards. - */ - public NameParser(List variableStringMatchers) - { - this.variableStringMatchers = variableStringMatchers; - } - - - // Implementations for StringParser. - - public StringMatcher parse(String regularExpression) - { - int index; - StringMatcher nextMatcher = new EmptyStringMatcher(); - - // Look for wildcards. - for (index = 0; index < regularExpression.length(); index++) - { - int wildCardIndex; - - // Is there a '*' wildcard? - if (regularExpression.charAt(index) == '*') - { - SettableMatcher settableMatcher = new SettableMatcher(); - - // Create a matcher for the wildcard. - nextMatcher = rememberVariableStringMatcher( - new VariableStringMatcher(null, - null, - 0, - Integer.MAX_VALUE, - settableMatcher)); - - // Recursively create a matcher for the rest of the string. - settableMatcher.setMatcher(parse(regularExpression.substring(index + 1))); - break; - } - - // Is there a '?' wildcard? - else if (regularExpression.charAt(index) == '?') - { - SettableMatcher settableMatcher = new SettableMatcher(); - - // Create a matcher for the wildcard. - nextMatcher = rememberVariableStringMatcher( - new VariableStringMatcher(null, - null, - 1, - 1, - settableMatcher)); - - // Recursively create a matcher for the rest of the string. - settableMatcher.setMatcher(parse(regularExpression.substring(index + 1))); - break; - } - - // Is there a '' wildcard? - else if ((wildCardIndex = wildCardIndex(regularExpression, index)) > 0) - { - // Find the index of the closing bracket again. - int closingIndex = regularExpression.indexOf('>', index + 1); - - // Retrieve the specified variable string matcher and - // recursively create a matcher for the rest of the string. - nextMatcher = - new MatchedStringMatcher(retrieveVariableStringMatcher(wildCardIndex - 1), - parse(regularExpression.substring(closingIndex + 1))); - break; - } - } - - // Return a matcher for the fixed first part of the regular expression, - // if any, and the remainder. - return index != 0 ? - (StringMatcher)new FixedStringMatcher(regularExpression.substring(0, index), nextMatcher) : - (StringMatcher)nextMatcher; - } - - - // Small utility methods. - - /** - * Parses a reference to a wildcard at the given index, if any. - * Returns the 1-based index, or 0 otherwise. - */ - private int wildCardIndex(String string, int index) - throws IllegalArgumentException - { - if (variableStringMatchers == null || - string.charAt(index) != '<') - { - return 0; - } - - int closingBracketIndex = string.indexOf('>', index); - if (closingBracketIndex < 0) - { - throw new IllegalArgumentException("Missing closing angular bracket"); - } - - String argumentBetweenBrackets = string.substring(index+1, closingBracketIndex); - - try - { - int wildcardIndex = Integer.parseInt(argumentBetweenBrackets); - if (wildcardIndex < 1 || - wildcardIndex > variableStringMatchers.size()) - { - throw new IllegalArgumentException("Invalid reference to wildcard ("+wildcardIndex+", must lie between 1 and "+variableStringMatchers.size()+")"); - } - - return wildcardIndex; - } - catch (NumberFormatException e) - { - return 0; - } - } - - - /** - * Adds the given variable string matcher to the list of string matchers. - */ - private VariableStringMatcher rememberVariableStringMatcher(VariableStringMatcher variableStringMatcher) - { - if (variableStringMatchers != null) - { - variableStringMatchers.add(variableStringMatcher); - } - - return variableStringMatcher; - } - - - /** - * Retrieves the specified variable string matcher from the list of string - * matchers. - */ - private VariableStringMatcher retrieveVariableStringMatcher(int index) - { - return (VariableStringMatcher)variableStringMatchers.get(index); - } - - - /** - * A main method for testing name matching. - */ - public static void main(String[] args) - { - try - { - System.out.println("Regular expression ["+args[0]+"]"); - NameParser parser = new NameParser(); - StringMatcher matcher = parser.parse(args[0]); - for (int index = 1; index < args.length; index++) - { - String string = args[index]; - System.out.print("String ["+string+"]"); - System.out.println(" -> match = "+matcher.matches(args[index])); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/NotMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/NotMatcher.java deleted file mode 100644 index ab5ee4c7..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/NotMatcher.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings does not match the given - * StringMatcher. - * - * @author Eric Lafortune - */ -public class NotMatcher extends StringMatcher -{ - private final StringMatcher matcher; - - - public NotMatcher(StringMatcher matcher) - { - this.matcher = matcher; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return !matcher.matches(string, beginOffset, endOffset); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/ObjectUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/ObjectUtil.java deleted file mode 100644 index a3e9de45..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/ObjectUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package proguard.util; - -/** - * This class contains utility methods operating on objects. - */ -public class ObjectUtil -{ - /** - * Returns whether the given objects are the same. - * @param object1 the first object, may be null. - * @param object2 the second object, may be null. - * @return whether the objects are the same. - */ - public static boolean equal(Object object1, Object object2) - { - return object1 == null ? - object2 == null : - object1.equals(object2); - } - - - /** - * Returns the hash code of the given object, or 0 if it is null. - * @param object the object, may be null. - * @return the hash code. - */ - public static int hashCode(Object object) - { - return object == null ? 0 : object.hashCode(); - } - - - /** - * Returns a comparison of the two given objects. - * @param object1 the first object, may be null. - * @param object2 the second object, may be null. - * @return -1, 0, or 1. - * @see Comparable#compareTo(Object) - */ - public static int compare(Comparable object1, Comparable object2) - { - return object1 == null ? - object2 == null ? 0 : -1 : - object2 == null ? 1 : object1.compareTo(object2); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/OrMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/OrMatcher.java deleted file mode 100644 index 5017836e..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/OrMatcher.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings matches either of the given - * StringMatcher instances. - * - * @author Eric Lafortune - */ -public class OrMatcher extends StringMatcher -{ - private final StringMatcher matcher1; - private final StringMatcher matcher2; - - - /** - * Creates a new OrMatcher with the two given string matchers. - */ - public OrMatcher(StringMatcher matcher1, StringMatcher matcher2) - { - this.matcher1 = matcher1; - this.matcher2 = matcher2; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return matcher1.matches(string, beginOffset, endOffset) || - matcher2.matches(string, beginOffset, endOffset); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/PrintWriterUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/PrintWriterUtil.java deleted file mode 100644 index f9a226c3..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/PrintWriterUtil.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import proguard.Configuration; - -import java.io.*; - -/** - * Utility code for creating PrintWriters for printing mappings etc. - * @author Johan Leys - */ -public class PrintWriterUtil -{ - /** - * Returns a print writer for the given file, or the standard output if - * the file name is empty. - */ - public static PrintWriter createPrintWriterOut(File outputFile) - throws FileNotFoundException, UnsupportedEncodingException - { - return createPrintWriterOut(outputFile, false); - } - - /** - * Returns a print writer for the given file, or the standard output if - * the file name is empty. - */ - public static PrintWriter createPrintWriterOut(File outputFile, boolean append) - throws FileNotFoundException, UnsupportedEncodingException - { - - return createPrintWriter(outputFile, new PrintWriter(System.out, true), append); - } - - - /** - * Returns a print writer for the given file, or the standard output if - * the file name is empty. - */ - public static PrintWriter createPrintWriterErr(File outputFile) - throws FileNotFoundException, UnsupportedEncodingException - { - return createPrintWriter(outputFile, new PrintWriter(System.err, true)); - } - - - /** - * Returns a print writer for the given file, or the standard output if - * the file name is empty. - */ - public static PrintWriter createPrintWriter(File outputFile, PrintWriter console) - throws FileNotFoundException, UnsupportedEncodingException - { - return createPrintWriter(outputFile, console, false); - } - - - /** - * Returns a print writer for the given file, or the standard output if - * the file name is empty. - */ - public static PrintWriter createPrintWriter(File outputFile, - PrintWriter console, - boolean append) - throws FileNotFoundException, UnsupportedEncodingException - { - return outputFile == Configuration.STD_OUT ? - console : - new PrintWriter( - new BufferedWriter( - new OutputStreamWriter( - new FileOutputStream(outputFile, append), "UTF-8"))); - } - - /** - * Closes the given print writer, or flushes it if is the standard output. - */ - public static void closePrintWriter(File file, PrintWriter printWriter) - { - if (file == Configuration.STD_OUT) - { - printWriter.flush(); - } - else - { - printWriter.close(); - } - } - - - /** - * Returns the canonical file name for the given file, or "standard output" - * if the file name is empty. - */ - public static String fileName(File file) - { - if (file == Configuration.STD_OUT) - { - return "standard output"; - } - else - { - try - { - return file.getCanonicalPath(); - } - catch (IOException ex) - { - return file.getPath(); - } - } - } - - - // Hide constructor for util class. - private PrintWriterUtil() {} -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/SettableMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/SettableMatcher.java deleted file mode 100644 index 7d640fee..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/SettableMatcher.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher delegates to a another StringMatcher that can be set - * after this StringMatcher has been constructed. - * - * @author Eric Lafortune - */ -public class SettableMatcher extends StringMatcher -{ - private StringMatcher matcher; - - - public void setMatcher(StringMatcher matcher) - { - this.matcher = matcher; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - return matcher.matches(string, beginOffset, endOffset); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/StringMatcher.java deleted file mode 100644 index f48ed55a..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringMatcher.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - - -/** - * This interface provides methods to determine whether strings match a given - * criterion, which is specified by the implementation. - * - * @author Eric Lafortune - */ -public abstract class StringMatcher -{ - /** - * Checks whether the given string matches. - * @param string the string to match. - * @return a boolean indicating whether the string matches the criterion. - */ - public boolean matches(String string) - { - return matches(string, 0, string.length()); - } - - - /** - * Checks whether the given substring matches. - * @param string the string to match. - * @param beginOffset the start offset of the substring (inclusive). - * @param endOffset the end offset of the substring (exclusive). - * @return a boolean indicating whether the substring matches the criterion. - */ - protected abstract boolean matches(String string, - int beginOffset, - int endOffset); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringParser.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/StringParser.java deleted file mode 100644 index ef45c020..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringParser.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This interface provides a method to create a SringMatcher for a given - * regular expression. - * - * @author Eric Lafortune - */ -public interface StringParser -{ - /** - * Creates a StringMatcher for the given regular expression. - */ - public StringMatcher parse(String regularExpression); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringTransformer.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/StringTransformer.java deleted file mode 100644 index a7320a93..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringTransformer.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * Provides a method for transforming a string into another string. - * - * @author Johan Leys - */ -public interface StringTransformer -{ - /** - * A StringTransformer that doesn't do any transformation. - */ - StringTransformer IDENTITY_TRANSFORMER = new StringTransformer() - { - public String transform(String string) - { - return string; - } - }; - - - /** - * Transforms the given string and returns the transformed result. - * - * @param string a string to be transformed. - * @return the transformed string. - */ - String transform(String string); -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringUtil.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/StringUtil.java deleted file mode 100644 index 932a2fbf..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/StringUtil.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -import java.io.UnsupportedEncodingException; - -/** - * This class contains utility methods for strings. - */ -public class StringUtil -{ - private static final char TWO_BYTE_LIMIT = 0x80; - private static final int TWO_BYTE_CONSTANT1 = 0xc0; - private static final int TWO_BYTE_CONSTANT2 = 0x80; - private static final int TWO_BYTE_SHIFT1 = 6; - private static final int TWO_BYTE_MASK1 = 0x1f; - private static final int TWO_BYTE_MASK2 = 0x3f; - - private static final char THREE_BYTE_LIMIT = 0x800; - private static final int THREE_BYTE_CONSTANT1 = 0xe0; - private static final int THREE_BYTE_CONSTANT2 = 0x80; - private static final int THREE_BYTE_CONSTANT3 = 0x80; - private static final int THREE_BYTE_SHIFT1 = 12; - private static final int THREE_BYTE_SHIFT2 = 6; - private static final int THREE_BYTE_MASK1 = 0x0f; - private static final int THREE_BYTE_MASK2 = 0x3f; - private static final int THREE_BYTE_MASK3 = 0x3f; - - - /** - * Returns the modified UTF-8 byte array representation of the given string. - */ - public static byte[] getUtf8Bytes(String string) - { - // We're computing the byte array ourselves, because the implementation - // of String.getBytes("UTF-8") has a bug, at least up to JRE 1.4.2. - // Also note the special treatment of the 0 character. - - // Compute the byte array length. - int byteLength = 0; - int stringLength = string.length(); - for (int stringIndex = 0; stringIndex < stringLength; stringIndex++) - { - char c = string.charAt(stringIndex); - - // The character is represented by one, two, or three bytes. - byteLength += c == 0 ? 2 : - c < TWO_BYTE_LIMIT ? 1 : - c < THREE_BYTE_LIMIT ? 2 : - 3; - } - - // Allocate the byte array with the computed length. - byte[] bytes = new byte[byteLength]; - - // Fill out the array. - int byteIndex = 0; - for (int stringIndex = 0; stringIndex < stringLength; stringIndex++) - { - char c = string.charAt(stringIndex); - if (c == 0) - { - // The 0 character gets a two-byte representation in classes. - bytes[byteIndex++] = (byte)TWO_BYTE_CONSTANT1; - bytes[byteIndex++] = (byte)TWO_BYTE_CONSTANT2; - } - else if (c < TWO_BYTE_LIMIT) - { - // The character is represented by a single byte. - bytes[byteIndex++] = (byte)c; - } - else if (c < THREE_BYTE_LIMIT) - { - // The character is represented by two bytes. - bytes[byteIndex++] = (byte)(TWO_BYTE_CONSTANT1 | ((c >>> TWO_BYTE_SHIFT1) & TWO_BYTE_MASK1)); - bytes[byteIndex++] = (byte)(TWO_BYTE_CONSTANT2 | ( c & TWO_BYTE_MASK2)); - } - else - { - // The character is represented by three bytes. - bytes[byteIndex++] = (byte)(THREE_BYTE_CONSTANT1 | ((c >>> THREE_BYTE_SHIFT1) & THREE_BYTE_MASK1)); - bytes[byteIndex++] = (byte)(THREE_BYTE_CONSTANT2 | ((c >>> THREE_BYTE_SHIFT2) & THREE_BYTE_MASK2)); - bytes[byteIndex++] = (byte)(THREE_BYTE_CONSTANT3 | ( c & THREE_BYTE_MASK3)); - } - } - - return bytes; - } - - - /** - * Returns the String representation of the given modified UTF-8 byte array. - */ - public static String getString(byte[] bytes) - throws UnsupportedEncodingException - { - return getStringRepresentation(bytes, bytes.length); - } - - - /** - * Returns the String representation of the given modified UTF-8 byte array. - */ - public static String getStringRepresentation(byte[] bytes, int size) - throws UnsupportedEncodingException - { - // We're computing the string ourselves, because the implementation - // of "new String(bytes)" doesn't honor the special treatment of - // the 0 character in JRE 1.6_u11 and higher. - - // Allocate the byte array with the computed length. - char[] chars = new char[size]; - - // Fill out the array. - int charIndex = 0; - int byteIndex = 0; - while (byteIndex < size) - { - - int b = bytes[byteIndex++] & 0xff; - - // Depending on the flag bits in the first byte, the character - // is represented by a single byte, by two bytes, or by three - // bytes. We're not checking the redundant flag bits in the - // second byte and the third byte. - try - { - chars[charIndex++] = - (char)(b < TWO_BYTE_CONSTANT1 ? b : - - b < THREE_BYTE_CONSTANT1 ? ((b & TWO_BYTE_MASK1) << TWO_BYTE_SHIFT1) | - ((bytes[byteIndex++] & TWO_BYTE_MASK2) ) : - - ((b & THREE_BYTE_MASK1) << THREE_BYTE_SHIFT1) | - ((bytes[byteIndex++] & THREE_BYTE_MASK2) << THREE_BYTE_SHIFT2) | - ((bytes[byteIndex++] & THREE_BYTE_MASK3) )); - } - catch (ArrayIndexOutOfBoundsException e) - { - throw new UnsupportedEncodingException("Missing UTF-8 bytes after initial byte [0x"+Integer.toHexString(b)+"] in string ["+new String(chars, 0, charIndex)+"]"); - } - } - - return new String(chars, 0, charIndex); - } - - - /** - * Returns the hexadecimal representation of the given byte array. - */ - public static String toHexString(byte[] bytes) - { - return toHexString(bytes, bytes.length); - } - - - /** - * Returns the hexadecimal representation of the given byte array. - */ - public static String toHexString(byte[] bytes, int size) - { - StringBuffer buffer = new StringBuffer(2*size); - - for (int index = 0; index < bytes.length; index++) - { - byte b = bytes[index]; - - buffer.append(hexNibble(b >> 4)).append(hexNibble(b)); - } - - return buffer.toString(); - } - - - /** - * Returns the hexadecimal representation of the given nibble. - */ - private static char hexNibble(int nibble) - { - nibble &= 0xf; - return (char)(nibble < 10 ? - '0' + nibble : - 'a' + nibble - 10); - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/VariableStringMatcher.java b/tools/proguard/proguard6.0.3/core/src/proguard/util/VariableStringMatcher.java deleted file mode 100644 index 8bd5c039..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/VariableStringMatcher.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.util; - -/** - * This StringMatcher tests whether strings start with a specified variable - * string and then match another optional given StringMatcher. - * - * @author Eric Lafortune - */ -public class VariableStringMatcher extends StringMatcher -{ - private final char[] allowedCharacters; - private final char[] disallowedCharacters; - private final int minimumLength; - private final int maximumLength; - private final StringMatcher nextMatcher; - - // Remember the most recently attempted match. - private String string; - private int matchingBeginOffset; - private int matchingEndOffset; - private String matchingString; - - - /** - * Creates a new VariableStringMatcher. - * - * @param allowedCharacters an optional list of allowed characters. - * @param disallowedCharacters an optional list of disallowed characters. - * @param minimumLength the minimum length of te variable string. - * @param maximumLength the maximum length of te variable string. - * @param nextMatcher an optional next matcher for the remainder - * of the string. - */ - public VariableStringMatcher(char[] allowedCharacters, - char[] disallowedCharacters, - int minimumLength, - int maximumLength, - StringMatcher nextMatcher) - { - this.allowedCharacters = allowedCharacters; - this.disallowedCharacters = disallowedCharacters; - this.minimumLength = minimumLength; - this.maximumLength = maximumLength; - this.nextMatcher = nextMatcher; - } - - - /** - * Returns the string that has been matched most recently. - */ - public String getMatchingString() - { - if (string == null) - { - throw new UnsupportedOperationException("Can't handle regular expression with referenced wildcard"); - } - - // Cache the matching string, since String#substring has become - // expensive since about JRE 1.7. - return matchingString == null ? - (matchingString = string.substring(matchingBeginOffset, matchingEndOffset)) : - matchingString; - } - - - // Implementations for StringMatcher. - - @Override - protected boolean matches(String string, int beginOffset, int endOffset) - { - int length = endOffset - beginOffset; - - // Handle the case without next matcher more efficiently. - if (nextMatcher == null) - { - // Check the length and the characters. - boolean match = - length >= minimumLength && - length <= maximumLength && - areAllowedCharacters(string, beginOffset, endOffset); - - // Does the string match? - if (match) - { - // Remember the matching string, so subsequent external - // matchers can use it. - rememberMatchingString(string, beginOffset, endOffset); - } - else - { - // Reset the matching string, so subsequent external - // matchers cannot use it. - resetMatchingString(); - } - - return match; - } - - // Check the minimum length and the corresponding characters. - if (length < minimumLength || - !areAllowedCharacters(string, beginOffset, beginOffset + minimumLength)) - { - // Reset the matching string, so subsequent external - // matchers cannot use it. - resetMatchingString(); - - return false; - } - - int maximumLength = Math.min(this.maximumLength, length); - - // Check the remaining characters, up to the maximum number. - for (int index = minimumLength; index < maximumLength; index++) - { - int offset = beginOffset + index; - - // Check the next matcher. - if (matchesNextMatcher(string, beginOffset, offset, endOffset)) - { - return true; - } - - // Otherwise just check the next character. - if (!isAllowedCharacter(string.charAt(offset))) - { - // Reset the matching string, so subsequent external - // matchers cannot use it. - resetMatchingString(); - - return false; - } - } - - // Last try: check the remaining characters in the string. - int offset = beginOffset + maximumLength; - - // Check the next matcher. - if (matchesNextMatcher(string, beginOffset, offset, endOffset)) - { - return true; - } - - // Reset the matching string, so subsequent external - // matchers cannot use it. - resetMatchingString(); - - return false; - } - - - // Small utility methods. - - /** - * Returns whether the character characters in the specified substring are - * allowed. - */ - private boolean areAllowedCharacters(String string, int beginOffset, int endOffset) - { - for (int offset = beginOffset; offset < endOffset; offset++) - { - if (!isAllowedCharacter(string.charAt(offset))) - { - return false; - } - } - - return true; - } - - - /** - * Returns whether the given character is allowed in the variable string. - */ - private boolean isAllowedCharacter(char character) - { - // Check the allowed characters. - if (allowedCharacters != null) - { - for (int index = 0; index < allowedCharacters.length; index++) - { - if (allowedCharacters[index] == character) - { - return true; - } - } - - return false; - } - - // Check the disallowed characters. - if (disallowedCharacters != null) - { - for (int index = 0; index < disallowedCharacters.length; index++) - { - if (disallowedCharacters[index] == character) - { - return false; - } - } - } - - // Any remaining character is allowed. - return true; - } - - - /** - * Returns whether the next matcher matches the specified second part of - * the string, remembering the first part that matchers this matcher. - */ - private boolean matchesNextMatcher(String string, - int beginOffset, - int splitOffset, - int endOffset) - { - // Remember the matching string, so the next matchers can use it. - rememberMatchingString(string, beginOffset, splitOffset); - - // Check the next matcher. - return nextMatcher.matches(string, splitOffset, endOffset); - } - - - /** - * Remembers the string that is currently being matched. - */ - private void rememberMatchingString(String string, - int matchingBeginOffset, - int matchingEndOffset) - { - this.string = string; - this.matchingBeginOffset = matchingBeginOffset; - this.matchingEndOffset = matchingEndOffset; - this.matchingString = null; - } - - - /** - * Resets the string that is currently being matched. - */ - private void resetMatchingString() - { - this.string = null; - this.matchingBeginOffset = 0; - this.matchingEndOffset = 0; - this.matchingString = null; - } -} diff --git a/tools/proguard/proguard6.0.3/core/src/proguard/util/package.html b/tools/proguard/proguard6.0.3/core/src/proguard/util/package.html deleted file mode 100644 index cb14fdc0..00000000 --- a/tools/proguard/proguard6.0.3/core/src/proguard/util/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains utility classes for regular expression matching,... - diff --git a/tools/proguard/proguard6.0.3/docs/FAQ.html b/tools/proguard/proguard6.0.3/docs/FAQ.html deleted file mode 100644 index ec43ae49..00000000 --- a/tools/proguard/proguard6.0.3/docs/FAQ.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - -ProGuard FAQ - - - - - - -

Frequently Asked Questions

- -

Contents

- -
    -
  1. What is shrinking?
  2. -
  3. What is obfuscation?
  4. -
  5. What is preverification?
  6. -
  7. What kind of optimizations does ProGuard - support?
  8. -
  9. Can I use ProGuard to process my commercial - application?
  10. -
  11. Does ProGuard work with Java 2, 5, ..., 9?
  12. -
  13. Does ProGuard work with Java Micro Edition?
  14. -
  15. Does ProGuard work for Android apps?
  16. -
  17. Does ProGuard work for Blackberry - code?
  18. -
  19. Does ProGuard have support for Ant?
  20. -
  21. Does ProGuard have support for Gradle?
  22. -
  23. Does ProGuard have support for Maven?
  24. -
  25. Does ProGuard come with a GUI?
  26. -
  27. Does ProGuard handle Class.forName - calls?
  28. -
  29. Does ProGuard handle resource files?
  30. -
  31. Does ProGuard encrypt string constants?
  32. -
  33. Does ProGuard perform control flow - obfuscation?
  34. -
  35. Does ProGuard support incremental - obfuscation?
  36. -
  37. Can ProGuard obfuscate using reserved - keywords?
  38. -
  39. Can ProGuard reconstruct obfuscated stack - traces?
  40. -
  41. How is DexGuard different from - ProGuard?
  42. -
- -

What is shrinking?

- -Java source code (.java files) is typically compiled to bytecode (.class -files). Bytecode is more compact than Java source code, but it may still -contain a lot of unused code, especially if it includes program libraries. -Shrinking programs such as ProGuard can analyze bytecode and remove -unused classes, fields, and methods. The program remains functionally -equivalent, including the information given in exception stack traces. - -

What is obfuscation?

- -By default, compiled bytecode still contains a lot of debugging information: -source file names, line numbers, field names, method names, argument names, -variable names, etc. This information makes it straightforward to decompile -the bytecode and reverse-engineer entire programs. Sometimes, this is not -desirable. Obfuscators such as ProGuard can remove the debugging -information and replace all names by meaningless character sequences, making -it much harder to reverse-engineer the code. It further compacts the code as a -bonus. The program remains functionally equivalent, except for the class -names, method names, and line numbers given in exception stack traces. - -

What is preverification?

- -When loading class files, the class loader performs some sophisticated -verification of the byte code. This analysis makes sure the code can't -accidentally or intentionally break out of the sandbox of the virtual machine. -Java Micro Edition and Java 6 introduced split verification. This means that -the JME preverifier and the Java 6 compiler add preverification information to -the class files (StackMap and StackMapTable attributes, respectively), in order -to simplify the actual verification step for the class loader. Class files can -then be loaded faster and in a more memory-efficient way. ProGuard can -perform the preverification step too, for instance allowing to retarget older -class files at Java 6. - -

What kind of optimizations does ProGuard support?

- -Apart from removing unused classes, fields, and methods in the shrinking step, -ProGuard can also perform optimizations at the bytecode level, inside -and across methods. Thanks to techniques like control flow analysis, data flow -analysis, partial evaluation, static single assignment, global value numbering, -and liveness analysis, ProGuard can: - -
    -
  • Evaluate constant expressions.
  • -
  • Remove unnecessary field accesses and method calls.
  • -
  • Remove unnecessary branches.
  • -
  • Remove unnecessary comparisons and instanceof tests.
  • -
  • Remove unused code blocks.
  • -
  • Merge identical code blocks.
  • -
  • Reduce variable allocation.
  • -
  • Remove write-only fields and unused method parameters.
  • -
  • Inline constant fields, method parameters, and return values.
  • -
  • Inline methods that are short or only called once.
  • -
  • Simplify tail recursion calls.
  • -
  • Merge classes and interfaces.
  • -
  • Make methods private, static, and final when possible.
  • -
  • Make classes static and final when possible.
  • -
  • Replace interfaces that have single implementations.
  • -
  • Perform over 200 peephole optimizations, like replacing ...*2 by - ...<<1.
  • -
  • Optionally remove logging code.
  • -
-The positive effects of these optimizations will depend on your code and on -the virtual machine on which the code is executed. Simple virtual machines may -benefit more than advanced virtual machines with sophisticated JIT compilers. -At the very least, your bytecode may become a bit smaller. -

-Some notable optimizations that aren't supported yet: -

    -
  • Moving constant expressions out of loops.
  • -
  • Optimizations that require escape analysis - (DexGuard - does).
  • -
- -

Can I use ProGuard to process my commercial application?

- -Yes, you can. ProGuard itself is distributed under the GPL, but this -doesn't affect the programs that you process. Your code remains yours, and -its license can remain the same. - -

Does ProGuard work with Java 2, 5, ..., 9?

- -Yes, ProGuard supports all JDKs from 1.1 up to and including 9.0. Java -2 introduced some small differences in the class file format. Java 5 added -attributes for generics and for annotations. Java 6 introduced optional -preverification attributes. Java 7 made preverification obligatory and -introduced support for dynamic languages. Java 8 added more attributes and -default methods. Java 9 added support for modules. ProGuard handles -all versions correctly. - -

Does ProGuard work with Java Micro Edition?

- -Yes. ProGuard itself runs in Java Standard Edition, but you can freely -specify the run-time environment at which your programs are targeted, -including Java Micro Edition. ProGuard then also performs the required -preverification, producing more compact results than the traditional external -preverifier. -

-ProGuard also comes with an obfuscator plug-in for the JME Wireless -Toolkit. - -

Does ProGuard work for Android apps?

- -Yes. Google's dx compiler converts Java bytecode into the Dalvik -bytecode that runs on Android devices. By preprocessing the original -bytecode, ProGuard can significantly reduce the file sizes and boost -the run-time performance of the code. It is distributed as part of the Android -SDK. DexGuard, ProGuard's closed-source sibling for -Android, offers additional optimizations and more application protection. - -

Does ProGuard work for Blackberry code?

- -It should. RIM's proprietary rapc compiler converts ordinary JME -jar files into cod files that run on Blackberry devices. The compiler performs -quite a few optimizations, but preprocessing the jar files with -ProGuard can generally still reduce the final code size by a few -percent. However, the rapc compiler also seems to contain some -bugs. It sometimes fails on obfuscated code that is valid and accepted by other -JME tools and VMs. Your mileage may therefore vary. - -

Does ProGuard have support for Ant?

- -Yes. ProGuard provides an Ant task, so that it integrates seamlessly -into your Ant build process. You can still use configurations in -ProGuard's own readable format. Alternatively, if you prefer XML, you -can specify the equivalent XML configuration. - -

Does ProGuard have support for Gradle?

- -Yes. ProGuard also provides a Gradle task, so that it integrates into -your Gradle build process. You can specify configurations in -ProGuard's own format or embedded in the Groovy configuration. - -

Does ProGuard have support for Maven?

- -ProGuard's jar files are also distributed as artefacts from -the Maven Central repository. There are some third-party -plugins that support ProGuard, such as the -android-maven-plugin and the -IDFC Maven -ProGuard Plug-in. -DexGuard -also comes with a Maven plugin. - -

Does ProGuard come with a GUI?

- -Yes. First of all, ProGuard is perfectly usable as a command-line tool -that can easily be integrated into any automatic build process. For casual -users, there's also a graphical user interface that simplifies creating, -loading, editing, executing, and saving ProGuard configurations. - -

Does ProGuard handle Class.forName calls?

- -Yes. ProGuard automatically handles constructs like -Class.forName("SomeClass") and SomeClass.class. The -referenced classes are preserved in the shrinking phase, and the string -arguments are properly replaced in the obfuscation phase. -

-With variable string arguments, it's generally not possible to determine their -possible values. They might be read from a configuration file, for instance. -However, ProGuard will note a number of constructs like -"(SomeClass)Class.forName(variable).newInstance()". These might -be an indication that the class or interface SomeClass and/or its -implementations may need to be preserved. The developer can adapt his -configuration accordingly. - -

Does ProGuard handle resource files?

- -Yes. ProGuard copies all non-class resource files, optionally adapting -their names and their contents to the obfuscation that has been applied. - -

Does ProGuard encrypt string constants?

- -No. String encryption in program code has to be perfectly reversible by -definition, so it only improves the obfuscation level. It increases the -footprint of the code. However, by popular demand, ProGuard's -closed-source sibling for Android, DexGuard, does provide string encryption, along with -more protection techniques against static and dynamic analysis. - -

Does ProGuard perform control flow obfuscation?

- -Not explicitly. Control flow obfuscation injects additional branches into the -bytecode, in an attempt to fool decompilers. ProGuard does not do this, -except to some extent in its optimization techniques. ProGuard's -closed-source sibling for Android, DexGuard, does offer control flow obfuscation, as one -of the many additional techniques to harden Android apps. - -

Does ProGuard support incremental obfuscation?

- -Yes. This feature allows you to specify a previous obfuscation mapping file in -a new obfuscation step, in order to produce add-ons or patches for obfuscated -code. - -

Can ProGuard obfuscate using reserved keywords?

- -Yes. You can specify your own obfuscation dictionary, such as a list of -reserved key words, identifiers with foreign characters, random source files, -or a text by Shakespeare. Note that this hardly improves the obfuscation. -Decent decompilers can automatically replace reserved keywords, and the effect -can be undone fairly easily, by obfuscating again with simpler names. - -

Can ProGuard reconstruct obfuscated stack traces?

- -Yes. ProGuard comes with a companion tool, ReTrace, that can -'de-obfuscate' stack traces produced by obfuscated applications. The -reconstruction is based on the mapping file that ProGuard can write -out. If line numbers have been obfuscated away, a list of alternative method -names is presented for each obfuscated method name that has an ambiguous -reverse mapping. Please refer to the ProGuard User -Manual for more details. -

-Erik André at Badoo has written a -tool to de-obfuscate HPROF memory dumps. - -

How is DexGuard different from ProGuard?

- -DexGuard is a -commercial extension of ProGuard: -
    -
  • DexGuard is specialized for Android applications and libraries: it - optimizes and obfuscates not just the bytecode, but also the manifest file, - resources, resource files, asset files, and native libraries.
  • -
  • DexGuard focuses on making apps self-defending against reverse - engineering and tampering. DexGuard's techniques for obfuscation, - encryption, and detection are a lot stronger than ProGuard's basic - name obfuscation.
  • -
  • DexGuard is backward compatible with ProGuard: it reads the - same configuration. It already comes with tuned configuration for the - Android runtime and for common Android libraries.
  • -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/GPL.html b/tools/proguard/proguard6.0.3/docs/GPL.html deleted file mode 100644 index c7a24580..00000000 --- a/tools/proguard/proguard6.0.3/docs/GPL.html +++ /dev/null @@ -1,406 +0,0 @@ - - - -GNU General Public License - - -

GNU General Public License

-

Table of Contents

- - -

- -


- -

- - - -

GNU GENERAL PUBLIC LICENSE

-

-Version 2, June 1991 - -

- -
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
- - - -

Preamble

- -

- The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - -

-

- When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - -

-

- To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - -

-

- For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - -

-

- We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - -

-

- Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - -

-

- Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - -

-

- The precise terms and conditions for copying, distribution and -modification follow. - -

- - -

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

- - -

- -0. - This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". -

- -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - -

- -1. - You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. -

- -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. -

- -2. - You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: -

- -

    - -
  • a) - You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - -

    -

  • b) - You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - -

    -

  • c) - If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) -
- -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. -

- -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. -

- -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - -

- -3. - You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - - - -

    - -
  • a) - Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - -

    -

  • b) - Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - -

    -

  • c) - Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) -
- -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. -

- -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. -

- -4. - You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -

- -5. - You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -

- -6. - Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - -

- -7. - If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. -

- -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. -

- -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. -

- -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -

- -8. - If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -

- -9. - The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. -

- -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - -

- - -10. - If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - - -

NO WARRANTY

- -

- -11. - BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - -

- -12. - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -

- - -

END OF TERMS AND CONDITIONS

- - diff --git a/tools/proguard/proguard6.0.3/docs/GPL_exception.html b/tools/proguard/proguard6.0.3/docs/GPL_exception.html deleted file mode 100644 index 76405668..00000000 --- a/tools/proguard/proguard6.0.3/docs/GPL_exception.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Special Exception to the GNU General Public License - - -

Special Exception to the GNU General Public License

- -

-Copyright © 2002-2018 GuardSquare NV -

- -

-This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. -

- -

-This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -

- -

-You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA -

- -

-In addition, as a special exception, GuardSquare NV gives permission to link -the code of this program with the following stand-alone applications: -

    -
  • Gradle,
  • -
  • Apache Ant,
  • -
  • Apache Maven,
  • -
  • the Google Android SDK,
  • -
  • the Eclipse ProGuardDT GUI,
  • -
  • the EclipseME JME IDE,
  • -
  • the Oracle NetBeans Java IDE,
  • -
  • the Oracle JME Wireless Toolkit, and
  • -
  • the Simple Build Tool for Scala (and its scripts).
  • -
-and distribute linked combinations including the two. You must obey the GNU -General Public License in all respects for all of the code used other than -these programs. If you modify this file, you may extend this exception to your -version of the file, but you are not obligated to do so. If you do not wish to -do so, delete this exception statement from your version. -

- - - diff --git a/tools/proguard/proguard6.0.3/docs/acknowledgements.html b/tools/proguard/proguard6.0.3/docs/acknowledgements.html deleted file mode 100644 index c41f9f6a..00000000 --- a/tools/proguard/proguard6.0.3/docs/acknowledgements.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - -ProGuard Acknowledgements - - - - - - -

Acknowledgements

- -The first versions of ProGuard grew out of RetroGuard, which its -author Mark Welsh kindly made available under the GNU Lesser General Public -License. RetroGuard is a very nice piece of code, but it only performed -obfuscation. I started from the class file parsing code and wrote my own -shrinker, optimizer, obfuscator, and preverifier. As of version 4.0, all of the -original code has been rewritten, so the most obvious remaining similarity are -the program names. -

- -Dirk Schnelle has contributed and maintained the first versions of the Ant -task. I have rewritten the implementation for version 3.0, but the XML schema -is still based on his work. -

- -Marcel Patzlaff has initiated a series of artifacts in the Maven Central -repository. I am now maintaining them as part of the official builds. -

- -Many other people have expressed their enthusiasm and have chimed in with -interesting ideas, bug reports, and bug fixes: Thorsten Heit, Oliver Retzl, -Jonathan Knudsen, Tarcisio Camara, Bob Drury, Dave Jarvis, Marc Chapman, Dave -Morehouse, Richard Osbaldeston, Peter Hawkins, Mark Sherington, David Sitsky, -James Manning, Ptolemy Oberin, Frank-Michael Moser, QZ Shines, Thomas Singer, -Michele Puccini, Roman Bednarek, Natalia Pujol, Daniel Sjöblom, Jan -Filipsky, Charles Smith, Gerrit Telkamp, Noel Grandin, Torbjörn -Söderstedt, Clemens Eisserer, Clark Bassett, Eduard Welch, Dawid Weiss, -Andrew Wilson, Sean Owen, Niels Gron, Ishan Mehta, Steven Adams, Xavier Kral, -Stefan Martin, Toby Reyelts, Bernhard Eder, Manfred Moser, Marco Blümel, -David Reiss, Roy Williams, Marcel Heckel, Balazs Banyai, Jan Mönnich, -and many more. Thanks! Your feedback has been invaluable. -

- -GuardSquare is providing the -financial resources for this project. At GuardSquare, we're also developing -ProGuard's sibling for Android, -DexGuard. -

- -British Sky -has kindly sponsored the optimization of enum types. -

- -SourceForge is providing the resources for hosting this -project and many other projects. -

- -Sonatype and -the Maven Central repository are hosting the Maven artifacts. -

- -The code and these web pages were written using Oracle/Sun's JDKs, Linux, -IntelliJ IDEA, GNU emacs, bash, sed, awk, and a whole host of other tools that -continue to make programming interesting. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/alternatives.html b/tools/proguard/proguard6.0.3/docs/alternatives.html deleted file mode 100644 index 2ca9fd64..00000000 --- a/tools/proguard/proguard6.0.3/docs/alternatives.html +++ /dev/null @@ -1,800 +0,0 @@ - - - - - - -ProGuard Alternatives - - - - - - -

Alternatives

- -There are quite a few Java/Dalvik code shrinkers, optimizers, obfuscators, and -preverifiers out there. Users of ProGuard tell me it easily compares -with the best of them. However, you may want to check that out yourself. -

-This is a list of the programs of which I'm aware. Obviously, I've never -personally tested all of them. Many programs, even commercial ones, have been -abandoned. Please drop me a note if you know of any other shrinkers, -optimizers, obfuscators, or preverifiers, or if some information provided -below is incorrect. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Author/CompanyProgramShrink.Optim.Obfusc.Preverif.License
Eric LafortuneProGuardxxxxFree (GPL)
Jochen HoenickeJodexxx
Free (GPL)
GoogleR8xxx
Free (Apache)
FacebookReDexxx

Free (BSD)
Nate NystromBloatxx

Free
Hidetoshi OhuchiJargx
x
Free (BSD)
yWorksyGuardx
x
Free (no source)
RiggsHill SoftwareGenJarx


Free (Apache)
ApacheAnt Classfilesetx


Free (Apache)
Carsten Elton SørensenTreeshakerx


Free (Apache)
Jörg SpielerUCDetectorx


Free (EPL)
Emeric VernatDCDx


Free (LGPL)
Cristiano SadunPackx


Free (LGPL)
SableSoot
x

Free (LGPL)
SableJBCO

x
Free (LGPL)
Jeffrey WheatonClassEncrypt

x
Free (GPL)
Thorsten HeitJavaGuard

x
Free (LGPL)
Patrick MuellerMwobfu

x
Free (GPL)
BebboSoftBb_mug

x
Free (no source)
Vít ŠestákPreverifier


xFree (EPL)
GuardSquareDexGuardxxx
Commercial
PreEmptiveDashOProxxx
Commercial
ZelixKlassMasterxxx
Commercial
Sophia CradleSophiaCompressxxx
Commercial
Eastridge TechnologyJshrinkx
x
Commercial
InnaworksmBoosterxx
xCommercial
Sergey SverdlovJ.Class Optimizerxx

Commercial
SmardecAllatori
xx
Commercial
U. of ArizonaSandMark
xx
Commercial
ZenofxClassGuard

x
Commercial
BIS Guard & Co.Java Antidecompiler

x
Commercial
Force 5JCloak

x
Commercial
Semantic DesignsObfuscator

x
Commercial
DuckwareJobfuscate

x
Commercial
SecureteamJfuscator

x
Commercial
ArxanGuardIT

x
Commercial
Bfa-itJarProtector

x
Commercial
Vasile CalmatuiVasObfuLite

x
Free
GoogleJackxxx
(discontinued)
IBM AlphaWorksJAXxxx
(discontinued)
NQ4Jogaxxx
(discontinued?)
Markus JansenJoptxxx
(disappeared?)
Alexander ShvetsCafeBabex
x
(disappeared?)
MojoMinijarx


(discontinued)
Romain GuyHarvesterx


disappeared?)
Brian AllietGcclassx


(disappeared?)
Christian GrothoffJamitx


(disappeared?)
Konstantin KnizhnikJavaGO
x

(disappeared?)
Haruaki TamadaDonQuixote
xx
(disappeared?)
BajieJCMP
xx
(disappeared?)
Elegant SoftwareJMangle

x
(disappeared?)
Eron JokipiiJobe

x
(disappeared?)
JRCDeCaf

x
(disappeared?)
Dr. JavaMarvin Obfuscator

x
(disappeared?)
IBMWSDDxxx
Commercial (discontinued?)
S5 SystemsjPrestoxxx
Commercial (discontinued?)
Plumb DesignCondensityx
x
Commercial (discontinued)
4th PassSourceGuardx
x
Commercial (discontinued?)
CodingArtCodeShieldx
x
Commercial (discontinued?)
RetroLogicRetroGuardx
x
Commercial (disappeared?)
HelsethJObfuscatorx
x
Commercial (disappeared?)
Vega TechnologiesJZipperx
x
Commercial (disappeared?)
LeeSoftwareSmokescreen Obfuscatorx
x
Commercial (disappeared?)
Eduardo CocaShield4Jx
x
Commercial (disappeared?)
Software4jObfuscate4j

x
Commercial (discontinued?)
JAMM ConsultingObfuscatePro

x
Commercial (discontinued?)
JDevelopJSCO

x
Commercial (discontinued?)
4FangJMix

x
Commercial (discontinued?)
JProofJProof

x
Commercial (disappeared?)
ChainKeyJava Code Protector

x
Commercial (disappeared?)
2LKit2LKit Obfuscator

x
Commercial (disappeared?)
WingSoftWingGuard

x
Commercial (disappeared?)
HashJavaHashJava

x
Commercial (disappeared?)
GITSBlurfuscator

x
Commercial (disappeared?)
-

-All trademarks are property of their respective holders. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/android_shades.png b/tools/proguard/proguard6.0.3/docs/android_shades.png deleted file mode 100644 index 96e54f00..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/android_shades.png and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/checkmark.gif b/tools/proguard/proguard6.0.3/docs/checkmark.gif deleted file mode 100644 index 8afa6773..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/checkmark.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/dexguard.png b/tools/proguard/proguard6.0.3/docs/dexguard.png deleted file mode 100644 index ed8f1f46..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/dexguard.png and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/downloads.html b/tools/proguard/proguard6.0.3/docs/downloads.html deleted file mode 100644 index 7496c8fb..00000000 --- a/tools/proguard/proguard6.0.3/docs/downloads.html +++ /dev/null @@ -1,846 +0,0 @@ - - - - - - - -ProGuard Downloads - - - - - - -

Downloads

- -ProGuard is distributed under the terms of the GNU General Public -License. Please consult the license page for more -details. -

-ProGuard is written in Java, so it requires a Java Runtime Environment - (JRE 1.6 or higher). -

-You can download the latest release (containing the program jars, the -documentation that you're reading now, examples, and the source code) from this -location: -

-

Download section at SourceForge
-

- -The proguard section contains major releases and updates with -sub-minor version numbers, for applying emergency fixes. The -proguard beta section contains beta releases. These include -new features and any less urgent bug fixes collected since the previous -release. -

-If you're still working with an older version of ProGuard, check out -the summary of changes below, to see if you're missing something essential. -Better look at the up-to-date on-line version if -you're reading a local copy of this page. Unless noted otherwise, -ProGuard remains compatible across versions, so don't be afraid to -update. -

-If you're only interested in individual jar files for your build process, you -can also download them from the Maven Central repository, with GroupId -net.sf.proguard and ArtifactIds -proguard-parent, -proguard-base, -proguard-gui, -proguard-anttask, -proguard-gradle, -proguard-wtk-plugin, and -proguard-retrace. - -

Feb 2018
Version 6.0

-
    -
  • [PGD-701] Fixed potential VerifyError in the presence of branches to - instruction offset 0. -
  • Fixed backporting of lambda functions using the alternative factory method. -
  • [PGD-699] Fixed obfuscation of closures that implement multiple interfaces. -
  • [PGD-694] Fixed classes prefix when writing output to directories. -
  • [PGD-186] Added support for Java 10. -
  • [PGD-698] Fixed possible NullPointerException when parsing configuration. -
  • [PGD-655] Fixed access from static methods to protected methods in - superclasses. -
  • [PGD-693] Fixed obfuscation of closures for functional interfaces with - default methods. -
  • Added new option -if, to specify conditions for - -keep options. -
  • Added new option -addconfigurationdebugging, to instrument the - code to get feedback about missing configuration at runtime. -
  • Added new option -android to tune processing for Android. -
  • Added support for references to matched wildcards in regular expressions - in -keep options. -
  • Added new options -assumenoexternalsideeffects, - -assumenoescapingparameters, and - -assumenoexternalreturnvalues, to express fine-grained - assumptions for better code optimization. -
  • Added backporting of Java 8 code. -
  • Added backporting and support for Java 9 code. -
  • Improved vertical class merging. -
  • [PGD-689] Fixed optimization potentially causing unexpected error while - processing Kotlin bytecode. -
  • [PGD-690] Fixed NullPointerException when editing keep specifications - in GUI. -
  • [PGD-688] Fixed UnsupportedOperationException while optimizing type - annotations. -
  • [PGD-654] Fixed processing of MethodParameters attributes with nameless - parameters. -
  • [PGD-662] Fixed obfuscation causing clashing private and default method - names. -
  • [PGD-684] Fixed obfuscation of extensions of functional interfaces that - are implemented with closures. -
  • [PGD-681] Fixed potential IllegalArgumentException in simplification of - tail recursion. -
  • [PGD-672] Fixed memory leak writing compressed zip entries. -
  • [PGD-652] Fixed possible NullPointerException due to missing variable - initialization. -
  • [PGD-641] Fixed possible NullPointerException due to optimized enum types. -
  • [PGD-630] Fixed possible NullPointerException in optimization step. -
  • [PGD-637] Fixed simplification of enum types in invokedynamic calls. -
  • Fixed merging of classes sometimes resulting in final methods being - overridden. -
  • Fixed simplification of enum types that are stored in arrays. -
  • Fixed VerifyError triggered by merging classes with shrinking disabled. -
- -

Sep 2016
Version 5.3

-
    -
  • Avoiding obfuscated name clashes with library classes. -
  • Fixed processing of generic signatures with inner classes. -
  • Fixed processing of generic signatures with array types as bounds. -
  • Fixed processing of wide branch instructions. -
  • Fixed shrinking of nameless parameters attribute. -
  • Fixed optimization of code with unreachable exception handlers. -
  • Fixed optimization of enum types with custom fields. -
  • Fixed optimization of enum types with custom static methods. -
  • Fixed optimization of lambda method types. -
  • Fixed optimization of parameter annotations. -
  • Fixed optimization of swap/pop constructs. -
  • Fixed adapting class access for referenced class members. -
  • Fixed adapting invocations for referenced class members. -
  • Preserving class member signature classes if - includedescriptorclasses is specified. -
  • Allowing empty output jars if -ignorewarnings is specified. -
  • Avoiding exceptions when inlining invalid line number instruction offsets. -
  • Fixed preverification of wildcard exceptions. -
  • Fixed ReTrace for field names. -
  • Fixed ReTrace for negative line numbers. -
  • Improved ReTrace regular expression for Logback and Log4j. -
  • Added Gradle build file. -
  • Updated documentation and examples. -
- -

Jan 2015
Version 5.2

-
    -
  • Added encoding of optimized line numbers in ProGuard. -
  • Added decoding of optimized stack frames in ReTrace. -
  • Added overflow checks when writing out class files. -
  • Fixed shrinking of default methods in subinterfaces. -
  • Fixed optimization of closures with signatures containing merged classes. -
  • Fixed conservative optimization of instructions that may throw exceptions. -
  • Fixed internal processing of primitive array types. -
  • Updated documentation and examples. -
- -

Oct 2014
Version 5.1

-
    -
  • Fixed processing of various kinds of closures in Java 8. -
  • Fixed shrinking of generic signatures in classes and methods. -
  • Fixed shrinking of debug information about generic local variable types. -
  • Fixed optimization of default implementations in interfaces. -
  • Fixed optimization of variable initializations. -
  • Fixed obfuscation of internal class names in strings. -
  • Updated documentation and examples. -
- -

Aug 2014
Version 5.0

-
    -
  • Added support for Java 8. -
  • Added -keep modifier includedescriptorclasses. -
  • Added automatic suggestions for keeping attributes. -
  • Clearing preverification information when -dontpreverify is - specified. -
  • Extended optimization support for conservative optimization with java - system property optimize.conservatively. -
  • Fixed occasional preverification problem. -
  • Fixed shrinking of generic class signatures. -
  • Fixed shrinking of generic variable signatures. -
  • Fixed analysis of unused parameters for bootstrap methods in library - classes. -
  • Fixed inlining problem of non-returning subroutines. -
  • Fixed possible IllegalArgumentException and ArrayIndexOutOfBoundsException - in enum simplification. -
  • Fixed unnecessary notes about dynamic class instantiations with constant - class names. -
  • Fixed preverification of unnecessary casts of null values. -
  • Fixed lazy resolution of output jars in Gradle task. -
  • Fixed processing of synthetic code with alternative initializer invocations. -
  • Improved handling of symbolic links in shell scripts. -
  • Improved default path in Windows bat files. -
  • Updated documentation and examples. -
- -

Dec 2013
Version 4.11

-
    -
  • Added simplification of basic enum types. -
  • Added reading and writing of apk and aar archives. -
  • Fixed criteria for class merging. -
  • Fixed simplification of variable initializations. -
  • Fixed simplification of redundant boolean variables. -
  • Fixed optimization of unused stack entries in exception handlers. -
  • Fixed correction of access flags after class merging, method inlining, and - class repackaging. -
  • Refined criterion for method inlining. -
  • Updated documentation and examples. -
- -

Jul 2013
Version 4.10

-
    -
  • Made Gradle task resolve files lazily. -
  • Enabled as-needed execution in Gradle task. -
  • Using standard string interpolation for Gradle configuration. -
  • Reduced log levels for console output in Gradle task. -
  • Updated documentation and examples. -
- -

Mar 2013
Version 4.9

-
    -
  • Added Gradle task. -
  • Added more peephole optimizations for strings. -
  • Improved optimization of classes with static initializers. -
  • Improved processing of finally blocks compiled with JDK 1.4 or older. -
  • Fixed shrinking of access widening abstract methods, for the Dalvik VM. -
  • Fixed overly aggressive shrinking of class annotations. -
  • Fixed processing of unused classes in generic signatures. -
  • Fixed merging of classes with similar class members. -
  • Added java system property optimize.conservatively to allow - for instructions intentionally throwing NullPointerException, - ArrayIndexOutOfBoundsException, or - ClassCastException without other useful effects. -
  • Fixed optimization of unnecessary variable initializations. -
  • Fixed optimization of code involving NaN. -
  • Fixed inlining of methods that are supposed to be kept. -
  • Fixed preverification of artificially convoluted dup constructs. -
  • Fixed quotes for java commands in .bat scripts. -
  • Improved handling of non-sequential line number information. -
  • Now requiring Java 5 or higher for running ProGuard. -
  • Updated build files. -
  • Updated documentation and examples. -
- -

May 2012
Version 4.8

-
    -
  • Added more peephole optimizations for strings. -
  • Added support for multiple external configuration files in Ant - configurations. -
  • Added support for Ant properties in external configuration files. -
  • Fixed parsing of empty file filters on input and output. -
  • Fixed parsing of '*' wildcard for file filters and name filters. -
  • Fixed obfuscation of private methods that are overridden in concrete - classes with intermediary abstract classes and interfaces (workaround - for Oracle bugs #6691741 and #6684387). -
  • Fixed optimization of complex finally blocks, compiled with JDK 1.4 or - earlier. -
  • Fixed optimizing signatures of methods that are marked as not having - side effects. -
  • Fixed optimization of long local variables possibly causing verification - error for register pairs. -
  • Fixed merging of classes defined inside methods. -
  • Fixed stack consistency in optimization step. -
  • No longer removing debug information about unused parameters, for - -keepparameternames or -keepattributes. -
  • Fixed updating manifest files with carriage return characters. -
  • Now removing unreachable code in preverification step. -
  • Improved default regular expression for stack traces in ReTrace. -
  • Updated documentation and examples. -
- -

Dec 2011
Version 4.7

-
    -
  • Added support for Java 7. -
  • Parsing unquoted file names with special characters more leniently. -
  • Added support for instance methods overriding class methods. -
  • Added removal of unused parameterless constructors. -
  • Added removal of empty class initializers. -
  • Added peephole optimizations for constant strings. -
  • Avoiding idle optimization passes. -
  • Improved removal of unused constants after obfuscation. -
  • Fixed removal of unused classes referenced by annotations. -
  • Fixed simplifying parameters of constructors that should actually be - preserved. -
  • Fixed simplifying parameters of large numbers of similar constructors. -
  • Fixed exceptions in optimization of unusual obfuscated code. -
  • Fixed NullPointerException when specifying -keepclassmembers - without specific class or class members. -
  • Fixed potential problems with mixed-case class name dictionaries when not - allowing mixed-case class names. -
  • Fixed obfuscation of classes with EnclosingMethod attributes that don't - specify methods. -
  • Fixed preverification of returning try blocks with finally blocks, inside - try blocks, when compiled with JDK 1.4. -
  • Fixed sorting of interfaces containing generics. -
  • Fixed paths in shell scripts. -
  • Fixed filling in of text fields showing class obfuscation dictionary and - package obfuscation dictionary from configuration in GUI. -
  • Worked around Oracle Java 6/7 bug #7027598 that locked the GUI on Linux. -
  • Updated documentation and examples. -
- -

Feb 2011
Version 4.6

-
    -
  • Added support for synthetic, bridge, and varargs modifiers in configuration. -
  • Added detection of atomic updater construction with constant arguments. -
  • Fixed merging of package visible classes. -
  • Fixed optimization of fields that are only accessed by reflection. -
  • Fixed optimization of read-only or write-only fields that are volatile. -
  • Fixed handling of side-effects due to static initializers. -
  • Fixed handling of bridge flags in obfuscation step. -
  • Fixed handling of super flag when merging classes. -
  • Fixed updating of variable tables when optimizing variables. -
  • Fixed removal of unused parameters with 32 or more parameters. -
  • Fixed incorrect removal of exception handler for instanceof instruction. -
  • Fixed inlining of methods with unusual exception handlers. -
  • Fixed optimization of unusual code causing stack underflow. -
  • Fixed keeping of constructor parameter names. -
  • Fixed unwanted wrapping of non-standard META-INF files. -
  • Fixed filtering of warnings about references to array types. -
  • Fixed overriding of warning option and note option in Ant task. -
  • Improved detection of file name extensions for canonical paths. -
  • Improved printing of seeds specified by -keep options. -
  • Improved printing of notes about unkept classes. -
  • Improved checking whether output is up to date. -
  • Updated documentation and examples. -
- -

Jun 2010
Version 4.5

-
    -
  • Added option -keepparameternames. -
  • -dontskipnonpubliclibraryclasses is now set by default. Added - -skipnonpubliclibraryclasses as an option. -
  • Made processing independent of order of input classes to get even more - deterministic output. -
  • Improved constant field propagation. -
  • Improved renaming of resource files in subdirectories of packages. -
  • Avoiding making fields in interfaces private. -
  • Optimizing exception handlers for monitorexit instruction. -
  • Reduced maximum allowed code length after inlining from 8000 bytes to - 7000 bytes. -
  • Fixed missing warnings about missing library classes. -
  • Fixed shrinking of annotations with arrays of length 0. -
  • Fixed handling of -0.0 and NaN values when simplifying expressions. -
  • Fixed copying of exception handlers when simplifying tail recursion calls. -
  • Fixed optimization of introspected fields. -
  • Fixed simplification of unnecessary variable initializations. -
  • Fixed evaluation of subroutines in pre-JDK 1.5 code. -
  • Fixed updating of access flags in inner classes information. -
  • Fixed disabling of field privatization. -
  • Fixed invocations of privatized methods. -
  • Fixed updating of local variable debug information in optimization step. -
  • Fixed print settings without file name in GUI. -
  • Fixed field privatization setting in GUI. -
  • Fixed saving incorrectly quoted arguments in GUI. -
  • Fixed handling of regular expressions with only negators. -
  • Fixed unwanted wrapping of non-standard META-INF files. -
  • Fixed regular expression pattern for constructors in ReTrace. -
  • Updated documentation and examples. -
- -

Jul 2009
Version 4.4

-
    -
  • Added new peephole optimizations. -
  • Added option -optimizations for fine-grained configuration of - optimizations. -
  • Added option -adaptclassstrings for adapting string constants - that correspond to obfuscated classes. -
  • Added option -keeppackagenames for keeping specified package - names from being obfuscated. -
  • Added option -keepdirectories for keeping specified directory - entries in output jars. -
  • Extended options -dontnote and -dontwarn for - fine-grained configuration of notes and warnings. -
  • Added option -regex in ReTrace, for specifying alternative - regular expressions to parse stack traces. -
  • Extended renaming of resource files based on obfuscation. -
  • Improved inlining of constant parameters and removal of unused parameters. -
  • Avoiding bug in IBM's JVM for JSE, in optimization step. -
  • Avoiding ArrayIndexOutOfBoundsException in optimization step. -
  • Fixed configuration with annotations that are not preserved themselves. -
  • Fixed preverification of invocations of super constructors with arguments - containing ternary operators. -
  • Fixed processing of unreachable exception handlers. -
  • Fixed merging of exception classes. -
  • Fixed repeated method inlining. -
  • Fixed inlining of finally blocks surrounded by large try blocks, compiled - with JDK 1.4 or earlier. -
  • Fixed optimization of complex finally blocks, compiled with JDK 1.4 or - earlier. -
  • Fixed obfuscation of anonymous class names, if EnclosingMethod - attributes are being kept. -
  • Fixed obfuscation of inner class names in generic types. -
  • Fixed decoding of UTF-8 strings containing special characters. -
  • Fixed copying of debug information and annotations when merging classes. -
  • Fixed writing out of unknown attributes. -
  • Fixed updating manifest files with split lines. -
  • Updated documentation and examples. -
- -

Dec 2008
Version 4.3

-
    -
  • Added class merging. -
  • Added static single assignment analysis. -
  • Added support for annotation and enumeration class types in configuration. -
  • Refined shrinking of fields in case of unusual - -keepclassmembers options. -
  • Added simplification of tail recursion calls. -
  • Added new peephole optimizations. -
  • Fixed optimization of unused variable initializations causing negative - stack sizes. -
  • Fixed optimization of unusual initialization code causing - NullPointerExceptions. -
  • Fixed optimization of half-used long and double parameters. -
  • Fixed processing of complex generics signatures. -
  • Working around suspected java compiler bug with parameter annotations on - constructors of non-static inner classes. -
  • Fixed obfuscation of classes with inner classes whose names are preserved. -
  • Fixed access of protected methods in repackaged classes. -
  • Added options -classobfuscationdictionary and - -packageobfuscationdictionary. -
  • Adapting more types of resource file names based on obfuscation. -
  • Extended warnings about incorrect dependencies. -
  • Added start-up scripts and build scripts. -
  • Updated documentation and examples. -
- -

Mar 2008
Version 4.2

-
    -
  • Refined data flow analysis in optimization step. -
  • Fixed handling of exceptions when inlining subroutines. -
  • Fixed inlining of incompatible code constructs between different java - versions. -
  • Fixed computation of local variable frame size. -
  • Fixed optimization of infinite loops. -
  • Fixed optimization of subroutine invocations. -
  • Fixed optimization of floating point remainder computations. -
  • Fixed removal of unused parameters in method descriptors containing arrays - of longs or doubles. -
  • Added undocumented java system properties - maximum.inlined.code.length (default is 8) and - maximum.resulting.code.length (defaults are 8000 for JSE and - 2000 for JME), for expert users who read release notes. -
  • Fixed processing of generic types in Signature attributes in shrinking and - optimization steps. -
  • Fixed processing of inner class names in Signature attributes in obfuscation - step. -
  • Improved adapting resource file names following obfuscated class names. -
  • Fixed interpretation of package names in GUI. -
  • Fixed default settings for Xlets in GUI. -
  • Updated documentation and examples. -
- -

Dec 2007
Version 4.1

-
    -
  • Fixed shrinking of default annotation element values. -
  • Fixed optimization of invocations of methods in same class that are - accessed through extensions. -
  • Fixed optimization of invocations of synchronized methods without other - side-effects. -
  • Fixed optimization of some non-returning subroutines. -
  • Fixed handling of local variable debug information when inlining methods. -
  • Avoiding StackOverflowErrors during optimization of complex methods. -
  • Fixed obfuscation of potentially ambiguous non-primitive constants in - interfaces. -
  • Fixed preverification of some code constructs involving String, Class, and - exception types. -
  • The Ant task now allows empty <injars> and - <libraryjars> elements. -
  • Updated documentation and examples. -
- -

Sep 2007
Version 4.0

-
    -
  • Added preverifier for Java 6 and Java Micro Edition, with new options - -microedition and -dontpreverify. -
  • Added new option -target to modify java version of processed - class files. -
  • Made -keep options more orthogonal and flexible, with option - modifiers allowshrinking, allowoptimization, and - allowobfuscation. -
  • Added new wildcards for class member descriptors: "***", - matching any type, and "...", matching any number of - arguments. -
  • Added support for configuration by means of annotations. -
  • Improved shrinking of unused annotations. -
  • Added check on modification times of input and output, to avoid unnecessary - processing, with new option -forceprocessing. -
  • Added new options -flattenpackagehierarchy and - -repackageclasses (replacing -defaultpackage) to - control obfuscation of package names. -
  • Added new options -adaptresourcefilenames and - -adaptresourcefilecontents, with file filters, to update - resource files corresponding to obfuscated class names. -
  • Added detection of dynamically accessed fields and methods. -
  • Now treating Exceptions attributes as optional. -
  • Now respecting naming rule for nested class names - (EnclosingClass$InnerClass) in obfuscation step, if - InnerClasses attributes or EnclosingMethod - attributes are being kept. -
  • Added new inter-procedural optimizations: method inlining and propagation - of constant fields, constant arguments, and constant return values. -
  • Added optimized local variable allocation. -
  • Added more than 250 new peephole optimizations. -
  • Improved making classes and class members public or protected. -
  • Now printing notes on suspiciously unkept classes in parameters of - specified methods. -
  • Now printing notes for class names that don't seem to be fully qualified. -
  • Added support for uppercase filename extensions. -
  • Added tool tips to the GUI. -
  • Rewritten class file I/O code. -
  • Updated documentation and examples. -
-Upgrade considerations: -
    - -
  • Since ProGuard now treats the Exceptions attribute as - optional, you may have to specify -keepattributes Exceptions, - notably when processing code that is to be used as a library. - -
  • ProGuard now preverifies code for Java Micro Edition, if you specify the - option -microedition. You then no longer need to process the - code with an external preverifier. - -
  • You should preferably specify -repackageclasses instead of the - old option name -defaultpackage. -
- -

Dec 2007
Version 3.11

-
    -
  • Fixed optimization of invocations of methods in same class that are - accessed through extensions. -
  • Fixed optimization of invocations of synchronized methods without other - side-effects. -
  • Updated documentation and examples. -
- -

Aug 2007
Version 3.10

-
    -
  • Now handling mixed-case input class names when - -dontusemixedcaseclassnames is specified. -
  • Fixed optimization of synchronization on classes, as compiled by Eclipse - and Jikes. -
  • Fixed optimization of switch statements with unreachable cases. -
  • Avoiding merging subsequent identically named files. -
  • Updated documentation and examples. -
- -

Jun 2007
Version 3.9

-
    -
  • Fixed processing of .class constructs in Java 6. -
  • Fixed repeated processing of .class constructs. -
  • Fixed possible division by 0 in optimization step. -
  • Fixed handling of variable instructions with variable indices larger than - 255. -
  • Updated documentation and examples. -
- -

Mar 2007
Version 3.8

-
    -
  • Fixed optimization of parameters used as local variables. -
  • Fixed obfuscation with conflicting class member names. -
  • Fixed incremental obfuscation with incomplete mapping file for library jars. -
  • Updated documentation and examples. -
- -

Dec 2006
Version 3.7

-
    -
  • Now accepting Java 6 class files. -
  • Fixed shrinking of partially used annotations. -
  • Improved incremental obfuscation, with new option - -useuniqueclassmembernames. -
  • Printing more information in case of conflicting configuration and input. -
  • Fixed optimization of repeated array length instruction. -
  • Fixed optimization of subsequent try/catch/finally blocks with return - statements. -
  • Fixed optimization of complex stack operations. -
  • Fixed optimization of simple infinite loops. -
  • Fixed optimization of expressions with constant doubles. -
  • Tuned optimization to improve size reduction after preverification. -
  • Fixed overflows of offsets in long code blocks. -
  • Now allowing class names containing dashes. -
  • Updated documentation and examples. -
- -

May 2006
Version 3.6

-
    -
  • No longer automatically keeping classes in parameters of specified methods - from obfuscation and optimization (introduced in version 3.4). -
  • Fixed inlining of interfaces that are used in .class constructs. -
  • Fixed removal of busy-waiting loops reading volatile fields. -
  • Fixed optimization of comparisons of known integers. -
  • Fixed optimization of known branches. -
  • Fixed optimization of method calls on arrays of interfaces. -
  • Fixed optimization of method calls without side-effects. -
  • Fixed optimization of nested try/catch/finally blocks with return - statements. -
  • Fixed initialization of library classes that only appear in descriptors. -
  • Fixed matching of primitive type wildcards in configuration. -
  • Fixed the boilerplate specification for enumerations in the GUI. -
  • Updated documentation and examples. -
- -

Jan 2006
Version 3.5

-
    -
  • Fixed obfuscation of class members with complex visibility. -
  • Fixed optimization bugs causing stack verification errors. -
  • Fixed optimization bug causing overridden methods to be finalized. -
  • Fixed optimization bug causing abstract method errors for retro-fitted - library methods. -
  • Fixed optimization bug evaluating code with constant long values. -
  • Fixed bug in updating of optional local variable table attributes and local - variable type table attributes after optimization. -
  • Fixed interpretation of comma-separated class names without wildcards. -
  • Updated documentation and examples. -
- -

Oct 2005
Version 3.4

-
    -
  • Extended optimizations: removing duplicate code within methods. -
  • Extended regular expressions for class names to comma-separated lists. -
  • Now automatically keeping classes in descriptors of kept class members. -
  • Added verbose statistics for optimizations. -
  • Added boilerplate Number optimizations in GUI. -
  • Fixed Class.forName detection. -
  • Fixed incremental obfuscation bug. -
  • Fixed optimization bug causing stack verification errors. -
  • Fixed optimization bugs related to removal of unused parameters. -
  • Fixed exception when optimizing code with many local variables. -
  • Fixed exception when saving configuration with initializers in GUI. -
  • Updated documentation and examples. -
- -

Jun 2005
Version 3.3

-
    -
  • Extended optimizations: making methods private and static when possible, - making classes static when possible, removing unused parameters. -
  • Made file names relative to the configuration files in which they are - specified. Added -basedirectory option. -
  • Added -whyareyoukeeping option to get details on why given - classes and class members are being kept. -
  • Added warnings for misplaced class files. -
  • Improved printing of notes for Class.forName constructs. -
  • Implemented 'assumenosideeffects' nested element in Ant task. -
  • Improved processing of annotations. -
  • Fixed reading and writing of parameter annotations. -
  • Fixed various optimization bugs. -
  • Fixed wildcards not matching '-' character. -
  • Fixed wildcard bug and checkbox bugs in GUI. -
  • Setting file chooser defaults in GUI. -
  • Leaving room for growBox in GUI on Mac OS X. -
  • Properly closing configuration files. -
  • Updated documentation and examples. -
- -

Dec 2004
Version 3.2

-
    -
  • Fixed JDK5.0 processing bugs. -
  • Fixed optimization bugs. -
  • Fixed relative paths in Ant task. -
  • Improved speed of shrinking step. -
  • Updated documentation and examples. -
- -

Nov 2004
Version 3.1

-
    -
  • Improved obfuscation and shrinking of private class members. -
  • Added inlining of interfaces with single implementations. -
  • Added option to specify obfuscation dictionary. -
  • Added option to read package visible library class members. -
  • Extended support for JDK5.0 attributes. -
  • Fixed various optimization bugs. -
  • Modified Ant task to accept paths instead of filesets. -
  • Fixed two Ant task bugs. -
  • Updated documentation and examples. -
- -

Aug 2004
Version 3.0

-
    -
  • Added bytecode optimization step, between shrinking step and obfuscation - step. -
  • Generalized filtered recursive reading and writing of jars, wars, ears, - zips, and directories. -
  • Added support for grouping input and output jars, wars, ears, zips, and - directories. -
  • Added support for applying mapping files to library classes. -
  • Removed -resourcejars option. Resources should now be read - using regular -injars options, using filters if necessary. -
  • Rewrote Ant task. Input and output modification dates are not checked at - the moment. Minor changes in XML schema: -
      -
    • Filters now specified using attributes. -
    • 'outjars' now nested element instead of attribute. -
    • 'type' attribute of <method> element no - longer defaults to 'void'. -
    • < and > characters now have to be - encoded in embedded configurations. -
    • <proguardconfiguration> task no longer accepts - attributes. -
    -
  • Updated J2ME WTK plugin, now customizable through configuration file. -
  • Updated GUI. -
  • Fixed various processing bugs. -
  • Fixed ReTrace parsing bugs. -
  • Improved jar compression. -
  • Updated documentation and examples. -
- -

Mar 2004
Version 2.1

-
    -
  • Added support for JDK1.5 classes. -
  • Added additional wildcard for matching primitive types. -
  • Added possibility to switch off notes about duplicate class definitions. -
  • Fixed use of multiple filters on output jars. -
  • Fixed option to keep all attributes. -
  • Fixed various Ant task bugs. -
  • Updated documentation and examples. -
- -

Dec 2003
Version 2.0

-
    -
  • Added a graphical user interface for ProGuard and ReTrace. -
  • Added -applymapping option for incremental obfuscation. -
  • Added support for filtering input and output files. -
  • Added support for the J++ SourceDir attribute. -
  • Improved detection of .class constructs. -
  • Improved handling of misplaced manifest files. -
  • Improved implementation of ReTrace. -
  • Worked around String UTF-8 encoding bug affecting foreign characters. -
  • Fixed exception when ignoring warnings. -
  • Fixed various Ant task bugs. -
  • Updated documentation and examples. -
- -

Aug 2003
Version 1.7

-
    -
  • Fixed various Ant task bugs. -
  • Fixed ClassCastException due to explicitly used abstract classes with - implicitly used interfaces targeted at JRE1.2 (the default in JDK1.4). -
  • Fixed -defaultpackage bug for protected classes and class - members. -
  • Fixed ReTrace bug when retracing without line number tables. -
  • Worked around zip package problems with duplicate out entries and rogue - manifest files. -
  • Added work-around for handling malformed legacy interface class files. -
  • Updated documentation and examples. -
- -

May 2003
Version 1.6

-
    -
  • Added support for Ant. -
  • Added support for the J2ME Wireless Toolkit. -
  • Added support for reading and writing directory hierarchies. -
  • Added option for specifying resource jars and directories. -
  • Added support for wildcards in class member specifications. -
  • Improved handling of the -defaultpackage option. -
  • Improved stack trace parsing in ReTrace tool. -
  • Fixed processing of libraries containing public as well as non-public - extensions of non-public classes. -
  • Fixed examples for processing libraries, midlets, and serializable code. -
  • Updated documentation and examples. -
- -

Jan 2003
Version 1.5

-
    -
  • Fixed processing of retrofitted library interfaces. -
  • Fixed processing of .class constructs in internal classes - targeted at JRE1.2 (the default in JDK1.4). -
  • Fixed -dump option when -outjar option is not - present. -
  • Updated documentation and examples. -
- -

Nov 2002
Version 1.4

-
    -
  • Now copying resource files over from the input jars to the output jar. -
  • Added option to obfuscate using lower-case class names only. -
  • Added better option for obfuscating native methods. -
  • Added option not to ignore non-public library classes. -
  • Added automatic .class detection for classes compiled with - Jikes. -
  • Updated documentation and examples. -
- -

Sep 2002
Version 1.3

-
    -
  • Added support for wildcards in class names. -
  • Added tool to de-obfuscate stack traces. -
  • Added options to print processing information to files. -
  • Added option to rename source file attributes. -
  • Fixed processing of implicitly used interfaces targeted at JRE1.2 (the - default in JDK1.4) -
  • Fixed processing of configurations with negated access modifiers. -
  • Fixed duplicate class entry bug. -
  • Updated documentation and examples. -
- -

Aug 2002
Version 1.2

-
    -
  • Improved speed. -
  • Fixed processing of classes targeted at JRE1.2 (the default in JDK1.4) - with references to their own subclasses. -
  • Fixed processing of static initializers in J2ME MIDP applications. -
  • Fixed processing of retrofitted interfaces (again). -
  • Added more flexible handling of white space in configuration. -
  • Updated documentation. -
- -

Jul 2002
Version 1.1

-
    -
  • Added automatic detection of Class.forName("MyClass"), - MyClass.class, and - (MyClass)Class.forName(variable).newInstance() constructs. - This greatly simplifies configuration. -
  • Added options to keep class names and class member names without affecting - any shrinking. They are mostly useful for native methods and serializable - classes. -
  • Fixed processing of retrofitted interfaces. -
  • Added handling of missing/invalid manifest file in input jar. -
  • Updated documentation and examples. -
- -

Jun 2002
Version 1.0

-
    -
  • First public release, based on class parsing code from Mark Welsh's - RetroGuard. -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/drop1.gif b/tools/proguard/proguard6.0.3/docs/drop1.gif deleted file mode 100644 index 426d8564..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/drop1.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/drop2.gif b/tools/proguard/proguard6.0.3/docs/drop2.gif deleted file mode 100644 index b6075421..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/drop2.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/drop3.gif b/tools/proguard/proguard6.0.3/docs/drop3.gif deleted file mode 100644 index 11ce424b..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/drop3.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/favicon.ico b/tools/proguard/proguard6.0.3/docs/favicon.ico deleted file mode 100644 index 3923ec14..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/favicon.ico and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/feedback.html b/tools/proguard/proguard6.0.3/docs/feedback.html deleted file mode 100644 index d8a753dc..00000000 --- a/tools/proguard/proguard6.0.3/docs/feedback.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - -ProGuard Feedback - - - - - - -

Feedback

- -By now, I've invested an enormous amount of time in ProGuard. You can -help by providing feedback! If you have problems, bugs, bug fixes, ideas, -encouragements, etc., please let me know: -

-

    -
  • At - GuardSquare, - we develop ProGuard and its professional siblings DexGuard (for Android) - and iXGuard (for iOS). If you find ProGuard useful and you would like to - have professional support, this is the place to go.
  • - -
  • The help forum (at SourceForge) - and Stack Overflow are common places to ask questions about - any problems you might have configuring and running ProGuard. At this - time, I can generally only assist other open source projects though. If - you're working on commercial software, please consider our professional - support above.
  • - -
  • The open discussion forum (at SourceForge) offers a place - to share your thoughts and discuss new ideas.
  • - -
  • The bug - tracking page (at SourceForge) allows you to submit and consult bug - reports. Please make sure the reports are complete and concise. If I can't - reproduce the problem, I most likely can't fix it either.
  • - -
  • The feature request page (at SourceForge) allows you to - submit and consult feature requests. I generally have my own road map in - mind, but this is the place express your interest in new and existing - ideas.
  • - -
  • The download section at SourceForge may offer the - possibility to subscribe to the announcements of new releases. They are - the most efficient way to stay abreast of the latest developments.
  • - -
  • For anything that doesn't fall in the above categories, you can mail me - directly at - - - -.
  • -
-

-I can't promise an answer, but it's always great to see constructive comments. -

- -ProGuard isn't a typical open source project, in the sense that I am -not looking for code contributions. Developing on my own allows me to -do things my way, without the overhead and compromises associated with larger -projects. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.eot b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.eot deleted file mode 100644 index e1c76744..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.eot and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.svg b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.svg deleted file mode 100644 index 364b3686..00000000 --- a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.svg +++ /dev/null @@ -1,146 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.ttf b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.ttf deleted file mode 100644 index 2d94f062..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.ttf and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.woff b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.woff deleted file mode 100644 index cd86852d..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Bold.woff and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.eot b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.eot deleted file mode 100644 index 277c1899..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.eot and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.svg b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.svg deleted file mode 100644 index 29c7497f..00000000 --- a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.svg +++ /dev/null @@ -1,146 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.ttf b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.ttf deleted file mode 100644 index 63f187e9..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.ttf and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.woff b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.woff deleted file mode 100644 index 469a29bb..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Italic.woff and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.eot b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.eot deleted file mode 100644 index dd6fd2cb..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.eot and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.svg b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.svg deleted file mode 100644 index 01038bb1..00000000 --- a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.svg +++ /dev/null @@ -1,146 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data copyright 20102011 Google Corporation -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.ttf b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.ttf deleted file mode 100644 index 05951e7b..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.ttf and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.woff b/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.woff deleted file mode 100644 index 274664b2..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/fonts/OpenSans-Regular.woff and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/guardsquare.png b/tools/proguard/proguard6.0.3/docs/guardsquare.png deleted file mode 100644 index 99ef62c7..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/guardsquare.png and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/index.html b/tools/proguard/proguard6.0.3/docs/index.html deleted file mode 100644 index 3336138b..00000000 --- a/tools/proguard/proguard6.0.3/docs/index.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - -ProGuard - - - - - - - - - - - - - - - - - - -<body> -<p class="intro"> -<b>ProGuard</b> is a free Java class file shrinker, optimizer, obfuscator, and -preverifier. It detects and removes unused classes, fields, methods, and -attributes. It optimizes bytecode and removes unused instructions. It renames -the remaining classes, fields, and methods using short meaningless names. -Finally, it preverifies the processed code for Java 6 or for Java Micro -Edition. -</p> -<p> -Your browser doesn't support frames, but that's cool. -<p> -You can go straight to the <a href="main.html">main page</a>. - -<hr /> -<address> -Copyright &copy; 2002-2018 -<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.guardsquare.com/">GuardSquare</a>. -</address> -</body> - - diff --git a/tools/proguard/proguard6.0.3/docs/license.html b/tools/proguard/proguard6.0.3/docs/license.html deleted file mode 100644 index 04b79958..00000000 --- a/tools/proguard/proguard6.0.3/docs/license.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - -ProGuard License - - - - - - -

License

- -ProGuard is free. You can use it freely for processing your -applications, commercial or not. Your code obviously remains yours after -having been processed, and its license can remain unchanged. -

- -The ProGuard code itself is copyrighted, but its distribution license -provides you with some rights for modifying and redistributing its code and -its documentation. More specifically, ProGuard is distributed under the terms -of the GNU General Public License (GPL), version 2, as -published by the Free Software -Foundation (FSF). In short, this means that you may freely redistribute -the program, modified or as is, on the condition that you make the complete -source code available as well. If you develop a program that is linked with -ProGuard, the program as a whole has to be distributed at no charge under the -GPL. I am granting a special exception to the -latter clause (in wording suggested by the -FSF), for combinations with the following stand-alone -applications: Gradle, Apache Ant, Apache Maven, the Google Android SDK, the -Eclipse ProGuardDT GUI, the EclipseME JME IDE, the Oracle NetBeans Java IDE, -the Oracle JME Wireless Toolkit, and the Simple Build Tool for Scala. - -

-The ProGuard user documentation is copyrighted as well. It may only be -redistributed without changes, along with the unmodified version of the code. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/main.html b/tools/proguard/proguard6.0.3/docs/main.html deleted file mode 100644 index 77764d29..00000000 --- a/tools/proguard/proguard6.0.3/docs/main.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - -ProGuard Main - - - - - - -

Main

- -

-ProGuard is a free Java class file shrinker, optimizer, obfuscator, and -preverifier. It detects and removes unused classes, fields, methods, and -attributes. It optimizes bytecode and removes unused instructions. It renames -the remaining classes, fields, and methods using short meaningless names. -The resulting applications and libraries are smaller, faster, and a bit better -hardened against reverse engineering. -

-Typical applications: -
    - -
  • Reducing the size of Android apps for faster downloads from Google Play, - shorter startup times, and smaller memory footprints.
  • - -
  • Optimizing code for better performance on mobile devices.
  • - -
  • Protecting applications and libraries against reverse-engineering and - tampering.
  • - -
-

-ProGuard's main advantage compared to other Java obfuscators is -probably its compact template-based configuration. A few intuitive command -line options or a simple configuration file are usually sufficient. -The user manual explains all available options and shows examples of this -powerful configuration style. -

-ProGuard is fast. It only takes seconds to process programs and -libraries of several megabytes. The results section presents actual figures -for a number of applications. -

-ProGuard is a command-line tool with an optional graphical user -interface. It also comes with plugins for Ant, for Gradle, and for the JME -Wireless Toolkit. It is already part of Google's Android SDK, where it can be -enabled with a simple flag. -

-

- - -ProGuard provides basic protection against reverse engineering and -tampering, with basic name obfuscation. -DexGuard, its specialized commercial extension for -Android, focuses further on the protection of apps, additionally optimizing, -obfuscating and encrypting strings, classes, resources, resource files, asset -files, and native libraries. Professional developers should definitely -consider it for security-sensitive apps. -

-The following sections provide more detailed information: -
    -
  • Main: this overview page.
  • -
  • Results: some results obtained with - ProGuard, including timings and memory usage.
  • -
  • FAQ: answers to some Frequently Asked Questions.
  • -
  • Manual: the complete ProGuard user - manual, with examples and troubleshooting tips.
  • -
  • Quality: a discussion of the (excellent) quality - of ProGuard's code.
  • -
  • Screenshots: some impressions of what ProGuard looks like.
  • -
  • Testimonials: what users think of - ProGuard.
  • -
  • License: ProGuard is free, under a GPL - license.
  • -
  • Downloads: download the ProGuard - package yourself.
  • -
  • Feedback: tell me about your experiences, or - learn from others on our forums.
  • -
  • Acknowledgements: people who have been - helpful.
  • -
  • Alternatives: other Java obfuscators, - optimizers, and shrinkers.
  • -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/android_small.png b/tools/proguard/proguard6.0.3/docs/manual/android_small.png deleted file mode 100644 index 0313515a..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/manual/android_small.png and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/manual/ant.html b/tools/proguard/proguard6.0.3/docs/manual/ant.html deleted file mode 100644 index 64ee3c1b..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/ant.html +++ /dev/null @@ -1,693 +0,0 @@ - - - - - - -Ant Task - - - - - - -

Ant Task

- -ProGuard can be run as a task in the Java-based build tool Ant (version -1.8 or higher). -

- -Before you can use the proguard task, you have to tell Ant about -this new task. The easiest way is to add the following line to your -build.xml file: -

- -

-<taskdef resource="proguard/ant/task.properties"
-         classpath="/usr/local/java/proguard/lib/proguard.jar" />
-
-

- -Please make sure the class path is set correctly for your system. -

- -There are three ways to configure the ProGuard task: -

    -
  1. using an external configuration file,
  2. -
  3. using embedded ProGuard configuration options, or
  4. -
  5. using the equivalent XML configuration tags.
  6. -
-These three ways can be combined, depending on practical circumstances and -personal preference. -

- -

1. An external ProGuard configuration file

- -The simplest way to use the ProGuard task in an Ant build file is to keep your -ProGuard configuration file, and include it from Ant. You can include your -ProGuard configuration file by setting -the configuration -attribute of your -proguard task. Your ant build file will then look like this: -

- -

-<taskdef resource="proguard/ant/task.properties"
-         classpath="/usr/local/java/proguard/lib/proguard.jar" />
-<proguard configuration="myconfigfile.pro"/>
-
-

- -This is a convenient option if you prefer ProGuard's configuration style over -XML, if you want to keep your build file small, or if you have to share your -configuration with developers who don't use Ant. -

- -

2. Embedded ProGuard configuration options

- -Instead of keeping an external ProGuard configuration file, you can also copy -the contents of the file into the nested text of the proguard task -(the PCDATA area). Your Ant build file will then look like this: -

- -

-<taskdef resource="proguard/ant/task.properties"
-         classpath="/usr/local/java/proguard/lib/proguard.jar" />
-<proguard>
-  -libraryjars ${java.home}/lib/rt.jar
-  -injars      in.jar
-  -outjars     out.jar
-
-  -keepclasseswithmembers public class * {
-      public static void main(java.lang.String[]);
-  }
-</proguard>
-
-

- -Some minor syntactical changes are required in order to conform with the XML -standard. -

- -Firstly, the # character cannot be used for comments in an XML -file. Comments must be enclosed by an opening <!-- and a -closing -->. All occurrences of the # character -can be removed. -

- -Secondly, the use of < and > characters would -upset the structure of the XML build file. Environment variables can be -specified with the usual Ant style ${...}, instead of the ProGuard -style <...>. Other occurrences of < and -> have to be encoded as &lt; and -&gt; respectively. -

- -

3. XML configuration tags

- -If you really prefer a full-blown XML configuration, you can replace the -ProGuard configuration options by XML configuration tags. The resulting -configuration will be equivalent, but much more verbose and difficult to read, -as XML goes. The remainder of this page presents the supported tags. For a -more extensive discussion of their meaning, please consult the traditional Usage section. You can find some sample configuration -files in the examples/ant directory of the ProGuard distribution. -

- -

Task Attributes and Nested Elements

- -The <proguard> task and the -<proguardconfiguration> task can have the following -attributes (only for <proguard>) and nested -elements: - -
- -
configuration - = "filename"
-
Read and merge options from the given ProGuard-style configuration - file. Note: for reading multiple configuration files or XML-style - configurations, use the configuration - element.
- -
skipnonpubliclibraryclasses - = "boolean" - (default = false)
-
Ignore non-public library classes.
- -
skipnonpubliclibraryclassmembers - = "boolean" - (default = true)
-
Ignore package visible library class members.
- -
target - = "version" - (default = none)
-
Set the given version number in the processed classes.
- -
forceprocessing - = "boolean" - (default = false)
-
Process the input, even if the output seems up to date.
- -
printseeds - = "boolean or filename" - (default = false)
-
List classes and class members matched by the various keep - commands, to the standard output or to the given file.
- -
shrink - = "boolean" - (default = true)
-
Shrink the input class files.
- -
printusage - = "boolean or filename" - (default = false)
-
List dead code of the input class files, to the standard output or to the - given file.
- -
optimize - = "boolean" - (default = true)
-
Optimize the input class files.
- -
optimizationpasses - = "n" - (default = 1)
-
The number of optimization passes to be performed.
- -
allowaccessmodification - = "boolean" - (default = false)
-
Allow the access modifiers of classes and class members to be modified, - while optimizing.
- -
mergeinterfacesaggressively - = "boolean" - (default = false)
-
Allow any interfaces to be merged, while optimizing.
- -
obfuscate - = "boolean" - (default = true)
-
Obfuscate the input class files.
- -
printmapping - = "boolean or filename" - (default = false)
-
Print the mapping from old names to new names for classes and class members - that have been renamed, to the standard output or to the given file.
- -
applymapping - = "filename" - (default = none)
-
Reuse the given mapping, for incremental obfuscation.
- -
obfuscationdictionary - = "filename" - (default = none)
-
Use the words in the given text file as obfuscated field names and method - names.
- -
classobfuscationdictionary - = "filename" - (default = none)
-
Use the words in the given text file as obfuscated class names.
- -
packageobfuscationdictionary - = "filename" - (default = none)
-
Use the words in the given text file as obfuscated package names.
- -
overloadaggressively - = "boolean" - (default = false)
-
Apply aggressive overloading while obfuscating.
- -
useuniqueclassmembernames - = "boolean" - (default = false)
-
Ensure uniform obfuscated class member names for subsequent incremental - obfuscation.
- -
usemixedcaseclassnames - = "boolean" - (default = true)
-
Generate mixed-case class names while obfuscating.
- -
flattenpackagehierarchy - = "package_name" - (default = none)
-
Repackage all packages that are renamed into the single given parent - package.
- -
repackageclasses - = "package_name" - (default = none)
-
Repackage all class files that are renamed into the single given - package.
- -
keepparameternames - = "boolean" - (default = false)
-
Keep the parameter names and types of methods that are kept.
- -
renamesourcefileattribute - = "string" - (default = none)
-
Put the given constant string in the SourceFile - attributes.
- -
preverify - = "boolean" - (default = true)
-
Preverify the processed class files if they are targeted at Java Micro - Edition or at Java 6 or higher.
- -
microedition - = "boolean" - (default = false)
-
Target the processed class files at Java Micro Edition.
- -
android - = "boolean" - (default = false)
-
Target the processed class files at Android.
- -
verbose - = "boolean" - (default = false)
-
Write out some more information during processing.
- -
note - = "boolean" - (default = true)
-
Print notes about potential mistakes or omissions in the configuration. - Use the nested element dontnote for more - fine-grained control.
- -
warn - = "boolean" - (default = true)
-
Print warnings about unresolved references. Use the nested - element dontwarn for more fine-grained - control. Only use this option if you know what you're doing!
- -
ignorewarnings - = "boolean" - (default = false)
-
Print warnings about unresolved references, but continue processing - anyhow. Only use this option if you know what you're doing!
- -
printconfiguration - = "boolean or filename" - (default = false)
-
Write out the entire configuration in traditional ProGuard style, to the - standard output or to the given file. Useful to replace unreadable - XML configurations.
- -
dump - = "boolean or filename" - (default = false)
-
Write out the internal structure of the processed class files, to the - standard output or to the given file.
- -
<injar - class_path - />
-
Specifies the program jars (or aars, wars, ears, zips, apks, or - directories).
- -
<outjar - class_path - />
-
Specifies the names of the output jars (or aars, wars, ears, zips, apks, or - directories).
- -
<libraryjar - class_path - />
-
Specifies the library jars (or aars, wars, ears, zips, apks, or - directories).
- -
<keepdirectory name = "directory_name" - />
- <keepdirectories filter = "directory_filter" - />
-
Keep the specified directories in the output jars (or aars, wars, ears, - zips, apks, or directories).
- -
<keep - modifiers - class_specification - > - class_member_specifications - </keep>
-
Preserve the specified classes and class members.
- -
<keepclassmembers - modifiers - class_specification - > - class_member_specifications - </keepclassmembers>
-
Preserve the specified class members, if their classes are preserved as - well.
- -
<keepclasseswithmembers - modifiers - class_specification - > - class_member_specifications - </keepclasseswithmembers>
-
Preserve the specified classes and class members, if all of the - specified class members are present.
- -
<keepnames - class_specification - > - class_member_specifications - </keepnames>
-
Preserve the names of the specified classes and class members (if - they aren't removed in the shrinking step).
- -
<keepclassmembernames - class_specification - > - class_member_specifications - </keepclassmembernames>
-
Preserve the names of the specified class members (if they aren't removed - in the shrinking step).
- -
<keepclasseswithmembernames - class_specification - > - class_member_specifications - </keepclasseswithmembernames>
-
Preserve the names of the specified classes and class members, if - all of the specified class members are present (after the shrinking - step).
- -
<whyareyoukeeping - class_specification - > - class_member_specifications - </whyareyoukeeping>
-
Print details on why the given classes and class members are being kept in - the shrinking step.
- -
<assumenosideeffects - class_specification - > - class_member_specifications - </assumenosideeffects>
-
Assume that the specified methods don't have any side effects, while - optimizing. Only use this option if you know what you're - doing!
- -
<assumenoexternalsideeffects - class_specification - > - class_member_specifications - </assumenoexternalsideeffects>
-
Assume that the specified methods don't have any external side effects, - while optimizing. Only use this option if you know what you're - doing!
- -
<assumenoescapingparameters - class_specification - > - class_member_specifications - <assumenoescapingparameters>
-
Assume that the specified methods don't let any reference parameters - escape to the heap, while optimizing. Only use this option if you know - what you're doing!
- -
<assumenoexternalreturnvalues - class_specification - > - class_member_specifications - <assumenoexternalreturnvalues>
-
Assume that the specified methods don't return any external reference - values, while optimizing. Only use this option if you know what you're - doing!
- -
<optimization name = "optimization_name" - />
- <optimizations filter = ""optimization_filter" - />
-
Perform only the specified optimizations.
- -
<keeppackagename name = "package_name" - />
- <keeppackagenames filter = "package_filter" - />
-
Keep the specified package names from being obfuscated. If no name is - given, all package names are preserved.
- -
<keepattribute name = "attribute_name" - />
- <keepattributes filter = "attribute_filter" - />
-
Preserve the specified optional Java bytecode attributes, with optional - wildcards. If no name is given, all attributes are preserved.
- -
<adaptclassstrings filter = "class_filter" - />
-
Adapt string constants in the specified classes, based on the obfuscated - names of any corresponding classes.
- -
<adaptresourcefilenames filter = "file_filter" - />
-
Rename the specified resource files, based on the obfuscated names of the - corresponding class files.
- -
<adaptresourcefilecontents filter = "file_filter" - />
-
Update the contents of the specified resource files, based on the - obfuscated names of the processed classes.
- -
- <dontnote filter = "class_filter" - />
-
Don't print notes about classes matching the specified class name - filter.
- -
- <dontwarn filter = "class_filter" - />
-
Don't print warnings about classes matching the specified class name - filter. Only use this option if you know what you're doing!
- -
<configuration refid = "ref_id" - />
- <configuration file = "name" - />
-
The first form includes the XML-style configuration specified in a - <proguardconfiguration> task (or - <proguard> task) with attribute id = - "ref_id". Only the nested elements of this configuration are - considered, not the attributes. -

- The second form includes the ProGuard-style configuration from the specified - file. The element is actually a fileset element and supports - all of its attributes and nested elements, including multiple files. -

- -
- -

Class Path Attributes and Nested Elements

- -The jar elements are path elements, so they can have any of the -standard path attributes and nested elements. The most common -attributes are: - -
- -
path = "path"
-
The names of the jars (or aars, wars, ears, zips, apks, or directories), - separated by the path separator.
- -
location = "name" (or file - = "name", or dir = "name", or - name = "name")
-
Alternatively, the name of a single jar (or aar, war, ear, zip, or - directory).
- -
refid = "ref_id"
-
Alternatively, a reference to the path or file set with the attribute - id = "ref_id".
- -
- -In addition, the jar elements can have ProGuard-style filter attributes: - -
- -
filter = - "file_filter"
-
An optional filter for all class file names and resource file names that - are encountered.
- -
apkfilter = - "file_filter"
-
An optional filter for all apk names that are encountered.
- -
jarfilter = - "file_filter"
-
An optional filter for all jar names that are encountered.
- -
aarfilter = - "file_filter"
-
An optional filter for all aar names that are encountered.
- -
warfilter = - "file_filter"
-
An optional filter for all war names that are encountered.
- -
earfilter = - "file_filter"
-
An optional filter for all ear names that are encountered.
- -
zipfilter = - "file_filter"
-
An optional filter for all zip names that are encountered.
- -
- -

Keep Modifier Attributes

- -The keep tags can have the following modifier attributes: - -
- -
includedescriptorclasses - = "boolean" - (default = false)
-
Specifies whether the classes of the fields and methods specified in the - keep tag must be kept as well.
- -
allowshrinking - = "boolean" - (default = false)
-
Specifies whether the entry points specified in the keep tag may be - shrunk.
- -
allowoptimization - = "boolean" - (default = false)
-
Specifies whether the entry points specified in the keep tag may be - optimized.
- -
allowobfuscation - = "boolean" - (default = false)
-
Specifies whether the entry points specified in the keep tag may be - obfuscated.
- -
- -

Class Specification Attributes and Nested Elements

- -The keep tags can have the following class_specification attributes and -class_member_specifications nested elements: - -
- -
access = "access_modifiers"
-
The optional access modifiers of the class. Any space-separated list of - "public", "final", and "abstract", with optional negators "!".
- -
annotation = "annotation_name"
-
The optional fully qualified name of an annotation of the class, with - optional wildcards.
- -
type = "type"
-
The optional type of the class: one of "class", "interface", or - "!interface".
- -
name = "class_name"
-
The optional fully qualified name of the class, with optional - wildcards.
- -
extendsannotation = "annotation_name"
-
The optional fully qualified name of an annotation of the the class that - the specified classes must extend, with optional wildcards.
- -
extends = "class_name"
-
The optional fully qualified name of the class the specified classes - must extend, with optional wildcards.
- -
implements = "class_name"
-
The optional fully qualified name of the class the specified classes - must implement, with optional wildcards.
- -
<field - class_member_specification - />
-
Specifies a field.
- -
<method - class_member_specification - />
-
Specifies a method.
- -
<constructor - class_member_specification - />
-
Specifies a constructor.
- -
- -

Class Member Specification Attributes

- -The class member tags can have the following class_member_specification -attributes: - -
- -
access = "access_modifiers"
-
The optional access modifiers of the class. Any space-separated list of - "public", "protected", "private", "static", etc., with optional negators - "!".
- -
annotation = "annotation_name"
-
The optional fully qualified name of an annotation of the class member, - with optional wildcards.
- -
type = "type"
-
The optional fully qualified type of the class member, with optional - wildcards. Not applicable for constructors, but required for methods for - which the parameters attribute is specified.
- -
name = "name"
-
The optional name of the class member, with optional wildcards. Not - applicable for constructors.
- -
parameters = "parameters"
-
The optional comma-separated list of fully qualified method parameters, - with optional wildcards. Not applicable for fields, but required for - constructors, and for methods for which the type attribute is - specified.
- -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/attention.gif b/tools/proguard/proguard6.0.3/docs/manual/attention.gif deleted file mode 100644 index 1a0c712d..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/manual/attention.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/manual/attributes.html b/tools/proguard/proguard6.0.3/docs/manual/attributes.html deleted file mode 100644 index 49f7954b..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/attributes.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - -Attributes - - - - - - -

Attributes

- -Class files essentially define classes, their fields, and their methods. A lot -of essential and non-essential data are attached to these classes, fields, and -methods as attributes. For instance, attributes can contain bytecode, -source file names, line number tables, etc. -

- -ProGuard's obfuscation step removes attributes that are generally not -necessary for executing the code. With -the -keepattributes -option, you can specify a filter for attributes that you do want to keep, for -instance, if your code accesses them through reflection or if you want to -preserve some compilation or debugging information. The filter works like -any filter in ProGuard. -

- -The following wildcards are supported: - - - - - - -
?matches any single character in an attribute name.
*matches any part of an attribute name.
- -An attribute name that is preceded by an exclamation mark '!' is -excluded from further attempts to match with subsequent -attribute names in the filter. Make sure to specify filters correctly, since -they are not checked for potential typos. -

- -For example, the following setting preserves the optional attributes that are -typically necessary when processing code that is intended to be used as a -library: -

--keepattributes Exceptions,InnerClasses,Signature,Deprecated,
-                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-
-

- -The Java bytecode specifications currently specify the following list of -attributes. - -

Optional attributes

- -ProGuard's obfuscation step by default discards the following optional -attributes. You can keep them with -the -keepattributes -option. - -
-
SourceFile
-
Specifies the name of the source file from which the class file was - compiled. If present, this name is reported in stack traces.
- -
(J++ extension)
- SourceDir
-
Specifies the name of the source directory from which the class file was - compiled.
- -
InnerClasses
-
Specifies the relationship between a class and its inner classes and outer - classes. Other than this and the naming convention with a '$' separator - between the names of inner classes and outer classes, inner classes are - just like ordinary classes. Compilers may need this information to find - classes referenced in a compiled library. Code may access this information - by reflection, for instance to derive the simple name of the class.
- -
(Java 5 or higher)
- EnclosingMethod
-
Specifies the method in which the class was defined. Compilers may need - this information to find classes referenced in a compiled library. Code - may access this information by reflection, for instance to derive the - simple name of the class.
- -
Deprecated
-
Indicates that the class, field, or method is deprecated.
- -
Synthetic
-
Indicates that the class, field, or method was generated by the - compiler.
- -
(Java 5 or higher)
- Signature
-
Specifies the generic signature of the class, field, or method. Compilers - may need this information to properly compile classes that use generic - types from compiled libraries. Code may access this signature by - reflection.
- -
(Java 8 or higher)
- MethodParameters
-
Specifies the names and access flags of the parameters of the method. Code - may access this information by reflection.
- -
Exceptions
-
Specifies the exceptions that a method may throw. Compilers may use this - information to enforce catching them.
- -
LineNumberTable
-
Specifies the line numbers of the method. If present, these line numbers - are reported in stack traces.
- -
LocalVariableTable
-
Specifies the names and types of local variables of the method. If present, - some IDEs may use this information for helping with auto-completion.
- -
(Java 5 or higher)
- LocalVariableTypeTable
-
Specifies the names and generic types of local variables of the method. If - present, some IDEs may use this information for helping with - auto-completion.
- -
(Java 5 or higher)
- RuntimeVisibleAnnotations
-
Specifies the annotations that are visible at run-time, for classes, - fields, and methods. Compilers and annotation processors may use these - annotations. Code may access them by reflection.
- -
(Java 5 or higher)
- RuntimeInvisibleAnnotations
-
Specifies the annotations that are visible at compile-time, for classes, - fields, and methods. Compilers and annotation processors may use these - annotations.
- -
(Java 5 or higher)
- RuntimeVisibleParameterAnnotations
-
Specifies the annotations that are visible at run-time, for method - parameters. Compilers and annotation processors may use these - annotations. Code may access them by reflection.
- -
(Java 5 or higher)
- RuntimeInvisibleParameterAnnotations
-
Specifies the annotations that are visible at compile-time, for method - parameters. Compilers and annotation processors may use these - annotations.
- -
(Java 8 or higher)
- RuntimeVisibleTypeAnnotations
-
Specifies the annotations that are visible at run-time, for generic types, - instructions, etc. Compilers and annotation processors may use these - annotations. Code may access them by reflection.
- -
(Java 8 or higher)
- RuntimeInvisibleTypeAnnotations
-
Specifies the annotations that are visible at compile-time, for generic - types, instructions, etc. Compilers and annotation processors may use - these annotations.
- -
(Java 5 or higher)
- AnnotationDefault
-
Specifies a default value for an annotation.
- -
-

- -

Essential attributes

- -ProGuard automatically keeps the following essential attributes, processing -them as necessary. We're listing them for the sake of completeness. - -
-
ConstantValue
-
Specifies a constant integer, float, class, string, etc.
- -
Code
-
Specifies the actual bytecode of a method.
- -
(Java Micro Edition)
- StackMap
-
Provides preverification information. The Java Virtual Machine can use - this information to speed up the verification step when loading a - class.
- -
(Java 6 or higher)
- StackMapTable
-
Provides preverification information. The Java Virtual Machine can use - this information to speed up the verification step when loading a - class.
- -
(Java 7 or higher)
- BootstrapMethods
-
Specifies the methods to bootstrap dynamic method invocations.
- -
-

- -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/examples.html b/tools/proguard/proguard6.0.3/docs/manual/examples.html deleted file mode 100644 index 370b8477..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/examples.html +++ /dev/null @@ -1,1776 +0,0 @@ - - - - - - -ProGuard Examples - - - - - - -

Examples

- -Some typical useful configurations: -
    -
  1. A typical application
  2. -
  3. A typical applet
  4. -
  5. A typical midlet
  6. -
  7. A typical Java Card applet
  8. -
  9. A typical xlet
  10. -
  11. A simple Android activity
  12. -
  13. A complete Android application
  14. -
  15. A typical library
  16. -
  17. All possible applications in the input jars
  18. -
  19. All possible applets in the input jars
  20. -
  21. All possible midlets in the input jars
  22. -
  23. All possible Java Card applets in the input jars
  24. -
  25. All possible xlets in the input jars
  26. -
  27. All possible servlets in the input jars
  28. -
  29. Scala applications with the Scala runtime
  30. -
  31. Processing native methods
  32. -
  33. Processing callback methods
  34. -
  35. Processing enumeration classes
  36. -
  37. Processing serializable classes
  38. -
  39. Processing serialization with the GSON library
  40. -
  41. Processing bean classes
  42. -
  43. Processing annotations
  44. -
  45. Processing database drivers
  46. -
  47. Processing ComponentUI classes
  48. -
  49. Processing RMI code
  50. -
  51. Processing dependency injection
  52. -
  53. Processing Dagger code
  54. -
  55. Processing Butterknife code
  56. -
  57. Processing resource files
  58. -
  59. Processing manifest files
  60. -
  61. Producing useful obfuscated stack traces
  62. -
  63. Obfuscating package names
  64. -
  65. Removing logging code
  66. -
  67. Restructuring the output archives
  68. -
  69. Filtering the input and the output
  70. -
  71. Processing multiple applications at once
  72. -
  73. Incremental obfuscation
  74. -
  75. Preverifying class files for Java Micro Edition
  76. -
  77. Upgrading class files to Java 6
  78. -
  79. Finding dead code
  80. -
  81. Printing out the internal structure of class files
  82. -
  83. Using annotations to configure ProGuard
  84. -
- -You can find some sample configuration files in the examples -directory of the ProGuard distribution. - -

A typical application

- -To shrink, optimize, and obfuscate a simple Java application, you typically -create a configuration file like myconfig.pro, which can be used -with -
-bin/proguard @myconfig.pro
-
-

-The configuration file specifies the input, the output, and the entry points -of the application: -

--injars       myapplication.jar
--outjars      myapplication_out.jar
--libraryjars  <java.home>/lib/rt.jar
--printmapping myapplication.map
-
--keep public class com.example.MyMain {
-    public static void main(java.lang.String[]);
-}
-
-

-Note the use of the <java.home> system property. ProGuard -automatically replaces it when parsing the file. -

-The -keep option specifies the -entry point of the application that has to be preserved. -The access modifiers public and static are not -really required in this case, since we know a priori that the specified class -and method have the proper access flags. It just looks more familiar this way. -

-Note that all type names are fully specified: -com.example.MyMain and java.lang.String[]. -

-We're writing out an obfuscation mapping file with -printmapping, for -de-obfuscating any stack traces later on, or for incremental obfuscation of -extensions. -

-We can further improve the results with a few additional options: -

--optimizationpasses 3
--overloadaggressively
--repackageclasses ''
--allowaccessmodification
-
-These options are not required; they just shave off some extra bytes from the -output jar, by performing up to 3 optimization passes, and by aggressively -obfuscating class members and package names. -

-In general, you might need a few additional options for processing native methods, callback methods, -enumerations, serializable -classes, bean classes, annotations, and resource -files. - -

A typical applet

- -These options shrink, optimize, and obfuscate the applet -com.example.MyApplet: -
--injars      in.jar
--outjars     out.jar
--libraryjars <java.home>/lib/rt.jar
-
--keep public class com.example.MyApplet
-
-

-The typical applet methods will be preserved automatically, since -com.example.MyApplet is an extension of the Applet -class in the library rt.jar. -

-If applicable, you should add options for processing native -methods, callback methods, enumerations, serializable -classes, bean classes, annotations, and resource -files. - -

A typical midlet

- -These options shrink, optimize, obfuscate, and preverify the midlet -com.example.MyMIDlet: -
--injars      in.jar
--outjars     out.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar
--overloadaggressively
--repackageclasses ''
--allowaccessmodification
--microedition
-
--keep public class com.example.MyMIDlet
-
-

-Note how we're now targeting the Java Micro Edition run-time environment of -midpapi20.jar and cldcapi11.jar, instead of the Java -Standard Edition run-time environment rt.jar. You can target -other JME environments by picking the appropriate jars. -

-The typical midlet methods will be preserved automatically, since -com.example.MyMIDlet is an extension of the MIDlet -class in the library midpapi20.jar. -

-The -microedition option -makes sure the class files are preverified for Java Micro Edition, producing -compact StackMap attributes. It is no longer necessary to run an -external preverifier. -

-Be careful if you do use the external preverify tool on a platform -with a case-insensitive filing system, such as Windows. Because this tool -unpacks your processed jars, you should then use ProGuard's -dontusemixedcaseclassnames -option. -

-If applicable, you should add options for processing native -methods and resource files. -

-Note that you will still have to adapt the midlet jar size in the -corresponding jad file; ProGuard doesn't do that for you. - -

A typical Java Card applet

- -These options shrink, optimize, and obfuscate the Java Card applet -com.example.MyApplet: -
--injars      in.jar
--outjars     out.jar
--libraryjars /usr/local/java/javacard2.2.2/lib/api.jar
--dontwarn    java.lang.Class
--overloadaggressively
--repackageclasses ''
--allowaccessmodification
-
--keep public class com.example.MyApplet
-
-

-The configuration is very similar to the configuration for midlets, except that -it now targets the Java Card run-time environment. This environment doesn't -have java.lang.Class, so we're telling ProGuard not to worry about it. - -

A typical xlet

- -These options shrink, optimize, and obfuscate the xlet -com.example.MyXlet: -
--injars      in.jar
--outjars     out.jar
--libraryjars /usr/local/java/jtv1.1/javatv.jar
--libraryjars /usr/local/java/cdc1.1/lib/cdc.jar
--libraryjars /usr/local/java/cdc1.1/lib/btclasses.zip
--overloadaggressively
--repackageclasses ''
--allowaccessmodification
-
--keep public class com.example.MyXlet
-
-

-The configuration is very similar to the configuration for midlets, except that -it now targets the CDC run-time environment with the Java TV API. - -

A simple Android activity

- -These options shrink, optimize, and obfuscate the single Android -activity com.example.MyActivity: -
--injars      bin/classes
--outjars     bin/classes-processed.jar
--libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
-
--android
--dontpreverify
--repackageclasses ''
--allowaccessmodification
--optimizations !code/simplification/arithmetic
-
--keep public class com.example.MyActivity
-
-

-We're targeting the Android run-time and keeping the activity as an entry -point. -

-Preverification is irrelevant for the dex compiler and the Dalvik VM, so we -can switch it off with the --dontpreverify option. -

-The -optimizations option -disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. -Note that the Dalvik VM also can't -handle aggressive overloading -(of static fields). -

-If applicable, you should add options for processing native -methods, callback methods, -enumerations, -annotations, and -resource files. - -

A complete Android application

- -attention The standard build processes of the Android SDK (with Ant, Gradle, Android -Studio, and Eclipse) already integrate ProGuard with all the proper settings. -You only need to enable ProGuard by uncommenting the line -"proguard.config=....." in the -file project.properties (created or updated by Android SDK -revision 17 or higher) or by adapting your build.gradle file. You -then don't need any of the configuration below. -

-Notes: -

    -
  • In case of problems, you may want to check if the configuration files that - are listed on this line (proguard-project.txt,...) contain - the necessary settings for your application.
  • -
  • Android SDK revision 20 and higher have a different configuration file for - enabling optimization: - ${sdk.dir}/tools/proguard/proguard-android-optimize.txt - instead of the default - ${sdk.dir}/tools/proguard/proguard-android.txt.
  • -
  • The build processes are already setting the necessary program jars, - library jars, and output jars for you — don't specify them again.
  • -
  • If you get warnings about missing referenced classes: it's all too common - that libraries refer to missing classes. - See "Warning: can't find - referenced class" in the Troubleshooting section.
  • -
-

-For more information, you can consult the official Developer -Guide in the Android SDK. -

-If you're constructing a build process from scratch: these options -shrink, optimize, and obfuscate all public activities, services, broadcast -receivers, and content providers from the compiled classes and external -libraries: -

--injars      bin/classes
--injars      libs
--outjars     bin/classes-processed.jar
--libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
-
--android
--dontpreverify
--repackageclasses ''
--allowaccessmodification
--optimizations !code/simplification/arithmetic
--keepattributes *Annotation*
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
-
--keep public class * extends android.view.View {
-    public <init>(android.content.Context);
-    public <init>(android.content.Context, android.util.AttributeSet);
-    public <init>(android.content.Context, android.util.AttributeSet, int);
-    public void set*(...);
-}
-
--keepclasseswithmembers class * {
-    public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keepclasseswithmembers class * {
-    public <init>(android.content.Context, android.util.AttributeSet, int);
-}
-
--keepclassmembers class * extends android.content.Context {
-   public void *(android.view.View);
-   public void *(android.view.MenuItem);
-}
-
--keepclassmembers class * implements android.os.Parcelable {
-    static ** CREATOR;
-}
-
--keepclassmembers class **.R$* {
-    public static <fields>;
-}
-
--keepclassmembers class * {
-    @android.webkit.JavascriptInterface <methods>;
-}
-
-

-Most importantly, we're keeping all fundamental classes that may be referenced -by the AndroidManifest.xml file of the application. If your -manifest file contains other classes and methods, you may have to specify -those as well. -

-We're keeping annotations, since they might be used by custom -RemoteViews. -

-We're keeping any custom View extensions and other classes with -typical constructors, since they might be referenced from XML layout files. -

-We're also keeping possible onClick handlers in -custom Context extensions, since they might be referenced from -XML layout files. -

-We're also keeping the required static fields in Parcelable -implementations, since they are accessed by introspection. -

-We're keeping the static fields of referenced inner classes of auto-generated - R classes, just in case your code is accessing those fields by -introspection. Note that the compiler already inlines primitive fields, so -ProGuard can generally remove all these classes entirely anyway (because the -classes are not referenced and therefore not required). -

-Finally, we're keeping annotated Javascript interface methods, so they can be -exported and accessed by their original names. Javascript interface methods -that are not annotated (in code targeted at Android versions older than 4.2) -still need to be preserved manually. -

-If you're using additional Google APIs, you'll have to specify -those as well, for instance: -

--libraryjars /usr/local/java/android-sdk/extras/android/support/v4/android-support-v4.jar
--libraryjars /usr/local/java/android-sdk/add-ons/addon-google_apis-google-21/libs/maps.jar
-
-

-If you're using Google's optional License Verification Library, you can -obfuscate its code along with your own code. You do have to preserve -its ILicensingService interface for the library to work: -

--keep public interface com.android.vending.licensing.ILicensingService
-
-

-If you're using the Android Compatibility library, you should add the -following line, to let ProGuard know it's ok that the library references some -classes that are not available in all versions of the API: -

--dontwarn android.support.**
-
-

-If applicable, you should add options for processing native -methods, callback methods, -enumerations, -and resource files. You may also want to add -options for producing useful stack traces and -to remove logging. You can find a complete sample -configuration in examples/android.pro in the ProGuard -distribution. - -

A typical library

- -These options shrink, optimize, and obfuscate an entire library, keeping all -public and protected classes and class members, native method names, and -serialization code. The processed version of the library can then still be -used as such, for developing code based on its public API. -
--injars       in.jar
--outjars      out.jar
--libraryjars  <java.home>/lib/rt.jar
--printmapping out.map
-
--keepparameternames
--renamesourcefileattribute SourceFile
--keepattributes Exceptions,InnerClasses,Signature,Deprecated,
-                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-
--keep public class * {
-    public protected *;
-}
-
--keepclassmembernames class * {
-    java.lang.Class class$(java.lang.String);
-    java.lang.Class class$(java.lang.String, boolean);
-}
-
--keepclasseswithmembernames,includedescriptorclasses class * {
-    native <methods>;
-}
-
--keepclassmembers,allowoptimization enum * {
-    public static **[] values();
-    public static ** valueOf(java.lang.String);
-}
-
--keepclassmembers class * implements java.io.Serializable {
-    static final long serialVersionUID;
-    private static final java.io.ObjectStreamField[] serialPersistentFields;
-    private void writeObject(java.io.ObjectOutputStream);
-    private void readObject(java.io.ObjectInputStream);
-    java.lang.Object writeReplace();
-    java.lang.Object readResolve();
-}
-
-

-This configuration should preserve everything we'll ever want to access in the -library. Only if there are any other non-public classes or methods that are -invoked dynamically, they should be specified using additional -keep options. -

-The -keepclassmembernames -option for the class$ methods is not strictly necessary. These -methods are inserted by the javac compiler and the -jikes compiler respectively, in JDK 1.2 and older, to implement -the .class construct. ProGuard will automatically detect them and -deal with them, even when their names have been obfuscated. However, other -obfuscators may rely on the original method names. It may therefore be helpful -to preserve them, in case these other obfuscators are ever used for further -obfuscation of the library. -

-The "Exceptions" attribute has to be preserved, so the compiler knows which -exceptions methods may throw. -

-The "InnerClasses" attribute (or more precisely, its source name part) has to -be preserved too, for any inner classes that can be referenced from outside the -library. The javac compiler would be unable to find the inner -classes otherwise. -

-The "Signature" attribute is required to be able to access generic types when -compiling in JDK 5.0 and higher. -

-The -keepparameternames -option keeps the parameter names in the "LocalVariableTable" and -"LocalVariableTypeTable" attributes of public library methods. Some IDEs can -present these names to the developers who use the library. -

-Finally, we're keeping the "Deprecated" attribute and the attributes for -producing useful stack traces. -

-We've also added some options for for processing native -methods, enumerations, serializable classes, and annotations, which are all discussed in their -respective examples. - -

All possible applications in the input jars

- -These options shrink, optimize, and obfuscate all public applications in -in.jar: -
--injars      in.jar
--outjars     out.jar
--libraryjars <java.home>/lib/rt.jar
--printseeds
-
--keepclasseswithmembers public class * {
-    public static void main(java.lang.String[]);
-}
-
-

-Note the use of -keepclasseswithmembers. -We don't want to preserve all classes, just all classes that have main -methods, and those methods. -

-The -printseeds option prints -out which classes exactly will be preserved, so we know for sure we're getting -what we want. -

-If applicable, you should add options for processing native -methods, callback methods, enumerations, serializable -classes, bean classes, annotations, and resource -files. - -

All possible applets in the input jars

- -These options shrink, optimize, and obfuscate all public applets in -in.jar: -
--injars      in.jar
--outjars     out.jar
--libraryjars <java.home>/lib/rt.jar
--printseeds
-
--keep public class * extends java.applet.Applet
-
-

-We're simply keeping all classes that extend the Applet class. -

-Again, the -printseeds option -prints out which applets exactly will be preserved. -

-If applicable, you should add options for processing native -methods, callback methods, enumerations, serializable -classes, bean classes, annotations, and resource -files. - -

All possible midlets in the input jars

- -These options shrink, optimize, obfuscate, and preverify all public midlets in -in.jar: -
--injars      in.jar
--outjars     out.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar
--overloadaggressively
--repackageclasses ''
--allowaccessmodification
--microedition
--printseeds
-
--keep public class * extends javax.microedition.midlet.MIDlet
-
-

-We're simply keeping all classes that extend the MIDlet class. -

-The -microedition option -makes sure the class files are preverified for Java Micro Edition, producing -compact StackMap attributes. It is no longer necessary to run an -external preverifier. -

-Be careful if you do use the external preverify tool on a platform -with a case-insensitive filing system, such as Windows. Because this tool -unpacks your processed jars, you should then use ProGuard's -dontusemixedcaseclassnames -option. -

-The -printseeds option prints -out which midlets exactly will be preserved. -

-If applicable, you should add options for processing native -methods and resource files. -

-Note that you will still have to adapt the midlet jar size in the -corresponding jad file; ProGuard doesn't do that for you. - -

All possible Java Card applets in the input jars

- -These options shrink, optimize, and obfuscate all public Java Card applets in -in.jar: -
--injars      in.jar
--outjars     out.jar
--libraryjars /usr/local/java/javacard2.2.2/lib/api.jar
--dontwarn    java.lang.Class
--overloadaggressively
--repackageclasses ''
--allowaccessmodification
--printseeds
-
--keep public class * implements javacard.framework.Applet
-
-

-We're simply keeping all classes that implement the Applet -interface. -

-The -printseeds option prints -out which applets exactly will be preserved. - -

All possible xlets in the input jars

- -These options shrink, optimize, and obfuscate all public xlets in -in.jar: -
--injars      in.jar
--outjars     out.jar
--libraryjars /usr/local/java/jtv1.1/javatv.jar
--libraryjars /usr/local/java/cdc1.1/lib/cdc.jar
--libraryjars /usr/local/java/cdc1.1/lib/btclasses.zip
--overloadaggressively
--repackageclasses ''
--allowaccessmodification
--printseeds
-
--keep public class * implements javax.tv.xlet.Xlet
-
-

-We're simply keeping all classes that implement the Xlet interface. -

-The -printseeds option prints -out which xlets exactly will be preserved. - -

All possible servlets in the input jars

- -These options shrink, optimize, and obfuscate all public servlets in -in.jar: -
--injars      in.jar
--outjars     out.jar
--libraryjars <java.home>/lib/rt.jar
--libraryjars /usr/local/java/servlet/servlet.jar
--printseeds
-
--keep public class * implements javax.servlet.Servlet
-
-

-Keeping all servlets is very similar to keeping all applets. The servlet API -is not part of the standard run-time jar, so we're specifying it as a library. -Don't forget to use the right path name. -

-We're then keeping all classes that implement the Servlet -interface. We're using the implements keyword because it looks -more familiar in this context, but it is equivalent to extends, -as far as ProGuard is concerned. -

-The -printseeds option prints -out which servlets exactly will be preserved. -

-If applicable, you should add options for processing native -methods, callback methods, enumerations, serializable -classes, bean classes, annotations, and resource -files. - -

Scala applications with the Scala runtime

- -These options shrink, optimize, and obfuscate all public Scala applications in -in.jar: -
--injars      in.jar
--injars      /usr/local/java/scala-2.9.1/lib/scala-library.jar
--outjars     out.jar
--libraryjars <java.home>/lib/rt.jar
-
--dontwarn scala.**
-
--keepclasseswithmembers public class * {
-    public static void main(java.lang.String[]);
-}
-
--keep class * implements org.xml.sax.EntityResolver
-
--keepclassmembers class * {
-    ** MODULE$;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
-    long eventCount;
-    int  workerCounts;
-    int  runControl;
-    scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
-    scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread {
-    int base;
-    int sp;
-    int runState;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask {
-    int status;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue {
-    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head;
-    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail;
-    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe;
-}
-
-

-The configuration is essentially the same as -for processing applications, because Scala is -compiled to ordinary Java bytecode. However, the example processes the Scala -runtime library as well. The processed jar can be an order of magnitude -smaller and a few times faster than the original code (for the Scala code -examples, for instance). -

-The -dontwarn option tells -ProGuard not to complain about some artefacts in the Scala runtime, the way it -is compiled by the scalac compiler (at least in Scala 2.9.1 and -older). Note that this option should always be used with care. -

-The additional -keep -options make sure that some classes and some fields that are accessed by means -of introspection are not removed or renamed. -

-If applicable, you should add options for processing native -methods, callback methods, enumerations, serializable -classes, bean classes, annotations, and resource -files. -

Processing native methods

- -If your application, applet, servlet, library, etc., contains native methods, -you'll want to preserve their names and their classes' names, so they can -still be linked to the native library. The following additional option will -ensure that: -
--keepclasseswithmembernames,includedescriptorclasses class * {
-    native <methods>;
-}
-
-

-Note the use of --keepclasseswithmembernames. -We don't want to preserve all classes or all native methods; we just want to -keep the relevant names from being obfuscated. The modifier -includedescriptorclasses -additionally makes sure that the return types and parameter types aren't -renamed either, so the entire signatures remain compatible with the native -libraries. -

-ProGuard doesn't look at your native code, so it won't automatically preserve -the classes or class members that are invoked by the native code. These are -entry points, which you'll have to specify explicitly. Callback methods are discussed below as a typical example. - -

Processing callback methods

- -If your application, applet, servlet, library, etc., contains callback -methods, which are called from external code (native code, scripts,...), -you'll want to preserve them, and probably their classes too. They are just -entry points to your code, much like, say, the main method of an application. -If they aren't preserved by other -keep options, something like -the following option will keep the callback class and method: -
--keep class com.example.MyCallbackClass {
-    void myCallbackMethod(java.lang.String);
-}
-
-

-This will preserve the given class and method from being removed or renamed. - -

Processing enumeration classes

- -If your application, applet, servlet, library, etc., contains enumeration -classes, you'll have to preserve some special methods. Enumerations were -introduced in Java 5. The java compiler translates enumerations into classes -with a special structure. Notably, the classes contain implementations of some -static methods that the run-time environment accesses by introspection (Isn't -that just grand? Introspection is the self-modifying code of a new -generation). You have to specify these explicitly, to make sure they aren't -removed or obfuscated: -
--keepclassmembers,allowoptimization enum * {
-    public static **[] values();
-    public static ** valueOf(java.lang.String);
-}
-
- -

Processing serializable classes

- -More complex applications, applets, servlets, libraries, etc., may contain -classes that are serialized. Depending on the way in which they are used, they -may require special attention: -
    - -
  • Often, serialization is simply a means of transporting data, without - long-term storage. Classes that are shrunk and obfuscated should then - continue to function fine with the following additional options: - -
    --keepclassmembers class * implements java.io.Serializable {
    -    private static final java.io.ObjectStreamField[] serialPersistentFields;
    -    private void writeObject(java.io.ObjectOutputStream);
    -    private void readObject(java.io.ObjectInputStream);
    -    java.lang.Object writeReplace();
    -    java.lang.Object readResolve();
    -}
    -
    -

    - - The -keepclassmembers - option makes sure that any serialization methods are kept. By using this - option instead of the basic -keep option, we're not - forcing preservation of all serializable classes, just preservation - of the listed members of classes that are actually used.

  • - -
  • Sometimes, the serialized data are stored, and read back later into newer - versions of the serializable classes. One then has to take care the classes - remain compatible with their unprocessed versions and with future - processed versions. In such cases, the relevant classes will most likely - have serialVersionUID fields. The following options should - then be sufficient to ensure compatibility over time: - -
    --keepnames class * implements java.io.Serializable
    -
    --keepclassmembers class * implements java.io.Serializable {
    -    static final long serialVersionUID;
    -    private static final java.io.ObjectStreamField[] serialPersistentFields;
    -    !static !transient <fields>;
    -    private void writeObject(java.io.ObjectOutputStream);
    -    private void readObject(java.io.ObjectInputStream);
    -    java.lang.Object writeReplace();
    -    java.lang.Object readResolve();
    -}
    -
    -

    - - The serialVersionUID and serialPersistentFields - lines makes sure those fields are preserved, if they are present. - The <fields> line preserves all non-static, - non-transient fields, with their original names. The introspection of the - serialization process and the de-serialization process will then find - consistent names.

  • - -
  • Occasionally, the serialized data have to remain compatible, but the - classes involved lack serialVersionUID fields. I imagine the - original code will then be hard to maintain, since the serial version UID - is then computed from a list of features the serializable class. Changing - the class ever so slightly may change the computed serial version UID. The - list of features is specified in the section on Stream - Unique Identifiers of Sun's Java - Object Serialization Specification. The following directives should at - least partially ensure compatibility with the original classes: - -
    --keepnames class * implements java.io.Serializable
    -
    --keepclassmembers class * implements java.io.Serializable {
    -    static final long serialVersionUID;
    -    private static final java.io.ObjectStreamField[] serialPersistentFields;
    -    !static !transient <fields>;
    -    !private <fields>;
    -    !private <methods>;
    -    private void writeObject(java.io.ObjectOutputStream);
    -    private void readObject(java.io.ObjectInputStream);
    -    java.lang.Object writeReplace();
    -    java.lang.Object readResolve();
    -}
    -
    -

    - - The new options force preservation of the elements involved in the UID - computation. In addition, the user will have to manually specify all - interfaces of the serializable classes (using something like "-keep - interface MyInterface"), since these names are also used when - computing the UID. A fast but sub-optimal alternative would be simply - keeping all interfaces with "-keep interface *".

  • - -
  • In the rare event that you are serializing lambda expressions in Java 8 or - higher, you need to preserve some methods and adapt the hard-coded names - of the classes in which they occur: - -
    --keepclassmembers class * {
    -    private static synthetic java.lang.Object $deserializeLambda$(java.lang.invoke.SerializedLambda);
    -}
    -
    --keepclassmembernames class * {
    -    private static synthetic *** lambda$*(...);
    -}
    -
    --adaptclassstrings com.example.Test
    -
    -

    - - This should satisfy the reflection in the deserialization code of the - Java run-time. - -

-

- -Note that the above options may preserve more classes and class members -than strictly necessary. For instance, a large number of classes may implement -the Serialization interface, yet only a small number may actually -ever be serialized. Knowing your application and tuning the configuration -often produces more compact results. - -

Processing serialization with the GSON library

- -Google's GSON library provides convenient serialization to and from the JSON -format. It relies on reflection on the fields of the classes that it -serializes. In order for this to work, you need to preserve the parameterless -constructor and the serialized fields from being removed, optimized, or -obfuscated. For example: -
--keepclassmembers class com.example.SerializedClass1,
-                        com.example.SerializedClass2 {
-    <fields>;
-    <init>();
-}
-
-

-While creating the configuration, you can specify the option --addconfigurationdebugging, -to get feedback on the necessary settings at run-time. -

-Alternatively, you can make sure the fields are explicitly annotated with -@SerializedName, so the names of the fields can be obfuscated. -You can then preserve all annotated fields with: -

--keepclassmembers,allowobfuscation class * {
-    @com.google.gson.annotations.SerializedName <fields>;
-}
-
--keep,allowobfuscation @interface com.google.gson.annotations.**
-
- -

Processing bean classes

- -If your application, applet, servlet, library, etc., makes extensive use of -introspection on bean classes to find bean editor classes, or getter and -setter methods, then configuration may become painful. There's not much else -you can do than making sure the bean class names, or the getter and setter -names don't change. For instance: -
--keep public class com.example.MyBean {
-    public void setMyProperty(int);
-    public int getMyProperty();
-}
-
--keep public class com.example.MyBeanEditor
-
-

-If there are too many elements to list explicitly, wildcards in class names -and method signatures might be helpful. This example preserves all possible -setters and getters in classes in the package mybeans: -

--keep class mybeans.** {
-    void set*(***);
-    void set*(int, ***);
-
-    boolean is*(); 
-    boolean is*(int);
-
-    *** get*();
-    *** get*(int);
-}
-
-

-The '***' wildcard matches any type (primitive or non-primitive, -array or non-array). The methods with the 'int' arguments matches -properties that are lists. - -

Processing annotations

- -If your application, applet, servlet, library, etc., uses annotations, you may -want to preserve them in the processed output. Annotations are represented by -attributes that have no direct effect on the execution of the code. However, -their values can be retrieved through introspection, allowing developers to -adapt the execution behavior accordingly. By default, ProGuard treats -annotation attributes as optional, and removes them in the obfuscation step. -If they are required, you'll have to specify this explicitly: -
--keepattributes *Annotation*
-
-

-For brevity, we're specifying a wildcarded attribute name, which will match -RuntimeVisibleAnnotations, -RuntimeInvisibleAnnotations, -RuntimeVisibleParameterAnnotations, -RuntimeInvisibleParameterAnnotations, and -AnnotationDefault. Depending on the purpose of the processed -code, you could refine this selection, for instance not keeping the run-time -invisible annotations (which are only used at compile-time). -

-Some code may make further use of introspection to figure out the enclosing -methods of anonymous inner classes. In that case, the corresponding attribute -has to be preserved as well: -

--keepattributes EnclosingMethod
-
- -

Processing database drivers

- -Database drivers are implementations of the Driver interface. -Since they are often created dynamically, you may want to preserve any -implementations that you are processing as entry points: -
--keep class * implements java.sql.Driver
-
-

-This option also gets rid of the note that ProGuard prints out about -(java.sql.Driver)Class.forName constructs, if you are -instantiating a driver in your code (without necessarily implementing any -drivers yourself). - -

Processing ComponentUI classes

- -Swing UI look and feels are implemented as extensions of the -ComponentUI class. For some reason, these have to contain a -static method createUI, which the Swing API invokes using -introspection. You should therefore always preserve the method as an entry -point, for instance like this: -
--keep class * extends javax.swing.plaf.ComponentUI {
-    public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
-}
-
-

-This option also keeps the classes themselves. - -

Processing RMI code

- -Reportedly, the easiest way to handle RMI code is to process the code with -ProGuard first and then invoke the rmic tool. If that is not -possible, you may want to try something like this: -
--keepattributes Exceptions
-
--keep interface * extends java.rmi.Remote {
-    <methods>;
-}
-
--keep class * implements java.rmi.Remote {
-    <init>(java.rmi.activation.ActivationID, java.rmi.MarshalledObject);
-}
-
-

-The first -keep option keeps all your Remote interfaces and their -methods. The second one keeps all the implementations, along with their -particular RMI constructors, if any. -

-The Exceptions attribute has to be kept too, because the RMI -handling code performs introspection to check whether the method signatures -are compatible. - -

Processing dependency injection

- -If your application is using JEE-style dependency injection, the application -container will automatically assign instances of resource classes to fields and -methods that are annotated with @Resource. The container applies -introspection, even accessing private class members directly. It typically -constructs a resource name based on the type name and the class member name. -We then have to avoid that such class members are removed or renamed: -
--keepclassmembers class * {
-    @javax.annotation.Resource *;
-}
-
-

-The Spring framework has another similar annotation @Autowired: -

--keepclassmembers class * {
-    @org.springframework.beans.factory.annotation.Autowired *;
-}
-
- -

Processing Dagger code

- -If your Android application includes Dagger for dependency injection, you need -a few lines of configuration, since Dagger heavily relies on reflection to tie -together the code at runtime. You need to preserve the annotated class -members, the generated classes, and a utility class: -
--keepclassmembers,allowobfuscation class * {
-    @dagger.** *;
-}
-
--keep class **$$ModuleAdapter
--keep class **$$InjectAdapter
--keep class **$$StaticInjection
-
--if   class **$$ModuleAdapter
--keep class <1>
-
--if   class **$$InjectAdapter
--keep class <1>
-
--if   class **$$StaticInjection
--keep class <1>
-
--keepnames class dagger.Lazy
-
-

-Dagger can then still combine the corresponding pairs of classes, based on -their names. -

-Dagger 2 no longer relies on reflection with these naming conventions. - -

Processing Butterknife code

- -If your Android application includes Butterknife to inject views, you also -need a few lines of configuration, since Butterknife relies on reflection to -tie together the code at runtime: -
--keep @interface butterknife.*
-
--keepclasseswithmembers class * {
-    @butterknife.* <fields>;
-}
-
--keepclasseswithmembers class * {
-    @butterknife.* <methods>;
-}
-
--keepclasseswithmembers class * {
-    @butterknife.On* <methods>;
-}
-
--keep class **$$ViewInjector {
-    public static void inject(...);
-    public static void reset(...);
-}
-
--keep class **$$ViewBinder {
-    public static void bind(...);
-    public static void unbind(...);
-}
-
--if   class **$$ViewBinder
--keep class <1>
-
--keep class **_ViewBinding {
-    <init>(<1>, android.view.View);
-}
-
--if   class **_ViewBinding
--keep class <1>
-
-

-These settings preserve the Butterknife annotations, the annotated fields and -methods, and the generated classes and methods that Butterknife accesses by -reflection. - -

Processing resource files

- -If your application, applet, servlet, library, etc., contains resource files, -it may be necessary to adapt their names and/or their contents when the -application is obfuscated. The following two options can achieve this -automatically: -
--adaptresourcefilenames    **.properties,**.gif,**.jpg
--adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-
-

-The -adaptresourcefilenames -option in this case renames properties files and image files in the processed -output, based on the obfuscated names of their corresponding class files (if -any). The -adaptresourcefilecontents -option looks for class names in properties files and in the manifest file, and -replaces these names by the obfuscated names (if any). You'll probably want to -adapt the filters to suit your application. - -

Processing manifest files

- -As illustrated in the previous section, manifest files can be treated like -ordinary resource files. ProGuard can adapt obfuscated class names in the -files, but it won't make any other changes. If you want anything else, you -should apply an external tool. For instance, if a manifest file contains -signing information, you should sign the jar again after it has been -processed. -

-If you're merging several input jars into a single output jar, you'll have to -pick one, typically by specifying filters: -

--injars  in1.jar
--injars  in2.jar(!META-INF/MANIFEST.MF)
--injars  in3.jar(!META-INF/MANIFEST.MF)
--outjars out.jar
-
-

-The filters will let ProGuard copy the manifest file from the first jar and -ignore any manifest files in the second and third input jars. Note that -ProGuard will leave the order of the files in the jars unchanged; manifest -files are not necessarily put first. - -

Producing useful obfuscated stack traces

- -These options let obfuscated applications or libraries produce stack traces -that can still be deciphered later on: -
--printmapping out.map
-
--renamesourcefileattribute SourceFile
--keepattributes SourceFile,LineNumberTable
-
-

-We're keeping all source file attributes, but we're replacing their values by -the string "SourceFile". We could use any string. This string is already -present in all class files, so it doesn't take up any extra space. If you're -working with J++, you'll want to keep the "SourceDir" attribute as well. -

-We're also keeping the line number tables of all methods. -

-Whenever both of these attributes are present, the Java run-time environment -will include line number information when printing out exception stack traces. -

-The information will only be useful if we can map the obfuscated names back to -their original names, so we're saving the mapping to a file -out.map. The information can then be used by the ReTrace tool to restore the original stack trace. - -

Obfuscating package names

- -Package names can be obfuscated in various ways, with increasing levels of -obfuscation and compactness. For example, consider the following classes: -
-mycompany.myapplication.MyMain
-mycompany.myapplication.Foo
-mycompany.myapplication.Bar
-mycompany.myapplication.extra.FirstExtra
-mycompany.myapplication.extra.SecondExtra
-mycompany.util.FirstUtil
-mycompany.util.SecondUtil
-
-

-Let's assume the class name mycompany.myapplication.MyMain is the -main application class that is kept by the configuration. All other class names -can be obfuscated. -

-By default, packages that contain classes that can't be renamed aren't renamed -either, and the package hierarchy is preserved. This results in obfuscated -class names like these: -

-mycompany.myapplication.MyMain
-mycompany.myapplication.a
-mycompany.myapplication.b
-mycompany.myapplication.a.a
-mycompany.myapplication.a.b
-mycompany.a.a
-mycompany.a.b
-
-

-The -flattenpackagehierarchy -option obfuscates the package names further, by flattening the package -hierarchy of obfuscated packages: -

--flattenpackagehierarchy 'myobfuscated'
-
-

-The obfuscated class names then look as follows: -

-mycompany.myapplication.MyMain
-mycompany.myapplication.a
-mycompany.myapplication.b
-myobfuscated.a.a
-myobfuscated.a.b
-myobfuscated.b.a
-myobfuscated.b.b
-
-

-Alternatively, the -repackageclasses option -obfuscates the entire packaging, by combining obfuscated classes into a single -package: -

--repackageclasses 'myobfuscated'
-
-The obfuscated class names then look as follows: -
-mycompany.myapplication.MyMain
-mycompany.myapplication.a
-mycompany.myapplication.b
-myobfuscated.a
-myobfuscated.b
-myobfuscated.c
-myobfuscated.d
-
-

-Additionally specifying the -allowaccessmodification -option allows access permissions of classes and class members to -be broadened, opening up the opportunity to repackage all obfuscated classes: -

--repackageclasses 'myobfuscated'
--allowaccessmodification
-
-The obfuscated class names then look as follows: -
-mycompany.myapplication.MyMain
-myobfuscated.a
-myobfuscated.b
-myobfuscated.c
-myobfuscated.d
-myobfuscated.e
-myobfuscated.f
-
-

-The specified target package can always be the root package. For instance: -

--repackageclasses ''
--allowaccessmodification
-
-The obfuscated class names are then the shortest possible names: -
-mycompany.myapplication.MyMain
-a
-b
-c
-d
-e
-f
-
-

-Note that not all levels of obfuscation of package names may be acceptable for -all code. Notably, you may have to take into account that your application may -contain resource files that have to be adapted. - -

Removing logging code

- -You can let ProGuard remove logging code. The trick is to specify that the -logging methods don't have side-effects — even though they actually do, -since they write to the console or to a log file. ProGuard will take your word -for it and remove the invocations (in the optimization step) and if possible -the logging classes and methods themselves (in the shrinking step). -

-For example, this configuration removes invocations of the Android logging -methods: -

--assumenosideeffects class android.util.Log {
-    public static boolean isLoggable(java.lang.String, int);
-    public static int v(...);
-    public static int i(...);
-    public static int w(...);
-    public static int d(...);
-    public static int e(...);
-}
-
-

-The wildcards are a shortcut to match all versions of the methods. Be careful -not to use a * wildcard to match all methods, because it would -also match methods like wait(), higher up the hierarchy. Removing -those invocations will generally break your code. -

-Note that you generally can't remove logging code that uses -System.out.println, since you would be removing all invocations -of java.io.PrintStream#println, which could break your -application. You can work around it by creating your own logging methods and -let ProGuard remove those. -

-Logging statements often contain implicit calls that perform string -concatenation. They no longer serve a purpose after the logging calls have -been removed. You can let ProGuard clean up such constructs as well by -providing additional hints: -

--assumenoexternalsideeffects class java.lang.StringBuilder {
-    public java.lang.StringBuilder();
-    public java.lang.StringBuilder(int);
-    public java.lang.StringBuilder(java.lang.String);
-    public java.lang.StringBuilder append(java.lang.Object);
-    public java.lang.StringBuilder append(java.lang.String);
-    public java.lang.StringBuilder append(java.lang.StringBuffer);
-    public java.lang.StringBuilder append(char[]);
-    public java.lang.StringBuilder append(char[], int, int);
-    public java.lang.StringBuilder append(boolean);
-    public java.lang.StringBuilder append(char);
-    public java.lang.StringBuilder append(int);
-    public java.lang.StringBuilder append(long);
-    public java.lang.StringBuilder append(float);
-    public java.lang.StringBuilder append(double);
-    public java.lang.String toString();
-}
-
--assumenoexternalreturnvalues public final class java.lang.StringBuilder {
-    public java.lang.StringBuilder append(java.lang.Object);
-    public java.lang.StringBuilder append(java.lang.String);
-    public java.lang.StringBuilder append(java.lang.StringBuffer);
-    public java.lang.StringBuilder append(char[]);
-    public java.lang.StringBuilder append(char[], int, int);
-    public java.lang.StringBuilder append(boolean);
-    public java.lang.StringBuilder append(char);
-    public java.lang.StringBuilder append(int);
-    public java.lang.StringBuilder append(long);
-    public java.lang.StringBuilder append(float);
-    public java.lang.StringBuilder append(double);
-}
-
-

-Be careful specifying your own assumptions, since they can easily break your -code. - -

Restructuring the output archives

- -In simple applications, all output classes and resources files are merged into -a single jar. For example: -
--injars  classes
--injars  in1.jar
--injars  in2.jar
--injars  in3.jar
--outjars out.jar
-
-

-This configuration merges the processed versions of the files in the -classes directory and the three jars into a single output jar -out.jar. -

-If you want to preserve the structure of your input jars (and/or wars, ears, -zips, or directories), you can specify an output directory (or a war, an ear, -or a zip). For example: -

--injars  in1.jar
--injars  in2.jar
--injars  in3.jar
--outjars out
-
-

-The input jars will then be reconstructed in the directory out, -with their original names. -

-You can also combine archives into higher level archives. For example: -

--injars  in1.jar
--injars  in2.jar
--injars  in3.jar
--outjars out.war
-
-

-The other way around, you can flatten the archives inside higher level -archives into simple archives: -

--injars  in.war
--outjars out.jar
-
-

-This configuration puts the processed contents of all jars inside -in.war (plus any other contents of in.war) into -out.jar. -

-If you want to combine input jars (and/or wars, ears, zips, or directories) -into output jars (and/or wars, ears, zips, or directories), you can group the --injars and -outjars options. For example: -

--injars base_in1.jar
--injars base_in2.jar
--injars base_in3.jar
--outjars base_out.jar
-
--injars  extra_in.jar
--outjars extra_out.jar
-
-

-This configuration puts the processed results of all base_in*.jar -jars into base_out.jar, and the processed results of the -extra_in.jar into extra_out.jar. Note that only the -order of the options matters; the additional whitespace is just for clarity. -

-This grouping, archiving, and flattening can be arbitrarily complex. ProGuard -always tries to package output archives in a sensible way, reconstructing the -input entries as much as required. - -

Filtering the input and the output

- -If you want even greater control, you can add -filters to the input and the output, -filtering out zips, ears, wars, jars, and/or ordinary files. For example, if -you want to disregard certain files from an input jar: -
--injars  in.jar(!images/**)
--outjars out.jar
-
-

-This configuration removes any files in the images directory and -its subdirectories. -

-Such filters can be convenient for avoiding warnings about duplicate files in -the output. For example, only keeping the manifest file from a first input jar: -

--injars  in1.jar
--injars  in2.jar(!META-INF/MANIFEST.MF)
--injars  in3.jar(!META-INF/MANIFEST.MF)
--outjars out.jar
-
-

-Another useful application is speeding up the processing by ProGuard, by -disregarding a large number of irrelevant classes in the runtime library jar: -

--libraryjars <java.home>/lib/rt.jar(java/**,javax/**)
-
-

-The filter makes ProGuard disregard com.sun.** classes, for -instance , which don't affect the processing of ordinary applications. -

-It is also possible to filter the jars (and/or wars, ears, zips) themselves, -based on their names. For example: -

--injars  in(**/acme_*.jar;)
--outjars out.jar
-
-

-Note the semi-colon in the filter; the filter in front of it applies to jar -names. In this case, only acme_*.jar jars are read from the -directory in and its subdirectories. Filters for war names, ear -names, and zip names can be prefixed with additional semi-colons. All types of -filters can be combined. They are orthogonal. -

-On the other hand, you can also filter the output, in order to control what -content goes where. For example: -

--injars  in.jar
--outjars code_out.jar(**.class)
--outjars resources_out.jar
-
-

-This configuration splits the processed output, sending **.class -files to code_out.jar, and all remaining files to -resources_out.jar. -

-Again, the filtering can be arbitrarily complex, especially when combined with -grouping input and output. - -

Processing multiple applications at once

- -You can process several dependent or independent applications (or applets, -midlets,...) in one go, in order to save time and effort. ProGuard's input and -output handling offers various ways to keep the output nicely structured. -

-The easiest way is to specify your input jars (and/or wars, ears, zips, and -directories) and a single output directory. ProGuard will then reconstruct the -input in this directory, using the original jar names. For example, showing -just the input and output options: -

--injars  application1.jar
--injars  application2.jar
--injars  application3.jar
--outjars processed_applications
-
-

-After processing, the directory processed_applications will -contain processed versions of application jars, with their original names. - -

Incremental obfuscation

- -After having processed an application, e.g. -ProGuard itself, you can still incrementally add other pieces of code that -depend on it, e.g. the ProGuard GUI: -
--injars       proguardgui.jar
--outjars      proguardgui_out.jar
--injars       proguard.jar
--outjars      proguard_out.jar
--libraryjars  <java.home>/lib/rt.jar
--applymapping proguard.map
-
--keep public class proguard.gui.ProGuardGUI {
-    public static void main(java.lang.String[]);
-}
-
-

-We're reading both unprocessed jars as input. Their processed contents will go -to the respective output jars. The -applymapping option then -makes sure the ProGuard part of the code gets the previously produced -obfuscation mapping. The final application will consist of the obfuscated -ProGuard jar and the additional obfuscated GUI jar. -

-The added code in this example is straightforward; it doesn't affect the -original code. The proguard_out.jar will be identical to the one -produced in the initial processing step. If you foresee adding more complex -extensions to your code, you should specify the options -useuniqueclassmembernames, --dontshrink, and -dontoptimize in the -original processing step. These options ensure that the obfuscated base -jar will always remain usable without changes. You can then specify the base -jar as a library jar: -

--injars       proguardgui.jar
--outjars      proguardgui_out.jar
--libraryjars  proguard.jar
--libraryjars  <java.home>/lib/rt.jar
--applymapping proguard.map
-
--keep public class proguard.gui.ProGuardGUI {
-    public static void main(java.lang.String[]);
-}
-
- -

Preverifying class files for Java Micro Edition

- -Even if you're not interested in shrinking, optimizing, and obfuscating your -midlets, as shown in the midlets example, you can still -use ProGuard to preverify the class files for Java Micro Edition. ProGuard -produces slightly more compact results than the traditional external -preverifier. -
--injars      in.jar
--outjars     out.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar
-
--dontshrink
--dontoptimize
--dontobfuscate
-
--microedition
-
-

-We're not processing the input, just making sure the class files are -preverified by targeting them at Java Micro Edition with the -microedition option. Note -that we don't need any -keep options to specify entry points; all -class files are simply preverified. - -

Upgrading class files to Java 6

- -The following options upgrade class files to Java 6, by updating their -internal version numbers and preverifying them. The class files can then be -loaded more efficiently by the Java 6 Virtual Machine. -
--injars      in.jar
--outjars     out.jar
--libraryjars <java.home>/lib/rt.jar
-
--dontshrink
--dontoptimize
--dontobfuscate
-
--target 1.6
-
-

-We're not processing the input, just retargeting the class files with the -target option. They will -automatically be preverified for Java 6 as a result. Note that we don't need -any -keep options to specify entry points; all class files are -simply updated and preverified. - -

Finding dead code

- -These options list unused classes, fields, and methods in the application -com.example.MyApplication: -
--injars      in.jar
--libraryjars <java.home>/lib/rt.jar
-
--dontoptimize
--dontobfuscate
--dontpreverify
--printusage
-
--keep public class com.example.MyApplication {
-    public static void main(java.lang.String[]);
-}
-
-

-We're not specifying an output jar, just printing out some results. We're -saving some processing time by skipping the other processing steps. -

-The java compiler inlines primitive constants and String constants -(static final fields). ProGuard would therefore list such fields -as not being used in the class files that it analyzes, even if they are -used in the source files. We can add a -keepclassmembers option -that keeps those fields a priori, in order to avoid having them listed: -

--keepclassmembers class * {
-    static final %                *;
-    static final java.lang.String *;
-}
-
- -

Printing out the internal structure of class files

- -These options print out the internal structure of all class files in the input -jar: -
--injars in.jar
-
--dontshrink
--dontoptimize
--dontobfuscate
--dontpreverify
-
--dump
-
-

-Note how we don't need to specify the Java run-time jar, because we're not -processing the input jar at all. - -

Using annotations to configure ProGuard

- -The traditional ProGuard configuration allows to keep a clean separation -between the code and the configuration for shrinking, optimization, and -obfuscation. However, it is also possible to define specific annotations, -and then annotate the code to configure the processing. -

-You can find a set of such predefined annotations in -lib/annotations.jar in the ProGuard distribution. The -corresponding ProGuard configuration (or meta-configuration, if you prefer) -is specified in annotations/annotations.pro. With these files, -you can start annotating your code. For instance, a java source file -Application.java can be annotated as follows: -

-@KeepApplication
-public class Application {
-  ....
-}
-
-

-The ProGuard configuration file for the application can then be simplified by -leveraging off these annotations: -

--injars      in.jar
--outjars     out.jar
--libraryjars <java.home>/lib/rt.jar
-
--include lib/annotations.pro
-
-

-The annotations are effectively replacing the application-dependent --keep options. You may still wish to add traditional --keep options for processing native -methods, enumerations, serializable classes, and annotations. -

-The directory examples/annotations contains more examples that -illustrate some of the possibilities. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/gradle.html b/tools/proguard/proguard6.0.3/docs/manual/gradle.html deleted file mode 100644 index b53cb5fa..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/gradle.html +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - -Gradle Task - - - - - - -

Gradle Task

- -ProGuard can be run as a task in the Java-based build tool Gradle -(version 2.1 or higher). -

- -Before you can use the proguard task, you have to make sure -Gradle can find it in its class path at build time. One way is to add the -following line to your build.gradle file: -

- -

-buildscript {
-    repositories {
-        flatDir dirs: '/usr/local/java/proguard/lib'
-    }
-    dependencies {
-        classpath ':proguard:'
-    }
-}
-
-

- -Please make sure the class path is set correctly for your system. -

- -You can then define a task: -

-

-task myProguardTask(type: proguard.gradle.ProGuardTask) {
-    .....
-}
-
-

- -The embedded configuration is much like a standard ProGuard configuration. -Notable similarities and differences: -

    -
  • Like in ProGuard-style configurations, we're using all lower-case names - for the settings.
  • -
  • The options don't have a dash as prefix.
  • -
  • Arguments typically have quotes.
  • -
  • Some settings are specified as named arguments.
  • -
-

-You can find some sample build files in the examples/gradle -directory of the ProGuard distribution. -

-If you prefer a more verbose configuration derived from the Ant task, you can -import the Ant task as a Gradle task. - -

Settings

- -The ProGuard task supports the following settings in its closure: - -
- -
configuration - files
-
Read and merge options from the given ProGuard-style configuration - files. The files are resolved and parsed lazily, during the execution - phase.
- -
injars - class_path
-
Specifies the program jars (or aars, wars, ears, zips, apks, or - directories). The files are resolved and read lazily, during the execution - phase.
- -
outjars - class_path
-
Specifies the names of the output jars (or aars, wars, ears, zips, apks, or - directories). The files are resolved and written lazily, during the - execution phase.
- -
libraryjars - class_path
-
Specifies the library jars (or aars, wars, ears, zips, apks, or - directories). The files are resolved and read lazily, during the execution - phase.
- -
skipnonpubliclibraryclasses
-
Ignore non-public library classes.
- -
dontskipnonpubliclibraryclassmembers
-
Don't ignore package visible library class members.
- -
keepdirectories - ['directory_filter']
-
Keep the specified directories in the output jars (or aars, wars, ears, - zips, apks, or directories).
- -
target - 'version'
-
Set the given version number in the processed classes.
- -
forceprocessing
-
Process the input, even if the output seems up to date.
- -
keep - [modifier,...] - class_specification
-
Preserve the specified classes and class members.
- -
keepclassmembers - [modifier,...] - class_specification
-
Preserve the specified class members, if their classes are preserved as - well.
- -
keepclasseswithmembers - [modifier,...] - class_specification
-
Preserve the specified classes and class members, if all of the - specified class members are present.
- -
keepnames - class_specification
-
Preserve the names of the specified classes and class members (if - they aren't removed in the shrinking step).
- -
keepclassmembernames - class_specification
-
Preserve the names of the specified class members (if they aren't removed - in the shrinking step).
- -
keepclasseswithmembernames - class_specification
-
Preserve the names of the specified classes and class members, if - all of the specified class members are present (after the shrinking - step).
- -
printseeds - [file]
-
List classes and class members matched by the various keep - commands, to the standard output or to the given file.
- -
dontshrink
-
Don't shrink the input class files.
- -
printusage - [file]
-
List dead code of the input class files, to the standard output or to the - given file.
- -
whyareyoukeeping - class_specification
-
Print details on why the given classes and class members are being kept in - the shrinking step.
- -
dontoptimize
-
Don't optimize the input class files.
- -
optimizations 'optimization_filter'
-
Perform only the specified optimizations.
- -
optimizationpasses - n
-
The number of optimization passes to be performed.
- -
assumenosideeffects - class_specification
-
Assume that the specified methods don't have any side effects, while - optimizing. Only use this option if you know what you're - doing!
- -
assumenoexternalsideeffects - class_specification
-
Assume that the specified methods don't have any external side effects, - while optimizing. Only use this option if you know what you're - doing!
- -
assumenoescapingparameters - class_specification
-
Assume that the specified methods don't let any reference parameters - escape to the heap, while optimizing. Only use this option if you know - what you're doing!
- -
assumenoexternalreturnvalues - class_specification
-
Assume that the specified methods don't return any external reference - values, while optimizing. Only use this option if you know what you're - doing!
- -
allowaccessmodification
-
Allow the access modifiers of classes and class members to be modified, - while optimizing.
- -
mergeinterfacesaggressively
-
Allow any interfaces to be merged, while optimizing.
- -
dontobfuscate
-
Don't obfuscate the input class files.
- -
printmapping - [file]
-
Print the mapping from old names to new names for classes and class members - that have been renamed, to the standard output or to the given file.
- -
applymapping - file
-
Reuse the given mapping, for incremental obfuscation.
- -
obfuscationdictionary - file
-
Use the words in the given text file as obfuscated field names and method - names.
- -
classobfuscationdictionary - file
-
Use the words in the given text file as obfuscated class names.
- -
packageobfuscationdictionary - file
-
Use the words in the given text file as obfuscated package names.
- -
overloadaggressively
-
Apply aggressive overloading while obfuscating.
- -
useuniqueclassmembernames
-
Ensure uniform obfuscated class member names for subsequent incremental - obfuscation.
- -
dontusemixedcaseclassnames
-
Don't generate mixed-case class names while obfuscating.
- -
keeppackagenames ['package_filter']
-
Keep the specified package names from being obfuscated. If no name is - given, all package names are preserved.
- -
flattenpackagehierarchy - 'package_name'
-
Repackage all packages that are renamed into the single given parent - package.
- -
repackageclasses - ['package_name']
-
Repackage all class files that are renamed into the single given - package.
- -
keepattributes ['attribute_filter']
-
Preserve the specified optional Java bytecode attributes, with optional - wildcards. If no name is given, all attributes are preserved.
- -
keepparameternames
-
Keep the parameter names and types of methods that are kept.
- -
renamesourcefileattribute - ['string']
-
Put the given constant string in the SourceFile - attributes.
- -
adaptclassstrings - ['class_filter']
-
Adapt string constants in the specified classes, based on the obfuscated - names of any corresponding classes.
- -
adaptresourcefilenames - ['file_filter']
-
Rename the specified resource files, based on the obfuscated names of the - corresponding class files.
- -
adaptresourcefilecontents - ['file_filter']
-
Update the contents of the specified resource files, based on the - obfuscated names of the processed classes.
- -
dontpreverify
-
Don't preverify the processed class files if they are targeted at Java Micro - Edition or at Java 6 or higher.
- -
microedition
-
Target the processed class files at Java Micro Edition.
- -
android
-
Target the processed class files at Android.
- -
verbose
-
Write out some more information during processing.
- -
dontnote 'class_filter'
-
Don't print notes about classes matching the specified class name - filter.
- -
dontwarn 'class_filter'
-
Don't print warnings about classes matching the specified class name - filter. Only use this option if you know what you're doing!
- -
ignorewarnings
-
Print warnings about unresolved references, but continue processing - anyhow. Only use this option if you know what you're doing!
- -
printconfiguration - [file]
-
Write out the entire configuration in traditional ProGuard style, to the - standard output or to the given file. Useful to replace unreadable - XML configurations.
- -
dump - [file]
-
Write out the internal structure of the processed class files, to the - standard output or to the given file.
- -
- -

Class Paths

- -Class paths are specified as Gradle file collections, which means they can be -specified as simple strings, with files(Object), etc. -

-In addition, they can have ProGuard-style filters, specified as -comma-separated named arguments after the file: - -

- -
filter: - 'file_filter'
-
An optional filter for all class file names and resource file names that - are encountered.
- -
apkfilter: - 'file_filter'
-
An optional filter for all apk names that are encountered.
- -
jarfilter: - 'file_filter'
-
An optional filter for all jar names that are encountered.
- -
aarfilter: - 'file_filter'
-
An optional filter for all aar names that are encountered.
- -
warfilter: - 'file_filter'
-
An optional filter for all war names that are encountered.
- -
earfilter: - 'file_filter'
-
An optional filter for all ear names that are encountered.
- -
zipfilter: - 'file_filter'
-
An optional filter for all zip names that are encountered.
- -
- -

Files

- -Files are specified as Gradle files, which means they can be specified -as simple strings, as File instances, with file(Object), etc. -

-In Gradle, file names (any strings really) in double quotes can contain -properties or code inside ${...}. These are automatically -expanded. -

-For example, "${System.getProperty('java.home')}/lib/rt.jar" is -expanded to something like '/usr/local/java/jdk/jre/lib/rt.jar'. -Similarly, System.getProperty('user.home') is expanded to the -user's home directory, and System.getProperty('user.dir') is -expanded to the current working directory. - -

Keep Modifiers

- -The keep settings can have the following named arguments that modify their -behaviors: - -
- -
if: - class_specification
-
Specifies classes and class members that must be present to activate the - keep option.
- -
includedescriptorclasses: - boolean - (default = false)
-
Specifies whether the classes of the fields and methods specified in the - keep tag must be kept as well.
- -
allowshrinking: - boolean - (default = false)
-
Specifies whether the entry points specified in the keep tag may be - shrunk.
- -
allowoptimization: - boolean - (default = false)
-
Specifies whether the entry points specified in the keep tag may be - optimized.
- -
allowobfuscation: - boolean - (default = false)
-
Specifies whether the entry points specified in the keep tag may be - obfuscated.
- -
- -Names arguments are comma-separated, as usual. - -

Class Specifications

- -A class specification is a template of classes and class members (fields and methods). There are two alternative ways to specify such a template: - -
    -
  1. As a string containing a ProGuard-style class specification. This is the - most compact and most readable way. The specification looks like a Java - declaration of a class with fields and methods. For example: -
    -keep 'public class com.example.MyMainClass {  \
    -    public static void main(java.lang.String[]);  \
    -}'
    -
  2. -
  3. As a Gradle-style setting: a method calls with named arguments and a - closure. This is more verbose, but it might be useful for programmatic - specifications. For example: -
    -keep access: 'public',
    -     name:   'com.example.MyMainClass', {
    -    method access:     'public static',
    -           type:       'void',
    -           name:       'main',
    -           parameters: 'java.lang.String[]'
    -}
    -
  4. -
-

- -The ProGuard-style class -specification is described on the traditional Usage page. -

-A Gradle-style class specification can have the following named arguments: - -

- -
access: 'access_modifiers'
-
The optional access modifiers of the class. Any space-separated list of - "public", "final", and "abstract", with optional negators "!".
- -
annotation: 'annotation_name'
-
The optional fully qualified name of an annotation of the class, with - optional wildcards.
- -
type: 'type'
-
The optional type of the class: one of "class", "interface", or - "!interface".
- -
name: 'class_name'
-
The optional fully qualified name of the class, with optional - wildcards.
- -
extendsannotation: 'annotation_name'
-
The optional fully qualified name of an annotation of the the class that - the specified classes must extend, with optional wildcards.
- -
'extends': 'class_name'
-
The optional fully qualified name of the class the specified classes - must extend, with optional wildcards.
- -
'implements': 'class_name'
-
The optional fully qualified name of the class the specified classes - must implement, with optional wildcards.
- -
- -The named arguments are optional. Without any arguments, there are no -constraints, so the settings match all classes. -

- -

Gradle-style Class Member Specifications

- -The closure of a Gradle-style class specification can specify class members -with these settings: - -
- -
field field_constraints
-
Specifies a field.
- -
method method_constraints
-
Specifies a method.
- -
constructor constructor_constraints
-
Specifies a constructor.
- -
- -A class member setting can have the following named arguments to express -constraints: - -
- -
access: 'access_modifiers'
-
The optional access modifiers of the class. Any space-separated list of - "public", "protected", "private", "static", etc., with optional negators - "!".
- -
'annotation': 'annotation_name'
-
The optional fully qualified name of an annotation of the class member, - with optional wildcards.
- -
type: 'type'
-
The optional fully qualified type of the class member, with optional - wildcards. Not applicable for constructors, but required for methods for - which the parameters argument is specified.
- -
name: 'name'
-
The optional name of the class member, with optional wildcards. Not - applicable for constructors.
- -
parameters: 'parameters'
-
The optional comma-separated list of fully qualified method parameters, - with optional wildcards. Not applicable for fields, but required for - constructors, and for methods for which the type argument is - specified.
- -
- -The named arguments are optional. Without any arguments, there are no -constraints, so the settings match all constructors, fields, or methods. -

-A class member setting doesn't have a closure. - -

Alternative: imported Ant task

- -Instead of using the Gradle task, you could also integrate the Ant task in -your Gradle build file: -

-

-ant.project.basedir = '../..'
-
-ant.taskdef(resource: 'proguard/ant/task.properties',
-            classpath: '/usr/local/java/proguard/lib/proguard.jar')
-
-

- -Gradle automatically converts the elements and attributes to Groovy methods, -so converting the configuration is essentially mechanical. The one-on-one -mapping can be useful, but the resulting configuration is more verbose. For -instance: -

-task proguard << {
-  ant.proguard(printmapping: 'proguard.map',
-               overloadaggressively: 'on',
-               repackageclasses: '',
-               renamesourcefileattribute: 'SourceFile') {
-
-    injar(file: 'application.jar')
-    injar(file: 'gui.jar', filter: '!META-INF/**')
-
-    .....
-  }
-}
-
-

- -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/gui.html b/tools/proguard/proguard6.0.3/docs/manual/gui.html deleted file mode 100644 index 4808ee3a..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/gui.html +++ /dev/null @@ -1,483 +0,0 @@ - - - - - - -ProGuard GUI - - - - - - -

Graphical User Interface

- -You can find the ProGuard GUI jar in the lib directory of the -ProGuard distribution. To run the ProGuard graphical user interface, just type: -

-java -jar proguardgui.jar [-nosplash] [configuration_file] -

-Alternatively, the bin directory contains some short Linux and -Windows scripts containing this command. The GUI will pop up in a window. With -the -nosplash option, you can switch off the short opening -animation. If you have specified a ProGuard configuration file, it will be -loaded. The GUI works like a wizard. You can edit the configuration and -execute ProGuard through a few tabs: -

- - - - - - - - - - - - - - - - -
ProGuardOptionally load an existing configuration file.
Input/OutputSpecify the program jars and library jars.
ShrinkingSpecify the shrinking options.
ObfuscationSpecify the obfuscation options.
OptimizationSpecify the optimization options.
InformationSpecify some options to get information.
ProcessView and save the resulting configuration, and run ProGuard.
-

- -In addition, there is a tab to execute ReTrace interactively: -

- - - - -
ReTraceSet up and run ReTrace, to de-obfuscate stack traces.
-

- -You can freely toggle between the tabs by means of the buttons on the -left-hand side of the window, or by means of the Previous and -Next buttons at the bottom of the tabs. Tool tips briefly explain the -purpose of the numerous options and text fields, although a basic -understanding of the shrinking/optimization/obfuscation/preverification -process is assumed. Please refer to the Introduction of this manual. -

- -

The ProGuard Tab

- -The ProGuard tab presents a welcome message and one important button at -the bottom: -

- - - - -
Load configuration...opens a file chooser to load an existing ProGuard configuration - file.
-

- -If you don't want to load an existing configuration, you can just continue -creating a new configuration from scratch. -

- -

The Input/Output Tab

- -The Input/Output tab contains two lists, respectively to specify the -program jars (or aars, wars, ears, zips, apks, or directories), and the -library jars (or aars, wars, ears, zips, apks, or directories). - -
    -
  • The list of program jars contains input entries and output entries. Input - entries contain the class files and resource files to be processed. Output - entries specify the destinations to which the processed results will be - written. They are preceded by arrows, to distinguish them from input - entries. The results of each consecutive list of input entries will be - written to the subsequent consecutive list of output entries.
  • - -
  • The library jars are not copied to the output jars; they contain class - files that are used by class files in the program jars and that are - necessary for correct processing. This list typically at least contains the - targeted Java runtime jar.
  • -
-

- -Each of these lists can be edited by means of a couple of buttons on the -right-hand side: -

- - - - - - - - - - - - - - - - - - - - -
Add input... opens a file chooser to add an - input entry to the list of program jars.
Add output... opens a file chooser to add an - output entry to the list of program jars.
Add...opens a file chooser to add an entry to the list of library - jars.
Edit...opens a file chooser to edit the selected entry in the list.
Filter...opens a text entry field to add or edit the filters of the selected - entries in the list.
Removeremoves the selected entries from the list.
Move upmoves the selected entries one position up the list.
Move downmoves the selected entries one position down the list.
Move to librariesmoves the selected entries in the list of program jars to the list of - library jars.
Move to programmoves the selected entries in the list of library jars to the list of - program jars.
-

- -Filters allow to filter files based on their names. You can specify filters -for class file names and resource file names, for jar file names, for aar file -names, for war file names, for ear file names, for zip file names, and for -apk file names. Multiple entries in the program list only make sense when -combined with filters; each output file is written to the first entry with a -matching filter. -

- -Input entries that are currently not readable are colored red. -

- -The order of the entries in each list may matter, as the first occurrence of -any duplicate entries gets precedence, just as in conventional class paths. -

- -Corresponding configuration options: -

-

- -

The Shrinking Tab

- -The Shrinking tab presents a number of options that affect the -shrinking step. The basic options are followed by a few lists of classes and -class members (fields and methods) that must be protected from shrinking (and -implicitly from obfuscation as well). -

- -The fixed lists contain predefined entries that are typically useful for many -applications. Each of these entries can be toggled by means of a check box. -The text field following each entry allows to constrain the applicable classes -by means of a comma-separated list of wildcarded, fully-qualified class -names. The default is "*", which means that all input classes of the -corresponding type are considered. -

- -For example, checking the Applications entry and filling in -"myapplications.**" after it would mean: keep all classes that have main -methods in the "myapplications" package and all of its subpackages. -

- -The variable list at the bottom allows to define additional entries -yourself. The list can be edited by means of a couple of buttons on the -right-hand side: -

- - - - - - - - - - - - -
Add...opens a window to add a new entry to the list.
Edit...opens a window to edit the selected entry in the list.
Removeremoves the selected entries from the list.
Move upmoves the selected entries one position up the list.
Move downmoves the selected entries one position down the list.
-

- -The interface windows allow to specify classes, fields, and methods. They -contain text fields and check boxes to constrain these items. They have -Ok and Cancel buttons to apply or to cancel the operation. -

- -For example, your application may be creating some classes dynamically using -Class.forName. You should then specify them here, so they are kept -by their original names. Press the Add... button to open the class -window. Fill out the fully-qualified class name in the Code text field, -and press the Ok button. Repeat this for all required classes. Wildcards -can be helpful to specify a large number of related classes in one go. If you -want to specify all implementations of a certain interface, fill out the -fully qualified interface name in the Extends/implements class instead. -

- -For more advanced settings, it is advisable to become familiar with ProGuard's -configuration options through the Usage section and -the Examples section. We'll suffice with a brief -overview of the three dialogs provided by the GUI. -

- -The keep class dialog appears when adding or editing new special keep -entries. It has text fields and selections for specifying and constraining -classes and class members to keep. The Advanced options / Basic -options button at the bottom of the dialog allows to toggle showing the -advanced options. - -

    -
  • The Comments text field allows to add optional comments to this - entry. The comments will identify the entry in the list and they will - appear as comments in the configuration file.
  • - -
  • The Keep selection allows to specify whether you want to protect - the specified classes and their specified class members, or just the - specified class members from the specified classes, or the specified - classes and the specified class members, if the class members are present. - Note that class members will only be protected if they are explicitly - specified, even if only by means of a wildcard.
  • - -
  • The Allow selection allows to specify whether you want to allow the - the specified classes and their specified class members to be shrunk, - optimized and/or obfuscated.
  • - -
  • The Access selections allows to specify constraints on the class or - classes, based on their access modifiers.
  • - -
  • The Annotation text field takes the fully-qualified name of an - annotation that is required for matching classes. The annotation name can - contain wildcards. This is an advanced option for defining keep - annotations.
  • - -
  • The Class text field takes the fully-qualified name of the class or - classes. The class name can contain wildcards.
  • - -
  • The Annotation text field takes the fully-qualified name of an - annotation that is required for the class or interface that the above - class must extend. The annotation name can contain wildcards. This is an - advanced option for defining keep annotations.
  • - -
  • The Extends/implements class text field takes the fully-qualified - name of the class or interface that the above classes must extend.
  • - -
  • The Class members list allows to specify a list of fields and - methods to keep. It can be edited by means of a list of buttons on the - right-hand side.
  • -
-

- -The keep field dialog appears when adding or editing fields within the -above dialog. It has text fields and selections for specifying and -constraining fields to keep. Again, the Advanced options / Basic -options button at the bottom of the dialog allows to toggle showing the -advanced options. - -

    -
  • The Access selections allows to specify constraints on the field or - fields, based on their access modifiers.
  • - -
  • The Annotation text field takes the fully-qualified name of an - annotation that is required for matching fields. The annotation name can - contain wildcards. This is an advanced option for defining keep - annotations.
  • - -
  • The Return type text field takes the fully-qualified type of the - field or fields. The type can contain wildcards.
  • - -
  • The Name text field takes the name of the field or fields. The field - name can contain wildcards.
  • -
-

- -Similarly, the keep method dialog appears when adding or editing -methods within the keep class dialog. It has text fields and selections for -specifying and constraining methods to keep. Again, the Advanced -options / Basic options button at the bottom of the dialog allows -to toggle showing the advanced options. - -

    -
  • The Access selections allows to specify constraints on the method or - methods, based on their access modifiers.
  • - -
  • The Annotation text field takes the fully-qualified name of an - annotation that is required for matching methods. The annotation name can - contain wildcards. This is an advanced option for defining keep - annotations.
  • - -
  • The Return type text field takes the fully-qualified type of the method or methods. The type can contain wildcards.
  • - -
  • The Name text field takes the name of the method or methods. The - method name can contain wildcards.
  • - -
  • The Arguments text field takes the comma-separated list of - fully-qualified method arguments. Each of these arguments can contain - wildcards.
  • -
-

- -Corresponding configuration options: -

-

- -

The Obfuscation Tab

- -The Obfuscation tab presents a number of options that affect the -obfuscation step. The basic options are followed by a few lists of classes and -class members (fields and methods) that must be protected from obfuscation -(but not necessarily from shrinking). -

- -The lists are manipulated in the same way as in the Shrinking Tab. -

- -Corresponding configuration options: -

-

- -

The Optimization Tab

- -The Optimization tab presents a number of options that affect the -optimization step. The basic options are followed by a few lists of class -method calls that can be removed if ProGuard can determine that their results -are not being used. -

- -The lists are manipulated in much the same way as in the Shrinking Tab. -

- -Corresponding configuration options: -

-

- -

The Information Tab

- -The Information tab presents a number of options for preverification -and targeting, and for the information that ProGuard returns when processing -your code. The bottom list allows you to query ProGuard about why given -classes and class members are being kept in the shrinking step. -

- -Corresponding configuration options: -

-

- -

The Process Tab

- -The Process tab has an output console for displaying the configuration -and the messages while processing. There are three important buttons at the -bottom: -

- - - - - - - - -
View configurationdisplays the current ProGuard configuration in the console.
Save configuration...opens a file chooser to save the current ProGuard - configuration.
Process!executes ProGuard with the current configuration.
-

- -

The ReTrace Tab

- -The ReTrace tab has a panel with a few settings, an input text area for -the obfuscated stack trace, and an output console to view the de-obfuscated -stack trace: - -
    -
  • The Verbose check box in the settings panel allows to toggle between - normal mode and verbose mode.
  • - -
  • The Mapping file text field takes the name of the required mapping - file that ProGuard wrote while processing the original code. The file name - can be entered manually or by means of the Browse... button that - opens a file chooser.
  • - -
  • The Obfuscated stack trace text area allows to enter the stack - trace, typically by copying and pasting it from elsewhere. Alternatively, - it can be loaded from a file by means of the load button below.
  • -
- -There are two buttons at the bottom: -

- - - - - - -
Load stack trace...opens a file chooser to load an obfuscated stack trace.
ReTrace!executes ReTrace with the current settings.
- -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/index.html b/tools/proguard/proguard6.0.3/docs/manual/index.html deleted file mode 100644 index 1b7f6c40..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -ProGuard Manual - - - -

ProGuard

- -
    -
  1. Introduction
  2. -
  3. Usage
  4. -
  5. Limitations
  6. -
  7. Examples
  8. -
  9. Troubleshooting
  10. -
  11. Reference Card
  12. -
  13. Graphical User Interface
  14. -
  15. Ant Task
  16. -
  17. Gradle Task
  18. -
  19. JME Wireless Toolkit Integration
  20. -
- -

ReTrace

- -
    -
  1. Introduction
  2. -
  3. Usage
  4. -
  5. Examples
  6. -
- -
- -
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/introduction.html b/tools/proguard/proguard6.0.3/docs/manual/introduction.html deleted file mode 100644 index 5051bf67..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/introduction.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - -ProGuard Introduction - - - - - - -

Introduction

- -ProGuard is a Java class file shrinker, optimizer, obfuscator, and -preverifier. The shrinking step detects and removes unused classes, fields, -methods, and attributes. The optimization step analyzes and optimizes the -bytecode of the methods. The obfuscation step renames the remaining classes, -fields, and methods using short meaningless names. These first steps make the -code base smaller, more efficient, and harder to reverse-engineer. The final -preverification step adds preverification information to the classes, which is -required for Java Micro Edition and for Java 6 and higher. -

-Each of these steps is optional. For instance, ProGuard can also be used to -just list dead code in an application, or to preverify class files for -efficient use in Java 6. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Input jars
Shrunk code
Optim. codeOutput jars
- shrink →- optimize →- obfuscate →Obfusc. code- preverify →
Library jars------------------------------- (unchanged) -------------------------------→Library jars
-

- -ProGuard first reads the input jars (or aars, wars, ears, zips, apks, -or directories). It then subsequently shrinks, optimizes, obfuscates, and -preverifies them. You can optionally let ProGuard perform multiple -optimization passes. ProGuard writes the processed results to one or -more output jars (or aars, wars, ears, zips, apks, or directories). The -input may contain resource files, whose names and contents can optionally be -updated to reflect the obfuscated class names. -

-ProGuard requires the library jars (or aars, wars, ears, zips, apks, or -directories) of the input jars to be specified. These are essentially the -libraries that you would need for compiling the code. ProGuard uses them to -reconstruct the class dependencies that are necessary for proper processing. -The library jars themselves always remain unchanged. You should still put them -in the class path of your final application. - -

Entry points

- -In order to determine which code has to be preserved and which code can be -discarded or obfuscated, you have to specify one or more entry points to -your code. These entry points are typically classes with main methods, applets, -midlets, activities, etc. -
    -
  • In the shrinking step, ProGuard starts from these seeds and - recursively determines which classes and class members are used. All other - classes and class members are discarded.
  • - -
  • In the optimization step, ProGuard further optimizes the code. - Among other optimizations, classes and methods that are not entry points - can be made private, static, or final, unused parameters can be removed, - and some methods may be inlined.
  • - -
  • In the obfuscation step, ProGuard renames classes and class members - that are not entry points. In this entire process, keeping the entry - points ensures that they can still be accessed by their original names.
  • - -
  • The preverification step is the only step that doesn't have to know - the entry points.
  • -
-

-The Usage section of this manual describes the -necessary -keep options and -the Examples section provides plenty of examples. - -

Reflection

- -Reflection and introspection present particular problems for any automatic -processing of code. In ProGuard, classes or class members in your code that -are created or invoked dynamically (that is, by name) have to be specified as -entry points too. For example, Class.forName() constructs may -refer to any class at run-time. It is generally impossible to compute which -classes have to be preserved (with their original names), since the class -names might be read from a configuration file, for instance. You therefore -have to specify them in your ProGuard configuration, with the same -simple -keep options. -

-However, ProGuard will already detect and handle the following cases for you: - -

    -
  • Class.forName("SomeClass")
  • -
  • SomeClass.class
  • -
  • SomeClass.class.getField("someField")
  • -
  • SomeClass.class.getDeclaredField("someField")
  • -
  • SomeClass.class.getMethod("someMethod", new Class[] {})
  • -
  • SomeClass.class.getMethod("someMethod", new Class[] { A.class })
  • -
  • SomeClass.class.getMethod("someMethod", new Class[] { A.class, B.class })
  • -
  • SomeClass.class.getDeclaredMethod("someMethod", new Class[] {})
  • -
  • SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class })
  • -
  • SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class, B.class })
  • -
  • AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, "someField")
  • -
  • AtomicLongFieldUpdater.newUpdater(SomeClass.class, "someField")
  • -
  • AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, "someField")
  • -
- -The names of the classes and class members may of course be different, but the -constructs should be literally the same for ProGuard to recognize them. The -referenced classes and class members are preserved in the shrinking phase, and -the string arguments are properly updated in the obfuscation phase. -

-Furthermore, ProGuard will offer some suggestions if keeping some classes or -class members appears necessary. For example, ProGuard will note constructs -like "(SomeClass)Class.forName(variable).newInstance()". These -might be an indication that the class or interface SomeClass -and/or its implementations may need to be preserved. You can then adapt your -configuration accordingly. -

-Finally, ProGuard can also help for to find less obvious cases of reflection -at run-time. The option --addconfigurationdebugging -lets ProGuard instrument the processed code with debugging statements. These -print out suggestions for missing ProGuard configuration. They can be very -useful to get practical hints, if your processed code crashes because it still -lacks some configuration. You can generally just copy/paste the suggestions -from the console into your configuration file. -

-For proper results, you should at least be somewhat familiar with the code -that you are processing. Obfuscating code that performs a lot of reflection -may require trial and error, especially without the necessary information -about the internals of the code. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/limitations.html b/tools/proguard/proguard6.0.3/docs/manual/limitations.html deleted file mode 100644 index c26e37e4..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/limitations.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - -ProGuard Limitations - - - - - - -

Limitations

- -When using ProGuard, you should be aware of a few technical issues, all of -which are easily avoided or resolved: -

-

    - -
  • For best results, ProGuard's optimization algorithms assume that the - processed code never intentionally throws NullPointerExceptions or - ArrayIndexOutOfBoundsExceptions, or even OutOfMemoryErrors or - StackOverflowErrors, in order to achieve something useful. For instance, - it may remove a method call myObject.myMethod() if that call - wouldn't have any effect. It ignores the possibility that - myObject might be null, causing a NullPointerException. In - some way this is a good thing: optimized code may throw fewer exceptions. - Should this entire assumption be false, you'll have to switch off - optimization using the -dontoptimize option.
  • - -
  • ProGuard's optimization algorithms currently also assume that the - processed code never creates busy-waiting loops without at least - testing on a volatile field. Again, it may remove such loops. Should this - assumption be false, you'll have to switch off optimization using - the -dontoptimize option.
  • - -
  • When obfuscating, ProGuard writes out class files named - "a.class", "b.class", etc. If a package contains - a large number of classes, ProGuard may also write out - "aux.class". Inconveniently, Windows refuses to create - files with this reserved name (among a few other names). It's generally - better to write the output to a jar, in order to avoid such problems.
  • - -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/optimizations.html b/tools/proguard/proguard6.0.3/docs/manual/optimizations.html deleted file mode 100644 index 087c1508..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/optimizations.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - -Optimizations - - - - - - -

Optimizations

- -The optimization step of ProGuard can be switched off with the --dontoptimize option. For -more fine-grained control over individual optimizations, experts can use the --optimizations option, -with a filter based on the optimization names listed below. The filter works -like any filter in ProGuard. -

- -The following wildcards are supported: - - - - - - -
?matches any single character in an optimization name.
*matches any part of an optimization name.
- -An optimization that is preceded by an exclamation mark '!' is -excluded from further attempts to match with subsequent -optimization names in the filter. Make sure to specify filters correctly, -since they are not checked for potential typos. -

- -For example, -"code/simplification/variable,code/simplification/arithmetic" -only performs the two specified peephole optimizations. -

- -For example, "!method/propagation/*" performs all optimizations, -except the ones that propagate values between methods. -

- -For example, -"!code/simplification/advanced,code/simplification/*" only -performs all peephole optimizations. -

-Some optimizations necessarily imply other optimizations. These are then -indicated. Note that the list is likely to change over time, as optimizations -are added and reorganized. -

- -

-
class/marking/final
-
Marks classes as final, whenever possible.
- -
class/unboxing/enum
-
Simplifies enum types to integer constants, whenever possible.
- -
class/merging/vertical
-
Merges classes vertically in the class hierarchy, whenever possible.
- -
class/merging/horizontal
-
Merges classes horizontally in the class hierarchy, whenever possible.
- -
(⇒ code/removal/advanced)
- field/removal/writeonly
-
Removes write-only fields.
- -
field/marking/private
-
Marks fields as private, whenever possible.
- -
(⇒ code/simplification/advanced)
- field/propagation/value
-
Propagates the values of fields across methods.
- -
method/marking/private
-
Marks methods as private, whenever possible (devirtualization).
- -
(⇒ code/removal/advanced)
- method/marking/static
-
Marks methods as static, whenever possible (devirtualization).
- -
method/marking/final
-
Marks methods as final, whenever possible.
- -
(⇒ code/removal/advanced)
- method/removal/parameter
-
Removes unused method parameters.
- -
(⇒ code/simplification/advanced)
- method/propagation/parameter
-
Propagates the values of method parameters from method invocations to - the invoked methods.
- -
(⇒ code/simplification/advanced)
- method/propagation/returnvalue
-
Propagates the values of method return values from methods to their - invocations.
- -
method/inlining/short
-
Inlines short methods.
- -
method/inlining/unique
-
Inlines methods that are only called once.
- -
method/inlining/tailrecursion
-
Simplifies tail recursion calls, whenever possible.
- -
code/merging
-
Merges identical blocks of code by modifying branch targets.
- -
code/simplification/variable
-
Performs peephole optimizations for variable loading and storing.
- -
code/simplification/arithmetic
-
Performs peephole optimizations for arithmetic instructions.
- -
code/simplification/cast
-
Performs peephole optimizations for casting operations.
- -
code/simplification/field
-
Performs peephole optimizations for field loading and storing.
- -
(⇒ code/removal/simple)
- code/simplification/branch
-
Performs peephole optimizations for branch instructions.
- -
code/simplification/string
-
Performs peephole optimizations for constant strings.
- -
(best used with code/removal/advanced)
- code/simplification/advanced
-
Simplifies code based on control flow analysis and data flow - analysis.
- -
(⇒ code/removal/exception)
- code/removal/advanced
-
Removes dead code based on control flow analysis and data flow - analysis.
- -
(⇒ code/removal/exception)
- code/removal/simple
-
Removes dead code based on a simple control flow analysis.
- -
code/removal/variable
-
Removes unused variables from the local variable frame.
- -
code/removal/exception
-
Removes exceptions with empty try blocks.
- -
code/allocation/variable
-
Optimizes variable allocation on the local variable frame.
-
-

- -ProGuard also provides some unofficial settings to control optimizations, that -may disappear in future versions. These are Java system properties, which -can be set as JVM arguments (with -D.....): -

-
maximum.inlined.code.length (default = 8 bytes)
-
Specifies the maximum code length (expressed in bytes) of short methods - that are eligible to be inlined. Inlining methods that are too long may - unnecessarily inflate the code size.
- -
maximum.resulting.code.length (default = 8000 bytes - for JSE, 2000 bytes for JME)
-
Specifies the maximum resulting code length (expressed in bytes) allowed - when inlining methods. Many Java virtual machines do not apply just-in-time - compilation to methods that are too long, so it's important not to let them - grow too large.
- -
optimize.conservatively (default = unset)
-
Allows input code with ordinary instructions intentionally throwing - NullPointerException, - ArrayIndexOutOfBoundsException, or - ClassCastException, without any other useful purposes. By - default, ProGuard may just discard such seemingly useless instructions, - resulting in better optimization of most common code.
-
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/refcard.html b/tools/proguard/proguard6.0.3/docs/manual/refcard.html deleted file mode 100644 index 3faeb696..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/refcard.html +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - -ProGuard Reference Card - - - - - - -

ProGuard Reference Card

- -

Usage

- -java -jar proguard.jar options ... -

-  Typically: -

-java -jar proguard.jar @myconfig.pro -

- -

Options

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@filenameShort for '-include filename'.
-include - filenameRead configuration options from the given file.
-basedirectory - directorynameSpecifies the base directory for subsequent relative file names.
-injars - class_pathSpecifies the program jars (or wars, ears, zips, or directories).
-outjars - class_pathSpecifies the names of the output jars (or wars, ears, zips, or - directories).
-libraryjars - class_pathSpecifies the library jars (or wars, ears, zips, or directories).
-skipnonpubliclibraryclassesIgnore non-public library classes.
-dontskipnonpubliclibraryclassesDon't ignore non-public library classes (the default).
-dontskipnonpubliclibraryclassmembersDon't ignore package visible library class members.
-keepdirectories - [directory_filter]Keep the specified directories in the output jars (or wars, ears, zips, or - directories).
-target - versionSet the given version number in the processed classes.
-forceprocessingProcess the input, even if the output seems up to date.
-keep - [,modifier,...] - class_specificationPreserve the specified classes and class members.
-keepclassmembers - [,modifier,...] - class_specificationPreserve the specified class members, if their classes are preserved as - well.
-keepclasseswithmembers - [,modifier,...] - class_specificationPreserve the specified classes and class members, if all of the - specified class members are present.
-keepnames - class_specificationPreserve the names of the specified classes and class members (if - they aren't removed in the shrinking step).
-keepclassmembernames - class_specificationPreserve the names of the specified class members (if they aren't removed - in the shrinking step).
-keepclasseswithmembernames - class_specificationPreserve the names of the specified classes and class members, if - all of the specified class members are present (after the shrinking - step).
-if - class_specificationSpecify classes and class members that must be present to activate the - subsequent keep option.
-printseeds - [filename]List classes and class members matched by the various -keep - options, to the standard output or to the given file.
-dontshrinkDon't shrink the input class files.
-printusage - [filename]List dead code of the input class files, to the standard output or to the - given file.
-whyareyoukeeping - class_specificationPrint details on why the given classes and class members are being kept in - the shrinking step.
-dontoptimizeDon't optimize the input class files.
-optimizations - optimization_filterThe optimizations to be enabled and disabled.
-optimizationpasses - nThe number of optimization passes to be performed.
-assumenosideeffects - class_specificationAssume that the specified methods don't have any side effects, while - optimizing.
-assumenoexternalsideeffects - class_specificationAssume that the specified methods don't have any external side effects, - while optimizing.
-assumenoescapingparameters - class_specificationAssume that the specified methods don't let any reference parameters - escape to the heap, while optimizing.
-assumenoexternalreturnvalues - class_specificationAssume that the specified methods don't return any external reference - values, while optimizing.
-allowaccessmodificationAllow the access modifiers of classes and class members to be modified, - while optimizing.
-mergeinterfacesaggressivelyAllow any interfaces to be merged, while optimizing.
-dontobfuscateDon't obfuscate the input class files.
-printmapping - [filename]Print the mapping from old names to new names for classes and class members - that have been renamed, to the standard output or to the given file.
-applymapping - filenameReuse the given mapping, for incremental obfuscation.
-obfuscationdictionary - filenameUse the words in the given text file as obfuscated field names and method names.
-classobfuscationdictionary - filenameUse the words in the given text file as obfuscated class names.
-packageobfuscationdictionary - filenameUse the words in the given text file as obfuscated package names.
-overloadaggressivelyApply aggressive overloading while obfuscating.
-useuniqueclassmembernamesEnsure uniform obfuscated class member names for subsequent incremental - obfuscation.
-dontusemixedcaseclassnamesDon't generate mixed-case class names while obfuscating.
-keeppackagenames - [package_filter]Keep the specified package names from being obfuscated.
-flattenpackagehierarchy - [package_name]Repackage all packages that are renamed into the single given parent - package.
-repackageclasses - [package_name]Repackage all class files that are renamed into the single given - package.
-keepattributes - [attribute_filter]Preserve the given optional attributes; typically - Exceptions, InnerClasses, - Signature, Deprecated, - SourceFile, SourceDir, - LineNumberTable, - LocalVariableTable, LocalVariableTypeTable, - Synthetic, EnclosingMethod, and - *Annotation*.
-keepparameternamesKeep the parameter names and types of methods that are kept.
-renamesourcefileattribute - [string]Put the given constant string in the SourceFile - attributes.
-adaptclassstrings - [class_filter]Adapt string constants in the specified classes, based on the obfuscated - names of any corresponding classes.
-adaptresourcefilenames - [file_filter]Rename the specified resource files, based on the obfuscated names of the - corresponding class files.
-adaptresourcefilecontents - [file_filter]Update the contents of the specified resource files, based on the - obfuscated names of the processed classes.
-dontpreverifyDon't preverify the processed class files.
-microeditionTarget the processed class files at Java Micro Edition.
-androidTarget the processed class files at Android.
-verboseWrite out some more information during processing.
-dontnote - [class_filter]Don't print notes about potential mistakes or omissions in the - configuration.
-dontwarn - [class_filter]Don't warn about unresolved references at all.
-ignorewarningsPrint warnings about unresolved references, but continue processing - anyhow.
-printconfiguration - [filename]Write out the entire configuration in traditional ProGuard style, to the - standard output or to the given file.
-dump - [filename]Write out the internal structure of the processed class files, to the - standard output or to the given file.
-addconfigurationdebuggingInstrument the processed code with debugging statements that print out - suggestions for missing ProGuard configuration.
-

-Notes: -

    - -
  • class_path is a list of jars, wars, ears, zips, and directories, - with optional filters, separated by path separators.
  • -
  • filename can contain Java system properties delimited by - '<' and '>'.
  • -
  • If filename contains special characters, the entire name - should be quoted with single or double quotes.
  • -
-

- -

Overview of Keep Options

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeepFrom being removed or renamedFrom being renamed
Classes and class members-keep-keepnames
Class members only-keepclassmembers-keepclassmembernames
Classes and class members, if class members present-keepclasseswithmembers-keepclasseswithmembernames
-

- -

Keep Option Modifiers

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
includedescriptorclassesAlso keep any classes in the descriptors of specified fields and - methods.
includecodeAlso keep the code of the specified methods unchanged.
allowshrinkingAllow the specified entry points to be removed in the shrinking step.
allowoptimizationAllow the specified entry points to be modified in the optimization - step.
allowobfuscationAllow the specified entry points to be renamed in the obfuscation step.
-

- -

Class Specifications

- -
-[@annotationtype] [[!]public|final|abstract ...] [!]interface|class classname
-    [extends|implements [@annotationtype] classname]
-[{
-    [@annotationtype] [[!]public|private|protected|static|volatile|transient ...] <fields> |
-                                                                      (fieldtype fieldname);
-    [@annotationtype] [[!]public|private|protected|static|synchronized|native|abstract|strictfp ...] <methods> |
-                                                                                           <init>(argumenttype,...) |
-                                                                                           classname(argumenttype,...) |
-                                                                                           (returntype methodname(argumenttype,...));
-    [@annotationtype] [[!]public|private|protected|static ... ] *;
-    ...
-}]
-
-

-Notes: -

    -
  • Class names must always be fully qualified, i.e. including their package - names.
  • -
  • Types in classname, annotationtype, returntype, and - argumenttype can contain wildcards: '?' for a - single character, '*' for any number of characters - (but not the package separator), '**' for any number - of (any) characters, '%' for any primitive type, - '***' for any type, '...' for - any number of arguments, and '<n>' - for the n'th matched wildcard in the same option.
  • -
  • fieldname and methodname can contain wildcards as well: - '?' for a single character and '*' - for any number of characters.
  • -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/retrace/examples.html b/tools/proguard/proguard6.0.3/docs/manual/retrace/examples.html deleted file mode 100644 index 5ccb07f4..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/retrace/examples.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - -ReTrace Examples - - - - - - -

Examples

- -Some typical example uses: -
    -
  1. Restoring a stack trace with line numbers
  2. -
  3. Restoring a stack trace with line numbers - (verbose)
  4. -
  5. Restoring a stack trace without line numbers
  6. -
- -

Restoring a stack trace with line numbers

- -Assume for instance ProGuard itself has been obfuscated using the following -extra options: -
--printmapping mapping.txt
-
--renamesourcefileattribute MyApplication
--keepattributes SourceFile,LineNumberTable
-
-

- -Now assume the processed application throws an exception: -

-java.io.IOException: Can't read [dummy.jar] (No such file or directory)
-	at proguard.y.a(MyApplication:188)
-	at proguard.y.a(MyApplication:158)
-	at proguard.y.a(MyApplication:136)
-	at proguard.y.a(MyApplication:66)
-	at proguard.ProGuard.c(MyApplication:218)
-	at proguard.ProGuard.a(MyApplication:82)
-	at proguard.ProGuard.main(MyApplication:538)
-Caused by: java.io.IOException: No such file or directory
-	at proguard.d.q.a(MyApplication:50)
-	at proguard.y.a(MyApplication:184)
-	... 6 more
-
-

- -If we have saved the stack trace in a file stacktrace.txt, we can -use the following command to recover the stack trace: -

-java -jar retrace.jar mapping.txt stacktrace.txt
-
-

- -The output will correspond to the original stack trace: -

-java.io.IOException: Can't read [dummy.jar] (No such file or directory)
-	at proguard.InputReader.readInput(InputReader.java:188)
-	at proguard.InputReader.readInput(InputReader.java:158)
-	at proguard.InputReader.readInput(InputReader.java:136)
-	at proguard.InputReader.execute(InputReader.java:66)
-	at proguard.ProGuard.readInput(ProGuard.java:218)
-	at proguard.ProGuard.execute(ProGuard.java:82)
-	at proguard.ProGuard.main(ProGuard.java:538)
-Caused by: java.io.IOException: No such file or directory
-	at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:50)
-	at proguard.InputReader.readInput(InputReader.java:184)
-	... 6 more
-
- -

Restoring a stack trace with line numbers (verbose)

- -In the previous example, we could also use the verbose flag: -
-java -jar retrace.jar -verbose mapping.txt stacktrace.txt
-
-

- -The output will then look as follows: -

-java.io.IOException: Can't read [dummy.jar] (No such file or directory)
-	at proguard.InputReader.void readInput(java.lang.String,proguard.ClassPathEntry,proguard.io.DataEntryReader)(InputReader.java:188)
-	at proguard.InputReader.void readInput(java.lang.String,proguard.ClassPath,int,int,proguard.io.DataEntryReader)(InputReader.java:158)
-	at proguard.InputReader.void readInput(java.lang.String,proguard.ClassPath,proguard.io.DataEntryReader)(InputReader.java:136)
-	at proguard.InputReader.void execute(proguard.classfile.ClassPool,proguard.classfile.ClassPool)(InputReader.java:66)
-	at proguard.ProGuard.void readInput()(ProGuard.java:218)
-	at proguard.ProGuard.void execute()(ProGuard.java:82)
-	at proguard.ProGuard.void main(java.lang.String[])(ProGuard.java:538)
-Caused by: java.io.IOException: No such file or directory
-	at proguard.io.DirectoryPump.void pumpDataEntries(proguard.io.DataEntryReader)(DirectoryPump.java:50)
-	at proguard.InputReader.void readInput(java.lang.String,proguard.ClassPathEntry,proguard.io.DataEntryReader)(InputReader.java:184)
-	... 6 more
-
- - -

Restoring a stack trace without line numbers

- -Assume for instance ProGuard itself has been obfuscated using the following -extra options, this time without preserving the line number tables: -
--printmapping mapping.txt
-
-

- -A stack trace stacktrace.txt will then lack line number -information, showing "Unknown source" instead: -

-java.io.IOException: Can't read [dummy.jar] (No such file or directory)
-	at proguard.y.a(Unknown Source)
-	at proguard.y.a(Unknown Source)
-	at proguard.y.a(Unknown Source)
-	at proguard.y.a(Unknown Source)
-	at proguard.ProGuard.c(Unknown Source)
-	at proguard.ProGuard.a(Unknown Source)
-	at proguard.ProGuard.main(Unknown Source)
-Caused by: java.io.IOException: No such file or directory
-	at proguard.d.q.a(Unknown Source)
-	... 7 more
-
-

- -We can still use the same command to recover the stack trace: -

-java -jar retrace.jar mapping.txt stacktrace.txt
-
-

- -The output will now list all alternative original method names for each -ambiguous obfuscated method name: -

-java.io.IOException: Can't read [dummy.jar] (No such file or directory)
-	at proguard.InputReader.execute(InputReader.java)
-	                        readInput(InputReader.java)
-	at proguard.InputReader.execute(InputReader.java)
-	                        readInput(InputReader.java)
-	at proguard.InputReader.execute(InputReader.java)
-	                        readInput(InputReader.java)
-	at proguard.InputReader.execute(InputReader.java)
-	                        readInput(InputReader.java)
-	at proguard.ProGuard.readInput(ProGuard.java)
-	at proguard.ProGuard.execute(ProGuard.java)
-	                     optimize(ProGuard.java)
-	                     createPrintStream(ProGuard.java)
-	                     closePrintStream(ProGuard.java)
-	                     fileName(ProGuard.java)
-	at proguard.ProGuard.main(ProGuard.java)
-Caused by: java.io.IOException: No such file or directory
-	at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java)
-	                             readFiles(DirectoryPump.java)
-
-

- -For instance, ReTrace can't tell if the method a corresponds -to execute or to readInput, so it lists both. You -need to figure it out based on your knowledge of the application. Having line -numbers and unambiguous names clearly is a lot easier, so you should consider -preserving the line numbers when you -obfuscate your application. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/manual/retrace/index.html b/tools/proguard/proguard6.0.3/docs/manual/retrace/index.html deleted file mode 100644 index f6f359a1..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/retrace/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -ReTrace Manual - - - -

ReTrace

- -
    -
  1. Introduction
  2. -
  3. Usage
  4. -
  5. Examples
  6. -
- -
- -
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/retrace/introduction.html b/tools/proguard/proguard6.0.3/docs/manual/retrace/introduction.html deleted file mode 100644 index 2fc49f13..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/retrace/introduction.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - -ReTrace Introduction - - - - - - -

Introduction

- -ReTrace is a companion tool for ProGuard that 'de-obfuscates' -stack traces. -

-When an obfuscated program throws an exception, the resulting stack trace -typically isn't very informative. Class names and method names have been -replaced by short meaningless strings. Source file names and line numbers are -missing altogether. While this may be intentional, it can also be inconvenient -when debugging problems. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Original code- ProGuardObfuscated code
Mapping file
Readable stack traceReTrace -Obfuscated stack trace
-

-ReTrace can read an obfuscated stack trace and restore it to what it would -look like without obfuscation. The restoration is based on the mapping file -that ProGuard can write out during obfuscation. The mapping file links the -original class names and class member names to their obfuscated names. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/manual/retrace/usage.html b/tools/proguard/proguard6.0.3/docs/manual/retrace/usage.html deleted file mode 100644 index d7a28517..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/retrace/usage.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - -ReTrace Usage - - - - - - -

Usage

- -You can find the ReTrace jar in the lib directory of the -ProGuard distribution. To run ReTrace, just type: -

-

-java -jar retrace.jar [options...] - mapping_file [stacktrace_file] -

-Alternatively, the bin directory contains some short Linux and -Windows scripts containing this command. These are the arguments: - -
-
mapping_file
- -
Specifies the name of the mapping file, produced by ProGuard with the - option - "-printmapping mapping_file", - while obfuscating the application that produced the stack trace.
- -
stacktrace_file
- -
Optionally specifies the name of the file containing the stack trace. If - no file is specified, a stack trace is read from the standard input. Blank - lines and unrecognized lines are ignored, as far as possible.
-
- -The following options are supported: -
-
-verbose
- -
Specifies to print out more informative stack traces that include not only - method names, but also method return types and arguments.
- -
-regex regular_expression
- -
Specifies the regular expression that is used to parse the lines in the - stack trace. Specifying a different regular expression allows to - de-obfuscate more general types of input than just stack traces. The - default is suitable for stack traces produced by most JVMs: -
-(?:.*?\bat\s+%c\.%m\s*\(%s(?::%l)?\)\s*(?:~\[.*\])?)|(?:(?:.*?[:"]\s+)?%c(?::.*)?)
-    
- The regular expression is a Java regular expression (cfr. the documentation - of java.util.regex.Pattern), with a few additional wildcards: - - - - - - - - - - - - - - - - - -
%cmatches a class name (e.g. - "myapplication.MyClass").
%Cmatches a class name with slashes (e.g. - "myapplication/MyClass").
%tmatches a field type or method return type (e.g. - "myapplication.MyClass[]").
%fmatches a field name (e.g. - "myField").
%mmatches a method name (e.g. - "myMethod").
%amatches a list of method arguments (e.g. - "boolean,int").
%smatches a source file name (e.g. - "MyClass.java").
%lmatches a line number inside a method (e.g. - "123").
- Elements that match these wildcards are de-obfuscated, when possible. Note - that regular expressions must not contain any capturing groups. Use - non-capturing groups instead: (?:...) -

- The default expression for instance matches the following lines: -

-Exception in thread "main" myapplication.MyException: Some message
-        at myapplication.MyClass.myMethod(SourceFile:123)
-    
-
-
- -The restored stack trace is printed to the standard output. The completeness -of the restored stack trace depends on the presence of line number tables in -the obfuscated class files: - -
    -
  • If all line numbers have been preserved while obfuscating the application, - ReTrace will be able to restore the stack trace completely.
  • - -
  • If the line numbers have been removed, mapping obfuscated method names - back to their original names has become ambiguous. Retrace will list all - possible original method names for each line in the stack trace. The user - can then try to deduce the actual stack trace manually, based on the logic - of the program.
  • - -
-

- -Preserving line number tables is explained in detail in this example in the ProGuard User Manual. -

- -Source file names are currently restored based on the names of the outer-most -classes. If you prefer to keep the obfuscated name, you can -replace %s in the default regular expression by .* -

- -Unobfuscated elements and obfuscated elements for which no mapping is available -will be left unchanged. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/manual/sections.html b/tools/proguard/proguard6.0.3/docs/manual/sections.html deleted file mode 100644 index 1b04ed63..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/sections.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -Sections - - - - - -

-

-More Android code protection: -

- -DexGuard - -

-With support of - -

- -GuardSquare - -

- -SourceForge - -

- - - diff --git a/tools/proguard/proguard6.0.3/docs/manual/style.css b/tools/proguard/proguard6.0.3/docs/manual/style.css deleted file mode 100644 index 415b8ef3..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/style.css +++ /dev/null @@ -1,184 +0,0 @@ -@charset "iso-8859-1"; - -/* Fonts. */ - -@font-face -{ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url('fonts/OpenSans-Regular.eot'); - src: local('Open Sans'), - local('OpenSans'), - url('fonts/OpenSans-Regular.eot?#iefix') format('embedded-opentype'), - url('fonts/OpenSans-Regular.woff') format('woff'), - url('fonts/OpenSans-Regular.ttf') format('truetype'), - url('fonts/OpenSans-Regular.svg#OpenSansRegular') format('svg'); -} - -@font-face -{ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: url('fonts/OpenSans-Bold.eot'); - src: local('Open Sans Bold'), - local('OpenSans-Bold'), - url('fonts/OpenSans-Bold.eot?#iefix') format('embedded-opentype'), - url('fonts/OpenSans-Bold.woff') format('woff'), - url('fonts/OpenSans-Bold.ttf') format('truetype'), - url('fonts/OpenSans-Bold.svg#OpenSansBold') format('svg'); -} - -@font-face -{ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: url('fonts/OpenSans-Italic.eot'); - src: local('Open Sans Italic'), - local('OpenSans-Italic'), - url('fonts/OpenSans-Italic.eot?#iefix') format('embedded-opentype'), - url('fonts/OpenSans-Italic.woff') format('woff'), - url('fonts/OpenSans-Italic.ttf') format('truetype'), - url('fonts/OpenSans-Italic.svg#OpenSansItalic') format('svg'); -} - -/* Global settings. */ - -body -{ - background: #FFFFFF; - font-family: "Open Sans",Verdana,sans-serif; -} - -h1 -{ - text-align: center; -} - -h2 -{ - background: #EEEEFF; - padding: 10px; -} - -dt -{ - padding: 6px; -} - -dt div -{ - color: grey; - float: right; -} - -dd -{ - padding: 6px; -} - -pre -{ - padding: 10px; - background: #E0E0E0; -} - -.spacious li -{ - padding: 8px; -} - -.shifted li -{ - margin-left: 50px; -} - -img.float -{ - float: left; -} - -a -{ - text-decoration: none; -} - -a.button -{ - color: #000000; - text-decoration: none; - background: #E0E0E0; - border: 1px outset #FFFFFF; - float: right; -} - -a.largebutton { - font-weight: bold; - color: #000000; - margin: 0px; - padding: 10px; - background: #D0D0D0; - text-decoration: none; - border: 1px outset #FFFFFF; -} - -/* Settings for variable width code. */ - -p.code -{ - padding: 10px; - background: #E0E0E0; -} - - -/* Settings for diagrams. */ - -table.diagram -{ - padding: 8px; - border: none; - border-spacing: 2px; -} - -td.transparentblock -{ - text-align: center; - padding: 10px 0px; -} - -td.whiteblock -{ - width: 100px; - text-align: center; - border: 1px solid #C0C0C0; - background: #E0E0E0; - padding: 10px 0px; -} - -td.lightblock -{ - width: 100px; - text-align: center; - border: 1px solid #8888FF; - background: #BBBBFF; - padding: 20px 0px; -} - -td.darkblock -{ - width: 100px; - text-align: center; - background: #8888FF; - padding: 20px 0px; -} - -/* Settings for buttons. */ - -td.button -{ - background: #E0E0E0; - border: 1px outset #FFFFFF; - font-weight: bold; -} diff --git a/tools/proguard/proguard6.0.3/docs/manual/troubleshooting.html b/tools/proguard/proguard6.0.3/docs/manual/troubleshooting.html deleted file mode 100644 index cd7119e5..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/troubleshooting.html +++ /dev/null @@ -1,943 +0,0 @@ - - - - - - -ProGuard Troubleshooting - - - - - - -

Troubleshooting

- -While preparing a configuration for processing your code, you may bump into a -few problems. The following sections discuss some common issues and solutions: - -

Problems while processing

- - -

Unexpected observations after processing

- - -

Problems while converting to Android Dalvik bytecode

- - - -

Problems while preverifying for Java Micro Edition

- - - -

Problems at run-time

- - - -

Problems while processing

- -ProGuard may print out some notes and non-fatal warnings: - -
-
Note: can't find dynamically referenced class ...
- -
ProGuard can't find a class or interface that your code is accessing by - means of introspection. You should consider adding the jar that contains - this class.
- -
Note: ... calls '(...)Class.forName(variable).newInstance()'
- -
Your code uses reflection to dynamically create class instances, with a - construct like - "(MyClass)Class.forName(variable).newInstance()". Depending - on your application, you may need to keep the mentioned classes with an - option like "-keep class MyClass", or their implementations - with an option like "-keep class * implements MyClass". You - can switch off these notes by specifying the - -dontnote option.
- -
Note: ... accesses a field/method '...' dynamically
- -
Your code uses reflection to find a fields or a method, with a construct - like ".getField("myField")". Depending on your application, - you may need to figure out where the mentioned class members are defined - and keep them with an option like "-keep class MyClass { MyFieldType - myField; }". Otherwise, ProGuard might remove or obfuscate the - class members, since it can't know which ones they are exactly. It does - list possible candidates, for your information. You can switch off these - notes by specifying - the -dontnote option.
- -
Note: ... calls 'Class.get...', 'Field.get...', or 'Method.get...'
-
Your code uses reflection to access metadata from the code, with an - invocation like "class.getAnnotations()". You then generally - need to preserve optional class file - attributes, which ProGuard removes by default. The attributes contain - information about annotations, enclosing classes, enclosing methods, etc. - In a summary in the log, ProGuard provides a suggested configuration, - like -keepattributes - *Annotation*. If you're sure the attributes are not necessary, - you can switch off these notes by specifying - the -dontnote option.
- -
Note: the configuration refers to the unknown class '...'
- -
Your configuration refers to the name of a class that is not present in - the program jars or library jars. You should check whether the name is - correct. Notably, you should make sure that you always specify - fully-qualified names, not forgetting the package names.
- -
Note: the configuration keeps the entry point '...', but not the descriptor class '...'
- -
Your configuration contains a -keep option to preserve the - given method (or field), but no -keep option for the given - class that is an argument type or return type in the method's descriptor. - You may then want to keep the class too. Otherwise, ProGuard will - obfuscate its name, thus changing the method's signature. The method might - then become unfindable as an entry point, e.g. if it is part of a public - API. You can automatically keep such descriptor classes with - the -keep option modifier - includedescriptorclasses - (-keep,includedescriptorclasses ...). You can switch off - these notes by specifying - the -dontnote option.
- -
Note: the configuration explicitly specifies '...' to keep library class '...'
- -
Your configuration contains a -keep option to preserve the - given library class. However, you don't need to keep any library classes. - ProGuard always leaves underlying libraries unchanged. You can switch off - these notes by specifying the - -dontnote option.
- -
Note: the configuration doesn't specify which class members to keep for class '...'
- -
Your configuration contains a - -keepclassmembers/-keepclasseswithmembers - option to preserve fields or methods in the given class, but it doesn't - specify which fields or methods. This way, the option simply won't have - any effect. You probably want to specify one or more fields or methods, as - usual between curly braces. You can specify all fields or methods with a - wildcard "*;". You should also consider if you just need the - more common -keep option, which - preserves all specified classes and class members. - The overview of all keep - options can help. You can switch off these notes by specifying - the -dontnote option.
- -
Note: the configuration specifies that none of the methods of class '...' have any side effects
- -
Your configuration contains an option - -assumenosideeffects - to indicate that the specified methods don't have any side effects. - However, the configuration tries to match all methods, by using a - wildcard like "*;". This includes methods - from java.lang.Object, such as wait() and - notify(). Removing invocations of those methods will most - likely break your application. You should list the methods without side - effects more conservatively. You can switch off these notes by specifying - the -dontnote option.
- -
Note: duplicate definition of program/library class
- -
Your program jars or library jars contain multiple definitions of the - listed classes. ProGuard continues processing as usual, only considering - the first definitions. The warning may be an indication of some problem - though, so it's advisable to remove the duplicates. A convenient way to do - so is by specifying filters on the input jars or library jars. You can - switch off these notes by specifying the -dontnote option. -

- android The standard Android build process automatically - specifies the input jars for you. There may not be an easy way to filter - them to remove these notes. You could remove the duplicate classes - manually from your libraries. You should never explicitly specify the - input jars yourself (with -injars or - -libraryjars), since you'll then get duplicate definitions. - You should also not add libraries to your application that are already - part of the Android run-time (notably org.w3c.dom, - org.xml.sax, org.xmlpull.v1, - org.apache.commons.logging.Log, org.apache.http, - and org.json). They are possibly inconsistent, and the - run-time libraries would get precedence anyway.

- -
Warning: can't write resource ... Duplicate zip entry
- -
Your input jars contain multiple resource files with the same name. - ProGuard continues copying the resource files as usual, skipping any files - with previously used names. Once more, the warning may be an indication of - some problem though, so it's advisable to remove the duplicates. A - convenient way to do so is by specifying filters on the input jars. There - is no option to switch off these warnings. -

- android The standard Android build process automatically - specifies the input jars for you. There may not be an easy way to filter - them to remove these warnings. You could remove the duplicate resource files - manually from the input and the libraries.

- -
-

- -ProGuard may terminate when it encounters parsing errors or I/O errors, or -some more serious warnings: - -

-
Warning: can't find superclass or interface
Warning: can't find referenced class
- -
A class in one of your program jars or library jars is referring to a - class or interface that is missing from the input. The warning lists both - the referencing class(es) and the missing referenced class(es). There can - be a few reasons, with their own solutions: -

-

    -
  1. If the missing class is referenced from your own code, you may have - forgotten to specify an essential library. Just like when compiling - all code from scratch, you must specify all libraries that the code is - referencing, directly or indirectly. If the library should be - processed and included in the output, you should specify it with - -injars, otherwise you - should specify it with - -libraryjars. -

    - For example, if ProGuard complains that it can't find a - java.lang class, you have to make sure that you are - specifying the run-time library of your platform. For JSE, these are - typically packaged in lib/rt.jar (vm.jar for - IBM's JVM, and classes.jar in MacOS X). Other platforms - like JME and Android have their own run-time libraries. - The examples section provides more details - for the various platforms. -

    - If ProGuard still complains that it can't find a - javax.crypto class, you probably still have to specify - jce.jar, next to the more common rt.jar.

  2. -
  3. If the missing class is referenced from a pre-compiled third-party - library, and your original code runs fine without it, then the missing - dependency doesn't seem to hurt. The cleanest solution is to - filter out the referencing - class or classes from the input, with a filter like "-libraryjars - mylibrary.jar(!somepackage/SomeUnusedReferencingClass.class)". - ProGuard will then skip this class entirely in the input, and it will - not bump into the problem of its missing reference. However, you may - then have to filter out other classes that are in turn referencing the - removed class. In practice, this works best if you can filter out - entire unused packages at once, with a wildcard filter like - "-libraryjars - mylibrary.jar(!someunusedpackage/**)".

  4. -
  5. If you don't feel like filtering out the problematic classes, you can - try your luck with the -ignorewarnings - option, or even - the -dontwarn option. - Only use these options if you really know what you're doing though.
  6. -
-

- android The standard Android build process automatically - specifies the input jars for you. Unfortunately, many pre-compiled - third-party libraries refer to other libraries that are not actually used - and therefore not present. This works fine in debug builds, but in release - builds, ProGuard expects all libraries, so it can perform a proper static - analysis. For example, if ProGuard complains that it can't find - a java.awt class, then some library that you are using is - referring to java.awt. This is a bit shady, since Android - doesn't have this package at all, but if your application works anyway, - you can let ProGuard accept it with "-dontwarn java.awt.**", - for instance. -

- If the missing class is an Android run-time class, you should make sure - that you are building against an Android run-time that is sufficiently - recent. You may need to change the build target in your - project.properties file or build.gradle file to - that recent version. You can still specify a different - minSdkVersion and a different targetSdkVersion - in your AndroidManifest.xml file.

- -
Error: Can't find any super classes of ... (not even immediate super class ...)
Error: Can't find common super class of ... and ...
- -
It seems like you tried to avoid the warnings from the previous paragraph - by specifying - -ignorewarnings - or -dontwarn, but it didn't - work out. ProGuard's optimization step and preverification step really - need the missing classes to make sense of the code. Preferably, you would - solve the problem by adding the missing library, as discussed. If you're - sure the class that references the missing class isn't used either, you - could also try filtering it out from the input, by adding a filter to the - corresponding -injars option: - "-injars - myapplication.jar(!somepackage/SomeUnusedClass.class)". As a final - solution, you could switch off optimization - (-dontoptimize) and - preverification - (-dontpreverify).
- -
Warning: can't find referenced field/method '...' in program class ...
- -
A program class is referring to a field or a method that is missing from - another program class. The warning lists both the referencing class and - the missing referenced class member. Your compiled class files are most - likely inconsistent. Possibly, some class file didn't get recompiled - properly, or some class file was left behind after its source file was - removed. Try removing all compiled class files and rebuilding your - project.
- -
Warning: can't find referenced field/method '...' in library class ...
- -
A program class is referring to a field or a method that is missing from a - library class. The warning lists both the referencing class and the - missing referenced class member. Your compiled class files are - inconsistent with the libraries. You may need to recompile the class - files, or otherwise upgrade the libraries to consistent versions. -

- android If you're developing for Android and ProGuard complains - that it can't find a method that is only available in a recent version of - the Android run-time, you should change the build target in your - project.properties file or build.gradle file to - that recent version. You can still specify a different - minSdkVersion and a different targetSdkVersion - in your AndroidManifest.xml file. -

- Alternatively, you may get away with ignoring the inconsistency with the - options - -ignorewarnings or - even - -dontwarn. For instance, you - can specify "-dontwarn com.example.MyInconsistentClass". -

- Finally, should your program classes reside in the same packages as - library classes and should they refer to their package visible class - members, then you should also specify the - -dontskipnonpubliclibraryclassmembers - option.

- -
Warning: can't find enclosing class/method
- -
If there are unresolved references to classes that are defined inside - methods in your input, once more, your compiled class files are most likely - inconsistent. Possibly, some class file didn't get recompiled properly, or - some class file was left behind after its source file was removed. Try - removing all compiled class files and rebuilding your project.
- -
Warning: library class ... depends on program class ...
- -
If any of your library classes depend on your program classes, by - extending, implementing or just referencing them, your processed code will - generally be unusable. Program classes can depend on library classes, but - not the other way around. Program classes are processed, while library - classes always remain unchanged. It is therefore impossible to adapt - references from library classes to program classes, for instance if the - program classes are renamed. You should define a clean separation between - program code (specified with -injars) and library code - (specified with -libraryjars), and try - again. -

- android In Android development, sloppy libraries may contain - duplicates of classes that are already present in the Android run-time - (notably org.w3c.dom, org.xml.sax, - org.xmlpull.v1, org.apache.commons.logging.Log, - org.apache.http, and org.json). You must remove - these classes from your libraries, since they are possibly inconsistent, - and the run-time libraries would get precedence anyway.

- -
Warning: class file ... unexpectedly contains class ...
- -
The given class file contains a definition for the given class, but the - directory name of the file doesn't correspond to the package name of the - class. ProGuard will accept the class definition, but the current - implementation will not write out the processed version. Please make sure - your input classes are packaged correctly. Notably, class files that are - in the WEB-INF/classes directory in a war should be packaged - in a jar and put in the WEB-INF/lib directory. If you don't - mind these classes not being written to the output, you can specify the -ignorewarnings option, - or even the -dontwarn - option.
- -
Warning: ... is not being kept as ..., but remapped to ...
- -
There is a conflict between a -keep option in the - configuration, and the mapping file, in the obfuscation step. The given - class name or class member name can't be kept by its original name, as - specified in the configuration, but it has to be mapped to the other given - name, as specified in the mapping file. You should adapt your - configuration or your mapping file to remove the conflict. Alternatively, - if you're sure the renaming won't hurt, you can specify the -ignorewarnings option, - or even the -dontwarn - option.
- -
Warning: field/method ... can't be mapped to ...
- -
There is a conflict between some new program code and the mapping file, in - the obfuscation step. The given class member can't be mapped to the given - name, because it would conflict with another class member that is already - being mapped to the same name. This can happen if you are performing - incremental obfuscation, applying an obfuscation mapping file from an - initial obfuscation step. For instance, some new class may have been added - that extends two existing classes, introducing a conflict in the name - space of its class members. If you're sure the class member receiving - another name than the one specified won't hurt, you can specify the -ignorewarnings option, - or even the -dontwarn - option. Note that you should always use the -useuniqueclassmembernames - option in the initial obfuscation step, in order to reduce the risk of - conflicts.
- -
Error: Unsupported class version number
- -
You are trying to process class files compiled for a recent version of - Java that your copy of ProGuard doesn't support yet. You - should check - on-line if there is a more recent release.
- -
Error: You have to specify '-keep' options
- -
You either forgot to specify -keep options, or you mistyped the - class names. ProGuard has to know exactly what you want to keep: an - application, an applet, a servlet, a midlet,..., or any combination of - these. Without the proper seed specifications, ProGuard would shrink, - optimize, or obfuscate all class files away.
- -
Error: Expecting class path separator ';' before 'Files\Java\...' (in Windows)
- -
If the path of your run-time jar contains spaces, like in "Program Files", - you have to enclose it with single or double quotes, as explained in the - section on file names. This is actually - true for all file names containing special characters, on all - platforms.
- -
Error: Can't read [.../lib/rt.jar] (No such file or directory) (in MacOS X)
- -
In MacOS X, the run-time classes may be in a different place than on most - other platforms. You'll then have to adapt your configuration, replacing - the path <java.home>/lib/rt.jar by - <java.home>/../Classes/classes.jar.
- -
Error: Can't read ...
- -
ProGuard can't read the specified file or directory. Double-check that the - name is correct in your configuration, that the file is readable, and that - it is not corrupt. An additional message "Unexpected end of ZLIB input - stream" suggests that the file is truncated. You should then make sure - that the file is complete on disk when ProGuard starts (asynchronous - copying? unflushed buffer or cache?), and that it is not somehow - overwritten by ProGuard's own output.
- -
Error: Can't write ...
- -
ProGuard can't write the specified file or directory. Double-check that - the name is correct in your configuration and that the file is - writable.
- -
Internal problem starting the ProGuard GUI (Cannot write XdndAware property) (in Linux)
- -
In Linux, at least with Java 6, the GUI may not start properly, due to - Sun - Bug #7027598. The work-around at this time is to specify the JVM - option -DsuppressSwingDropSupport=true when running the - GUI.
- -
-

- -Should ProGuard crash while processing your application: - -

-
OutOfMemoryError
- -
You can try increasing the heap size of the Java virtual machine, with the - usual -Xmx option: -
    -
  • In Java, specify the option as an argument to the JVM: java - -Xmx1024m ... -
  • In Ant, set the environment variable ANT_OPTS=-Xmx1024m -
  • In Gradle, set the environment variable - GRADLE_OPTS=-Xmx1024m -
  • In Maven, set the environment variable - MAVEN_OPTS=-Xmx1024m -
  • In Eclipse, add the line -Xmx1024m to the file - eclipse.ini inside your Eclipse install. -
- You can also reduce the amount of memory that ProGuard needs by removing - unnecessary library jars from your configuration, or by filtering out - unused library packages and classes.
- -
StackOverflowError
- -
This error might occur when processing a large code base on Windows - (surprisingly, not so easily on Linux). In theory, increasing the stack - size of the Java virtual machine (with the usual -Xss option) - should help too. In practice however, the -Xss setting - doesn't have any effect on the main thread, due to Sun Bug - #4362291. As a result, this solution will only work when running - ProGuard in a different thread, e.g. from its GUI.
- -
Unexpected error
- -
ProGuard has encountered an unexpected condition, typically in the - optimization step. It may or may not recover. You should be able to avoid - it using the -dontoptimize option. In - any case, please report the problem, preferably with the simplest example - that causes ProGuard to crash.
- -
Otherwise...
- -
Maybe your class files are corrupt. See if recompiling them and trying - again helps. If not, please report the problem, preferably with the - simplest example that causes ProGuard to crash.
- -
-

- -

Unexpected observations after processing

- -If ProGuard seems to run fine, but your processed code doesn't look right, -there might be a couple of reasons: - -
-
Disappearing classes
- -
If you are working on Windows and it looks like some classes have - disappeared from your output, you should make sure you're not writing your - output class files to a directory (or unpacking the output jar). On - platforms with case-insensitive file systems, such as Windows, unpacking - tools often let class files with similar lower-case and upper-case names - overwrite each other. If you really can't switch to a different operating - system, you could consider using ProGuard's -dontusemixedcaseclassnames - option. -

- Also, you should make sure your class files are in directories that - correspond to their package names. ProGuard will read misplaced class - files, but it will currently not write their processed versions. Notably, - class files that are in the WEB-INF/classes directory in a - war should be packaged in a jar and put in the WEB-INF/lib - directory.

- -
Classes or class members not being kept
- -
If ProGuard is not keeping the right classes or class members, make sure - you are using fully qualified class names. If the package name of some - class is missing, ProGuard won't match the elements that you might be - expecting. It may help to double-check for typos too. You can use the -printseeds option to see - which elements are being kept exactly. -

- If you are using marker interfaces to keep other classes, the marker - interfaces themselves are probably being removed in the shrinking step. - You should therefore always explicitly keep any marker interfaces, with - an option like "-keep interface MyMarkerInterface". -

- Similarly, if you are keeping classes based on annotations, you may have - to avoid that the annotation classes themselves are removed in the - shrinking step. You should package the annotation classes as a library, or - explicitly keep them in your program code with an option like "-keep - @interface *".

- -
Variable names not being obfuscated
- -
If the names of the local variables and parameters in your obfuscated code - don't look obfuscated, because they suspiciously resemble the names of - their types, it's probably because the decompiler that you are using is - coming up with those names. ProGuard's obfuscation step does remove the - original names entirely, unless you explicitly keep the - LocalVariableTable or LocalVariableTypeTable - attributes.
- -
- -

Problems while converting to Android Dalvik bytecode

- -If ProGuard seems to run fine, but the dx tool in the Android SDK subsequently -fails with an error: - -
-
SimException: local variable type mismatch
- -
This error indicates that ProGuard's optimization step has not been able - to maintain the correct debug information about local variables. This can - happen if some code is optimized radically. Possible work-arounds: let the - java compiler not produce debug information (-g:none), or let - ProGuard's obfuscation step remove the debug information again - (by not keeping the attributes LocalVariableTable - and LocalVariableTypeTable - with -keepattributes), - or otherwise just disable optimization - (-dontoptimize).
- -
Conversion to Dalvik format failed with error 1
- -
This error may have various causes, but if dx is tripping over some code - processed by ProGuard, you should make sure that you are using the latest - version of ProGuard. You can just copy the ProGuard jars - to android-sdk/tools/proguard/lib. If that doesn't help, - please report the problem, preferably with the simplest example that still - brings out the error.
- -
- -

Problems while preverifying for Java Micro Edition

- -If ProGuard seems to run fine, but the external preverifier subsequently -produces errors, it's usually for a single reason: - -
-
InvalidClassException, class loading error, or verification error
- -
If you get any such message from the preverifier, you are probably working - on a platform with a case-insensitive file system, such as Windows. The - preverify tool always unpacks the jars, so class files with - similar lower-case and upper-case names overwrite each other. You can use - ProGuard's -dontusemixedcaseclassnames - option to work around this problem. -

- If the above doesn't help, there is probably a bug in the optimization - step of ProGuard. Make sure you are using the latest version. You should - be able to work around the problem by using the -dontoptimize option. You - can check the bug database to see if it is a known problem (often with a - fix). Otherwise, please report it, preferably with the simplest example on - which you can find ProGuard to fail.

- -
- -Note that it is no longer necessary to use an external preverifier. With the --microedition option, -ProGuard will preverify the class files for Java Micro Edition. -

- -

Problems at run-time

- -If ProGuard runs fine, but your processed application doesn't work, there -might be several reasons: - -
-
Stack traces without class names or line numbers
- -
If your stack traces don't contain any class names or lines numbers, - even though you are keeping the proper attributes, make sure this debugging - information is present in your compiled code to start with. Notably the Ant - javac task has debugging information switched off by default.
- -
NoClassDefFoundError
- -
Your class path is probably incorrect. It should at least contain all - library jars and, of course, your processed program jar.
- -
ClassNotFoundException
- -
Your code is probably calling Class.forName, trying to create - the missing class dynamically. ProGuard can only detect constant name - arguments, like Class.forName("com.example.MyClass"). For - variable name arguments like Class.forName(someClass), you - have to keep all possible classes using the appropriate - -keep option, e.g. "-keep - class com.example.MyClass" or "-keep class * implements - com.example.MyInterface". While setting up your configuration, you - can specify the option - -addconfigurationdebugging - to help track down these cases at run-time and let the instrumented code - suggest settings for them.
- -
NoSuchFieldException
- -
Your code is probably calling something like - myClass.getField, trying to find some field dynamically. - Since ProGuard can't always detect this automatically, you have to keep - the missing field in using the - appropriate -keep option, e.g. - "-keepclassmembers class com.example.MyClass { int myField; - }". While setting up your configuration, you can specify the option - -addconfigurationdebugging - to help track down these cases at run-time and let the instrumented code - suggest settings for them.
- -
NoSuchMethodException
- -
Your code is probably calling something like - myClass.getMethod, trying to find some method dynamically. - Since ProGuard can't always detect this automatically, you have to keep - the missing method in using the - appropriate -keep option, e.g. - "-keepclassmembers class com.example.MyClass { void myMethod(); - }". While setting up your configuration, you can specify the option - -addconfigurationdebugging - to help track down these cases at run-time and let the instrumented code - suggest settings for them. -

- More specifically, if the method reported as missing is - values or valueOf, you probably have to keep - some methods related to enumerations.

- -
MissingResourceException or NullPointerException
- -
Your processed code may be unable to find some resource files. ProGuard - simply copies resource files over from the input jars to the output jars. - Their names and contents remain unchanged, unless you specify the options - -adaptresourcefilenames - and/or -adaptresourcefilecontents. -

- Furthermore, directory entries in jar files aren't copied, unless you - specify the option -keepdirectories. - Note that Sun advises against calling Class.getResource() for - directories (Sun - Bug #4761949).

- -
Disappearing annotations
- -
By default, the obfuscation step removes all annotations. If your - application relies on annotations to function properly, you should - explicitly keep them with - -keepattributes - *Annotation*.
- -
Invalid or corrupt jarfile
- -
You are probably starting your application with the java option - -jar instead of the option -classpath. The java - virtual machine returns with this error message if your jar doesn't - contain a manifest file (META-INF/MANIFEST.MF), if the - manifest file doesn't specify a main class (Main-Class: ...), - or if the jar doesn't contain this main class. You should then make sure - that the input jar contains a valid manifest file to start with, that this - manifest file is the one that is copied (the first manifest file that is - encountered), and that the main class is kept in your configuration,
- -
InvalidJarIndexException: Invalid index
- -
At least one of your processed jar files contains an index file - META-INF/INDEX.LIST, listing all class files in the jar. - ProGuard by default copies files like these unchanged. ProGuard may however - remove or rename classes, thus invalidating the file. You should filter the - index file out of the input - (-injars in.jar(!META-INF/INDEX.LIST)) or update the file - after having applied ProGuard (jar -i out.jar). -
- -
InvalidClassException, class loading error, or verification error (in Java Micro Edition)
- -
If you get such an error in Java Micro Edition, you may have forgotten to - specify the -microedition option, so - the processed class files are preverified properly.
- -
Error: No Such Field or Method, Error verifying method (in a Java Micro Edition emulator)
- -
If you get such a message in a Motorola or Sony Ericsson phone emulator, - it's because these emulators don't like packageless classes and/or - overloaded fields and methods. You can work around it by not using the - options -repackageclasses - '' and -overloadaggressively. - If you're using the JME WTK plugin, you can adapt the configuration - proguard/wtk/default.pro that's inside the - proguard.jar.
- -
Failing midlets (on a Java Micro Edition device)
- -
If your midlet runs in an emulator and on some devices, but not on some - other devices, this is probably due to a bug in the latter devices. For - some older Motorola and Nokia phones, you might try specifying the -useuniqueclassmembernames - option. It avoids overloading class member names, which triggers a bug in - their java virtual machine. -

- You might also try using the -dontusemixedcaseclassnames - option. Even if the midlet has been properly processed and then - preverified on a case-sensitive file system, the device itself might not - like the mixed-case class names. Notably, the Nokia N-Gage emulator works - fine, but the actual device seems to exhibit this problem.

- -
Disappearing loops
- -
If your code contains empty busy-waiting loops, ProGuard's optimization - step may remove them. More specifically, this happens if a loop - continuously checks the value of a non-volatile field that is changed in a - different thread. The specifications of the Java Virtual Machine require - that you always mark fields that are accessed across different threads - without further synchronization as volatile. If this is not - possible for some reason, you'll have to switch off optimization using the - -dontoptimize - option.
- -
SecurityException: SHA1 digest error
- -
You may have forgotten to sign your program jar after having - processed it with ProGuard.
- -
ClassCastException: class not an enum, or
IllegalArgumentException: class not an enum type
- -
You should make sure you're preserving the special methods of enumeration - types, which the run-time environment calls by introspection. The required - options are shown in the examples.
- -
ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy
- -
You are probably processing annotations involving enumerations. Again, you - should make sure you're preserving the special methods of the enumeration - type, as shown in the examples.
- -
IllegalArgumentException: methods with same signature but incompatible return types
- -
You are probably running some code that has been obfuscated - with the -overloadaggressively - option. The class java.lang.reflect.Proxy can't handle - classes that contain methods with the same names and signatures, but - different return types. Its method newProxyInstance then - throws this exception. You can avoid the problem by not using the - option.
- -
CompilerError: duplicate addition
- -
You are probably compiling or running some code that has been obfuscated - with the -overloadaggressively - option. This option triggers a bug in - sun.tools.java.MethodSet.add in Sun's JDK 1.2.2, which is - used for (dynamic) compilation. You should then avoid this option.
- -
ClassFormatError: repetitive field name/signature
- -
You are probably processing some code that has been obfuscated before with - the -overloadaggressively - option. You should then use the same option again in the second processing - round.
- -
ClassFormatError: Invalid index in LocalVariableTable in class file
- -
If you are keeping the LocalVariableTable or - LocalVariableTypeTable attributes, ProGuard's optimizing step - is sometimes unable to update them consistently. You should then let the - obfuscation step remove these attributes or disable the optimization - step.
- -
NoSuchMethodError or AbstractMethodError
- -
You should make sure you're not writing your output class files to a - directory on a platform with a case-insensitive file system, such as - Windows. Please refer to the section about disappearing classes for details. -

- Furthermore, you should check whether you have specified your program jars - and library jars properly. Program classes can refer to library classes, - but not the other way around. -

- If all of this seems ok, perhaps there's a bug in ProGuard (gasp!). If so, - please report it, preferably with the simplest example on which you can - find ProGuard to fail.

- -
VerifyError
- -
Verification errors when executing a program are almost certainly the - result of a bug in the optimization step of ProGuard. Make sure you are - using the latest version. You should be able to work around the problem by - using the -dontoptimize - option. You can check the bug database to see if it is a known problem - (often with a fix). Otherwise, please report it, preferably with the - simplest example on which ProGuard fails.
- -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/usage.html b/tools/proguard/proguard6.0.3/docs/manual/usage.html deleted file mode 100644 index 6689f565..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/usage.html +++ /dev/null @@ -1,1360 +0,0 @@ - - - - - - -ProGuard Usage - - - - - - -

Usage

- -To run ProGuard, just type: -

-java -jar proguard.jar options ... -

-You can find the ProGuard jar in the lib directory of the -ProGuard distribution. Alternatively, the bin directory contains -some short Linux and Windows scripts containing this command. Typically, you'll -put most options in a configuration file (say, myconfig.pro), and -just call: -

-java -jar proguard.jar @myconfig.pro -

-You can combine command line options and options from configuration files. For -instance: -

-java -jar proguard.jar @myconfig.pro -verbose -

-

-You can add comments in a configuration file, starting with a -# character and continuing until the end of the line. -

-Extra whitespace between words and delimiters is ignored. File names with -spaces or special characters should be quoted with single or double quotes. -

-Options can be grouped arbitrarily in arguments on the command line and in -lines in configuration files. This means that you can quote arbitrary sections -of command line options, to avoid shell expansion of special characters, for -instance. -

-The order of the options is generally irrelevant. For quick experiments, you -can abbreviate them to their first unique characters. -

- -The sections below provide more details: -

- -

Input/Output Options

- -
-
@filename
- -
Short for '-include - filename'.
- -
-include - filename
- -
Recursively reads configuration options from the given file - filename.
- -
-basedirectory - directoryname
- -
Specifies the base directory for all subsequent relative file names in - these configuration arguments or this configuration file.
- -
-injars - class_path
- -
Specifies the input jars (or aars, wars, ears, zips, apks, or directories) - of the application to be processed. The class files in these jars will be - processed and written to the output jars. By default, any non-class files - will be copied without changes. Please be aware of any temporary files - (e.g. created by IDEs), especially if you are reading your input files - straight from directories. The entries in the class path can be filtered, - as explained in the filters section. For better - readability, class path entries can be specified using multiple - -injars options.
- -
-outjars - class_path
- -
Specifies the names of the output jars (or aars, wars, ears, zips, apks, - or directories). The processed input of the preceding -injars - options will be written to the named jars. This allows you to collect the - contents of groups of input jars into corresponding groups of output jars. - In addition, the output entries can be filtered, as explained in - the filters section. Each processed class file - or resource file is then written to the first output entry with a matching - filter, within the group of output jars. -

- You must avoid letting the output files overwrite any input files. For - better readability, class path entries can be specified using multiple - -outjars options. Without any -outjars options, - no jars will be written.

- -
-libraryjars - class_path
- -
Specifies the library jars (or aars, wars, ears, zips, apks, or - directories) of the application to be processed. The files in these jars - will not be included in the output jars. The specified library jars should - at least contain the class files that are extended by application - class files. Library class files that are only called needn't be - present, although their presence can improve the results of the - optimization step. The entries in the class path can be filtered, as - explained in the filters section. For better - readability, class path entries can be specified using - multiple -libraryjars options. -

- Please note that the boot path and the class path set for running ProGuard - are not considered when looking for library classes. This means that you - explicitly have to specify the run-time jar that your code will use. - Although this may seem cumbersome, it allows you to process applications - targeted at different run-time environments. For example, you can process - J2SE applications as well as JME midlets or Android apps, just by - specifying the appropriate run-time jar.

- -
-skipnonpubliclibraryclasses
- -
Specifies to skip non-public classes while reading library jars, to speed - up processing and reduce memory usage of ProGuard. By default, ProGuard - reads non-public and public library classes alike. However, non-public - classes are often not relevant, if they don't affect the actual program - code in the input jars. Ignoring them then speeds up ProGuard, without - affecting the output. Unfortunately, some libraries, including recent JSE - run-time libraries, contain non-public library classes that are extended - by public library classes. You then can't use this option. ProGuard will - print out warnings if it can't find classes due to this option being - set.
- -
-dontskipnonpubliclibraryclasses
- -
Specifies not to ignore non-public library classes. As of version 4.5, this - is the default setting.
- -
-dontskipnonpubliclibraryclassmembers
- -
Specifies not to ignore package visible library class members (fields and - methods). By default, ProGuard skips these class members while parsing - library classes, as program classes will generally not refer to them. - Sometimes however, program classes reside in the same packages as library - classes, and they do refer to their package visible class members. In - those cases, it can be useful to actually read the class members, in order - to make sure the processed code remains consistent.
- -
-keepdirectories - [directory_filter]
- -
Specifies the directories to be kept in the output jars (or aars, wars, - ears, zips, apks, or directories). By default, directory entries are - removed. This reduces the jar size, but it may break your program if the - code tries to find them with constructs like - "com.example.MyClass.class.getResource("")". You'll then want - to keep the directory corresponding to the package, - "-keepdirectories com.example". If the option is specified - without a filter, all directories are kept. With a filter, only matching - directories are kept. For instance, - "-keepdirectories mydirectory" matches the specified - directory, "-keepdirectories mydirectory/*" matches its - immediate subdirectories, and - "-keepdirectories mydirectory/**" matches all of its - subdirectories.
- -
-target version
- -
Specifies the version number to be set in the processed class files. The - version number can be one of 1.0, 1.1, - 1.2, 1.3, 1.4, 1.5 (or - just 5), 1.6 (or just 6), - 1.7 (or just 7), or 1.8 (or - just 8). By default, the version numbers of the class files - are left unchanged. For example, you may want to - upgrade class files to Java 6, by - changing their version numbers and having them preverified. You probably - shouldn't downgrade the version numbers of class files, since the code - may contain constructs that are not supported in older versions.
- -
-forceprocessing
- -
Specifies to process the input, even if the output seems up to date. The - up-to-dateness test is based on a comparison of the date stamps of the - specified input, output, and configuration files or directories.
- -
-

- -

Keep Options

- -
-
-keep - [,modifier,...] - class_specification
- -
Specifies classes and class members (fields and methods) to be preserved - as entry points to your code. For example, in order to keep an application, you can specify - the main class along with its main method. In order to process a library, you should specify all - publicly accessible elements.
- -
-keepclassmembers - [,modifier,...] - class_specification
- -
Specifies class members to be preserved, if their classes are preserved as - well. For example, you may want to keep all serialization fields and - methods of classes that implement the Serializable - interface.
- -
-keepclasseswithmembers - [,modifier,...] - class_specification
- -
Specifies classes and class members to be preserved, on the condition that - all of the specified class members are present. For example, you may want - to keep all applications that - have a main method, without having to list them explicitly.
- -
-keepnames - class_specification
- -
Short for -keep,allowshrinking - class_specification -

- Specifies classes and class members whose names are to be preserved, if - they aren't removed in the shrinking phase. For example, you may want to - keep all class names of classes - that implement the Serializable interface, so that the - processed code remains compatible with any originally serialized classes. - Classes that aren't used at all can still be removed. Only applicable when - obfuscating.

- -
-keepclassmembernames - class_specification
- -
Short for -keepclassmembers,allowshrinking - class_specification -

- Specifies class members whose names are to be preserved, if they aren't - removed in the shrinking phase. For example, you may want to preserve the - name of the synthetic class$ methods - when processing a library compiled by - JDK 1.2 or older, so obfuscators can detect it again when processing an - application that uses the processed library (although ProGuard itself - doesn't need this). Only applicable when obfuscating.

- -
-keepclasseswithmembernames - class_specification
- -
Short for -keepclasseswithmembers,allowshrinking - class_specification -

- Specifies classes and class members whose names are to be preserved, on - the condition that all of the specified class members are present after - the shrinking phase. For example, you may want to keep all native method names and the names - of their classes, so that the processed code can still link with the - native library code. Native methods that aren't used at all can still be - removed. If a class file is used, but none of its native methods are, its - name will still be obfuscated. Only applicable when obfuscating.

- -
-if - class_specification
- -
Specifies classes and class members that must be present to activate the - subsequent keep option (-keep, - -keepclassmembers,...). The condition and the - subsequent keep option can share wildcards and references to - wildcards. For example, you can keep classes on the condition that classes - with related names exist in your project, with frameworks like - Dagger and - Butterknife.
- -
-printseeds - [filename]
- -
Specifies to exhaustively list classes and class members matched by the - various -keep options. The list is printed to the standard - output or to the given file. The list can be useful to verify if the - intended class members are really found, especially if you're using - wildcards. For example, you may want to list all the applications or all the applets that you are keeping.
- -
-

- -

Shrinking Options

- -
-
-dontshrink
- -
Specifies not to shrink the input class files. By default, shrinking is - applied; all classes and class members are removed, except for the ones - listed by the various -keep options, and the ones on which - they depend, directly or indirectly. A shrinking step is also applied - after each optimization step, since some optimizations may open the - possibility to remove more classes and class members.
- -
-printusage - [filename]
- -
Specifies to list dead code of the input class files. The list is printed - to the standard output or to the given file. For example, you can list the unused code of an application. - Only applicable when shrinking.
- -
-whyareyoukeeping - class_specification
- -
Specifies to print details on why the given classes and class members are - being kept in the shrinking step. This can be useful if you are wondering - why some given element is present in the output. In general, there can be - many different reasons. This option prints the shortest chain of methods - to a specified seed or entry point, for each specified class and class - member. In the current implementation, the shortest chain that is - printed out may sometimes contain circular deductions -- these do not - reflect the actual shrinking process. If the -verbose option if specified, the traces - include full field and method signatures. Only applicable when - shrinking.
- -
-

- -

Optimization Options

- -
-
-dontoptimize
- -
Specifies not to optimize the input class files. By default, optimization - is enabled; all methods are optimized at a bytecode level.
- -
-optimizations - optimization_filter
- -
Specifies the optimizations to be enabled and disabled, at a more - fine-grained level. Only applicable when optimizing. This is an expert - option.
- -
-optimizationpasses n
- -
Specifies the number of optimization passes to be performed. By default, a - single pass is performed. Multiple passes may result in further - improvements. If no improvements are found after an optimization pass, the - optimization is ended. Only applicable when optimizing.
- -
-assumenosideeffects - class_specification
- -
Specifies methods that don't have any side effects (other than maybe - returning a value). In the optimization step, ProGuard will then remove - calls to such methods, if it can determine that the return values aren't - used. ProGuard will analyze your program code to find such methods - automatically. It will not analyze library code, for which this option can - therefore be useful. For example, you could specify the method - System.currentTimeMillis(), so that any idle calls to it will - be removed. With some care, you can also use the option to - remove logging code. Note that - ProGuard applies the option to the entire hierarchy of the specified - methods. Only applicable when optimizing. In general, making assumptions - can be dangerous; you can easily break the processed code. Only use - this option if you know what you're doing!
- -
-assumenoexternalsideeffects - class_specification
- -
Specifies methods that don't have any side effects, except possibly on the - instances on which they are called. This statement is weaker than - -assumenosideeffects, - because it allows side effects on the parameters or the heap. For example, - the `StringBuffer#append` methods have side effects, but no external side - effects. This is useful when removing - logging code, to also remove any related string concatenation code. - Only applicable when optimizing. Making assumptions can be dangerous; you - can easily break the processed code. Only use this option if you know - what you're doing!
- -
-assumenoescapingparameters - class_specification
- -
Specifies methods that don't let their reference parameters escape to the - heap. Such methods can use, modify, or return the parameters, but not store - them in any fields, either directly or indirectly. For example, the method - System.arrayCopy does not let its reference parameters escape, - but method System.setSecurityManager does. Only applicable - when optimizing. Making assumptions can be dangerous; you can easily break - the processed code. Only use this option if you know what you're - doing!
- -
-assumenoexternalreturnvalues - class_specification
- -
Specifies methods that don't return reference values that were already on - the heap when they are called. For example, the - ProcessBuilder#start returns a Process reference - value, but it is a new instance that wasn't on the heap yet. Only - applicable when optimizing. Making assumptions can be dangerous; you can - easily break the processed code.Only use this option if you know what - you're doing!
- -
-allowaccessmodification
- -
Specifies that the access modifiers of classes and class members may be - broadened during processing. This can improve the results of the - optimization step. For instance, when inlining a public getter, it may be - necessary to make the accessed field public too. Although Java's binary - compatibility specifications formally do not require this (cfr. The Java Language Specification, Third Edition, Section 13.4.6), some virtual machines would have problems with the - processed code otherwise. Only applicable when optimizing (and when - obfuscating with the -repackageclasses option). -

- Counter-indication: you probably shouldn't use this option when - processing code that is to be used as a library, since classes and class - members that weren't designed to be public in the API may become - public.

- -
-mergeinterfacesaggressively
- -
Specifies that interfaces may be merged, even if their implementing - classes don't implement all interface methods. This can reduce the size of - the output by reducing the total number of classes. Note that Java's - binary compatibility specifications allow such constructs (cfr. The Java Language Specification, Third Edition, Section 13.5.3), even if they are not allowed in the Java language - (cfr. The Java Language Specification, Third Edition, Section 8.1.4). Only applicable when optimizing. -

- Counter-indication: setting this option can reduce the performance - of the processed code on some JVMs, since advanced just-in-time - compilation tends to favor more interfaces with fewer implementing - classes. Worse, some JVMs may not be able to handle the resulting code. - Notably: -

    -
  • Sun's JRE 1.3 may throw an InternalError when - encountering more than 256 Miranda methods (interface methods - without implementations) in a class.
  • -
- -
-

- -

Obfuscation Options

- -
-
-dontobfuscate
- -
Specifies not to obfuscate the input class files. By default, obfuscation - is applied; classes and class members receive new short random names, - except for the ones listed by the various -keep options. - Internal attributes that are useful for debugging, such as source files - names, variable names, and line numbers are removed.
- -
-printmapping - [filename]
- -
Specifies to print the mapping from old names to new names for classes and - class members that have been renamed. The mapping is printed to the - standard output or to the given file. For example, it is required for - subsequent incremental - obfuscation, or if you ever want to make sense again of obfuscated stack traces. Only - applicable when obfuscating.
- -
-applymapping - filename
- -
Specifies to reuse the given name mapping that was printed out in a - previous obfuscation run of ProGuard. Classes and class members that are - listed in the mapping file receive the names specified along with them. - Classes and class members that are not mentioned receive new names. The - mapping may refer to input classes as well as library classes. This option - can be useful for incremental - obfuscation, i.e. processing add-ons or small patches to an existing - piece of code. If the structure of the code changes fundamentally, - ProGuard may print out warnings that applying a mapping is causing - conflicts. You may be able to reduce this risk by specifying the option -useuniqueclassmembernames - in both obfuscation runs. Only a single mapping file is allowed. Only - applicable when obfuscating.
- -
-obfuscationdictionary - filename
- -
Specifies a text file from which all valid words are used as obfuscated - field and method names. By default, short names like 'a', 'b', etc. are - used as obfuscated names. With an obfuscation dictionary, you can specify - a list of reserved key words, or identifiers with foreign characters, for - instance. White space, punctuation characters, duplicate words, and - comments after a # sign are ignored. Note that an - obfuscation dictionary hardly improves the obfuscation. Decent compilers - can automatically replace them, and the effect can fairly simply be undone - by obfuscating again with simpler names. The most useful application is - specifying strings that are typically already present in class files (such - as 'Code'), thus reducing the class file sizes just a little bit more. - Only applicable when obfuscating.
- -
-classobfuscationdictionary - filename
- -
Specifies a text file from which all valid words are used as obfuscated - class names. The obfuscation dictionary is similar to the one of the - option -obfuscationdictionary. - Only applicable when obfuscating.
- -
-packageobfuscationdictionary - filename
- -
Specifies a text file from which all valid words are used as obfuscated - package names. The obfuscation dictionary is similar to the one of the - option -obfuscationdictionary. - Only applicable when obfuscating.
- -
-overloadaggressively
- -
Specifies to apply aggressive overloading while obfuscating. Multiple - fields and methods can then get the same names, as long as their arguments - and return types are different, as required by Java bytecode (not just - their arguments, as required by the Java language). This option can make - the processed code even smaller (and less comprehensible). Only applicable - when obfuscating. -

- Counter-indication: the resulting class files fall within the Java - bytecode specification (cfr. The Java Virtual Machine Specification, Second Edition, first - paragraphs of Section 4.5 and Section 4.6), even though this kind of overloading is not allowed in - the Java language (cfr. The Java Language Specification, Third Edition, Section 8.3 and Section 8.4.5). Still, some tools have problems with it. Notably: -

    -
  • Sun's JDK 1.2.2 javac compiler produces an exception when - compiling with such a library (cfr. Bug #4216736). - You probably shouldn't use this option for processing libraries.
  • -
  • Sun's JRE 1.4 and later fail to serialize objects with overloaded - primitive fields.
  • -
  • Sun's JRE 1.5 pack200 tool reportedly has problems with - overloaded class members.
  • -
  • The class java.lang.reflect.Proxy can't handle overloaded - methods.
  • -
  • Google's Dalvik VM can't handle overloaded static fields.
  • -
- -
-useuniqueclassmembernames
- -
Specifies to assign the same obfuscated names to class members that have - the same names, and different obfuscated names to class members that have - different names (for each given class member signature). Without the - option, more class members can be mapped to the same short names like 'a', - 'b', etc. The option therefore increases the size of the resulting code - slightly, but it ensures that the saved obfuscation name mapping can - always be respected in subsequent incremental obfuscation steps. -

- For instance, consider two distinct interfaces containing methods with the - same name and signature. Without this option, these methods may get - different obfuscated names in a first obfuscation step. If a patch is then - added containing a class that implements both interfaces, ProGuard will - have to enforce the same method name for both methods in an incremental - obfuscation step. The original obfuscated code is changed, in order to - keep the resulting code consistent. With this option in the initial - obfuscation step, such renaming will never be necessary. -

- This option is only applicable when obfuscating. In fact, if you are - planning on performing incremental obfuscation, you probably want to avoid - shrinking and optimization altogether, since these steps could remove or - modify parts of your code that are essential for later additions.

- -
-dontusemixedcaseclassnames
- -
Specifies not to generate mixed-case class names while obfuscating. By - default, obfuscated class names can contain a mix of upper-case characters - and lower-case characters. This creates perfectly acceptable and usable - jars. Only if a jar is unpacked on a platform with a case-insensitive - filing system (say, Windows), the unpacking tool may let similarly named - class files overwrite each other. Code that self-destructs when it's - unpacked! Developers who really want to unpack their jars on Windows can - use this option to switch off this behavior. Obfuscated jars will become - slightly larger as a result. Only applicable when obfuscating.
- -
-keeppackagenames - [package_filter]
- -
Specifies not to obfuscate the given package names. The optional filter is - a comma-separated list of package names. Package names can contain - ?, *, and ** wildcards, and they can be preceded by - the ! negator. Only applicable when obfuscating.
- -
-flattenpackagehierarchy - [package_name]
- -
Specifies to repackage all packages that are renamed, by moving them into - the single given parent package. Without argument or with an empty string - (''), the packages are moved into the root package. This option is one - example of further obfuscating package - names. It can make the processed code smaller and less comprehensible. - Only applicable when obfuscating.
- -
-repackageclasses - [package_name]
- -
Specifies to repackage all class files that are renamed, by moving them - into the single given package. Without argument or with an empty string - (''), the package is removed completely. This option overrides the - -flattenpackagehierarchy - option. It is another example of further obfuscating package names. It can - make the processed code even smaller and less comprehensible. Its - deprecated name is -defaultpackage. Only applicable when - obfuscating. -

- Counter-indication: classes that look for resource files in their - package directories will no longer work properly if they are moved - elsewhere. When in doubt, just leave the packaging untouched by not using - this option.

- -
-keepattributes - [attribute_filter]
- -
Specifies any optional attributes to be preserved. The attributes can be - specified with one or more -keepattributes directives. The - optional filter is a comma-separated list - of attribute names that Java virtual - machines and ProGuard support. Attribute names can - contain ?, *, and ** wildcards, and they can be - preceded by the ! negator. For example, you should at least keep - the Exceptions, InnerClasses, and - Signature attributes when - processing a library. You should also - keep the SourceFile and LineNumberTable - attributes for producing useful - obfuscated stack traces. Finally, you may want - to keep annotations if your code - depends on them. Only applicable when obfuscating.
- -
-keepparameternames
- -
Specifies to keep the parameter names and types of methods that are kept. - This option actually keeps trimmed versions of the debugging attributes - LocalVariableTable and - LocalVariableTypeTable. It can be useful when - processing a library. Some IDEs can - use the information to assist developers who use the library, for example - with tool tips or autocompletion. Only applicable when obfuscating.
- -
-renamesourcefileattribute - [string]
- -
Specifies a constant string to be put in the SourceFile - attributes (and SourceDir attributes) of the class files. - Note that the attribute has to be present to start with, so it also has to - be preserved explicitly using the -keepattributes directive. - For example, you may want to have your processed libraries and - applications produce useful obfuscated - stack traces. Only applicable when obfuscating.
- -
-adaptclassstrings - [class_filter]
- -
Specifies that string constants that correspond to class names should be - obfuscated as well. Without a filter, all string constants that correspond - to class names are adapted. With a filter, only string constants in - classes that match the filter are adapted. For example, if your code - contains a large number of hard-coded strings that refer to classes, and - you prefer not to keep their names, you may want to use this option. - Primarily applicable when obfuscating, although corresponding classes are - automatically kept in the shrinking step too.
- -
-adaptresourcefilenames - [file_filter]
- -
Specifies the resource files to be renamed, based on the obfuscated names - of the corresponding class files (if any). Without a filter, all resource - files that correspond to class files are renamed. With a filter, only - matching files are renamed. For example, see processing resource files. Only - applicable when obfuscating.
- -
-adaptresourcefilecontents - [file_filter]
- -
Specifies the resource files whose contents are to be updated. Any class - names mentioned in the resource files are renamed, based on the obfuscated - names of the corresponding classes (if any). Without a filter, the - contents of all resource files updated. With a filter, only matching files - are updated. The resource files are parsed and written using the - platform's default character set. You can change this default character set - by setting the environment variable LANG or the Java system - property file.encoding. For an example, - see processing resource files. - Only applicable when obfuscating. -

- Caveat: You probably only want to apply this option to text files, - since parsing and adapting binary files as text files can cause unexpected - problems. Therefore, make sure that you specify a sufficiently narrow - filter.

- - -
-

- -

Preverification Options

- -
-
-dontpreverify
- -
Specifies not to preverify the processed class files. By default, class - files are preverified if they are targeted at Java Micro Edition or at - Java 6 or higher. For Java Micro Edition, preverification is required, so - you will need to run an external preverifier on the processed code if you - specify this option. For Java 6, preverification is optional, but as of - Java 7, it is required. Only when eventually targeting Android, it is not - necessary, so you can then switch it off to reduce the processing time a - bit.
- -
-microedition
- -
Specifies that the processed class files are targeted at Java Micro - Edition. The preverifier will then add the appropriate StackMap - attributes, which are different from the default StackMapTable attributes - for Java Standard Edition. For example, you will need this option if you - are processing midlets.
- -
-android
- -
Specifies that the processed class files are targeted at the Android - platform. ProGuard then makes sure some features are compatible with - Android. For example, you should specify this option if you are processing an Android - application.
- -
-

- -

General Options

- -
-
-verbose
- -
Specifies to write out some more information during processing. If the - program terminates with an exception, this option will print out the entire - stack trace, instead of just the exception message.
- -
-dontnote - [class_filter]
- -
Specifies not to print notes about potential mistakes or omissions in the - configuration, such as typos in class names or missing options that - might be useful. The optional filter is a regular expression; ProGuard - doesn't print notes about classes with matching names.
- -
-dontwarn - [class_filter]
- -
Specifies not to warn about unresolved references and other important - problems at all. The optional filter is a regular expression; ProGuard - doesn't print warnings about classes with matching names. Ignoring - warnings can be dangerous. For instance, if the unresolved classes or - class members are indeed required for processing, the processed code will - not function properly. Only use this option if you know what you're - doing!
- -
-ignorewarnings
- -
Specifies to print any warnings about unresolved references and other - important problems, but to continue processing in any case. Ignoring - warnings can be dangerous. For instance, if the unresolved classes or - class members are indeed required for processing, the processed code will - not function properly. Only use this option if you know what you're - doing!
- -
-printconfiguration - [filename]
- -
Specifies to write out the entire configuration that has been parsed, with - included files and replaced variables. The structure is printed to the - standard output or to the given file. This can sometimes be useful for - debugging configurations, or for converting XML configurations into a more - readable format.
- -
-dump - [filename]
- -
Specifies to write out the internal structure of the class files, after - any processing. The structure is printed to the standard output or to the - given file. For example, you may want to write out the contents of a given jar - file, without processing it at all.
- -
-addconfigurationdebugging
- -
Specifies to instrument the processed code with debugging statements that - print out suggestions for missing ProGuard configuration. This can be very - useful to get practical hints at run-time, if your processed code - crashes because it still lacks some configuration for reflection. For - example, the code may be serializing classes - with the GSON library and you may need some configuration for it. You - can generally just copy/paste the suggestions from the console into your - configuration file. -

- Counter-indication: do not use this option in release versions, as - it adds obfuscation information to the processed code.

- -
-

- -

Class Paths

- -ProGuard accepts a generalization of class paths to specify input files and -output files. A class path consists of entries, separated by the traditional -path separator (e.g. ':' on Unix, or ';' on Windows platforms). -The order of the entries determines their priorities, in case of duplicates. -

-Each input entry can be: -

    -
  • A class file or resource file,
  • -
  • An apk file, containing any of the above,
  • -
  • A jar file, containing any of the above,
  • -
  • An aar file, containing any of the above,
  • -
  • A war file, containing any of the above,
  • -
  • An ear file, containing any of the above,
  • -
  • A zip file, containing any of the above,
  • -
  • A directory (structure), containing any of the above.
  • -
-

-The paths of directly specified class files and resource files is ignored, so -class files should generally be part of a jar file, an aar file, a war file, -an ear file, a zip file, or a directory. In addition, the paths of class files -should not have any additional directory prefixes inside the archives or -directories. - -

-Each output entry can be: -

    -
  • An apk file, in which all class files and resource files will be - collected.
  • -
  • A jar file, in which any and all of the above will be collected,
  • -
  • An aar file, in which any and all of the above will be collected,
  • -
  • A war file, in which any and all of the above will be collected,
  • -
  • An ear file, in which any and all of the above will be collected,
  • -
  • A zip file, in which any and all of the above will be collected,
  • -
  • A directory, in which any and all of the above will be collected.
  • -
-

-When writing output entries, ProGuard will generally package the results in a -sensible way, reconstructing the input entries as much as required. Writing -everything to an output directory is the most straightforward option: the -output directory will contain a complete reconstruction of the input entries. -The packaging can be almost arbitrarily complex though: you could process an -entire application, packaged in a zip file along with its documentation, -writing it out as a zip file again. The Examples section shows a few ways -to restructure output archives. -

-Files and directories can be specified as discussed in the section on file names below. -

-In addition, ProGuard provides the possibility to filter the class path -entries and their contents, based on their full relative file names. Each -class path entry can be followed by up to 7 types of file filters between parentheses, separated by -semi-colons: -

    -
  • A filter for all aar names that are encountered,
  • -
  • A filter for all apk names that are encountered,
  • -
  • A filter for all zip names that are encountered,
  • -
  • A filter for all ear names that are encountered,
  • -
  • A filter for all war names that are encountered,
  • -
  • A filter for all jar names that are encountered,
  • -
  • A filter for all class file names and resource file names that are - encountered.
  • -
-

-If fewer than 7 filters are specified, they are assumed to be the latter -filters. Any empty filters are ignored. More formally, a filtered class path -entry looks like this: -

-classpathentry([[[[[[aarfilter;]apkfilter;]zipfilter;]earfilter;]warfilter;]jarfilter;]filefilter)
-
-

-Square brackets "[]" mean that their contents are optional. -

-For example, "rt.jar(java/**.class,javax/**.class)" matches all -class files in the java and javax directories inside -the rt jar. -

-For example, "input.jar(!**.gif,images/**)" matches all files in -the images directory inside the input jar, except -gif files. -

-The different filters are applied to all corresponding file types, irrespective -of their nesting levels in the input; they are orthogonal. -

-For example, -"input.war(lib/**.jar,support/**.jar;**.class,**.gif)" only -considers jar files in the lib and support -directories in the input war, not any other jar files. It then -matches all class files and gif files that are encountered. -

-The filters allow for an almost infinite number of packaging and repackaging -possibilities. The Examples section provides a few more examples -for filtering input and output. -

- -

File Names

- -ProGuard accepts absolute paths and relative paths for the various file names -and directory names. A relative path is interpreted as follows: -
    -
  • relative to the base directory, if set, or otherwise
  • -
  • relative to the configuration file in which it is specified, if any, or - otherwise
  • -
  • relative to the working directory.
  • -
-

-The names can contain Java system properties (or Ant properties, when using -Ant), delimited by angular brackets, '<' and '>'. The -properties are automatically replaced by their corresponding values. -

-For example, <java.home>/lib/rt.jar is automatically -expanded to something like /usr/local/java/jdk/jre/lib/rt.jar. -Similarly, <user.home> is expanded to the user's home -directory, and <user.dir> is expanded to the current -working directory. -

-Names with special characters like spaces and parentheses must be quoted with -single or double quotes. Each file name in a list of names has to be quoted -individually. Note that the quotes themselves may need to be escaped when used -on the command line, to avoid them being gobbled by the shell. -

-For example, on the command line, you could use an option like '-injars -"my program.jar":"/your directory/your program.jar"'. -

- -

File Filters

- -Like general filters, a file filter is a -comma-separated list of file names that can contain wildcards. Only files with -matching file names are read (in the case of input jars), or written (in the -case of output jars). The following wildcards are supported: - - - - - - - - -
?matches any single character in a file name.
*matches any part of a filename not containing the directory - separator.
**matches any part of a filename, possibly containing any number of - directory separators.
- -For example, "java/**.class,javax/**.class" matches all -class files in the java and javax. -

- -Furthermore, a file name can be preceded by an exclamation mark '!' to -exclude the file name from further attempts to match with -subsequent file names. -

-For example, "!**.gif,images/**" matches all files in the -images directory, except gif files. -

-The Examples section provides a few more examples for filtering input and output. - -

Filters

- -ProGuard offers options with filters for many different aspects of the -configuration: names of files, directories, classes, packages, attributes, -optimizations, etc. -

-A filter is a list of comma-separated names that can contain wildcards. Only -names that match an item on the list pass the filter. The supported wildcards -depend on the type of names for which the filter is being used, but the -following wildcards are typical: - - - - - - - - -
?matches any single character in a name.
*matches any part of a name not containing the package separator or - directory separator.
**matches any part of a name, possibly containing any number of - package separators or directory separators.
- -For example, "foo,*bar" matches the name foo and -all names ending with bar. -

- -Furthermore, a name can be preceded by a negating exclamation mark '!' -to exclude the name from further attempts to match -with subsequent names. So, if a name matches an item in the filter, it -is accepted or rejected right away, depending on whether the item has a -negator. If the name doesn't match the item, it is tested against the next -item, and so on. It if doesn't match any items, it is accepted or rejected, -depending on the whether the last item has a negator or not. -

-For example, "!foobar,*bar" matches all names ending with -bar, except foobar. -

- -

Overview of Keep Options

- -The various -keep options for shrinking and obfuscation may seem -a bit confusing at first, but there's actually a pattern behind them. The -following table summarizes how they are related: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeepFrom being removed or renamedFrom being renamed
Classes and class members-keep-keepnames
Class members only-keepclassmembers-keepclassmembernames
Classes and class members, if class members present-keepclasseswithmembers-keepclasseswithmembernames
-

- -Each of these -keep options is of course followed by a -specification of the classes and class -members (fields and methods) to which it should be applied. -

-If you're not sure which option you need, you should probably simply use --keep. It will make sure the specified classes and class members -are not removed in the shrinking step, and not renamed in the obfuscation step. -

-attention -

    -
  • If you specify a class, without class members, ProGuard only preserves the - class and its parameterless constructor as entry points. It may - still remove, optimize, or obfuscate its other class members.
  • -
  • If you specify a method, ProGuard only preserves the method as an entry - point. Its code may still be optimized and adapted.
  • -
-

- -

Keep Option Modifiers

- -
-
includedescriptorclasses
- -
Specifies that any classes in the type descriptors of the methods and - fields that the -keep option keeps should be kept as - well. This is typically useful when keeping - native method names, to make sure that the parameter types of native - methods aren't renamed either. Their signatures then remain completely - unchanged and compatible with the native libraries.
- -
includecode
- -
Specifies that code attributes of the methods that the fields that - the -keep option keeps should be kept as well, i.e. - may not be optimized or obfuscated. This is typically useful for already - optimized or obfuscated classes, to make sure that their code is not - modified during optimization.
- -
allowshrinking
- -
Specifies that the entry points specified in the -keep - option may be shrunk, even if they have to be preserved otherwise. That - is, the entry points may be removed in the shrinking step, but if they are - necessary after all, they may not be optimized or obfuscated.
- -
allowoptimization
- -
Specifies that the entry points specified in the -keep - option may be optimized, even if they have to be preserved otherwise. That - is, the entry points may be altered in the optimization step, but they may - not be removed or obfuscated. This modifier is only useful for achieving - unusual requirements.
- -
allowobfuscation
- -
Specifies that the entry points specified in the -keep - option may be obfuscated, even if they have to be preserved otherwise. That - is, the entry points may be renamed in the obfuscation step, but they may - not be removed or optimized. This modifier is only useful for achieving - unusual requirements.
- -
-

- -

Class Specifications

- -A class specification is a template of classes and class members (fields and -methods). It is used in the various -keep options and in the --assumenosideeffects option. The corresponding option is only -applied to classes and class members that match the template. -

-The template was designed to look very Java-like, with some extensions for -wildcards. To get a feel for the syntax, you should probably look at the examples, but this is an attempt at a complete formal -definition: -

- -

-[@annotationtype] [[!]public|final|abstract|@ ...] [!]interface|class|enum classname
-    [extends|implements [@annotationtype] classname]
-[{
-    [@annotationtype] [[!]public|private|protected|static|volatile|transient ...] <fields> |
-                                                                      (fieldtype fieldname);
-    [@annotationtype] [[!]public|private|protected|static|synchronized|native|abstract|strictfp ...] <methods> |
-                                                                                           <init>(argumenttype,...) |
-                                                                                           classname(argumenttype,...) |
-                                                                                           (returntype methodname(argumenttype,...));
-    [@annotationtype] [[!]public|private|protected|static ... ] *;
-    ...
-}]
-
-

-Square brackets "[]" mean that their contents are optional. Ellipsis dots -"..." mean that any number of the preceding items may be specified. A vertical -bar "|" delimits two alternatives. Non-bold parentheses "()" just group parts -of the specification that belong together. The indentation tries to clarify -the intended meaning, but white-space is irrelevant in actual configuration -files. -

-

    - -
  • The class keyword refers to any interface or class. - The interface keyword restricts matches to interface - classes. The enum keyword restricts matches to - enumeration classes. Preceding the interface or - enum keywords by a ! restricts - matches to classes that are not interfaces or enumerations, - respectively.
  • - -
  • Every classname must be fully qualified, e.g. - java.lang.String. Inner classes are separated by a dollar sign - "$", e.g. java.lang.Thread$State. Class names - may be specified as regular - expressions containing the following wildcards: - - - - - - - - - - - - - - - - - - - -
    ?matches any single character in a class name, but not the package - separator. For example, "com.example.Test?" matches - "com.example.Test1" and "com.example.Test2", but not - "com.example.Test12".
    *matches any part of a class name not containing the package separator. For - example, "com.example.*Test*" matches - "com.example.Test" and - "com.example.YourTestApplication", but not - "com.example.mysubpackage.MyTest". Or, more generally, - "com.example.*" matches all classes in - "com.example", but not in its subpackages.
    **matches any part of a class name, possibly containing any number of - package separators. For example, "**.Test" matches all - Test classes in all packages except the root package. Or, - "com.example.**" matches all classes in - "com.example" and in its subpackages.
    <n>matches the n'th matched wildcard in the same option. For example, - "com.example.*Foo<1>" matches - "com.example.BarFooBar".
    - - For additional flexibility, class names can actually be comma-separated - lists of class names, with optional ! negators, just - like file name filters. This notation doesn't look very Java-like, so it - should be used with moderation. -

    - For convenience and for backward compatibility, the class name - * refers to any class, irrespective of its package.

  • - -
  • The extends and implements - specifications are typically used to restrict classes with wildcards. They - are currently equivalent. They specify that only classes extending or - implementing the given class (directly or indirectly) qualify. The given - class itself is not included in this set. If required, it should be - specified in a separate option.
  • - -
  • The @ specifications can be used to restrict classes - and class members to the ones that are annotated with the specified - annotation types. An annotationtype is specified just like a - classname.
  • - -
  • Fields and methods are specified much like in Java, except that method - argument lists don't contain argument names (just like in other tools - like javadoc and javap). The specifications can - also contain the following catch-all wildcards: - - - - - - - - - - - - - - - -
    <init>matches any constructor.
    <fields>matches any field.
    <methods>matches any method.
    *matches any field or method.
    - - Note that the above wildcards don't have return types. Only the - <init> wildcard has an argument list. -

    - - Fields and methods may also be specified using regular expressions. Names - can contain the following wildcards: - - - - - - - - -
    ?matches any single character in a method name.
    *matches any part of a method name.
    <n>matches the n'th matched wildcard in the same option.
    - - Types in descriptors can contain the following wildcards: - - - - - - - - - - - - - - - - - -
    %matches any primitive type ("boolean", "int", - etc, but not "void").
    ?matches any single character in a class name.
    *matches any part of a class name not containing the package separator.
    **matches any part of a class name, possibly containing any number of - package separators.
    ***matches any type (primitive or non-primitive, array or - non-array).
    ...matches any number of arguments of any type.
    <n>matches the n'th matched wildcard in the same option.
    - - Note that the ?, *, and ** - wildcards will never match primitive types. Furthermore, only the - *** wildcards will match array types of any dimension. For - example, "** get*()" matches "java.lang.Object - getObject()", but not "float getFloat()", nor - "java.lang.Object[] getObjects()".

  • - -
  • Constructors can also be specified using their short class names (without - package) or using their full class names. As in the Java language, the - constructor specification has an argument list, but no return type.
  • - -
  • The class access modifiers and class member access modifiers are typically - used to restrict wildcarded classes and class members. They specify that - the corresponding access flags have to be set for the member to match. A - preceding ! specifies that the corresponding access - flag should be unset. -

    - Combining multiple flags is allowed (e.g. public static). It - means that both access flags have to be set (e.g. public - and static), except when they are conflicting, in - which case at least one of them has to be set (e.g. at least - public - or protected). -

    - ProGuard supports the additional modifiers synthetic, - bridge, and varargs, which may be - set by compilers.

  • - -
- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/manual/wtk.html b/tools/proguard/proguard6.0.3/docs/manual/wtk.html deleted file mode 100644 index 707b652c..00000000 --- a/tools/proguard/proguard6.0.3/docs/manual/wtk.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - -ProGuard JME Wireless Toolkit Integration - - - - - - -

JME Wireless Toolkit Integration

- -ProGuard can be seamlessly integrated in Oracle's Wireless Toolkit (WTK) -for Java Micro Edition (JME). -

- -The WTK already comes with a plug-in for ProGuard. Alternatively, ProGuard -offers its own plug-in. This latter implementation is recommended, as it more -up to date and it solves some problems. It is also somewhat more efficient, -invoking the ProGuard engine directly, instead of writing out a configuration -file and running ProGuard in a separate virtual machine. -

- -In order to integrate this plug-in in the toolkit, you'll have to put the -following lines in the file -{j2mewtk.dir}/wtklib/Linux/ktools.properties or -{j2mewtk.dir}\wtklib\Windows\ktools.properties (whichever is -applicable). -

- -

-obfuscator.runner.class.name: proguard.wtk.ProGuardObfuscator
-obfuscator.runner.classpath: /usr/local/java/proguard/lib/proguard.jar
-
-

- -Please make sure the class path is set correctly for your system. -

- -Once ProGuard has been set up, you can apply it to your projects as part of -the build process. The build process is started from the WTK menu bar: -

-

Project -> Package -> Create Obfuscated Package
-

-This option will compile, shrink, obfuscate, verify, and install your midlets -for testing. -

-Should you ever need to customize your ProGuard configuration for the JME WTK, -you can adapt the configuration file proguard/wtk/default.pro -that's inside the proguard.jar. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/proguard.appdata.xml b/tools/proguard/proguard6.0.3/docs/proguard.appdata.xml deleted file mode 100644 index 29be32bd..00000000 --- a/tools/proguard/proguard6.0.3/docs/proguard.appdata.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - proguard.desktop - CC-BY-SA-3.0 - GPL-2.0 - ProGuard - Java optimizer and obfuscator - -

- ProGuard is a free Java class file shrinker, optimizer, obfuscator, and - preverifier. It detects and removes unused classes, fields, methods, and - attributes. It optimizes bytecode and removes unused instructions. It - renames the remaining classes, fields, and methods using short meaningless - names. Finally, it preverifies the processed code for Java 6 or for Java - Micro Edition. -

-

- ProGuard is useful for making code more compact and more efficient, on the - desktop, on tablets, on smartphones, and on embedded devices. It also - makes code more difficult to reverse engineer.Power Statistics is a - program used to view historical and current battery information and will - show programs running on your computer using power. -

-
- - http://proguard.sourceforge.net/screenshot_gui1.gif - http://proguard.sourceforge.net/screenshot_console.gif - - http://proguard.sourceforge.net/ - eric@graphics.cornell.edu -
diff --git a/tools/proguard/proguard6.0.3/docs/quality.html b/tools/proguard/proguard6.0.3/docs/quality.html deleted file mode 100644 index 0009f809..00000000 --- a/tools/proguard/proguard6.0.3/docs/quality.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - -ProGuard Quality - - - - - - -

Quality

- -In order to get a feel for the quality of the ProGuard code, it is run -through a regular automatic build process. This process produces numerous -statistics on the source code, Java lint comments, Java documentation -comments, the Java documentation itself, html lint comments on the Java -documentation, spell checks, compilation results, an output jar, dead code -analysis, a shrunk and obfuscated jar (using ProGuard itself!), test runs with -memory and performance analyses, etc. Most analyses are produced using freely -available tools. The results are poured into a convenient set of web pages -using bash/sed/awk scripts. You're welcome to have a look at an uploaded -snapshot of one of these runs: -

-

Automated Code Analysis and Testing Pages (at SourceForge)
-

-The pages will appear in a new window, which you probably want to view at -full-screen size. -

- -In addition, ProGuard is tested against a constantly growing test suite -(more than 2000 tests at this time of writing). These small programs contain a -wide range of common and uncommon constructs, in order to detect any regression -problems as soon as possible. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/results.html b/tools/proguard/proguard6.0.3/docs/results.html deleted file mode 100644 index 17fbf023..00000000 --- a/tools/proguard/proguard6.0.3/docs/results.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -ProGuard Results - - - - - - -

Results

- -ProGuard successfully processes any Java bytecode, ranging from small -Android applications to entire run-time libraries. It primarily reduces the -size of the processed code, with some potential increase in efficiency as an -added bonus. The improvements obviously depend on the original code. The table -below presents some typical results: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Input ProgramOriginal sizeAfter shrinkingAfter optim.After obfusc.Total reductionTimeMemory usage
Worm, a sample midlet from Oracle's JME10.3 K9.8 K9.6 K8.5 K18 %2 s19 M
Javadocking, a docking library290 K281 K270 K201 K30 %12 s32 M
ProGuard itself648 K579 K557 K348 K46 %28 s66 M
JDepend, a Java quality metrics tool57 K36 K33 K28 K51 %6 s24 M
the run-time classes from Oracle's Java 653 M23 M22 M18 M66 %16 min270 M
Tomcat, the Apache servlet container1.1 M466 K426 K295 K74 %17 s44 M
JavaNCSS, a Java source metrics tool632 K242 K212 K152 K75 %20 s36 M
Ant, the Apache build tool2.4 M401 K325 K242 K90 %23 s61 M
-

-Results were measured with ProGuard 4.0 on a 2.6 GHz Pentium 4 with 512 MB -of memory, using Sun JDK 1.5.0 in Fedora Core 3 Linux. All of this technology -and software has evolved since, but the gist of the results remains the same. -

-The program sizes include companion libraries. The shrinking step produces the -best results for programs that use only small parts of their libraries. The -obfuscation step can significantly shrink large programs even further, since -the identifiers of their many internal references can be replaced by short -identifiers. -

-The Java 6 run-time classes are the most complex example. The classes perform -a lot of introspection, interacting with the native code of the virtual -machine. The 1500+ lines of configuration were largely composed by automated -analysis, complemented by a great deal of trial and error. The configuration -is probably not complete, but the resulting library successfully serves as a -run-time environment for running applications like ProGuard and the ProGuard -GUI. -

-For small inputs, timings are governed by the reading and parsing of the jars. -For large inputs, the optimization step becomes more important. For instance, -processing the Java 6 run-time classes without optimization only takes 2 -minutes. -

-Memory usage (the amount of physical memory used by ProGuard while processing) -is governed by the basic java virtual machine and by the total size of the -library jars and program jars. - -


-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_console.gif b/tools/proguard/proguard6.0.3/docs/screenshot_console.gif deleted file mode 100644 index 8aea61e1..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_console.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_console_small.gif b/tools/proguard/proguard6.0.3/docs/screenshot_console_small.gif deleted file mode 100644 index 3f55f5b6..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_console_small.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui1.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui1.gif deleted file mode 100644 index 233e1800..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui1.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui2.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui2.gif deleted file mode 100644 index aecdb35f..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui2.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui3.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui3.gif deleted file mode 100644 index 17950eed..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui3.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui4.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui4.gif deleted file mode 100644 index 31e60fa5..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui4.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui5.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui5.gif deleted file mode 100644 index 1313db22..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui5.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui6.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui6.gif deleted file mode 100644 index c200b97a..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui6.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui7.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui7.gif deleted file mode 100644 index bc5d6ed9..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui7.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshot_gui8.gif b/tools/proguard/proguard6.0.3/docs/screenshot_gui8.gif deleted file mode 100644 index 95a1a30b..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshot_gui8.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/screenshots.html b/tools/proguard/proguard6.0.3/docs/screenshots.html deleted file mode 100644 index cba3e440..00000000 --- a/tools/proguard/proguard6.0.3/docs/screenshots.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - -ProGuard Screenshots - - - - - - -

Screenshots

- - -
- -GUI screenshot - - -ProGuard -Input/Output -Shrinking -Optimization -Obfuscation -Information -Process -ReTrace - - -The graphical user interface to ProGuard works like a wizard. It allows -you to browse through the presented tabs and fill them out. -

-You can click on the small tab buttons to see the full-size versions of the -tabs. - -

- -Console screenshot - -Of course, real developers don't need all this point-and-click fluff. They -write short configuration files using their favorite text editors and invoke -ProGuard from the command-line. -

-You can click on the image to see the full-size version. - -

- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - diff --git a/tools/proguard/proguard6.0.3/docs/screenshots_gui_small.gif b/tools/proguard/proguard6.0.3/docs/screenshots_gui_small.gif deleted file mode 100644 index bc32ccbb..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/screenshots_gui_small.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/sections.html b/tools/proguard/proguard6.0.3/docs/sections.html deleted file mode 100644 index ac29c55a..00000000 --- a/tools/proguard/proguard6.0.3/docs/sections.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - -Sections - - - - - -

-

-More Android app protection: -

- -DexGuard - -

-With support of - -

- -GuardSquare - -

- -SourceForge - -

- - - - diff --git a/tools/proguard/proguard6.0.3/docs/sflogo.png b/tools/proguard/proguard6.0.3/docs/sflogo.png deleted file mode 100644 index 142a6f99..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/sflogo.png and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/steel.gif b/tools/proguard/proguard6.0.3/docs/steel.gif deleted file mode 100644 index 307b57ab..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/steel.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/style.css b/tools/proguard/proguard6.0.3/docs/style.css deleted file mode 100644 index ce7e9956..00000000 --- a/tools/proguard/proguard6.0.3/docs/style.css +++ /dev/null @@ -1,278 +0,0 @@ -@charset "iso-8859-1"; - -/* Fonts. */ - -@font-face -{ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url('fonts/OpenSans-Regular.eot'); - src: local('Open Sans'), - local('OpenSans'), - url('fonts/OpenSans-Regular.eot?#iefix') format('embedded-opentype'), - url('fonts/OpenSans-Regular.woff') format('woff'), - url('fonts/OpenSans-Regular.ttf') format('truetype'), - url('fonts/OpenSans-Regular.svg#OpenSansRegular') format('svg'); -} - -@font-face -{ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: url('fonts/OpenSans-Bold.eot'); - src: local('Open Sans Bold'), - local('OpenSans-Bold'), - url('fonts/OpenSans-Bold.eot?#iefix') format('embedded-opentype'), - url('fonts/OpenSans-Bold.woff') format('woff'), - url('fonts/OpenSans-Bold.ttf') format('truetype'), - url('fonts/OpenSans-Bold.svg#OpenSansBold') format('svg'); -} - -@font-face -{ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: url('fonts/OpenSans-Italic.eot'); - src: local('Open Sans Italic'), - local('OpenSans-Italic'), - url('fonts/OpenSans-Italic.eot?#iefix') format('embedded-opentype'), - url('fonts/OpenSans-Italic.woff') format('woff'), - url('fonts/OpenSans-Italic.ttf') format('truetype'), - url('fonts/OpenSans-Italic.svg#OpenSansItalic') format('svg'); -} - -/* Global settings. */ - -body -{ - background: #FFFFFF; - font-family: "Open Sans",Verdana,sans-serif; -} - -h1 -{ - text-align: center; -} - -h2 -{ - text-align: center; -} - -h3 -{ - background: #EEEEFF; - padding: 10px; -} - -h3 div -{ - font-weight: normal; - font-size: 80%; - float: right; -} - -table -{ - width: 100%; -} - -th -{ - padding: 4px; -} - -tr.disappeared td -{ - background: #EEEEEE; -} - -td -{ - background: #EEEEFF; - padding: 8px; -} - -ul.spacious li -{ - padding: 8px; -} - -a -{ - text-decoration: none; -} - -img -{ - border: none; -} - -a.button { - color: #000000; - text-decoration: none; - background: #E0E0E0; - border: 1px outset #FFFFFF; - float: right; -} - -a.largebutton { - font-weight: bold; - color: #000000; - margin: 0px; - padding: 10px; - background: url("steel.gif"); - text-decoration: none; - border: 1px outset #FFFFFF; -} - -/* Settings for the introductory paragraph. */ - -p.intro -{ - background: #EEEEFF; - padding: 10px; - border: 1px solid #000000; -} - -/* Settings for the title frame. */ - -body.title -{ - margin: 0px; - padding: 0px; - background: #C0C0C0; -} - -div.title -{ - height: 48px; - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-color: #FFFFFF #808080 #808080 #FFFFFF; - background: url("steel.gif"); -} - -div.title h1 -{ - margin: 0px; - padding: 0px; - padding-top: 8px; - padding-left: 40%; - float: left; -} - -div.title div -{ - margin: 0px; - padding: 0px; - padding-top: 12px; - padding-right: 20px; - float: right; -} - -/* Settings for the section frames. */ - -body.navigation -{ - margin: 0px; - padding: 0px; - background: #F8F8F8; -} - -ul.navigation -{ - margin: 0px; - padding: 0px; - list-style: none; - text-align: center; - background: url("steel.gif"); -} - -ul.navigation li -{ - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-color: #FFFFFF #808080 #808080 #FFFFFF; - color: #000000; - font-weight: bold; -} - -ul.navigation li.title -{ - margin: 0px; - padding: 4px 10px; - background: #E0E0E0; -} - -ul.navigation li a -{ - margin: 0px; - padding: 6px 0px; - background: transparent; - color: #000000; - text-decoration: none; - display: block; -} - -ul.navigation li a:hover, -ul.navigation li a:focus -{ - background: #FFFFFF; -} - -/* Settings for the yellow note tables. */ - -table.note -{ - width: 408px; - border: none; - border-spacing: 0px; -} - -td.shadow8 -{ - width: 8px; - padding: 0px; - margin: 0px; - vertical-align: bottom; - background: transparent; -} - -td.shadow400 -{ - width: 400px; - padding: 0px; - margin: 0px; - text-align: right; - background: transparent; -} - -td.note -{ - width: 380px; - background: #FFFFC0; - padding: 0px; - margin: 0px; -} - -p.note -{ - padding: 0px; - margin: 0px 10px; - text-align: center; -} - -p.author -{ - padding: 0px; - margin: 0px 10px; - text-align: right; -} diff --git a/tools/proguard/proguard6.0.3/docs/testimonials.html b/tools/proguard/proguard6.0.3/docs/testimonials.html deleted file mode 100644 index cfb83fd5..00000000 --- a/tools/proguard/proguard6.0.3/docs/testimonials.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - -ProGuard Testimonials - - - - - - -

Testimonials

- -And now for some shameless self-glorification and name dropping... -

-ProGuard is probably the most popular java shrinker, optimizer, and -obfuscator world-wide. It is being used by developers at companies and -organizations like IBM, HP, Siemens, Nokia, Google, Intel, and NATO. It is the -default tool in many development environments like Oracle's Wireless Toolkit, -Netbeans, EclipseME, Google's Android SDK, and more. Although the quotes below -probably don't represent official views of any kind, encouragements like these -do keep me happy. -

- -

- - - - -

-ProGuard is the ultimate java obfuscator! -

-

P.S, IBM

-

- -From the Android Developers presentation on "Removing Unused Code": -

-

- - - - -

-ProGuard is a seriously sweet tool. -

-

D.E., Google

-

- -Also: -

- - - - -

-ProGuard is pure quality - powerful and trouble-free. -

-

M.B., Statestep

-

- -And: -

- - - - -

-It is the simplest and most robust obfuscator we have ever used. -

-

I.I., Hewlett-Packard

-

- -And indeed: -

- - - - -

-ProGuard rules. Much easier to use than the commercial alternatives. -

-

B.G., Quiotix Corp.

-

- -Straight from ProGuard's open discussion forum: -

-

- - - - -

-After searching for, trying to trial, and futzing with numerous other -obfuscators and shrinkers, ProGuard stands out as the simplest, most robust, -and accurate shrinker of them all. -

-

D.J., Joot

-

- -And, of course, the price is stunning: -

-

- - - - -

-You could've been rich. -

-

My mother

- -
-
-Copyright © 2002-2018 -Eric Lafortune @ GuardSquare. -
- - - diff --git a/tools/proguard/proguard6.0.3/docs/title.gif b/tools/proguard/proguard6.0.3/docs/title.gif deleted file mode 100644 index 5e6ca261..00000000 Binary files a/tools/proguard/proguard6.0.3/docs/title.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/docs/title.html b/tools/proguard/proguard6.0.3/docs/title.html deleted file mode 100644 index 46d4216f..00000000 --- a/tools/proguard/proguard6.0.3/docs/title.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - -ProGuard - - - -
-

ProGuard

-
Version 6.0
-
- - - diff --git a/tools/proguard/proguard6.0.3/examples/android/AndroidManifest.xml b/tools/proguard/proguard6.0.3/examples/android/AndroidManifest.xml deleted file mode 100644 index 6b6321da..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/android/build.gradle b/tools/proguard/proguard6.0.3/examples/android/build.gradle deleted file mode 100644 index 54e29370..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -buildscript { - repositories { - google() // For the Android plugin. - jcenter() // For anything else. - } - dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' - } - configurations.all { - resolutionStrategy { - // Override the default version of ProGuard - // with the most recent one. - force 'net.sf.proguard:proguard-gradle:6.0.3' - } - } -} - -apply plugin: 'com.android.application' - -android { - buildToolsVersion '27.0.0' - compileSdkVersion 25 - - signingConfigs { - debug { - storeFile file('debug.keystore') - storePassword 'android' - keyAlias 'androiddebugkey' - keyPassword 'android' - } - } - - defaultConfig { - signingConfig signingConfigs.debug - } - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - } - - instrumentTest.setRoot('tests') - } - - buildTypes { - debug { - minifyEnabled false - shrinkResources false - } - release { - minifyEnabled true - shrinkResources true - proguardFile getDefaultProguardFile('proguard-android-optimize.txt') - proguardFile 'proguard-project.txt' - } - } -} diff --git a/tools/proguard/proguard6.0.3/examples/android/debug.keystore b/tools/proguard/proguard6.0.3/examples/android/debug.keystore deleted file mode 100644 index 7e283478..00000000 Binary files a/tools/proguard/proguard6.0.3/examples/android/debug.keystore and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/examples/android/local.properties b/tools/proguard/proguard6.0.3/examples/android/local.properties deleted file mode 100644 index f414dfc3..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/local.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Location of the SDK. -#sdk.dir=/usr/local/java/android-sdk diff --git a/tools/proguard/proguard6.0.3/examples/android/proguard-project.txt b/tools/proguard/proguard6.0.3/examples/android/proguard-project.txt deleted file mode 100644 index 5a89ed55..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/proguard-project.txt +++ /dev/null @@ -1,127 +0,0 @@ -############################################################################### -# General settings. -############################################################################### - --verbose - -# We can debug the ProGuard configuration by instrumenting the code and -# checking the log for feedback. Disable the option again for actual releases! - -#-addconfigurationdebugging - -# We can also disable the individual processing steps. - -#-dontshrink -#-dontoptimize -#-dontobfuscate - -# Specifically target Android. - --android - - -############################################################################### -# Settings to handle reflection in the code. -############################################################################### - -# Preserve annotated and generated classes for Dagger. - --keepclassmembers,allowobfuscation class * { - @dagger.** *; -} - --keep class **$$ModuleAdapter --keep class **$$InjectAdapter --keep class **$$StaticInjection - --if class **$$ModuleAdapter --keep class <1> - --if class **$$InjectAdapter --keep class <1> - --if class **$$StaticInjection --keep class <1> - --keepnames class dagger.Lazy - -# Preserve annotated and generated classes for Butterknife. - --keep class **$$ViewBinder { - public static void bind(...); - public static void unbind(...); -} - --if class **$$ViewBinder --keep class <1> - --keep class **_ViewBinding { - (<1>, android.view.View); -} - --if class **_ViewBinding --keep class <1> - -# Preserve fields that are serialized with GSON. - -#-keepclassmembers class com.example.SerializedClass1, -# com.example.SerializedClass2 { -# ; -#} - --keepclassmembers,allowobfuscation class * { - @com.google.gson.annotations.SerializedName ; -} - --keep,allowobfuscation @interface com.google.gson.annotations.** - - -############################################################################### -# Further optimizations. -############################################################################### - -# If you wish, you can let the optimization step remove Android logging calls. - -#-assumenosideeffects class android.util.Log { -# public static boolean isLoggable(java.lang.String, int); -# public static int v(...); -# public static int i(...); -# public static int w(...); -# public static int d(...); -# public static int e(...); -#} - -# In that case, it's especially useful to also clean up any corresponding -# string concatenation calls. - --assumenoexternalsideeffects class java.lang.StringBuilder { - public java.lang.StringBuilder(); - public java.lang.StringBuilder(int); - public java.lang.StringBuilder(java.lang.String); - public java.lang.StringBuilder append(java.lang.Object); - public java.lang.StringBuilder append(java.lang.String); - public java.lang.StringBuilder append(java.lang.StringBuffer); - public java.lang.StringBuilder append(char[]); - public java.lang.StringBuilder append(char[], int, int); - public java.lang.StringBuilder append(boolean); - public java.lang.StringBuilder append(char); - public java.lang.StringBuilder append(int); - public java.lang.StringBuilder append(long); - public java.lang.StringBuilder append(float); - public java.lang.StringBuilder append(double); - public java.lang.String toString(); -} - --assumenoexternalreturnvalues class java.lang.StringBuilder { - public java.lang.StringBuilder append(java.lang.Object); - public java.lang.StringBuilder append(java.lang.String); - public java.lang.StringBuilder append(java.lang.StringBuffer); - public java.lang.StringBuilder append(char[]); - public java.lang.StringBuilder append(char[], int, int); - public java.lang.StringBuilder append(boolean); - public java.lang.StringBuilder append(char); - public java.lang.StringBuilder append(int); - public java.lang.StringBuilder append(long); - public java.lang.StringBuilder append(float); - public java.lang.StringBuilder append(double); -} diff --git a/tools/proguard/proguard6.0.3/examples/android/res/drawable/ic_launcher.png b/tools/proguard/proguard6.0.3/examples/android/res/drawable/ic_launcher.png deleted file mode 100644 index 6cd6d188..00000000 Binary files a/tools/proguard/proguard6.0.3/examples/android/res/drawable/ic_launcher.png and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/examples/android/res/values/colors.xml b/tools/proguard/proguard6.0.3/examples/android/res/values/colors.xml deleted file mode 100644 index a5109aad..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/res/values/colors.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - #4B7FCE - #4B7FCE - #7BAFCE - #4B7FCE - diff --git a/tools/proguard/proguard6.0.3/examples/android/res/values/strings.xml b/tools/proguard/proguard6.0.3/examples/android/res/values/strings.xml deleted file mode 100644 index 2bca7698..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - HelloWorld Sample - diff --git a/tools/proguard/proguard6.0.3/examples/android/res/values/styles.xml b/tools/proguard/proguard6.0.3/examples/android/res/values/styles.xml deleted file mode 100644 index 59baa699..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/tools/proguard/proguard6.0.3/examples/android/src/com/example/HelloWorldActivity.java b/tools/proguard/proguard6.0.3/examples/android/src/com/example/HelloWorldActivity.java deleted file mode 100644 index 2017ead5..00000000 --- a/tools/proguard/proguard6.0.3/examples/android/src/com/example/HelloWorldActivity.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Sample application to illustrate processing with ProGuard. - * - * Copyright (c) 2012-2018 GuardSquare NV - */ -package com.example; - -import android.app.Activity; -import android.os.Bundle; -import android.view.Gravity; -import android.widget.TextView; - -/** - * Sample activity that displays "Hello world!". - */ -public class HelloWorldActivity extends Activity -{ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Display the message. - TextView view = new TextView(this); - view.setText("Hello World"); - view.setGravity(Gravity.CENTER); - setContentView(view); - } -} diff --git a/tools/proguard/proguard6.0.3/examples/annotations/examples.pro b/tools/proguard/proguard6.0.3/examples/annotations/examples.pro deleted file mode 100644 index 7c9cf95d..00000000 --- a/tools/proguard/proguard6.0.3/examples/annotations/examples.pro +++ /dev/null @@ -1,65 +0,0 @@ -# -# This ProGuard configuration file illustrates how to use annotations for -# specifying which classes and class members should be kept. -# Usage: -# java -jar proguard.jar @examples.pro -# - -# Specify the input, output, and library jars. -# This is assuming the code has been compiled in the examples directory. - --injars examples(*.class) --outjars out - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) -#-libraryjars /jmods/..... - -# Some important configuration is based on the annotations in the code. -# We have to specify what the annotations mean to ProGuard. - --include lib/annotations.pro - -# -# We can then still add any other options that might be useful. -# - -# Print out a list of what we're preserving. - --printseeds - -# Preserve all annotations themselves. - --keepattributes *Annotation* - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Preserve the special static methods that are required in all enumeration -# classes. - --keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. -# You can comment this out if your application doesn't use serialization. -# If your code contains serializable classes that have to be backward -# compatible, please refer to the manual. - --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} diff --git a/tools/proguard/proguard6.0.3/examples/annotations/examples/Applet.java b/tools/proguard/proguard6.0.3/examples/annotations/examples/Applet.java deleted file mode 100644 index e5b7acca..00000000 --- a/tools/proguard/proguard6.0.3/examples/annotations/examples/Applet.java +++ /dev/null @@ -1,23 +0,0 @@ -import proguard.annotation.*; - -/** - * This applet illustrates the use of annotations for configuring ProGuard. - * - * You can compile it with: - * javac -classpath ../lib/annotations.jar Applet.java - * You can then process it with: - * java -jar ../../../lib/proguard.jar @ ../examples.pro - * - * The annotation will preserve the class and its essential methods, - * as a result of the specifications in lib/annotations.pro. - */ -@Keep -public class Applet extends java.applet.Applet -{ - // Implementations for Applet. - - public void init() - { - // ... - } -} diff --git a/tools/proguard/proguard6.0.3/examples/annotations/examples/Application.java b/tools/proguard/proguard6.0.3/examples/annotations/examples/Application.java deleted file mode 100644 index 777d2865..00000000 --- a/tools/proguard/proguard6.0.3/examples/annotations/examples/Application.java +++ /dev/null @@ -1,21 +0,0 @@ -import proguard.annotation.KeepApplication; - -/** - * This application illustrates the use of annotations for configuring ProGuard. - * - * You can compile it with: - * javac -classpath ../lib/annotations.jar Application.java - * You can then process it with: - * java -jar ../../../lib/proguard.jar @ ../examples.pro - * - * The annotation will preserve the class and its main method, - * as a result of the specifications in lib/annotations.pro. - */ -@KeepApplication -public class Application -{ - public static void main(String[] args) - { - System.out.println("The answer is 42"); - } -} diff --git a/tools/proguard/proguard6.0.3/examples/annotations/examples/Bean.java b/tools/proguard/proguard6.0.3/examples/annotations/examples/Bean.java deleted file mode 100644 index aacb5016..00000000 --- a/tools/proguard/proguard6.0.3/examples/annotations/examples/Bean.java +++ /dev/null @@ -1,57 +0,0 @@ -import proguard.annotation.*; - -/** - * This bean illustrates the use of annotations for configuring ProGuard. - * - * You can compile it with: - * javac -classpath ../lib/annotations.jar Bean.java - * You can then process it with: - * java -jar ../../../lib/proguard.jar @ ../examples.pro - * - * The annotations will preserve the class and its public getters and setters, - * as a result of the specifications in lib/annotations.pro. - */ -@Keep -@KeepPublicGettersSetters -public class Bean -{ - public boolean booleanProperty; - public int intProperty; - public String stringProperty; - - - public boolean isBooleanProperty() - { - return booleanProperty; - } - - - public void setBooleanProperty(boolean booleanProperty) - { - this.booleanProperty = booleanProperty; - } - - - public int getIntProperty() - { - return intProperty; - } - - - public void setIntProperty(int intProperty) - { - this.intProperty = intProperty; - } - - - public String getStringProperty() - { - return stringProperty; - } - - - public void setStringProperty(String stringProperty) - { - this.stringProperty = stringProperty; - } -} diff --git a/tools/proguard/proguard6.0.3/examples/annotations/examples/NativeCallBack.java b/tools/proguard/proguard6.0.3/examples/annotations/examples/NativeCallBack.java deleted file mode 100644 index a4e5583e..00000000 --- a/tools/proguard/proguard6.0.3/examples/annotations/examples/NativeCallBack.java +++ /dev/null @@ -1,52 +0,0 @@ -import proguard.annotation.*; - -/** - * This application illustrates the use of annotations for configuring ProGuard. - * - * You can compile it with: - * javac -classpath ../lib/annotations.jar NativeCallBack.java - * You can then process it with: - * java -jar ../../../lib/proguard.jar @ ../examples.pro - * - * The annotation will preserve the class and its main method, - * as a result of the specifications in lib/annotations.pro. - */ -@KeepApplication -public class NativeCallBack -{ - /** - * Suppose this is a native method that computes an answer. - * - * The -keep option for native methods in the regular ProGuard - * configuration will make sure it is not removed or renamed when - * processing this code. - */ - public native int computeAnswer(); - - - /** - * Suppose this method is called back from the above native method. - * - * ProGuard would remove it, because it is not referenced from java. - * The annotation will make sure it is preserved anyhow. - */ - @Keep - public int getAnswer() - { - return 42; - } - - - /** - * The main entry point of the application. - * - * The @KeepApplication annotation of this class will make sure it is not - * removed or renamed when processing this code. - */ - public static void main(String[] args) - { - int answer = new NativeCallBack().computeAnswer(); - - System.out.println("The answer is " + answer); - } -} diff --git a/tools/proguard/proguard6.0.3/examples/ant/applets.xml b/tools/proguard/proguard6.0.3/examples/ant/applets.xml deleted file mode 100644 index 5666f965..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/applets.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/ant/applications1.xml b/tools/proguard/proguard6.0.3/examples/ant/applications1.xml deleted file mode 100644 index 6df5789e..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/applications1.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/ant/applications2.xml b/tools/proguard/proguard6.0.3/examples/ant/applications2.xml deleted file mode 100644 index 664a9ee8..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/applications2.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - -injars in.jar - -outjars out.jar - - -libraryjars ${java.home}/lib/rt.jar - - - - - - - - -printmapping out.map - -renamesourcefileattribute SourceFile - -keepattributes SourceFile,LineNumberTable - - - - -keepattributes *Annotation* - - - - -keepclasseswithmembers public class * { - public static void main(java.lang.String[]); - } - - - - -keepclasseswithmembernames class * { - native <methods>; - } - - - - -keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); - } - - - - -keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); - } - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/ant/applications3.xml b/tools/proguard/proguard6.0.3/examples/ant/applications3.xml deleted file mode 100644 index 023c2bef..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/applications3.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/ant/library.xml b/tools/proguard/proguard6.0.3/examples/ant/library.xml deleted file mode 100644 index 37ceb1a8..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/library.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/ant/midlets.xml b/tools/proguard/proguard6.0.3/examples/ant/midlets.xml deleted file mode 100644 index fe17277a..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/midlets.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/ant/proguard.xml b/tools/proguard/proguard6.0.3/examples/ant/proguard.xml deleted file mode 100644 index 6e5f27a0..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/proguard.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/ant/servlets.xml b/tools/proguard/proguard6.0.3/examples/ant/servlets.xml deleted file mode 100644 index 33ca6cec..00000000 --- a/tools/proguard/proguard6.0.3/examples/ant/servlets.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/examples/dictionaries/compact.txt b/tools/proguard/proguard6.0.3/examples/dictionaries/compact.txt deleted file mode 100644 index 5636a3ee..00000000 --- a/tools/proguard/proguard6.0.3/examples/dictionaries/compact.txt +++ /dev/null @@ -1,18 +0,0 @@ -# -# This obfuscation dictionary contains strings that are already present -# in many class files. Since these strings can be shared, the resulting -# obfuscated class files will generally be a little bit more compact. -# Usage: -# java -jar proguard.jar ..... -obfuscationdictionary compact.txt -# - -Code -V -I -Z -B -C -S -F -D -L diff --git a/tools/proguard/proguard6.0.3/examples/dictionaries/keywords.txt b/tools/proguard/proguard6.0.3/examples/dictionaries/keywords.txt deleted file mode 100644 index 76f5a7b0..00000000 --- a/tools/proguard/proguard6.0.3/examples/dictionaries/keywords.txt +++ /dev/null @@ -1,58 +0,0 @@ -# -# This obfuscation dictionary contains reserved Java keywords. They can't -# be used in Java source files, but they can be used in compiled class files. -# Note that this hardly improves the obfuscation. Decent decompilers can -# automatically replace reserved keywords, and the effect can fairly simply be -# undone by obfuscating again with simpler names. -# Usage: -# java -jar proguard.jar ..... -obfuscationdictionary keywords.txt -# - -do -if -for -int -new -try -byte -case -char -else -goto -long -this -void -break -catch -class -const -final -float -short -super -throw -while -double -import -native -public -return -static -switch -throws -boolean -default -extends -finally -package -private -abstract -continue -strictfp -volatile -interface -protected -transient -implements -instanceof -synchronized diff --git a/tools/proguard/proguard6.0.3/examples/dictionaries/shakespeare.txt b/tools/proguard/proguard6.0.3/examples/dictionaries/shakespeare.txt deleted file mode 100644 index 28b1cd8d..00000000 --- a/tools/proguard/proguard6.0.3/examples/dictionaries/shakespeare.txt +++ /dev/null @@ -1,23 +0,0 @@ -# -# This obfuscation dictionary contains quotes from plays by Shakespeare. -# It illustrates that any text can be used, for whatever flippant reasons -# one may have. -# Usage: -# java -jar proguard.jar ..... -obfuscationdictionary shakespeare.txt -# - - -"This thing of darkness I acknowledge mine." - - --From The Tempest (V, i, 275-276) - - -"Though this be madness, yet there is method in 't." - - --From Hamlet (II, ii, 206) - - -"What's in a name? That which we call a rose - By any other word would smell as sweet." - - --From Romeo and Juliet (II, ii, 1-2) diff --git a/tools/proguard/proguard6.0.3/examples/dictionaries/windows.txt b/tools/proguard/proguard6.0.3/examples/dictionaries/windows.txt deleted file mode 100644 index fd65dc97..00000000 --- a/tools/proguard/proguard6.0.3/examples/dictionaries/windows.txt +++ /dev/null @@ -1,209 +0,0 @@ -# -# This obfuscation dictionary contains names that are not allowed as file names -# in Windows, not even with extensions like .class or .java. They can however -# be used without problems in jar archives, which just begs to apply them as -# obfuscated class names. Trying to unpack the obfuscated archives in Windows -# will probably generate some sparks. -# Usage: -# java -jar proguard.jar ..... -classobfuscationdictionary windows.txt -# -packageobfuscationdictionary windows.txt -# - -aux -Aux -aUx -AUx -auX -AuX -aUX -AUX -AUX -con -Con -cOn -COn -coN -CoN -cON -CON -CON -nul -Nul -nUl -NUl -nuL -NuL -nUL -NUL -NUL -prn -Prn -pRn -PRn -prN -PrN -pRN -PRN -PRN -com1 -Com1 -cOm1 -COm1 -coM1 -CoM1 -cOM1 -COM1 -COM1 -com2 -Com2 -cOm2 -COm2 -coM2 -CoM2 -cOM2 -COM2 -COM2 -com3 -Com3 -cOm3 -COm3 -coM3 -CoM3 -cOM3 -COM3 -COM3 -com4 -Com4 -cOm4 -COm4 -coM4 -CoM4 -cOM4 -COM4 -COM4 -com5 -Com5 -cOm5 -COm5 -coM5 -CoM5 -cOM5 -COM5 -COM5 -com6 -Com6 -cOm6 -COm6 -coM6 -CoM6 -cOM6 -COM6 -COM6 -com7 -Com7 -cOm7 -COm7 -coM7 -CoM7 -cOM7 -COM7 -COM7 -com8 -Com8 -cOm8 -COm8 -coM8 -CoM8 -cOM8 -COM8 -COM8 -com9 -Com9 -cOm9 -COm9 -coM9 -CoM9 -cOM9 -COM9 -COM9 -lpt1 -Lpt1 -lPt1 -LPt1 -lpT1 -LpT1 -lPT1 -LPT1 -LPT1 -lpt2 -Lpt2 -lPt2 -LPt2 -lpT2 -LpT2 -lPT2 -LPT2 -LPT2 -lpt3 -Lpt3 -lPt3 -LPt3 -lpT3 -LpT3 -lPT3 -LPT3 -LPT3 -lpt4 -Lpt4 -lPt4 -LPt4 -lpT4 -LpT4 -lPT4 -LPT4 -LPT4 -lpt5 -Lpt5 -lPt5 -LPt5 -lpT5 -LpT5 -lPT5 -LPT5 -LPT5 -lpt6 -Lpt6 -lPt6 -LPt6 -lpT6 -LpT6 -lPT6 -LPT6 -LPT6 -lpt7 -Lpt7 -lPt7 -LPt7 -lpT7 -LpT7 -lPT7 -LPT7 -LPT7 -lpt8 -Lpt8 -lPt8 -LPt8 -lpT8 -LpT8 -lPT8 -LPT8 -LPT8 -lpt9 -Lpt9 -lPt9 -LPt9 -lpT9 -LpT9 -lPT9 -LPT9 -LPT9 diff --git a/tools/proguard/proguard6.0.3/examples/gradle/android.gradle b/tools/proguard/proguard6.0.3/examples/gradle/android.gradle deleted file mode 100644 index 4d295f00..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/android.gradle +++ /dev/null @@ -1,284 +0,0 @@ -// -// This Gradle build file illustrates how to process Android -// applications. -// -// If you're using the Android SDK, the provided build systems with Gradle, -// Android Studio, Eclipse, and Ant already take care of the proper settings. -// You only need to enable ProGuard as explained in the Android documentation. -// You can still add project-specific configuration in proguard-project.txt. -// -// This configuration file is for custom, stand-alone builds. -// Usage: -// gradle -b android.gradle proguard - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - - //############################################################################## - // Input and output. - //############################################################################## - - // Specify the input jars, output jars, and library jars. - // Note that ProGuard works with Java bytecode (.class), - // before the dex compiler converts it into Dalvik code (.dex). - - injars 'bin/classes' - injars 'libs' - outjars 'bin/classes-processed.jar' - - libraryjars '/usr/local/android-sdk/platforms/android-27/android.jar' - //libraryjars '/usr/local/java/android-sdk/extras/android/support/v4/android-support-v4.jar' - //libraryjars '/usr/local/java/android-sdk/add-ons/addon-google_apis-google-21/libs/maps.jar' - // ... - - // Save the obfuscation mapping to a file, so you can de-obfuscate any stack - // traces later on. - - printmapping 'bin/classes-processed.map' - - // You can print out the seeds that are matching the keep options below. - - //printseeds 'bin/classes-processed.seeds' - - - //############################################################################## - // General settings. - //############################################################################## - - verbose - - // We can debug the ProGuard configuration by instrumenting the code and - // checking the log for feedback. Disable the option again for actual releases! - - //addconfigurationdebugging - - // We can also disable the individual processing steps. - - //dontshrink - //dontoptimize - //dontobfuscate - - // Specifically target Android. - - android - - // The dex compiler ignores preverification information. - - dontpreverify - - // Reduce the size of the output some more. - - repackageclasses '' - allowaccessmodification - - // Switch off some optimizations that trip older versions of the Dalvik VM. - - optimizations '!code/simplification/arithmetic' - - // Keep a fixed source file attribute and all line number tables to get line - // numbers in the stack traces. - - renamesourcefileattribute 'SourceFile' - keepattributes 'SourceFile,LineNumberTable' - - - //############################################################################## - // Settings to handle reflection in the code. - //############################################################################## - - // RemoteViews might need annotations. - - keepattributes '*Annotation*' - - // Preserve all fundamental application classes. - - keep 'public class * extends android.app.Activity' - keep 'public class * extends android.app.Application' - keep 'public class * extends android.app.Service' - keep 'public class * extends android.content.BroadcastReceiver' - keep 'public class * extends android.content.ContentProvider' - - // Preserve all View implementations, their special context constructors, and - // their setters. - - keep 'public class * extends android.view.View { \ - public (android.content.Context); \ - public (android.content.Context, android.util.AttributeSet); \ - public (android.content.Context, android.util.AttributeSet, int); \ - public void set*(...); \ - }' - - // Preserve all classes that have special context constructors, and the - // constructors themselves. - - keepclasseswithmembers 'class * { \ - public (android.content.Context, android.util.AttributeSet); \ - }' - - // Preserve all classes that have special context constructors, and the - // constructors themselves. - - keepclasseswithmembers 'class * { \ - public (android.content.Context, android.util.AttributeSet, int); \ - }' - - // Preserve all possible onClick handlers. - - keepclassmembers 'class * extends android.content.Context { \ - public void *(android.view.View); \ - public void *(android.view.MenuItem); \ - }' - - // Preserve the special fields of all Parcelable implementations. - - keepclassmembers 'class * implements android.os.Parcelable { \ - static android.os.Parcelable$Creator CREATOR; \ - }' - - // Preserve static fields of inner classes of R classes that might be accessed - // through introspection. - - keepclassmembers 'class **.R$* { \ - public static ; \ - }' - - // Preserve annotated Javascript interface methods. - - keepclassmembers 'class * { \ - @android.webkit.JavascriptInterface ; \ - }' - - // Preserve annotated and generated classes for Dagger. - - keepclassmembers allowobfuscation: true, 'class * { \ - @dagger.** *; \ - }' - - keep 'class **$$ModuleAdapter' - keep 'class **$$InjectAdapter' - keep 'class **$$StaticInjection' - - if 'class **$$ModuleAdapter' - keep 'class <1>' - - if 'class **$$InjectAdapter' - keep 'class <1>' - - if 'class **$$StaticInjection' - keep 'class <1>' - - keepnames 'class dagger.Lazy' - - // Preserve annotated and generated classes for Butterknife. - - keep 'class **$$ViewBinder { \ - public static void bind(...); \ - public static void unbind(...); \ - }' - - if 'class **$$ViewBinder' - keep 'class <1>' - - keep 'class **_ViewBinding { \ - (<1>, android.view.View); \ - }' - - if 'class **_ViewBinding' - keep 'class <1>' - - // Preserve fields that are serialized with GSON. - - //keepclassmembers 'class com.example.SerializedClass1,' - // com.example.SerializedClass2 { - // ; - //}' - - keepclassmembers allowobfuscation: true, 'class * { \ - @com.google.gson.annotations.SerializedName ; \ - }' - - keep allowobfuscation: true, '@interface com.google.gson.annotations.**' - - - // Preserve the required interface from the License Verification Library - // (but don't nag the developer if the library is not used at all). - - keep 'public interface com.android.vending.licensing.ILicensingService' - - dontnote 'com.android.vending.licensing.ILicensingService' - - // The Android Compatibility library references some classes that may not be - // present in all versions of the API, but we know that's ok. - - dontwarn 'android.support.**' - - // Preserve all native method names and the names of their classes. - - keepclasseswithmembernames,includedescriptorclasses 'class * { \ - native ; \ - }' - - // Preserve the special static methods that are required in all enumeration - // classes. - - keepclassmembers allowoptimization: true, 'enum * { \ - public static **[] values(); \ - public static ** valueOf(java.lang.String); \ - }' - - // Explicitly preserve all serialization members. The Serializable interface - // is only a marker interface, so it wouldn't save them. - // You can comment this out if your application doesn't use serialization. - // If your code contains serializable classes that have to be backward - // compatible, please refer to the manual. - - keepclassmembers 'class * implements java.io.Serializable { \ - static final long serialVersionUID; \ - static final java.io.ObjectStreamField[] serialPersistentFields; \ - private void writeObject(java.io.ObjectOutputStream); \ - private void readObject(java.io.ObjectInputStream); \ - java.lang.Object writeReplace(); \ - java.lang.Object readResolve(); \ - }' - - // Your application may contain more items that need to be preserved; - // typically classes that are dynamically created using Class.forName: - - // keep 'public class com.example.MyClass' - // keep 'public interface com.example.MyInterface' - // keep 'public class * implements com.example.MyInterface' - - - //############################################################################## - // Further optimizations. - //############################################################################## - - // If you wish, you can let the optimization step remove Android logging calls. - - //assumenosideeffects 'class android.util.Log {' - // public static boolean isLoggable(java.lang.String, int); - // public static int v(...); - // public static int i(...); - // public static int w(...); - // public static int d(...); - // public static int e(...); - //}' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/applets.gradle b/tools/proguard/proguard6.0.3/examples/gradle/applets.gradle deleted file mode 100644 index d655b5dd..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/applets.gradle +++ /dev/null @@ -1,98 +0,0 @@ -// -// This Gradle build file illustrates how to process applets. -// Usage: -// gradle -b applets.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - - injars 'in.jar' - outjars 'out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod ", jarfilter: '!**.jar', filter: '!module-info.class' - libraryjars "${System.getProperty('java.home')}/jmods/java.desktop.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - } - - // Save the obfuscation mapping to a file, so you can de-obfuscate any stack - // traces later on. Keep a fixed source file attribute and all line number - // tables to get line numbers in the stack traces. - // You can comment this out if you're not interested in stack traces. - - printmapping 'out.map' - renamesourcefileattribute 'SourceFile' - keepattributes 'SourceFile,LineNumberTable' - - // Preserve all annotations. - - keepattributes '*Annotation*' - - // You can print out the seeds that are matching the keep options below. - - //printseeds 'out.seeds' - - // Preserve all public applets. - - keep 'public class * extends java.applet.Applet' - - // Preserve all native method names and the names of their classes. - - keepclasseswithmembernames,includedescriptorclasses 'class * { \ - native ; \ - }' - - // Preserve the special static methods that are required in all enumeration - // classes. - - keepclassmembers allowoptimization: true, 'enum * { \ - public static **[] values(); \ - public static ** valueOf(java.lang.String); \ - }' - - // Explicitly preserve all serialization members. The Serializable interface - // is only a marker interface, so it wouldn't save them. - // You can comment this out if your library doesn't use serialization. - // If your code contains serializable classes that have to be backward - // compatible, please refer to the manual. - - keepclassmembers 'class * implements java.io.Serializable { \ - static final long serialVersionUID; \ - static final java.io.ObjectStreamField[] serialPersistentFields; \ - private void writeObject(java.io.ObjectOutputStream); \ - private void readObject(java.io.ObjectInputStream); \ - java.lang.Object writeReplace(); \ - java.lang.Object readResolve(); \ - }' - - // Your application may contain more items that need to be preserved; - // typically classes that are dynamically created using Class.forName: - - // keep 'public class com.example.MyClass' - // keep 'public interface com.example.MyInterface' - // keep 'public class * implements com.example.MyInterface' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/applications.gradle b/tools/proguard/proguard6.0.3/examples/gradle/applications.gradle deleted file mode 100644 index 1f6bb085..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/applications.gradle +++ /dev/null @@ -1,105 +0,0 @@ -// -// This Gradle build file illustrates how to process applications. -// Usage: -// gradle -b applications.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - - injars 'in.jar' - outjars 'out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - //libraryjars "${System.getProperty('java.home')}/jmods/....." - } - - //libraryjars 'junit.jar' - //libraryjars 'servlet.jar' - //libraryjars 'jai_core.jar' - //... - - // Save the obfuscation mapping to a file, so you can de-obfuscate any stack - // traces later on. Keep a fixed source file attribute and all line number - // tables to get line numbers in the stack traces. - // You can comment this out if you're not interested in stack traces. - - printmapping 'out.map' - renamesourcefileattribute 'SourceFile' - keepattributes 'SourceFile,LineNumberTable' - - // Preserve all annotations. - - keepattributes '*Annotation*' - - // You can print out the seeds that are matching the keep options below. - - //printseeds 'out.seeds' - - // Preserve all public applications. - - keepclasseswithmembers 'public class * { \ - public static void main(java.lang.String[]); \ - }' - - // Preserve all native method names and the names of their classes. - - keepclasseswithmembernames,includedescriptorclasses 'class * { \ - native ; \ - }' - - // Preserve the special static methods that are required in all enumeration - // classes. - - keepclassmembers allowoptimization: true, 'enum * { \ - public static **[] values(); \ - public static ** valueOf(java.lang.String); \ - }' - - // Explicitly preserve all serialization members. The Serializable interface - // is only a marker interface, so it wouldn't save them. - // You can comment this out if your application doesn't use serialization. - // If your code contains serializable classes that have to be backward - // compatible, please refer to the manual. - - keepclassmembers 'class * implements java.io.Serializable { \ - static final long serialVersionUID; \ - static final java.io.ObjectStreamField[] serialPersistentFields; \ - private void writeObject(java.io.ObjectOutputStream); \ - private void readObject(java.io.ObjectInputStream); \ - java.lang.Object writeReplace(); \ - java.lang.Object readResolve(); \ - }' - - // Your application may contain more items that need to be preserved; - // typically classes that are dynamically created using Class.forName: - - // keep 'public class com.example.MyClass' - // keep 'public interface com.example.MyInterface' - // keep 'public class * implements com.example.MyInterface' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/library.gradle b/tools/proguard/proguard6.0.3/examples/gradle/library.gradle deleted file mode 100644 index ec793d05..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/library.gradle +++ /dev/null @@ -1,108 +0,0 @@ -// -// This Gradle build file illustrates how to process a program -// library, such that it remains usable as a library. -// Usage: -// gradle -b library.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - // In this case, the input jar is the program library that we want to process. - - injars 'in.jar' - outjars 'out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - //libraryjars "${System.getProperty('java.home')}/jmods/....." - } - - // Save the obfuscation mapping to a file, so we can de-obfuscate any stack - // traces later on. Keep a fixed source file attribute and all line number - // tables to get line numbers in the stack traces. - // You can comment this out if you're not interested in stack traces. - - printmapping 'out.map' - keepparameternames - renamesourcefileattribute 'SourceFile' - keepattributes 'Exceptions,InnerClasses,Signature,Deprecated,' - SourceFile,LineNumberTable,EnclosingMethod - - // Preserve all annotations. - - keepattributes '*Annotation*' - - // Preserve all public classes, and their public and protected fields and - // methods. - - keep 'public class * { \ - public protected *; \ - }' - - // Preserve all .class method names. - - keepclassmembernames 'class * { \ - java.lang.Class class$(java.lang.String); \ - java.lang.Class class$(java.lang.String, boolean); \ - }' - - // Preserve all native method names and the names of their classes. - - keepclasseswithmembernames,includedescriptorclasses 'class * { \ - native ; \ - }' - - // Preserve the special static methods that are required in all enumeration - // classes. - - keepclassmembers allowoptimization: true, 'enum * { \ - public static **[] values(); \ - public static ** valueOf(java.lang.String); \ - }' - - // Explicitly preserve all serialization members. The Serializable interface - // is only a marker interface, so it wouldn't save them. - // You can comment this out if your library doesn't use serialization. - // If your code contains serializable classes that have to be backward - // compatible, please refer to the manual. - - keepclassmembers 'class * implements java.io.Serializable { \ - static final long serialVersionUID; \ - static final java.io.ObjectStreamField[] serialPersistentFields; \ - private void writeObject(java.io.ObjectOutputStream); \ - private void readObject(java.io.ObjectInputStream); \ - java.lang.Object writeReplace(); \ - java.lang.Object readResolve(); \ - }' - - // Your library may contain more items that need to be preserved; - // typically classes that are dynamically created using Class.forName: - - // keep 'public class com.example.MyClass' - // keep 'public interface com.example.MyInterface' - // keep 'public class * implements com.example.MyInterface' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/midlets.gradle b/tools/proguard/proguard6.0.3/examples/gradle/midlets.gradle deleted file mode 100644 index c26babcf..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/midlets.gradle +++ /dev/null @@ -1,88 +0,0 @@ -// -// This Gradle build file illustrates how to process J2ME midlets. -// Usage: -// gradle -b midlets.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - - injars 'in.jar' - outjars 'out.jar' - - libraryjars '/usr/local/java/wtk2.5.2/lib/midpapi20.jar' - libraryjars '/usr/local/java/wtk2.5.2/lib/cldcapi11.jar' - - // Preverify the code suitably for Java Micro Edition. - - microedition - - // Allow methods with the same signature, except for the return type, - // to get the same obfuscation name. - - overloadaggressively - - // Put all obfuscated classes into the nameless root package. - - repackageclasses '' - - // Allow classes and class members to be made public. - - allowaccessmodification - - // On Windows, you can't use mixed case class names, - // should you still want to use the preverify tool. - // - // dontusemixedcaseclassnames - - // Save the obfuscation mapping to a file, so you can de-obfuscate any stack - // traces later on. - - printmapping 'out.map' - - // You can keep a fixed source file attribute and all line number tables to - // get stack traces with line numbers. - - //renamesourcefileattribute 'SourceFile' - //keepattributes 'SourceFile,LineNumberTable' - - // You can print out the seeds that are matching the keep options below. - - //printseeds 'out.seeds' - - // Preserve all public midlets. - - keep 'public class * extends javax.microedition.midlet.MIDlet' - - // Preserve all native method names and the names of their classes. - - keepclasseswithmembernames,includedescriptorclasses 'class * { \ - native ; \ - }' - - // Your midlet may contain more items that need to be preserved; - // typically classes that are dynamically created using Class.forName: - - // keep 'public class com.example.MyClass' - // keep 'public interface com.example.MyInterface' - // keep 'public class * implements com.example.MyInterface' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/proguard.gradle b/tools/proguard/proguard6.0.3/examples/gradle/proguard.gradle deleted file mode 100644 index 8652bcee..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/proguard.gradle +++ /dev/null @@ -1,102 +0,0 @@ -// -// This Gradle build file illustrates how to process ProGuard itself. -// Configuration files for typical applications will be very similar. -// Usage: -// gradle -b proguard.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - // We'll filter out the Ant classes, Gradle classes, and WTK classes, keeping - // everything else. - - injars '../../lib/proguard.jar', filter: '!proguard/ant/**,!proguard/gradle/**,!proguard/wtk/**' - outjars 'proguard_out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - } - - // Write out an obfuscation mapping file, for de-obfuscating any stack traces - // later on, or for incremental obfuscation of extensions. - - printmapping 'proguard.map' - - // Don't print notes about reflection in injected code. - - dontnote 'proguard.configuration.ConfigurationLogger' - - // Allow methods with the same signature, except for the return type, - // to get the same obfuscation name. - - overloadaggressively - - // Put all obfuscated classes into the nameless root package. - - repackageclasses '' - - // Allow classes and class members to be made public. - - allowaccessmodification - - // The entry point: ProGuard and its main method. - - keep 'public class proguard.ProGuard { \ - public static void main(java.lang.String[]); \ - }' - - // If you want to preserve the Ant task as well, you'll have to specify the - // main ant.jar. - - //libraryjars '/usr/local/java/ant/lib/ant.jar' - //adaptresourcefilecontents 'proguard/ant/task.properties' - // - //keep allowobfuscation: true, 'class proguard.ant.*' - //keepclassmembers 'public class proguard.ant.* { \ - // (org.apache.tools.ant.Project); \ - // public void set*(***); \ - // public void add*(***); \ - //}' - - // If you want to preserve the Gradle task, you'll have to specify the Gradle - // jars. - - //libraryjars '/usr/local/java/gradle-4.2.1/lib/plugins/gradle-plugins-4.2.1.jar' - //libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-base-services-4.2.1.jar' - //libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-core-4.2.1.jar' - //libraryjars '/usr/local/java/gradle-4.2.1/lib/groovy-all-2.4.12.jar' - - //keep 'public class proguard.gradle.* { \ - // public *; \ - //}' - - // If you want to preserve the WTK obfuscation plug-in, you'll have to specify - // the kenv.zip file. - - //libraryjars '/usr/local/java/wtk2.5.2/wtklib/kenv.zip' - //keep 'public class proguard.wtk.ProGuardObfuscator' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/proguardall.gradle b/tools/proguard/proguard6.0.3/examples/gradle/proguardall.gradle deleted file mode 100644 index 48e822a3..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/proguardall.gradle +++ /dev/null @@ -1,108 +0,0 @@ -// -// This Gradle build file illustrates how to process ProGuard -// (including its main application, its GUI, its Ant task, and its WTK plugin), -// and the ReTrace tool, all in one go. -// Configuration files for typical applications will be very similar. -// Usage: -// gradle -b proguardall.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - // We'll read all jars from the lib directory, process them, and write the - // processed jars to a new out directory. - - injars '../../lib' - outjars 'out' - - // You may have to adapt the paths below. - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod ", jarfilter: '!**.jar', filter: '!module-info.class' - libraryjars "${System.getProperty('java.home')}/jmods/java.desktop.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - } - - libraryjars '/usr/local/java/ant/lib/ant.jar' - libraryjars '/usr/local/java/gradle-4.2.1/lib/plugins/gradle-plugins-4.2.1.jar' - libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-base-services-4.2.1.jar' - libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-logging-4.2.1.jar' - libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-core-api-4.2.1.jar' - libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-core-4.2.1.jar' - libraryjars '/usr/local/java/gradle-4.2.1/lib/groovy-all-2.4.12.jar' - libraryjars '/usr/local/java/wtk2.5.2/wtklib/kenv.zip' - - // Don't print notes about reflection in injected code. - - dontnote 'proguard.configuration.ConfigurationLogger' - - // Allow methods with the same signature, except for the return type, - // to get the same obfuscation name. - - overloadaggressively - - // Put all obfuscated classes into the nameless root package. - - repackageclasses '' - - // Adapt the names and contents of the resource files. - - adaptresourcefilenames '**.properties,**.gif,**.jpg' - adaptresourcefilecontents 'proguard/ant/task.properties' - - // The main entry points. - - keep 'public class proguard.ProGuard { \ - public static void main(java.lang.String[]); \ - }' - - keep 'public class proguard.gui.ProGuardGUI { \ - public static void main(java.lang.String[]); \ - }' - - keep 'public class proguard.retrace.ReTrace { \ - public static void main(java.lang.String[]); \ - }' - - // If we have ant.jar, we can properly process the Ant task. - - keep allowobfuscation: true, 'class proguard.ant.*' - keepclassmembers 'public class proguard.ant.* { \ - (org.apache.tools.ant.Project); \ - public void set*(***); \ - public void add*(***); \ - }' - - // If we have the Gradle jars, we can properly process the Gradle task. - - keep 'public class proguard.gradle.* { \ - public *; \ - }' - - // If we have kenv.zip, we can process the J2ME WTK plugin. - - keep 'public class proguard.wtk.ProGuardObfuscator' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/proguardgui.gradle b/tools/proguard/proguard6.0.3/examples/gradle/proguardgui.gradle deleted file mode 100644 index 5526b054..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/proguardgui.gradle +++ /dev/null @@ -1,85 +0,0 @@ -// -// This Gradle build file illustrates how to process the ProGuard GUI. -// Configuration files for typical applications will be very similar. -// Usage: -// gradle -b proguardgui.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - // The input jars will be merged in a single output jar. - // We'll filter out the Ant classes, Gradle classes, and WTK classes, keeping - // everything else. - - injars '../../lib/proguardgui.jar' - injars '../../lib/proguard.jar', filter: '!META-INF/**,!proguard/gradle/**,!proguard/ant/**,!proguard/wtk/**' - injars '../../lib/retrace.jar ', filter: '!META-INF/**' - outjars 'proguardgui_out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod ", jarfilter: '!**.jar', filter: '!module-info.class' - libraryjars "${System.getProperty('java.home')}/jmods/java.desktop.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - } - - // If we wanted to reuse the previously obfuscated proguard_out.jar, we could - // perform incremental obfuscation based on its mapping file, and only keep the - // additional GUI files instead of all files. - - //applymapping 'proguard.map' - //injars '../../lib/proguardgui.jar' - //outjars 'proguardgui_out.jar' - //libraryjars '../../lib/proguard.jar', filter: '!proguard/ant/**,!proguard/wtk/**' - //libraryjars '../../lib/retrace.jar' - //libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - //libraryjars "${System.getProperty('java.home')}/jmods/java.desktop.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - - - // Don't print notes about reflection in injected code. - - dontnote 'proguard.configuration.ConfigurationLogger' - - // Allow methods with the same signature, except for the return type, - // to get the same obfuscation name. - - overloadaggressively - - // Put all obfuscated classes into the nameless root package. - - repackageclasses '' - - // Adapt the names of resource files, based on the corresponding obfuscated - // class names. Notably, in this case, the GUI resource properties file will - // have to be renamed. - - adaptresourcefilenames '**.properties,**.gif,**.jpg' - - // The entry point: ProGuardGUI and its main method. - - keep 'public class proguard.gui.ProGuardGUI { \ - public static void main(java.lang.String[]); \ - }' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/retrace.gradle b/tools/proguard/proguard6.0.3/examples/gradle/retrace.gradle deleted file mode 100644 index 40d713e2..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/retrace.gradle +++ /dev/null @@ -1,75 +0,0 @@ -// -// This Gradle build file illustrates how to process the ReTrace tool. -// Configuration files for typical applications will be very similar. -// Usage: -// gradle -b retrace.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - // The input jars will be merged in a single output jar. - // We'll filter out the Ant and WTK classes. - - injars '../../lib/retrace.jar' - injars '../../lib/proguard.jar', filter: '!META-INF/MANIFEST.MF,!proguard/gui/**,!proguard/gradle/**,!proguard/ant/**,!proguard/wtk/**' - outjars 'retrace_out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - //libraryjars "${System.getProperty('java.home')}/jmods/....." - } - - // If we wanted to reuse the previously obfuscated proguard_out.jar, we could - // perform incremental obfuscation based on its mapping file, and only keep the - // additional ReTrace files instead of all files. - - //applymapping 'proguard.map' - //outjars 'retrace_out.jar', filter: 'proguard/retrace/**' - - // Don't print notes about reflection in injected code. - - dontnote 'proguard.configuration.ConfigurationLogger' - - // Allow methods with the same signature, except for the return type, - // to get the same obfuscation name. - - overloadaggressively - - // Put all obfuscated classes into the nameless root package. - - repackageclasses '' - - // Allow classes and class members to be made public. - - allowaccessmodification - - // The entry point: ReTrace and its main method. - - keep 'public class proguard.retrace.ReTrace { \ - public static void main(java.lang.String[]); \ - }' -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/scala.gradle b/tools/proguard/proguard6.0.3/examples/gradle/scala.gradle deleted file mode 100644 index e4f32783..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/scala.gradle +++ /dev/null @@ -1,162 +0,0 @@ -// -// This Gradle build file illustrates how to process Scala -// applications, including the Scala runtime. -// Usage: -// gradle -b scala.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - - injars 'in.jar' - injars '/usr/local/java/scala-2.9.1/lib/scala-library.jar' - //injars '/usr/local/java/scala-2.9.1/lib/scala-compiler.jar', filter: '!META-INF/MANIFEST.MF' - //injars '/usr/local/java/scala-2.9.1/lib/jline.jar', filter: '!META-INF/MANIFEST.MF' - outjars 'out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - //libraryjars "${System.getProperty('java.home')}/jmods/....." - } - - //libraryjars '/usr/local/java/ant/lib/ant.jar' - //... - - // Ignore some compiler artefacts. - - dontwarn 'scala.**' - - // Save the obfuscation mapping to a file, so you can de-obfuscate any stack - // traces later on. Keep a fixed source file attribute and all line number - // tables to get line numbers in the stack traces. - // You can comment this out if you're not interested in stack traces. - - printmapping 'out.map' - renamesourcefileattribute 'SourceFile' - keepattributes 'SourceFile,LineNumberTable' - - // Preserve all annotations. - - keepattributes '*Annotation*' - - // You can print out the seeds that are matching the keep options below. - - //printseeds 'out.seeds' - - // Preserve all public applications. - - keepclasseswithmembers 'public class * { \ - public static void main(java.lang.String[]); \ - }' - - // Preserve some classes and class members that are accessed by means of - // introspection. - - keep 'class * implements org.xml.sax.EntityResolver' - - keepclassmembers 'class * { \ - ** MODULE$; \ - }' - - keepclassmembernames 'class scala.concurrent.forkjoin.ForkJoinPool { \ - long eventCount; \ - int workerCounts; \ - int runControl; \ - scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; \ - scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; \ - }' - - keepclassmembernames 'class scala.concurrent.forkjoin.ForkJoinWorkerThread { \ - int base; \ - int sp; \ - int runState; \ - }' - - keepclassmembernames 'class scala.concurrent.forkjoin.ForkJoinTask { \ - int status; \ - }' - - keepclassmembernames 'class scala.concurrent.forkjoin.LinkedTransferQueue { \ - scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head; \ - scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail; \ - scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe; \ - }' - - // Preserve some classes and class members that are accessed by means of - // introspection in the Scala compiler library, if it is processed as well. - - //keep 'class * implements jline.Completor' - //keep 'class * implements jline.Terminal' - - //keep 'class scala.tools.nsc.Global' - - //keepclasseswithmembers 'class * { \ - // (scala.tools.nsc.Global); \ - //}' - - //keepclassmembers 'class * { \ - // *** scala_repl_value(); \ - // *** scala_repl_result(); \ - //}' - - // Preserve all native method names and the names of their classes. - - keepclasseswithmembernames,includedescriptorclasses 'class * { \ - native ; \ - }' - - // Preserve the special static methods that are required in all enumeration - // classes. - - keepclassmembers allowoptimization: true, 'enum * { \ - public static **[] values(); \ - public static ** valueOf(java.lang.String); \ - }' - - // Explicitly preserve all serialization members. The Serializable interface - // is only a marker interface, so it wouldn't save them. - // You can comment this out if your application doesn't use serialization. - // If your code contains serializable classes that have to be backward - // compatible, please refer to the manual. - - keepclassmembers 'class * implements java.io.Serializable { \ - static final long serialVersionUID; \ - static final java.io.ObjectStreamField[] serialPersistentFields; \ - private void writeObject(java.io.ObjectOutputStream); \ - private void readObject(java.io.ObjectInputStream); \ - java.lang.Object writeReplace(); \ - java.lang.Object readResolve(); \ - }' - - // Your application may contain more items that need to be preserved; - // typically classes that are dynamically created using Class.forName: - - // keep 'public class com.example.MyClass' - // keep 'public interface com.example.MyInterface' - // keep 'public class * implements com.example.MyInterface' - -} diff --git a/tools/proguard/proguard6.0.3/examples/gradle/servlets.gradle b/tools/proguard/proguard6.0.3/examples/gradle/servlets.gradle deleted file mode 100644 index f2ff869c..00000000 --- a/tools/proguard/proguard6.0.3/examples/gradle/servlets.gradle +++ /dev/null @@ -1,99 +0,0 @@ -// -// This Gradle build file illustrates how to process servlets. -// Usage: -// gradle -b servlets.gradle proguard -// - -// Tell Gradle where to find the ProGuard task. - -buildscript { - repositories { - flatDir dirs: '../../lib' - } - dependencies { - classpath ':proguard' - } -} - -// Define a ProGuard task. - -task ('proguard', type: proguard.gradle.ProGuardTask) { - - // You should probably import a more compact ProGuard-style configuration - // file for all static settings, but we're specifying them all here, for - // the sake of the example. - //configuration 'configuration.pro' - - // Specify the input jars, output jars, and library jars. - - injars 'in.jar' - outjars 'out.jar' - - // Automatically handle the Java version of this build. - if (System.getProperty('java.version').startsWith('1.')) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars "${System.getProperty('java.home')}/lib/rt.jar" - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' - } - - libraryjars '/usr/local/java/servlet/servlet.jar' - - // Save the obfuscation mapping to a file, so you can de-obfuscate any stack - // traces later on. Keep a fixed source file attribute and all line number - // tables to get line numbers in the stack traces. - // You can comment this out if you're not interested in stack traces. - - printmapping 'out.map' - renamesourcefileattribute 'SourceFile' - keepattributes 'SourceFile,LineNumberTable' - - // Preserve all annotations. - - keepattributes '*Annotation*' - - // You can print out the seeds that are matching the keep options below. - - //printseeds 'out.seeds' - - // Preserve all public servlets. - - keep 'public class * implements javax.servlet.Servlet' - - // Preserve all native method names and the names of their classes. - - keepclasseswithmembernames,includedescriptorclasses 'class * { \ - native ; \ - }' - - // Preserve the special static methods that are required in all enumeration - // classes. - - keepclassmembers allowoptimization: true, 'enum * { \ - public static **[] values(); \ - public static ** valueOf(java.lang.String); \ - }' - - // Explicitly preserve all serialization members. The Serializable interface - // is only a marker interface, so it wouldn't save them. - // You can comment this out if your library doesn't use serialization. - // If your code contains serializable classes that have to be backward - // compatible, please refer to the manual. - - keepclassmembers 'class * implements java.io.Serializable { \ - static final long serialVersionUID; \ - static final java.io.ObjectStreamField[] serialPersistentFields; \ - private void writeObject(java.io.ObjectOutputStream); \ - private void readObject(java.io.ObjectInputStream); \ - java.lang.Object writeReplace(); \ - java.lang.Object readResolve(); \ - }' - - // Your application may contain more items that need to be preserved; - // typically classes that are dynamically created using Class.forName: - - // keep 'public class com.example.MyClass' - // keep 'public interface com.example.MyInterface' - // keep 'public class * implements com.example.MyInterface' -} diff --git a/tools/proguard/proguard6.0.3/examples/standalone/android.pro b/tools/proguard/proguard6.0.3/examples/standalone/android.pro deleted file mode 100644 index 472974a9..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/android.pro +++ /dev/null @@ -1,263 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process Android -# applications. -# -# If you're using the Android SDK, the provided build systems with Gradle, -# Android Studio, Eclipse, and Ant already take care of the proper settings. -# You only need to enable ProGuard as explained in the Android documentation. -# You can still add project-specific configuration in proguard-project.txt. -# -# This configuration file is for custom, stand-alone builds. -# Usage: -# java -jar proguard.jar @android.pro - - -############################################################################### -# Input and output. -############################################################################### - -# Specify the input jars, output jars, and library jars. -# Note that ProGuard works with Java bytecode (.class), -# before the dex compiler converts it into Dalvik code (.dex). - --injars bin/classes --injars libs --outjars bin/classes-processed.jar - --libraryjars /usr/local/android-sdk/platforms/android-27/android.jar -#-libraryjars /usr/local/java/android-sdk/extras/android/support/v4/android-support-v4.jar -#-libraryjars /usr/local/java/android-sdk/add-ons/addon-google_apis-google-21/libs/maps.jar -# ... - -# Save the obfuscation mapping to a file, so you can de-obfuscate any stack -# traces later on. - --printmapping bin/classes-processed.map - -# You can print out the seeds that are matching the keep options below. - -#-printseeds bin/classes-processed.seeds - - -############################################################################### -# General settings. -############################################################################### - --verbose - -# We can debug the ProGuard configuration by instrumenting the code and -# checking the log for feedback. Disable the option again for actual releases! - -#-addconfigurationdebugging - -# We can also disable the individual processing steps. - -#-dontshrink -#-dontoptimize -#-dontobfuscate - -# Specifically target Android. - --android - -# The dex compiler ignores preverification information. - --dontpreverify - -# Reduce the size of the output some more. - --repackageclasses '' --allowaccessmodification - -# Switch off some optimizations that trip older versions of the Dalvik VM. - --optimizations !code/simplification/arithmetic - -# Keep a fixed source file attribute and all line number tables to get line -# numbers in the stack traces. - --renamesourcefileattribute SourceFile --keepattributes SourceFile,LineNumberTable - - -############################################################################### -# Settings to handle reflection in the code. -############################################################################### - -# RemoteViews might need annotations. - --keepattributes *Annotation* - -# Preserve all fundamental application classes. - --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider - -# Preserve all View implementations, their special context constructors, and -# their setters. - --keep public class * extends android.view.View { - public (android.content.Context); - public (android.content.Context, android.util.AttributeSet); - public (android.content.Context, android.util.AttributeSet, int); - public void set*(...); -} - -# Preserve all classes that have special context constructors, and the -# constructors themselves. - --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet); -} - -# Preserve all classes that have special context constructors, and the -# constructors themselves. - --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet, int); -} - -# Preserve all possible onClick handlers. - --keepclassmembers class * extends android.content.Context { - public void *(android.view.View); - public void *(android.view.MenuItem); -} - -# Preserve the special fields of all Parcelable implementations. - --keepclassmembers class * implements android.os.Parcelable { - static android.os.Parcelable$Creator CREATOR; -} - -# Preserve static fields of inner classes of R classes that might be accessed -# through introspection. - --keepclassmembers class **.R$* { - public static ; -} - -# Preserve annotated Javascript interface methods. - --keepclassmembers class * { - @android.webkit.JavascriptInterface ; -} - -# Preserve annotated and generated classes for Dagger. - --keepclassmembers,allowobfuscation class * { - @dagger.** *; -} - --keep class **$$ModuleAdapter --keep class **$$InjectAdapter --keep class **$$StaticInjection - --if class **$$ModuleAdapter --keep class <1> - --if class **$$InjectAdapter --keep class <1> - --if class **$$StaticInjection --keep class <1> - --keepnames class dagger.Lazy - -# Preserve annotated and generated classes for Butterknife. - --keep class **$$ViewBinder { - public static void bind(...); - public static void unbind(...); -} - --if class **$$ViewBinder --keep class <1> - --keep class **_ViewBinding { - (<1>, android.view.View); -} - --if class **_ViewBinding --keep class <1> - -# Preserve fields that are serialized with GSON. - -#-keepclassmembers class com.example.SerializedClass1, -# com.example.SerializedClass2 { -# ; -#} - --keepclassmembers,allowobfuscation class * { - @com.google.gson.annotations.SerializedName ; -} - --keep,allowobfuscation @interface com.google.gson.annotations.** - - -# Preserve the required interface from the License Verification Library -# (but don't nag the developer if the library is not used at all). - --keep public interface com.android.vending.licensing.ILicensingService - --dontnote com.android.vending.licensing.ILicensingService - -# The Android Compatibility library references some classes that may not be -# present in all versions of the API, but we know that's ok. - --dontwarn android.support.** - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Preserve the special static methods that are required in all enumeration -# classes. - --keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. -# You can comment this out if your application doesn't use serialization. -# If your code contains serializable classes that have to be backward -# compatible, please refer to the manual. - --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Your application may contain more items that need to be preserved; -# typically classes that are dynamically created using Class.forName: - -# -keep public class com.example.MyClass -# -keep public interface com.example.MyInterface -# -keep public class * implements com.example.MyInterface - - -############################################################################### -# Further optimizations. -############################################################################### - -# If you wish, you can let the optimization step remove Android logging calls. - -#-assumenosideeffects class android.util.Log { -# public static boolean isLoggable(java.lang.String, int); -# public static int v(...); -# public static int i(...); -# public static int w(...); -# public static int d(...); -# public static int e(...); -#} diff --git a/tools/proguard/proguard6.0.3/examples/standalone/applets.pro b/tools/proguard/proguard6.0.3/examples/standalone/applets.pro deleted file mode 100644 index 2344f7bf..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/applets.pro +++ /dev/null @@ -1,74 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process applets. -# Usage: -# java -jar proguard.jar @applets.pro -# - -# Specify the input jars, output jars, and library jars. - --injars in.jar --outjars out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod (!**.jar;!module-info.class) --libraryjars /jmods/java.desktop.jmod(!**.jar;!module-info.class) - -# Save the obfuscation mapping to a file, so you can de-obfuscate any stack -# traces later on. Keep a fixed source file attribute and all line number -# tables to get line numbers in the stack traces. -# You can comment this out if you're not interested in stack traces. - --printmapping out.map --renamesourcefileattribute SourceFile --keepattributes SourceFile,LineNumberTable - -# Preserve all annotations. - --keepattributes *Annotation* - -# You can print out the seeds that are matching the keep options below. - -#-printseeds out.seeds - -# Preserve all public applets. - --keep public class * extends java.applet.Applet - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Preserve the special static methods that are required in all enumeration -# classes. - --keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. -# You can comment this out if your library doesn't use serialization. -# If your code contains serializable classes that have to be backward -# compatible, please refer to the manual. - --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Your application may contain more items that need to be preserved; -# typically classes that are dynamically created using Class.forName: - -# -keep public class com.example.MyClass -# -keep public interface com.example.MyInterface -# -keep public class * implements com.example.MyInterface diff --git a/tools/proguard/proguard6.0.3/examples/standalone/applications.pro b/tools/proguard/proguard6.0.3/examples/standalone/applications.pro deleted file mode 100644 index 326d88b1..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/applications.pro +++ /dev/null @@ -1,81 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process applications. -# Usage: -# java -jar proguard.jar @applications.pro -# - -# Specify the input jars, output jars, and library jars. - --injars in.jar --outjars out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) -#-libraryjars /jmods/..... - -#-libraryjars junit.jar -#-libraryjars servlet.jar -#-libraryjars jai_core.jar -#... - -# Save the obfuscation mapping to a file, so you can de-obfuscate any stack -# traces later on. Keep a fixed source file attribute and all line number -# tables to get line numbers in the stack traces. -# You can comment this out if you're not interested in stack traces. - --printmapping out.map --renamesourcefileattribute SourceFile --keepattributes SourceFile,LineNumberTable - -# Preserve all annotations. - --keepattributes *Annotation* - -# You can print out the seeds that are matching the keep options below. - -#-printseeds out.seeds - -# Preserve all public applications. - --keepclasseswithmembers public class * { - public static void main(java.lang.String[]); -} - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Preserve the special static methods that are required in all enumeration -# classes. - --keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. -# You can comment this out if your application doesn't use serialization. -# If your code contains serializable classes that have to be backward -# compatible, please refer to the manual. - --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Your application may contain more items that need to be preserved; -# typically classes that are dynamically created using Class.forName: - -# -keep public class com.example.MyClass -# -keep public interface com.example.MyInterface -# -keep public class * implements com.example.MyInterface diff --git a/tools/proguard/proguard6.0.3/examples/standalone/library.pro b/tools/proguard/proguard6.0.3/examples/standalone/library.pro deleted file mode 100644 index 671797d2..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/library.pro +++ /dev/null @@ -1,84 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process a program -# library, such that it remains usable as a library. -# Usage: -# java -jar proguard.jar @library.pro -# - -# Specify the input jars, output jars, and library jars. -# In this case, the input jar is the program library that we want to process. - --injars in.jar --outjars out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) -#-libraryjars /jmods/..... - -# Save the obfuscation mapping to a file, so we can de-obfuscate any stack -# traces later on. Keep a fixed source file attribute and all line number -# tables to get line numbers in the stack traces. -# You can comment this out if you're not interested in stack traces. - --printmapping out.map --keepparameternames --renamesourcefileattribute SourceFile --keepattributes Exceptions,InnerClasses,Signature,Deprecated, - SourceFile,LineNumberTable,EnclosingMethod - -# Preserve all annotations. - --keepattributes *Annotation* - -# Preserve all public classes, and their public and protected fields and -# methods. - --keep public class * { - public protected *; -} - -# Preserve all .class method names. - --keepclassmembernames class * { - java.lang.Class class$(java.lang.String); - java.lang.Class class$(java.lang.String, boolean); -} - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Preserve the special static methods that are required in all enumeration -# classes. - --keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. -# You can comment this out if your library doesn't use serialization. -# If your code contains serializable classes that have to be backward -# compatible, please refer to the manual. - --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Your library may contain more items that need to be preserved; -# typically classes that are dynamically created using Class.forName: - -# -keep public class com.example.MyClass -# -keep public interface com.example.MyInterface -# -keep public class * implements com.example.MyInterface diff --git a/tools/proguard/proguard6.0.3/examples/standalone/midlets.pro b/tools/proguard/proguard6.0.3/examples/standalone/midlets.pro deleted file mode 100644 index 1ddfab58..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/midlets.pro +++ /dev/null @@ -1,67 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process J2ME midlets. -# Usage: -# java -jar proguard.jar @midlets.pro -# - -# Specify the input jars, output jars, and library jars. - --injars in.jar --outjars out.jar - --libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar --libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar - -# Preverify the code suitably for Java Micro Edition. - --microedition - -# Allow methods with the same signature, except for the return type, -# to get the same obfuscation name. - --overloadaggressively - -# Put all obfuscated classes into the nameless root package. - --repackageclasses '' - -# Allow classes and class members to be made public. - --allowaccessmodification - -# On Windows, you can't use mixed case class names, -# should you still want to use the preverify tool. -# -# -dontusemixedcaseclassnames - -# Save the obfuscation mapping to a file, so you can de-obfuscate any stack -# traces later on. - --printmapping out.map - -# You can keep a fixed source file attribute and all line number tables to -# get stack traces with line numbers. - -#-renamesourcefileattribute SourceFile -#-keepattributes SourceFile,LineNumberTable - -# You can print out the seeds that are matching the keep options below. - -#-printseeds out.seeds - -# Preserve all public midlets. - --keep public class * extends javax.microedition.midlet.MIDlet - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Your midlet may contain more items that need to be preserved; -# typically classes that are dynamically created using Class.forName: - -# -keep public class com.example.MyClass -# -keep public interface com.example.MyInterface -# -keep public class * implements com.example.MyInterface diff --git a/tools/proguard/proguard6.0.3/examples/standalone/proguard.pro b/tools/proguard/proguard6.0.3/examples/standalone/proguard.pro deleted file mode 100644 index 2864b32c..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/proguard.pro +++ /dev/null @@ -1,78 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process ProGuard itself. -# Configuration files for typical applications will be very similar. -# Usage: -# java -jar proguard.jar @proguard.pro -# - -# Specify the input jars, output jars, and library jars. -# We'll filter out the Ant classes, Gradle classes, and WTK classes, keeping -# everything else. - --injars ../../lib/proguard.jar(!proguard/ant/**,!proguard/gradle/**,!proguard/wtk/**) --outjars proguard_out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) - -# Write out an obfuscation mapping file, for de-obfuscating any stack traces -# later on, or for incremental obfuscation of extensions. - --printmapping proguard.map - -# Don't print notes about reflection in injected code. - --dontnote proguard.configuration.ConfigurationLogger - -# Allow methods with the same signature, except for the return type, -# to get the same obfuscation name. - --overloadaggressively - -# Put all obfuscated classes into the nameless root package. - --repackageclasses '' - -# Allow classes and class members to be made public. - --allowaccessmodification - -# The entry point: ProGuard and its main method. - --keep public class proguard.ProGuard { - public static void main(java.lang.String[]); -} - -# If you want to preserve the Ant task as well, you'll have to specify the -# main ant.jar. - -#-libraryjars /usr/local/java/ant/lib/ant.jar -#-adaptresourcefilecontents proguard/ant/task.properties -# -#-keep,allowobfuscation class proguard.ant.* -#-keepclassmembers public class proguard.ant.* { -# (org.apache.tools.ant.Project); -# public void set*(***); -# public void add*(***); -#} - -# If you want to preserve the Gradle task, you'll have to specify the Gradle -# jars. - -#-libraryjars /usr/local/java/gradle-4.2.1/lib/plugins/gradle-plugins-4.2.1.jar -#-libraryjars /usr/local/java/gradle-4.2.1/lib/gradle-base-services-4.2.1.jar -#-libraryjars /usr/local/java/gradle-4.2.1/lib/gradle-core-4.2.1.jar -#-libraryjars /usr/local/java/gradle-4.2.1/lib/groovy-all-2.4.12.jar - -#-keep public class proguard.gradle.* { -# public *; -#} - -# If you want to preserve the WTK obfuscation plug-in, you'll have to specify -# the kenv.zip file. - -#-libraryjars /usr/local/java/wtk2.5.2/wtklib/kenv.zip -#-keep public class proguard.wtk.ProGuardObfuscator diff --git a/tools/proguard/proguard6.0.3/examples/standalone/proguardall.pro b/tools/proguard/proguard6.0.3/examples/standalone/proguardall.pro deleted file mode 100644 index 4d4f2944..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/proguardall.pro +++ /dev/null @@ -1,84 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process ProGuard -# (including its main application, its GUI, its Ant task, and its WTK plugin), -# and the ReTrace tool, all in one go. -# Configuration files for typical applications will be very similar. -# Usage: -# java -jar proguard.jar @proguardall.pro -# - -# Specify the input jars, output jars, and library jars. -# We'll read all jars from the lib directory, process them, and write the -# processed jars to a new out directory. - --injars ../../lib --outjars out - -# You may have to adapt the paths below. - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod (!**.jar;!module-info.class) --libraryjars /jmods/java.desktop.jmod(!**.jar;!module-info.class) - --libraryjars /usr/local/java/ant/lib/ant.jar --libraryjars /usr/local/java/gradle-4.2.1/lib/plugins/gradle-plugins-4.2.1.jar --libraryjars /usr/local/java/gradle-4.2.1/lib/gradle-base-services-4.2.1.jar --libraryjars /usr/local/java/gradle-4.2.1/lib/gradle-logging-4.2.1.jar --libraryjars /usr/local/java/gradle-4.2.1/lib/gradle-core-api-4.2.1.jar --libraryjars /usr/local/java/gradle-4.2.1/lib/gradle-core-4.2.1.jar --libraryjars /usr/local/java/gradle-4.2.1/lib/groovy-all-2.4.12.jar --libraryjars /usr/local/java/wtk2.5.2/wtklib/kenv.zip - -# Don't print notes about reflection in injected code. - --dontnote proguard.configuration.ConfigurationLogger - -# Allow methods with the same signature, except for the return type, -# to get the same obfuscation name. - --overloadaggressively - -# Put all obfuscated classes into the nameless root package. - --repackageclasses '' - -# Adapt the names and contents of the resource files. - --adaptresourcefilenames **.properties,**.gif,**.jpg --adaptresourcefilecontents proguard/ant/task.properties - -# The main entry points. - --keep public class proguard.ProGuard { - public static void main(java.lang.String[]); -} - --keep public class proguard.gui.ProGuardGUI { - public static void main(java.lang.String[]); -} - --keep public class proguard.retrace.ReTrace { - public static void main(java.lang.String[]); -} - -# If we have ant.jar, we can properly process the Ant task. - --keep,allowobfuscation class proguard.ant.* --keepclassmembers public class proguard.ant.* { - (org.apache.tools.ant.Project); - public void set*(***); - public void add*(***); -} - -# If we have the Gradle jars, we can properly process the Gradle task. - --keep public class proguard.gradle.* { - public *; -} - -# If we have kenv.zip, we can process the J2ME WTK plugin. - --keep public class proguard.wtk.ProGuardObfuscator diff --git a/tools/proguard/proguard6.0.3/examples/standalone/proguardgui.pro b/tools/proguard/proguard6.0.3/examples/standalone/proguardgui.pro deleted file mode 100644 index bcca5895..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/proguardgui.pro +++ /dev/null @@ -1,61 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process the ProGuard GUI. -# Configuration files for typical applications will be very similar. -# Usage: -# java -jar proguard.jar @proguardgui.pro -# - -# Specify the input jars, output jars, and library jars. -# The input jars will be merged in a single output jar. -# We'll filter out the Ant classes, Gradle classes, and WTK classes, keeping -# everything else. - --injars ../../lib/proguardgui.jar --injars ../../lib/proguard.jar(!META-INF/**,!proguard/gradle/**,!proguard/ant/**,!proguard/wtk/**) --injars ../../lib/retrace.jar (!META-INF/**) --outjars proguardgui_out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod (!**.jar;!module-info.class) --libraryjars /jmods/java.desktop.jmod(!**.jar;!module-info.class) - -# If we wanted to reuse the previously obfuscated proguard_out.jar, we could -# perform incremental obfuscation based on its mapping file, and only keep the -# additional GUI files instead of all files. - -#-applymapping proguard.map -#-injars ../../lib/proguardgui.jar -#-outjars proguardgui_out.jar -#-libraryjars ../../lib/proguard.jar(!proguard/ant/**,!proguard/wtk/**) -#-libraryjars ../../lib/retrace.jar -#-libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) -#-libraryjars /jmods/java.desktop.jmod(!**.jar;!module-info.class) - - -# Don't print notes about reflection in injected code. - --dontnote proguard.configuration.ConfigurationLogger - -# Allow methods with the same signature, except for the return type, -# to get the same obfuscation name. - --overloadaggressively - -# Put all obfuscated classes into the nameless root package. - --repackageclasses '' - -# Adapt the names of resource files, based on the corresponding obfuscated -# class names. Notably, in this case, the GUI resource properties file will -# have to be renamed. - --adaptresourcefilenames **.properties,**.gif,**.jpg - -# The entry point: ProGuardGUI and its main method. - --keep public class proguard.gui.ProGuardGUI { - public static void main(java.lang.String[]); -} diff --git a/tools/proguard/proguard6.0.3/examples/standalone/retrace.pro b/tools/proguard/proguard6.0.3/examples/standalone/retrace.pro deleted file mode 100644 index 010fc2cc..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/retrace.pro +++ /dev/null @@ -1,51 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process the ReTrace tool. -# Configuration files for typical applications will be very similar. -# Usage: -# java -jar proguard.jar @retrace.pro -# - -# Specify the input jars, output jars, and library jars. -# The input jars will be merged in a single output jar. -# We'll filter out the Ant and WTK classes. - --injars ../../lib/retrace.jar --injars ../../lib/proguard.jar(!META-INF/MANIFEST.MF,!proguard/gui/**,!proguard/gradle/**,!proguard/ant/**,!proguard/wtk/**) --outjars retrace_out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) -#-libraryjars /jmods/..... - -# If we wanted to reuse the previously obfuscated proguard_out.jar, we could -# perform incremental obfuscation based on its mapping file, and only keep the -# additional ReTrace files instead of all files. - -#-applymapping proguard.map -#-outjars retrace_out.jar(proguard/retrace/**) - -# Don't print notes about reflection in injected code. - --dontnote proguard.configuration.ConfigurationLogger - -# Allow methods with the same signature, except for the return type, -# to get the same obfuscation name. - --overloadaggressively - -# Put all obfuscated classes into the nameless root package. - --repackageclasses '' - -# Allow classes and class members to be made public. - --allowaccessmodification - -# The entry point: ReTrace and its main method. - --keep public class proguard.retrace.ReTrace { - public static void main(java.lang.String[]); -} diff --git a/tools/proguard/proguard6.0.3/examples/standalone/scala.pro b/tools/proguard/proguard6.0.3/examples/standalone/scala.pro deleted file mode 100644 index b1c9acd4..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/scala.pro +++ /dev/null @@ -1,138 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process Scala -# applications, including the Scala runtime. -# Usage: -# java -jar proguard.jar @scala.pro -# - -# Specify the input jars, output jars, and library jars. - --injars in.jar --injars /usr/local/java/scala-2.9.1/lib/scala-library.jar -#-injars /usr/local/java/scala-2.9.1/lib/scala-compiler.jar(!META-INF/MANIFEST.MF) -#-injars /usr/local/java/scala-2.9.1/lib/jline.jar(!META-INF/MANIFEST.MF) --outjars out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) -#-libraryjars /jmods/..... - -#-libraryjars /usr/local/java/ant/lib/ant.jar -#... - -# Ignore some compiler artefacts. - --dontwarn scala.** - -# Save the obfuscation mapping to a file, so you can de-obfuscate any stack -# traces later on. Keep a fixed source file attribute and all line number -# tables to get line numbers in the stack traces. -# You can comment this out if you're not interested in stack traces. - --printmapping out.map --renamesourcefileattribute SourceFile --keepattributes SourceFile,LineNumberTable - -# Preserve all annotations. - --keepattributes *Annotation* - -# You can print out the seeds that are matching the keep options below. - -#-printseeds out.seeds - -# Preserve all public applications. - --keepclasseswithmembers public class * { - public static void main(java.lang.String[]); -} - -# Preserve some classes and class members that are accessed by means of -# introspection. - --keep class * implements org.xml.sax.EntityResolver - --keepclassmembers class * { - ** MODULE$; -} - --keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool { - long eventCount; - int workerCounts; - int runControl; - scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; - scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; -} - --keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread { - int base; - int sp; - int runState; -} - --keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask { - int status; -} - --keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue { - scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head; - scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail; - scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe; -} - -# Preserve some classes and class members that are accessed by means of -# introspection in the Scala compiler library, if it is processed as well. - -#-keep class * implements jline.Completor -#-keep class * implements jline.Terminal - -#-keep class scala.tools.nsc.Global - -#-keepclasseswithmembers class * { -# (scala.tools.nsc.Global); -#} - -#-keepclassmembers class * { -# *** scala_repl_value(); -# *** scala_repl_result(); -#} - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Preserve the special static methods that are required in all enumeration -# classes. - --keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. -# You can comment this out if your application doesn't use serialization. -# If your code contains serializable classes that have to be backward -# compatible, please refer to the manual. - --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Your application may contain more items that need to be preserved; -# typically classes that are dynamically created using Class.forName: - -# -keep public class com.example.MyClass -# -keep public interface com.example.MyInterface -# -keep public class * implements com.example.MyInterface - diff --git a/tools/proguard/proguard6.0.3/examples/standalone/servlets.pro b/tools/proguard/proguard6.0.3/examples/standalone/servlets.pro deleted file mode 100644 index e899f679..00000000 --- a/tools/proguard/proguard6.0.3/examples/standalone/servlets.pro +++ /dev/null @@ -1,75 +0,0 @@ -# -# This ProGuard configuration file illustrates how to process servlets. -# Usage: -# java -jar proguard.jar @servlets.pro -# - -# Specify the input jars, output jars, and library jars. - --injars in.jar --outjars out.jar - -# Before Java 9, the runtime classes were packaged in a single jar file. -#-libraryjars /lib/rt.jar - -# As of Java 9, the runtime classes are packaged in modular jmod files. --libraryjars /jmods/java.base.jmod(!**.jar;!module-info.class) - --libraryjars /usr/local/java/servlet/servlet.jar - -# Save the obfuscation mapping to a file, so you can de-obfuscate any stack -# traces later on. Keep a fixed source file attribute and all line number -# tables to get line numbers in the stack traces. -# You can comment this out if you're not interested in stack traces. - --printmapping out.map --renamesourcefileattribute SourceFile --keepattributes SourceFile,LineNumberTable - -# Preserve all annotations. - --keepattributes *Annotation* - -# You can print out the seeds that are matching the keep options below. - -#-printseeds out.seeds - -# Preserve all public servlets. - --keep public class * implements javax.servlet.Servlet - -# Preserve all native method names and the names of their classes. - --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Preserve the special static methods that are required in all enumeration -# classes. - --keepclassmembers,allowoptimization enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. -# You can comment this out if your library doesn't use serialization. -# If your code contains serializable classes that have to be backward -# compatible, please refer to the manual. - --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Your application may contain more items that need to be preserved; -# typically classes that are dynamically created using Class.forName: - -# -keep public class com.example.MyClass -# -keep public interface com.example.MyInterface -# -keep public class * implements com.example.MyInterface diff --git a/tools/proguard/proguard6.0.3/gradle/ant.properties b/tools/proguard/proguard6.0.3/gradle/ant.properties deleted file mode 100644 index 46c9d1ea..00000000 --- a/tools/proguard/proguard6.0.3/gradle/ant.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Ant build properties for the ProGuard Gradle task. - -gradle.home = /usr/local/java/gradle diff --git a/tools/proguard/proguard6.0.3/gradle/build.gradle b/tools/proguard/proguard6.0.3/gradle/build.gradle deleted file mode 100644 index a2278c72..00000000 --- a/tools/proguard/proguard6.0.3/gradle/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -// Gradle build script for the ProGuard Gradle task. - -apply plugin: 'java' - -sourceSets.main { - java { - srcDirs = ['src'] - } - resources { - srcDirs = ['src'] - include '**/*.properties' - include '**/*.gif' - include '**/*.png' - include '**/*.pro' - } -} - -dependencies { - compile project(':core') - compile gradleApi() -} diff --git a/tools/proguard/proguard6.0.3/gradle/build.sh b/tools/proguard/proguard6.0.3/gradle/build.sh deleted file mode 100644 index 2921df86..00000000 --- a/tools/proguard/proguard6.0.3/gradle/build.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for the ProGuard Gradle task. - -cd $(dirname "$0") - -source ../buildscripts/functions.sh - -MAIN_CLASS=proguard.gradle.ProGuardTask - -GRADLE_HOME=${GRADLE_HOME:-/usr/local/java/gradle} - -GRADLE_PATH=\ -$(echo $GRADLE_HOME/lib/plugins/gradle-plugins-*.jar):\ -$(echo $GRADLE_HOME/lib/gradle-logging-*.jar):\ -$(echo $GRADLE_HOME/lib/gradle-base-services-?.*.jar):\ -$(echo $GRADLE_HOME/lib/gradle-base-services-groovy-*.jar):\ -$(echo $GRADLE_HOME/lib/gradle-core-[0-9]*.jar):\ -$(echo $GRADLE_HOME/lib/gradle-core-api-*.jar):\ -$(echo $GRADLE_HOME/lib/groovy-all-*.jar) - -# Make sure the Gradle jars are present. -if [ ! -f "${GRADLE_PATH%%:*}" ]; then - echo "Please make sure the environment variable GRADLE_HOME is set correctly," - echo "if you want to compile the optional ProGuard Gradle task." - exit 1 -fi - -# Make sure the ProGuard core has been compiled. -if [ ! -d ../core/$OUT ]; then - ../core/build.sh || exit 1 -fi - -# Compile and package. -export CLASSPATH=../core/$OUT:$GRADLE_PATH - -compile $MAIN_CLASS && \ -updatejar "$PROGUARD_JAR" || exit 1 diff --git a/tools/proguard/proguard6.0.3/gradle/build.xml b/tools/proguard/proguard6.0.3/gradle/build.xml deleted file mode 100644 index 9cd654e3..00000000 --- a/tools/proguard/proguard6.0.3/gradle/build.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/gradle/makefile b/tools/proguard/proguard6.0.3/gradle/makefile deleted file mode 100644 index f74d3d37..00000000 --- a/tools/proguard/proguard6.0.3/gradle/makefile +++ /dev/null @@ -1,26 +0,0 @@ -# GNU/Linux makefile for the ProGuard Gradle task. - -ifndef GRADLE_HOME -GRADLE_HOME = /usr/local/java/gradle -endif - -MAIN_CLASS = proguard/gradle/ProGuardTask -GRADLE_JARS = $(wildcard \ - $(GRADLE_HOME)/lib/plugins/gradle-plugins-*.jar \ - $(GRADLE_HOME)/lib/gradle-logging-*.jar \ - $(GRADLE_HOME)/lib/gradle-base-services-*.jar \ - $(GRADLE_HOME)/lib/gradle-base-services-groovy-*.jar \ - $(GRADLE_HOME)/lib/gradle-core-*.jar \ - $(GRADLE_HOME)/lib/groovy-all-*.jar) -NOTHING := -SPACE := $(NOTHING) $(NOTHING) -CLASSPATH = ../core/$(OUT):$(subst $(SPACE),:,$(GRADLE_JARS)) -TARGET = proguard -UPDATE_JAR = true - -ifeq ($(GRADLE_JARS),) - $(error Please make sure GRADLE_HOME is set correctly) -endif - -include ../buildscripts/functions.mk - diff --git a/tools/proguard/proguard6.0.3/gradle/pom.xml b/tools/proguard/proguard6.0.3/gradle/pom.xml deleted file mode 100644 index b835cd21..00000000 --- a/tools/proguard/proguard6.0.3/gradle/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - ../buildscripts/pom.xml - - proguard-gradle - [${project.groupId}] ${project.artifactId} - - - src - - - maven-source-plugin - - - maven-compiler-plugin - - - maven-jar-plugin - - - - true - - - - - - maven-javadoc-plugin - - - - - - - ${project.groupId} - proguard-base - ${project.version} - - - org.gradle - gradle-logging - 3.1 - provided - - - org.gradle - gradle-core - 3.1 - provided - - - org.gradle - gradle-base-services - 3.1 - provided - - - org.gradle - gradle-base-services-groovy - 3.1 - provided - - - org.codehaus.groovy - groovy-all - 2.4.7 - provided - - - - - gradle - http://repo.gradle.org/gradle/libs-releases-local/ - - - diff --git a/tools/proguard/proguard6.0.3/gradle/settings.gradle b/tools/proguard/proguard6.0.3/gradle/settings.gradle deleted file mode 100644 index 55d8d75b..00000000 --- a/tools/proguard/proguard6.0.3/gradle/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'core' diff --git a/tools/proguard/proguard6.0.3/gradle/src/proguard/gradle/ProGuardTask.java b/tools/proguard/proguard6.0.3/gradle/src/proguard/gradle/ProGuardTask.java deleted file mode 100644 index 833023c3..00000000 --- a/tools/proguard/proguard6.0.3/gradle/src/proguard/gradle/ProGuardTask.java +++ /dev/null @@ -1,1755 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gradle; - -import groovy.lang.Closure; -import org.gradle.api.DefaultTask; -import org.gradle.api.file.*; -import org.gradle.api.logging.*; -import org.gradle.api.tasks.*; -import org.gradle.api.tasks.Optional; -import proguard.*; -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; -import proguard.util.ListUtil; - -import java.io.*; -import java.net.*; -import java.util.*; - -/** - * This Task allows to configure and run ProGuard from Gradle. - * - * @author Eric Lafortune - */ -public class ProGuardTask extends DefaultTask -{ - // Accumulated input and output, for the sake of Gradle's lazy file - // resolution and lazy task execution. - private final List inJarFiles = new ArrayList(); - private final List inJarFilters = new ArrayList(); - private final List outJarFiles = new ArrayList(); - private final List outJarFilters = new ArrayList(); - private final List inJarCounts = new ArrayList(); - private final List libraryJarFiles = new ArrayList(); - private final List libraryJarFilters = new ArrayList(); - private final List configurationFiles = new ArrayList(); - - // Accumulated configuration. - protected final Configuration configuration = new Configuration(); - - // Field acting as a parameter for the class member specification methods. - private ClassSpecification classSpecification; - - - // Gradle task inputs and outputs, because annotations on the List fields - // (private or not) don't seem to work. Private methods don't work either, - // but package visible or protected methods are ok. - - @InputFiles - protected FileCollection getInJarFileCollection() - { - return getProject().files(inJarFiles); - } - - @Optional @OutputFiles - protected FileCollection getOutJarFileCollection() - { - return getProject().files(outJarFiles); - } - - @InputFiles - protected FileCollection getLibraryJarFileCollection() - { - return getProject().files(libraryJarFiles); - } - - @InputFiles - protected FileCollection getConfigurationFileCollection() - { - return getProject().files(configurationFiles); - } - - - // Convenience methods to retrieve settings from outside the task. - - /** - * Returns the collected list of input files (directory, jar, aar, etc, - * represented as Object, String, File, etc). - */ - public List getInJarFiles() - { - return inJarFiles; - } - - /** - * Returns the collected list of filters (represented as argument Maps) - * corresponding to the list of input files. - */ - public List getInJarFilters() - { - return inJarFilters; - } - - /** - * Returns the collected list of output files (directory, jar, aar, etc, - * represented as Object, String, File, etc). - */ - public List getOutJarFiles() - { - return outJarFiles; - } - - /** - * Returns the collected list of filters (represented as argument Maps) - * corresponding to the list of output files. - */ - public List getOutJarFilters() - { - return outJarFilters; - } - - /** - * Returns the list with the numbers of input files that correspond to the - * list of output files. - * - * For instance, [2, 3] means that - * the contents of the first 2 input files go to the first output file and - * the contents of the next 3 input files go to the second output file. - */ - public List getInJarCounts() - { - return inJarCounts; - } - - /** - * Returns the collected list of library files (directory, jar, aar, etc, - * represented as Object, String, File, etc). - */ - public List getLibraryJarFiles() - { - return libraryJarFiles; - } - - /** - * Returns the collected list of filters (represented as argument Maps) - * corresponding to the list of library files. - */ - public List getLibraryJarFilters() - { - return libraryJarFilters; - } - - /** - * Returns the collected list of configuration files to be included - * (represented as Object, String, File, etc). - */ - public List getConfigurationFiles() - { - return configurationFiles; - } - - - // Gradle task settings corresponding to all ProGuard options. - - public void configuration(Object configurationFiles) - throws ParseException, IOException - { - // Just collect the arguments, so they can be resolved lazily. - this.configurationFiles.add(configurationFiles); - } - - public void injars(Object inJarFiles) - throws ParseException - { - injars(null, inJarFiles); - } - - public void injars(Map filterArgs, Object inJarFiles) - throws ParseException - { - // Just collect the arguments, so they can be resolved lazily. - this.inJarFiles.add(inJarFiles); - this.inJarFilters.add(filterArgs); - } - - public void outjars(Object outJarFiles) - throws ParseException - { - outjars(null, outJarFiles); - } - - public void outjars(Map filterArgs, Object outJarFiles) - throws ParseException - { - // Just collect the arguments, so they can be resolved lazily. - this.outJarFiles.add(outJarFiles); - this.outJarFilters.add(filterArgs); - this.inJarCounts.add(Integer.valueOf(inJarFiles.size())); - } - - public void libraryjars(Object libraryJarFiles) - throws ParseException - { - libraryjars(null, libraryJarFiles); - } - - public void libraryjars(Map filterArgs, Object libraryJarFiles) - throws ParseException - { - // Just collect the arguments, so they can be resolved lazily. - this.libraryJarFiles.add(libraryJarFiles); - this.libraryJarFilters.add(filterArgs); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getskipnonpubliclibraryclasses() - { - skipnonpubliclibraryclasses(); - return null; - } - - public void skipnonpubliclibraryclasses() - { - configuration.skipNonPublicLibraryClasses = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontskipnonpubliclibraryclassmembers() - { - dontskipnonpubliclibraryclassmembers(); - return null; - } - - public void dontskipnonpubliclibraryclassmembers() - { - configuration.skipNonPublicLibraryClassMembers = false; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getkeepdirectories() - { - keepdirectories(); - return null; - } - - public void keepdirectories() - { - keepdirectories(null); - } - - public void keepdirectories(String filter) - { - configuration.keepDirectories = - extendFilter(configuration.keepDirectories, filter); - } - - public void target(String targetClassVersion) - { - configuration.targetClassVersion = - ClassUtil.internalClassVersion(targetClassVersion); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getforceprocessing() - { - forceprocessing(); - return null; - } - - public void forceprocessing() - { - configuration.lastModified = Long.MAX_VALUE; - } - - public void keep(String classSpecificationString) - throws ParseException - { - keep(null, classSpecificationString); - } - - public void keep(Map keepArgs, - String classSpecificationString) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(false, - true, - false, - keepArgs, - classSpecificationString)); - } - - public void keep(Map keepClassSpecificationArgs) - throws ParseException - { - keep(keepClassSpecificationArgs, (Closure)null); - } - - public void keep(Map keepClassSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(false, - true, - false, - keepClassSpecificationArgs, - classMembersClosure)); - } - - public void keepclassmembers(String classSpecificationString) - throws ParseException - { - keepclassmembers(null, classSpecificationString); - } - - public void keepclassmembers(Map keepArgs, - String classSpecificationString) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(false, - false, - false, - keepArgs, - classSpecificationString)); - } - - public void keepclassmembers(Map keepClassSpecificationArgs) - throws ParseException - { - keepclassmembers(keepClassSpecificationArgs, (Closure)null); - } - - public void keepclassmembers(Map keepClassSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(false, - false, - false, - keepClassSpecificationArgs, - classMembersClosure)); - } - - public void keepclasseswithmembers(String classSpecificationString) - throws ParseException - { - keepclasseswithmembers(null, classSpecificationString); - } - - public void keepclasseswithmembers(Map keepArgs, - String classSpecificationString) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(false, - false, - true, - keepArgs, - classSpecificationString)); - } - - public void keepclasseswithmembers(Map keepClassSpecificationArgs) - throws ParseException - { - keepclasseswithmembers(keepClassSpecificationArgs, (Closure)null); - } - - public void keepclasseswithmembers(Map keepClassSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(false, - false, - true, - keepClassSpecificationArgs, - classMembersClosure)); - } - - public void keepnames(String classSpecificationString) - throws ParseException - { - keepnames(null, classSpecificationString); - } - - public void keepnames(Map keepArgs, - String classSpecificationString) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(true, - true, - false, - keepArgs, - classSpecificationString)); - } - - public void keepnames(Map keepClassSpecificationArgs) - throws ParseException - { - keepnames(keepClassSpecificationArgs, (Closure)null); - } - - public void keepnames(Map keepClassSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(true, - true, - false, - keepClassSpecificationArgs, - classMembersClosure)); - } - - public void keepclassmembernames(String classSpecificationString) - throws ParseException - { - keepclassmembernames(null, classSpecificationString); - } - - public void keepclassmembernames(Map keepArgs, - String classSpecificationString) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(true, - false, - false, - keepArgs, - classSpecificationString)); - } - - public void keepclassmembernames(Map keepClassSpecificationArgs) - throws ParseException - { - keepclassmembernames(keepClassSpecificationArgs, (Closure)null); - } - - public void keepclassmembernames(Map keepClassSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(true, - false, - false, - keepClassSpecificationArgs, - classMembersClosure)); - } - - public void keepclasseswithmembernames(String classSpecificationString) - throws ParseException - { - keepclasseswithmembernames(null, classSpecificationString); - } - - public void keepclasseswithmembernames(Map keepArgs, - String classSpecificationString) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(true, - false, - true, - keepArgs, - classSpecificationString)); - } - - public void keepclasseswithmembernames(Map keepClassSpecificationArgs) - throws ParseException - { - keepclasseswithmembernames(keepClassSpecificationArgs, (Closure)null); - } - - public void keepclasseswithmembernames(Map keepClassSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.keep = - extendClassSpecifications(configuration.keep, - createKeepClassSpecification(true, - false, - true, - keepClassSpecificationArgs, - classMembersClosure)); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getprintseeds() - { - printseeds(); - return null; - } - - public void printseeds() - { - configuration.printSeeds = Configuration.STD_OUT; - } - - public void printseeds(Object printSeeds) - throws ParseException - { - configuration.printSeeds = getProject().file(printSeeds); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontshrink() - { - dontshrink(); - return null; - } - - public void dontshrink() - { - configuration.shrink = false; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getprintusage() - { - printusage(); - return null; - } - - public void printusage() - { - configuration.printUsage = Configuration.STD_OUT; - } - - public void printusage(Object printUsage) - throws ParseException - { - configuration.printUsage = getProject().file(printUsage); - } - - public void whyareyoukeeping(String classSpecificationString) - throws ParseException - { - configuration.whyAreYouKeeping = - extendClassSpecifications(configuration.whyAreYouKeeping, - createClassSpecification(classSpecificationString)); - } - - public void whyareyoukeeping(Map classSpecificationArgs) - throws ParseException - { - whyareyoukeeping(classSpecificationArgs, null); - } - - public void whyareyoukeeping(Map classSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.whyAreYouKeeping = - extendClassSpecifications(configuration.whyAreYouKeeping, - createClassSpecification(classSpecificationArgs, - classMembersClosure)); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontoptimize() - { - dontoptimize(); - return null; - } - - public void dontoptimize() - { - configuration.optimize = false; - } - - public void optimizations(String filter) - { - configuration.optimizations = - extendFilter(configuration.optimizations, filter); - } - - - public void optimizationpasses(int optimizationPasses) - { - configuration.optimizationPasses = optimizationPasses; - } - - public void assumenosideeffects(String classSpecificationString) - throws ParseException - { - configuration.assumeNoSideEffects = - extendClassSpecifications(configuration.assumeNoSideEffects, - createClassSpecification(classSpecificationString)); - } - - public void assumenosideeffects(Map classSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.assumeNoSideEffects = - extendClassSpecifications(configuration.assumeNoSideEffects, - createClassSpecification(classSpecificationArgs, - classMembersClosure)); - } - - public void assumenoexternalsideeffects(String classSpecificationString) - throws ParseException - { - configuration.assumeNoExternalSideEffects = - extendClassSpecifications(configuration.assumeNoExternalSideEffects, - createClassSpecification(classSpecificationString)); - } - - public void assumenoexternalsideeffects(Map classSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.assumeNoExternalSideEffects = - extendClassSpecifications(configuration.assumeNoExternalSideEffects, - createClassSpecification(classSpecificationArgs, - classMembersClosure)); - } - - public void assumenoescapingparameters(String classSpecificationString) - throws ParseException - { - configuration.assumeNoEscapingParameters = - extendClassSpecifications(configuration.assumeNoEscapingParameters, - createClassSpecification(classSpecificationString)); - } - - public void assumenoescapingparameters(Map classSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.assumeNoEscapingParameters = - extendClassSpecifications(configuration.assumeNoEscapingParameters, - createClassSpecification(classSpecificationArgs, - classMembersClosure)); - } - - public void assumenoexternalreturnvalues(String classSpecificationString) - throws ParseException - { - configuration.assumeNoExternalReturnValues = - extendClassSpecifications(configuration.assumeNoExternalReturnValues, - createClassSpecification(classSpecificationString)); - } - - public void assumenoexternalreturnvalues(Map classSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - configuration.assumeNoExternalReturnValues = - extendClassSpecifications(configuration.assumeNoExternalReturnValues, - createClassSpecification(classSpecificationArgs, - classMembersClosure)); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getallowaccessmodification() - { - allowaccessmodification(); - return null; - } - - public void allowaccessmodification() - { - configuration.allowAccessModification = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getmergeinterfacesaggressively() - { - mergeinterfacesaggressively(); - return null; - } - - public void mergeinterfacesaggressively() - { - configuration.mergeInterfacesAggressively = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontobfuscate() - { - dontobfuscate(); - return null; - } - - public void dontobfuscate() - { - configuration.obfuscate = false; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getprintmapping() - { - printmapping(); - return null; - } - - public void printmapping() - { - configuration.printMapping = Configuration.STD_OUT; - } - - public void printmapping(Object printMapping) - throws ParseException - { - configuration.printMapping = getProject().file(printMapping); - } - - public void applymapping(Object applyMapping) - throws ParseException - { - configuration.applyMapping = getProject().file(applyMapping); - } - - public void obfuscationdictionary(Object obfuscationDictionary) - throws ParseException, MalformedURLException - { - configuration.obfuscationDictionary = - url(obfuscationDictionary); - } - - public void classobfuscationdictionary(Object classObfuscationDictionary) - throws ParseException, MalformedURLException - { - configuration.classObfuscationDictionary = - url(classObfuscationDictionary); - } - - public void packageobfuscationdictionary(Object packageObfuscationDictionary) - throws ParseException, MalformedURLException - { - configuration.packageObfuscationDictionary = - url(packageObfuscationDictionary); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getoverloadaggressively() - { - overloadaggressively(); - return null; - } - - public void overloadaggressively() - { - configuration.overloadAggressively = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getuseuniqueclassmembernames() - { - useuniqueclassmembernames(); - return null; - } - - public void useuniqueclassmembernames() - { - configuration.useUniqueClassMemberNames = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontusemixedcaseclassnames() - { - dontusemixedcaseclassnames(); - return null; - } - - public void dontusemixedcaseclassnames() - { - configuration.useMixedCaseClassNames = false; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getkeeppackagenames() - { - keeppackagenames(); - return null; - } - - public void keeppackagenames() - { - keeppackagenames(null); - } - - public void keeppackagenames(String filter) - { - configuration.keepPackageNames = - extendFilter(configuration.keepPackageNames, filter, true); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getflattenpackagehierarchy() - { - flattenpackagehierarchy(); - return null; - } - - public void flattenpackagehierarchy() - { - flattenpackagehierarchy(""); - } - - public void flattenpackagehierarchy(String flattenPackageHierarchy) - { - configuration.flattenPackageHierarchy = - ClassUtil.internalClassName(flattenPackageHierarchy); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getrepackageclasses() - { - repackageclasses(); - return null; - } - - public void repackageclasses() - { - repackageclasses(""); - } - - public void repackageclasses(String repackageClasses) - { - configuration.repackageClasses = - ClassUtil.internalClassName(repackageClasses); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getkeepattributes() - { - keepattributes(); - return null; - } - - public void keepattributes() - { - keepattributes(null); - } - - public void keepattributes(String filter) - { - configuration.keepAttributes = - extendFilter(configuration.keepAttributes, filter); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getkeepparameternames() - { - keepparameternames(); - return null; - } - - public void keepparameternames() - { - configuration.keepParameterNames = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getrenamesourcefileattribute() - { - renamesourcefileattribute(); - return null; - } - - public void renamesourcefileattribute() - { - renamesourcefileattribute(""); - } - - public void renamesourcefileattribute(String newSourceFileAttribute) - { - configuration.newSourceFileAttribute = newSourceFileAttribute; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getadaptclassstrings() - { - adaptclassstrings(); - return null; - } - - public void adaptclassstrings() - { - adaptclassstrings(null); - } - - public void adaptclassstrings(String filter) - { - configuration.adaptClassStrings = - extendFilter(configuration.adaptClassStrings, filter, true); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getadaptresourcefilenames() - { - adaptresourcefilenames(); - return null; - } - - public void adaptresourcefilenames() - { - adaptresourcefilenames(null); - } - - public void adaptresourcefilenames(String filter) - { - configuration.adaptResourceFileNames = - extendFilter(configuration.adaptResourceFileNames, filter); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getadaptresourcefilecontents() - { - adaptresourcefilecontents(); - return null; - } - - public void adaptresourcefilecontents() - { - adaptresourcefilecontents(null); - } - - public void adaptresourcefilecontents(String filter) - { - configuration.adaptResourceFileContents = - extendFilter(configuration.adaptResourceFileContents, filter); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontpreverify() - { - dontpreverify(); - return null; - } - - public void dontpreverify() - { - configuration.preverify = false; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getmicroedition() - { - microedition(); - return null; - } - - public void microedition() - { - configuration.microEdition = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getandroid() - { - android(); - return null; - } - - public void android() - { - configuration.android = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getverbose() - { - verbose(); - return null; - } - - public void verbose() - { - configuration.verbose = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontnote() - { - dontnote(); - return null; - } - - public void dontnote() - { - dontnote(null); - } - - public void dontnote(String filter) - { - configuration.note = extendFilter(configuration.note, filter, true); - } - - - // Hack: support the keyword without parentheses in Groovy. - public Object getdontwarn() - { - dontwarn(); - return null; - } - - public void dontwarn() - { - dontwarn(null); - } - - public void dontwarn(String filter) - { - configuration.warn = extendFilter(configuration.warn, filter, true); - } - - - // Hack: support the keyword without parentheses in Groovy. - public Object getignorewarnings() - { - ignorewarnings(); - return null; - } - - public void ignorewarnings() - { - configuration.ignoreWarnings = true; - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getprintconfiguration() - { - printconfiguration(); - return null; - } - - public void printconfiguration() - { - configuration.printConfiguration = Configuration.STD_OUT; - } - - public void printconfiguration(Object printConfiguration) - throws ParseException - { - configuration.printConfiguration = - getProject().file(printConfiguration); - } - - // Hack: support the keyword without parentheses in Groovy. - public Object getdump() - { - dump(); - return null; - } - - public void dump() - { - configuration.dump = Configuration.STD_OUT; - } - - public void dump(Object dump) - throws ParseException - { - configuration.dump = getProject().file(dump); - } - - - // Hack: support the keyword without parentheses in Groovy. - public Object getaddconfigurationdebugging() - { - addconfigurationdebugging(); - return null; - } - - public void addconfigurationdebugging() - { - configuration.addConfigurationDebugging = true; - } - - - // Class member methods. - - public void field(Map memberSpecificationArgs) - throws ParseException - { - if (classSpecification == null) - { - throw new IllegalArgumentException("The 'field' method can only be used nested inside a class specification."); - } - - classSpecification.addField(createMemberSpecification(false, - false, - memberSpecificationArgs)); - } - - - public void constructor(Map memberSpecificationArgs) - throws ParseException - { - if (classSpecification == null) - { - throw new IllegalArgumentException("The 'constructor' method can only be used nested inside a class specification."); - } - - classSpecification.addMethod(createMemberSpecification(true, - true, - memberSpecificationArgs)); - } - - - public void method(Map memberSpecificationArgs) - throws ParseException - { - if (classSpecification == null) - { - throw new IllegalArgumentException("The 'method' method can only be used nested inside a class specification."); - } - - classSpecification.addMethod(createMemberSpecification(true, - false, - memberSpecificationArgs)); - } - - - // Gradle task execution. - - @TaskAction - public void proguard() - throws ParseException, IOException - { - // Let the logging manager capture the standard output and errors from - // ProGuard. - LoggingManager loggingManager = getLogging(); - loggingManager.captureStandardOutput(LogLevel.INFO); - loggingManager.captureStandardError(LogLevel.WARN); - - // Run ProGuard with the collected configuration. - new ProGuard(getConfiguration()).execute(); - - } - - - /** - * Returns the configuration collected so far, resolving files and - * reading included configurations. - */ - private Configuration getConfiguration() throws IOException, ParseException - { - // Weave the input jars and the output jars into a single class path, - // with lazy resolution of the files. - configuration.programJars = new ClassPath(); - - int outJarIndex = 0; - - int inJarCount = inJarCounts.size() == 0 ? -1 : - ((Integer)inJarCounts.get(0)).intValue(); - - for (int inJarIndex = 0; inJarIndex < inJarFiles.size(); inJarIndex++) - { - configuration.programJars = - extendClassPath(configuration.programJars, - inJarFiles.get(inJarIndex), - (Map)inJarFilters.get(inJarIndex), - false); - - while (inJarIndex == inJarCount - 1) - { - configuration.programJars = - extendClassPath(configuration.programJars, - outJarFiles.get(outJarIndex), - (Map)outJarFilters.get(outJarIndex), - true); - - outJarIndex++; - - inJarCount = inJarCounts.size() == outJarIndex ? -1 : - ((Integer)inJarCounts.get(outJarIndex)).intValue(); - } - } - - // Copy the library jars into a single class path, with lazy resolution - // of the files. - configuration.libraryJars = new ClassPath(); - - for (int libraryJarIndex = 0; libraryJarIndex < libraryJarFiles.size(); libraryJarIndex++) - { - configuration.libraryJars = - extendClassPath(configuration.libraryJars, - libraryJarFiles.get(libraryJarIndex), - (Map)libraryJarFilters.get(libraryJarIndex), - false); - } - - // Lazily apply the external configuration files. - ConfigurableFileCollection fileCollection = - getProject().files(configurationFiles); - - Iterator files = fileCollection.iterator(); - while (files.hasNext()) - { - ConfigurationParser parser = - new ConfigurationParser(files.next(), - System.getProperties()); - - try - { - parser.parse(configuration); - } - finally - { - parser.close(); - } - } - - // Make sure the code is processed. Gradle has already checked that it - // was necessary. - configuration.lastModified = Long.MAX_VALUE; - - return configuration; - } - - - // Small utility methods. - - /** - * Extends the given class path with the given filtered input or output - * files. - */ - private ClassPath extendClassPath(ClassPath classPath, - Object files, - Map filterArgs, - boolean output) - { - ConfigurableFileCollection fileCollection = getProject().files(files); - - if (classPath == null) - { - classPath = new ClassPath(); - } - - Iterator fileIterator = fileCollection.iterator(); - while (fileIterator.hasNext()) - { - File file = (File)fileIterator.next(); - if (output || file.exists()) - { - // Create the class path entry. - ClassPathEntry classPathEntry = new ClassPathEntry(file, output); - - // Add any filters to the class path entry. - if (filterArgs != null) - { - classPathEntry.setFilter(ListUtil.commaSeparatedList((String)filterArgs.get("filter"))); - classPathEntry.setApkFilter(ListUtil.commaSeparatedList((String)filterArgs.get("apkfilter"))); - classPathEntry.setJarFilter(ListUtil.commaSeparatedList((String)filterArgs.get("jarfilter"))); - classPathEntry.setAarFilter(ListUtil.commaSeparatedList((String)filterArgs.get("aarfilter"))); - classPathEntry.setWarFilter(ListUtil.commaSeparatedList((String)filterArgs.get("warfilter"))); - classPathEntry.setEarFilter(ListUtil.commaSeparatedList((String)filterArgs.get("earfilter"))); - classPathEntry.setZipFilter(ListUtil.commaSeparatedList((String)filterArgs.get("zipfilter"))); - } - - classPath.add(classPathEntry); - } - } - - return classPath; - } - - - /** - * Creates specifications to keep classes and class members, based on the - * given parameters. - */ - private KeepClassSpecification createKeepClassSpecification(boolean allowShrinking, - boolean markClasses, - boolean markConditionally, - Map keepArgs, - String classSpecificationString) - throws ParseException - { - ClassSpecification condition = - createIfClassSpecification(keepArgs); - - ClassSpecification classSpecification = - createClassSpecification(classSpecificationString); - - return - createKeepClassSpecification(allowShrinking, - markClasses, - markConditionally, - keepArgs, - condition, - classSpecification); - } - - - /** - * Creates specifications to keep classes and class members, based on the - * given parameters. - */ - private KeepClassSpecification createKeepClassSpecification(boolean allowShrinking, - boolean markClasses, - boolean markConditionally, - Map classSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - ClassSpecification condition = - createIfClassSpecification(classSpecificationArgs); - - ClassSpecification classSpecification = - createClassSpecification(classSpecificationArgs, - classMembersClosure); - - return - createKeepClassSpecification(allowShrinking, - markClasses, - markConditionally, - classSpecificationArgs, - condition, - classSpecification); - } - - - /** - * Creates a conditional class specification, based on the given - * parameters. - */ - private ClassSpecification createIfClassSpecification(Map classSpecificationArgs) - throws ParseException - { - if (classSpecificationArgs == null) - { - return null; - } - - String conditionString = (String)classSpecificationArgs.get("if"); - if (conditionString == null) - { - return null; - } - - return createClassSpecification(conditionString); - } - - - /** - * Creates specifications to keep classes and class members, based on the - * given parameters. - */ - private KeepClassSpecification createKeepClassSpecification(boolean allowShrinking, - boolean markClasses, - boolean markConditionally, - Map keepArgs, - ClassSpecification condition, - ClassSpecification classSpecification) - { - return - new KeepClassSpecification(markClasses, - markConditionally, - retrieveBoolean(keepArgs, "includedescriptorclasses", false), - false, - retrieveBoolean(keepArgs, "allowshrinking", allowShrinking), - retrieveBoolean(keepArgs, "allowoptimization", false), - retrieveBoolean(keepArgs, "allowobfuscation", false), - condition, - classSpecification); - } - - - /** - * Creates specifications to keep classes and class members, based on the - * given ProGuard-style class specification. - */ - private ClassSpecification createClassSpecification(String classSpecificationString) - throws ParseException - { - try - { - ConfigurationParser parser = - new ConfigurationParser(new String[] { classSpecificationString }, null); - - try - { - return parser.parseClassSpecificationArguments(); - } - finally - { - parser.close(); - } - } - catch (IOException e) - { - throw new ParseException(e.getMessage()); - } - } - - - /** - * Creates a specification of classes and class members, based on the - * given parameters. - */ - private ClassSpecification createClassSpecification(Map classSpecificationArgs, - Closure classMembersClosure) - throws ParseException - { - // Extract the arguments. - String access = (String)classSpecificationArgs.get("access"); - String annotation = (String)classSpecificationArgs.get("annotation"); - String type = (String)classSpecificationArgs.get("type"); - String name = (String)classSpecificationArgs.get("name"); - String extendsAnnotation = (String)classSpecificationArgs.get("extendsannotation"); - String extends_ = (String)classSpecificationArgs.get("extends"); - if (extends_ == null) - { - extends_ = (String)classSpecificationArgs.get("implements"); - } - - // Create the class specification. - ClassSpecification classSpecification = - new ClassSpecification(null, - requiredClassAccessFlags(true, access, type), - requiredClassAccessFlags(false, access, type), - annotation != null ? ClassUtil.internalType(annotation) : null, - name != null ? ClassUtil.internalClassName(name) : null, - extendsAnnotation != null ? ClassUtil.internalType(extendsAnnotation) : null, - extends_ != null ? ClassUtil.internalClassName(extends_) : null); - - // Initialize the class specification with its closure. - if (classMembersClosure != null) - { - // Temporarily remember the class specification, so we can add - // class member specifications. - this.classSpecification = classSpecification; - classMembersClosure.call(classSpecification); - this.classSpecification = null; - } - - return classSpecification; - } - - - /** - * Parses the class access flags that must be set (or not), based on the - * given ProGuard-style flag specification. - */ - private int requiredClassAccessFlags(boolean set, - String access, - String type) - throws ParseException - { - int accessFlags = 0; - - if (access != null) - { - StringTokenizer tokenizer = new StringTokenizer(access, " ,"); - while (tokenizer.hasMoreTokens()) - { - String token = tokenizer.nextToken(); - - if (token.startsWith("!") ^ set) - { - String strippedToken = token.startsWith("!") ? - token.substring(1) : - token; - - int accessFlag = - strippedToken.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC : - strippedToken.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL : - strippedToken.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT : - strippedToken.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC : - strippedToken.equals(JavaConstants.ACC_ANNOTATION) ? ClassConstants.ACC_ANNOTATION : - 0; - - if (accessFlag == 0) - { - throw new ParseException("Incorrect class access modifier ["+strippedToken+"]"); - } - - accessFlags |= accessFlag; - } - } - } - - if (type != null && (type.startsWith("!") ^ set)) - { - int accessFlag = - type.equals("class") ? 0 : - type.equals( JavaConstants.ACC_INTERFACE) || - type.equals("!" + JavaConstants.ACC_INTERFACE) ? ClassConstants.ACC_INTERFACE : - type.equals( JavaConstants.ACC_ENUM) || - type.equals("!" + JavaConstants.ACC_ENUM) ? ClassConstants.ACC_ENUM : - -1; - if (accessFlag == -1) - { - throw new ParseException("Incorrect class type ["+type+"]"); - } - - accessFlags |= accessFlag; - } - - return accessFlags; - } - - - /** - * Creates a specification of class members, based on the given parameters. - */ - private MemberSpecification createMemberSpecification(boolean isMethod, - boolean isConstructor, - Map classSpecificationArgs) - throws ParseException - { - // Extract the arguments. - String access = (String)classSpecificationArgs.get("access"); - String type = (String)classSpecificationArgs.get("type"); - String annotation = (String)classSpecificationArgs.get("annotation"); - String name = (String)classSpecificationArgs.get("name"); - String parameters = (String)classSpecificationArgs.get("parameters"); - - // Perform some basic conversions and checks on the attributes. - if (annotation != null) - { - annotation = ClassUtil.internalType(annotation); - } - - if (isMethod) - { - if (isConstructor) - { - if (type != null) - { - throw new ParseException("Type attribute not allowed in constructor specification ["+type+"]"); - } - - if (parameters != null) - { - type = JavaConstants.TYPE_VOID; - } - - name = ClassConstants.METHOD_NAME_INIT; - } - else if ((type != null) ^ (parameters != null)) - { - throw new ParseException("Type and parameters attributes must always be present in combination in method specification"); - } - } - else - { - if (parameters != null) - { - throw new ParseException("Parameters attribute not allowed in field specification ["+parameters+"]"); - } - } - - List parameterList = ListUtil.commaSeparatedList(parameters); - - String descriptor = - parameters != null ? ClassUtil.internalMethodDescriptor(type, parameterList) : - type != null ? ClassUtil.internalType(type) : - null; - - return new MemberSpecification(requiredMemberAccessFlags(true, access), - requiredMemberAccessFlags(false, access), - annotation, - name, - descriptor); - } - - - /** - * Parses the class member access flags that must be set (or not), based on - * the given ProGuard-style flag specification. - */ - private int requiredMemberAccessFlags(boolean set, - String access) - throws ParseException - { - int accessFlags = 0; - - if (access != null) - { - StringTokenizer tokenizer = new StringTokenizer(access, " ,"); - while (tokenizer.hasMoreTokens()) - { - String token = tokenizer.nextToken(); - - if (token.startsWith("!") ^ set) - { - String strippedToken = token.startsWith("!") ? - token.substring(1) : - token; - - int accessFlag = - strippedToken.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC : - strippedToken.equals(JavaConstants.ACC_PRIVATE) ? ClassConstants.ACC_PRIVATE : - strippedToken.equals(JavaConstants.ACC_PROTECTED) ? ClassConstants.ACC_PROTECTED : - strippedToken.equals(JavaConstants.ACC_STATIC) ? ClassConstants.ACC_STATIC : - strippedToken.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL : - strippedToken.equals(JavaConstants.ACC_SYNCHRONIZED) ? ClassConstants.ACC_SYNCHRONIZED : - strippedToken.equals(JavaConstants.ACC_VOLATILE) ? ClassConstants.ACC_VOLATILE : - strippedToken.equals(JavaConstants.ACC_TRANSIENT) ? ClassConstants.ACC_TRANSIENT : - strippedToken.equals(JavaConstants.ACC_BRIDGE) ? ClassConstants.ACC_BRIDGE : - strippedToken.equals(JavaConstants.ACC_VARARGS) ? ClassConstants.ACC_VARARGS : - strippedToken.equals(JavaConstants.ACC_NATIVE) ? ClassConstants.ACC_NATIVE : - strippedToken.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT : - strippedToken.equals(JavaConstants.ACC_STRICT) ? ClassConstants.ACC_STRICT : - strippedToken.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC : - 0; - - if (accessFlag == 0) - { - throw new ParseException("Incorrect class member access modifier ["+strippedToken+"]"); - } - - accessFlags |= accessFlag; - } - } - } - - return accessFlags; - } - - - /** - * Retrieves a specified boolean flag from the given map. - */ - private boolean retrieveBoolean(Map args, String name, boolean defaultValue) - { - if (args == null) - { - return defaultValue; - } - - Object arg = args.get(name); - - return arg == null ? defaultValue : ((Boolean)arg).booleanValue(); - } - - - /** - * Adds the given class specification to the given list, creating a new list - * if necessary. - */ - protected List extendClassSpecifications(List classSpecifications, - ClassSpecification classSpecification) - { - if (classSpecifications == null) - { - classSpecifications = new ArrayList(); - } - - classSpecifications.add(classSpecification); - - return classSpecifications; - } - - - /** - * Adds the given class specifications to the given list, creating a new - * list if necessary. - */ - private List extendClassSpecifications(List classSpecifications, - List additionalClassSpecifications) - { - if (additionalClassSpecifications != null) - { - if (classSpecifications == null) - { - classSpecifications = new ArrayList(); - } - - classSpecifications.addAll(additionalClassSpecifications); - } - - return classSpecifications; - } - - - /** - * Adds the given filter to the given list, creating a new list if - * necessary. - */ - private List extendFilter(List filter, - String filterString) - { - return extendFilter(filter, filterString, false); - } - - - /** - * Adds the given filter to the given list, creating a new list if - * necessary. External class names are converted to internal class names, - * if requested. - */ - private List extendFilter(List filter, - String filterString, - boolean convertExternalClassNames) - { - if (filter == null) - { - filter = new ArrayList(); - } - - if (filterString == null) - { - // Clear the filter to keep all names. - filter.clear(); - } - else - { - if (convertExternalClassNames) - { - filterString = ClassUtil.internalClassName(filterString); - } - - // Append the filter. - filter.addAll(ListUtil.commaSeparatedList(filterString)); - } - - return filter; - } - - - /** - * Converts a file object into a URL, looking relatively to this class if - * necessary. - */ - private URL url(Object fileObject) throws MalformedURLException - { - File file = getProject().file(fileObject); - return - fileObject instanceof URL ? (URL)fileObject : - fileObject instanceof String && - !file.exists() ? ProGuardTask.class.getResource((String)fileObject) : - file.toURI().toURL(); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/build.gradle b/tools/proguard/proguard6.0.3/gui/build.gradle deleted file mode 100644 index d9f13f62..00000000 --- a/tools/proguard/proguard6.0.3/gui/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -// Gradle build script for the ProGuard GUI. - -apply plugin: 'java' - -sourceSets.main { - java { - srcDirs = ['src'] - } - resources { - srcDirs = ['src'] - include '**/*.properties' - include '**/*.gif' - include '**/*.png' - include '**/*.pro' - } -} - -dependencies { - compile project(':core') - compile project(':retrace') -} - -jar { - manifest.from 'src/META-INF/MANIFEST.MF' -} diff --git a/tools/proguard/proguard6.0.3/gui/build.sh b/tools/proguard/proguard6.0.3/gui/build.sh deleted file mode 100644 index effa3af1..00000000 --- a/tools/proguard/proguard6.0.3/gui/build.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for the ProGuard GUI. - -cd $(dirname "$0") - -source ../buildscripts/functions.sh - -MAIN_CLASS=proguard.gui.ProGuardGUI - -# Make sure the ProGuard core has been compiled. -if [ ! -d ../core/$OUT ]; then - ../core/build.sh || exit 1 -fi - -# Make sure ReTrace has been compiled. -if [ ! -d ../retrace/$OUT ]; then - ../retrace/build.sh || exit 1 -fi - -# Compile and package. -export CLASSPATH=../core/$OUT:../retrace/$OUT - -compile $MAIN_CLASS && \ -createjar "$PROGUARD_GUI_JAR" || exit 1 diff --git a/tools/proguard/proguard6.0.3/gui/build.xml b/tools/proguard/proguard6.0.3/gui/build.xml deleted file mode 100644 index 0ea8cdbe..00000000 --- a/tools/proguard/proguard6.0.3/gui/build.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/gui/makefile b/tools/proguard/proguard6.0.3/gui/makefile deleted file mode 100644 index 7f3368de..00000000 --- a/tools/proguard/proguard6.0.3/gui/makefile +++ /dev/null @@ -1,8 +0,0 @@ -# GNU/Linux makefile for the ProGuard GUI. - -MAIN_CLASS = proguard/gui/ProGuardGUI -CLASSPATH = ../core/$(OUT):../retrace/$(OUT) -TARGET = proguardgui -INCLUDE_MANIFEST = true - -include ../buildscripts/functions.mk diff --git a/tools/proguard/proguard6.0.3/gui/pom.xml b/tools/proguard/proguard6.0.3/gui/pom.xml deleted file mode 100644 index c3410331..00000000 --- a/tools/proguard/proguard6.0.3/gui/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - ../buildscripts/pom.xml - - proguard-gui - [${project.groupId}] ${project.artifactId} - - - src - - - maven-source-plugin - - - maven-compiler-plugin - - - maven-jar-plugin - - - - true - proguard.gui.ProGuardGUI - - - - - - maven-javadoc-plugin - - - - - src - - **/*.java - META-INF/MANIFEST.MF - - - - - - - ${project.groupId} - proguard-base - ${project.version} - - - ${project.groupId} - proguard-retrace - ${project.version} - - - diff --git a/tools/proguard/proguard6.0.3/gui/settings.gradle b/tools/proguard/proguard6.0.3/gui/settings.gradle deleted file mode 100644 index 29f025c4..00000000 --- a/tools/proguard/proguard6.0.3/gui/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -includeFlat 'core' -includeFlat 'retrace' diff --git a/tools/proguard/proguard6.0.3/gui/src/META-INF/MANIFEST.MF b/tools/proguard/proguard6.0.3/gui/src/META-INF/MANIFEST.MF deleted file mode 100644 index 05403b49..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: proguard.gui.ProGuardGUI -Class-Path: proguard.jar retrace.jar diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassPathPanel.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassPathPanel.java deleted file mode 100644 index b5c22609..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassPathPanel.java +++ /dev/null @@ -1,450 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.*; -import proguard.util.ListUtil; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import java.io.File; -import java.util.List; - -/** - * This ListPanel allows the user to add, edit, filter, move, and - * remove ClassPathEntry objects in a ClassPath object. - * - * @author Eric Lafortune - */ -class ClassPathPanel extends ListPanel -{ - private final JFrame owner; - private final boolean inputAndOutput; - private final JFileChooser chooser; - private final FilterDialog filterDialog; - - - public ClassPathPanel(JFrame owner, boolean inputAndOutput) - { - super(); - - super.firstSelectionButton = inputAndOutput ? 3 : 2; - - this.owner = owner; - this.inputAndOutput = inputAndOutput; - - list.setCellRenderer(new MyListCellRenderer()); - - chooser = new JFileChooser(""); - chooser.setMultiSelectionEnabled(true); - chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - chooser.addChoosableFileFilter( - new ExtensionFileFilter(msg("jarExtensions"), - new String[] { ".apk", ".ap_", ".jar", ".aar", ".war", ".ear", ".jmod", ".zip" })); - chooser.setApproveButtonText(msg("ok")); - - filterDialog = new FilterDialog(owner, msg("enterFilter")); - - addAddButton(inputAndOutput, false); - if (inputAndOutput) - { - addAddButton(inputAndOutput, true); - } - addEditButton(); - addFilterButton(); - addRemoveButton(); - addUpButton(); - addDownButton(); - - enableSelectionButtons(); - } - - - protected void addAddButton(boolean inputAndOutput, - final boolean isOutput) - { - JButton addButton = new JButton(msg(inputAndOutput ? - isOutput ? "addOutput" : - "addInput" : - "add")); - addButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - chooser.setDialogTitle(msg("addJars")); - chooser.setSelectedFile(null); - chooser.setSelectedFiles(null); - - int returnValue = chooser.showOpenDialog(owner); - if (returnValue == JFileChooser.APPROVE_OPTION) - { - File[] selectedFiles = chooser.getSelectedFiles(); - ClassPathEntry[] entries = classPathEntries(selectedFiles, isOutput); - - // Add the new elements. - addElements(entries); - } - } - }); - - addButton(tip(addButton, inputAndOutput ? - isOutput ? "addOutputTip" : - "addInputTip" : - "addTip")); - } - - - protected void addEditButton() - { - JButton editButton = new JButton(msg("edit")); - editButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - boolean isOutput = false; - - int[] selectedIndices = list.getSelectedIndices(); - - // Copy the Object array into a File array. - File[] selectedFiles = new File[selectedIndices.length]; - for (int index = 0; index < selectedFiles.length; index++) - { - ClassPathEntry entry = - (ClassPathEntry)listModel.getElementAt(selectedIndices[index]); - - isOutput = entry.isOutput(); - - selectedFiles[index] = entry.getFile(); - } - - chooser.setDialogTitle(msg("chooseJars")); - - // Up to JDK 1.3.1, setSelectedFiles doesn't show in the file - // chooser, so we just use setSelectedFile first. It also sets - // the current directory. - chooser.setSelectedFile(selectedFiles[0].getAbsoluteFile()); - chooser.setSelectedFiles(selectedFiles); - - int returnValue = chooser.showOpenDialog(owner); - if (returnValue == JFileChooser.APPROVE_OPTION) - { - selectedFiles = chooser.getSelectedFiles(); - ClassPathEntry[] entries = classPathEntries(selectedFiles, isOutput); - - // If there are the same number of files selected now as - // there were before, we can just replace the old ones. - if (selectedIndices.length == selectedFiles.length) - { - // Replace the old elements. - setElementsAt(entries, selectedIndices); - } - else - { - // Remove the old elements. - removeElementsAt(selectedIndices); - - // Add the new elements. - addElements(entries); - } - } - } - }); - - addButton(tip(editButton, "editTip")); - } - - - protected void addFilterButton() - { - JButton filterButton = new JButton(msg("filter")); - filterButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - if (!list.isSelectionEmpty()) - { - int[] selectedIndices = list.getSelectedIndices(); - - // Put the filters of the first selected entry in the dialog. - getFiltersFrom(selectedIndices[0]); - - int returnValue = filterDialog.showDialog(); - if (returnValue == FilterDialog.APPROVE_OPTION) - { - // Apply the entered filters to all selected entries. - setFiltersAt(selectedIndices); - } - } - } - }); - - addButton(tip(filterButton, "filterTip")); - } - - - /** - * Sets the ClassPath to be represented in this panel. - */ - public void setClassPath(ClassPath classPath) - { - listModel.clear(); - - if (classPath != null) - { - for (int index = 0; index < classPath.size(); index++) - { - listModel.addElement(classPath.get(index)); - } - } - - // Make sure the selection buttons are properly enabled, - // since the clear method doesn't seem to notify the listener. - enableSelectionButtons(); - } - - - /** - * Returns the ClassPath currently represented in this panel. - */ - public ClassPath getClassPath() - { - int size = listModel.size(); - if (size == 0) - { - return null; - } - - ClassPath classPath = new ClassPath(); - for (int index = 0; index < size; index++) - { - classPath.add((ClassPathEntry)listModel.get(index)); - } - - return classPath; - } - - - /** - * Converts the given array of File objects into a corresponding array of - * ClassPathEntry objects. - */ - private ClassPathEntry[] classPathEntries(File[] files, boolean isOutput) - { - ClassPathEntry[] entries = new ClassPathEntry[files.length]; - for (int index = 0; index < entries.length; index++) - { - entries[index] = new ClassPathEntry(files[index], isOutput); - } - return entries; - } - - - /** - * Sets up the filter dialog with the filters from the specified class path - * entry. - */ - private void getFiltersFrom(int index) - { - ClassPathEntry firstEntry = (ClassPathEntry)listModel.get(index); - - filterDialog.setFilter(firstEntry.getFilter()); - filterDialog.setApkFilter(firstEntry.getApkFilter()); - filterDialog.setJarFilter(firstEntry.getJarFilter()); - filterDialog.setAarFilter(firstEntry.getAarFilter()); - filterDialog.setWarFilter(firstEntry.getWarFilter()); - filterDialog.setEarFilter(firstEntry.getEarFilter()); - filterDialog.setJmodFilter(firstEntry.getJmodFilter()); - filterDialog.setZipFilter(firstEntry.getZipFilter()); - } - - - /** - * Applies the entered filter to the specified class path entries. - * Any previously set filters are discarded. - */ - private void setFiltersAt(int[] indices) - { - for (int index = indices.length - 1; index >= 0; index--) - { - ClassPathEntry entry = (ClassPathEntry)listModel.get(indices[index]); - entry.setFilter(filterDialog.getFilter()); - entry.setApkFilter(filterDialog.getApkFilter()); - entry.setJarFilter(filterDialog.getJarFilter()); - entry.setAarFilter(filterDialog.getAarFilter()); - entry.setWarFilter(filterDialog.getWarFilter()); - entry.setEarFilter(filterDialog.getEarFilter()); - entry.setJmodFilter(filterDialog.getJmodFilter()); - entry.setZipFilter(filterDialog.getZipFilter()); - } - - // Make sure they are selected and thus repainted. - list.setSelectedIndices(indices); - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } - - - /** - * This ListCellRenderer renders ClassPathEntry objects. - */ - private class MyListCellRenderer implements ListCellRenderer - { - private static final String ARROW_IMAGE_FILE = "arrow.gif"; - - private final JPanel cellPanel = new JPanel(new GridBagLayout()); - private final JLabel iconLabel = new JLabel("", JLabel.RIGHT); - private final JLabel jarNameLabel = new JLabel("", JLabel.RIGHT); - private final JLabel filterLabel = new JLabel("", JLabel.RIGHT); - - private final Icon arrowIcon; - - - public MyListCellRenderer() - { - GridBagConstraints jarNameLabelConstraints = new GridBagConstraints(); - jarNameLabelConstraints.anchor = GridBagConstraints.WEST; - jarNameLabelConstraints.insets = new Insets(1, 2, 1, 2); - - GridBagConstraints filterLabelConstraints = new GridBagConstraints(); - filterLabelConstraints.gridwidth = GridBagConstraints.REMAINDER; - filterLabelConstraints.fill = GridBagConstraints.HORIZONTAL; - filterLabelConstraints.weightx = 1.0; - filterLabelConstraints.anchor = GridBagConstraints.EAST; - filterLabelConstraints.insets = jarNameLabelConstraints.insets; - - arrowIcon = new ImageIcon(Toolkit.getDefaultToolkit().getImage(this.getClass().getResource(ARROW_IMAGE_FILE))); - - cellPanel.add(iconLabel, jarNameLabelConstraints); - cellPanel.add(jarNameLabel, jarNameLabelConstraints); - cellPanel.add(filterLabel, filterLabelConstraints); - } - - - // Implementations for ListCellRenderer. - - public Component getListCellRendererComponent(JList list, - Object value, - int index, - boolean isSelected, - boolean cellHasFocus) - { - ClassPathEntry entry = (ClassPathEntry)value; - - // Prepend an arrow to the output entries. - if (inputAndOutput && entry.isOutput()) - { - iconLabel.setIcon(arrowIcon); - } - else - { - iconLabel.setIcon(null); - } - - // Set the entry name text. - jarNameLabel.setText(entry.getName()); - - // Set the filter text. - StringBuffer filter = null; - filter = appendFilter(filter, entry.getZipFilter()); - filter = appendFilter(filter, entry.getJmodFilter()); - filter = appendFilter(filter, entry.getEarFilter()); - filter = appendFilter(filter, entry.getWarFilter()); - filter = appendFilter(filter, entry.getAarFilter()); - filter = appendFilter(filter, entry.getJarFilter()); - filter = appendFilter(filter, entry.getApkFilter()); - filter = appendFilter(filter, entry.getFilter()); - - if (filter != null) - { - filter.append(')'); - } - - filterLabel.setText(filter != null ? filter.toString() : ""); - - // Set the colors. - if (isSelected) - { - cellPanel.setBackground(list.getSelectionBackground()); - jarNameLabel.setForeground(list.getSelectionForeground()); - filterLabel.setForeground(list.getSelectionForeground()); - } - else - { - cellPanel.setBackground(list.getBackground()); - jarNameLabel.setForeground(list.getForeground()); - filterLabel.setForeground(list.getForeground()); - } - - // Make the font color red if this is an input file that can't be read. - if (!(inputAndOutput && entry.isOutput()) && - !entry.getFile().canRead()) - { - jarNameLabel.setForeground(Color.red); - } - - cellPanel.setOpaque(true); - - return cellPanel; - } - - - private StringBuffer appendFilter(StringBuffer filter, List additionalFilter) - { - if (filter != null) - { - filter.append(';'); - } - - if (additionalFilter != null) - { - if (filter == null) - { - filter = new StringBuffer().append('('); - } - - filter.append(ListUtil.commaSeparatedString(additionalFilter, true)); - } - - return filter; - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassSpecificationDialog.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassSpecificationDialog.java deleted file mode 100644 index d0775fca..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassSpecificationDialog.java +++ /dev/null @@ -1,651 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.*; -import proguard.classfile.ClassConstants; -import proguard.classfile.util.ClassUtil; - -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.awt.event.*; -import java.util.List; - -/** - * This JDialog enables the user to specify a class specification. - * - * @author Eric Lafortune - */ -final class ClassSpecificationDialog extends JDialog -{ - /** - * Return value if the dialog is canceled (with the Cancel button or by - * closing the dialog window). - */ - public static final int CANCEL_OPTION = 1; - - /** - * Return value if the dialog is approved (with the Ok button). - */ - public static final int APPROVE_OPTION = 0; - - - private final JTextArea commentsTextArea = new JTextArea(4, 20); - - private final JRadioButton keepClassesAndMembersRadioButton = new JRadioButton(msg("keep")); - private final JRadioButton keepClassMembersRadioButton = new JRadioButton(msg("keepClassMembers")); - private final JRadioButton keepClassesWithMembersRadioButton = new JRadioButton(msg("keepClassesWithMembers")); - - private final JCheckBox keepDescriptorClassesCheckBox = new JCheckBox(msg("keepDescriptorClasses")); - private final JCheckBox keepCodeCheckBox = new JCheckBox(msg("keepCode")); - - private final JCheckBox allowShrinkingCheckBox = new JCheckBox(msg("allowShrinking")); - private final JCheckBox allowOptimizationCheckBox = new JCheckBox(msg("allowOptimization")); - private final JCheckBox allowObfuscationCheckBox = new JCheckBox(msg("allowObfuscation")); - - private final JTextField conditionCommentsField = new JTextField(20); - private final ClassSpecificationDialog conditionDialog; - - private final JRadioButton[] publicRadioButtons; - private final JRadioButton[] finalRadioButtons; - private final JRadioButton[] abstractRadioButtons; - private final JRadioButton[] interfaceRadioButtons; - private final JRadioButton[] annotationRadioButtons; - private final JRadioButton[] enumRadioButtons; - private final JRadioButton[] syntheticRadioButtons; - - private final JTextField annotationTypeTextField = new JTextField(20); - private final JTextField classNameTextField = new JTextField(20); - private final JTextField extendsAnnotationTypeTextField = new JTextField(20); - private final JTextField extendsClassNameTextField = new JTextField(20); - - private final MemberSpecificationsPanel memberSpecificationsPanel; - - private int returnValue; - - - public ClassSpecificationDialog(final JFrame owner, - boolean includeKeepSettings, - boolean includeFieldButton) - { - super(owner, msg("specifyClasses"), true); - - setResizable(true); - - // Create some constraints that can be reused. - GridBagConstraints constraints = new GridBagConstraints(); - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(1, 2, 1, 2); - - GridBagConstraints constraintsStretch = new GridBagConstraints(); - constraintsStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsStretch.weightx = 1.0; - constraintsStretch.anchor = GridBagConstraints.WEST; - constraintsStretch.insets = constraints.insets; - - GridBagConstraints constraintsLast = new GridBagConstraints(); - constraintsLast.gridwidth = GridBagConstraints.REMAINDER; - constraintsLast.anchor = GridBagConstraints.WEST; - constraintsLast.insets = constraints.insets; - - GridBagConstraints constraintsLastStretch = new GridBagConstraints(); - constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; - constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsLastStretch.weightx = 1.0; - constraintsLastStretch.anchor = GridBagConstraints.WEST; - constraintsLastStretch.insets = constraints.insets; - - GridBagConstraints panelConstraints = new GridBagConstraints(); - panelConstraints.gridwidth = GridBagConstraints.REMAINDER; - panelConstraints.fill = GridBagConstraints.HORIZONTAL; - panelConstraints.weightx = 1.0; - panelConstraints.weighty = 0.0; - panelConstraints.anchor = GridBagConstraints.NORTHWEST; - panelConstraints.insets = constraints.insets; - - GridBagConstraints stretchPanelConstraints = new GridBagConstraints(); - stretchPanelConstraints.gridwidth = GridBagConstraints.REMAINDER; - stretchPanelConstraints.fill = GridBagConstraints.BOTH; - stretchPanelConstraints.weightx = 1.0; - stretchPanelConstraints.weighty = 1.0; - stretchPanelConstraints.anchor = GridBagConstraints.NORTHWEST; - stretchPanelConstraints.insets = constraints.insets; - - GridBagConstraints labelConstraints = new GridBagConstraints(); - labelConstraints.anchor = GridBagConstraints.CENTER; - labelConstraints.insets = new Insets(2, 10, 2, 10); - - GridBagConstraints lastLabelConstraints = new GridBagConstraints(); - lastLabelConstraints.gridwidth = GridBagConstraints.REMAINDER; - lastLabelConstraints.anchor = GridBagConstraints.CENTER; - lastLabelConstraints.insets = labelConstraints.insets; - - GridBagConstraints advancedButtonConstraints = new GridBagConstraints(); - advancedButtonConstraints.weightx = 1.0; - advancedButtonConstraints.weighty = 1.0; - advancedButtonConstraints.anchor = GridBagConstraints.SOUTHWEST; - advancedButtonConstraints.insets = new Insets(4, 4, 8, 4); - - GridBagConstraints okButtonConstraints = new GridBagConstraints(); - okButtonConstraints.weightx = 1.0; - okButtonConstraints.weighty = 1.0; - okButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - okButtonConstraints.insets = advancedButtonConstraints.insets; - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; - cancelButtonConstraints.weighty = 1.0; - cancelButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - cancelButtonConstraints.insets = advancedButtonConstraints.insets; - - GridBagLayout layout = new GridBagLayout(); - - Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); - - // Create the comments panel. - JPanel commentsPanel = new JPanel(layout); - commentsPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("comments"))); - - JScrollPane commentsScrollPane = new JScrollPane(commentsTextArea); - commentsScrollPane.setBorder(classNameTextField.getBorder()); - - commentsPanel.add(tip(commentsScrollPane, "commentsTip"), constraintsLastStretch); - - // Create the keep option panel. - ButtonGroup keepButtonGroup = new ButtonGroup(); - keepButtonGroup.add(keepClassesAndMembersRadioButton); - keepButtonGroup.add(keepClassMembersRadioButton); - keepButtonGroup.add(keepClassesWithMembersRadioButton); - - JPanel keepOptionPanel = new JPanel(layout); - keepOptionPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("keepTitle"))); - - keepOptionPanel.add(tip(keepClassesAndMembersRadioButton, "keepTip"), constraintsLastStretch); - keepOptionPanel.add(tip(keepClassMembersRadioButton, "keepClassMembersTip"), constraintsLastStretch); - keepOptionPanel.add(tip(keepClassesWithMembersRadioButton, "keepClassesWithMembersTip"), constraintsLastStretch); - - // Create the also keep panel. - final JPanel alsoKeepOptionPanel = new JPanel(layout); - alsoKeepOptionPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("alsoKeepTitle"))); - - alsoKeepOptionPanel.add(tip(keepDescriptorClassesCheckBox, "keepDescriptorClassesTip"), constraintsLastStretch); - alsoKeepOptionPanel.add(tip(keepCodeCheckBox, "keepCodeTip"), constraintsLastStretch); - - // Create the allow option panel. - final JPanel allowOptionPanel = new JPanel(layout); - allowOptionPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("allowTitle"))); - - allowOptionPanel.add(tip(allowShrinkingCheckBox, "allowShrinkingTip"), constraintsLastStretch); - allowOptionPanel.add(tip(allowOptimizationCheckBox, "allowOptimizationTip"), constraintsLastStretch); - allowOptionPanel.add(tip(allowObfuscationCheckBox, "allowObfuscationTip"), constraintsLastStretch); - - conditionDialog = includeKeepSettings ? - new ClassSpecificationDialog(owner, false, true) : - null; - - // Create the condition panel. - final JPanel conditionPanel = new JPanel(layout); - conditionPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("conditionTitle"))); - - final JButton conditionButton = new JButton(msg("edit")); - conditionButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent actionEvent) - { - final ClassSpecification originalCondition = - conditionDialog.getClassSpecification(); - - int returnValue = conditionDialog.showDialog(); - if (returnValue == APPROVE_OPTION) - { - // Update the condition label. - ClassSpecification condition = - conditionDialog.getClassSpecification(); - - conditionCommentsField.setText(label(condition.equals(new ClassSpecification()) ? null : condition)); - } - else - { - // Reset to the original condition. - conditionDialog.setClassSpecification(originalCondition); - } - } - }); - - // The comments can only be edited in the dialog. - conditionCommentsField.setEditable(false); - - conditionPanel.add(tip(conditionCommentsField, "commentsTip"), constraintsStretch); - conditionPanel.add(tip(conditionButton, "editConditionTip"), constraintsLast); - - // Create the access panel. - JPanel accessPanel = new JPanel(layout); - accessPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("access"))); - - accessPanel.add(Box.createGlue(), labelConstraints); - accessPanel.add(tip(new JLabel(msg("required")), "requiredTip"), labelConstraints); - accessPanel.add(tip(new JLabel(msg("not")), "notTip"), labelConstraints); - accessPanel.add(tip(new JLabel(msg("dontCare")), "dontCareTip"), labelConstraints); - accessPanel.add(Box.createGlue(), constraintsLastStretch); - - publicRadioButtons = addRadioButtonTriplet("Public", accessPanel); - finalRadioButtons = addRadioButtonTriplet("Final", accessPanel); - abstractRadioButtons = addRadioButtonTriplet("Abstract", accessPanel); - interfaceRadioButtons = addRadioButtonTriplet("Interface", accessPanel); - annotationRadioButtons = addRadioButtonTriplet("Annotation", accessPanel); - enumRadioButtons = addRadioButtonTriplet("Enum", accessPanel); - syntheticRadioButtons = addRadioButtonTriplet("Synthetic", accessPanel); - - // Create the annotation type panel. - final JPanel annotationTypePanel = new JPanel(layout); - annotationTypePanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("annotation"))); - - annotationTypePanel.add(tip(annotationTypeTextField, "classNameTip"), constraintsLastStretch); - - // Create the class name panel. - JPanel classNamePanel = new JPanel(layout); - classNamePanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("class"))); - - classNamePanel.add(tip(classNameTextField, "classNameTip"), constraintsLastStretch); - - // Create the extends annotation type panel. - final JPanel extendsAnnotationTypePanel = new JPanel(layout); - extendsAnnotationTypePanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("extendsImplementsAnnotation"))); - - extendsAnnotationTypePanel.add(tip(extendsAnnotationTypeTextField, "classNameTip"), constraintsLastStretch); - - // Create the extends class name panel. - JPanel extendsClassNamePanel = new JPanel(layout); - extendsClassNamePanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("extendsImplementsClass"))); - - extendsClassNamePanel.add(tip(extendsClassNameTextField, "classNameTip"), constraintsLastStretch); - - - // Create the class member list panel. - memberSpecificationsPanel = new MemberSpecificationsPanel(this, includeFieldButton); - memberSpecificationsPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("classMembers"))); - - // Create the Advanced button. - final JButton advancedButton = new JButton(msg("basic")); - advancedButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - boolean visible = !alsoKeepOptionPanel.isVisible(); - - alsoKeepOptionPanel .setVisible(visible); - allowOptionPanel .setVisible(visible); - annotationTypePanel .setVisible(visible); - extendsAnnotationTypePanel.setVisible(visible); - conditionPanel .setVisible(visible); - - advancedButton.setText(msg(visible ? "basic" : "advanced")); - - pack(); - } - }); - advancedButton.doClick(); - - // Create the Ok button. - JButton okButton = new JButton(msg("ok")); - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - returnValue = APPROVE_OPTION; - hide(); - } - }); - - // Create the Cancel button. - JButton cancelButton = new JButton(msg("cancel")); - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - hide(); - } - }); - - // Add all panels to the main panel. - JPanel mainPanel = new JPanel(layout); - mainPanel.add(tip(commentsPanel, "commentsTip"), panelConstraints); - if (includeKeepSettings) - { - mainPanel.add(tip(keepOptionPanel, "keepTitleTip"), panelConstraints); - mainPanel.add(tip(alsoKeepOptionPanel, "alsoKeepTitleTip"), panelConstraints); - mainPanel.add(tip(allowOptionPanel, "allowTitleTip"), panelConstraints); - mainPanel.add(tip(conditionPanel, "conditionTip"), panelConstraints); - } - mainPanel.add(tip(accessPanel, "accessTip"), panelConstraints); - mainPanel.add(tip(annotationTypePanel, "annotationTip"), panelConstraints); - mainPanel.add(tip(classNamePanel, "classTip"), panelConstraints); - mainPanel.add(tip(extendsAnnotationTypePanel, "extendsImplementsAnnotationTip"), panelConstraints); - mainPanel.add(tip(extendsClassNamePanel, "extendsImplementsClassTip"), panelConstraints); - mainPanel.add(tip(memberSpecificationsPanel, "classMembersTip"), stretchPanelConstraints); - - mainPanel.add(tip(advancedButton, "advancedTip"), advancedButtonConstraints); - mainPanel.add(okButton, okButtonConstraints); - mainPanel.add(cancelButton, cancelButtonConstraints); - - getContentPane().add(new JScrollPane(mainPanel)); - } - - - /** - * Adds a JLabel and three JRadioButton instances in a ButtonGroup to the - * given panel with a GridBagLayout, and returns the buttons in an array. - */ - private JRadioButton[] addRadioButtonTriplet(String labelText, - JPanel panel) - { - GridBagConstraints labelConstraints = new GridBagConstraints(); - labelConstraints.anchor = GridBagConstraints.WEST; - labelConstraints.insets = new Insets(2, 10, 2, 10); - - GridBagConstraints buttonConstraints = new GridBagConstraints(); - buttonConstraints.insets = labelConstraints.insets; - - GridBagConstraints lastGlueConstraints = new GridBagConstraints(); - lastGlueConstraints.gridwidth = GridBagConstraints.REMAINDER; - lastGlueConstraints.weightx = 1.0; - - // Create the radio buttons. - JRadioButton radioButton0 = new JRadioButton(); - JRadioButton radioButton1 = new JRadioButton(); - JRadioButton radioButton2 = new JRadioButton(); - - // Put them in a button group. - ButtonGroup buttonGroup = new ButtonGroup(); - buttonGroup.add(radioButton0); - buttonGroup.add(radioButton1); - buttonGroup.add(radioButton2); - - // Add the label and the buttons to the panel. - panel.add(new JLabel(labelText), labelConstraints); - panel.add(radioButton0, buttonConstraints); - panel.add(radioButton1, buttonConstraints); - panel.add(radioButton2, buttonConstraints); - panel.add(Box.createGlue(), lastGlueConstraints); - - return new JRadioButton[] - { - radioButton0, - radioButton1, - radioButton2 - }; - } - - - /** - * Sets the KeepClassSpecification to be represented in this dialog. - */ - public void setKeepSpecification(KeepClassSpecification keepClassSpecification) - { - boolean markClasses = keepClassSpecification.markClasses; - boolean markConditionally = keepClassSpecification.markConditionally; - boolean markDescriptorClasses = keepClassSpecification.markDescriptorClasses; - boolean markCodeAttributes = keepClassSpecification.markCodeAttributes; - boolean allowShrinking = keepClassSpecification.allowShrinking; - boolean allowOptimization = keepClassSpecification.allowOptimization; - boolean allowObfuscation = keepClassSpecification.allowObfuscation; - ClassSpecification condition = keepClassSpecification.condition; - - // Figure out the proper keep radio button and set it. - JRadioButton keepOptionRadioButton = - markConditionally ? keepClassesWithMembersRadioButton : - markClasses ? keepClassesAndMembersRadioButton : - keepClassMembersRadioButton; - - keepOptionRadioButton.setSelected(true); - - // Set the other check boxes. - keepDescriptorClassesCheckBox.setSelected(markDescriptorClasses); - keepCodeCheckBox .setSelected(markCodeAttributes); - allowShrinkingCheckBox .setSelected(allowShrinking); - allowOptimizationCheckBox .setSelected(allowOptimization); - allowObfuscationCheckBox .setSelected(allowObfuscation); - - // Set the condition comment and dialog. - conditionCommentsField.setText(label(condition)); - conditionDialog.setClassSpecification(condition != null ? - condition : - new ClassSpecification()); - - // Set the rest of the class specification. - setClassSpecification(keepClassSpecification); - } - - - /** - * Sets the ClassSpecification to be represented in this dialog. - */ - public void setClassSpecification(ClassSpecification classSpecification) - { - String comments = classSpecification.comments; - String annotationType = classSpecification.annotationType; - String className = classSpecification.className; - String extendsAnnotationType = classSpecification.extendsAnnotationType; - String extendsClassName = classSpecification.extendsClassName; - List keepFieldOptions = classSpecification.fieldSpecifications; - List keepMethodOptions = classSpecification.methodSpecifications; - - // Set the comments text area. - commentsTextArea.setText(comments == null ? "" : comments); - - // Set the access radio buttons. - setClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_PUBLIC, publicRadioButtons); - setClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_FINAL, finalRadioButtons); - setClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_ABSTRACT, abstractRadioButtons); - setClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_INTERFACE, interfaceRadioButtons); - setClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_ANNOTATION, annotationRadioButtons); - setClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_ENUM, enumRadioButtons); - setClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_SYNTHETIC, syntheticRadioButtons); - - // Set the class and annotation text fields. - annotationTypeTextField .setText(annotationType == null ? "" : ClassUtil.externalType(annotationType)); - classNameTextField .setText(className == null ? "*" : ClassUtil.externalClassName(className)); - extendsAnnotationTypeTextField.setText(extendsAnnotationType == null ? "" : ClassUtil.externalType(extendsAnnotationType)); - extendsClassNameTextField .setText(extendsClassName == null ? "" : ClassUtil.externalClassName(extendsClassName)); - - // Set the keep class member option list. - memberSpecificationsPanel.setMemberSpecifications(keepFieldOptions, keepMethodOptions); - } - - - /** - * Returns the KeepClassSpecification currently represented in this dialog. - */ - public KeepClassSpecification getKeepSpecification() - { - boolean markClasses = !keepClassMembersRadioButton .isSelected(); - boolean markConditionally = keepClassesWithMembersRadioButton.isSelected(); - boolean markDescriptorClasses = keepDescriptorClassesCheckBox .isSelected(); - boolean markCodeAttributes = keepCodeCheckBox .isSelected(); - boolean allowShrinking = allowShrinkingCheckBox .isSelected(); - boolean allowOptimization = allowOptimizationCheckBox .isSelected(); - boolean allowObfuscation = allowObfuscationCheckBox .isSelected(); - ClassSpecification condition = conditionDialog .getClassSpecification(); - - return new KeepClassSpecification(markClasses, - markConditionally, - markDescriptorClasses, - markCodeAttributes, - allowShrinking, - allowOptimization, - allowObfuscation, - condition.equals(new ClassSpecification()) ? null : condition, - getClassSpecification()); - } - - - /** - * Returns the ClassSpecification currently represented in this dialog. - */ - public ClassSpecification getClassSpecification() - { - String comments = commentsTextArea.getText(); - String annotationType = annotationTypeTextField.getText(); - String className = classNameTextField.getText(); - String extendsAnnotationType = extendsAnnotationTypeTextField.getText(); - String extendsClassName = extendsClassNameTextField.getText(); - - ClassSpecification classSpecification = - new ClassSpecification(comments.equals("") ? null : comments, - 0, - 0, - annotationType.equals("") ? null : ClassUtil.internalType(annotationType), - className.equals("") || - className.equals("*") ? null : ClassUtil.internalClassName(className), - extendsAnnotationType.equals("") ? null : ClassUtil.internalType(extendsAnnotationType), - extendsClassName.equals("") ? null : ClassUtil.internalClassName(extendsClassName)); - - // Also get the access radio button settings. - getClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_PUBLIC, publicRadioButtons); - getClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_FINAL, finalRadioButtons); - getClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_ABSTRACT, abstractRadioButtons); - getClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_INTERFACE, interfaceRadioButtons); - getClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_ANNOTATION, annotationRadioButtons); - getClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_ENUM, enumRadioButtons); - getClassSpecificationRadioButtons(classSpecification, ClassConstants.ACC_SYNTHETIC, syntheticRadioButtons); - - // Get the keep class member option lists. - classSpecification.fieldSpecifications = memberSpecificationsPanel.getMemberSpecifications(true); - classSpecification.methodSpecifications = memberSpecificationsPanel.getMemberSpecifications(false); - - return classSpecification; - } - - - /** - * Shows this dialog. This method only returns when the dialog is closed. - * - * @return CANCEL_OPTION or APPROVE_OPTION, - * depending on the choice of the user. - */ - public int showDialog() - { - returnValue = CANCEL_OPTION; - - // Open the dialog in the right place, then wait for it to be closed, - // one way or another. - pack(); - setLocationRelativeTo(getOwner()); - show(); - - return returnValue; - } - - - /** - * Returns a suitable label summarizing the given class specification. - */ - public String label(ClassSpecification classSpecification) - { - return label(classSpecification, -1); - } - - - /** - * Returns a suitable label summarizing the given class specification at - * some given index. - */ - public String label(ClassSpecification classSpecification, int index) - { - return - classSpecification == null ? msg("none") : - classSpecification.comments != null ? classSpecification.comments.trim() : - classSpecification.className != null ? (msg("class") + ' ' + ClassUtil.externalClassName(classSpecification.className)) : - classSpecification.annotationType != null ? (msg("classesAnnotatedWith") + ' ' + ClassUtil.externalType(classSpecification.annotationType)) : - classSpecification.extendsClassName != null ? (msg("extensionsOf") + ' ' + ClassUtil.externalClassName(classSpecification.extendsClassName)) : - classSpecification.extendsAnnotationType != null ? (msg("extensionsOfClassesAnnotatedWith") + ' ' + ClassUtil.externalType(classSpecification.extendsAnnotationType)) : - index >= 0 ? (msg("specificationNumber") + index) : - msg("specification"); - } - - - /** - * Sets the appropriate radio button of a given triplet, based on the access - * flags of the given keep option. - */ - private void setClassSpecificationRadioButtons(ClassSpecification classSpecification, - int flag, - JRadioButton[] radioButtons) - { - int index = (classSpecification.requiredSetAccessFlags & flag) != 0 ? 0 : - (classSpecification.requiredUnsetAccessFlags & flag) != 0 ? 1 : - 2; - radioButtons[index].setSelected(true); - } - - - /** - * Updates the access flag of the given keep option, based on the given radio - * button triplet. - */ - private void getClassSpecificationRadioButtons(ClassSpecification classSpecification, - int flag, - JRadioButton[] radioButtons) - { - if (radioButtons[0].isSelected()) - { - classSpecification.requiredSetAccessFlags |= flag; - } - else if (radioButtons[1].isSelected()) - { - classSpecification.requiredUnsetAccessFlags |= flag; - } - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassSpecificationsPanel.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassSpecificationsPanel.java deleted file mode 100644 index a5c7257f..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ClassSpecificationsPanel.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.ClassSpecification; -import proguard.classfile.util.ClassUtil; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import java.util.*; -import java.util.List; - - -/** - * This ListPanel enables the user to add, edit, move, and remove - * ClassSpecification entries in a list. - * - * @author Eric Lafortune - */ -class ClassSpecificationsPanel extends ListPanel -{ - protected final ClassSpecificationDialog classSpecificationDialog; - - - public ClassSpecificationsPanel(JFrame owner, - boolean includeKeepSettings, - boolean includeFieldButton) - { - super(); - - list.setCellRenderer(new MyListCellRenderer()); - - classSpecificationDialog = new ClassSpecificationDialog(owner, - includeKeepSettings, - includeFieldButton); - - addAddButton(); - addEditButton(); - addRemoveButton(); - addUpButton(); - addDownButton(); - - enableSelectionButtons(); - } - - - protected void addAddButton() - { - JButton addButton = new JButton(msg("add")); - addButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - setClassSpecification(createClassSpecification()); - - int returnValue = classSpecificationDialog.showDialog(); - if (returnValue == ClassSpecificationDialog.APPROVE_OPTION) - { - // Add the new element. - addElement(getClassSpecification()); - } - } - }); - - addButton(tip(addButton, "addTip")); - } - - - protected void addEditButton() - { - JButton editButton = new JButton(msg("edit")); - editButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - ClassSpecification selectedClassSpecification = - (ClassSpecification)list.getSelectedValue(); - - setClassSpecification(selectedClassSpecification); - int returnValue = classSpecificationDialog.showDialog(); - if (returnValue == ClassSpecificationDialog.APPROVE_OPTION) - { - // Replace the old element. - setElementAt(getClassSpecification(), - list.getSelectedIndex()); - } - } - }); - - addButton(tip(editButton, "editTip")); - } - - - protected ClassSpecification createClassSpecification() - { - return new ClassSpecification(); - } - - - protected void setClassSpecification(ClassSpecification classSpecification) - { - classSpecificationDialog.setClassSpecification(classSpecification); - } - - - protected ClassSpecification getClassSpecification() - { - return classSpecificationDialog.getClassSpecification(); - } - - - /** - * Sets the ClassSpecification objects to be represented in this panel. - */ - public void setClassSpecifications(List classSpecifications) - { - listModel.clear(); - - if (classSpecifications != null) - { - for (int index = 0; index < classSpecifications.size(); index++) - { - listModel.addElement(classSpecifications.get(index)); - } - } - - // Make sure the selection buttons are properly enabled, - // since the clear method doesn't seem to notify the listener. - enableSelectionButtons(); - } - - - /** - * Returns the ClassSpecification objects currently represented in this panel. - */ - public List getClassSpecifications() - { - int size = listModel.size(); - if (size == 0) - { - return null; - } - - List classSpecifications = new ArrayList(size); - for (int index = 0; index < size; index++) - { - classSpecifications.add(listModel.get(index)); - } - - return classSpecifications; - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } - - - /** - * This ListCellRenderer renders ClassSpecification objects. - */ - private class MyListCellRenderer implements ListCellRenderer - { - private final JLabel label = new JLabel(); - - - // Implementations for ListCellRenderer. - - public Component getListCellRendererComponent(JList list, - Object value, - int index, - boolean isSelected, - boolean cellHasFocus) - { - ClassSpecification classSpecification = (ClassSpecification)value; - - label.setText(classSpecificationDialog.label(classSpecification, index)); - - if (isSelected) - { - label.setBackground(list.getSelectionBackground()); - label.setForeground(list.getSelectionForeground()); - } - else - { - label.setBackground(list.getBackground()); - label.setForeground(list.getForeground()); - } - - label.setOpaque(true); - - return label; - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ExtensionFileFilter.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ExtensionFileFilter.java deleted file mode 100644 index 18a4e08f..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ExtensionFileFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.filechooser.FileFilter; -import java.io.File; - - -/** - * This FileFilter accepts files that end in one of the given - * extensions. - * - * @author Eric Lafortune - */ -final class ExtensionFileFilter extends FileFilter -{ - private final String description; - private final String[] extensions; - - - /** - * Creates a new ExtensionFileFilter. - * @param description a description of the filter. - * @param extensions an array of acceptable extensions. - */ - public ExtensionFileFilter(String description, String[] extensions) - { - this.description = description; - this.extensions = extensions; - } - - - // Implemntations for FileFilter - - public String getDescription() - { - return description; - } - - - public boolean accept(File file) - { - if (file.isDirectory()) - { - return true; - } - - String fileName = file.getName().toLowerCase(); - - for (int index = 0; index < extensions.length; index++) - { - if (fileName.endsWith(extensions[index])) - { - return true; - } - } - - return false; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/FilterBuilder.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/FilterBuilder.java deleted file mode 100644 index c3b92a3b..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/FilterBuilder.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.*; - -/** - * This class builds filters corresponding to the selections and names of a - * given list of check boxes. - */ -public class FilterBuilder -{ - private JCheckBox[] checkBoxes; - private char separator; - - - /** - * Creates a new FilterBuilder. - * @param checkBoxes the check boxes with names and selections that should - * be reflected in the output filter. - * @param separator the separator for the names in the check boxes. - */ - public FilterBuilder(JCheckBox[] checkBoxes, char separator) - { - this.checkBoxes = checkBoxes; - this.separator = separator; - } - - - /** - * Builds a filter for the current names and selections of the check boxes. - */ - public String buildFilter() - { - StringBuffer positive = new StringBuffer(); - StringBuffer negative = new StringBuffer(); - - buildFilter("", positive, negative); - - return positive.length() <= negative.length() ? - positive.toString() : - negative.toString(); - } - - - /** - * Builds two versions of the filter for the given prefix. - * @param prefix the prefix. - * @param positive the filter to be extended, assuming the matching - * strings are accepted. - * @param negative the filter to be extended, assuming the matching - * strings are rejected. - */ - private void buildFilter(String prefix, - StringBuffer positive, - StringBuffer negative) - { - int positiveCount = 0; - int negativeCount = 0; - - // Count all selected and unselected check boxes with the prefix. - for (int index = 0; index < checkBoxes.length; index++) - { - JCheckBox checkBox = checkBoxes[index]; - String name = checkBox.getText(); - - if (name.startsWith(prefix)) - { - if (checkBox.isSelected()) - { - positiveCount++; - } - else - { - negativeCount++; - } - } - } - - // Are there only unselected check boxes? - if (positiveCount == 0) - { - // Extend the positive filter with exceptions and return. - if (positive.length() > 0) - { - positive.append(','); - } - positive.append('!').append(prefix); - if (prefix.length() == 0 || - prefix.charAt(prefix.length()-1) == separator) - { - positive.append('*'); - } - - return; - } - - // Are there only selected check boxes? - if (negativeCount == 0) - { - // Extend the negative filter with exceptions and return. - if (negative.length() > 0) - { - negative.append(','); - } - negative.append(prefix); - if (prefix.length() == 0 || - prefix.charAt(prefix.length()-1) == separator) - { - negative.append('*'); - } - - return; - } - - // Create new positive and negative filters for names starting with the - // prefix only. - StringBuffer positiveFilter = new StringBuffer(); - StringBuffer negativeFilter = new StringBuffer(); - - String newPrefix = null; - - for (int index = 0; index < checkBoxes.length; index++) - { - String name = checkBoxes[index].getText(); - - if (name.startsWith(prefix)) - { - if (newPrefix == null || - !name.startsWith(newPrefix)) - { - int prefixIndex = - name.indexOf(separator, prefix.length()+1); - - newPrefix = prefixIndex >= 0 ? - name.substring(0, prefixIndex+1) : - name; - - buildFilter(newPrefix, - positiveFilter, - negativeFilter); - } - } - } - - // Extend the positive filter. - if (positiveFilter.length() <= negativeFilter.length() + prefix.length() + 3) - { - if (positive.length() > 0 && - positiveFilter.length() > 0) - { - positive.append(','); - } - - positive.append(positiveFilter); - } - else - { - if (positive.length() > 0 && - negativeFilter.length() > 0) - { - positive.append(','); - } - - positive.append(negativeFilter).append(",!").append(prefix).append('*'); - } - - // Extend the negative filter. - if (negativeFilter.length() <= positiveFilter.length() + prefix.length() + 4) - { - if (negative.length() > 0 && - negativeFilter.length() > 0) - { - negative.append(','); - } - - negative.append(negativeFilter); - } - else - { - if (negative.length() > 0 && - positiveFilter.length() > 0) - { - negative.append(','); - } - - negative.append(positiveFilter).append(',').append(prefix).append('*'); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/FilterDialog.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/FilterDialog.java deleted file mode 100644 index 7529a08c..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/FilterDialog.java +++ /dev/null @@ -1,399 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.util.ListUtil; - -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.awt.event.*; -import java.util.List; - -/** - * This JDialog allows the user to enter a String. - * - * @author Eric Lafortune - */ -public class FilterDialog extends JDialog -{ - /** - * Return value if the dialog is canceled (with the Cancel button or by - * closing the dialog window). - */ - public static final int CANCEL_OPTION = 1; - - /** - * Return value if the dialog is approved (with the Ok button). - */ - public static final int APPROVE_OPTION = 0; - - private static final String DEFAULT_FILTER = "**"; - private static final String DEFAULT_APK_FILTER = "**.apk"; - private static final String DEFAULT_JAR_FILTER = "**.jar"; - private static final String DEFAULT_AAR_FILTER = "**.aar"; - private static final String DEFAULT_WAR_FILTER = "**.war"; - private static final String DEFAULT_EAR_FILTER = "**.ear"; - private static final String DEFAULT_JMOD_FILTER = "**.jmod"; - private static final String DEFAULT_ZIP_FILTER = "**.zip"; - - - private final JTextField filterTextField = new JTextField(40); - private final JTextField apkFilterTextField = new JTextField(40); - private final JTextField jarFilterTextField = new JTextField(40); - private final JTextField aarFilterTextField = new JTextField(40); - private final JTextField warFilterTextField = new JTextField(40); - private final JTextField earFilterTextField = new JTextField(40); - private final JTextField jmodFilterTextField = new JTextField(40); - private final JTextField zipFilterTextField = new JTextField(40); - - private int returnValue; - - - public FilterDialog(JFrame owner, - String explanation) - { - super(owner, true); - setResizable(true); - - // Create some constraints that can be reused. - GridBagConstraints textConstraints = new GridBagConstraints(); - textConstraints.gridwidth = GridBagConstraints.REMAINDER; - textConstraints.fill = GridBagConstraints.HORIZONTAL; - textConstraints.weightx = 1.0; - textConstraints.weighty = 1.0; - textConstraints.anchor = GridBagConstraints.NORTHWEST; - textConstraints.insets = new Insets(10, 10, 10, 10); - - GridBagConstraints labelConstraints = new GridBagConstraints(); - labelConstraints.anchor = GridBagConstraints.WEST; - labelConstraints.insets = new Insets(1, 2, 1, 2); - - GridBagConstraints textFieldConstraints = new GridBagConstraints(); - textFieldConstraints.gridwidth = GridBagConstraints.REMAINDER; - textFieldConstraints.fill = GridBagConstraints.HORIZONTAL; - textFieldConstraints.weightx = 1.0; - textFieldConstraints.anchor = GridBagConstraints.WEST; - textFieldConstraints.insets = labelConstraints.insets; - - GridBagConstraints panelConstraints = new GridBagConstraints(); - panelConstraints.gridwidth = GridBagConstraints.REMAINDER; - panelConstraints.fill = GridBagConstraints.HORIZONTAL; - panelConstraints.weightx = 1.0; - panelConstraints.weighty = 0.0; - panelConstraints.anchor = GridBagConstraints.NORTHWEST; - panelConstraints.insets = labelConstraints.insets; - - GridBagConstraints okButtonConstraints = new GridBagConstraints(); - okButtonConstraints.weightx = 1.0; - okButtonConstraints.weighty = 1.0; - okButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - okButtonConstraints.insets = new Insets(4, 4, 8, 4); - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; - cancelButtonConstraints.weighty = 1.0; - cancelButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - cancelButtonConstraints.insets = okButtonConstraints.insets; - - GridBagLayout layout = new GridBagLayout(); - - Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); - - // Create the panel with the explanation. - JTextArea explanationTextArea = new JTextArea(explanation, 3, 0); - explanationTextArea.setOpaque(false); - explanationTextArea.setEditable(false); - explanationTextArea.setLineWrap(true); - explanationTextArea.setWrapStyleWord(true); - - // Create the filter labels. - JLabel filterLabel = new JLabel(msg("nameFilter")); - JLabel apkFilterLabel = new JLabel(msg("apkNameFilter")); - JLabel jarFilterLabel = new JLabel(msg("jarNameFilter")); - JLabel aarFilterLabel = new JLabel(msg("aarNameFilter")); - JLabel warFilterLabel = new JLabel(msg("warNameFilter")); - JLabel earFilterLabel = new JLabel(msg("earNameFilter")); - JLabel jmodFilterLabel = new JLabel(msg("jmodNameFilter")); - JLabel zipFilterLabel = new JLabel(msg("zipNameFilter")); - - // Create the filter panel. - JPanel filterPanel = new JPanel(layout); - filterPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("filters"))); - - filterPanel.add(explanationTextArea, textConstraints); - - filterPanel.add(tip(filterLabel, "nameFilterTip"), labelConstraints); - filterPanel.add(tip(filterTextField, "fileNameFilterTip"), textFieldConstraints); - - filterPanel.add(tip(apkFilterLabel, "apkNameFilterTip"), labelConstraints); - filterPanel.add(tip(apkFilterTextField, "fileNameFilterTip"), textFieldConstraints); - - filterPanel.add(tip(jarFilterLabel, "jarNameFilterTip"), labelConstraints); - filterPanel.add(tip(jarFilterTextField, "fileNameFilterTip"), textFieldConstraints); - - filterPanel.add(tip(aarFilterLabel, "aarNameFilterTip"), labelConstraints); - filterPanel.add(tip(aarFilterTextField, "fileNameFilterTip"), textFieldConstraints); - - filterPanel.add(tip(warFilterLabel, "warNameFilterTip"), labelConstraints); - filterPanel.add(tip(warFilterTextField, "fileNameFilterTip"), textFieldConstraints); - - filterPanel.add(tip(earFilterLabel, "earNameFilterTip"), labelConstraints); - filterPanel.add(tip(earFilterTextField, "fileNameFilterTip"), textFieldConstraints); - - filterPanel.add(tip(jmodFilterLabel, "jmodNameFilterTip"), labelConstraints); - filterPanel.add(tip(jmodFilterTextField, "fileNameFilterTip"), textFieldConstraints); - - filterPanel.add(tip(zipFilterLabel, "zipNameFilterTip"), labelConstraints); - filterPanel.add(tip(zipFilterTextField, "fileNameFilterTip"), textFieldConstraints); - - - JButton okButton = new JButton(msg("ok")); - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - returnValue = APPROVE_OPTION; - hide(); - } - }); - - JButton cancelButton = new JButton(msg("cancel")); - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - hide(); - } - }); - - // Add all panels to the main panel. - JPanel mainPanel = new JPanel(layout); - mainPanel.add(filterPanel, panelConstraints); - mainPanel.add(okButton, okButtonConstraints); - mainPanel.add(cancelButton, cancelButtonConstraints); - - getContentPane().add(mainPanel); - } - - - /** - * Sets the filter to be represented in this dialog. - */ - public void setFilter(List filter) - { - filterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_FILTER); - } - - - /** - * Returns the filter currently represented in this dialog. - */ - public List getFilter() - { - String filter = filterTextField.getText(); - - return filter.equals(DEFAULT_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Sets the apk filter to be represented in this dialog. - */ - public void setApkFilter(List filter) - { - apkFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_APK_FILTER); - } - - - /** - * Returns the apk filter currently represented in this dialog. - */ - public List getApkFilter() - { - String filter = apkFilterTextField.getText(); - - return filter.equals(DEFAULT_APK_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Sets the jar filter to be represented in this dialog. - */ - public void setJarFilter(List filter) - { - jarFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_JAR_FILTER); - } - - - /** - * Returns the jar filter currently represented in this dialog. - */ - public List getJarFilter() - { - String filter = jarFilterTextField.getText(); - - return filter.equals(DEFAULT_JAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Sets the aar filter to be represented in this dialog. - */ - public void setAarFilter(List filter) - { - aarFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_AAR_FILTER); - } - - - /** - * Returns the aar filter currently represented in this dialog. - */ - public List getAarFilter() - { - String filter = aarFilterTextField.getText(); - - return filter.equals(DEFAULT_AAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Sets the war filter to be represented in this dialog. - */ - public void setWarFilter(List filter) - { - warFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_WAR_FILTER); - } - - - /** - * Returns the war filter currently represented in this dialog. - */ - public List getWarFilter() - { - String filter = warFilterTextField.getText(); - - return filter.equals(DEFAULT_WAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Sets the ear filter to be represented in this dialog. - */ - public void setEarFilter(List filter) - { - earFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_EAR_FILTER); - } - - - /** - * Returns the ear filter currently represented in this dialog. - */ - public List getEarFilter() - { - String filter = earFilterTextField.getText(); - - return filter.equals(DEFAULT_EAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Sets the jmod filter to be represented in this dialog. - */ - public void setJmodFilter(List filter) - { - jmodFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_JMOD_FILTER); - } - - - /** - * Returns the jmod filter currently represented in this dialog. - */ - public List getJmodFilter() - { - String filter = jmodFilterTextField.getText(); - - return filter.equals(DEFAULT_JMOD_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Sets the zip filter to be represented in this dialog. - */ - public void setZipFilter(List filter) - { - zipFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_ZIP_FILTER); - } - - - /** - * Returns the zip filter currently represented in this dialog. - */ - public List getZipFilter() - { - String filter = zipFilterTextField.getText(); - - return filter.equals(DEFAULT_ZIP_FILTER) ? null : ListUtil.commaSeparatedList(filter); - } - - - /** - * Shows this dialog. This method only returns when the dialog is closed. - * - * @return CANCEL_OPTION or APPROVE_OPTION, - * depending on the choice of the user. - */ - public int showDialog() - { - returnValue = CANCEL_OPTION; - - // Open the dialog in the right place, then wait for it to be closed, - // one way or another. - pack(); - setLocationRelativeTo(getOwner()); - show(); - - return returnValue; - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/GUIResources.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/GUIResources.java deleted file mode 100644 index 6e41ec4b..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/GUIResources.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import java.text.MessageFormat; -import java.util.ResourceBundle; - - -/** - * This class provides some utility methods for working with resource bundles. - * - * @author Eric Lafortune - */ -class GUIResources -{ - private static final ResourceBundle messages = ResourceBundle.getBundle(GUIResources.class.getName()); - private static final MessageFormat formatter = new MessageFormat(""); - - - /** - * Returns an internationalized message, based on its key. - */ - public static String getMessage(String messageKey) - { - return messages.getString(messageKey); - } - - - /** - * Returns an internationalized, formatted message, based on its key, with - * the given arguments. - */ - public static String getMessage(String messageKey, Object[] messageArguments) - { - formatter.applyPattern(messages.getString(messageKey)); - return formatter.format(messageArguments); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/GUIResources.properties b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/GUIResources.properties deleted file mode 100644 index fe1877cb..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/GUIResources.properties +++ /dev/null @@ -1,690 +0,0 @@ -# ProGuard -- shrinking, optimization, and obfuscation of Java class files. -# Copyright (c) 2002-2018 Eric Lafortune @ GuardSquare - -# -# Tab names. -# -proGuardTab = ProGuard -inputOutputTab = Input/Output -shrinkingTab = Shrinking -obfuscationTab = Obfuscation -optimizationTab = Optimization -informationTab = Information -processTab = Process -reTraceTab = ReTrace - -# -# Splash text. -# -developed = Developed by Eric Lafortune -shrinking = Shrinking -optimization = Optimization -obfuscation = Obfuscation -preverification = Preverification - -# -# Panel titles. -# -welcome = Welcome to ProGuard, version 6.0.3 -options = Options -keepAdditional = Keep additional classes and class members -keepNamesAdditional = Keep additional class names and class member names -assumeNoSideEffectsAdditional = Assume no side effects for additional methods -whyAreYouKeeping = Why are you keeping -preverificationAndTargeting = Preverification and targeting -consistencyAndCorrectness = Consistency and correctness -processingConsole = Processing console -reTraceSettings = ReTrace settings -deobfuscatedStackTrace = De-obfuscated stack trace - -keepAdditionalTip = \ - If required, keep additional classes, fields, and methods as entry points. -keepNamesAdditionalTip = \ - If required, keep the names of additional classes, fields, and methods. -assumeNoSideEffectsAdditionalTip = \ - Optionally specify additional methods that don't have any side effects.
\ - Only add entries if you know what you're doing! -whyAreYouKeepingTip = \ - Ask ProGuard why it is keeping certain classes, fields, or methods. - -# -# Info texts. -# -proGuardInfo = \ - ProGuard is a free class file shrinker, optimizer, obfuscator, and preverifier.\ -

\ - With this GUI, you can create, load, modify, and save ProGuard configurations.\ -
\ - You can then process your code right away, or you can run ProGuard from the \ - command line using your saved configuration.\ -

\ - With the ReTrace part of this GUI you can de-obfuscate your stack traces.\ -

\ - ProGuard and ReTrace are written and maintained by Eric Lafortune.\ -

\ - Official site at Sourceforge: \ - http://proguard.sourceforge.net/\ -
\ - Professional support by GuardSquare: \ - http://www.guardsquare.com/\ -

\ - Distributed under the GNU General Public License.\ -
\ - Copyright © 2002-2018. - -processingInfo = \ - You can now start processing your code, \ - or you can run ProGuard from the command line using your saved configuration. - -reTraceInfo = \ - If you had ProGuard write out a mapping file, \ - you can de-obfuscate your obfuscated stack traces with ReTrace!\ - \n\n\ - You can load an obfuscated stack trace from a file, \ - or you can paste it straight into the text area above. - -# -# Titles and labels corresponding to common ProGuard options. -# -programJars = Program jars, aars, wars, ears, jmods, zips, apks, and directories -libraryJars = Library jars, aars, wars, ears, jmods, zips, apks, and directories - -shrink = Shrink -printUsage = Print usage - -optimize = Optimize -allowAccessModification = Allow access modification -mergeInterfacesAggressively = Merge interfaces aggressively -optimizations = Optimizations -optimizationPasses = Optimization passes - -obfuscate = Obfuscate -printMapping = Print mapping -applyMapping = Apply mapping -obfuscationDictionary = Obfuscation dictionary -classObfuscationDictionary = Class obfuscation dictionary -packageObfuscationDictionary = Package obfuscation dictionary -overloadAggressively = Overload aggressively -useUniqueClassMemberNames = Use unique class member names -keepPackageNames = Keep package names -flattenPackageHierarchy = Flatten package hierarchy -repackageClasses = Repackage classes -useMixedCaseClassNames = Use mixed-case class names -keepAttributes = Keep attributes -keepParameterNames = Keep parameter names -renameSourceFileAttribute = Rename SourceFile attribute -adaptClassStrings = Adapt class strings -adaptResourceFileNames = Adapt resource file names -adaptResourceFileContents = Adapt resource file contents - -preverify = Preverify -microEdition = Micro Edition -android = Android - -verbose = Verbose -note = Note potential mistakes in the configuration -warn = Warn about possibly erroneous input -ignoreWarnings = Ignore warnings about possibly erroneous input -skipNonPublicLibraryClasses = Skip non-public library classes -skipNonPublicLibraryClassMembers = Skip non-public library class members -keepDirectories = Keep directories -forceProcessing = Force processing -target = Target -targets = 1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,10 -printSeeds = Print seeds -printConfiguration = Print configuration -dump = Print class files - -mappingFile = Mapping file -obfuscatedStackTrace = Obfuscated stack trace - -programJarsTip = \ - The input jars (aars, wars, ears, jmods, zips, apks, directories), followed by
\ - their corresponding output jars (wars, ears, jmods, zips, apks, directories). -libraryJarsTip = \ - The library jars (aars, wars, ears, jmods, zips, directories), on which the program jars depend.
\ - The library jars are required for processing, but they are not copied to the output. - -shrinkTip = \ - Remove unused classes, fields, and methods from the output. -printUsageTip = \ - Print out the list of unused classes, fields, and methods. - -optimizeTip = \ - Optimize the bytecode of the processed classes. -allowAccessModificationTip = \ - Allow the optimization step to modify the access modifiers of classes, fields, and methods. -mergeInterfacesAggressivelyTip = \ - Allow interfaces to be merged, even if their implementations don't implement all
\ - interface methods. This is not allowed in the Java language, but it is allowed in bytecode. -optimizationsTip = \ - Specify the types of optimizations to be performed. -optimizationsFilterTip = \ - A filter for the names of the optimizations to be performed. -optimizationsSelectTip = \ - Select from the currently available optimizations... -optimizationPassesTip = \ - Specify the number of optimization passes to be performed. - -obfuscateTip = \ - Obfuscate the names of the processed classes, fields, and methods. -printMappingTip = \ - Print out the obfuscation mapping of original names to obfuscated names. -applyMappingTip = \ - Apply the given mapping of original names to obfuscated names. -obfuscationDictionaryTip = \ - Use the words in the given file for obfuscating field names and method names. -classObfuscationDictionaryTip = \ - Use the words in the given file for obfuscating class names. -packageObfuscationDictionaryTip = \ - Use the words in the given file for obfuscating package names. -overloadAggressivelyTip = \ - Allow fields and methods to get the same obfuscated names, even if only their types or
\ - return types differ. This is not allowed in the Java language, but it is allowed in bytecode. -useUniqueClassMemberNamesTip = \ - Make sure fields and methods get the same obfuscation mapping across classes, even
\ - if they are unrelated. This is advisable if the output is to be obfuscated incrementally. -keepPackageNamesTip = \ - Keep the specified package names from being obfuscated. -packageNamesTip = \ - An optional comma-separated list of package names,
\ - e.g. myapplication,mylibrary.**
\ - Possible wildcards:\ -

    \ -
  • ? for any single character, except the package separator.\ -
  • * for any number of any characters, except the package separator.\ -
  • ** for any number of any characters.\ -
\ - The negator ! is also supported. -flattenPackageHierarchyTip = \ - Move all packages that are renamed into the given parent package. -repackageClassesTip = \ - Move all classes that are renamed into the given package. -packageTip = \ - The optional package name. -useMixedCaseClassNamesTip = \ - Generate mixed-case obfucated class names. This will complicate unpacking
\ - the resulting jars on case-insensitive file systems, should that be necessary. -keepAttributesTip = \ - Keep the specified optional class file attributes. -attributesTip = \ - An optional comma-separated list of class file attributes.\ -
    \ -
  • "Exceptions,Innerclasses, Signature" are necessary if the output is to be used as a library.\ -
  • "Deprecated" is optional if the output is to be used as a library.\ -
  • "LocalVariable*Table" can be useful for debugging.\ -
  • "Sourcefile,LineNumberTable" are necessary for generating stack traces.\ -
  • "*Annotations*" is necessary for preserving annotations.\ -
\ - The wildcard * and the negator ! are allowed. -keepParameterNamesTip = \ - Keep parameter names and types in "LocalVariable*Table" attributes
\ - in methods that are not obfuscated. -renameSourceFileAttributeTip = \ - Put the given string in the "SourceFile" attribute of the processed class files.
\ - It will appear as the file name of the classes in stack traces. -sourceFileAttributeTip = \ - The replacement "SourceFile" string. -adaptClassStringsTip = \ - Adapt string constants in the specified classes, based
\ - on the obfuscated names of corresponding classes. -adaptResourceFileNamesTip = \ - Rename the specified resource files, based on the
\ - obfuscated names of the corresponding class files. -adaptResourceFileContentsTip = \ - Adapt the contents of the specified resource files, based
\ - on the obfuscated names of the processed classes. -fileNameFilterTip = \ - A filter on file names,
\ - e.g. mydirectory1/**,mydirectory2/**
\ - Possible wildcards:\ -
    \ -
  • ? for any single character, except the directory separator.\ -
  • * for any number of any characters, except the directory separator.\ -
  • ** for any number of any characters.\ -
\ - The negator ! is also supported. - -preverifyTip = \ - Preverify the processed classes, for Java Micro Edition or for Java 6. -microEditionTip = \ - Target Java Micro Edition. -androidTip = \ - Target Android. - -verboseTip = \ - Print out verbose messages while processing. -noteTip = \ - Print out notes about special or unusual input. -noteFilterTip = \ - A filter matching classes for which no notes should be printed. -warnTip = \ - Print out warnings about possibly erroneous input.
\ - Only unset this option if you know what you're doing! -warnFilterTip = \ - A filter matching classes for which no warnings should be printed. -ignoreWarningsTip = \ - Ignore any warnings about possibly erroneous input.
\ - Only set this option if you know what you're doing! -skipNonPublicLibraryClassesTip = \ - Skip reading non-public library classes, for efficiency.
\ - You may have to unset this option if ProGuard complains about missing classes. -skipNonPublicLibraryClassMembersTip = \ - Skip reading non-public library fields and methods, for efficiency.
\ - You may have to unset this option if ProGuard complains about missing class members. -keepDirectoriesTip = \ - Keep the specified directories in the output jars, wars, ears, jmods, zips, apks, or directories. -directoriesTip = \ - A filter on directory names,
\ - e.g. mydirectory1,mydirectory2/**
\ - Possible wildcards:\ -
    \ -
  • ? for any single character, except the directory separator.\ -
  • * for any number of any characters, except the directory separator.\ -
  • ** for any number of any characters.\ -
\ - The negator ! is also supported. -forceProcessingTip = \ - Always process the input, even if the output seems up to date. -targetTip = \ - Target the specified version of Java. -printSeedsTip = \ - Print out the list of kept classes, fields, and methods. -printConfigurationTip = \ - Print out the configuration. -dumpTip = \ - Print out the internal structure of the processed class files. - -mappingFileTip = \ - The file containing the mapping of original names to obfuscated names. -obfuscatedStackTraceTip = \ - A stack trace produced by previously obfuscated code. - -# -# Titles and labels corresponding to ProGuard keep options. -# -keepTitle = Keep - -keep = Keep classes and class members -keepClassMembers = Keep class members only -keepClassesWithMembers = Keep classes and class members, if members are present - -alsoKeepTitle = Also keep - -keepDescriptorClasses = Keep descriptor classes -keepCode = Keep code - -allowTitle = Allow - -allowShrinking = Allow shrinking -allowOptimization = Allow optimization -allowObfuscation = Allow obfuscation - -conditionTitle = Condition - -keepTitleTip = Keep the specified classes and/or their fields and methods. - -keepTip = \ - Keep the specified classes, fields, and methods as entry points.
\ - This is the most common option. -keepClassMembersTip = \ - Only keep the specified fields and methods as entry points. -keepClassesWithMembersTip = \ - Keep the specified classes, fields, and methods,
\ - on the condition that the fields and methods are present. - -alsoKeepTitleTip = \ - Optionally keeping more classes.
\ - These are advanced options. - -keepDescriptorClassesTip = \ - Automatically keep the classes in the descriptors of matching
\ - fields and methods. Mostly useful for keeping their names. - -keepCodeTip = \ - Don't change the byte code of matching methods. - -allowTitleTip = \ - Optionally relax keeping the specified classes, fields, and methods.
\ - These are advanced options. - -allowShrinkingTip = \ - Remove the specified classes, fields, and methods anyway, if they are not used. -allowOptimizationTip = \ - Optimize the specified classes, fields, and methods as entry points anyway.
\ - Only set this option if you know what you're doing! -allowObfuscationTip = \ - Obfuscate the names of the specified classes, fields, and methods anyway.
\ - Only set this option if you know what you're doing! - -conditionTitleTip = \ - Only apply the option if the specified classes, fields, and methods
\ - are present. - -editConditionTip = Edit the condition. - -# -# Further keep titles and labels. -# -specifyClasses = Specify classes and class members... -specifyFields = Specify fields... -specifyMethods = Specify methods... - -comments = Comments -access = Access -required = Required -not = Not -dontCare = Don't care -annotation = Annotation -class = Class -extendsImplementsAnnotation = Extends/implements class with annotation -extendsImplementsClass = Extends/implements class -classMembers = Class members - -none = (none) -classesAnnotatedWith = Classes annotated with -extensionsOf = Extensions of -extensionsOfClassesAnnotatedWith = Extensions of classes annotated with -specification = Specification -specificationNumber = Specification # - -fieldType = Field type -returnType = Return type -name = Name -argumentTypes = Argument types - -commentsTip = \ - Optionally add a comment for this option in the configuration file. -accessTip = \ - Optionally place constraints on the access modifiers of this element.
\ - E.g. only match public elements. -requiredTip = \ - The access modifier has to be set. -notTip = \ - The access modifier must not be set. -dontCareTip = \ - The access modifier is irrelevant. -annotationTip = \ - Optionally require the given annotation to be present on this element.
\ - E.g. only match elements that have an annotation myPackage.MyAnnotation.
\ - This is an advanced option. -classTip = \ - The name of the class or interface. -extendsImplementsAnnotationTip = \ - Optionally require the given annotation to be present on the
\ - extended or implemented class or interface.
\ - E.g. only match classes that extend a class that has an annotation
\ - myPackage.MyAnnotation.
\ - This is an advanced option. -extendsImplementsClassTip = \ - Optionally require the class to implement or extend the given class or interface.
\ - E.g. only match classes that implement an interface myPackage.MyInterface. -classMembersTip = \ - Optionally keep fields and methods as entry points in the matching class or classes.
\ - E.g. keep all public 'get*' methods as entry points. -conditionTip = \ - Optionally add a condition to the specified option. - -fieldTypeTip = The field type. -returnTypeTip = The method return type, if any. -nameTip = The name. -argumentTypesTip = The method argument types, if any. - -classNameTip = \ - The class name, e.g. myPackage.MyClass
\ - Possible wildcards:\ -
    \ -
  • ? for any single character, except the package separator.\ -
  • * for any number of any characters, except the package separator.\ -
  • ** for any number of any characters.\ -
-classNamesTip = \ - A regular expression to further constrain the class names,
\ - e.g. myPackage1.MyClass,myPackage2.**
\ - Possible wildcards:\ -
    \ -
  • ? for any single character, except the package separator.\ -
  • * for any number of any characters, except the package separator.\ -
  • ** for any number of any characters.\ -
\ - The negator ! is also supported. -typeTip = \ - The type, e.g. int, or java.lang.String[]
\ - Possible wildcards:\ -
    \ -
  • % for any primitive type.\ -
  • ? for any single character, except the package separator.\ -
  • * for any number of any characters, except the package separator.\ -
  • ** for any number of any characters.\ -
  • *** (or empty) for any type.\ -
-fieldNameTip = \ - The field name, e.g. myField
\ - Possible wildcards:\ -
    \ -
  • ? for any single character.\ -
  • * for any number of any characters.\ -
-methodNameTip = \ - The method name, e.g. myMethod
\ - Possible wildcards:\ -
    \ -
  • ? for any single character.\ -
  • * for any number of any characters.\ -
-argumentTypes2Tip = \ - The comma-separated list of argument types,
\ - e.g. java.lang.String[],int,boolean
\ - Possible wildcards:\ -
    \ -
  • % for any primitive type.\ -
  • ? for any single character, except the package separator.\ -
  • * for any number of any characters, except the package separator.\ -
  • ** for any number of any characters.\ -
  • *** for any type.\ -
  • ... for any number of any arguments.\ -
- -# -# Titles and labels corresponding to optimization options. -# -selectOptimizations = Select optimizations... - -field = Field -method = Method -code = Code - -class_marking_finalTip = \ - Mark classes as final, whenever possible. -class_unboxing_enumTip = \ - Simplify enum types to integer constants, whenever possible. -class_merging_verticalTip = \ - Merge classes vertically in the class hierarchy, whenever possible. -class_merging_horizontalTip = \ - Merge classes horizontally in the class hierarchy, whenever possible. -field_removal_writeonlyTip = \ - Remove write-only fields. -field_marking_privateTip = \ - Mark fields as private, whenever possible. -field_propagation_valueTip = \ - Propagate the values of fields across methods. -method_marking_privateTip = \ - Mark methods as private, whenever possible (devirtualization). -method_marking_staticTip = \ - Mark methods as static, whenever possible (devirtualization). -method_marking_finalTip = \ - Mark methods as final, whenever possible. -method_marking_synchronizedTip = \ - Unmark methods as synchronized, whenever possible. -method_removal_parameterTip = \ - Remove unused method parameters. -method_propagation_parameterTip = \ - Propagate the values of method parameters from method invocations to \ - the invoked methods. -method_propagation_returnvalueTip = \ - Propagate the values of method return values from methods to their \ - invocations. -method_inlining_shortTip = \ - Inline short methods. -method_inlining_uniqueTip = \ - Inline methods that are only called once. -method_inlining_tailrecursionTip = \ - Simplify tail recursion calls, whenever possible. -code_mergingTip = \ - Merge identical blocks of code by modifying branch targets. -code_simplification_variableTip = \ - Perform peephole optimizations for variable loading and storing. -code_simplification_arithmeticTip = \ - Perform peephole optimizations for arithmetic instructions. -code_simplification_castTip = \ - Perform peephole optimizations for casting operations. -code_simplification_fieldTip = \ - Perform peephole optimizations for field loading and storing. -code_simplification_branchTip = \ - Perform peephole optimizations for branch instructions. -code_simplification_objectTip = \ - Perform peephole optimizations for object instantiation. -code_simplification_stringTip = \ - Perform peephole optimizations for constant strings. -code_simplification_mathTip = \ - Perform peephole optimizations for Math method calls. -code_simplification_advancedTip = \ - Simplify code based on control flow analysis and data flow analysis. -code_removal_advancedTip = \ - Remove dead code based on control flow analysis and data flow analysis. -code_removal_simpleTip = \ - Remove dead code based on a simple control flow analysis. -code_removal_variableTip = \ - Remove unused variables from the local variable frame. -code_removal_exceptionTip = \ - Remove exceptions with empty try blocks. -code_allocation_variableTip = \ - Optimize variable allocation on the local variable frame. - - -# -# File selection titles. -# -selectConfigurationFile = Select a configuration file... -saveConfigurationFile = Save configuration... -selectUsageFile = Select a usage output file... -selectPrintMappingFile = Select an output mapping file... -selectApplyMappingFile = Select an input mapping file... -selectObfuscationDictionaryFile = Select an obfuscation dictionary... -selectSeedsFile = Select a seeds output file... -selectDumpFile = Select a class dump file... -selectStackTraceFile = Select a stack trace file... - -cantOpenConfigurationFile = Can''t open the configuration file [{0}] -cantParseConfigurationFile = Can''t parse the configuration file [{0}] -cantSaveConfigurationFile = Can''t save the configuration file [{0}] -cantOpenStackTraceFile = Can''t open the stack trace file [{0}] - -jarExtensions = *.jar, *.aar, *.war, *.ear, *.jmod, *.zip, *.apk, *.ap_ (archives and directories) -proExtension = *.pro (ProGuard configurations) - -addJars = Add one or more jars or directories... -chooseJars = Choose different jars or directories... -enterFilter = Optionally filter the file names contained in the selected entries. - -filters = Filters -nameFilter = File name filter -apkNameFilter = Apk name filter -jarNameFilter = Jar name filter -aarNameFilter = Aar name filter -warNameFilter = War name filter -earNameFilter = Ear name filter -jmodNameFilter = Jmod name filter -zipNameFilter = Zip name filter - -outputFileTip = The optional output file. -inputFileTip = The input file. - -nameFilterTip = A filter on plain class file names and resource file names. -apkNameFilterTip = A filter on apk file names. -jarNameFilterTip = A filter on jar file names. -aarNameFilterTip = A filter on aar file names. -warNameFilterTip = A filter on war file names. -earNameFilterTip = A filter on ear file names. -jmodNameFilterTip = A filter on jmod file names. -zipNameFilterTip = A filter on zip file names. - -# -# Simple button texts. -# -previous = Previous -next = Next -browse = Browse... -advanced = Advanced options -basic = Basic options -selectAll = Select all -selectNone = Select none -ok = Ok -cancel = Cancel - -add = Add... -addInput = Add input... -addOutput = Add output... -edit = Edit... -filter = Filter... -remove = Remove -moveUp = Move up -moveDown = Move down - -moveToLibraries = Move to libraries -moveToProgram = Move to program - -addField = Add field... -addMethod = Add method... - -select = Select... - -loadConfiguration = Load configuration... -viewConfiguration = View configuration -saveConfiguration = Save configuration... -loadStackTrace = Load stack trace... -process = Process! -reTrace = ReTrace! - -advancedTip = Toggle between showing basic options and advanced options. - -addInputTip = Add an input jar, aar, war, ear, jmod, zip, apk, or directory. -addOutputTip = Add an output jar, aar, war, ear, jmod, zip, apk, or directory. -addTip = Add an entry. -editTip = Edit the selected entries. -filterTip = Put filters on the contents of the selected entries. -removeTip = Remove the selected entries. -moveUpTip = Move the selected entries up in the list. -moveDownTip = Move the selected entries down in the list. - -moveToLibrariesTip = Move to selected entries to the libraries. -moveToProgramTip = Move to selected entries to the program. - -addFieldTip = Add a field to the specification. -addMethodTip = Add a method to the specification. - -loadConfigurationTip = Optionally load an initial configuration. -viewConfigurationTip = View the current configuration. -saveConfigurationTip = Save the current configuration. -loadStackTraceTip = Load a stack trace from a file. -processTip = Start processing, based on the current configuration. -reTraceTip = De-obfuscate the given stack trace. - -# -# Progress messages and error messages. -# -warning = Warning -outOfMemory = Out of memory -outOfMemoryInfo = \n\ - You should run the ProGuard GUI with a larger java heap size, \ - with a command like\ - \n\n\t\ - java -Xms128m -Xmx192m -jar proguardgui.jar {0}\ - \n\n\ - or you can try running ProGuard from the command line. \ - with a command like\ - \n\n\t\ - java -jar proguard.jar @{0} -sampleConfigurationFileName = configuration.pro -errorProcessing = Error during processing -errorReTracing = Error during retracing diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/KeepSpecificationsPanel.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/KeepSpecificationsPanel.java deleted file mode 100644 index 3b8a7ee6..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/KeepSpecificationsPanel.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.*; - -import javax.swing.*; - -/** - * This ListPanel allows the user to add, edit, move, and remove - * KeepClassSpecification entries in a list. - * - * @author Eric Lafortune - */ -final class KeepSpecificationsPanel extends ClassSpecificationsPanel -{ - private final boolean markClasses; - private final boolean markConditionally; - private final boolean markDescriptorClasses; - private final boolean allowShrinking; - private final boolean allowOptimization; - private final boolean allowObfuscation; - - - public KeepSpecificationsPanel(JFrame owner, - boolean markClasses, - boolean markConditionally, - boolean markDescriptorClasses, - boolean allowShrinking, - boolean allowOptimization, - boolean allowObfuscation) - { - super(owner, true, true); - - this.markClasses = markClasses; - this.markConditionally = markConditionally; - this.markDescriptorClasses = markDescriptorClasses; - this.allowShrinking = allowShrinking; - this.allowOptimization = allowOptimization; - this.allowObfuscation = allowObfuscation; - } - - - // Factory methods for ClassSpecificationsPanel. - - protected ClassSpecification createClassSpecification() - { - return new KeepClassSpecification(markClasses, - markConditionally, - markDescriptorClasses, - false, - allowShrinking, - allowOptimization, - allowObfuscation, - null, - super.createClassSpecification()); - } - - - protected void setClassSpecification(ClassSpecification classSpecification) - { - classSpecificationDialog.setKeepSpecification((KeepClassSpecification)classSpecification); - } - - - protected ClassSpecification getClassSpecification() - { - return classSpecificationDialog.getKeepSpecification(); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ListPanel.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ListPanel.java deleted file mode 100644 index 173364b0..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ListPanel.java +++ /dev/null @@ -1,340 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.*; -import javax.swing.event.*; -import java.awt.*; -import java.awt.event.*; -import java.util.*; -import java.util.List; - -/** - * This Jpanel allows the user to move and remove entries in a - * list and between lists. Extensions of this class should add buttons to add - * and possibly edit entries, and to set and get the resulting list. - * - * @author Eric Lafortune - */ -abstract class ListPanel extends JPanel -{ - protected final DefaultListModel listModel = new DefaultListModel(); - protected final JList list = new JList(listModel); - - protected int firstSelectionButton = 2; - - - protected ListPanel() - { - GridBagLayout layout = new GridBagLayout(); - setLayout(layout); - - GridBagConstraints listConstraints = new GridBagConstraints(); - listConstraints.gridheight = GridBagConstraints.REMAINDER; - listConstraints.fill = GridBagConstraints.BOTH; - listConstraints.weightx = 1.0; - listConstraints.weighty = 1.0; - listConstraints.anchor = GridBagConstraints.NORTHWEST; - listConstraints.insets = new Insets(0, 2, 0, 2); - - // Make sure some buttons are disabled or enabled depending on whether - // the selection is empty or not. - list.addListSelectionListener(new ListSelectionListener() - { - public void valueChanged(ListSelectionEvent e) - { - enableSelectionButtons(); - } - }); - - add(new JScrollPane(list), listConstraints); - - // something like the following calls are up to the extending class: - //addAddButton(); - //addEditButton(); - //addRemoveButton(); - //addUpButton(); - //addDownButton(); - // - //enableSelectionButtons(); - } - - - protected void addRemoveButton() - { - JButton removeButton = new JButton(msg("remove")); - removeButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - // Remove the selected elements. - removeElementsAt(list.getSelectedIndices()); - } - }); - - addButton(tip(removeButton, "removeTip")); - } - - - protected void addUpButton() - { - JButton upButton = new JButton(msg("moveUp")); - upButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - int[] selectedIndices = list.getSelectedIndices(); - if (selectedIndices.length > 0 && - selectedIndices[0] > 0) - { - // Move the selected elements up. - moveElementsAt(selectedIndices, -1); - } - } - }); - - addButton(tip(upButton, "moveUpTip")); - } - - - protected void addDownButton() - { - JButton downButton = new JButton(msg("moveDown")); - downButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - int[] selectedIndices = list.getSelectedIndices(); - if (selectedIndices.length > 0 && - selectedIndices[selectedIndices.length-1] < listModel.getSize()-1) - { - // Move the selected elements down. - moveElementsAt(selectedIndices, 1); - } - } - }); - - addButton(tip(downButton, "moveDownTip")); - } - - - /** - * Adds a button that allows to copy or move entries to another ListPanel. - * - * @param buttonTextKey the button text key. - * @param tipKey the tool tip key. - * @param panel the other ListPanel. - */ - public void addCopyToPanelButton(String buttonTextKey, - String tipKey, - final ListPanel panel) - { - JButton moveButton = new JButton(msg(buttonTextKey)); - moveButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - int[] selectedIndices = list.getSelectedIndices(); - Object[] selectedElements = list.getSelectedValues(); - - // Remove the selected elements from this panel. - removeElementsAt(selectedIndices); - - // Add the elements to the other panel. - panel.addElements(selectedElements); - } - }); - - addButton(tip(moveButton, tipKey)); - } - - - protected void addButton(JComponent button) - { - GridBagConstraints buttonConstraints = new GridBagConstraints(); - buttonConstraints.gridwidth = GridBagConstraints.REMAINDER; - buttonConstraints.fill = GridBagConstraints.HORIZONTAL; - buttonConstraints.anchor = GridBagConstraints.NORTHWEST; - buttonConstraints.insets = new Insets(0, 2, 0, 2); - - add(button, buttonConstraints); - } - - - /** - * Returns a list of all right-hand side buttons. - */ - public List getButtons() - { - List list = new ArrayList(getComponentCount()-1); - - // Add all buttons. - for (int index = 1; index < getComponentCount(); index++) - { - list.add(getComponent(index)); - } - - return list; - } - - - protected void addElement(Object element) - { - listModel.addElement(element); - - // Make sure it is selected. - list.setSelectedIndex(listModel.size() - 1); - } - - - protected void addElements(Object[] elements) - { - // Add the elements one by one. - for (int index = 0; index < elements.length; index++) - { - listModel.addElement(elements[index]); - } - - // Make sure they are selected. - int[] selectedIndices = new int[elements.length]; - for (int index = 0; index < selectedIndices.length; index++) - { - selectedIndices[index] = - listModel.size() - selectedIndices.length + index; - } - list.setSelectedIndices(selectedIndices); - } - - - protected void moveElementsAt(int[] indices, int offset) - { - // Remember the selected elements. - Object[] selectedElements = list.getSelectedValues(); - - // Remove the selected elements. - removeElementsAt(indices); - - // Update the element indices. - for (int index = 0; index < indices.length; index++) - { - indices[index] += offset; - } - - // Reinsert the selected elements. - insertElementsAt(selectedElements, indices); - } - - - protected void insertElementsAt(Object[] elements, int[] indices) - { - for (int index = 0; index < elements.length; index++) - { - listModel.insertElementAt(elements[index], indices[index]); - } - - // Make sure they are selected. - list.setSelectedIndices(indices); - } - - - protected void setElementAt(Object element, int index) - { - listModel.setElementAt(element, index); - - // Make sure it is selected. - list.setSelectedIndex(index); - } - - - protected void setElementsAt(Object[] elements, int[] indices) - { - for (int index = 0; index < elements.length; index++) - { - listModel.setElementAt(elements[index], indices[index]); - } - - // Make sure they are selected. - list.setSelectedIndices(indices); - } - - - protected void removeElementsAt(int[] indices) - { - for (int index = indices.length - 1; index >= 0; index--) - { - listModel.removeElementAt(indices[index]); - } - - // Make sure nothing is selected. - list.clearSelection(); - - // Make sure the selection buttons are properly enabled, - // since the above method doesn't seem to notify the listener. - enableSelectionButtons(); - } - - - protected void removeAllElements() - { - listModel.removeAllElements(); - - // Make sure the selection buttons are properly enabled, - // since the above method doesn't seem to notify the listener. - enableSelectionButtons(); - } - - - /** - * Enables or disables the buttons that depend on a selection. - */ - protected void enableSelectionButtons() - { - boolean selected = !list.isSelectionEmpty(); - - // Loop over all components, except the list itself and the Add button. - for (int index = firstSelectionButton; index < getComponentCount(); index++) - { - getComponent(index).setEnabled(selected); - } - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MemberSpecificationDialog.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MemberSpecificationDialog.java deleted file mode 100644 index b8f58bd9..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MemberSpecificationDialog.java +++ /dev/null @@ -1,509 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.MemberSpecification; -import proguard.classfile.*; -import proguard.classfile.util.ClassUtil; -import proguard.util.ListUtil; - -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.awt.event.*; - -/** - * This JDialog allows the user to enter a String. - * - * @author Eric Lafortune - */ -final class MemberSpecificationDialog extends JDialog -{ - /** - * Return value if the dialog is canceled (with the Cancel button or by - * closing the dialog window). - */ - public static final int CANCEL_OPTION = 1; - - /** - * Return value if the dialog is approved (with the Ok button). - */ - public static final int APPROVE_OPTION = 0; - - - private final boolean isField; - - private final JRadioButton[] publicRadioButtons; - private final JRadioButton[] privateRadioButtons; - private final JRadioButton[] protectedRadioButtons; - private final JRadioButton[] staticRadioButtons; - private final JRadioButton[] finalRadioButtons; - private final JRadioButton[] syntheticRadioButtons; - - private JRadioButton[] volatileRadioButtons; - private JRadioButton[] transientRadioButtons; - - private JRadioButton[] synchronizedRadioButtons; - private JRadioButton[] nativeRadioButtons; - private JRadioButton[] abstractRadioButtons; - private JRadioButton[] strictRadioButtons; - private JRadioButton[] bridgeRadioButtons; - private JRadioButton[] varargsRadioButtons; - - private final JTextField annotationTypeTextField = new JTextField(20); - private final JTextField nameTextField = new JTextField(20); - private final JTextField typeTextField = new JTextField(20); - private final JTextField argumentTypesTextField = new JTextField(20); - - private int returnValue; - - - public MemberSpecificationDialog(JDialog owner, boolean isField) - { - super(owner, msg(isField ? "specifyFields" : "specifyMethods"), true); - setResizable(true); - - // Create some constraints that can be reused. - GridBagConstraints constraints = new GridBagConstraints(); - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(1, 2, 1, 2); - - GridBagConstraints constraintsStretch = new GridBagConstraints(); - constraintsStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsStretch.weightx = 1.0; - constraintsStretch.anchor = GridBagConstraints.WEST; - constraintsStretch.insets = constraints.insets; - - GridBagConstraints constraintsLast = new GridBagConstraints(); - constraintsLast.gridwidth = GridBagConstraints.REMAINDER; - constraintsLast.anchor = GridBagConstraints.WEST; - constraintsLast.insets = constraints.insets; - - GridBagConstraints constraintsLastStretch = new GridBagConstraints(); - constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; - constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsLastStretch.weightx = 1.0; - constraintsLastStretch.anchor = GridBagConstraints.WEST; - constraintsLastStretch.insets = constraints.insets; - - GridBagConstraints panelConstraints = new GridBagConstraints(); - panelConstraints.gridwidth = GridBagConstraints.REMAINDER; - panelConstraints.fill = GridBagConstraints.HORIZONTAL; - panelConstraints.weightx = 1.0; - panelConstraints.weighty = 0.0; - panelConstraints.anchor = GridBagConstraints.NORTHWEST; - panelConstraints.insets = constraints.insets; - - GridBagConstraints stretchPanelConstraints = new GridBagConstraints(); - stretchPanelConstraints.gridwidth = GridBagConstraints.REMAINDER; - stretchPanelConstraints.fill = GridBagConstraints.BOTH; - stretchPanelConstraints.weightx = 1.0; - stretchPanelConstraints.weighty = 1.0; - stretchPanelConstraints.anchor = GridBagConstraints.NORTHWEST; - stretchPanelConstraints.insets = constraints.insets; - - GridBagConstraints labelConstraints = new GridBagConstraints(); - labelConstraints.anchor = GridBagConstraints.CENTER; - labelConstraints.insets = new Insets(2, 10, 2, 10); - - GridBagConstraints lastLabelConstraints = new GridBagConstraints(); - lastLabelConstraints.gridwidth = GridBagConstraints.REMAINDER; - lastLabelConstraints.anchor = GridBagConstraints.CENTER; - lastLabelConstraints.insets = labelConstraints.insets; - - GridBagConstraints advancedButtonConstraints = new GridBagConstraints(); - advancedButtonConstraints.weightx = 1.0; - advancedButtonConstraints.weighty = 1.0; - advancedButtonConstraints.anchor = GridBagConstraints.SOUTHWEST; - advancedButtonConstraints.insets = new Insets(4, 4, 8, 4); - - GridBagConstraints okButtonConstraints = new GridBagConstraints(); - okButtonConstraints.weightx = 1.0; - okButtonConstraints.weighty = 1.0; - okButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - okButtonConstraints.insets = advancedButtonConstraints.insets; - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; - cancelButtonConstraints.weighty = 1.0; - cancelButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - cancelButtonConstraints.insets = okButtonConstraints.insets; - - GridBagLayout layout = new GridBagLayout(); - - Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); - - this.isField = isField; - - // Create the access panel. - JPanel accessPanel = new JPanel(layout); - accessPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("access"))); - - accessPanel.add(Box.createGlue(), labelConstraints); - accessPanel.add(tip(new JLabel(msg("required")), "requiredTip"), labelConstraints); - accessPanel.add(tip(new JLabel(msg("not")), "notTip"), labelConstraints); - accessPanel.add(tip(new JLabel(msg("dontCare")), "dontCareTip"), labelConstraints); - accessPanel.add(Box.createGlue(), constraintsLastStretch); - - publicRadioButtons = addRadioButtonTriplet("Public", accessPanel); - privateRadioButtons = addRadioButtonTriplet("Private", accessPanel); - protectedRadioButtons = addRadioButtonTriplet("Protected", accessPanel); - staticRadioButtons = addRadioButtonTriplet("Static", accessPanel); - finalRadioButtons = addRadioButtonTriplet("Final", accessPanel); - syntheticRadioButtons = addRadioButtonTriplet("Synthetic", accessPanel); - - if (isField) - { - volatileRadioButtons = addRadioButtonTriplet("Volatile", accessPanel); - transientRadioButtons = addRadioButtonTriplet("Transient", accessPanel); - } - else - { - synchronizedRadioButtons = addRadioButtonTriplet("Synchronized", accessPanel); - nativeRadioButtons = addRadioButtonTriplet("Native", accessPanel); - abstractRadioButtons = addRadioButtonTriplet("Abstract", accessPanel); - strictRadioButtons = addRadioButtonTriplet("Strict", accessPanel); - bridgeRadioButtons = addRadioButtonTriplet("Bridge", accessPanel); - varargsRadioButtons = addRadioButtonTriplet("Varargs", accessPanel); - } - - // Create the type panel. - JPanel typePanel = new JPanel(layout); - typePanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg(isField ? "fieldType" : - "returnType"))); - - typePanel.add(tip(typeTextField, "typeTip"), constraintsLastStretch); - - // Create the annotation type panel. - final JPanel annotationTypePanel = new JPanel(layout); - annotationTypePanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("annotation"))); - - annotationTypePanel.add(tip(annotationTypeTextField, "classNameTip"), constraintsLastStretch); - - // Create the name panel. - JPanel namePanel = new JPanel(layout); - namePanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("name"))); - - namePanel.add(tip(nameTextField, isField ? "fieldNameTip" : - "methodNameTip"), constraintsLastStretch); - - // Create the arguments panel. - JPanel argumentsPanel = new JPanel(layout); - argumentsPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, - msg("argumentTypes"))); - - argumentsPanel.add(tip(argumentTypesTextField, "argumentTypes2Tip"), constraintsLastStretch); - - // Create the Advanced button. - final JButton advancedButton = new JButton(msg("basic")); - advancedButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - boolean visible = !annotationTypePanel.isVisible(); - - annotationTypePanel.setVisible(visible); - - advancedButton.setText(msg(visible ? "basic" : "advanced")); - - pack(); - } - }); - advancedButton.doClick(); - - // Create the Ok button. - JButton okButton = new JButton(msg("ok")); - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - returnValue = APPROVE_OPTION; - hide(); - } - }); - - // Create the Cancel button. - JButton cancelButton = new JButton(msg("cancel")); - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - hide(); - } - }); - - // Add all panels to the main panel. - JPanel mainPanel = new JPanel(layout); - mainPanel.add(tip(accessPanel, "accessTip"), panelConstraints); - mainPanel.add(tip(annotationTypePanel, "annotationTip"), panelConstraints); - mainPanel.add(tip(typePanel, isField ? "fieldTypeTip" : - "returnTypeTip"), panelConstraints); - mainPanel.add(tip(namePanel, "nameTip"), panelConstraints); - - if (!isField) - { - mainPanel.add(tip(argumentsPanel, "argumentTypesTip"), panelConstraints); - } - - mainPanel.add(tip(advancedButton, "advancedTip"), advancedButtonConstraints); - mainPanel.add(okButton, okButtonConstraints); - mainPanel.add(cancelButton, cancelButtonConstraints); - - getContentPane().add(new JScrollPane(mainPanel)); - } - - - /** - * Adds a JLabel and three JRadioButton instances in a ButtonGroup to the - * given panel with a GridBagLayout, and returns the buttons in an array. - */ - private JRadioButton[] addRadioButtonTriplet(String labelText, - JPanel panel) - { - GridBagConstraints labelConstraints = new GridBagConstraints(); - labelConstraints.anchor = GridBagConstraints.WEST; - labelConstraints.insets = new Insets(2, 10, 2, 10); - - GridBagConstraints buttonConstraints = new GridBagConstraints(); - buttonConstraints.insets = labelConstraints.insets; - - GridBagConstraints lastGlueConstraints = new GridBagConstraints(); - lastGlueConstraints.gridwidth = GridBagConstraints.REMAINDER; - lastGlueConstraints.weightx = 1.0; - - // Create the radio buttons. - JRadioButton radioButton0 = new JRadioButton(); - JRadioButton radioButton1 = new JRadioButton(); - JRadioButton radioButton2 = new JRadioButton(); - - // Put them in a button group. - ButtonGroup buttonGroup = new ButtonGroup(); - buttonGroup.add(radioButton0); - buttonGroup.add(radioButton1); - buttonGroup.add(radioButton2); - - // Add the label and the buttons to the panel. - panel.add(new JLabel(labelText), labelConstraints); - panel.add(radioButton0, buttonConstraints); - panel.add(radioButton1, buttonConstraints); - panel.add(radioButton2, buttonConstraints); - panel.add(Box.createGlue(), lastGlueConstraints); - - return new JRadioButton[] - { - radioButton0, - radioButton1, - radioButton2 - }; - } - - - /** - * Sets the MemberSpecification to be represented in this dialog. - */ - public void setMemberSpecification(MemberSpecification memberSpecification) - { - String annotationType = memberSpecification.annotationType; - String name = memberSpecification.name; - String descriptor = memberSpecification.descriptor; - - // Set the class name text fields. - annotationTypeTextField.setText(annotationType == null ? "" : ClassUtil.externalType(annotationType)); - - // Set the access radio buttons. - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_PUBLIC, publicRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_PRIVATE, privateRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_PROTECTED, protectedRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_STATIC, staticRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_FINAL, finalRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_SYNTHETIC, syntheticRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_VOLATILE, volatileRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_TRANSIENT, transientRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_SYNCHRONIZED, synchronizedRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_NATIVE, nativeRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_ABSTRACT, abstractRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_STRICT, strictRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_BRIDGE, bridgeRadioButtons); - setMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_VARARGS, varargsRadioButtons); - - // Set the class name text fields. - nameTextField.setText(name == null ? "*" : name); - - if (isField) - { - typeTextField .setText(descriptor == null ? "***" : ClassUtil.externalType(descriptor)); - } - else - { - typeTextField .setText(descriptor == null ? "***" : ClassUtil.externalMethodReturnType(descriptor)); - argumentTypesTextField.setText(descriptor == null ? "..." : ClassUtil.externalMethodArguments(descriptor)); - } - } - - - /** - * Returns the MemberSpecification currently represented in this dialog. - */ - public MemberSpecification getMemberSpecification() - { - String annotationType = annotationTypeTextField.getText(); - String name = nameTextField.getText(); - String type = typeTextField.getText(); - String arguments = argumentTypesTextField.getText(); - - // Convert all class member specifications into the internal format. - annotationType = - annotationType.equals("") || - annotationType.equals("***") ? null : ClassUtil.internalType(annotationType); - - if (name.equals("") || - name.equals("*")) - { - name = null; - } - - if (isField) - { - type = - type.equals("") || - type.equals("***") ? null : ClassUtil.internalType(type); - } - else - { - if (type.equals("")) - { - type = JavaConstants.TYPE_VOID; - } - - type = - type .equals("***") && - arguments.equals("...") ? null : - ClassUtil.internalMethodDescriptor(type, ListUtil.commaSeparatedList(arguments)); - } - - MemberSpecification memberSpecification = - new MemberSpecification(0, 0, annotationType, name, type); - - // Also get the access radio button settings. - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_PUBLIC, publicRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_PRIVATE, privateRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_PROTECTED, protectedRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_STATIC, staticRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_FINAL, finalRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_SYNTHETIC, syntheticRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_VOLATILE, volatileRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_TRANSIENT, transientRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_SYNCHRONIZED, synchronizedRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_NATIVE, nativeRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_ABSTRACT, abstractRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_STRICT, strictRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_BRIDGE, bridgeRadioButtons); - getMemberSpecificationRadioButtons(memberSpecification, ClassConstants.ACC_VARARGS, varargsRadioButtons); - - return memberSpecification; - } - - - /** - * Shows this dialog. This method only returns when the dialog is closed. - * - * @return CANCEL_OPTION or APPROVE_OPTION, - * depending on the choice of the user. - */ - public int showDialog() - { - returnValue = CANCEL_OPTION; - - // Open the dialog in the right place, then wait for it to be closed, - // one way or another. - pack(); - setLocationRelativeTo(getOwner()); - show(); - - return returnValue; - } - - - /** - * Sets the appropriate radio button of a given triplet, based on the access - * flags of the given keep option. - */ - private void setMemberSpecificationRadioButtons(MemberSpecification memberSpecification, - int flag, - JRadioButton[] radioButtons) - { - if (radioButtons != null) - { - int index = (memberSpecification.requiredSetAccessFlags & flag) != 0 ? 0 : - (memberSpecification.requiredUnsetAccessFlags & flag) != 0 ? 1 : - 2; - radioButtons[index].setSelected(true); - } - } - - - /** - * Updates the access flag of the given keep option, based on the given radio - * button triplet. - */ - private void getMemberSpecificationRadioButtons(MemberSpecification memberSpecification, - int flag, - JRadioButton[] radioButtons) - { - if (radioButtons != null) - { - if (radioButtons[0].isSelected()) - { - memberSpecification.requiredSetAccessFlags |= flag; - } - else if (radioButtons[1].isSelected()) - { - memberSpecification.requiredUnsetAccessFlags |= flag; - } - } - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MemberSpecificationsPanel.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MemberSpecificationsPanel.java deleted file mode 100644 index 9d335420..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MemberSpecificationsPanel.java +++ /dev/null @@ -1,305 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.MemberSpecification; -import proguard.classfile.ClassConstants; -import proguard.classfile.util.ClassUtil; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import java.util.*; -import java.util.List; - - -/** - * This ListPanel allows the user to add, edit, move, and remove - * MemberSpecification entries in a list. - * - * @author Eric Lafortune - */ -final class MemberSpecificationsPanel extends ListPanel -{ - private final MemberSpecificationDialog fieldSpecificationDialog; - private final MemberSpecificationDialog methodSpecificationDialog; - - - public MemberSpecificationsPanel(JDialog owner, - boolean includeFieldButton) - { - super(); - - super.firstSelectionButton = includeFieldButton ? 3 : 2; - - list.setCellRenderer(new MyListCellRenderer()); - - fieldSpecificationDialog = new MemberSpecificationDialog(owner, true); - methodSpecificationDialog = new MemberSpecificationDialog(owner, false); - - if (includeFieldButton) - { - addAddFieldButton(); - } - addAddMethodButton(); - addEditButton(); - addRemoveButton(); - addUpButton(); - addDownButton(); - - enableSelectionButtons(); - } - - - protected void addAddFieldButton() - { - JButton addFieldButton = new JButton(msg("addField")); - addFieldButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - fieldSpecificationDialog.setMemberSpecification(new MemberSpecification()); - int returnValue = fieldSpecificationDialog.showDialog(); - if (returnValue == MemberSpecificationDialog.APPROVE_OPTION) - { - // Add the new element. - addElement(new MyMemberSpecificationWrapper(fieldSpecificationDialog.getMemberSpecification(), - true)); - } - } - }); - - addButton(tip(addFieldButton, "addFieldTip")); - } - - - protected void addAddMethodButton() - { - JButton addMethodButton = new JButton(msg("addMethod")); - addMethodButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - methodSpecificationDialog.setMemberSpecification(new MemberSpecification()); - int returnValue = methodSpecificationDialog.showDialog(); - if (returnValue == MemberSpecificationDialog.APPROVE_OPTION) - { - // Add the new element. - addElement(new MyMemberSpecificationWrapper(methodSpecificationDialog.getMemberSpecification(), - false)); - } - } - }); - - addButton(tip(addMethodButton, "addMethodTip")); - } - - - protected void addEditButton() - { - JButton editButton = new JButton(msg("edit")); - editButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - MyMemberSpecificationWrapper wrapper = - (MyMemberSpecificationWrapper)list.getSelectedValue(); - - MemberSpecificationDialog memberSpecificationDialog = - wrapper.isField ? - fieldSpecificationDialog : - methodSpecificationDialog; - - memberSpecificationDialog.setMemberSpecification(wrapper.memberSpecification); - int returnValue = memberSpecificationDialog.showDialog(); - if (returnValue == MemberSpecificationDialog.APPROVE_OPTION) - { - // Replace the old element. - wrapper.memberSpecification = memberSpecificationDialog.getMemberSpecification(); - setElementAt(wrapper, - list.getSelectedIndex()); - } - } - }); - - addButton(tip(editButton, "editTip")); - } - - - /** - * Sets the MemberSpecification instances to be represented in this panel. - */ - public void setMemberSpecifications(List fieldSpecifications, - List methodSpecifications) - { - listModel.clear(); - - if (fieldSpecifications != null) - { - for (int index = 0; index < fieldSpecifications.size(); index++) - { - listModel.addElement( - new MyMemberSpecificationWrapper((MemberSpecification)fieldSpecifications.get(index), - true)); - } - } - - if (methodSpecifications != null) - { - for (int index = 0; index < methodSpecifications.size(); index++) - { - listModel.addElement( - new MyMemberSpecificationWrapper((MemberSpecification)methodSpecifications.get(index), - false)); - } - } - - // Make sure the selection buttons are properly enabled, - // since the clear method doesn't seem to notify the listener. - enableSelectionButtons(); - } - - - /** - * Returns the MemberSpecification instances currently represented in - * this panel, referring to fields or to methods. - * - * @param isField specifies whether specifications referring to fields or - * specifications referring to methods should be returned. - */ - public List getMemberSpecifications(boolean isField) - { - int size = listModel.size(); - if (size == 0) - { - return null; - } - - List memberSpecifications = new ArrayList(size); - for (int index = 0; index < size; index++) - { - MyMemberSpecificationWrapper wrapper = - (MyMemberSpecificationWrapper)listModel.get(index); - - if (wrapper.isField == isField) - { - memberSpecifications.add(wrapper.memberSpecification); - } - } - - return memberSpecifications; - } - - - /** - * This ListCellRenderer renders MemberSpecification objects. - */ - private static class MyListCellRenderer implements ListCellRenderer - { - private final JLabel label = new JLabel(); - - - // Implementations for ListCellRenderer. - - public Component getListCellRendererComponent(JList list, - Object value, - int index, - boolean isSelected, - boolean cellHasFocus) - { - MyMemberSpecificationWrapper wrapper = (MyMemberSpecificationWrapper)value; - - MemberSpecification option = wrapper.memberSpecification; - String name = option.name; - String descriptor = option.descriptor; - - label.setText(wrapper.isField ? - (descriptor == null ? name == null ? - "" : - "***" + ' ' + name : - ClassUtil.externalFullFieldDescription(0, - name == null ? "*" : name, - descriptor)) : - (descriptor == null ? name == null ? - "" : - "***" + ' ' + name + "(...)" : - ClassUtil.externalFullMethodDescription(ClassConstants.METHOD_NAME_INIT, - 0, - name == null ? "*" : name, - descriptor))); - - if (isSelected) - { - label.setBackground(list.getSelectionBackground()); - label.setForeground(list.getSelectionForeground()); - } - else - { - label.setBackground(list.getBackground()); - label.setForeground(list.getForeground()); - } - - label.setOpaque(true); - - return label; - } - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } - - - /** - * This class wraps a MemberSpecification, additionally storing whether - * the option refers to a field or to a method. - */ - private static class MyMemberSpecificationWrapper - { - public MemberSpecification memberSpecification; - public final boolean isField; - - public MyMemberSpecificationWrapper(MemberSpecification memberSpecification, - boolean isField) - { - this.memberSpecification = memberSpecification; - this.isField = isField; - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MessageDialogRunnable.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MessageDialogRunnable.java deleted file mode 100644 index 3127eb99..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/MessageDialogRunnable.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.*; -import java.awt.*; - - -/** - * This Runnable can show a message dialog. - * - * @author Eric Lafortune - */ -final class MessageDialogRunnable implements Runnable -{ - private final Component parentComponent; - private final Object message; - private final String title; - private final int messageType; - - - /** - * Creates a new MessageDialogRunnable object. - * @see JOptionPane#showMessageDialog(Component, Object, String, int) - */ - public static void showMessageDialog(Component parentComponent, - Object message, - String title, - int messageType) - { - try - { - SwingUtil.invokeAndWait(new MessageDialogRunnable(parentComponent, - message, - title, - messageType)); - } - catch (Exception e) - { - // Nothing. - } - } - - - /** - * Creates a new MessageDialogRunnable object. - * @see JOptionPane#showMessageDialog(Component, Object, String, int) - */ - public MessageDialogRunnable(Component parentComponent, - Object message, - String title, - int messageType) - { - this.parentComponent = parentComponent; - this.message = message; - this.title = title; - this.messageType = messageType; - } - - - - // Implementation for Runnable. - - public void run() - { - JOptionPane.showMessageDialog(parentComponent, - message, - title, - messageType); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/OptimizationsDialog.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/OptimizationsDialog.java deleted file mode 100644 index 3de5379c..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/OptimizationsDialog.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.optimize.Optimizer; -import proguard.util.*; - -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.awt.event.*; - -/** - * This JDialog allows the user to enter a String. - * - * @author Eric Lafortune - */ -final class OptimizationsDialog extends JDialog -{ - /** - * Return value if the dialog is canceled (with the Cancel button or by - * closing the dialog window). - */ - public static final int CANCEL_OPTION = 1; - - /** - * Return value if the dialog is approved (with the Ok button). - */ - public static final int APPROVE_OPTION = 0; - - - private final JCheckBox[] optimizationCheckBoxes = new JCheckBox[Optimizer.OPTIMIZATION_NAMES.length]; - - private int returnValue; - - - public OptimizationsDialog(JFrame owner) - { - super(owner, msg("selectOptimizations"), true); - setResizable(true); - - // Create some constraints that can be reused. - GridBagConstraints constraintsLast = new GridBagConstraints(); - constraintsLast.gridwidth = GridBagConstraints.REMAINDER; - constraintsLast.anchor = GridBagConstraints.WEST; - constraintsLast.insets = new Insets(1, 2, 1, 2); - - GridBagConstraints constraintsLastStretch = new GridBagConstraints(); - constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; - constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsLastStretch.weightx = 1.0; - constraintsLastStretch.anchor = GridBagConstraints.WEST; - constraintsLastStretch.insets = constraintsLast.insets; - - GridBagConstraints panelConstraints = new GridBagConstraints(); - panelConstraints.gridwidth = GridBagConstraints.REMAINDER; - panelConstraints.fill = GridBagConstraints.HORIZONTAL; - panelConstraints.weightx = 1.0; - panelConstraints.weighty = 0.0; - panelConstraints.anchor = GridBagConstraints.NORTHWEST; - panelConstraints.insets = constraintsLast.insets; - - GridBagConstraints selectButtonConstraints = new GridBagConstraints(); - selectButtonConstraints.weighty = 1.0; - selectButtonConstraints.anchor = GridBagConstraints.SOUTHWEST; - selectButtonConstraints.insets = new Insets(4, 4, 8, 4); - - GridBagConstraints okButtonConstraints = new GridBagConstraints(); - okButtonConstraints.weightx = 1.0; - okButtonConstraints.weighty = 1.0; - okButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - okButtonConstraints.insets = selectButtonConstraints.insets; - - GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); - cancelButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; - cancelButtonConstraints.weighty = 1.0; - cancelButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - cancelButtonConstraints.insets = selectButtonConstraints.insets; - - GridBagLayout layout = new GridBagLayout(); - - Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); - - // Create the optimizations panel. - JPanel optimizationsPanel = new JPanel(layout); - JPanel optimizationSubpanel = null; - String lastOptimizationPrefix = null; - - for (int index = 0; index < Optimizer.OPTIMIZATION_NAMES.length; index++) - { - String optimizationName = Optimizer.OPTIMIZATION_NAMES[index]; - - String optimizationPrefix = optimizationName.substring(0, optimizationName.indexOf('/')); - - if (optimizationSubpanel == null || !optimizationPrefix.equals(lastOptimizationPrefix)) - { - // Create a new keep subpanel and add it. - optimizationSubpanel = new JPanel(layout); - optimizationSubpanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, msg(optimizationPrefix))); - optimizationsPanel.add(optimizationSubpanel, panelConstraints); - - lastOptimizationPrefix = optimizationPrefix; - } - - JCheckBox optimizationCheckBox = new JCheckBox(optimizationName); - optimizationCheckBoxes[index] = optimizationCheckBox; - - optimizationSubpanel.add(tip(optimizationCheckBox, optimizationName.replace('/', '_')+"Tip"), constraintsLastStretch); - } - - // Create the Select All button. - JButton selectAllButton = new JButton(msg("selectAll")); - selectAllButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - for (int index = 0; index < optimizationCheckBoxes.length; index++) - { - optimizationCheckBoxes[index].setSelected(true); - } - } - }); - - // Create the Select All button. - JButton selectNoneButton = new JButton(msg("selectNone")); - selectNoneButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - for (int index = 0; index < optimizationCheckBoxes.length; index++) - { - optimizationCheckBoxes[index].setSelected(false); - } - } - }); - - // Create the Ok button. - JButton okButton = new JButton(msg("ok")); - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - returnValue = APPROVE_OPTION; - hide(); - } - }); - - // Create the Cancel button. - JButton cancelButton = new JButton(msg("cancel")); - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - hide(); - } - }); - - // Add all panels to the main panel. - optimizationsPanel.add(selectAllButton, selectButtonConstraints); - optimizationsPanel.add(selectNoneButton, selectButtonConstraints); - optimizationsPanel.add(okButton, okButtonConstraints); - optimizationsPanel.add(cancelButton, cancelButtonConstraints); - - getContentPane().add(new JScrollPane(optimizationsPanel)); - } - - - /** - * Sets the initial optimization filter to be used by the dialog. - */ - public void setFilter(String optimizations) - { - StringMatcher filter = optimizations != null && optimizations.length() > 0 ? - new ListParser(new NameParser()).parse(optimizations) : - new FixedStringMatcher(""); - - for (int index = 0; index < Optimizer.OPTIMIZATION_NAMES.length; index++) - { - optimizationCheckBoxes[index].setSelected(filter.matches(Optimizer.OPTIMIZATION_NAMES[index])); - } - } - - - /** - * Returns the optimization filter composed from the settings in the dialog. - */ - public String getFilter() - { - return new FilterBuilder(optimizationCheckBoxes, '/').buildFilter(); - } - - - /** - * Shows this dialog. This method only returns when the dialog is closed. - * - * @return CANCEL_OPTION or APPROVE_OPTION, - * depending on the choice of the user. - */ - public int showDialog() - { - returnValue = CANCEL_OPTION; - - // Open the dialog in the right place, then wait for it to be closed, - // one way or another. - pack(); - setLocationRelativeTo(getOwner()); - show(); - - return returnValue; - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } -} \ No newline at end of file diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ProGuardGUI.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ProGuardGUI.java deleted file mode 100644 index d0d131ad..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ProGuardGUI.java +++ /dev/null @@ -1,2066 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.*; -import proguard.classfile.util.ClassUtil; -import proguard.gui.splash.*; -import proguard.util.ListUtil; - -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.awt.event.*; -import java.io.*; -import java.net.*; -import java.util.*; -import java.util.List; - - -/** - * GUI for configuring and executing ProGuard and ReTrace. - * - * @author Eric Lafortune - */ -public class ProGuardGUI extends JFrame -{ - private static final String NO_SPLASH_OPTION = "-nosplash"; - - private static final String TITLE_IMAGE_FILE = "vtitle.png"; - private static final String BOILERPLATE_CONFIGURATION = "boilerplate.pro"; - private static final String DEFAULT_CONFIGURATION = "default.pro"; - - private static final String OPTIMIZATIONS_DEFAULT = "*"; - private static final String KEEP_ATTRIBUTE_DEFAULT = "Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod"; - private static final String SOURCE_FILE_ATTRIBUTE_DEFAULT = "SourceFile"; - private static final String ADAPT_RESOURCE_FILE_NAMES_DEFAULT = "**.properties"; - private static final String ADAPT_RESOURCE_FILE_CONTENTS_DEFAULT = "**.properties,META-INF/MANIFEST.MF"; - - private static final Border BORDER = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); - - static boolean systemOutRedirected; - - private final JFileChooser configurationChooser = new JFileChooser(""); - private final JFileChooser fileChooser = new JFileChooser(""); - - private final SplashPanel splashPanel; - - private final ClassPathPanel programPanel = new ClassPathPanel(this, true); - private final ClassPathPanel libraryPanel = new ClassPathPanel(this, false); - - private KeepClassSpecification[] boilerplateKeep; - private final JCheckBox[] boilerplateKeepCheckBoxes; - private final JTextField[] boilerplateKeepTextFields; - - private final KeepSpecificationsPanel additionalKeepPanel = new KeepSpecificationsPanel(this, true, false, false, false, false, false); - - private KeepClassSpecification[] boilerplateKeepNames; - private final JCheckBox[] boilerplateKeepNamesCheckBoxes; - private final JTextField[] boilerplateKeepNamesTextFields; - - private final KeepSpecificationsPanel additionalKeepNamesPanel = new KeepSpecificationsPanel(this, true, false, false, true, false, false); - - private ClassSpecification[] boilerplateNoSideEffectMethods; - private final JCheckBox[] boilerplateNoSideEffectMethodCheckBoxes; - - private final ClassSpecificationsPanel additionalNoSideEffectsPanel = new ClassSpecificationsPanel(this, false, false); - - private final ClassSpecificationsPanel whyAreYouKeepingPanel = new ClassSpecificationsPanel(this, false, true); - - private final JCheckBox shrinkCheckBox = new JCheckBox(msg("shrink")); - private final JCheckBox printUsageCheckBox = new JCheckBox(msg("printUsage")); - - private final JCheckBox optimizeCheckBox = new JCheckBox(msg("optimize")); - private final JCheckBox allowAccessModificationCheckBox = new JCheckBox(msg("allowAccessModification")); - private final JCheckBox mergeInterfacesAggressivelyCheckBox = new JCheckBox(msg("mergeInterfacesAggressively")); - private final JLabel optimizationsLabel = new JLabel(msg("optimizations")); - private final JLabel optimizationPassesLabel = new JLabel(msg("optimizationPasses")); - - private final JSpinner optimizationPassesSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 9, 1)); - - private final JCheckBox obfuscateCheckBox = new JCheckBox(msg("obfuscate")); - private final JCheckBox printMappingCheckBox = new JCheckBox(msg("printMapping")); - private final JCheckBox applyMappingCheckBox = new JCheckBox(msg("applyMapping")); - private final JCheckBox obfuscationDictionaryCheckBox = new JCheckBox(msg("obfuscationDictionary")); - private final JCheckBox classObfuscationDictionaryCheckBox = new JCheckBox(msg("classObfuscationDictionary")); - private final JCheckBox packageObfuscationDictionaryCheckBox = new JCheckBox(msg("packageObfuscationDictionary")); - private final JCheckBox overloadAggressivelyCheckBox = new JCheckBox(msg("overloadAggressively")); - private final JCheckBox useUniqueClassMemberNamesCheckBox = new JCheckBox(msg("useUniqueClassMemberNames")); - private final JCheckBox useMixedCaseClassNamesCheckBox = new JCheckBox(msg("useMixedCaseClassNames")); - private final JCheckBox keepPackageNamesCheckBox = new JCheckBox(msg("keepPackageNames")); - private final JCheckBox flattenPackageHierarchyCheckBox = new JCheckBox(msg("flattenPackageHierarchy")); - private final JCheckBox repackageClassesCheckBox = new JCheckBox(msg("repackageClasses")); - private final JCheckBox keepAttributesCheckBox = new JCheckBox(msg("keepAttributes")); - private final JCheckBox keepParameterNamesCheckBox = new JCheckBox(msg("keepParameterNames")); - private final JCheckBox newSourceFileAttributeCheckBox = new JCheckBox(msg("renameSourceFileAttribute")); - private final JCheckBox adaptClassStringsCheckBox = new JCheckBox(msg("adaptClassStrings")); - private final JCheckBox adaptResourceFileNamesCheckBox = new JCheckBox(msg("adaptResourceFileNames")); - private final JCheckBox adaptResourceFileContentsCheckBox = new JCheckBox(msg("adaptResourceFileContents")); - - private final JCheckBox preverifyCheckBox = new JCheckBox(msg("preverify")); - private final JCheckBox microEditionCheckBox = new JCheckBox(msg("microEdition")); - private final JCheckBox androidCheckBox = new JCheckBox(msg("android")); - private final JCheckBox targetCheckBox = new JCheckBox(msg("target")); - - private final JComboBox targetComboBox = new JComboBox(ListUtil.commaSeparatedList(msg("targets")).toArray()); - - private final JCheckBox verboseCheckBox = new JCheckBox(msg("verbose")); - private final JCheckBox noteCheckBox = new JCheckBox(msg("note")); - private final JCheckBox warnCheckBox = new JCheckBox(msg("warn")); - private final JCheckBox ignoreWarningsCheckBox = new JCheckBox(msg("ignoreWarnings")); - private final JCheckBox skipNonPublicLibraryClassesCheckBox = new JCheckBox(msg("skipNonPublicLibraryClasses")); - private final JCheckBox skipNonPublicLibraryClassMembersCheckBox = new JCheckBox(msg("skipNonPublicLibraryClassMembers")); - private final JCheckBox keepDirectoriesCheckBox = new JCheckBox(msg("keepDirectories")); - private final JCheckBox forceProcessingCheckBox = new JCheckBox(msg("forceProcessing")); - private final JCheckBox printSeedsCheckBox = new JCheckBox(msg("printSeeds")); - private final JCheckBox printConfigurationCheckBox = new JCheckBox(msg("printConfiguration")); - private final JCheckBox dumpCheckBox = new JCheckBox(msg("dump")); - - private final JTextField printUsageTextField = new JTextField(40); - private final JTextField optimizationsTextField = new JTextField(40); - private final JTextField printMappingTextField = new JTextField(40); - private final JTextField applyMappingTextField = new JTextField(40); - private final JTextField obfuscationDictionaryTextField = new JTextField(40); - private final JTextField classObfuscationDictionaryTextField = new JTextField(40); - private final JTextField packageObfuscationDictionaryTextField = new JTextField(40); - private final JTextField keepPackageNamesTextField = new JTextField(40); - private final JTextField flattenPackageHierarchyTextField = new JTextField(40); - private final JTextField repackageClassesTextField = new JTextField(40); - private final JTextField keepAttributesTextField = new JTextField(40); - private final JTextField newSourceFileAttributeTextField = new JTextField(40); - private final JTextField adaptClassStringsTextField = new JTextField(40); - private final JTextField adaptResourceFileNamesTextField = new JTextField(40); - private final JTextField adaptResourceFileContentsTextField = new JTextField(40); - private final JTextField noteTextField = new JTextField(40); - private final JTextField warnTextField = new JTextField(40); - private final JTextField keepDirectoriesTextField = new JTextField(40); - private final JTextField printSeedsTextField = new JTextField(40); - private final JTextField printConfigurationTextField = new JTextField(40); - private final JTextField dumpTextField = new JTextField(40); - - private final JTextArea consoleTextArea = new JTextArea(msg("processingInfo"), 3, 40); - - private final JCheckBox reTraceVerboseCheckBox = new JCheckBox(msg("verbose")); - private final JTextField reTraceMappingTextField = new JTextField(40); - private final JTextArea stackTraceTextArea = new JTextArea(3, 40); - private final JTextArea reTraceTextArea = new JTextArea(msg("reTraceInfo"), 3, 40); - - /** - * Creates a new ProGuardGUI. - */ - public ProGuardGUI() - { - setTitle("ProGuard"); - setDefaultCloseOperation(EXIT_ON_CLOSE); - - // Create some constraints that can be reused. - GridBagConstraints constraints = new GridBagConstraints(); - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(0, 4, 0, 4); - - GridBagConstraints constraintsStretch = new GridBagConstraints(); - constraintsStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsStretch.weightx = 1.0; - constraintsStretch.anchor = GridBagConstraints.WEST; - constraintsStretch.insets = constraints.insets; - - GridBagConstraints constraintsLast = new GridBagConstraints(); - constraintsLast.gridwidth = GridBagConstraints.REMAINDER; - constraintsLast.anchor = GridBagConstraints.WEST; - constraintsLast.insets = constraints.insets; - - GridBagConstraints constraintsLastStretch = new GridBagConstraints(); - constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; - constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsLastStretch.weightx = 1.0; - constraintsLastStretch.anchor = GridBagConstraints.WEST; - constraintsLastStretch.insets = constraints.insets; - - GridBagConstraints splashPanelConstraints = new GridBagConstraints(); - splashPanelConstraints.gridwidth = GridBagConstraints.REMAINDER; - splashPanelConstraints.fill = GridBagConstraints.BOTH; - splashPanelConstraints.weightx = 1.0; - splashPanelConstraints.weighty = 0.02; - splashPanelConstraints.anchor = GridBagConstraints.NORTHWEST; - //splashPanelConstraints.insets = constraints.insets; - - GridBagConstraints welcomePaneConstraints = new GridBagConstraints(); - welcomePaneConstraints.gridwidth = GridBagConstraints.REMAINDER; - welcomePaneConstraints.fill = GridBagConstraints.NONE; - welcomePaneConstraints.weightx = 1.0; - welcomePaneConstraints.weighty = 0.01; - welcomePaneConstraints.anchor = GridBagConstraints.CENTER;//NORTHWEST; - welcomePaneConstraints.insets = new Insets(20, 40, 20, 40); - - GridBagConstraints panelConstraints = new GridBagConstraints(); - panelConstraints.gridwidth = GridBagConstraints.REMAINDER; - panelConstraints.fill = GridBagConstraints.HORIZONTAL; - panelConstraints.weightx = 1.0; - panelConstraints.anchor = GridBagConstraints.NORTHWEST; - panelConstraints.insets = constraints.insets; - - GridBagConstraints stretchPanelConstraints = new GridBagConstraints(); - stretchPanelConstraints.gridwidth = GridBagConstraints.REMAINDER; - stretchPanelConstraints.fill = GridBagConstraints.BOTH; - stretchPanelConstraints.weightx = 1.0; - stretchPanelConstraints.weighty = 1.0; - stretchPanelConstraints.anchor = GridBagConstraints.NORTHWEST; - stretchPanelConstraints.insets = constraints.insets; - - GridBagConstraints glueConstraints = new GridBagConstraints(); - glueConstraints.fill = GridBagConstraints.BOTH; - glueConstraints.weightx = 0.01; - glueConstraints.weighty = 0.01; - glueConstraints.anchor = GridBagConstraints.NORTHWEST; - glueConstraints.insets = constraints.insets; - - GridBagConstraints bottomButtonConstraints = new GridBagConstraints(); - bottomButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - bottomButtonConstraints.insets = new Insets(2, 2, 4, 6); - bottomButtonConstraints.ipadx = 10; - bottomButtonConstraints.ipady = 2; - - GridBagConstraints lastBottomButtonConstraints = new GridBagConstraints(); - lastBottomButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; - lastBottomButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - lastBottomButtonConstraints.insets = bottomButtonConstraints.insets; - lastBottomButtonConstraints.ipadx = bottomButtonConstraints.ipadx; - lastBottomButtonConstraints.ipady = bottomButtonConstraints.ipady; - - // Leave room for a growBox on Mac OS X. - if (System.getProperty("os.name").toLowerCase().startsWith("mac os x")) - { - lastBottomButtonConstraints.insets = new Insets(2, 2, 4, 6 + 16); - } - - GridBagLayout layout = new GridBagLayout(); - - configurationChooser.addChoosableFileFilter( - new ExtensionFileFilter(msg("proExtension"), new String[] { ".pro" })); - - // Create the opening panel. - Sprite splash = - new CompositeSprite(new Sprite[] - { - new ColorSprite(new ConstantColor(Color.gray), - new FontSprite(new ConstantFont(new Font("sansserif", Font.BOLD, 90)), - new TextSprite(new ConstantString("ProGuard"), - new ConstantInt(160), - new LinearInt(-10, 120, new SmoothTiming(500, 1000))))), - - new ColorSprite(new ConstantColor(Color.white), - new FontSprite(new ConstantFont(new Font("sansserif", Font.BOLD, 45)), - new ShadowedSprite(new ConstantInt(3), - new ConstantInt(3), - new ConstantDouble(0.4), - new ConstantInt(1), - new CompositeSprite(new Sprite[] - { - new TextSprite(new ConstantString(msg("shrinking")), - new LinearInt(1000, 60, new SmoothTiming(1000, 2000)), - new ConstantInt(70)), - new TextSprite(new ConstantString(msg("optimization")), - new LinearInt(1000, 400, new SmoothTiming(1500, 2500)), - new ConstantInt(60)), - new TextSprite(new ConstantString(msg("obfuscation")), - new LinearInt(1000, 10, new SmoothTiming(2000, 3000)), - new ConstantInt(145)), - new TextSprite(new ConstantString(msg("preverification")), - new LinearInt(1000, 350, new SmoothTiming(2500, 3500)), - new ConstantInt(140)), - new FontSprite(new ConstantFont(new Font("sansserif", Font.BOLD, 30)), - new TextSprite(new TypeWriterString(msg("developed"), new LinearTiming(3500, 5500)), - new ConstantInt(250), - new ConstantInt(200))), - })))), - }); - splashPanel = new SplashPanel(splash, 0.5, 5500L); - splashPanel.setPreferredSize(new Dimension(0, 200)); - - JEditorPane welcomePane = new JEditorPane("text/html", msg("proGuardInfo")); - welcomePane.setPreferredSize(new Dimension(640, 350)); - // The constant HONOR_DISPLAY_PROPERTIES isn't present yet in JDK 1.4. - //welcomePane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); - welcomePane.putClientProperty("JEditorPane.honorDisplayProperties", Boolean.TRUE); - welcomePane.setOpaque(false); - welcomePane.setEditable(false); - welcomePane.setBorder(new EmptyBorder(20, 20, 20, 20)); - addBorder(welcomePane, "welcome"); - - JPanel proGuardPanel = new JPanel(layout); - proGuardPanel.add(splashPanel, splashPanelConstraints); - proGuardPanel.add(welcomePane, welcomePaneConstraints); - - // Create the input panel. - // TODO: properly clone the ClassPath objects. - // This is awkward to implement in the generic ListPanel.addElements(...) - // method, since the Object.clone() method is not public. - programPanel.addCopyToPanelButton("moveToLibraries", "moveToLibrariesTip", libraryPanel); - libraryPanel.addCopyToPanelButton("moveToProgram", "moveToProgramTip", programPanel); - - // Collect all buttons of these panels and make sure they are equally - // sized. - List panelButtons = new ArrayList(); - panelButtons.addAll(programPanel.getButtons()); - panelButtons.addAll(libraryPanel.getButtons()); - setCommonPreferredSize(panelButtons); - - addBorder(programPanel, "programJars" ); - addBorder(libraryPanel, "libraryJars" ); - - JPanel inputOutputPanel = new JPanel(layout); - inputOutputPanel.add(tip(programPanel, "programJarsTip"), stretchPanelConstraints); - inputOutputPanel.add(tip(libraryPanel, "libraryJarsTip"), stretchPanelConstraints); - - // Load the boiler plate options. - loadBoilerplateConfiguration(); - - // Create the boiler plate keep panels. - JCheckBox previousBox = null; - JTextField previousField = new JTextField(40); - - boilerplateKeepCheckBoxes = new JCheckBox[boilerplateKeep.length]; - boilerplateKeepTextFields = new JTextField[boilerplateKeep.length]; - - JButton printUsageBrowseButton = createBrowseButton(printUsageTextField, - msg("selectUsageFile")); - - JPanel shrinkingOptionsPanel = new JPanel(layout); - addBorder(shrinkingOptionsPanel, "options"); - - shrinkingOptionsPanel.add(tip(shrinkCheckBox, "shrinkTip"), constraintsLastStretch); - shrinkingOptionsPanel.add(tip(printUsageCheckBox, "printUsageTip"), constraints); - shrinkingOptionsPanel.add(tip(printUsageTextField, "outputFileTip"), constraintsStretch); - shrinkingOptionsPanel.add(tip(printUsageBrowseButton, "selectUsageFile"), constraintsLast); - - JPanel shrinkingPanel = new JPanel(layout); - shrinkingPanel.add(shrinkingOptionsPanel, panelConstraints); - addClassSpecifications(extractClassSpecifications(boilerplateKeep), - shrinkingPanel, - boilerplateKeepCheckBoxes, - boilerplateKeepTextFields, - previousBox, - previousField); - - addBorder(additionalKeepPanel, "keepAdditional"); - shrinkingPanel.add(tip(additionalKeepPanel, "keepAdditionalTip"), stretchPanelConstraints); - - JScrollPane shrinkingScroll = new JScrollPane(shrinkingPanel); - shrinkingScroll.setBorder(BorderFactory.createEmptyBorder()); - - JPanel totalShrinkingPanel = new JPanel(layout); - totalShrinkingPanel.add(shrinkingScroll, stretchPanelConstraints); - - // Create the boiler plate keep names panels. - boilerplateKeepNamesCheckBoxes = new JCheckBox[boilerplateKeepNames.length]; - boilerplateKeepNamesTextFields = new JTextField[boilerplateKeepNames.length]; - - JButton printMappingBrowseButton = createBrowseButton(printMappingTextField, - msg("selectPrintMappingFile")); - JButton applyMappingBrowseButton = createBrowseButton(applyMappingTextField, - msg("selectApplyMappingFile")); - JButton obfucationDictionaryBrowseButton = createBrowseButton(obfuscationDictionaryTextField, - msg("selectObfuscationDictionaryFile")); - JButton classObfucationDictionaryBrowseButton = createBrowseButton(classObfuscationDictionaryTextField, - msg("selectObfuscationDictionaryFile")); - JButton packageObfucationDictionaryBrowseButton = createBrowseButton(packageObfuscationDictionaryTextField, - msg("selectObfuscationDictionaryFile")); - - JPanel obfuscationOptionsPanel = new JPanel(layout); - addBorder(obfuscationOptionsPanel, "options"); - - obfuscationOptionsPanel.add(tip(obfuscateCheckBox, "obfuscateTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(printMappingCheckBox, "printMappingTip"), constraints); - obfuscationOptionsPanel.add(tip(printMappingTextField, "outputFileTip"), constraintsStretch); - obfuscationOptionsPanel.add(tip(printMappingBrowseButton, "selectPrintMappingFile"), constraintsLast); - obfuscationOptionsPanel.add(tip(applyMappingCheckBox, "applyMappingTip"), constraints); - obfuscationOptionsPanel.add(tip(applyMappingTextField, "inputFileTip"), constraintsStretch); - obfuscationOptionsPanel.add(tip(applyMappingBrowseButton, "selectApplyMappingFile"), constraintsLast); - obfuscationOptionsPanel.add(tip(obfuscationDictionaryCheckBox, "obfuscationDictionaryTip"), constraints); - obfuscationOptionsPanel.add(tip(obfuscationDictionaryTextField, "inputFileTip"), constraintsStretch); - obfuscationOptionsPanel.add(tip(obfucationDictionaryBrowseButton, "selectObfuscationDictionaryFile"), constraintsLast); - obfuscationOptionsPanel.add(tip(classObfuscationDictionaryCheckBox, "classObfuscationDictionaryTip"), constraints); - obfuscationOptionsPanel.add(tip(classObfuscationDictionaryTextField, "inputFileTip"), constraintsStretch); - obfuscationOptionsPanel.add(tip(classObfucationDictionaryBrowseButton, "selectObfuscationDictionaryFile"), constraintsLast); - obfuscationOptionsPanel.add(tip(packageObfuscationDictionaryCheckBox, "packageObfuscationDictionaryTip"), constraints); - obfuscationOptionsPanel.add(tip(packageObfuscationDictionaryTextField, "inputFileTip"), constraintsStretch); - obfuscationOptionsPanel.add(tip(packageObfucationDictionaryBrowseButton, "selectObfuscationDictionaryFile"), constraintsLast); - obfuscationOptionsPanel.add(tip(overloadAggressivelyCheckBox, "overloadAggressivelyTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(useUniqueClassMemberNamesCheckBox, "useUniqueClassMemberNamesTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(useMixedCaseClassNamesCheckBox, "useMixedCaseClassNamesTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(keepPackageNamesCheckBox, "keepPackageNamesTip"), constraints); - obfuscationOptionsPanel.add(tip(keepPackageNamesTextField, "packageNamesTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(flattenPackageHierarchyCheckBox, "flattenPackageHierarchyTip"), constraints); - obfuscationOptionsPanel.add(tip(flattenPackageHierarchyTextField, "packageTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(repackageClassesCheckBox, "repackageClassesTip"), constraints); - obfuscationOptionsPanel.add(tip(repackageClassesTextField, "packageTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(keepAttributesCheckBox, "keepAttributesTip"), constraints); - obfuscationOptionsPanel.add(tip(keepAttributesTextField, "attributesTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(keepParameterNamesCheckBox, "keepParameterNamesTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(newSourceFileAttributeCheckBox, "renameSourceFileAttributeTip"), constraints); - obfuscationOptionsPanel.add(tip(newSourceFileAttributeTextField, "sourceFileAttributeTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(adaptClassStringsCheckBox, "adaptClassStringsTip"), constraints); - obfuscationOptionsPanel.add(tip(adaptClassStringsTextField, "classNamesTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(adaptResourceFileNamesCheckBox, "adaptResourceFileNamesTip"), constraints); - obfuscationOptionsPanel.add(tip(adaptResourceFileNamesTextField, "fileNameFilterTip"), constraintsLastStretch); - obfuscationOptionsPanel.add(tip(adaptResourceFileContentsCheckBox, "adaptResourceFileContentsTip"), constraints); - obfuscationOptionsPanel.add(tip(adaptResourceFileContentsTextField, "fileNameFilterTip"), constraintsLastStretch); - - JPanel obfuscationPanel = new JPanel(layout); - obfuscationPanel.add(obfuscationOptionsPanel, panelConstraints); - addClassSpecifications(extractClassSpecifications(boilerplateKeepNames), - obfuscationPanel, - boilerplateKeepNamesCheckBoxes, - boilerplateKeepNamesTextFields, - previousBox, - previousField); - - addBorder(additionalKeepNamesPanel, "keepNamesAdditional"); - obfuscationPanel.add(tip(additionalKeepNamesPanel, "keepNamesAdditionalTip"), stretchPanelConstraints); - - JScrollPane obfuscationScroll = new JScrollPane(obfuscationPanel); - obfuscationScroll.setBorder(BorderFactory.createEmptyBorder()); - - JPanel totalObfuscationPanel = new JPanel(layout); - totalObfuscationPanel.add(obfuscationScroll, stretchPanelConstraints); - - // Create the boiler plate "no side effect methods" panels. - boilerplateNoSideEffectMethodCheckBoxes = new JCheckBox[boilerplateNoSideEffectMethods.length]; - - JPanel optimizationOptionsPanel = new JPanel(layout); - addBorder(optimizationOptionsPanel, "options"); - - JButton optimizationsButton = - createOptimizationsButton(optimizationsTextField); - - optimizationOptionsPanel.add(tip(optimizeCheckBox, "optimizeTip"), constraintsLastStretch); - optimizationOptionsPanel.add(tip(allowAccessModificationCheckBox, "allowAccessModificationTip"), constraintsLastStretch); - optimizationOptionsPanel.add(tip(mergeInterfacesAggressivelyCheckBox, "mergeInterfacesAggressivelyTip"), constraintsLastStretch); - optimizationOptionsPanel.add(tip(optimizationsLabel, "optimizationsTip"), constraints); - optimizationOptionsPanel.add(tip(optimizationsTextField, "optimizationsFilterTip"), constraintsStretch); - optimizationOptionsPanel.add(tip(optimizationsButton, "optimizationsSelectTip"), constraintsLast); - optimizationOptionsPanel.add(tip(optimizationPassesLabel, "optimizationPassesTip"), constraints); - optimizationOptionsPanel.add(tip(optimizationPassesSpinner, "optimizationPassesTip"), constraintsLast); - - JPanel optimizationPanel = new JPanel(layout); - optimizationPanel.add(optimizationOptionsPanel, panelConstraints); - addClassSpecifications(boilerplateNoSideEffectMethods, - optimizationPanel, - boilerplateNoSideEffectMethodCheckBoxes, - null, - previousBox, - previousField); - - addBorder(additionalNoSideEffectsPanel, "assumeNoSideEffectsAdditional"); - optimizationPanel.add(tip(additionalNoSideEffectsPanel, "assumeNoSideEffectsAdditionalTip"), stretchPanelConstraints); - - // Create the options panel. - JPanel preverificationOptionsPanel = new JPanel(layout); - addBorder(preverificationOptionsPanel, "preverificationAndTargeting"); - - preverificationOptionsPanel.add(tip(preverifyCheckBox, "preverifyTip"), constraintsLastStretch); - preverificationOptionsPanel.add(tip(microEditionCheckBox, "microEditionTip"), constraintsLastStretch); - preverificationOptionsPanel.add(tip(androidCheckBox, "androidTip"), constraintsLastStretch); - preverificationOptionsPanel.add(tip(targetCheckBox, "targetTip"), constraints); - preverificationOptionsPanel.add(tip(targetComboBox, "targetTip"), constraintsLast); - - JButton printSeedsBrowseButton = - createBrowseButton(printSeedsTextField, msg("selectSeedsFile")); - - JButton printConfigurationBrowseButton = - createBrowseButton(printConfigurationTextField, msg("selectConfigurationFile")); - - JButton dumpBrowseButton = - createBrowseButton(dumpTextField, msg("selectDumpFile")); - - // Select the most recent target by default. - targetComboBox.setSelectedIndex(targetComboBox.getItemCount() - 1); - - JPanel consistencyPanel = new JPanel(layout); - addBorder(consistencyPanel, "consistencyAndCorrectness"); - - consistencyPanel.add(tip(verboseCheckBox, "verboseTip"), constraintsLastStretch); - consistencyPanel.add(tip(noteCheckBox, "noteTip"), constraints); - consistencyPanel.add(tip(noteTextField, "noteFilterTip"), constraintsLastStretch); - consistencyPanel.add(tip(warnCheckBox, "warnTip"), constraints); - consistencyPanel.add(tip(warnTextField, "warnFilterTip"), constraintsLastStretch); - consistencyPanel.add(tip(ignoreWarningsCheckBox, "ignoreWarningsTip"), constraintsLastStretch); - consistencyPanel.add(tip(skipNonPublicLibraryClassesCheckBox, "skipNonPublicLibraryClassesTip"), constraintsLastStretch); - consistencyPanel.add(tip(skipNonPublicLibraryClassMembersCheckBox, "skipNonPublicLibraryClassMembersTip"), constraintsLastStretch); - consistencyPanel.add(tip(keepDirectoriesCheckBox, "keepDirectoriesTip"), constraints); - consistencyPanel.add(tip(keepDirectoriesTextField, "directoriesTip"), constraintsLastStretch); - consistencyPanel.add(tip(forceProcessingCheckBox, "forceProcessingTip"), constraintsLastStretch); - consistencyPanel.add(tip(printSeedsCheckBox, "printSeedsTip"), constraints); - consistencyPanel.add(tip(printSeedsTextField, "outputFileTip"), constraintsStretch); - consistencyPanel.add(tip(printSeedsBrowseButton, "selectSeedsFile"), constraintsLast); - consistencyPanel.add(tip(printConfigurationCheckBox, "printConfigurationTip"), constraints); - consistencyPanel.add(tip(printConfigurationTextField, "outputFileTip"), constraintsStretch); - consistencyPanel.add(tip(printConfigurationBrowseButton, "selectConfigurationFile"), constraintsLast); - consistencyPanel.add(tip(dumpCheckBox, "dumpTip"), constraints); - consistencyPanel.add(tip(dumpTextField, "outputFileTip"), constraintsStretch); - consistencyPanel.add(tip(dumpBrowseButton, "selectDumpFile"), constraintsLast); - - // Collect all components that are followed by text fields and make - // sure they are equally sized. That way the text fields start at the - // same horizontal position. - setCommonPreferredSize(Arrays.asList(new JComponent[] { - printMappingCheckBox, - applyMappingCheckBox, - flattenPackageHierarchyCheckBox, - repackageClassesCheckBox, - newSourceFileAttributeCheckBox, - })); - - JPanel optionsPanel = new JPanel(layout); - - optionsPanel.add(preverificationOptionsPanel, panelConstraints); - optionsPanel.add(consistencyPanel, panelConstraints); - - addBorder(whyAreYouKeepingPanel, "whyAreYouKeeping"); - optionsPanel.add(tip(whyAreYouKeepingPanel, "whyAreYouKeepingTip"), stretchPanelConstraints); - - // Create the process panel. - consoleTextArea.setOpaque(false); - consoleTextArea.setEditable(false); - consoleTextArea.setLineWrap(false); - consoleTextArea.setWrapStyleWord(false); - JScrollPane consoleScrollPane = new JScrollPane(consoleTextArea); - consoleScrollPane.setBorder(new EmptyBorder(1, 1, 1, 1)); - addBorder(consoleScrollPane, "processingConsole"); - - JPanel processPanel = new JPanel(layout); - processPanel.add(consoleScrollPane, stretchPanelConstraints); - - // Create the load, save, and process buttons. - JButton loadButton = new JButton(msg("loadConfiguration")); - loadButton.addActionListener(new MyLoadConfigurationActionListener()); - - JButton viewButton = new JButton(msg("viewConfiguration")); - viewButton.addActionListener(new MyViewConfigurationActionListener()); - - JButton saveButton = new JButton(msg("saveConfiguration")); - saveButton.addActionListener(new MySaveConfigurationActionListener()); - - JButton processButton = new JButton(msg("process")); - processButton.addActionListener(new MyProcessActionListener()); - - // Create the ReTrace panel. - JPanel reTraceSettingsPanel = new JPanel(layout); - addBorder(reTraceSettingsPanel, "reTraceSettings"); - - JButton reTraceMappingBrowseButton = createBrowseButton(reTraceMappingTextField, - msg("selectApplyMappingFile")); - - JLabel reTraceMappingLabel = new JLabel(msg("mappingFile")); - reTraceMappingLabel.setForeground(reTraceVerboseCheckBox.getForeground()); - - reTraceSettingsPanel.add(tip(reTraceVerboseCheckBox, "verboseTip"), constraintsLastStretch); - reTraceSettingsPanel.add(tip(reTraceMappingLabel, "mappingFileTip"), constraints); - reTraceSettingsPanel.add(tip(reTraceMappingTextField, "inputFileTip"), constraintsStretch); - reTraceSettingsPanel.add(tip(reTraceMappingBrowseButton, "selectApplyMappingFile"), constraintsLast); - - stackTraceTextArea.setOpaque(true); - stackTraceTextArea.setEditable(true); - stackTraceTextArea.setLineWrap(false); - stackTraceTextArea.setWrapStyleWord(true); - JScrollPane stackTraceScrollPane = new JScrollPane(stackTraceTextArea); - addBorder(stackTraceScrollPane, "obfuscatedStackTrace"); - - reTraceTextArea.setOpaque(false); - reTraceTextArea.setEditable(false); - reTraceTextArea.setLineWrap(true); - reTraceTextArea.setWrapStyleWord(true); - JScrollPane reTraceScrollPane = new JScrollPane(reTraceTextArea); - reTraceScrollPane.setBorder(new EmptyBorder(1, 1, 1, 1)); - addBorder(reTraceScrollPane, "deobfuscatedStackTrace"); - - JPanel reTracePanel = new JPanel(layout); - reTracePanel.add(reTraceSettingsPanel, panelConstraints); - reTracePanel.add(tip(stackTraceScrollPane, "obfuscatedStackTraceTip"), panelConstraints); - reTracePanel.add(reTraceScrollPane, stretchPanelConstraints); - - // Create the load button. - JButton loadStackTraceButton = new JButton(msg("loadStackTrace")); - loadStackTraceButton.addActionListener(new MyLoadStackTraceActionListener()); - - JButton reTraceButton = new JButton(msg("reTrace")); - reTraceButton.addActionListener(new MyReTraceActionListener()); - - // Create the main tabbed pane. - TabbedPane tabs = new TabbedPane(); - tabs.add(msg("proGuardTab"), proGuardPanel); - tabs.add(msg("inputOutputTab"), inputOutputPanel); - tabs.add(msg("shrinkingTab"), totalShrinkingPanel);//scroll); //shrinkingPanel); - tabs.add(msg("obfuscationTab"), totalObfuscationPanel);//obfuscationPanel); - tabs.add(msg("optimizationTab"), optimizationPanel); - tabs.add(msg("informationTab"), optionsPanel); - tabs.add(msg("processTab"), processPanel); - tabs.add(msg("reTraceTab"), reTracePanel); - tabs.addImage(Toolkit.getDefaultToolkit().getImage( - this.getClass().getResource(TITLE_IMAGE_FILE))); - - // Add the bottom buttons to each panel. - proGuardPanel .add(Box.createGlue(), glueConstraints); - proGuardPanel .add(tip(loadButton, "loadConfigurationTip"), bottomButtonConstraints); - proGuardPanel .add(createNextButton(tabs), lastBottomButtonConstraints); - - inputOutputPanel .add(Box.createGlue(), glueConstraints); - inputOutputPanel .add(createPreviousButton(tabs), bottomButtonConstraints); - inputOutputPanel .add(createNextButton(tabs), lastBottomButtonConstraints); - - totalShrinkingPanel .add(Box.createGlue(), glueConstraints); - totalShrinkingPanel .add(createPreviousButton(tabs), bottomButtonConstraints); - totalShrinkingPanel .add(createNextButton(tabs), lastBottomButtonConstraints); - - totalObfuscationPanel.add(Box.createGlue(), glueConstraints); - totalObfuscationPanel.add(createPreviousButton(tabs), bottomButtonConstraints); - totalObfuscationPanel.add(createNextButton(tabs), lastBottomButtonConstraints); - - optimizationPanel .add(Box.createGlue(), glueConstraints); - optimizationPanel .add(createPreviousButton(tabs), bottomButtonConstraints); - optimizationPanel .add(createNextButton(tabs), lastBottomButtonConstraints); - - optionsPanel .add(Box.createGlue(), glueConstraints); - optionsPanel .add(createPreviousButton(tabs), bottomButtonConstraints); - optionsPanel .add(createNextButton(tabs), lastBottomButtonConstraints); - - processPanel .add(Box.createGlue(), glueConstraints); - processPanel .add(createPreviousButton(tabs), bottomButtonConstraints); - processPanel .add(tip(viewButton, "viewConfigurationTip"), bottomButtonConstraints); - processPanel .add(tip(saveButton, "saveConfigurationTip"), bottomButtonConstraints); - processPanel .add(tip(processButton, "processTip"), lastBottomButtonConstraints); - - reTracePanel .add(Box.createGlue(), glueConstraints); - reTracePanel .add(tip(loadStackTraceButton, "loadStackTraceTip"), bottomButtonConstraints); - reTracePanel .add(tip(reTraceButton, "reTraceTip"), lastBottomButtonConstraints); - - // Add the main tabs to the frame. - getContentPane().add(tabs); - - // Pack the entire GUI before setting some default values. - pack(); - - // Initialize the GUI settings to reasonable defaults. - loadConfiguration(this.getClass().getResource(DEFAULT_CONFIGURATION)); - } - - public void startSplash() - { - splashPanel.start(); - } - - - public void skipSplash() - { - splashPanel.stop(); - } - - - /** - * Loads the boilerplate keep class options from the boilerplate file - * into the boilerplate array. - */ - private void loadBoilerplateConfiguration() - { - try - { - // Parse the boilerplate configuration file. - ConfigurationParser parser = new ConfigurationParser( - this.getClass().getResource(BOILERPLATE_CONFIGURATION), - System.getProperties()); - - Configuration configuration = new Configuration(); - - try - { - parser.parse(configuration); - - // We're interested in the keep options. - boilerplateKeep = - extractKeepSpecifications(configuration.keep, false, false); - - // We're interested in the keep options. - boilerplateKeepNames = - extractKeepSpecifications(configuration.keep, true, false); - - // We're interested in the side effects options. - boilerplateNoSideEffectMethods = new ClassSpecification[configuration.assumeNoSideEffects.size()]; - configuration.assumeNoSideEffects.toArray(boilerplateNoSideEffectMethods); - } - finally - { - parser.close(); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - - /** - * Returns an array containing the ClassSpecifications instances with - * matching flags. - */ - private KeepClassSpecification[] extractKeepSpecifications(List keepSpecifications, - boolean allowShrinking, - boolean allowObfuscation) - { - List matches = new ArrayList(); - - boolean matched = false; - - for (int index = 0; index < keepSpecifications.size(); index++) - { - KeepClassSpecification keepClassSpecification = (KeepClassSpecification)keepSpecifications.get(index); - - if (keepClassSpecification.comments == null && matched) - { - matches.add(keepClassSpecification); - } - else if (keepClassSpecification.comments != null) - { - - if ((keepClassSpecification.allowShrinking == allowShrinking && - keepClassSpecification.allowObfuscation == allowObfuscation)) - { - matches.add(keepClassSpecification); - matched = true; - } - else - { - matched = false; - } - } - } - - KeepClassSpecification[] matchingKeepClassSpecifications = new KeepClassSpecification[matches.size()]; - matches.toArray(matchingKeepClassSpecifications); - - return matchingKeepClassSpecifications; - } - - /** - * Returns an array containing the ClassSpecification instances of the - * given array of KeepClassSpecification instances. - */ - private ClassSpecification[] extractClassSpecifications(KeepClassSpecification[] keepClassSpecifications) - { - ClassSpecification[] classSpecifications = new ClassSpecification[keepClassSpecifications.length]; - - for (int index = 0; index < classSpecifications.length; index++) - { - classSpecifications[index] = keepClassSpecifications[index]; - } - - return classSpecifications; - } - - - /** - * Creates a panel with the given boiler plate class specifications. - */ - private void addClassSpecifications(ClassSpecification[] boilerplateClassSpecifications, - JPanel classSpecificationsPanel, - JCheckBox[] boilerplateCheckBoxes, - JTextField[] boilerplateTextFields, - JCheckBox previousBox, - JTextField previousField) - { - // Create some constraints that can be reused. - GridBagConstraints constraints = new GridBagConstraints(); - constraints.anchor = GridBagConstraints.WEST; - constraints.insets = new Insets(0, 4, 0, 4); - - GridBagConstraints constraintsLastStretch = new GridBagConstraints(); - constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; - constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; - constraintsLastStretch.weightx = 1.0; - constraintsLastStretch.anchor = GridBagConstraints.WEST; - constraintsLastStretch.insets = constraints.insets; - - GridBagConstraints panelConstraints = new GridBagConstraints(); - panelConstraints.gridwidth = GridBagConstraints.REMAINDER; - panelConstraints.fill = GridBagConstraints.HORIZONTAL; - panelConstraints.weightx = 1.0; - panelConstraints.anchor = GridBagConstraints.NORTHWEST; - panelConstraints.insets = constraints.insets; - - GridBagLayout layout = new GridBagLayout(); - - - String lastPanelName = null; - JPanel keepSubpanel = null; - boolean commentHasTextField = false; - for (int index = 0; index < boilerplateClassSpecifications.length; index++) - { - - // The panel structure is derived from the comments. - String comments = boilerplateClassSpecifications[index].comments; - String className = boilerplateClassSpecifications[index].className; - - if (comments != null) - { - // Add an empty space if no text field is needed - if (!commentHasTextField && index != 0) - { - JLabel l = new JLabel(""); - keepSubpanel.add(tip(l, "classNamesTip"), constraintsLastStretch); - } - - int dashIndex = comments.indexOf('-'); - int periodIndex = comments.indexOf('.', dashIndex); - commentHasTextField = false; - - final String panelName = comments.substring(0, dashIndex).trim(); - String optionName = comments.substring(dashIndex + 1, periodIndex).replace('_', '.').trim(); - String toolTip = comments.substring(periodIndex + 1); - - if (keepSubpanel == null || !panelName.equals(lastPanelName)) - { - // Create a new foldable keep subpanel and add it. - final JPanel tempKeepSubpanel = new JPanel(layout); - tempKeepSubpanel.setBorder(BorderFactory.createTitledBorder(panelName)); - - final JPanel foldedKeepSubpanel = new JPanel(layout); - foldedKeepSubpanel.setBorder(BorderFactory.createTitledBorder(panelName + "...")); - - foldedKeepSubpanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - foldedKeepSubpanel.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent mouseEvent) { - foldedKeepSubpanel.setVisible(false); - tempKeepSubpanel.setVisible(true); - } - }); - - tempKeepSubpanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - tempKeepSubpanel.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent mouseEvent) { - foldedKeepSubpanel.setVisible(true); - tempKeepSubpanel.setVisible(false); - } - }); - - if (!panelName.equals("Keep") && - !panelName.equals("Android") && - !panelName.contains("Remove")) - { - tempKeepSubpanel.setVisible(false); - foldedKeepSubpanel.setVisible(true); - } - else - { - tempKeepSubpanel.setVisible(true); - foldedKeepSubpanel.setVisible(false); - } - - keepSubpanel = tempKeepSubpanel; - - classSpecificationsPanel.add(foldedKeepSubpanel, panelConstraints); - classSpecificationsPanel.add(keepSubpanel, panelConstraints); - - lastPanelName = panelName; - } - - // Add a check box to each option with comments - JCheckBox boilerplateCheckBox = new JCheckBox(optionName); - boilerplateCheckBox.setToolTipText(toolTip); - boilerplateCheckBoxes[index] = boilerplateCheckBox; - previousBox = boilerplateCheckBox; - keepSubpanel.add(boilerplateCheckBox, - boilerplateTextFields != null ? - constraints : - constraintsLastStretch); - - // Add a text field if necessary to each option with comments - if (boilerplateTextFields != null) - { - if (className == null || needsTextField(className)) - { - boilerplateTextFields[index] = new JTextField(40); - previousField = boilerplateTextFields[index]; - keepSubpanel.add(tip(boilerplateTextFields[index], "classNamesTip"), constraintsLastStretch); - commentHasTextField = true; - } - else - { - boilerplateTextFields[index] = new JTextField(40); - boilerplateTextFields[index].setText(className); - if (!commentHasTextField && index == boilerplateClassSpecifications.length-1) - { - - JLabel l = new JLabel(""); - - keepSubpanel.add(tip(l, "classNamesTip"), constraintsLastStretch); - } - } - } - - } - - else { - // Match check boxes and text fields with those that belong to the respective comments - boilerplateCheckBoxes[index] = previousBox; - - if (boilerplateTextFields != null) - { - if (className == null || needsTextField(className)) - { - if (!commentHasTextField) - { - boilerplateTextFields[index] = new JTextField(40); - previousField = boilerplateTextFields[index]; - keepSubpanel.add(tip(boilerplateTextFields[index], "classNamesTip"), constraintsLastStretch); - commentHasTextField = true; - } - else - { - boilerplateTextFields[index] = previousField; - } - } - else - { - boilerplateTextFields[index] = new JTextField(40); - boilerplateTextFields[index].setText(className); - } - } - } - } - } - - private boolean needsTextField(String string) { - - if (!string.contains("*")) { - return false; - } - - if (string.contains("*") && !string.contains("**")) { - return true; - } - - int indexSingleAsterisk = string.lastIndexOf("*"); - int indexDoubleAsterisk = string.indexOf("**"); - - if (indexDoubleAsterisk+1 != indexSingleAsterisk) { - return true; - } - - return false; - } - - /** - * Adds a standard border with the title that corresponds to the given key - * in the GUI resources. - */ - private void addBorder(JComponent component, String titleKey) - { - Border oldBorder = component.getBorder(); - Border newBorder = BorderFactory.createTitledBorder(BORDER, msg(titleKey)); - - component.setBorder(oldBorder == null ? - newBorder : - new CompoundBorder(newBorder, oldBorder)); - } - - - /** - * Creates a Previous button for the given tabbed pane. - */ - private JButton createPreviousButton(final TabbedPane tabbedPane) - { - JButton browseButton = new JButton(msg("previous")); - browseButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - tabbedPane.previous(); - } - }); - - return browseButton; - } - - - /** - * Creates a Next button for the given tabbed pane. - */ - private JButton createNextButton(final TabbedPane tabbedPane) - { - JButton browseButton = new JButton(msg("next")); - browseButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - tabbedPane.next(); - } - }); - - return browseButton; - } - - - /** - * Creates a browse button that opens a file browser for the given text field. - */ - private JButton createBrowseButton(final JTextField textField, - final String title) - { - JButton browseButton = new JButton(msg("browse")); - browseButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - // Update the file chooser. - fileChooser.setDialogTitle(title); - fileChooser.setSelectedFile(new File(textField.getText())); - - int returnVal = fileChooser.showDialog(ProGuardGUI.this, msg("ok")); - if (returnVal == JFileChooser.APPROVE_OPTION) - { - // Update the text field. - textField.setText(fileChooser.getSelectedFile().getPath()); - } - } - }); - - return browseButton; - } - - - protected JButton createOptimizationsButton(final JTextField textField) - { - final OptimizationsDialog optimizationsDialog = new OptimizationsDialog(ProGuardGUI.this); - - JButton optimizationsButton = new JButton(msg("select")); - optimizationsButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - // Update the dialog. - optimizationsDialog.setFilter(textField.getText()); - - int returnValue = optimizationsDialog.showDialog(); - if (returnValue == OptimizationsDialog.APPROVE_OPTION) - { - // Update the text field. - textField.setText(optimizationsDialog.getFilter()); - } - } - }); - - return optimizationsButton; - } - - - /** - * Sets the preferred sizes of the given components to the maximum of their - * current preferred sizes. - */ - private void setCommonPreferredSize(List components) - { - // Find the maximum preferred size. - Dimension maximumSize = null; - for (int index = 0; index < components.size(); index++) - { - JComponent component = (JComponent)components.get(index); - Dimension size = component.getPreferredSize(); - if (maximumSize == null || - size.getWidth() > maximumSize.getWidth()) - { - maximumSize = size; - } - } - - // Set the size that we found as the preferred size for all components. - for (int index = 0; index < components.size(); index++) - { - JComponent component = (JComponent)components.get(index); - component.setPreferredSize(maximumSize); - } - } - - - /** - * Updates to GUI settings to reflect the given ProGuard configuration. - */ - private void setProGuardConfiguration(Configuration configuration) - { - // Set up the input and output jars and directories. - programPanel.setClassPath(configuration.programJars); - libraryPanel.setClassPath(configuration.libraryJars); - - // Set up the boilerplate keep options. - for (int index = 0; index < boilerplateKeep.length; index++) - { - - String classNames = - findMatchingKeepSpecifications(boilerplateKeep[index], - configuration.keep); - - boilerplateKeepCheckBoxes[index].setSelected(classNames != null); - - if (boilerplateKeepTextFields != null) { - boilerplateKeepTextFields[index].setText(classNames == null ? "*" : classNames); - } - } - - - // Set up the boilerplate keep names options. - for (int index = 0; index < boilerplateKeepNames.length; index++) - { - String classNames = - findMatchingKeepSpecifications(boilerplateKeepNames[index], - configuration.keep); - - boilerplateKeepNamesCheckBoxes[index].setSelected(classNames != null); - if (boilerplateKeepNamesTextFields != null) { - boilerplateKeepNamesTextFields[index].setText(classNames == null ? "*" : classNames); - } - } - - // Set up the additional keep options. Note that the matched boilerplate - // options have been removed from the list. - additionalKeepPanel.setClassSpecifications(filteredKeepSpecifications(configuration.keep, - false)); - - // Set up the additional keep options. Note that the matched boilerplate - // options have been removed from the list. - additionalKeepNamesPanel.setClassSpecifications(filteredKeepSpecifications(configuration.keep, - true)); - - - // Set up the boilerplate "no side effect methods" options. - for (int index = 0; index < boilerplateNoSideEffectMethods.length; index++) - { - boolean found = - findClassSpecification(boilerplateNoSideEffectMethods[index], - configuration.assumeNoSideEffects); - - boilerplateNoSideEffectMethodCheckBoxes[index].setSelected(found); - } - - // Set up the additional keep options. Note that the matched boilerplate - // options have been removed from the list. - additionalNoSideEffectsPanel.setClassSpecifications(configuration.assumeNoSideEffects); - - // Set up the "why are you keeping" options. - whyAreYouKeepingPanel.setClassSpecifications(configuration.whyAreYouKeeping); - - // Set up the other options. - shrinkCheckBox .setSelected(configuration.shrink); - printUsageCheckBox .setSelected(configuration.printUsage != null); - - optimizeCheckBox .setSelected(configuration.optimize); - allowAccessModificationCheckBox .setSelected(configuration.allowAccessModification); - mergeInterfacesAggressivelyCheckBox .setSelected(configuration.mergeInterfacesAggressively); - optimizationPassesSpinner.getModel() .setValue(new Integer(configuration.optimizationPasses)); - - obfuscateCheckBox .setSelected(configuration.obfuscate); - printMappingCheckBox .setSelected(configuration.printMapping != null); - applyMappingCheckBox .setSelected(configuration.applyMapping != null); - obfuscationDictionaryCheckBox .setSelected(configuration.obfuscationDictionary != null); - classObfuscationDictionaryCheckBox .setSelected(configuration.classObfuscationDictionary != null); - packageObfuscationDictionaryCheckBox .setSelected(configuration.packageObfuscationDictionary != null); - overloadAggressivelyCheckBox .setSelected(configuration.overloadAggressively); - useUniqueClassMemberNamesCheckBox .setSelected(configuration.useUniqueClassMemberNames); - useMixedCaseClassNamesCheckBox .setSelected(configuration.useMixedCaseClassNames); - keepPackageNamesCheckBox .setSelected(configuration.keepPackageNames != null); - flattenPackageHierarchyCheckBox .setSelected(configuration.flattenPackageHierarchy != null); - repackageClassesCheckBox .setSelected(configuration.repackageClasses != null); - keepAttributesCheckBox .setSelected(configuration.keepAttributes != null); - keepParameterNamesCheckBox .setSelected(configuration.keepParameterNames); - newSourceFileAttributeCheckBox .setSelected(configuration.newSourceFileAttribute != null); - adaptClassStringsCheckBox .setSelected(configuration.adaptClassStrings != null); - adaptResourceFileNamesCheckBox .setSelected(configuration.adaptResourceFileNames != null); - adaptResourceFileContentsCheckBox .setSelected(configuration.adaptResourceFileContents != null); - - preverifyCheckBox .setSelected(configuration.preverify); - microEditionCheckBox .setSelected(configuration.microEdition); - androidCheckBox .setSelected(configuration.android); - targetCheckBox .setSelected(configuration.targetClassVersion != 0); - - verboseCheckBox .setSelected(configuration.verbose); - noteCheckBox .setSelected(configuration.note == null || !configuration.note.isEmpty()); - warnCheckBox .setSelected(configuration.warn == null || !configuration.warn.isEmpty()); - ignoreWarningsCheckBox .setSelected(configuration.ignoreWarnings); - skipNonPublicLibraryClassesCheckBox .setSelected(configuration.skipNonPublicLibraryClasses); - skipNonPublicLibraryClassMembersCheckBox.setSelected(configuration.skipNonPublicLibraryClassMembers); - keepDirectoriesCheckBox .setSelected(configuration.keepDirectories != null); - forceProcessingCheckBox .setSelected(configuration.lastModified == Long.MAX_VALUE); - printSeedsCheckBox .setSelected(configuration.printSeeds != null); - printConfigurationCheckBox .setSelected(configuration.printConfiguration != null); - dumpCheckBox .setSelected(configuration.dump != null); - - printUsageTextField .setText(fileName(configuration.printUsage)); - optimizationsTextField .setText(configuration.optimizations == null ? OPTIMIZATIONS_DEFAULT : ListUtil.commaSeparatedString(configuration.optimizations, true)); - printMappingTextField .setText(fileName(configuration.printMapping)); - applyMappingTextField .setText(fileName(configuration.applyMapping)); - obfuscationDictionaryTextField .setText(fileName(configuration.obfuscationDictionary)); - classObfuscationDictionaryTextField .setText(fileName(configuration.classObfuscationDictionary)); - packageObfuscationDictionaryTextField .setText(fileName(configuration.packageObfuscationDictionary)); - keepPackageNamesTextField .setText(configuration.keepPackageNames == null ? "" : ClassUtil.externalClassName(ListUtil.commaSeparatedString(configuration.keepPackageNames, true))); - flattenPackageHierarchyTextField .setText(configuration.flattenPackageHierarchy); - repackageClassesTextField .setText(configuration.repackageClasses); - keepAttributesTextField .setText(configuration.keepAttributes == null ? KEEP_ATTRIBUTE_DEFAULT : ListUtil.commaSeparatedString(configuration.keepAttributes, true)); - newSourceFileAttributeTextField .setText(configuration.newSourceFileAttribute == null ? SOURCE_FILE_ATTRIBUTE_DEFAULT : configuration.newSourceFileAttribute); - adaptClassStringsTextField .setText(configuration.adaptClassStrings == null ? "" : ClassUtil.externalClassName(ListUtil.commaSeparatedString(configuration.adaptClassStrings, true))); - adaptResourceFileNamesTextField .setText(configuration.adaptResourceFileNames == null ? ADAPT_RESOURCE_FILE_NAMES_DEFAULT : ListUtil.commaSeparatedString(configuration.adaptResourceFileNames, true)); - adaptResourceFileContentsTextField .setText(configuration.adaptResourceFileContents == null ? ADAPT_RESOURCE_FILE_CONTENTS_DEFAULT : ListUtil.commaSeparatedString(configuration.adaptResourceFileContents, true)); - noteTextField .setText(ListUtil.commaSeparatedString(configuration.note, true)); - warnTextField .setText(ListUtil.commaSeparatedString(configuration.warn, true)); - keepDirectoriesTextField .setText(ListUtil.commaSeparatedString(configuration.keepDirectories, true)); - printSeedsTextField .setText(fileName(configuration.printSeeds)); - printConfigurationTextField .setText(fileName(configuration.printConfiguration)); - dumpTextField .setText(fileName(configuration.dump)); - - if (configuration.targetClassVersion != 0) - { - targetComboBox.setSelectedItem(ClassUtil.externalClassVersion(configuration.targetClassVersion)); - } - else - { - targetComboBox.setSelectedIndex(targetComboBox.getItemCount() - 1); - } - - if (configuration.printMapping != null) - { - reTraceMappingTextField.setText(fileName(configuration.printMapping)); - } - } - - /** - * Returns the given string in which the asterisks are replaced by the given string 'text'. - */ - private String replaceAsteriskByText(String string, String text) { - - int indexOfSingleAsterisk = string.lastIndexOf("*"); - int indexOfDoubleAsterisk = string.indexOf("**"); - if (indexOfSingleAsterisk != indexOfDoubleAsterisk+1 && indexOfSingleAsterisk != -1) { - string = string.substring(0,indexOfSingleAsterisk) - + text - + string.substring(indexOfSingleAsterisk+1,string.length()); - } - - return string; - } - - - /** - * Returns the ProGuard configuration that reflects the current GUI settings. - */ - private Configuration getProGuardConfiguration() - { - Configuration configuration = new Configuration(); - - // Get the input and output jars and directories. - configuration.programJars = programPanel.getClassPath(); - configuration.libraryJars = libraryPanel.getClassPath(); - - List keep = new ArrayList(); - - // Collect the additional keep options. - List additionalKeep = additionalKeepPanel.getClassSpecifications(); - if (additionalKeep != null) - { - keep.addAll(additionalKeep); - } - - // Collect the additional keep names options. - List additionalKeepNames = additionalKeepNamesPanel.getClassSpecifications(); - if (additionalKeepNames != null) - { - keep.addAll(additionalKeepNames); - } - - // Collect the boilerplate keep options. - for (int index = 0; index < boilerplateKeep.length; index++) - { - if (boilerplateKeepCheckBoxes[index].isSelected()) - { - String className = boilerplateKeep[index].className; - String text = boilerplateKeepTextFields[index].getText(); - - if (className != null) - { - boolean containsAsterisk = className.contains("*"); - - if(!containsAsterisk) - { - keep.add(classSpecification(boilerplateKeep[index], className)); - } - else - { - className = replaceAsteriskByText(className,text); - keep.add(classSpecification(boilerplateKeep[index], className)); - } - - } - else - { - keep.add(classSpecification(boilerplateKeep[index],text)); - } -// keep.add(classSpecification(boilerplateKeep[index], -// boilerplateKeepTextFields[index].getText())); - - } - } - - // Collect the boilerplate keep names options. - for (int index = 0; index < boilerplateKeepNames.length; index++) - { - if (boilerplateKeepNamesCheckBoxes[index].isSelected()) - { - if (boilerplateKeep[index].className != null) - { - keep.add(classSpecification(boilerplateKeepNames[index], boilerplateKeepNames[index].className)); - } - else - { - keep.add(classSpecification(boilerplateKeepNames[index], - boilerplateKeepNamesTextFields[index].getText())); - } -// keep.add(classSpecification(boilerplateKeepNames[index], -// boilerplateKeepNamesTextFields[index].getText())); - } - } - - // Put the list of keep specifications in the configuration. - if (keep.size() > 0) - { - configuration.keep = keep; - } - - - // Collect the boilerplate "no side effect methods" options. - List noSideEffectMethods = new ArrayList(); - - for (int index = 0; index < boilerplateNoSideEffectMethods.length; index++) - { - if (boilerplateNoSideEffectMethodCheckBoxes[index].isSelected()) - { - noSideEffectMethods.add(boilerplateNoSideEffectMethods[index]); - } - } - - // Collect the additional "no side effect methods" options. - List additionalNoSideEffectOptions = additionalNoSideEffectsPanel.getClassSpecifications(); - if (additionalNoSideEffectOptions != null) - { - noSideEffectMethods.addAll(additionalNoSideEffectOptions); - } - - // Put the list of "no side effect methods" options in the configuration. - if (noSideEffectMethods.size() > 0) - { - configuration.assumeNoSideEffects = noSideEffectMethods; - } - - - // Collect the "why are you keeping" options. - configuration.whyAreYouKeeping = whyAreYouKeepingPanel.getClassSpecifications(); - - - // Get the other options. - configuration.shrink = shrinkCheckBox .isSelected(); - configuration.printUsage = printUsageCheckBox .isSelected() ? new File(printUsageTextField .getText()) : null; - - configuration.optimize = optimizeCheckBox .isSelected(); - configuration.allowAccessModification = allowAccessModificationCheckBox .isSelected(); - configuration.mergeInterfacesAggressively = mergeInterfacesAggressivelyCheckBox .isSelected(); - configuration.optimizations = optimizationsTextField.getText().length() > 1 ? ListUtil.commaSeparatedList(optimizationsTextField .getText()) : null; - configuration.optimizationPasses = ((SpinnerNumberModel)optimizationPassesSpinner.getModel()).getNumber().intValue(); - - configuration.obfuscate = obfuscateCheckBox .isSelected(); - configuration.printMapping = printMappingCheckBox .isSelected() ? new File(printMappingTextField .getText()) : null; - configuration.applyMapping = applyMappingCheckBox .isSelected() ? new File(applyMappingTextField .getText()) : null; - configuration.obfuscationDictionary = obfuscationDictionaryCheckBox .isSelected() ? url(obfuscationDictionaryTextField.getText()) : null; - configuration.classObfuscationDictionary = classObfuscationDictionaryCheckBox .isSelected() ? url(classObfuscationDictionaryTextField.getText()) : null; - configuration.packageObfuscationDictionary = packageObfuscationDictionaryCheckBox .isSelected() ? url(packageObfuscationDictionaryTextField.getText()) : null; - configuration.overloadAggressively = overloadAggressivelyCheckBox .isSelected(); - configuration.useUniqueClassMemberNames = useUniqueClassMemberNamesCheckBox .isSelected(); - configuration.useMixedCaseClassNames = useMixedCaseClassNamesCheckBox .isSelected(); - configuration.keepPackageNames = keepPackageNamesCheckBox .isSelected() ? keepPackageNamesTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(keepPackageNamesTextField.getText())) : new ArrayList() : null; - configuration.flattenPackageHierarchy = flattenPackageHierarchyCheckBox .isSelected() ? ClassUtil.internalClassName(flattenPackageHierarchyTextField .getText()) : null; - configuration.repackageClasses = repackageClassesCheckBox .isSelected() ? ClassUtil.internalClassName(repackageClassesTextField .getText()) : null; - configuration.keepAttributes = keepAttributesCheckBox .isSelected() ? ListUtil.commaSeparatedList(keepAttributesTextField .getText()) : null; - configuration.keepParameterNames = keepParameterNamesCheckBox .isSelected(); - configuration.newSourceFileAttribute = newSourceFileAttributeCheckBox .isSelected() ? newSourceFileAttributeTextField .getText() : null; - configuration.adaptClassStrings = adaptClassStringsCheckBox .isSelected() ? adaptClassStringsTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(adaptClassStringsTextField.getText())) : new ArrayList() : null; - configuration.adaptResourceFileNames = adaptResourceFileNamesCheckBox .isSelected() ? ListUtil.commaSeparatedList(adaptResourceFileNamesTextField .getText()) : null; - configuration.adaptResourceFileContents = adaptResourceFileContentsCheckBox .isSelected() ? ListUtil.commaSeparatedList(adaptResourceFileContentsTextField .getText()) : null; - - configuration.preverify = preverifyCheckBox .isSelected(); - configuration.microEdition = microEditionCheckBox .isSelected(); - configuration.targetClassVersion = targetCheckBox .isSelected() ? ClassUtil.internalClassVersion(targetComboBox.getSelectedItem().toString()) : 0; - - configuration.verbose = verboseCheckBox .isSelected(); - configuration.note = noteCheckBox .isSelected() ? noteTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(noteTextField.getText())) : null : new ArrayList(); - configuration.warn = warnCheckBox .isSelected() ? warnTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(warnTextField.getText())) : null : new ArrayList(); - configuration.ignoreWarnings = ignoreWarningsCheckBox .isSelected(); - configuration.skipNonPublicLibraryClasses = skipNonPublicLibraryClassesCheckBox .isSelected(); - configuration.skipNonPublicLibraryClassMembers = skipNonPublicLibraryClassMembersCheckBox.isSelected(); - configuration.keepDirectories = keepDirectoriesCheckBox .isSelected() ? keepDirectoriesTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(keepDirectoriesTextField.getText())) : new ArrayList() : null; - configuration.lastModified = forceProcessingCheckBox .isSelected() ? Long.MAX_VALUE : System.currentTimeMillis(); - configuration.printSeeds = printSeedsCheckBox .isSelected() ? new File(printSeedsTextField .getText()) : null; - configuration.printConfiguration = printConfigurationCheckBox .isSelected() ? new File(printConfigurationTextField .getText()) : null; - configuration.dump = dumpCheckBox .isSelected() ? new File(dumpTextField .getText()) : null; - - return configuration; - } - - - /** - * Looks in the given list for a class specification that is identical to - * the given template. Returns true if it is found, and removes the matching - * class specification as a side effect. - */ - private boolean findClassSpecification(ClassSpecification classSpecificationTemplate, - List classSpecifications) - { - if (classSpecifications == null) - { - return false; - } - - for (int index = 0; index < classSpecifications.size(); index++) - { - if (classSpecificationTemplate.equals(classSpecifications.get(index))) - { - // Remove the matching option as a side effect. - classSpecifications.remove(index); - - return true; - } - } - - return false; - } - - - /** - * Returns the subset of the given list of keep specifications, with - * matching shrinking flag. - */ - private List filteredKeepSpecifications(List keepSpecifications, - boolean allowShrinking) - { - List filteredKeepSpecifications = new ArrayList(); - - for (int index = 0; index < keepSpecifications.size(); index++) - { - KeepClassSpecification keepClassSpecification = - (KeepClassSpecification)keepSpecifications.get(index); - - if (keepClassSpecification.allowShrinking == allowShrinking) - { - filteredKeepSpecifications.add(keepClassSpecification); - } - } - - return filteredKeepSpecifications; - } - - - /** - * Looks in the given list for keep specifications that match the given - * template. Returns a comma-separated string of class names from - * matching keep specifications, and removes the matching keep - * specifications as a side effect. - */ - private String findMatchingKeepSpecifications(KeepClassSpecification keepClassSpecificationTemplate, - List keepSpecifications) - { - if (keepSpecifications == null) - { - return null; - } - - StringBuffer buffer = null; - - for (int index = 0; index < keepSpecifications.size(); index++) - { - KeepClassSpecification listedKeepClassSpecification = - (KeepClassSpecification)keepSpecifications.get(index); - String className = listedKeepClassSpecification.className; - - if (keepClassSpecificationTemplate.equals(listedKeepClassSpecification)) - { - if (buffer == null) - { - buffer = new StringBuffer(); - } - else - { - buffer.append(','); - } - - if (className != null) { - System.out.println("ClassUtil.externalClassName(className) = " + ClassUtil.externalClassName(className)); - } - - buffer.append(className == null ? "*" : ClassUtil.externalClassName(className)); - - // Remove the matching option as a side effect. - keepSpecifications.remove(index--); - } - } - - return buffer == null ? null : buffer.toString(); - } - - /** - * Returns a class specification or keep specification, based on the given - * template and the class name to be filled in. - */ - private ClassSpecification classSpecification(ClassSpecification classSpecificationTemplate, - String className) - { - // Create a copy of the template. - ClassSpecification classSpecification = - (ClassSpecification)classSpecificationTemplate.clone(); - - if (className == null) - { - classSpecification.className = null; - } - else - { - // Set the class name in the copy. - classSpecification.className = - className.equals("") || - className.equals("*") ? - null : - ClassUtil.internalClassName(className); - } - - // Return the modified copy. - return classSpecification; - } - - - // Methods and internal classes related to actions. - - /** - * Loads the given ProGuard configuration into the GUI. - */ - private void loadConfiguration(File file) - { - // Set the default directory and file in the file choosers. - configurationChooser.setSelectedFile(file.getAbsoluteFile()); - fileChooser.setCurrentDirectory(file.getAbsoluteFile().getParentFile()); - - try - { - // Parse the configuration file. - ConfigurationParser parser = new ConfigurationParser(file, - System.getProperties()); - - Configuration configuration = new Configuration(); - - try - { - parser.parse(configuration); - - // Let the GUI reflect the configuration. - setProGuardConfiguration(configuration); - } - catch (ParseException ex) - { - JOptionPane.showMessageDialog(getContentPane(), - msg("cantParseConfigurationFile", file.getPath()), - msg("warning"), - JOptionPane.ERROR_MESSAGE); - } - finally - { - parser.close(); - } - } - catch (IOException ex) - { - JOptionPane.showMessageDialog(getContentPane(), - msg("cantOpenConfigurationFile", file.getPath()), - msg("warning"), - JOptionPane.ERROR_MESSAGE); - } - } - - - /** - * Loads the given ProGuard configuration into the GUI. - */ - private void loadConfiguration(URL url) - { - try - { - // Parse the configuration file. - ConfigurationParser parser = new ConfigurationParser(url, - System.getProperties()); - - Configuration configuration = new Configuration(); - - try - { - parser.parse(configuration); - - // Let the GUI reflect the configuration. - setProGuardConfiguration(configuration); - } - catch (ParseException ex) - { - JOptionPane.showMessageDialog(getContentPane(), - msg("cantParseConfigurationFile", url), - msg("warning"), - JOptionPane.ERROR_MESSAGE); - } - finally - { - parser.close(); - } - } - catch (IOException ex) - { - JOptionPane.showMessageDialog(getContentPane(), - msg("cantOpenConfigurationFile", url), - msg("warning"), - JOptionPane.ERROR_MESSAGE); - } - } - - - /** - * Saves the current ProGuard configuration to the given file. - */ - private void saveConfiguration(File file) - { - try - { - // Save the configuration file. - ConfigurationWriter writer = new ConfigurationWriter(file); - - try - { - writer.write(getProGuardConfiguration()); - } - finally - { - writer.close(); - } - } - catch (Exception ex) - { - JOptionPane.showMessageDialog(getContentPane(), - msg("cantSaveConfigurationFile", file.getPath()), - msg("warning"), - JOptionPane.ERROR_MESSAGE); - } - } - - - /** - * Loads the given stack trace into the GUI. - */ - private void loadStackTrace(File file) - { - try - { - StringBuffer buffer = new StringBuffer(1024); - - Reader reader = - new BufferedReader( - new InputStreamReader( - new FileInputStream(file), "UTF-8")); - - try - { - while (true) - { - int c = reader.read(); - if (c < 0) - { - break; - } - - buffer.append(c); - } - } - finally - { - reader.close(); - } - - // Put the stack trace in the text area. - stackTraceTextArea.setText(buffer.toString()); - } - catch (IOException ex) - { - JOptionPane.showMessageDialog(getContentPane(), - msg("cantOpenStackTraceFile", fileName(file)), - msg("warning"), - JOptionPane.ERROR_MESSAGE); - } - } - - - /** - * This ActionListener loads a ProGuard configuration file and initializes - * the GUI accordingly. - */ - private class MyLoadConfigurationActionListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - configurationChooser.setDialogTitle(msg("selectConfigurationFile")); - - int returnValue = configurationChooser.showOpenDialog(ProGuardGUI.this); - if (returnValue == JFileChooser.APPROVE_OPTION) - { - loadConfiguration(configurationChooser.getSelectedFile()); - } - } - } - - - /** - * This ActionListener saves a ProGuard configuration file based on the - * current GUI settings. - */ - private class MySaveConfigurationActionListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - configurationChooser.setDialogTitle(msg("saveConfigurationFile")); - - int returnVal = configurationChooser.showSaveDialog(ProGuardGUI.this); - if (returnVal == JFileChooser.APPROVE_OPTION) - { - saveConfiguration(configurationChooser.getSelectedFile()); - } - } - } - - - /** - * This ActionListener displays the ProGuard configuration specified by the - * current GUI settings. - */ - private class MyViewConfigurationActionListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - // Make sure System.out has not been redirected yet. - if (!systemOutRedirected) - { - consoleTextArea.setText(""); - - PrintWriter printWriter = - new PrintWriter( - new TextAreaWriter(consoleTextArea)); - - try - { - // TODO: write out relative path names and path names with system properties. - - // Write the configuration. - ConfigurationWriter configurationWriter = - new ConfigurationWriter(printWriter); - - try - { - configurationWriter.write(getProGuardConfiguration()); - } - finally - { - configurationWriter.close(); - } - } - catch (IOException ignore) - { - // This shouldn't happen. - } - - // Scroll to the top of the configuration. - consoleTextArea.setCaretPosition(0); - } - } - } - - - /** - * This ActionListener executes ProGuard based on the current GUI settings. - */ - private class MyProcessActionListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - // Make sure System.out has not been redirected yet. - if (!systemOutRedirected) - { - systemOutRedirected = true; - - // Get the informational configuration file name. - File configurationFile = configurationChooser.getSelectedFile(); - String configurationFileName = configurationFile != null ? - configurationFile.getName() : - msg("sampleConfigurationFileName"); - - // Create the ProGuard thread. - Thread proGuardThread = - new Thread(new ProGuardRunnable(consoleTextArea, - getProGuardConfiguration(), - configurationFileName)); - - // Run it. - proGuardThread.start(); - } - } - } - - - /** - * This ActionListener loads an obfuscated stack trace from a file and puts - * it in the proper text area. - */ - private class MyLoadStackTraceActionListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - fileChooser.setDialogTitle(msg("selectStackTraceFile")); - fileChooser.setSelectedFile(null); - - int returnValue = fileChooser.showOpenDialog(ProGuardGUI.this); - if (returnValue == JFileChooser.APPROVE_OPTION) - { - - loadStackTrace(fileChooser.getSelectedFile()); - } - } - } - - - /** - * This ActionListener executes ReTrace based on the current GUI settings. - */ - private class MyReTraceActionListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - // Make sure System.out has not been redirected yet. - if (!systemOutRedirected) - { - systemOutRedirected = true; - - boolean verbose = reTraceVerboseCheckBox.isSelected(); - File retraceMappingFile = new File(reTraceMappingTextField.getText()); - String stackTrace = stackTraceTextArea.getText(); - - // Create the ReTrace runnable. - Runnable reTraceRunnable = new ReTraceRunnable(reTraceTextArea, - verbose, - retraceMappingFile, - stackTrace); - - // Run it in this thread, because it won't take long anyway. - reTraceRunnable.run(); - } - } - } - - - // Small utility methods. - - /** - * Returns the URL for the given path. - */ - private URL url(String path) - { - try - { - return new URL(path); - } - catch (MalformedURLException e) - { - try - { - return new URL("file", "", 0, ""); - } - catch (MalformedURLException e1) - { - return null; - } - } - } - - - /** - * Returns the path for the given URL, or the empty string if the URL name - * is empty. - */ - private String fileName(URL url) - { - if (isURL(url)) - { - if (url.getProtocol().equals("file")) - { - try - { - return fileName(new File(url.toURI())); - } - catch (URISyntaxException ignore) {} - } - - return url.toExternalForm(); - } - else - { - return ""; - } - } - - - /** - * Returns whether the given URL is actually a URL, or just a placeholder - * for the standard output. - */ - private boolean isURL(URL url) - { - return url != null && - url.getPath().length() > 0; - } - - - /** - * Returns the canonical file name for the given file, or the empty string - * if the file name is empty. - */ - private String fileName(File file) - { - if (file == null) - { - return ""; - } - else - { - try - { - return file.getCanonicalPath(); - } - catch (IOException ex) - { - return file.getPath(); - } - } - } - - - /** - * Attaches the tool tip from the GUI resources that corresponds to the - * given key, to the given component. - */ - private static JComponent tip(JComponent component, String messageKey) - { - component.setToolTipText(msg(messageKey)); - - return component; - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private static String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key and argument. - */ - private String msg(String messageKey, - Object messageArgument) - { - return GUIResources.getMessage(messageKey, new Object[] {messageArgument}); - } - - - /** - * The main method for the ProGuard GUI. - */ - public static void main(final String[] args) - { - try - { - SwingUtil.invokeAndWait(new Runnable() - { - public void run() - { - try - { - ProGuardGUI gui = new ProGuardGUI(); - - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension guiSize = gui.getSize(); - gui.setLocation((screenSize.width - guiSize.width) / 2, - (screenSize.height - guiSize.height) / 2); - gui.show(); - - // Start the splash animation, unless specified otherwise. - int argIndex = 0; - if (argIndex < args.length && - NO_SPLASH_OPTION.startsWith(args[argIndex])) - { - gui.skipSplash(); - argIndex++; - } - else - { - gui.startSplash(); - } - // Load an initial configuration, if specified. - if (argIndex < args.length) - { - gui.loadConfiguration(new File(args[argIndex])); - argIndex++; - } - - if (argIndex < args.length) - { - System.out.println(gui.getClass().getName() + ": ignoring extra arguments [" + args[argIndex] + "...]"); - } - } - catch (Exception e) - { - System.out.println("Internal problem starting the ProGuard GUI (" + e.getMessage() + ")"); - e.printStackTrace(); - } - } - }); - } - catch (Exception e) - { - System.out.println("Internal problem starting the ProGuard GUI (" + e.getMessage() + ")"); - e.printStackTrace(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ProGuardRunnable.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ProGuardRunnable.java deleted file mode 100644 index 4c000566..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ProGuardRunnable.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.*; - -import javax.swing.*; -import java.awt.*; -import java.io.*; - - -/** - * This Runnable runs ProGuard, sending console output to a text - * area and any exceptions to message dialogs. - * - * @see ProGuard - * @author Eric Lafortune - */ -final class ProGuardRunnable implements Runnable -{ - private final JTextArea consoleTextArea; - private final Configuration configuration; - private final String configurationFileName; - - - /** - * Creates a new ProGuardRunnable object. - * @param consoleTextArea the text area to send the console output to. - * @param configuration the ProGuard configuration. - * @param configurationFileName the optional file name of the configuration, - * for informational purposes. - */ - public ProGuardRunnable(JTextArea consoleTextArea, - Configuration configuration, - String configurationFileName) - { - this.consoleTextArea = consoleTextArea; - this.configuration = configuration; - this.configurationFileName = configurationFileName; - } - - - // Implementation for Runnable. - - public void run() - { - consoleTextArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - consoleTextArea.setText(""); - - // Redirect the System's out and err streams to the console text area. - PrintStream oldOut = System.out; - PrintStream oldErr = System.err; - - PrintWriter outWriter = new PrintWriter(new TextAreaWriter(consoleTextArea), true); - PrintStream outStream = new PrintStream(new TextAreaOutputStream(consoleTextArea), true); - - System.setOut(outStream); - System.setErr(outStream); - - try - { - // Create a new ProGuard object with the GUI's configuration. - ProGuard proGuard = new ProGuard(configuration); - - // Run it. - proGuard.execute(); - - // Print out the completion message. - outWriter.println("Processing completed successfully"); - } - catch (Exception ex) - { - //ex.printStackTrace(); - - // Print out the exception message. - outWriter.println(ex.getMessage()); - - // Show a dialog as well. - MessageDialogRunnable.showMessageDialog(consoleTextArea, - ex.getMessage(), - msg("errorProcessing"), - JOptionPane.ERROR_MESSAGE); - } - catch (OutOfMemoryError er) - { - // Forget about the ProGuard object as quickly as possible. - System.gc(); - - // Print out a message suggesting what to do next. - outWriter.println(msg("outOfMemoryInfo", configurationFileName)); - - // Show a dialog as well. - MessageDialogRunnable.showMessageDialog(consoleTextArea, - msg("outOfMemory"), - msg("errorProcessing"), - JOptionPane.ERROR_MESSAGE); - } - finally - { - // Make sure all output has been sent to the console text area. - outWriter.close(); - - // Restore the old System's out and err streams. - System.setOut(oldOut); - System.setErr(oldErr); - } - - consoleTextArea.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - - // Reset the global static redirection lock. - ProGuardGUI.systemOutRedirected = false; - } - - - // Small utility methods. - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } - - - /** - * Returns the message from the GUI resources that corresponds to the given - * key and argument. - */ - private String msg(String messageKey, - Object messageArgument) - { - return GUIResources.getMessage(messageKey, new Object[] {messageArgument}); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ReTraceRunnable.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ReTraceRunnable.java deleted file mode 100644 index e4f1df5f..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/ReTraceRunnable.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import proguard.retrace.ReTrace; - -import javax.swing.*; -import java.awt.*; -import java.io.*; - - -/** - * This Runnable runs ReTrace, sending the output to a text - * area and any exceptions to message dialogs. - * - * @see ReTrace - * @author Eric Lafortune - */ -final class ReTraceRunnable implements Runnable -{ - private final JTextArea consoleTextArea; - private final boolean verbose; - private final File mappingFile; - private final String stackTrace; - - - /** - * Creates a new ReTraceRunnable. - * @param consoleTextArea the text area to send the console output to. - * @param verbose specifies whether the de-obfuscated stack trace - * should be verbose. - * @param mappingFile the mapping file that was written out by ProGuard. - */ - public ReTraceRunnable(JTextArea consoleTextArea, - boolean verbose, - File mappingFile, - String stackTrace) - { - this.consoleTextArea = consoleTextArea; - this.verbose = verbose; - this.mappingFile = mappingFile; - this.stackTrace = stackTrace; - } - - - // Implementation for Runnable. - - public void run() - { - consoleTextArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - consoleTextArea.setText(""); - - LineNumberReader reader = - new LineNumberReader( - new CharArrayReader(stackTrace.toCharArray())); - - PrintWriter writer = - new PrintWriter(new TextAreaWriter(consoleTextArea), true); - - try - { - // Execute ReTrace with the collected settings. - new ReTrace(ReTrace.STACK_TRACE_EXPRESSION, verbose, mappingFile) - .retrace(reader, writer); - } - catch (Exception ex) - { - // Print out the exception message. - System.out.println(ex.getMessage()); - - // Show a dialog as well. - MessageDialogRunnable.showMessageDialog(consoleTextArea, - ex.getMessage(), - msg("errorReTracing"), - JOptionPane.ERROR_MESSAGE); - } - catch (OutOfMemoryError er) - { - // Forget about the ProGuard object as quickly as possible. - System.gc(); - - // Print out a message suggesting what to do next. - System.out.println(msg("outOfMemory")); - - // Show a dialog as well. - MessageDialogRunnable.showMessageDialog(consoleTextArea, - msg("outOfMemory"), - msg("errorReTracing"), - JOptionPane.ERROR_MESSAGE); - } - - consoleTextArea.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - consoleTextArea.setCaretPosition(0); - } - - - // Small utility methods. - - /** - * Returns the message from the GUI resources that corresponds to the given - * key. - */ - private String msg(String messageKey) - { - return GUIResources.getMessage(messageKey); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/SwingUtil.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/SwingUtil.java deleted file mode 100644 index 5d05767a..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/SwingUtil.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.*; -import java.lang.reflect.InvocationTargetException; - - -/** - * This utility class provides variants of the invocation method from the - * SwingUtilities class. - * - * @see SwingUtilities - * @author Eric Lafortune - */ -public class SwingUtil -{ - /** - * Invokes the given Runnable in the AWT event dispatching thread, - * and waits for it to finish. This method may be called from any thread, - * including the event dispatching thread itself. - * @see SwingUtilities#invokeAndWait(Runnable) - * @param runnable the Runnable to be executed. - */ - public static void invokeAndWait(Runnable runnable) - throws InterruptedException, InvocationTargetException - { - try - { - if (SwingUtilities.isEventDispatchThread()) - { - runnable.run(); - } - else - { - SwingUtilities.invokeAndWait(runnable); - } - } - catch (Exception ex) - { - // Ignore any exceptions. - } - } - - - /** - * Invokes the given Runnable in the AWT event dispatching thread, not - * necessarily right away. This method may be called from any thread, - * including the event dispatching thread itself. - * @see SwingUtilities#invokeLater(Runnable) - * @param runnable the Runnable to be executed. - */ - public static void invokeLater(Runnable runnable) - { - if (SwingUtilities.isEventDispatchThread()) - { - runnable.run(); - } - else - { - SwingUtilities.invokeLater(runnable); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TabbedPane.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TabbedPane.java deleted file mode 100644 index cac07309..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TabbedPane.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - - -/** - * This Jpanel is similar to a JTabbedPane. - * It uses buttons on the left-hand side to switch between panels. - * An image can be added below these buttons. - * Some methods are provided to switch between tabs. - * - * @author Eric Lafortune - */ -public class TabbedPane - extends JPanel -{ - private final CardLayout cardLayout = new CardLayout(); - private final JPanel cardPanel = new JPanel(cardLayout); - private final ButtonGroup buttonGroup = new ButtonGroup(); - - - /** - * Creates a new TabbedPane. - */ - public TabbedPane() - { - GridBagLayout layout = new GridBagLayout(); - setLayout(layout); - - GridBagConstraints cardConstraints = new GridBagConstraints(); - cardConstraints.gridx = 1; - cardConstraints.gridy = 0; - cardConstraints.gridheight = GridBagConstraints.REMAINDER; - cardConstraints.fill = GridBagConstraints.BOTH; - cardConstraints.weightx = 1.0; - cardConstraints.weighty = 1.0; - cardConstraints.anchor = GridBagConstraints.NORTHWEST; - - add(cardPanel, cardConstraints); - } - - - /** - * Adds a component with a given title to the tabbed pane. - * - * @param title the title that will be used in the tab button. - * @param component the component that will be added as a tab. - */ - public Component add(final String title, Component component) - { - GridBagConstraints buttonConstraints = new GridBagConstraints(); - buttonConstraints.gridx = 0; - buttonConstraints.fill = GridBagConstraints.HORIZONTAL; - buttonConstraints.anchor = GridBagConstraints.NORTHWEST; - buttonConstraints.ipadx = 10; - buttonConstraints.ipady = 4; - - JToggleButton button = new JToggleButton(title); - - // Let the button react on the mouse press, instead of waiting for the - // mouse release. - button.setModel(new JToggleButton.ToggleButtonModel() - { - public void setPressed(boolean b) - { - if ((isPressed() == b) || !isEnabled()) - { - return; - } - - if (!b && isArmed()) - { - setSelected(!this.isSelected()); - } - - if (b) - { - stateMask |= PRESSED; - } - else - { - stateMask &= ~PRESSED; - } - - fireStateChanged(); - - if (isPressed()) - { - fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, getActionCommand())); - } - } - - }); - - // Switch to the tab on a button press. - button.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - cardLayout.show(cardPanel, title); - } - }); - - // Only one button can be selected at the same time. - buttonGroup.add(button); - - // If this is the first tab, make sure its button is selected. - if (cardPanel.getComponentCount() == 0) - { - button.setSelected(true); - } - - // Add the button and its panel. - add(button, buttonConstraints); - cardPanel.add(title, component); - - return component; - } - - - /** - * Adds an image below the tab buttons, after all tabs have been added. - * The image will only be as visible as permitted by the available space. - * - * @param image the image. - * @return the component containing the image. - */ - public Component addImage(final Image image) - { - GridBagConstraints imageConstraints = new GridBagConstraints(); - imageConstraints.gridx = 0; - imageConstraints.weighty = 1.0; - imageConstraints.fill = GridBagConstraints.BOTH; - imageConstraints.anchor = GridBagConstraints.SOUTHWEST; - - JButton component = new JButton(new ImageIcon(image)); - component.setFocusPainted(false); - component.setFocusable(false); - component.setRequestFocusEnabled(false); - component.setRolloverEnabled(false); - component.setMargin(new Insets(0, 0, 0, 0)); - component.setHorizontalAlignment(JButton.LEFT); - component.setVerticalAlignment(JButton.BOTTOM); - component.setPreferredSize(new Dimension(0, 0)); - - add(component, imageConstraints); - - return component; - } - - - /** - * Selects the first tab. - */ - public void first() - { - cardLayout.first(cardPanel); - updateButtonSelection(); - } - - - /** - * Selects the last tab. - */ - public void last() - { - cardLayout.last(cardPanel); - updateButtonSelection(); - } - - - /** - * Selects the previous tab. - */ - public void previous() - { - cardLayout.previous(cardPanel); - updateButtonSelection(); - } - - - /** - * Selects the next tab. - */ - public void next() - { - cardLayout.next(cardPanel); - updateButtonSelection(); - } - - - /** - * Lets the button selection reflect the currently visible panel. - */ - private void updateButtonSelection() - { - int count = cardPanel.getComponentCount(); - for (int index = 0 ; index < count ; index++) { - Component card = cardPanel.getComponent(index); - if (card.isShowing()) - { - JToggleButton button = (JToggleButton)getComponent(index+1); - button.setSelected(true); - } - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TextAreaOutputStream.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TextAreaOutputStream.java deleted file mode 100644 index 2864d24a..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TextAreaOutputStream.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.*; -import java.io.*; - - -/** - * This PrintStream appends its output to a given text area. - * - * @author Eric Lafortune - */ -final class TextAreaOutputStream extends FilterOutputStream implements Runnable -{ - private final JTextArea textArea; - - - public TextAreaOutputStream(JTextArea textArea) - { - super(new ByteArrayOutputStream()); - - this.textArea = textArea; - } - - - // Implementation for FilterOutputStream. - - public void flush() throws IOException - { - super.flush(); - - try - { - // Append the accumulated buffer contents to the text area. - SwingUtil.invokeAndWait(this); - } - catch (Exception e) - { - // Nothing. - } - } - - - // Implementation for Runnable. - - public void run() - { - ByteArrayOutputStream out = (ByteArrayOutputStream)super.out; - - // Has any new text been written? - String text = out.toString(); - if (text.length() > 0) - { - // Append the accumulated text to the text area. - textArea.append(text); - - // Clear the buffer. - out.reset(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TextAreaWriter.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TextAreaWriter.java deleted file mode 100644 index 393113a4..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/TextAreaWriter.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui; - -import javax.swing.*; -import java.io.*; - - -/** - * This writer appends its output to a given text area. - * - * @author Eric Lafortune - */ -final class TextAreaWriter extends FilterWriter implements Runnable -{ - private final JTextArea textArea; - - - public TextAreaWriter(JTextArea textArea) - { - super(new CharArrayWriter()); - - this.textArea = textArea; - } - - - // Implementation for FilterWriter. - - public void flush() throws IOException - { - super.flush(); - - try - { - // Append the accumulated buffer contents to the text area. - SwingUtil.invokeAndWait(this); - } - catch (Exception e) - { - // Nothing. - } - } - - - // Implementation for Runnable. - - public void run() - { - CharArrayWriter writer = (CharArrayWriter)super.out; - - // Has any new text been written? - String text = writer.toString(); - if (text.length() > 0) - { - // Append the accumulated text to the text area. - textArea.append(text); - - // Clear the buffer. - writer.reset(); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/arrow.gif b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/arrow.gif deleted file mode 100644 index c58e34ea..00000000 Binary files a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/arrow.gif and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/boilerplate.pro b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/boilerplate.pro deleted file mode 100644 index f14d721e..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/boilerplate.pro +++ /dev/null @@ -1,809 +0,0 @@ -# Keep - Applications. Keep all application classes, along with their 'main' methods. --keepclasseswithmembers public class * { - public static void main(java.lang.String[]); -} - -# Keep - Applets. Keep all extensions of java.applet.Applet. --keep public class * extends java.applet.Applet - -# Keep - Servlets. Keep all extensions of javax.servlet.Servlet. --keep public class * extends javax.servlet.Servlet - -# Keep - Midlets. Keep all extensions of javax.microedition.midlet.MIDlet. --keep public class * extends javax.microedition.midlet.MIDlet - -# Keep - Xlets. Keep all extensions of javax.tv.xlet.Xlet. --keep public class * extends javax.tv.xlet.Xlet - -# Keep - Libraries. Keep all public and protected classes, fields, and methods. --keep public class * { - public protected ; - public protected ; -} - -# Keep - Native method names. Keep all native class/method names. --keepclasseswithmembernames,includedescriptorclasses class * { - native ; -} - -# Keep - _class method names. Keep all .class method names. This may be -# useful for libraries that will be obfuscated again with different obfuscators. --keepclassmembernames class * { - java.lang.Class class$(java.lang.String); - java.lang.Class class$(java.lang.String,boolean); -} - -# Also keep - Enumerations. Keep the special static methods that are required in -# enumeration classes. --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Also keep - Serialization code. Keep all fields and methods that are used for -# serialization. --keepclassmembers class * extends java.io.Serializable { - static final long serialVersionUID; - static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Also keep - BeanInfo classes. Keep all implementations of java.beans.BeanInfo. --keep class * implements java.beans.BeanInfo - -# Also keep - Bean classes. Keep all specified classes, along with their getters -# and setters. --keep class * { - void set*(***); - void set*(int,***); - - boolean is*(); - boolean is*(int); - - *** get*(); - *** get*(int); -} - -# Also keep - Database drivers. Keep all implementations of java.sql.Driver. --keep class * implements java.sql.Driver - -# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI, -# along with the special 'createUI' method. --keep class * extends javax.swing.plaf.ComponentUI { - public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent); -} - -# Also keep - RMI interfaces. Keep all interfaces that extend the -# java.rmi.Remote interface, and their methods. --keep interface * extends java.rmi.Remote { - ; -} - -# Also keep - RMI implementations. Keep all implementations of java.rmi.Remote, -# including any explicit or implicit implementations of Activatable, with their -# two-argument constructors. --keep class * implements java.rmi.Remote { - (java.rmi.activation.ActivationID,java.rmi.MarshalledObject); -} - - - -# Android - Android activities. Keep all extensions of Android activities. --keep public class * extends android.app.Activity - -# Android - Android applications. Keep all extensions of Android applications. --keep public class * extends android.app.Application - -# Android - Android services. Keep all extensions of Android services. --keep public class * extends android.app.Service - -# Android - Broadcast receivers. Keep all extensions of Android broadcast receivers. --keep public class * extends android.content.BroadcastReceiver - -# Android - Content providers. Keep all extensions of Android content providers. --keep public class * extends android.content.ContentProvider - - -# More Android - View classes. Keep all Android views and their constructors and setters. --keep public class * extends android.view.View { - public (android.content.Context); - public (android.content.Context, android.util.AttributeSet); - public (android.content.Context, android.util.AttributeSet, int); - public void set*(...); -} - -# More Android - Layout classes. Keep classes with constructors that may be referenced from Android layout -# files. --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet); - } --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet, int); -} - -# More Android - Contexts. Keep all extensions of Android Context. --keepclassmembers class * extends android.content.Context { - public void *(android.view.View); - public void *(android.view.MenuItem); -} - -# More Android - Parcelables. Keep all extensions of Android Parcelables. --keepclassmembers class * implements android.os.Parcelable { - static ** CREATOR; -} - -# More Android - R classes. Keep all fields of Android R classes. --keepclassmembers class **.R$* { - public static ; -} - - -# Android annotations - Support annotations. Support annotations for Android. --keep @android.support.annotation.Keep class * --keepclassmembers class * { - @android.support.annotation.Keep *; -} - -# Android annotations - Facebook keep annotations. Keep annotations for Facebook. --keep @com.facebook.proguard.annotations.DoNotStrip class * --keepclassmembers class * { - @com.facebook.proguard.annotations.DoNotStrip *; -} --keep @com.facebook.proguard.annotations.KeepGettersAndSetters class * --keepclassmembers class * { - @com.facebook.proguard.annotations.KeepGettersAndSetters *; -} - -# Android annotations - ProGuard annotations. Keep annotations for ProGuard. --keep @proguard.annotation.Keep class * --keepclassmembers class * { - @proguard.annotation.Keep *; -} --keepclassmembernames class * { - @proguard.annotation.KeepName *; -} --keep class * implements @proguard.annotation.KeepImplementations * --keep public class * implements @proguard.annotation.KeepPublicImplementations * --keepclassmembers @proguard.annotation.KeepClassMembers class * { - *; -} --keepclassmembers @proguard.annotation.KeepPublicClassMembers class * { - public *; -} --keepclassmembers @proguard.annotation.KeepPublicProtectedClassMembers class * { - public protected *; -} --keepclassmembernames @proguard.annotation.KeepClassMemberNames class * { - *; -} --keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames class * { - public *; -} --keepclassmembernames @proguard.annotation.KeepPublicProtectedClassMemberNames class * { - public protected *; -} --keepclassmembers @proguard.annotation.KeepGettersSetters class * { - void set*(***); - void set*(int, ***); - - boolean is*(); - boolean is*(int); - - *** get*(); - *** get*(int); -} --keepclassmembers @proguard.annotation.KeepPublicGettersSetters class * { - public void set*(***); - public void set*(int, ***); - - public boolean is*(); - public boolean is*(int); - - public *** get*(); - public *** get*(int); -} --keepnames @proguard.annotation.KeepName class * - -# Android annotations - Google keep annotations. Keep annotations for Google. --keepclassmembernames class * { - @com.google.android.gms.common.annotation.KeepName *; -} --keepnames @com.google.android.gms.common.annotation.KeepName class * - - - -# Android libraries - Design support libraries. Keep setters for design support libraries. --keep !abstract class android.support.design.widget.* implements -android.support.design.widget.CoordinatorLayout$Behavior { - (android.content.Context, android.util.AttributeSet); -} --keepnames class android.support.design.widget.CoordinatorLayout - -# Android libraries - Kotlin. Keep some methods for Kotlin for Android Development. --keepclassmembers,allowshrinking,allowobfuscation class -kotlin.jvm.internal.Intrinsics { - void throwNpe(); -} - -# Android libraries - Google Play Services. Keep classes for Google Play Services. --keep class com.google.android.gms.tagmanager.TagManagerService --keep class com.google.android.gms.measurement.AppMeasurement --keep class com.google.android.gms.measurement.AppMeasurementReceiver --keep class com.google.android.gms.measurement.AppMeasurementService --keepclassmembers class - com.google.android.gms.ads.identifier.AdvertisingIdClient, - com.google.android.gms.ads.identifier.AdvertisingIdClient$Info, - com.google.android.gms.common.GooglePlayServicesUtil { - public ; -} --keep,allowobfuscation class - com.google.android.gms.ads.identifier.AdvertisingIdClient, - com.google.android.gms.ads.identifier.AdvertisingIdClient$Info, - com.google.android.gms.common.GooglePlayServicesUtil --keep,allowshrinking class - com.google.android.gms.iid.MessengerCompat, - com.google.android.gms.location.ActivityRecognitionResult, - com.google.android.gms.maps.GoogleMapOptions --keep,allowshrinking class - com.google.android.gms.ads.AdActivity, - com.google.android.gms.ads.purchase.InAppPurchaseActivity, - com.google.android.gms.gcm.GoogleCloudMessaging, - com.google.android.gms.location.places.*Api --keepclassmembers class -com.google.android.gms.common.internal.safeparcel.SafeParcelable { - public static final java.lang.String NULL; -} - -# Android libraries - Firebase. Keep classes for Firebase for Android. --keep class com.google.firebase.FirebaseApp --keep class com.google.firebase.auth.FirebaseAuth --keep class com.google.firebase.crash.FirebaseCrash --keep class -com.google.firebase.database.connection.idl.IPersistentConnectionImpl --keep class com.google.firebase.iid.FirebaseInstanceId - -# Android libraries - Google Cloud Messaging. Keep classes for Google Cloud Messaging. --keep,allowshrinking class **.GCMIntentService - -# Android libraries - Guava. Keep classes for the Guava libraries. --keepclassmembers class com.google.common.primitives.UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator -{ - sun.misc.Unsafe theUnsafe; -} - -# Android libraries - RxJava. Keep classes for RxJava. --keepclassmembers class rx.internal.util.unsafe.*Queue { - long producerIndex; - long consumerIndex; - - rx.internal.util.atomic.LinkedQueueNode producerNode; - rx.internal.util.atomic.LinkedQueueNode consumerNode; -} - -# Android libraries - ActionBarSherlock. Keep classes for ActionBarSherlock. --keepclassmembers !abstract class * extends -com.actionbarsherlock.ActionBarSherlock { - (android.app.Activity, int); -} - -# Android libraries - GSON. Keep classes for the GSON library. --keepclassmembers class * { - @com.google.gson.annotations.Expose ; -} --keepclassmembers enum * { - @com.google.gson.annotations.SerializedName ; -} --keepclasseswithmembers,allowobfuscation,includedescriptorclasses class * { - @com.google.gson.annotations.Expose ; -} --keepclasseswithmembers,allowobfuscation,includedescriptorclasses class * { - @com.google.gson.annotations.SerializedName ; -} - - -# Android libraries - Dagger code. Keep the classes that Dagger accesses -# by reflection. --keep class **$$ModuleAdapter --keep class **$$InjectAdapter --keep class **$$StaticInjection - --if class **$$ModuleAdapter --keep class <1> - --if class **$$InjectAdapter --keep class <1> - --if class **$$StaticInjection --keep class <1> - --keepnames class dagger.Lazy - --keepclassmembers,allowobfuscation class * { - @dagger.** *; -} - -# Android libraries - Butterknife code. Keep the classes that Butterknife accesses -# by reflection. --keepclasseswithmembers class * { - @butterknife.* ; -} --keepclasseswithmembers class * { - @butterknife.* ; -} --keepclasseswithmembers class * { - @butterknife.On* ; -} --keep class **$$ViewInjector { - public static void inject(...); - public static void reset(...); -} --keep class **$$ViewBinder { - public static void bind(...); - public static void unbind(...); -} - --if class **$$ViewBinder --keep class <1> - --keep class **_ViewBinding { - (<1>, android.view.View); -} - --if class **_ViewBinding --keep class <1> - --keep,allowobfuscation @interface butterknife.* --dontwarn butterknife.internal.ButterKnifeProcessor - -# Android libraries - Roboguice. Keep classes for RoboGuice. --keepclassmembers class * implements com.google.inject.Module { - (android.content.Context); - (); -} --keepclassmembers class android.support.v4.app.Fragment { - public android.view.View getView(); -} --keepclassmembers class android.support.v4.app.FragmentManager { - public android.support.v4.app.Fragment findFragmentById(int); - public android.support.v4.app.Fragment -findFragmentByTag(java.lang.String); -} --keep,allowobfuscation class roboguice.activity.event.OnCreateEvent --keep,allowobfuscation class roboguice.inject.SharedPreferencesProvider$PreferencesNameHolder --dontnote com.google.inject.Module - -# Android libraries - Otto. Keep classes for Otto. --keepclassmembers,allowobfuscation class * { - @com.squareup.otto.* ; -} - -# Android libraries - Greenrobot EventBus V2. --keepclassmembers class * { - public void onEvent*(***); -} - -# Android libraries - Greenrobot EventBus V3. --keep enum org.greenrobot.eventbus.ThreadMode { *; } --keepclassmembers class * extends -org.greenrobot.eventbus.util.ThrowableFailureEvent { - (java.lang.Throwable); -} --keep,allowobfuscation class org.greenrobot.eventbus.Subscribe { *; } --keepclassmembers,allowobfuscation class ** { - @org.greenrobot.eventbus.Subscribe ; -} -# Android libraries - Google API. Keep classes and field for Google API. --keepclassmembers class * { - @com.google.api.client.util.Key ; - @com.google.api.client.util.Value ; - @com.google.api.client.util.NullValue ; -} --keep,allowobfuscation class com.google.api.client.util.Types { - java.lang.IllegalArgumentException -handleExceptionForNewInstance(java.lang.Exception, java.lang.Class); -} - -# Android libraries - Facebook API. Keep methods for the Facebook API. --keepclassmembers interface com.facebook.model.GraphObject { - ; -} - -# Android libraries - Javascript interfaces. Keep all methods from Android Javascripts. --keepclassmembers class * { - @android.webkit.JavascriptInterface ; -} - -# Android libraries - Compatibility classes. Avoid merging and inlining compatibility classes. --keep,allowshrinking,allowobfuscation class - android.support.**Compat*, - android.support.**Honeycomb*, - android.support.**IceCreamSandwich*, - android.support.**JellyBean*, - android.support.**Jellybean*, - android.support.**JB*, - android.support.**KitKat*, - android.support.**Kitkat*, - android.support.**Lollipop*, - android.support.**19, - android.support.**20, - android.support.**21, - android.support.**22, - android.support.**23, - android.support.**24, - android.support.**25, - android.support.**Api* - { *; } --keep,allowobfuscation,allowshrinking @android.annotation.TargetApi -class android.support.** { *; } - -# Android libraries - Signatures. Keep setters for signature optimized with class from API level 19 or -# higher. --keep,allowshrinking,allowobfuscation class -android.support.v4.app.FragmentState$InstantiationException { - (...); -} --keep,allowshrinking,allowobfuscation class -android.support.v4.app.Fragment$InstantiationException { - (...); -} - -# Android libraries - Fields accessed before initialization. Keep fields that are accessed before -# initialization. --keepclassmembers,allowshrinking,allowobfuscation class -android.support.**,com.google.android.gms.**.internal.** { - !static final ; -} - -# Android libraries - Sensitive classes. Keep sensitive classes. --keep,allowshrinking,allowobfuscation class -com.google.android.gms.**.z* { *; } - -# Android libraries - Injection. Keep classes for injection in Guice/RoboGuice/Dagger/ActionBarSherlock. --keep,allowobfuscation class * implements com.google.inject.Provider --keep,allowobfuscation @interface javax.inject.** { *; } --keep,allowobfuscation @interface com.google.inject.** { *; } --keep,allowobfuscation @interface roboguice.** { *; } --keep,allowobfuscation @interface com.actionbarsherlock.** { *; } --keepclassmembers,allowobfuscation class * { - @javax.inject.** ; - @com.google.inject.** ; - @roboguice.** ; - @roboguice.event.Observes ; - @com.actionbarsherlock.** ; - @dagger.** *; - !private (); - @com.google.inject.Inject (...); -} - -# Android libraries - Retrofit. Keep classes for Retrofit. --keepclassmembers @retrofit.http.RestMethod @interface * { - ; -} --keepclassmembers,allowobfuscation interface * { - @retrofit.http.** ; -} --keep,allowobfuscation @retrofit.http.RestMethod @interface * --keep,allowobfuscation @interface retrofit2.http.** - -# Android libraries - Google inject. Keep classes for Google inject. --keepclassmembers class * { - void finalizeReferent(); -} --keepclassmembers class com.google.inject.internal.util.$Finalizer { - public static java.lang.ref.ReferenceQueue -startFinalizer(java.lang.Class,java.lang.Object); -} --keepnames class com.google.inject.internal.util.$FinalizableReference - - -# Android libraries - Jackson. Keep classes for Jackson. --keepclassmembers class * { - @org.codehaus.jackson.annotate.* ; -} --keepclassmembers @org.codehaus.jackson.annotate.JsonAutoDetect class * { - void set*(***); - *** get*(); - boolean is*(); -} - -# Android libraries - Crashlytics. Keep classes for Crashlytics. --keep class * extends io.fabric.sdk.android.Kit - - - -# Remove - System method calls. Remove all invocations of System -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.System { - public static long currentTimeMillis(); - static java.lang.Class getCallerClass(); - public static int identityHashCode(java.lang.Object); - public static java.lang.SecurityManager getSecurityManager(); - public static java.util.Properties getProperties(); - public static java.lang.String getProperty(java.lang.String); - public static java.lang.String getenv(java.lang.String); - public static java.lang.String mapLibraryName(java.lang.String); - public static java.lang.String getProperty(java.lang.String,java.lang.String); -} - -# Remove - Math method calls. Remove all invocations of Math -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.Math { - public static double sin(double); - public static double cos(double); - public static double tan(double); - public static double asin(double); - public static double acos(double); - public static double atan(double); - public static double toRadians(double); - public static double toDegrees(double); - public static double exp(double); - public static double log(double); - public static double log10(double); - public static double sqrt(double); - public static double cbrt(double); - public static double IEEEremainder(double,double); - public static double ceil(double); - public static double floor(double); - public static double rint(double); - public static double atan2(double,double); - public static double pow(double,double); - public static int round(float); - public static long round(double); - public static double random(); - public static int abs(int); - public static long abs(long); - public static float abs(float); - public static double abs(double); - public static int max(int,int); - public static long max(long,long); - public static float max(float,float); - public static double max(double,double); - public static int min(int,int); - public static long min(long,long); - public static float min(float,float); - public static double min(double,double); - public static double ulp(double); - public static float ulp(float); - public static double signum(double); - public static float signum(float); - public static double sinh(double); - public static double cosh(double); - public static double tanh(double); - public static double hypot(double,double); - public static double expm1(double); - public static double log1p(double); -} - -# Remove - Number method calls. Remove all invocations of Number -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.* extends java.lang.Number { - public static java.lang.String toString(byte); - public static java.lang.Byte valueOf(byte); - public static byte parseByte(java.lang.String); - public static byte parseByte(java.lang.String,int); - public static java.lang.Byte valueOf(java.lang.String,int); - public static java.lang.Byte valueOf(java.lang.String); - public static java.lang.Byte decode(java.lang.String); - public int compareTo(java.lang.Byte); - - public static java.lang.String toString(short); - public static short parseShort(java.lang.String); - public static short parseShort(java.lang.String,int); - public static java.lang.Short valueOf(java.lang.String,int); - public static java.lang.Short valueOf(java.lang.String); - public static java.lang.Short valueOf(short); - public static java.lang.Short decode(java.lang.String); - public static short reverseBytes(short); - public int compareTo(java.lang.Short); - - public static java.lang.String toString(int,int); - public static java.lang.String toHexString(int); - public static java.lang.String toOctalString(int); - public static java.lang.String toBinaryString(int); - public static java.lang.String toString(int); - public static int parseInt(java.lang.String,int); - public static int parseInt(java.lang.String); - public static java.lang.Integer valueOf(java.lang.String,int); - public static java.lang.Integer valueOf(java.lang.String); - public static java.lang.Integer valueOf(int); - public static java.lang.Integer getInteger(java.lang.String); - public static java.lang.Integer getInteger(java.lang.String,int); - public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer); - public static java.lang.Integer decode(java.lang.String); - public static int highestOneBit(int); - public static int lowestOneBit(int); - public static int numberOfLeadingZeros(int); - public static int numberOfTrailingZeros(int); - public static int bitCount(int); - public static int rotateLeft(int,int); - public static int rotateRight(int,int); - public static int reverse(int); - public static int signum(int); - public static int reverseBytes(int); - public int compareTo(java.lang.Integer); - - public static java.lang.String toString(long,int); - public static java.lang.String toHexString(long); - public static java.lang.String toOctalString(long); - public static java.lang.String toBinaryString(long); - public static java.lang.String toString(long); - public static long parseLong(java.lang.String,int); - public static long parseLong(java.lang.String); - public static java.lang.Long valueOf(java.lang.String,int); - public static java.lang.Long valueOf(java.lang.String); - public static java.lang.Long valueOf(long); - public static java.lang.Long decode(java.lang.String); - public static java.lang.Long getLong(java.lang.String); - public static java.lang.Long getLong(java.lang.String,long); - public static java.lang.Long getLong(java.lang.String,java.lang.Long); - public static long highestOneBit(long); - public static long lowestOneBit(long); - public static int numberOfLeadingZeros(long); - public static int numberOfTrailingZeros(long); - public static int bitCount(long); - public static long rotateLeft(long,int); - public static long rotateRight(long,int); - public static long reverse(long); - public static int signum(long); - public static long reverseBytes(long); - public int compareTo(java.lang.Long); - - public static java.lang.String toString(float); - public static java.lang.String toHexString(float); - public static java.lang.Float valueOf(java.lang.String); - public static java.lang.Float valueOf(float); - public static float parseFloat(java.lang.String); - public static boolean isNaN(float); - public static boolean isInfinite(float); - public static int floatToIntBits(float); - public static int floatToRawIntBits(float); - public static float intBitsToFloat(int); - public static int compare(float,float); - public boolean isNaN(); - public boolean isInfinite(); - public int compareTo(java.lang.Float); - - public static java.lang.String toString(double); - public static java.lang.String toHexString(double); - public static java.lang.Double valueOf(java.lang.String); - public static java.lang.Double valueOf(double); - public static double parseDouble(java.lang.String); - public static boolean isNaN(double); - public static boolean isInfinite(double); - public static long doubleToLongBits(double); - public static long doubleToRawLongBits(double); - public static double longBitsToDouble(long); - public static int compare(double,double); - public boolean isNaN(); - public boolean isInfinite(); - public int compareTo(java.lang.Double); - - public byte byteValue(); - public short shortValue(); - public int intValue(); - public long longValue(); - public float floatValue(); - public double doubleValue(); - - public int compareTo(java.lang.Object); - public boolean equals(java.lang.Object); - public int hashCode(); - public java.lang.String toString(); -} - -# Remove - String method calls. Remove all invocations of String -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.String { - public static java.lang.String copyValueOf(char[]); - public static java.lang.String copyValueOf(char[],int,int); - public static java.lang.String valueOf(boolean); - public static java.lang.String valueOf(char); - public static java.lang.String valueOf(char[]); - public static java.lang.String valueOf(char[],int,int); - public static java.lang.String valueOf(double); - public static java.lang.String valueOf(float); - public static java.lang.String valueOf(int); - public static java.lang.String valueOf(java.lang.Object); - public static java.lang.String valueOf(long); - public boolean contentEquals(java.lang.StringBuffer); - public boolean endsWith(java.lang.String); - public boolean equalsIgnoreCase(java.lang.String); - public boolean equals(java.lang.Object); - public boolean matches(java.lang.String); - public boolean regionMatches(boolean,int,java.lang.String,int,int); - public boolean regionMatches(int,java.lang.String,int,int); - public boolean startsWith(java.lang.String); - public boolean startsWith(java.lang.String,int); - public byte[] getBytes(); - public byte[] getBytes(java.lang.String); - public char charAt(int); - public char[] toCharArray(); - public int compareToIgnoreCase(java.lang.String); - public int compareTo(java.lang.Object); - public int compareTo(java.lang.String); - public int hashCode(); - public int indexOf(int); - public int indexOf(int,int); - public int indexOf(java.lang.String); - public int indexOf(java.lang.String,int); - public int lastIndexOf(int); - public int lastIndexOf(int,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.CharSequence subSequence(int,int); - public java.lang.String concat(java.lang.String); - public java.lang.String replaceAll(java.lang.String,java.lang.String); - public java.lang.String replace(char,char); - public java.lang.String replaceFirst(java.lang.String,java.lang.String); - public java.lang.String[] split(java.lang.String); - public java.lang.String[] split(java.lang.String,int); - public java.lang.String substring(int); - public java.lang.String substring(int,int); - public java.lang.String toLowerCase(); - public java.lang.String toLowerCase(java.util.Locale); - public java.lang.String toString(); - public java.lang.String toUpperCase(); - public java.lang.String toUpperCase(java.util.Locale); - public java.lang.String trim(); -} - -# Remove - StringBuffer method calls. Remove all invocations of StringBuffer -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.StringBuffer { - public java.lang.String toString(); - public char charAt(int); - public int capacity(); - public int codePointAt(int); - public int codePointBefore(int); - public int indexOf(java.lang.String,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.String substring(int); - public java.lang.String substring(int,int); -} - -# Remove - StringBuilder method calls. Remove all invocations of StringBuilder -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.StringBuilder { - public java.lang.String toString(); - public char charAt(int); - public int capacity(); - public int codePointAt(int); - public int codePointBefore(int); - public int indexOf(java.lang.String,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.String substring(int); - public java.lang.String substring(int,int); -} - -# Remove debugging - Throwable_printStackTrace calls. Remove all invocations of -# Throwable.printStackTrace(). --assumenosideeffects public class java.lang.Throwable { - public void printStackTrace(); -} - -# Remove debugging - Thread_dumpStack calls. Remove all invocations of -# Thread.dumpStack(). --assumenosideeffects public class java.lang.Thread { - public static void dumpStack(); -} - -# Remove debugging - All logging API calls. Remove all invocations of the -# logging API whose return values are not used. --assumenosideeffects public class java.util.logging.* { - ; -} - -# Remove debugging - All Log4j API calls. Remove all invocations of the -# Log4j API whose return values are not used. --assumenosideeffects public class org.apache.log4j.** { - ; -} - diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/default.pro b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/default.pro deleted file mode 100644 index 8cd6b38e..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/default.pro +++ /dev/null @@ -1,292 +0,0 @@ -# The default configuration when starting up the GUI. - --libraryjars /lib/rt.jar - -# Keep - Applications. Keep all application classes, along with their 'main' -# methods. --keepclasseswithmembers public class * { - public static void main(java.lang.String[]); -} - -# Also keep - Enumerations. Keep the special static methods that are required in -# enumeration classes. --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Also keep - Database drivers. Keep all implementations of java.sql.Driver. --keep class * extends java.sql.Driver - -# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI, -# along with the special 'createUI' method. --keep class * extends javax.swing.plaf.ComponentUI { - public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent); -} - -# Keep names - Native method names. Keep all native class/method names. --keepclasseswithmembers,includedescriptorclasses,allowshrinking class * { - native ; -} - -# Remove - System method calls. Remove all invocations of System -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.System { - public static long currentTimeMillis(); - static java.lang.Class getCallerClass(); - public static int identityHashCode(java.lang.Object); - public static java.lang.SecurityManager getSecurityManager(); - public static java.util.Properties getProperties(); - public static java.lang.String getProperty(java.lang.String); - public static java.lang.String getenv(java.lang.String); - public static java.lang.String mapLibraryName(java.lang.String); - public static java.lang.String getProperty(java.lang.String,java.lang.String); -} - -# Remove - Math method calls. Remove all invocations of Math -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.Math { - public static double sin(double); - public static double cos(double); - public static double tan(double); - public static double asin(double); - public static double acos(double); - public static double atan(double); - public static double toRadians(double); - public static double toDegrees(double); - public static double exp(double); - public static double log(double); - public static double log10(double); - public static double sqrt(double); - public static double cbrt(double); - public static double IEEEremainder(double,double); - public static double ceil(double); - public static double floor(double); - public static double rint(double); - public static double atan2(double,double); - public static double pow(double,double); - public static int round(float); - public static long round(double); - public static double random(); - public static int abs(int); - public static long abs(long); - public static float abs(float); - public static double abs(double); - public static int max(int,int); - public static long max(long,long); - public static float max(float,float); - public static double max(double,double); - public static int min(int,int); - public static long min(long,long); - public static float min(float,float); - public static double min(double,double); - public static double ulp(double); - public static float ulp(float); - public static double signum(double); - public static float signum(float); - public static double sinh(double); - public static double cosh(double); - public static double tanh(double); - public static double hypot(double,double); - public static double expm1(double); - public static double log1p(double); -} - -# Remove - Number method calls. Remove all invocations of Number -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.* extends java.lang.Number { - public static java.lang.String toString(byte); - public static java.lang.Byte valueOf(byte); - public static byte parseByte(java.lang.String); - public static byte parseByte(java.lang.String,int); - public static java.lang.Byte valueOf(java.lang.String,int); - public static java.lang.Byte valueOf(java.lang.String); - public static java.lang.Byte decode(java.lang.String); - public int compareTo(java.lang.Byte); - public static java.lang.String toString(short); - public static short parseShort(java.lang.String); - public static short parseShort(java.lang.String,int); - public static java.lang.Short valueOf(java.lang.String,int); - public static java.lang.Short valueOf(java.lang.String); - public static java.lang.Short valueOf(short); - public static java.lang.Short decode(java.lang.String); - public static short reverseBytes(short); - public int compareTo(java.lang.Short); - public static java.lang.String toString(int,int); - public static java.lang.String toHexString(int); - public static java.lang.String toOctalString(int); - public static java.lang.String toBinaryString(int); - public static java.lang.String toString(int); - public static int parseInt(java.lang.String,int); - public static int parseInt(java.lang.String); - public static java.lang.Integer valueOf(java.lang.String,int); - public static java.lang.Integer valueOf(java.lang.String); - public static java.lang.Integer valueOf(int); - public static java.lang.Integer getInteger(java.lang.String); - public static java.lang.Integer getInteger(java.lang.String,int); - public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer); - public static java.lang.Integer decode(java.lang.String); - public static int highestOneBit(int); - public static int lowestOneBit(int); - public static int numberOfLeadingZeros(int); - public static int numberOfTrailingZeros(int); - public static int bitCount(int); - public static int rotateLeft(int,int); - public static int rotateRight(int,int); - public static int reverse(int); - public static int signum(int); - public static int reverseBytes(int); - public int compareTo(java.lang.Integer); - public static java.lang.String toString(long,int); - public static java.lang.String toHexString(long); - public static java.lang.String toOctalString(long); - public static java.lang.String toBinaryString(long); - public static java.lang.String toString(long); - public static long parseLong(java.lang.String,int); - public static long parseLong(java.lang.String); - public static java.lang.Long valueOf(java.lang.String,int); - public static java.lang.Long valueOf(java.lang.String); - public static java.lang.Long valueOf(long); - public static java.lang.Long decode(java.lang.String); - public static java.lang.Long getLong(java.lang.String); - public static java.lang.Long getLong(java.lang.String,long); - public static java.lang.Long getLong(java.lang.String,java.lang.Long); - public static long highestOneBit(long); - public static long lowestOneBit(long); - public static int numberOfLeadingZeros(long); - public static int numberOfTrailingZeros(long); - public static int bitCount(long); - public static long rotateLeft(long,int); - public static long rotateRight(long,int); - public static long reverse(long); - public static int signum(long); - public static long reverseBytes(long); - public int compareTo(java.lang.Long); - public static java.lang.String toString(float); - public static java.lang.String toHexString(float); - public static java.lang.Float valueOf(java.lang.String); - public static java.lang.Float valueOf(float); - public static float parseFloat(java.lang.String); - public static boolean isNaN(float); - public static boolean isInfinite(float); - public static int floatToIntBits(float); - public static int floatToRawIntBits(float); - public static float intBitsToFloat(int); - public static int compare(float,float); - public boolean isNaN(); - public boolean isInfinite(); - public int compareTo(java.lang.Float); - public static java.lang.String toString(double); - public static java.lang.String toHexString(double); - public static java.lang.Double valueOf(java.lang.String); - public static java.lang.Double valueOf(double); - public static double parseDouble(java.lang.String); - public static boolean isNaN(double); - public static boolean isInfinite(double); - public static long doubleToLongBits(double); - public static long doubleToRawLongBits(double); - public static double longBitsToDouble(long); - public static int compare(double,double); - public boolean isNaN(); - public boolean isInfinite(); - public int compareTo(java.lang.Double); - public byte byteValue(); - public short shortValue(); - public int intValue(); - public long longValue(); - public float floatValue(); - public double doubleValue(); - public int compareTo(java.lang.Object); - public boolean equals(java.lang.Object); - public int hashCode(); - public java.lang.String toString(); -} - -# Remove - String method calls. Remove all invocations of String -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.String { - public static java.lang.String copyValueOf(char[]); - public static java.lang.String copyValueOf(char[],int,int); - public static java.lang.String valueOf(boolean); - public static java.lang.String valueOf(char); - public static java.lang.String valueOf(char[]); - public static java.lang.String valueOf(char[],int,int); - public static java.lang.String valueOf(double); - public static java.lang.String valueOf(float); - public static java.lang.String valueOf(int); - public static java.lang.String valueOf(java.lang.Object); - public static java.lang.String valueOf(long); - public boolean contentEquals(java.lang.StringBuffer); - public boolean endsWith(java.lang.String); - public boolean equalsIgnoreCase(java.lang.String); - public boolean equals(java.lang.Object); - public boolean matches(java.lang.String); - public boolean regionMatches(boolean,int,java.lang.String,int,int); - public boolean regionMatches(int,java.lang.String,int,int); - public boolean startsWith(java.lang.String); - public boolean startsWith(java.lang.String,int); - public byte[] getBytes(); - public byte[] getBytes(java.lang.String); - public char charAt(int); - public char[] toCharArray(); - public int compareToIgnoreCase(java.lang.String); - public int compareTo(java.lang.Object); - public int compareTo(java.lang.String); - public int hashCode(); - public int indexOf(int); - public int indexOf(int,int); - public int indexOf(java.lang.String); - public int indexOf(java.lang.String,int); - public int lastIndexOf(int); - public int lastIndexOf(int,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.CharSequence subSequence(int,int); - public java.lang.String concat(java.lang.String); - public java.lang.String replaceAll(java.lang.String,java.lang.String); - public java.lang.String replace(char,char); - public java.lang.String replaceFirst(java.lang.String,java.lang.String); - public java.lang.String[] split(java.lang.String); - public java.lang.String[] split(java.lang.String,int); - public java.lang.String substring(int); - public java.lang.String substring(int,int); - public java.lang.String toLowerCase(); - public java.lang.String toLowerCase(java.util.Locale); - public java.lang.String toString(); - public java.lang.String toUpperCase(); - public java.lang.String toUpperCase(java.util.Locale); - public java.lang.String trim(); -} - -# Remove - StringBuffer method calls. Remove all invocations of StringBuffer -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.StringBuffer { - public java.lang.String toString(); - public char charAt(int); - public int capacity(); - public int codePointAt(int); - public int codePointBefore(int); - public int indexOf(java.lang.String,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.String substring(int); - public java.lang.String substring(int,int); -} - -# Remove - StringBuilder method calls. Remove all invocations of StringBuilder -# methods without side effects whose return values are not used. --assumenosideeffects public class java.lang.StringBuilder { - public java.lang.String toString(); - public char charAt(int); - public int capacity(); - public int codePointAt(int); - public int codePointBefore(int); - public int indexOf(java.lang.String,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.String substring(int); - public java.lang.String substring(int,int); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/package.html b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/package.html deleted file mode 100644 index 4eedcc27..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains a GUI for ProGuard and ReTrace. - diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/BufferedSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/BufferedSprite.java deleted file mode 100644 index 6062a9a1..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/BufferedSprite.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; -import java.awt.image.BufferedImage; - -/** - * This Sprite encapsulates another Sprite, which is then buffered in an Image. - * - * @author Eric Lafortune - */ -public class BufferedSprite implements Sprite -{ - private final int bufferX; - private final int bufferY; - private final Image bufferImage; - private final Color backgroundColor; - private final Sprite sprite; - private final VariableInt x; - private final VariableInt y; - - private long cachedTime = -1; - - - /** - * Creates a new BufferedSprite with an ABGR image. - * @param bufferX the x offset of the buffer image. - * @param bufferY the y offset of the buffer image. - * @param width the width of the buffer image. - * @param height the height of the buffer image. - * @param sprite the Sprite that is painted in the buffer. - * @param x the variable x ordinate of the image buffer for painting. - * @param y the variable y ordinate of the image buffer for painting. - * - */ - public BufferedSprite(int bufferX, - int bufferY, - int width, - int height, - Sprite sprite, - VariableInt x, - VariableInt y) - { - - this(bufferX, - bufferY, - new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR), - null, - sprite, - x, - y); - } - - - /** - * Creates a new BufferedSprite with the given image. - * @param bufferX the x offset of the buffer image. - * @param bufferY the y offset of the buffer image. - * @param bufferImage the Image that is used for the buffering. - * @param backgroundColor the background color that is used for the buffer. - * @param sprite the Sprite that is painted in the buffer. - * @param x the variable x ordinate of the image buffer for - * painting. - * @param y the variable y ordinate of the image buffer for - * painting. - */ - public BufferedSprite(int bufferX, - int bufferY, - Image bufferImage, - Color backgroundColor, - Sprite sprite, - VariableInt x, - VariableInt y) - { - this.bufferX = bufferX; - this.bufferY = bufferY; - this.bufferImage = bufferImage; - this.backgroundColor = backgroundColor; - this.sprite = sprite; - this.x = x; - this.y = y; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - if (time != cachedTime) - { - Graphics bufferGraphics = bufferImage.getGraphics(); - - // Clear the background. - if (backgroundColor != null) - { - Graphics2D bufferGraphics2D = (Graphics2D)bufferGraphics; - bufferGraphics2D.setComposite(AlphaComposite.Clear); - bufferGraphics.fillRect(0, 0, bufferImage.getWidth(null), bufferImage.getHeight(null)); - bufferGraphics2D.setComposite(AlphaComposite.Src); - } - else - { - bufferGraphics.setColor(backgroundColor); - bufferGraphics.fillRect(0, 0, bufferImage.getWidth(null), bufferImage.getHeight(null)); - } - - // Set up the buffer graphics. - bufferGraphics.translate(-bufferX, -bufferY); - bufferGraphics.setColor(graphics.getColor()); - bufferGraphics.setFont(graphics.getFont()); - - // Draw the sprite. - sprite.paint(bufferGraphics, time); - - bufferGraphics.dispose(); - - cachedTime = time; - } - - // Draw the buffer image. - graphics.drawImage(bufferImage, - bufferX + x.getInt(time), - bufferY + y.getInt(time), - null); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/CircleSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/CircleSprite.java deleted file mode 100644 index 7113d601..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/CircleSprite.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite represents an animated circle. It can optionally be filled. - * - * @author Eric Lafortune - */ -public class CircleSprite implements Sprite -{ - private final boolean filled; - private final VariableInt x; - private final VariableInt y; - private final VariableInt radius; - - - /** - * Creates a new CircleSprite. - * @param filled specifies whether the rectangle should be filled. - * @param x the variable x-coordinate of the center of the circle. - * @param y the variable y-coordinate of the center of the circle. - * @param radius the variable radius of the circle. - */ - public CircleSprite(boolean filled, - VariableInt x, - VariableInt y, - VariableInt radius) - { - this.filled = filled; - this.x = x; - this.y = y; - this.radius = radius; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - int xt = x.getInt(time); - int yt = y.getInt(time); - int r = radius.getInt(time); - - if (filled) - { - graphics.fillOval(xt - r, yt - r, 2 * r, 2 * r); - } - else - { - graphics.drawOval(xt - r, yt - r, 2 * r, 2 * r); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ClipSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ClipSprite.java deleted file mode 100644 index 5494481c..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ClipSprite.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite encapsulates another Sprite, which is clipped by a clip Sprite. - * - * @author Eric Lafortune - */ -public class ClipSprite implements Sprite -{ - private final VariableColor insideClipColor; - private final VariableColor outsideClipColor; - private final Sprite clipSprite; - private final Sprite sprite; - - - /** - * Creates a new ClipSprite. - * @param insideClipColor the background color inside the clip sprite. - * @param outsideClipColor the background color outside the clip sprite. - * @param clipSprite the clip Sprite. - * @param sprite the clipped Sprite. - */ - public ClipSprite(VariableColor insideClipColor, - VariableColor outsideClipColor, - Sprite clipSprite, - Sprite sprite) - { - this.insideClipColor = insideClipColor; - this.outsideClipColor = outsideClipColor; - this.clipSprite = clipSprite; - this.sprite = sprite; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - // Clear the background. - Color outsideColor = outsideClipColor.getColor(time); - Rectangle clip = graphics.getClipBounds(); - graphics.setPaintMode(); - graphics.setColor(outsideColor); - graphics.fillRect(0, 0, clip.width, clip.height); - - // Draw the sprite in XOR mode. - OverrideGraphics2D g = new OverrideGraphics2D((Graphics2D)graphics); - Color insideColor = insideClipColor.getColor(time); - g.setOverrideXORMode(insideColor); - sprite.paint(g, time); - g.setOverrideXORMode(null); - - // Clear the clip area. - g.setOverrideColor(insideColor); - clipSprite.paint(g, time); - g.setOverrideColor(null); - - // Draw the sprite in XOR mode. - g.setOverrideXORMode(insideColor); - sprite.paint(g, time); - g.setOverrideXORMode(null); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ColorSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ColorSprite.java deleted file mode 100644 index bd088f68..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ColorSprite.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite colors another given sprite. - * - * @author Eric Lafortune - */ -public class ColorSprite implements Sprite -{ - private final VariableColor color; - private final Sprite sprite; - - - /** - * Creates a new ColorSprite. - * @param color the variable color of the given sprite. - * @param sprite the sprite that will be colored and painted. - */ - public ColorSprite(VariableColor color, - Sprite sprite) - { - this.color = color; - this.sprite = sprite; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - // Save the old color. - Color oldColor = graphics.getColor(); - - // Set the new color. - graphics.setColor(color.getColor(time)); - - // Paint the actual sprite. - sprite.paint(graphics, time); - - // Restore the old color. - graphics.setColor(oldColor); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/CompositeSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/CompositeSprite.java deleted file mode 100644 index 98c1b3f3..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/CompositeSprite.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite is the composition of a list of Sprite objects. - * - * @author Eric Lafortune - */ -public class CompositeSprite implements Sprite -{ - private final Sprite[] sprites; - - - /** - * Creates a new CompositeSprite. - * @param sprites the array of Sprite objects to which the painting will - * be delegated, starting with the first element. - */ - public CompositeSprite(Sprite[] sprites) - { - this.sprites = sprites; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - // Draw the sprites. - for (int index = 0; index < sprites.length; index++) - { - sprites[index].paint(graphics, time); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantColor.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantColor.java deleted file mode 100644 index c6109229..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantColor.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This VariableColor is constant over time. - * - * @author Eric Lafortune - */ -public class ConstantColor implements VariableColor -{ - private final Color value; - - - /** - * Creates a new ConstantColor. - * @param value the constant value. - */ - public ConstantColor(Color value) - { - this.value = value; - } - - - // Implementation for VariableColor. - - public Color getColor(long time) - { - return value; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantDouble.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantDouble.java deleted file mode 100644 index 7cdbed85..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantDouble.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This VariableDouble is constant over time. - * - * @author Eric Lafortune - */ -public class ConstantDouble implements VariableDouble -{ - private final double value; - - - /** - * Creates a new ConstantDouble. - * @param value the constant value. - */ - public ConstantDouble(double value) - { - this.value = value; - } - - - // Implementation for VariableDouble. - - public double getDouble(long time) - { - return value; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantFont.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantFont.java deleted file mode 100644 index d0970935..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantFont.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This VariableFont is constant over time. - * - * @author Eric Lafortune - */ -public class ConstantFont implements VariableFont -{ - private final Font value; - - public ConstantFont(Font value) - { - this.value = value; - } - - - // Implementation for VariableFont. - - public Font getFont(long time) - { - return value; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantInt.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantInt.java deleted file mode 100644 index 982d7c89..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantInt.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This VariableInt is constant over time. - * - * @author Eric Lafortune - */ -public class ConstantInt implements VariableInt -{ - private final int value; - - - /** - * Creates a new ConstantInt. - * @param value the constant value. - */ - public ConstantInt(int value) - { - this.value = value; - } - - - // Implementation for VariableInt. - - public int getInt(long time) - { - return value; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantString.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantString.java deleted file mode 100644 index 00c82504..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantString.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This VariableString is constant over time. - * - * @author Eric Lafortune - */ -public class ConstantString implements VariableString -{ - private final String value; - - - /** - * Creates a new ConstantString. - * @param value the constant value. - */ - public ConstantString(String value) - { - this.value = value; - } - - - // Implementation for VariableString. - - public String getString(long time) - { - return value; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantTiming.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantTiming.java deleted file mode 100644 index a7a6a3ec..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ConstantTiming.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This Timing is constant over time. - * - * @author Eric Lafortune - */ -public class ConstantTiming implements Timing -{ - private final double timing; - - - /** - * Creates a new ConstantTiming with a value of 0. - */ - public ConstantTiming() - { - this(0.0); - } - - /** - * Creates a new ConstantTiming with a given value. - * @param timing the constant value of the timing. - */ - public ConstantTiming(double timing) - { - this.timing = timing; - } - - - // Implementation for Timing. - - public double getTiming(long time) - { - return timing; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/FontSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/FontSprite.java deleted file mode 100644 index f9582559..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/FontSprite.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite sets the font for another given sprite. - * - * @author Eric Lafortune - */ -public class FontSprite implements Sprite -{ - private final VariableFont font; - private final Sprite sprite; - - - /** - * Creates a new FontSprite. - * @param font the variable Font of the given sprite. - * @param sprite the sprite that will be provided of a font and painted. - */ - public FontSprite(VariableFont font, - Sprite sprite) - { - this.font = font; - this.sprite = sprite; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - // Save the old font. - Font oldFont = graphics.getFont(); - - // Set the new font. - graphics.setFont(font.getFont(time)); - - // Paint the actual sprite. - sprite.paint(graphics, time); - - // Restore the old font. - graphics.setFont(oldFont); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ImageSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ImageSprite.java deleted file mode 100644 index e4a75863..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ImageSprite.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite represents an animated image. - * - * @author Eric Lafortune - */ -public class ImageSprite implements Sprite -{ - private final Image image; - private final VariableInt x; - private final VariableInt y; - private final VariableDouble scaleX; - private final VariableDouble scaleY; - - - /** - * Creates a new ImageSprite. - * @param image the Image to be painted. - * @param x the variable x-coordinate of the upper-left corner of the image. - * @param y the variable y-coordinate of the upper-left corner of the image. - * @param scaleX the variable x-scale of the image. - * @param scaleY the variable y-scale of the image. - */ - public ImageSprite(Image image, - VariableInt x, - VariableInt y, - VariableDouble scaleX, - VariableDouble scaleY) - { - this.image = image; - this.x = x; - this.y = y; - this.scaleX = scaleX; - this.scaleY = scaleY; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - int xt = x.getInt(time); - int yt = y.getInt(time); - - double scale_x = scaleX.getDouble(time); - double scale_y = scaleY.getDouble(time); - - int width = (int)(image.getWidth(null) * scale_x); - int height = (int)(image.getHeight(null) * scale_y); - - graphics.drawImage(image, xt, yt, width, height, null); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearColor.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearColor.java deleted file mode 100644 index 8426d3dd..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearColor.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This VariableColor varies linearly with respect to its Timing. - * - * @author Eric Lafortune - */ -public class LinearColor implements VariableColor -{ - private final Color fromValue; - private final Color toValue; - private final Timing timing; - - private double cachedTiming = -1.0; - private Color cachedColor; - - - /** - * Creates a new LinearColor. - * @param fromValue the value that corresponds to a timing of 0. - * @param toValue the value that corresponds to a timing of 1. - * @param timing the applied timing. - */ - public LinearColor(Color fromValue, Color toValue, Timing timing) - { - this.fromValue = fromValue; - this.toValue = toValue; - this.timing = timing; - } - - - // Implementation for VariableColor. - - public Color getColor(long time) - { - double t = timing.getTiming(time); - if (t != cachedTiming) - { - cachedTiming = t; - cachedColor = - t == 0.0 ? fromValue : - t == 1.0 ? toValue : - new Color((int)(fromValue.getRed() + t * (toValue.getRed() - fromValue.getRed())), - (int)(fromValue.getGreen() + t * (toValue.getGreen() - fromValue.getGreen())), - (int)(fromValue.getBlue() + t * (toValue.getBlue() - fromValue.getBlue()))); - } - - return cachedColor; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearDouble.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearDouble.java deleted file mode 100644 index 15155432..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearDouble.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This VariableDouble varies linearly with respect to its Timing. - * - * @author Eric Lafortune - */ -public class LinearDouble implements VariableDouble -{ - private final double fromValue; - private final double toValue; - private final Timing timing; - - - /** - * Creates a new LinearDouble. - * @param fromValue the value that corresponds to a timing of 0. - * @param toValue the value that corresponds to a timing of 1. - * @param timing the applied timing. - */ - public LinearDouble(double fromValue, double toValue, Timing timing) - { - this.fromValue = fromValue; - this.toValue = toValue; - this.timing = timing; - } - - - // Implementation for VariableDouble. - - public double getDouble(long time) - { - return fromValue + timing.getTiming(time) * (toValue - fromValue); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearInt.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearInt.java deleted file mode 100644 index 535b3202..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearInt.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This VariableColor varies linearly with respect to its Timing. - * - * @author Eric Lafortune - */ -public class LinearInt implements VariableInt -{ - private final int fromValue; - private final int toValue; - private final Timing timing; - - - /** - * Creates a new LinearInt. - * @param fromValue the value that corresponds to a timing of 0. - * @param toValue the value that corresponds to a timing of 1. - * @param timing the applied timing. - */ - public LinearInt(int fromValue, int toValue, Timing timing) - { - this.fromValue = fromValue; - this.toValue = toValue; - this.timing = timing; - } - - - // Implementation for VariableInt. - - public int getInt(long time) - { - return (int) (fromValue + timing.getTiming(time) * (toValue - fromValue)); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearTiming.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearTiming.java deleted file mode 100644 index 26445092..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/LinearTiming.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This Timing ramps up linearly from 0 to 1 in a given time interval. - * - * @author Eric Lafortune - */ -public class LinearTiming implements Timing -{ - private final long fromTime; - private final long toTime; - - - /** - * Creates a new LinearTiming. - * @param fromTime the time at which the timing starts ramping up from 0. - * @param toTime the time at which the timing stops ramping up at 1. - */ - public LinearTiming(long fromTime, long toTime) - { - this.fromTime = fromTime; - this.toTime = toTime; - } - - - // Implementation for Timing. - - public double getTiming(long time) - { - // Compute the clamped linear interpolation. - return time <= fromTime ? 0.0 : - time >= toTime ? 1.0 : - (double)(time - fromTime) / (double)(toTime - fromTime); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/OverrideGraphics2D.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/OverrideGraphics2D.java deleted file mode 100644 index 60cab2e5..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/OverrideGraphics2D.java +++ /dev/null @@ -1,598 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; -import java.awt.RenderingHints.Key; -import java.awt.font.*; -import java.awt.geom.AffineTransform; -import java.awt.image.*; -import java.awt.image.renderable.RenderableImage; -import java.text.AttributedCharacterIterator; -import java.util.Map; - -/** - * This Graphics2D allows to fix some basic settings (Color, Font, Paint, Stroke, - * XORMode) of a delegate Graphics2D, overriding any subsequent attempts to - * change those settings. - * - * @author Eric Lafortune - * @noinspection deprecation - */ -final class OverrideGraphics2D extends Graphics2D -{ - private final Graphics2D graphics; - - private Color overrideColor; - private Font overrideFont; - private Paint overridePaint; - private Stroke overrideStroke; - private Color overrideXORMode; - - private Color color; - private Font font; - private Paint paint; - private Stroke stroke; - - - /** - * Creates a new OverrideGraphics2D. - * @param graphics the delegate Graphics2D. - */ - public OverrideGraphics2D(Graphics2D graphics) - { - this.graphics = graphics; - this.color = graphics.getColor(); - this.font = graphics.getFont(); - this.paint = graphics.getPaint(); - this.stroke = graphics.getStroke(); - } - - - /** - * Fixes the Color of the Graphics2D. - * - * @param color the fixed Color, or null to undo the fixing. - */ - public void setOverrideColor(Color color) - { - this.overrideColor = color; - graphics.setColor(color != null ? color : this.color); - } - - /** - * Fixes the Font of the Graphics2D. - * - * @param font the fixed Font, or null to undo the fixing. - */ - public void setOverrideFont(Font font) - { - this.overrideFont = font; - graphics.setFont(font != null ? font : this.font); - } - - /** - * Fixes the Paint of the Graphics2D. - * - * @param paint the fixed Paint, or null to undo the fixing. - */ - public void setOverridePaint(Paint paint) - { - this.overridePaint = paint; - graphics.setPaint(paint != null ? paint : this.paint); - } - - /** - * Fixes the Stroke of the Graphics2D. - * - * @param stroke the fixed Stroke, or null to undo the fixing. - */ - public void setOverrideStroke(Stroke stroke) - { - this.overrideStroke = stroke; - graphics.setStroke(stroke != null ? stroke : this.stroke); - } - - /** - * Fixes the XORMode of the Graphics2D. - * - * @param color the fixed XORMode Color, or null to undo the fixing. - */ - public void setOverrideXORMode(Color color) - { - this.overrideXORMode = color; - if (color != null) - { - graphics.setXORMode(color); - } - else - { - graphics.setPaintMode(); - } - } - - - // Implementations for Graphics2D. - - public void setColor(Color color) - { - this.color = color; - if (overrideColor == null) - { - graphics.setColor(color); - } - } - - public void setFont(Font font) - { - this.font = font; - if (overrideFont == null) - { - graphics.setFont(font); - } - } - - public void setPaint(Paint paint) - { - this.paint = paint; - if (overridePaint == null) - { - graphics.setPaint(paint); - } - } - - public void setStroke(Stroke stroke) - { - this.stroke = stroke; - if (overrideStroke == null) - { - graphics.setStroke(stroke); - } - } - - public void setXORMode(Color color) - { - if (overrideXORMode == null) - { - graphics.setXORMode(color); - } - } - - public void setPaintMode() - { - if (overrideXORMode == null) - { - graphics.setPaintMode(); - } - } - - - public Color getColor() - { - return overrideColor != null ? color : graphics.getColor(); - } - - public Font getFont() - { - return overrideFont != null ? font : graphics.getFont(); - } - - public Paint getPaint() - { - return overridePaint != null ? paint : graphics.getPaint(); - } - - public Stroke getStroke() - { - return overrideStroke != null ? stroke : graphics.getStroke(); - } - - - public Graphics create() - { - OverrideGraphics2D g = new OverrideGraphics2D((Graphics2D)graphics.create()); - g.setOverrideColor(overrideColor); - g.setOverrideFont(overrideFont); - g.setOverridePaint(overridePaint); - g.setOverrideStroke(overrideStroke); - - return g; - } - - public Graphics create(int x, int y, int width, int height) - { - OverrideGraphics2D g = new OverrideGraphics2D((Graphics2D)graphics.create(x, y, width, height)); - g.setOverrideColor(overrideColor); - g.setOverrideFont(overrideFont); - g.setOverridePaint(overridePaint); - g.setOverrideStroke(overrideStroke); - - return g; - } - - - // Delegation for Graphics2D - - public void addRenderingHints(Map hints) - { - graphics.addRenderingHints(hints); - } - - public void clearRect(int x, int y, int width, int height) - { - graphics.clearRect(x, y, width, height); - } - - public void clip(Shape s) - { - graphics.clip(s); - } - - public void clipRect(int x, int y, int width, int height) - { - graphics.clipRect(x, y, width, height); - } - - public void copyArea(int x, int y, int width, int height, int dx, int dy) - { - graphics.copyArea(x, y, width, height, dx, dy); - } - - public void dispose() - { - graphics.dispose(); - } - - public void draw(Shape s) - { - graphics.draw(s); - } - - public void draw3DRect(int x, int y, int width, int height, boolean raised) - { - graphics.draw3DRect(x, y, width, height, raised); - } - - public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) - { - graphics.drawArc(x, y, width, height, startAngle, arcAngle); - } - - public void drawBytes(byte[] data, int offset, int length, int x, int y) - { - graphics.drawBytes(data, offset, length, x, y); - } - - public void drawChars(char[] data, int offset, int length, int x, int y) - { - graphics.drawChars(data, offset, length, x, y); - } - - public void drawGlyphVector(GlyphVector g, float x, float y) - { - graphics.drawGlyphVector(g, x, y); - } - - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) - { - return graphics.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer); - } - - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) - { - return graphics.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); - } - - public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) - { - return graphics.drawImage(img, x, y, width, height, bgcolor, observer); - } - - public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) - { - return graphics.drawImage(img, x, y, width, height, observer); - } - - public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) - { - return graphics.drawImage(img, x, y, bgcolor, observer); - } - - public boolean drawImage(Image img, int x, int y, ImageObserver observer) - { - return graphics.drawImage(img, x, y, observer); - } - - public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) - { - return graphics.drawImage(img, xform, obs); - } - - public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) - { - graphics.drawImage(img, op, x, y); - } - - public void drawLine(int x1, int y1, int x2, int y2) - { - graphics.drawLine(x1, y1, x2, y2); - } - - public void drawOval(int x, int y, int width, int height) - { - graphics.drawOval(x, y, width, height); - } - - public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) - { - graphics.drawPolygon(xPoints, yPoints, nPoints); - } - - public void drawPolygon(Polygon p) - { - graphics.drawPolygon(p); - } - - public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) - { - graphics.drawPolyline(xPoints, yPoints, nPoints); - } - - public void drawRect(int x, int y, int width, int height) - { - graphics.drawRect(x, y, width, height); - } - - public void drawRenderableImage(RenderableImage img, AffineTransform xform) - { - graphics.drawRenderableImage(img, xform); - } - - public void drawRenderedImage(RenderedImage img, AffineTransform xform) - { - graphics.drawRenderedImage(img, xform); - } - - public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) - { - graphics.drawRoundRect(x, y, width, height, arcWidth, arcHeight); - } - - public void drawString(String s, float x, float y) - { - graphics.drawString(s, x, y); - } - - public void drawString(String str, int x, int y) - { - graphics.drawString(str, x, y); - } - - public void drawString(AttributedCharacterIterator iterator, float x, float y) - { - graphics.drawString(iterator, x, y); - } - - public void drawString(AttributedCharacterIterator iterator, int x, int y) - { - graphics.drawString(iterator, x, y); - } - - public boolean equals(Object obj) - { - return graphics.equals(obj); - } - - public void fill(Shape s) - { - graphics.fill(s); - } - - public void fill3DRect(int x, int y, int width, int height, boolean raised) - { - graphics.fill3DRect(x, y, width, height, raised); - } - - public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) - { - graphics.fillArc(x, y, width, height, startAngle, arcAngle); - } - - public void fillOval(int x, int y, int width, int height) - { - graphics.fillOval(x, y, width, height); - } - - public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) - { - graphics.fillPolygon(xPoints, yPoints, nPoints); - } - - public void fillPolygon(Polygon p) - { - graphics.fillPolygon(p); - } - - public void fillRect(int x, int y, int width, int height) - { - graphics.fillRect(x, y, width, height); - } - - public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) - { - graphics.fillRoundRect(x, y, width, height, arcWidth, arcHeight); - } - - public Color getBackground() - { - return graphics.getBackground(); - } - - public Shape getClip() - { - return graphics.getClip(); - } - - public Rectangle getClipBounds() - { - return graphics.getClipBounds(); - } - - public Rectangle getClipBounds(Rectangle r) - { - return graphics.getClipBounds(r); - } - - public Rectangle getClipRect() - { - return graphics.getClipRect(); - } - - public Composite getComposite() - { - return graphics.getComposite(); - } - - public GraphicsConfiguration getDeviceConfiguration() - { - return graphics.getDeviceConfiguration(); - } - - public FontMetrics getFontMetrics() - { - return graphics.getFontMetrics(); - } - - public FontMetrics getFontMetrics(Font f) - { - return graphics.getFontMetrics(f); - } - - public FontRenderContext getFontRenderContext() - { - return graphics.getFontRenderContext(); - } - - public Object getRenderingHint(Key hintKey) - { - return graphics.getRenderingHint(hintKey); - } - - public RenderingHints getRenderingHints() - { - return graphics.getRenderingHints(); - } - - public AffineTransform getTransform() - { - return graphics.getTransform(); - } - - public int hashCode() - { - return graphics.hashCode(); - } - - public boolean hit(Rectangle rect, Shape s, boolean onStroke) - { - return graphics.hit(rect, s, onStroke); - } - - public boolean hitClip(int x, int y, int width, int height) - { - return graphics.hitClip(x, y, width, height); - } - - public void rotate(double theta) - { - graphics.rotate(theta); - } - - public void rotate(double theta, double x, double y) - { - graphics.rotate(theta, x, y); - } - - public void scale(double sx, double sy) - { - graphics.scale(sx, sy); - } - - public void setBackground(Color color) - { - graphics.setBackground(color); - } - - public void setClip(int x, int y, int width, int height) - { - graphics.setClip(x, y, width, height); - } - - public void setClip(Shape clip) - { - graphics.setClip(clip); - } - - public void setComposite(Composite comp) - { - graphics.setComposite(comp); - } - - public void setRenderingHint(Key hintKey, Object hintValue) - { - graphics.setRenderingHint(hintKey, hintValue); - } - - public void setRenderingHints(Map hints) - { - graphics.setRenderingHints(hints); - } - - public void setTransform(AffineTransform Tx) - { - graphics.setTransform(Tx); - } - - public void shear(double shx, double shy) - { - graphics.shear(shx, shy); - } - - public String toString() - { - return graphics.toString(); - } - - public void transform(AffineTransform Tx) - { - graphics.transform(Tx); - } - - public void translate(double tx, double ty) - { - graphics.translate(tx, ty); - } - - public void translate(int x, int y) - { - graphics.translate(x, y); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/RectangleSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/RectangleSprite.java deleted file mode 100644 index bd1e210f..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/RectangleSprite.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite represents an animated rounded rectangle. It can optionally be filled. - * - * @author Eric Lafortune - */ -public class RectangleSprite implements Sprite -{ - private final boolean filled; - private final VariableColor color; - private final VariableInt x; - private final VariableInt y; - private final VariableInt width; - private final VariableInt height; - private final VariableInt arcWidth; - private final VariableInt arcHeight; - - - /** - * Creates a new rectangular RectangleSprite. - * @param filled specifies whether the rectangle should be filled. - * @param color the variable color of the rectangle. - * @param x the variable x-ordinate of the upper-left corner of the rectangle. - * @param y the variable y-ordinate of the upper-left corner of the rectangle. - * @param width the variable width of the rectangle. - * @param height the variable height of the rectangle. - */ - public RectangleSprite(boolean filled, - VariableColor color, - VariableInt x, - VariableInt y, - VariableInt width, - VariableInt height) - { - this(filled, color, x, y, width, height, new ConstantInt(0), new ConstantInt(0)); - } - - - /** - * Creates a new RectangleSprite with rounded corners. - * @param filled specifies whether the rectangle should be filled. - * @param color the variable color of the rectangle. - * @param x the variable x-ordinate of the upper-left corner of the rectangle. - * @param y the variable y-ordinate of the upper-left corner of the rectangle. - * @param width the variable width of the rectangle. - * @param height the variable height of the rectangle. - * @param arcWidth the variable width of the corner arcs. - * @param arcHeight the variable height of the corner arcs. - */ - public RectangleSprite(boolean filled, - VariableColor color, - VariableInt x, - VariableInt y, - VariableInt width, - VariableInt height, - VariableInt arcWidth, - VariableInt arcHeight) - { - this.filled = filled; - this.color = color; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.arcWidth = arcWidth; - this.arcHeight = arcHeight; - } - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - graphics.setColor(color.getColor(time)); - - int xt = x.getInt(time); - int yt = y.getInt(time); - int w = width.getInt(time); - int h = height.getInt(time); - int aw = arcWidth.getInt(time); - int ah = arcHeight.getInt(time); - - if (filled) - { - graphics.fillRoundRect(xt, yt, w, h, aw, ah); - } - else - { - graphics.drawRoundRect(xt, yt, w, h, aw, ah); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SawToothTiming.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SawToothTiming.java deleted file mode 100644 index 9ace30db..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SawToothTiming.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This Timing ramps up linearly from 0 to 1 in a given repeated time interval. - * - * @author Eric Lafortune - */ -public class SawToothTiming implements Timing -{ - private final long period; - private final long phase; - - - /** - * Creates a new SawToothTiming. - * @param period the time period for a full cycle. - * @param phase the phase of the cycle, which is added to the actual time. - */ - public SawToothTiming(long period, long phase) - { - this.period = period; - this.phase = phase; - } - - - // Implementation for Timing. - - public double getTiming(long time) - { - // Compute the translated and scaled saw-tooth function. - return (double)((time + phase) % period) / (double)period; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ShadowedSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ShadowedSprite.java deleted file mode 100644 index 3687e2c0..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/ShadowedSprite.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite adds a drop shadow to another Sprite. - * - * @author Eric Lafortune - */ -public class ShadowedSprite implements Sprite -{ - private final VariableInt xOffset; - private final VariableInt yOffset; - private final VariableDouble alpha; - private final VariableInt blur; - private final Sprite sprite; - - private float cachedAlpha = -1.0f; - private Color cachedColor; - - - /** - * Creates a new ShadowedSprite. - * @param xOffset the variable x-offset of the shadow, relative to the sprite itself. - * @param yOffset the variable y-offset of the shadow, relative to the sprite itself. - * @param alpha the variable darkness of the shadow (between 0 and 1). - * @param blur the variable blur of the shadow (0 for sharp shadows, 1 or - * more for increasingly blurry shadows). - * @param sprite the Sprite to be painted with its shadow. - */ - public ShadowedSprite(VariableInt xOffset, - VariableInt yOffset, - VariableDouble alpha, - VariableInt blur, - Sprite sprite) - { - this.xOffset = xOffset; - this.yOffset = yOffset; - this.alpha = alpha; - this.blur = blur; - this.sprite = sprite; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - double l = alpha.getDouble(time); - int b = blur.getInt(time) + 1; - - float a = 1.0f - (float)Math.pow(1.0 - l, 1.0/(b*b)); - if (a != cachedAlpha) - { - cachedAlpha = a; - cachedColor = new Color(0f, 0f, 0f, a); - } - - // Set up the shadow graphics. - //OverrideGraphics2D g = new OverrideGraphics2D((Graphics2D)graphics); - //g.setOverrideColor(cachedColor); - - // Set the shadow color. - Color actualColor = graphics.getColor(); - graphics.setColor(cachedColor); - - int xo = xOffset.getInt(time) - b/2; - int yo = yOffset.getInt(time) - b/2; - - // Draw the sprite's shadow. - for (int x = 0; x < b; x++) - { - for (int y = 0; y < b; y++) - { - int xt = xo + x; - int yt = yo + y; - graphics.translate(xt, yt); - sprite.paint(graphics, time); - graphics.translate(-xt, -yt); - } - } - - // Restore the actual sprite color. - graphics.setColor(actualColor); - - // Draw the sprite itself in the ordinary graphics. - sprite.paint(graphics, time); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SineTiming.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SineTiming.java deleted file mode 100644 index 59df0062..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SineTiming.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This Timing varies between 0 and 1, as a sine wave over time. - * - * @author Eric Lafortune - */ -public class SineTiming implements Timing -{ - private final long period; - private final long phase; - - - /** - * Creates a new SineTiming. - * @param period the time period for a full cycle. - * @param phase the phase of the cycle, which is added to the actual time. - */ - public SineTiming(long period, long phase) - { - this.period = period; - this.phase = phase; - } - - - // Implementation for Timing. - - public double getTiming(long time) - { - // Compute the translated and scaled sine function. - return 0.5 + 0.5 * Math.sin(2.0 * Math.PI * (time + phase) / period); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SmoothTiming.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SmoothTiming.java deleted file mode 100644 index b7478562..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SmoothTiming.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This Timing ramps up smoothly from 0 to 1 in a given time interval. - * - * @author Eric Lafortune - */ -public class SmoothTiming implements Timing -{ - private final long fromTime; - private final long toTime; - - - /** - * Creates a new SmoothTiming. - * @param fromTime the time at which the timing starts ramping up from 0. - * @param toTime the time at which the timing stops ramping up at 1. - */ - public SmoothTiming(long fromTime, long toTime) - { - this.fromTime = fromTime; - this.toTime = toTime; - } - - - // Implementation for Timing. - - public double getTiming(long time) - { - if (time <= fromTime) - { - return 0.0; - } - - if (time >= toTime) - { - return 1.0; - } - - // Compute the linear interpolation. - double timing = (double) (time - fromTime) / (double) (toTime - fromTime); - - // Smooth the interpolation at the ends. - return timing * timing * (3.0 - 2.0 * timing); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SplashPanel.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SplashPanel.java deleted file mode 100644 index a8352fc3..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/SplashPanel.java +++ /dev/null @@ -1,235 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import proguard.gui.SwingUtil; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import java.lang.reflect.InvocationTargetException; - -/** - * This JPanel renders an animated Sprite. - * - * @author Eric Lafortune - */ -public class SplashPanel extends JPanel -{ - private final MyAnimator animator = new MyAnimator(); - private final MyRepainter repainter = new MyRepainter(); - - private final Sprite sprite; - private final double sleepFactor; - - private long startTime = Long.MAX_VALUE; - private final long stopTime; - - private volatile Thread animationThread; - - - /** - * Creates a new SplashPanel with the given Sprite, which will be animated - * indefinitely. - * @param sprite the Sprite that will be animated. - * @param processorLoad the fraction of processing time to be spend on - * animating the Sprite (between 0 and 1). - */ - public SplashPanel(Sprite sprite, double processorLoad) - { - this(sprite, processorLoad, (long)Integer.MAX_VALUE); - } - - - /** - * Creates a new SplashPanel with the given Sprite, which will be animated - * for a limited period of time. - * @param sprite the Sprite that will be animated. - * @param processorLoad the fraction of processing time to be spend on - * animating the Sprite (between 0 and 1). - * @param stopTime the number of milliseconds after which the - * animation will be stopped automatically. - */ - public SplashPanel(Sprite sprite, double processorLoad, long stopTime) - { - this.sprite = sprite; - this.sleepFactor = (1.0-processorLoad) / processorLoad; - this.stopTime = stopTime; - - // Restart the animation on a mouse click. - addMouseListener(new MouseAdapter() - { - public void mouseClicked(MouseEvent e) - { - SplashPanel.this.start(); - } - }); - } - - - /** - * Starts the animation. - */ - public void start() - { - // Go to the beginning of the animation. - startTime = System.currentTimeMillis(); - - // Make sure we have an animation thread running. - if (animationThread == null) - { - animationThread = new Thread(animator); - animationThread.start(); - } - } - - - /** - * Stops the animation. - */ - public void stop() - { - // Go to the end of the animation. - startTime = 0L; - - // Let the animation thread stop itself. - animationThread = null; - - // Repaint the SplashPanel one last time. - try - { - SwingUtil.invokeAndWait(repainter); - } - catch (InterruptedException ex) - { - // Nothing. - } - catch (InvocationTargetException ex) - { - // Nothing. - } - } - - - // Implementation for JPanel. - - public void paintComponent(Graphics graphics) - { - super.paintComponent(graphics); - - sprite.paint(graphics, System.currentTimeMillis() - startTime); - } - - - /** - * This Runnable makes sure its SplashPanel gets repainted regularly, - * depending on the targeted processor load. - */ - private class MyAnimator implements Runnable - { - public void run() - { - try - { - while (animationThread != null) - { - // Check if we should stop the animation. - long time = System.currentTimeMillis(); - if (time > startTime + stopTime) - { - animationThread = null; - } - - // Do a repaint and time it. - SwingUtil.invokeAndWait(repainter); - - // Sleep for a proportional while. - long repaintTime = System.currentTimeMillis() - time; - long sleepTime = (long)(sleepFactor * repaintTime); - if (sleepTime < 10L) - { - sleepTime = 10L; - } - - Thread.sleep(sleepTime); - } - } - catch (InterruptedException ex) - { - // Nothing. - } - catch (InvocationTargetException ex) - { - // Nothing. - } - } - } - - - /** - * This Runnable repaints its SplashPanel. - */ - private class MyRepainter implements Runnable - { - public void run() - { - SplashPanel.this.repaint(); - } - } - - - /** - * A main method for testing the splash panel. - */ - public static void main(String[] args) - { - JFrame frame = new JFrame(); - frame.setTitle("Animation"); - frame.setSize(800, 600); - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension frameSize = frame.getSize(); - frame.setLocation((screenSize.width - frameSize.width) / 2, - (screenSize.height - frameSize.height) / 2); - - Sprite sprite = - new ClipSprite( - new ConstantColor(Color.white), - new ConstantColor(Color.lightGray), - new CircleSprite(true, - new LinearInt(200, 600, new SineTiming(2345L, 0L)), - new LinearInt(200, 400, new SineTiming(3210L, 0L)), - new ConstantInt(150)), - new ColorSprite(new ConstantColor(Color.gray), - new FontSprite(new ConstantFont(new Font("sansserif", Font.BOLD, 90)), - new TextSprite(new ConstantString("ProGuard"), - new ConstantInt(200), - new ConstantInt(300))))); - - SplashPanel panel = new SplashPanel(sprite, 0.5); - panel.setBackground(Color.white); - - frame.getContentPane().add(panel); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setVisible(true); - - panel.start(); - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/Sprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/Sprite.java deleted file mode 100644 index 920cb584..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/Sprite.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This interface describes objects that can paint themselves, possibly varying - * as a function of time. - * - * @author Eric Lafortune - */ -public interface Sprite -{ - /** - * Paints the object. - * - * @param graphics the Graphics to paint on. - * @param time the time since the start of the animation, expressed in - * milliseconds. - */ - public void paint(Graphics graphics, long time); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TextSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TextSprite.java deleted file mode 100644 index a63d8eec..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TextSprite.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite represents a text. - * - * @author Eric Lafortune - */ -public class TextSprite implements Sprite -{ - private final VariableString[] text; - private final VariableInt spacing; - private final VariableInt x; - private final VariableInt y; - - - /** - * Creates a new TextSprite containing a single line of text. - * @param text the variable text string. - * @param x the variable x-coordinate of the lower-left corner of the text. - * @param y the variable y-coordinate of the lower-left corner of the text. - */ - public TextSprite(VariableString text, - VariableInt x, - VariableInt y) - { - this(new VariableString[] { text }, new ConstantInt(0), x, y); - } - - - /** - * Creates a new TextSprite containing a multiple lines of text. - * @param text the variable text strings. - * @param spacing the variable spacing between the lines of text. - * @param x the variable x-coordinate of the lower-left corner of the - * first line of text. - * @param y the variable y-coordinate of the lower-left corner of the - * first line of text. - */ - public TextSprite(VariableString[] text, - VariableInt spacing, - VariableInt x, - VariableInt y) - { - - this.text = text; - this.spacing = spacing; - this.x = x; - this.y = y; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - - int xt = x.getInt(time); - int yt = y.getInt(time); - - int spacingt = spacing.getInt(time); - - for (int index = 0; index < text.length; index++) - { - graphics.drawString(text[index].getString(time), xt, yt + index * spacingt); - } - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TimeSwitchSprite.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TimeSwitchSprite.java deleted file mode 100644 index 95f1bd2a..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TimeSwitchSprite.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This Sprite displays another Sprite in a given time interval. - * The time of the encapsulated Sprite is shifted by the start time. - * - * @author Eric Lafortune - */ -public class TimeSwitchSprite implements Sprite -{ - private final long onTime; - private final long offTime; - private final Sprite sprite; - - - /** - * Creates a new TimeSwitchSprite for displaying a given Sprite starting at - * a given time. - * @param onTime the start time. - * @param sprite the toggled Sprite. - */ - public TimeSwitchSprite(long onTime, Sprite sprite) - { - this(onTime, 0L, sprite); - } - - - /** - * Creates a new TimeSwitchSprite for displaying a given Sprite in a given - * time interval. - * @param onTime the start time. - * @param offTime the stop time. - * @param sprite the toggled Sprite. - */ - public TimeSwitchSprite(long onTime, long offTime, Sprite sprite) - { - this.onTime = onTime; - this.offTime = offTime; - this.sprite = sprite; - } - - - // Implementation for Sprite. - - public void paint(Graphics graphics, long time) - { - if (time >= onTime && (offTime <= 0 || time <= offTime)) - { - sprite.paint(graphics, time - onTime); - } - - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/Timing.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/Timing.java deleted file mode 100644 index 3d91e384..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/Timing.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This interface maps a time to a normalized timing between 0 and 1. - * - * @author Eric Lafortune - */ -interface Timing -{ - /** - * Returns the timing for the given time. - */ - public double getTiming(long time); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TypeWriterString.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TypeWriterString.java deleted file mode 100644 index 0a7cb145..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/TypeWriterString.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This VariableString produces a String that grows linearly with respect to its - * Timing, as if it is being written on a typewriter. A cursor at the end - * precedes the typed characters. - * - * @author Eric Lafortune - */ -public class TypeWriterString implements VariableString -{ - private final String string; - private final Timing timing; - - private int cachedLength = -1; - private String cachedString; - - - /** - * Creates a new TypeWriterString. - * @param string the basic String. - * @param timing the applied timing. - */ - public TypeWriterString(String string, Timing timing) - { - this.string = string; - this.timing = timing; - } - - - // Implementation for VariableString. - - public String getString(long time) - { - double t = timing.getTiming(time); - - int stringLength = string.length(); - int length = (int)(stringLength * t + 0.5); - if (length != cachedLength) - { - cachedLength = length; - cachedString = string.substring(0, length); - if (t > 0.0 && length < stringLength) - { - cachedString += "_"; - } - } - - return cachedString; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableColor.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableColor.java deleted file mode 100644 index 02cd7d1b..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableColor.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This interface represents a Color that varies with time. - * - * @author Eric Lafortune - */ -interface VariableColor -{ - /** - * Returns the Color for the given time. - */ - public Color getColor(long time); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableDouble.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableDouble.java deleted file mode 100644 index 964706b7..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableDouble.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This interface represents a double that varies with time. - * - * @author Eric Lafortune - */ -interface VariableDouble -{ - /** - * Returns the double for the given time. - */ - public double getDouble(long time); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableFont.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableFont.java deleted file mode 100644 index 324684ba..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableFont.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This interface represents a Font that varies with time. - * - * @author Eric Lafortune - */ -interface VariableFont -{ - /** - * Returns the Font for the given time. - */ - public Font getFont(long time); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableInt.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableInt.java deleted file mode 100644 index 46302125..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableInt.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This interface represents an integer that varies with time. - * - * @author Eric Lafortune - */ -interface VariableInt -{ - /** - * Returns the integer for the given time. - */ - public int getInt(long time); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableSizeFont.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableSizeFont.java deleted file mode 100644 index db5d5e9a..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableSizeFont.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -import java.awt.*; - -/** - * This VariableFont varies in size with respect to its Timing. - * - * @author Eric Lafortune - */ -public class VariableSizeFont implements VariableFont -{ - private final Font font; - private final VariableDouble size; - - private float cachedSize = -1.0f; - private Font cachedFont; - - - /** - * Creates a new VariableSizeFont - * @param font the base font. - * @param size the variable size of the font. - */ - public VariableSizeFont(Font font, VariableDouble size) - { - this.font = font; - this.size = size; - } - - - // Implementation for VariableFont. - - public Font getFont(long time) - { - float s = (float)size.getDouble(time); - - if (s != cachedSize) - { - cachedSize = s; - cachedFont = font.deriveFont((float)s); - } - - return cachedFont; - } -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableString.java b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableString.java deleted file mode 100644 index 3849a293..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/VariableString.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.gui.splash; - -/** - * This interface represents a String that varies with time. - * - * @author Eric Lafortune - */ -interface VariableString -{ - /** - * Returns the String for the given time. - */ - public String getString(long time); -} diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/package.html b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/package.html deleted file mode 100644 index 209fad7c..00000000 --- a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/splash/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains a library for creating splash screens and animations -with text, graphical elements, and some special effects. - diff --git a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/vtitle.png b/tools/proguard/proguard6.0.3/gui/src/proguard/gui/vtitle.png deleted file mode 100644 index 218f7162..00000000 Binary files a/tools/proguard/proguard6.0.3/gui/src/proguard/gui/vtitle.png and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/lib/annotations.jar b/tools/proguard/proguard6.0.3/lib/annotations.jar deleted file mode 100644 index 9b21c274..00000000 Binary files a/tools/proguard/proguard6.0.3/lib/annotations.jar and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/lib/proguard.jar b/tools/proguard/proguard6.0.3/lib/proguard.jar deleted file mode 100644 index a09a6071..00000000 Binary files a/tools/proguard/proguard6.0.3/lib/proguard.jar and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/lib/proguardgui.jar b/tools/proguard/proguard6.0.3/lib/proguardgui.jar deleted file mode 100644 index abb9fb53..00000000 Binary files a/tools/proguard/proguard6.0.3/lib/proguardgui.jar and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/lib/retrace.jar b/tools/proguard/proguard6.0.3/lib/retrace.jar deleted file mode 100644 index ff2b7ac2..00000000 Binary files a/tools/proguard/proguard6.0.3/lib/retrace.jar and /dev/null differ diff --git a/tools/proguard/proguard6.0.3/retrace/build.gradle b/tools/proguard/proguard6.0.3/retrace/build.gradle deleted file mode 100644 index 2f102d70..00000000 --- a/tools/proguard/proguard6.0.3/retrace/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -// Gradle build script for ReTrace. - -apply plugin: 'java' - -sourceSets.main { - java { - srcDirs = ['src'] - } - resources { - srcDirs = ['src'] - include '**/*.properties' - include '**/*.gif' - include '**/*.png' - include '**/*.pro' - } -} - -dependencies { - compile project(':core') -} - -jar { - manifest.from 'src/META-INF/MANIFEST.MF' -} diff --git a/tools/proguard/proguard6.0.3/retrace/build.sh b/tools/proguard/proguard6.0.3/retrace/build.sh deleted file mode 100644 index a1a4f60c..00000000 --- a/tools/proguard/proguard6.0.3/retrace/build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for ReTrace. - -cd $(dirname "$0") - -source ../buildscripts/functions.sh - -MAIN_CLASS=proguard.retrace.ReTrace - -# Make sure the ProGuard core has been compiled. -if [ ! -d ../core/$OUT ]; then - ../core/build.sh || exit 1 -fi - -# Compile and package. -export CLASSPATH=../core/$OUT - -compile $MAIN_CLASS && \ -createjar "$RETRACE_JAR" || exit 1 diff --git a/tools/proguard/proguard6.0.3/retrace/build.xml b/tools/proguard/proguard6.0.3/retrace/build.xml deleted file mode 100644 index 7cca0352..00000000 --- a/tools/proguard/proguard6.0.3/retrace/build.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/retrace/makefile b/tools/proguard/proguard6.0.3/retrace/makefile deleted file mode 100644 index 83d21bfd..00000000 --- a/tools/proguard/proguard6.0.3/retrace/makefile +++ /dev/null @@ -1,8 +0,0 @@ -# GNU/Linux makefile for ReTrace. - -MAIN_CLASS = proguard/retrace/ReTrace -CLASSPATH = ../core/$(OUT) -TARGET = retrace -INCLUDE_MANIFEST = true - -include ../buildscripts/functions.mk diff --git a/tools/proguard/proguard6.0.3/retrace/pom.xml b/tools/proguard/proguard6.0.3/retrace/pom.xml deleted file mode 100644 index 1b5f1b22..00000000 --- a/tools/proguard/proguard6.0.3/retrace/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - ../buildscripts/pom.xml - - proguard-retrace - [${project.groupId}] ${project.artifactId} - - - src - - - maven-source-plugin - - - maven-compiler-plugin - - - maven-jar-plugin - - - - true - proguard.retrace.ReTrace - - - - - - maven-javadoc-plugin - - - - - - ${project.groupId} - proguard-base - ${project.version} - - - diff --git a/tools/proguard/proguard6.0.3/retrace/settings.gradle b/tools/proguard/proguard6.0.3/retrace/settings.gradle deleted file mode 100644 index 55d8d75b..00000000 --- a/tools/proguard/proguard6.0.3/retrace/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'core' diff --git a/tools/proguard/proguard6.0.3/retrace/src/META-INF/MANIFEST.MF b/tools/proguard/proguard6.0.3/retrace/src/META-INF/MANIFEST.MF deleted file mode 100644 index 42c9800c..00000000 --- a/tools/proguard/proguard6.0.3/retrace/src/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: proguard.retrace.ReTrace -Class-Path: proguard.jar diff --git a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FrameInfo.java b/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FrameInfo.java deleted file mode 100644 index 5194b44d..00000000 --- a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FrameInfo.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.retrace; - -/** - * This class represents the class name, field name, method name, etc. - * possibly found in a stack frame. Values that are not defined are null. - */ -public class FrameInfo -{ - private final String className; - private final String sourceFile; - private final int lineNumber; - private final String type; - private final String fieldName; - private final String methodName; - private final String arguments; - - - /** - * Creates a new FrameInfo with the given information. - * Any undefined values can be null. - */ - public FrameInfo(String className, - String sourceFile, - int lineNumber, - String type, - String fieldName, - String methodName, - String arguments) - { - this.className = className; - this.sourceFile = sourceFile; - this.lineNumber = lineNumber; - this.type = type; - this.fieldName = fieldName; - this.methodName = methodName; - this.arguments = arguments; - } - - - public String getClassName() - { - return className; - } - - - public String getSourceFile() - { - return sourceFile; - } - - - public int getLineNumber() - { - return lineNumber; - } - - - public String getType() - { - return type; - } - - - public String getFieldName() - { - return fieldName; - } - - - public String getMethodName() - { - return methodName; - } - - - public String getArguments() - { - return arguments; - } - - - // Implementations for Object. - - public String toString() - { - return FrameInfo.class.getName() + "(class=["+className+"], line=["+lineNumber+"], type=["+type+"], field=["+fieldName+"], method=["+methodName+"], arguments=["+arguments+"]"; - } -} diff --git a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FramePattern.java b/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FramePattern.java deleted file mode 100644 index d06ba038..00000000 --- a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FramePattern.java +++ /dev/null @@ -1,303 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.retrace; - -import proguard.classfile.util.ClassUtil; - -import java.util.regex.*; - -/** - * This class can parse and format lines that represent stack frames - * matching a given regular expression. - * - * @author Eric Lafortune - */ -public class FramePattern -{ - // The pattern matcher has problems with \\b against some unicode - // characters, so we're no longer using \\b for classes and class members. - private static final String REGEX_CLASS = "(?:[^\\s\":./()]+\\.)*[^\\s\":./()]+"; - private static final String REGEX_CLASS_SLASH = "(?:[^\\s\":./()]+/)*[^\\s\":./()]+"; - private static final String REGEX_SOURCE_FILE = "[^:()]*"; - private static final String REGEX_LINE_NUMBER = "-?\\b\\d+\\b"; - private static final String REGEX_TYPE = REGEX_CLASS + "(?:\\[\\])*"; - private static final String REGEX_MEMBER = "?"; - private static final String REGEX_ARGUMENTS = "(?:" + REGEX_TYPE + "(?:\\s*,\\s*" + REGEX_TYPE + ")*)?"; - - private final char[] expressionTypes = new char[32]; - private final int expressionTypeCount; - private final Pattern pattern; - private final boolean verbose; - - - /** - * Creates a new FramePattern. - */ - public FramePattern(String regularExpression, boolean verbose) - { - // Construct the regular expression. - StringBuffer expressionBuffer = new StringBuffer(regularExpression.length() + 32); - - int expressionTypeCount = 0; - int index = 0; - while (true) - { - int nextIndex = regularExpression.indexOf('%', index); - if (nextIndex < 0 || - nextIndex == regularExpression.length()-1 || - expressionTypeCount == expressionTypes.length) - { - break; - } - - // Copy a literal piece of the input line. - expressionBuffer.append(regularExpression.substring(index, nextIndex)); - expressionBuffer.append('('); - - char expressionType = regularExpression.charAt(nextIndex + 1); - switch(expressionType) - { - case 'c': - expressionBuffer.append(REGEX_CLASS); - break; - - case 'C': - expressionBuffer.append(REGEX_CLASS_SLASH); - break; - - case 's': - expressionBuffer.append(REGEX_SOURCE_FILE); - break; - - case 'l': - expressionBuffer.append(REGEX_LINE_NUMBER); - break; - - case 't': - expressionBuffer.append(REGEX_TYPE); - break; - - case 'f': - expressionBuffer.append(REGEX_MEMBER); - break; - - case 'm': - expressionBuffer.append(REGEX_MEMBER); - break; - - case 'a': - expressionBuffer.append(REGEX_ARGUMENTS); - break; - } - - expressionBuffer.append(')'); - - expressionTypes[expressionTypeCount++] = expressionType; - - index = nextIndex + 2; - } - - // Copy the last literal piece of the input line. - expressionBuffer.append(regularExpression.substring(index)); - - this.expressionTypeCount = expressionTypeCount; - this.pattern = Pattern.compile(expressionBuffer.toString()); - this.verbose = verbose; - } - - - /** - * Parses all frame information from a given line. - * @param line a line that represents a stack frame. - * @return the parsed information, or null if the line doesn't match a - * stack frame. - */ - public FrameInfo parse(String line) - { - // Try to match it against the regular expression. - Matcher matcher = pattern.matcher(line); - - if (!matcher.matches()) - { - return null; - } - - // The line matched the regular expression. - String className = null; - String sourceFile = null; - int lineNumber = 0; - String type = null; - String fieldName = null; - String methodName = null; - String arguments = null; - - // Extract a class name, a line number, a type, and - // arguments. - for (int expressionTypeIndex = 0; expressionTypeIndex < expressionTypeCount; expressionTypeIndex++) - { - int startIndex = matcher.start(expressionTypeIndex + 1); - if (startIndex >= 0) - { - String match = matcher.group(expressionTypeIndex + 1); - - char expressionType = expressionTypes[expressionTypeIndex]; - switch (expressionType) - { - case 'c': - className = match; - break; - - case 'C': - className = ClassUtil.externalClassName(match); - break; - - case 's': - sourceFile = match; - break; - - case 'l': - lineNumber = Integer.parseInt(match); - break; - - case 't': - type = match; - break; - - case 'f': - fieldName = match; - break; - - case 'm': - methodName = match; - break; - - case 'a': - arguments = match; - break; - } - } - } - - return new FrameInfo(className, - sourceFile, - lineNumber, - type, - fieldName, - methodName, - arguments); - } - - - /** - * Formats the given frame information based on the given template line. - * It is the reverse of {@link #parse(String)}, but optionally with - * different frame information. - * @param line a template line that represents a stack frame. - * @param frameInfo information about a stack frame. - * @return the formatted line, or null if the line doesn't match a - * stack frame. - */ - public String format(String line, FrameInfo frameInfo) - { - // Try to match it against the regular expression. - Matcher matcher = pattern.matcher(line); - - if (!matcher.matches()) - { - return null; - } - - StringBuffer formattedBuffer = new StringBuffer(); - - int lineIndex = 0; - for (int expressionTypeIndex = 0; expressionTypeIndex < expressionTypeCount; expressionTypeIndex++) - { - int startIndex = matcher.start(expressionTypeIndex + 1); - if (startIndex >= 0) - { - int endIndex = matcher.end(expressionTypeIndex + 1); - String match = matcher.group(expressionTypeIndex + 1); - - // Copy a literal piece of the input line. - formattedBuffer.append(line.substring(lineIndex, startIndex)); - - // Copy a matched and translated piece of the input line. - char expressionType = expressionTypes[expressionTypeIndex]; - switch (expressionType) - { - case 'c': - formattedBuffer.append(frameInfo.getClassName()); - break; - - case 'C': - formattedBuffer.append(ClassUtil.internalClassName(frameInfo.getClassName())); - break; - - case 's': - formattedBuffer.append(frameInfo.getSourceFile()); - break; - - case 'l': - formattedBuffer.append(frameInfo.getLineNumber()); - break; - - case 't': - formattedBuffer.append(frameInfo.getType()); - break; - - case 'f': - if (verbose) - { - formattedBuffer.append(frameInfo.getType()).append(' '); - } - formattedBuffer.append(frameInfo.getFieldName()); - break; - - case 'm': - if (verbose) - { - formattedBuffer.append(frameInfo.getType()).append(' '); - } - formattedBuffer.append(frameInfo.getMethodName()); - if (verbose) - { - formattedBuffer.append('(').append(frameInfo.getArguments()).append(')'); - } - break; - - case 'a': - formattedBuffer.append(frameInfo.getArguments()); - break; - } - - // Skip the original element whose replacement value - // has just been appended. - lineIndex = endIndex; - } - } - - // Copy the last literal piece of the input line. - formattedBuffer.append(line.substring(lineIndex)); - - // Return the formatted line. - return formattedBuffer.toString(); - } -} diff --git a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FrameRemapper.java b/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FrameRemapper.java deleted file mode 100644 index 1ad40c0e..00000000 --- a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/FrameRemapper.java +++ /dev/null @@ -1,435 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.retrace; - -import proguard.obfuscate.MappingProcessor; - -import java.util.*; - -/** - * This class accumulates mapping information and then transforms stack frames - * accordingly. - * - * @author Eric Lafortune - */ -public class FrameRemapper implements MappingProcessor -{ - // Obfuscated class name -> original class name. - private final Map classMap = new HashMap(); - - // Original class name -> obfuscated member name -> member info set. - private final Map>> classFieldMap = new HashMap>>(); - private final Map>> classMethodMap = new HashMap>>(); - - - /** - * Transforms the given obfuscated frame back to one or more original frames. - */ - public List transform(FrameInfo obfuscatedFrame) - { - // First remap the class name. - String originalClassName = originalClassName(obfuscatedFrame.getClassName()); - if (originalClassName == null) - { - return null; - } - - List originalFrames = new ArrayList(); - - // Create any transformed frames with remapped field names. - transformFieldInfo(obfuscatedFrame, - originalClassName, - originalFrames); - - // Create any transformed frames with remapped method names. - transformMethodInfo(obfuscatedFrame, - originalClassName, - originalFrames); - - if (originalFrames.isEmpty()) - { - // Create a transformed frame with the remapped class name. - originalFrames.add(new FrameInfo(originalClassName, - sourceFileName(originalClassName), - obfuscatedFrame.getLineNumber(), - obfuscatedFrame.getType(), - obfuscatedFrame.getFieldName(), - obfuscatedFrame.getMethodName(), - obfuscatedFrame.getArguments())); - } - - return originalFrames; - } - - - /** - * Transforms the obfuscated frame into one or more original frames, - * if the frame contains information about a field that can be remapped. - * @param obfuscatedFrame the obfuscated frame. - * @param originalFieldFrames the list in which remapped frames can be - * collected. - */ - private void transformFieldInfo(FrameInfo obfuscatedFrame, - String originalClassName, - List originalFieldFrames) - { - // Class name -> obfuscated field names. - Map> fieldMap = classFieldMap.get(originalClassName); - if (fieldMap != null) - { - // Obfuscated field names -> fields. - String obfuscatedFieldName = obfuscatedFrame.getFieldName(); - Set fieldSet = fieldMap.get(obfuscatedFieldName); - if (fieldSet != null) - { - String obfuscatedType = obfuscatedFrame.getType(); - String originalType = obfuscatedType == null ? null : - originalType(obfuscatedType); - - // Find all matching fields. - Iterator fieldInfoIterator = fieldSet.iterator(); - while (fieldInfoIterator.hasNext()) - { - FieldInfo fieldInfo = fieldInfoIterator.next(); - if (fieldInfo.matches(originalType)) - { - originalFieldFrames.add(new FrameInfo(fieldInfo.originalClassName, - sourceFileName(fieldInfo.originalClassName), - obfuscatedFrame.getLineNumber(), - fieldInfo.originalType, - fieldInfo.originalName, - obfuscatedFrame.getMethodName(), - obfuscatedFrame.getArguments())); - } - } - } - } - } - - - /** - * Transforms the obfuscated frame into one or more original frames, - * if the frame contains information about a method that can be remapped. - * @param obfuscatedFrame the obfuscated frame. - * @param originalMethodFrames the list in which remapped frames can be - * collected. - */ - private void transformMethodInfo(FrameInfo obfuscatedFrame, - String originalClassName, - List originalMethodFrames) - { - // Class name -> obfuscated method names. - Map> methodMap = classMethodMap.get(originalClassName); - if (methodMap != null) - { - // Obfuscated method names -> methods. - String obfuscatedMethodName = obfuscatedFrame.getMethodName(); - Set methodSet = methodMap.get(obfuscatedMethodName); - if (methodSet != null) - { - int obfuscatedLineNumber = obfuscatedFrame.getLineNumber(); - - String obfuscatedType = obfuscatedFrame.getType(); - String originalType = obfuscatedType == null ? null : - originalType(obfuscatedType); - - String obfuscatedArguments = obfuscatedFrame.getArguments(); - String originalArguments = obfuscatedArguments == null ? null : - originalArguments(obfuscatedArguments); - - // Find all matching methods. - Iterator methodInfoIterator = methodSet.iterator(); - while (methodInfoIterator.hasNext()) - { - MethodInfo methodInfo = methodInfoIterator.next(); - if (methodInfo.matches(obfuscatedLineNumber, - originalType, - originalArguments)) - { - // Do we have a different original first line number? - // We're allowing unknown values, represented as 0. - int lineNumber = obfuscatedFrame.getLineNumber(); - if (methodInfo.originalFirstLineNumber != methodInfo.obfuscatedFirstLineNumber) - { - // Do we have an original line number range and - // sufficient information to shift the line number? - lineNumber = methodInfo.originalLastLineNumber != 0 && - methodInfo.originalLastLineNumber != methodInfo.originalFirstLineNumber && - methodInfo.obfuscatedFirstLineNumber != 0 && - lineNumber != 0 ? - methodInfo.originalFirstLineNumber - methodInfo.obfuscatedFirstLineNumber + lineNumber : - methodInfo.originalFirstLineNumber; - } - - originalMethodFrames.add(new FrameInfo(methodInfo.originalClassName, - sourceFileName(methodInfo.originalClassName), - lineNumber, - methodInfo.originalType, - obfuscatedFrame.getFieldName(), - methodInfo.originalName, - methodInfo.originalArguments)); - } - } - } - } - } - - - /** - * Returns the original argument types. - */ - private String originalArguments(String obfuscatedArguments) - { - StringBuilder originalArguments = new StringBuilder(); - - int startIndex = 0; - while (true) - { - int endIndex = obfuscatedArguments.indexOf(',', startIndex); - if (endIndex < 0) - { - break; - } - - originalArguments.append(originalType(obfuscatedArguments.substring(startIndex, endIndex).trim())).append(','); - - startIndex = endIndex + 1; - } - - originalArguments.append(originalType(obfuscatedArguments.substring(startIndex).trim())); - - return originalArguments.toString(); - } - - - /** - * Returns the original type. - */ - private String originalType(String obfuscatedType) - { - int index = obfuscatedType.indexOf('['); - - return index >= 0 ? - originalClassName(obfuscatedType.substring(0, index)) + obfuscatedType.substring(index) : - originalClassName(obfuscatedType); - } - - - /** - * Returns the original class name. - */ - private String originalClassName(String obfuscatedClassName) - { - String originalClassName = classMap.get(obfuscatedClassName); - - return originalClassName != null ? - originalClassName : - obfuscatedClassName; - } - - - /** - * Returns the Java source file name that typically corresponds to the - * given class name. - */ - private String sourceFileName(String className) - { - int index1 = className.lastIndexOf('.') + 1; - int index2 = className.indexOf('$', index1); - - return (index2 > 0 ? - className.substring(index1, index2) : - className.substring(index1)) + - ".java"; - } - - - // Implementations for MappingProcessor. - - public boolean processClassMapping(String className, - String newClassName) - { - // Obfuscated class name -> original class name. - classMap.put(newClassName, className); - - return true; - } - - - public void processFieldMapping(String className, - String fieldType, - String fieldName, - String newClassName, - String newFieldName) - { - // Obfuscated class name -> obfuscated field names. - Map> fieldMap = classFieldMap.get(newClassName); - if (fieldMap == null) - { - fieldMap = new HashMap>(); - classFieldMap.put(newClassName, fieldMap); - } - - // Obfuscated field name -> fields. - Set fieldSet = fieldMap.get(newFieldName); - if (fieldSet == null) - { - fieldSet = new LinkedHashSet(); - fieldMap.put(newFieldName, fieldSet); - } - - // Add the field information. - fieldSet.add(new FieldInfo(className, - fieldType, - fieldName)); - } - - - public void processMethodMapping(String className, - int firstLineNumber, - int lastLineNumber, - String methodReturnType, - String methodName, - String methodArguments, - String newClassName, - int newFirstLineNumber, - int newLastLineNumber, - String newMethodName) - { - // Original class name -> obfuscated method names. - Map> methodMap = classMethodMap.get(newClassName); - if (methodMap == null) - { - methodMap = new HashMap>(); - classMethodMap.put(newClassName, methodMap); - } - - // Obfuscated method name -> methods. - Set methodSet = methodMap.get(newMethodName); - if (methodSet == null) - { - methodSet = new LinkedHashSet(); - methodMap.put(newMethodName, methodSet); - } - - // Add the method information. - methodSet.add(new MethodInfo(newFirstLineNumber, - newLastLineNumber, - className, - firstLineNumber, - lastLineNumber, - methodReturnType, - methodName, - methodArguments)); - } - - - /** - * Information about the original version and the obfuscated version of - * a field (without the obfuscated class name or field name). - */ - private static class FieldInfo - { - private final String originalClassName; - private final String originalType; - private final String originalName; - - - /** - * Creates a new FieldInfo with the given properties. - */ - private FieldInfo(String originalClassName, - String originalType, - String originalName) - { - this.originalClassName = originalClassName; - this.originalType = originalType; - this.originalName = originalName; - } - - - /** - * Returns whether the given type matches the original type of this field. - * The given type may be a null wildcard. - */ - private boolean matches(String originalType) - { - return - originalType == null || originalType.equals(this.originalType); - } - } - - - /** - * Information about the original version and the obfuscated version of - * a method (without the obfuscated class name or method name). - */ - private static class MethodInfo - { - private final int obfuscatedFirstLineNumber; - private final int obfuscatedLastLineNumber; - private final String originalClassName; - private final int originalFirstLineNumber; - private final int originalLastLineNumber; - private final String originalType; - private final String originalName; - private final String originalArguments; - - - /** - * Creates a new MethodInfo with the given properties. - */ - private MethodInfo(int obfuscatedFirstLineNumber, - int obfuscatedLastLineNumber, - String originalClassName, - int originalFirstLineNumber, - int originalLastLineNumber, - String originalType, - String originalName, - String originalArguments) - { - this.obfuscatedFirstLineNumber = obfuscatedFirstLineNumber; - this.obfuscatedLastLineNumber = obfuscatedLastLineNumber; - this.originalType = originalType; - this.originalArguments = originalArguments; - this.originalClassName = originalClassName; - this.originalName = originalName; - this.originalFirstLineNumber = originalFirstLineNumber; - this.originalLastLineNumber = originalLastLineNumber; - } - - - /** - * Returns whether the given properties match the properties of this - * method. The given properties may be null wildcards. - */ - private boolean matches(int obfuscatedLineNumber, - String originalType, - String originalArguments) - { - return - (obfuscatedLineNumber == 0 ? obfuscatedLastLineNumber == 0 : - obfuscatedFirstLineNumber <= obfuscatedLineNumber && obfuscatedLineNumber <= obfuscatedLastLineNumber) && - (originalType == null || originalType.equals(this.originalType)) && - (originalArguments == null || originalArguments.equals(this.originalArguments)); - } - } -} diff --git a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/ReTrace.java b/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/ReTrace.java deleted file mode 100644 index 906548b9..00000000 --- a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/ReTrace.java +++ /dev/null @@ -1,305 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.retrace; - -import proguard.obfuscate.MappingReader; - -import java.io.*; -import java.util.*; - -/** - * Tool for de-obfuscating stack traces of applications that were obfuscated - * with ProGuard. - * - * @author Eric Lafortune - */ -public class ReTrace -{ - private static final String USAGE = "Usage: java proguard.retrace.ReTrace [-regex ] [-verbose] []"; - private static final String REGEX_OPTION = "-regex"; - private static final String VERBOSE_OPTION = "-verbose"; - - public static final String STACK_TRACE_EXPRESSION = "(?:.*?\\bat\\s+%c\\.%m\\s*\\(%s(?::%l)?\\)\\s*(?:~\\[.*\\])?)|(?:(?:.*?[:\"]\\s+)?%c(?::.*)?)"; - - - // The settings. - private final String regularExpression; - private final boolean verbose; - private final File mappingFile; - - - /** - * Creates a new ReTrace instance. - * @param regularExpression the regular expression for parsing the lines in - * the stack trace. - * @param verbose specifies whether the de-obfuscated stack trace - * should be verbose. - * @param mappingFile the mapping file that was written out by - * ProGuard. - */ - public ReTrace(String regularExpression, - boolean verbose, - File mappingFile) - { - this.regularExpression = regularExpression; - this.verbose = verbose; - this.mappingFile = mappingFile; - } - - - /** - * De-obfuscates a given stack trace. - * @param stackTraceReader a reader for the obfuscated stack trace. - * @param stackTraceWriter a writer for the de-obfuscated stack trace. - */ - public void retrace(LineNumberReader stackTraceReader, - PrintWriter stackTraceWriter) throws IOException - { - // Create a pattern for stack frames. - FramePattern pattern = new FramePattern(regularExpression, verbose); - - // Create a remapper. - FrameRemapper mapper = new FrameRemapper(); - - // Read the mapping file. - MappingReader mappingReader = new MappingReader(mappingFile); - mappingReader.pump(mapper); - - // Read and process the lines of the stack trace. - while (true) - { - // Read a line. - String obfuscatedLine = stackTraceReader.readLine(); - if (obfuscatedLine == null) - { - break; - } - - // Try to match it against the regular expression. - FrameInfo obfuscatedFrame = pattern.parse(obfuscatedLine); - if (obfuscatedFrame != null) - { - // Transform the obfuscated frame back to one or more - // original frames. - Iterator retracedFrames = - mapper.transform(obfuscatedFrame).iterator(); - - String previousLine = null; - - while (retracedFrames.hasNext()) - { - // Retrieve the next retraced frame. - FrameInfo retracedFrame = retracedFrames.next(); - - // Format the retraced line. - String retracedLine = - pattern.format(obfuscatedLine, retracedFrame); - - // Clear the common first part of ambiguous alternative - // retraced lines, to present a cleaner list of - // alternatives. - String trimmedLine = - previousLine != null && - obfuscatedFrame.getLineNumber() == 0 ? - trim(retracedLine, previousLine) : - retracedLine; - - // Print out the retraced line. - if (trimmedLine != null) - { - stackTraceWriter.println(trimmedLine); - } - - previousLine = retracedLine; - } - } - else - { - // Print out the original line. - stackTraceWriter.println(obfuscatedLine); - } - } - - stackTraceWriter.flush(); - } - - - /** - * Returns the first given string, with any leading characters that it has - * in common with the second string replaced by spaces. - */ - private String trim(String string1, String string2) - { - StringBuilder line = new StringBuilder(string1); - - // Find the common part. - int trimEnd = firstNonCommonIndex(string1, string2); - if (trimEnd == string1.length()) - { - return null; - } - - // Don't clear the last identifier characters. - trimEnd = lastNonIdentifierIndex(string1, trimEnd) + 1; - - // Clear the common characters. - for (int index = 0; index < trimEnd; index++) - { - if (!Character.isWhitespace(string1.charAt(index))) - { - line.setCharAt(index, ' '); - } - } - - return line.toString(); - } - - - /** - * Returns the index of the first character that is not the same in both - * given strings. - */ - private int firstNonCommonIndex(String string1, String string2) - { - int index = 0; - while (index < string1.length() && - index < string2.length() && - string1.charAt(index) == string2.charAt(index)) - { - index++; - } - - return index; - } - - - /** - * Returns the index of the last character that is not an identifier - * character in the given string, at or before the given index. - */ - private int lastNonIdentifierIndex(String line, int index) - { - while (index >= 0 && - Character.isJavaIdentifierPart(line.charAt(index))) - { - index--; - } - - return index; - } - - - /** - * The main program for ReTrace. - */ - public static void main(String[] args) - { - // Parse the arguments. - if (args.length < 1) - { - System.err.println(USAGE); - System.exit(-1); - } - - String regularExpresssion = STACK_TRACE_EXPRESSION; - boolean verbose = false; - - int argumentIndex = 0; - while (argumentIndex < args.length) - { - String arg = args[argumentIndex]; - if (arg.equals(REGEX_OPTION)) - { - regularExpresssion = args[++argumentIndex]; - } - else if (arg.equals(VERBOSE_OPTION)) - { - verbose = true; - } - else - { - break; - } - - argumentIndex++; - } - - if (argumentIndex >= args.length) - { - System.err.println(USAGE); - System.exit(-1); - } - - // Convert the arguments into File instances. - File mappingFile = new File(args[argumentIndex++]); - File stackTraceFile = argumentIndex < args.length ? - new File(args[argumentIndex]) : - null; - - try - { - // Open the input stack trace. We're always using the UTF-8 - // character encoding, even for reading from the standard - // input. - LineNumberReader reader = - new LineNumberReader( - new BufferedReader( - new InputStreamReader(stackTraceFile == null ? System.in : - new FileInputStream(stackTraceFile), "UTF-8"))); - - // Open the output stack trace, again using UTF-8 encoding. - PrintWriter writer = - new PrintWriter(new OutputStreamWriter(System.out, "UTF-8")); - - try - { - // Execute ReTrace with the collected settings. - new ReTrace(regularExpresssion, verbose, mappingFile) - .retrace(reader, writer); - } - finally - { - // Close the input stack trace if it was a file. - if (stackTraceFile != null) - { - reader.close(); - } - } - } - catch (IOException ex) - { - if (verbose) - { - // Print a verbose stack trace. - ex.printStackTrace(); - } - else - { - // Print just the stack trace message. - System.err.println("Error: "+ex.getMessage()); - } - - System.exit(1); - } - - System.exit(0); - } -} diff --git a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/package.html b/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/package.html deleted file mode 100644 index a35ce214..00000000 --- a/tools/proguard/proguard6.0.3/retrace/src/proguard/retrace/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains the main ReTrace application. -ReTrace can de-obfuscate stack traces of obfuscated programs. - diff --git a/tools/proguard/proguard6.0.3/wtk/ant.properties b/tools/proguard/proguard6.0.3/wtk/ant.properties deleted file mode 100644 index 8c7d6fb6..00000000 --- a/tools/proguard/proguard6.0.3/wtk/ant.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Ant build properties for the ProGuard Wireless Toolkit plugin. - -wtk.home = /usr/local/java/wtk diff --git a/tools/proguard/proguard6.0.3/wtk/build.gradle b/tools/proguard/proguard6.0.3/wtk/build.gradle deleted file mode 100644 index d0c1c10a..00000000 --- a/tools/proguard/proguard6.0.3/wtk/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -// Gradle build script for the ProGuard Wireless Toolkit plugin. - -apply plugin: 'java' - -sourceSets.main { - java { - srcDirs = ['src'] - } - resources { - srcDirs = ['src'] - include '**/*.properties' - include '**/*.gif' - include '**/*.png' - include '**/*.pro' - } -} - -dependencies { - compile project(':core') - compile files("${wtkHome}/wtklib/kenv.zip") -} diff --git a/tools/proguard/proguard6.0.3/wtk/build.sh b/tools/proguard/proguard6.0.3/wtk/build.sh deleted file mode 100644 index 6653fe75..00000000 --- a/tools/proguard/proguard6.0.3/wtk/build.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# -# GNU/Linux build script for the ProGuard Wireless Toolkit plugin. - -cd $(dirname "$0") - -source ../buildscripts/functions.sh - -MAIN_CLASS=proguard.wtk.ProGuardObfuscator - -WTK_HOME=${WTK_HOME:-/usr/local/java/wtk} - -WTK_JAR=$WTK_HOME/wtklib/kenv.zip - -# Make sure the WTK jar is present. -if [ ! -f "$WTK_JAR" ]; then - echo "Please make sure the environment variable WTK_HOME is set correctly," - echo "if you want to compile the optional ProGuard WTK plugin." - exit 1 -fi - -# Make sure the ProGuard core has been compiled. -if [ ! -d ../core/$OUT ]; then - ../core/build.sh || exit 1 -fi - -# Compile and package. -export CLASSPATH=../core/$OUT:$WTK_JAR - -compile $MAIN_CLASS && \ -updatejar "$PROGUARD_JAR" || exit 1 diff --git a/tools/proguard/proguard6.0.3/wtk/build.xml b/tools/proguard/proguard6.0.3/wtk/build.xml deleted file mode 100644 index a68af467..00000000 --- a/tools/proguard/proguard6.0.3/wtk/build.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/proguard/proguard6.0.3/wtk/gradle.properties b/tools/proguard/proguard6.0.3/wtk/gradle.properties deleted file mode 100644 index 5f1e1a05..00000000 --- a/tools/proguard/proguard6.0.3/wtk/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Gradle build properties for ProGuard Wireless Toolkit plugin. - -wtkHome = /usr/local/java/wtk diff --git a/tools/proguard/proguard6.0.3/wtk/makefile b/tools/proguard/proguard6.0.3/wtk/makefile deleted file mode 100644 index 344c5e07..00000000 --- a/tools/proguard/proguard6.0.3/wtk/makefile +++ /dev/null @@ -1,15 +0,0 @@ -# GNU/Linux makefile for the ProGuard Wireless Toolkit plugin. - -ifndef WTK_HOME -WTK_HOME = /usr/local/java/wtk -endif - -MAIN_CLASS = proguard/wtk/ProGuardObfuscator -WTK_JAR = $(WTK_HOME)/wtklib/kenv.zip -CLASSPATH = ../core/$(OUT):$(WTK_JAR) -TARGET = proguard -UPDATE_JAR = true - -include ../buildscripts/functions.mk - -$(WTK_JAR): ; $(error Please make sure WTK_HOME is set correctly) diff --git a/tools/proguard/proguard6.0.3/wtk/pom.xml b/tools/proguard/proguard6.0.3/wtk/pom.xml deleted file mode 100644 index 7a1361b5..00000000 --- a/tools/proguard/proguard6.0.3/wtk/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - 4.0.0 - - net.sf.proguard - proguard-parent - 6.0.3 - ../buildscripts/pom.xml - - proguard-wtk-plugin - [${project.groupId}] ${project.artifactId} - - - src - - - maven-source-plugin - - - maven-compiler-plugin - - - maven-jar-plugin - - - - true - - - - - - maven-javadoc-plugin - - - - - src - - **/*.java - - - - - - - - ${project.groupId} - proguard-base - ${project.version} - - - wtklib - kenv - 2.2 - system - ${wtk.home}/wtklib/kenv.zip - - - diff --git a/tools/proguard/proguard6.0.3/wtk/settings.gradle b/tools/proguard/proguard6.0.3/wtk/settings.gradle deleted file mode 100644 index 55d8d75b..00000000 --- a/tools/proguard/proguard6.0.3/wtk/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'core' diff --git a/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/ProGuardObfuscator.java b/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/ProGuardObfuscator.java deleted file mode 100644 index 5e85d35b..00000000 --- a/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/ProGuardObfuscator.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * ProGuard -- shrinking, optimization, obfuscation, and preverification - * of Java bytecode. - * - * Copyright (c) 2002-2018 GuardSquare NV - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package proguard.wtk; - -import com.sun.kvem.environment.Obfuscator; -import proguard.*; - -import java.io.*; - - -/** - * ProGuard plug-in for the J2ME Wireless Toolkit. - *

- * In order to integrate this plug-in in the toolkit, you'll have to put the - * following lines in the file - * {j2mewtk.dir}/wtklib/Linux/ktools.properties or - * {j2mewtk.dir}\wtklib\Windows\ktools.properties (whichever is - * applicable). - *

- *

- * obfuscator.runner.class.name: proguard.wtk.ProGuardObfuscator
- * obfuscator.runner.classpath: /usr/local/java/proguard1.6/lib/proguard.jar
- * 
- * Please make sure the class path is set correctly for your system. - * - * @author Eric Lafortune - */ -public class ProGuardObfuscator implements Obfuscator -{ - private static final String DEFAULT_CONFIGURATION = "default.pro"; - - - // Implementations for Obfuscator. - - public void createScriptFile(File jadFile, - File projectDir) - { - // We don't really need to create a script file; - // we'll just fill out all options in the run method. - } - - - public void run(File obfuscatedJarFile, - String wtkBinDir, - String wtkLibDir, - String jarFileName, - String projectDirName, - String classPath, - String emptyAPI) - throws IOException - { - // Create the ProGuard configuration. - Configuration configuration = new Configuration(); - - // Parse the default configuration file. - ConfigurationParser parser = new ConfigurationParser(this.getClass().getResource(DEFAULT_CONFIGURATION), - System.getProperties()); - - try - { - parser.parse(configuration); - - // Fill out the library class path. - configuration.libraryJars = classPath(classPath); - - // Fill out the program class path (input and output). - configuration.programJars = new ClassPath(); - configuration.programJars.add(new ClassPathEntry(new File(jarFileName), false)); - configuration.programJars.add(new ClassPathEntry(obfuscatedJarFile, true)); - - // The preverify tool seems to unpack the resulting classes, - // so we must not use mixed-case class names on Windows. - configuration.useMixedCaseClassNames = - !System.getProperty("os.name").regionMatches(true, 0, "windows", 0, 7); - - // Run ProGuard with these options. - ProGuard proGuard = new ProGuard(configuration); - proGuard.execute(); - - } - catch (ParseException ex) - { - throw new IOException(ex.getMessage()); - } - finally - { - parser.close(); - } - } - - - /** - * Converts the given class path String into a ClassPath object. - */ - private ClassPath classPath(String classPathString) - { - ClassPath classPath = new ClassPath(); - - String separator = System.getProperty("path.separator"); - - int index = 0; - while (index < classPathString.length()) - { - // Find the next separator, or the end of the String. - int next_index = classPathString.indexOf(separator, index); - if (next_index < 0) - { - next_index = classPathString.length(); - } - - // Create and add the found class path entry. - ClassPathEntry classPathEntry = - new ClassPathEntry(new File(classPathString.substring(index, next_index)), - false); - - classPath.add(classPathEntry); - - // Continue after the separator. - index = next_index + 1; - } - - return classPath; - } -} diff --git a/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/default.pro b/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/default.pro deleted file mode 100644 index d31714f0..00000000 --- a/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/default.pro +++ /dev/null @@ -1,114 +0,0 @@ --dontnote --microedition --mergeinterfacesaggressively --overloadaggressively --repackageclasses '' --allowaccessmodification - -# Keep all extensions of javax.microedition.midlet.MIDlet. --keep public class * extends javax.microedition.midlet.MIDlet - -# Keep all native class/method names. --keepclasseswithmembernames class * { - native ; -} - -# Remove all invocations of System methods without side effects -# whose return values are not used. --assumenosideeffects public class java.lang.System { - public static native long currentTimeMillis(); - static java.lang.Class getCallerClass(); - public static native int identityHashCode(java.lang.Object); - public static java.lang.SecurityManager getSecurityManager(); - public static java.util.Properties getProperties(); - public static java.lang.String getProperty(java.lang.String); - public static java.lang.String getenv(java.lang.String); - public static native java.lang.String mapLibraryName(java.lang.String); - public static java.lang.String getProperty(java.lang.String,java.lang.String); -} - -# Remove all invocations of String methods without side effects -# whose return values are not used. --assumenosideeffects public class java.lang.String { - public java.lang.String(); - public java.lang.String(byte[]); - public java.lang.String(byte[],int); - public java.lang.String(byte[],int,int); - public java.lang.String(byte[],int,int,int); - public java.lang.String(byte[],int,int,java.lang.String); - public java.lang.String(byte[],java.lang.String); - public java.lang.String(char[]); - public java.lang.String(char[],int,int); - public java.lang.String(java.lang.String); - public java.lang.String(java.lang.StringBuffer); - public static java.lang.String copyValueOf(char[]); - public static java.lang.String copyValueOf(char[],int,int); - public static java.lang.String valueOf(boolean); - public static java.lang.String valueOf(char); - public static java.lang.String valueOf(char[]); - public static java.lang.String valueOf(char[],int,int); - public static java.lang.String valueOf(double); - public static java.lang.String valueOf(float); - public static java.lang.String valueOf(int); - public static java.lang.String valueOf(java.lang.Object); - public static java.lang.String valueOf(long); - public boolean contentEquals(java.lang.StringBuffer); - public boolean endsWith(java.lang.String); - public boolean equalsIgnoreCase(java.lang.String); - public boolean equals(java.lang.Object); - public boolean matches(java.lang.String); - public boolean regionMatches(boolean,int,java.lang.String,int,int); - public boolean regionMatches(int,java.lang.String,int,int); - public boolean startsWith(java.lang.String); - public boolean startsWith(java.lang.String,int); - public byte[] getBytes(); - public byte[] getBytes(java.lang.String); - public char charAt(int); - public char[] toCharArray(); - public int compareToIgnoreCase(java.lang.String); - public int compareTo(java.lang.Object); - public int compareTo(java.lang.String); - public int hashCode(); - public int indexOf(int); - public int indexOf(int,int); - public int indexOf(java.lang.String); - public int indexOf(java.lang.String,int); - public int lastIndexOf(int); - public int lastIndexOf(int,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.CharSequence subSequence(int,int); - public java.lang.String concat(java.lang.String); - public java.lang.String replaceAll(java.lang.String,java.lang.String); - public java.lang.String replace(char,char); - public java.lang.String replaceFirst(java.lang.String,java.lang.String); - public java.lang.String[] split(java.lang.String); - public java.lang.String[] split(java.lang.String,int); - public java.lang.String substring(int); - public java.lang.String substring(int,int); - public java.lang.String toLowerCase(); - public java.lang.String toLowerCase(java.util.Locale); - public java.lang.String toString(); - public java.lang.String toUpperCase(); - public java.lang.String toUpperCase(java.util.Locale); - public java.lang.String trim(); -} - - -# Remove all invocations of StringBuffer methods without side effects -# whose return values are not used. --assumenosideeffects public class java.lang.StringBuffer { - public java.lang.StringBuffer(); - public java.lang.StringBuffer(int); - public java.lang.StringBuffer(java.lang.String); - public java.lang.String toString(); - public char charAt(int); - public int capacity(); - public int indexOf(java.lang.String,int); - public int lastIndexOf(java.lang.String); - public int lastIndexOf(java.lang.String,int); - public int length(); - public java.lang.String substring(int); - public java.lang.String substring(int,int); -} diff --git a/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/package.html b/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/package.html deleted file mode 100644 index 6efc6441..00000000 --- a/tools/proguard/proguard6.0.3/wtk/src/proguard/wtk/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains the J2ME Wireless Toolkit plug-in for ProGuard. - diff --git a/tools/readme.txt b/tools/readme.txt deleted file mode 100644 index 58ba7754..00000000 --- a/tools/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ ------------------------------------------------ - -JarAnalyzer - Kirk Knoernschild - www.kirkk.com - www.extensiblejava.com - - This file contains very basic usage information. - More detailed documentation can be found at - http://www.kirkk.com/main/Main/JarAnalyzer. ------------------------------------------------ - -IF YOU'VE DOWNLOADED THE SRC VERSION... ------------------------------------------------ -First, unzip the contents of the zip file to any directory you wish. - -Next, you'll need to build the project. The src version includes a build.xml file (but no binaries), and requires that you have ANT installed on your machine. Assuming you have ANT installed, and ANT is in your path, you should unzip JarAnalyzer. In the root directory, simply type ant. After the build runs, you'll find the following directories have been created: - -* bin - The binary distribution. If you want to run the Analyzer, navigate to this directory and execute the runxmlsummary.bat or rundotsummary.bat file. It'll prompt you for an input directory followed by an output file name. For more detail, follow the instructions related to the BIN version below. -* deploy - This directory contains the binary and source distributions of Analyzer. If you've made changes to Analyzer, you can use the zip files in this directory to deploy the binary and source distributions. Each of the zip files will contain everything needed to run or build Analyzer. - -If you have created a new BIN version with modifications, and want to easily explain to others how to use the BIN distribution, read the BIN version instructions below. - ------------------------------------------------ - -IF YOU'VE DOWNLOADED THE BIN VERSION ------------------------------------------------ -First, unzip the contents of the zip file to any directory you wish. - -- Run with XML output. -To run the analyzer, execute the runxmlsummary.bat file. It'll prompt you for an input directory and an output file. The output file is stored in xml format. -- Run with DOT output. -To run the analyzer, execute the rundotsummary.bat. This creates a dot file that can be used with GraphViz (www.graphviz.org) to create a visual representation of the component relationships. Note that when running using dot, all "-" and "." will be stripped out of the jar file names. \ No newline at end of file diff --git a/tools/rundotsummary.bat b/tools/rundotsummary.bat deleted file mode 100644 index fbf7632b..00000000 --- a/tools/rundotsummary.bat +++ /dev/null @@ -1,6 +0,0 @@ -echo off -set TEMP_CLASSPATH=%CLASSPATH% -set CLASSPATH=.;./lib/bcel-5.2.jar;./lib/jakarta-regexp-1.3.jar;./lib;./jaranalyzer-1.2.jar -"%JAVA_HOME%/bin/java" com.kirkk.analyzer.textui.DOTSummary -set CLASSPATH=%TEMP_CLASSPATH% -set TEMP_CLASSPATH= \ No newline at end of file diff --git a/tools/runxmlsummary.bat b/tools/runxmlsummary.bat deleted file mode 100644 index 5c2b2808..00000000 --- a/tools/runxmlsummary.bat +++ /dev/null @@ -1,6 +0,0 @@ -echo off -set TEMP_CLASSPATH=%CLASSPATH% -set CLASSPATH=.;./lib/bcel-5.2.jar;./lib/jakarta-regexp-1.3.jar;./lib;./jaranalyzer-1.2.jar -"%JAVA_HOME%/bin/java" com.kirkk.analyzer.textui.XMLUISummary -set CLASSPATH=%TEMP_CLASSPATH% -set TEMP_CLASSPATH= \ No newline at end of file diff --git a/tools/yguard-2.5.2/3rdPartyLicenses/asm-license.txt b/tools/yguard-2.5.2/3rdPartyLicenses/asm-license.txt deleted file mode 100644 index cc529ed1..00000000 --- a/tools/yguard-2.5.2/3rdPartyLicenses/asm-license.txt +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2000-2005 INRIA, France Telecom -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tools/yguard-2.5.2/3rdPartyLicenses/retroguard-LGPL.txt b/tools/yguard-2.5.2/3rdPartyLicenses/retroguard-LGPL.txt deleted file mode 100644 index 94924514..00000000 --- a/tools/yguard-2.5.2/3rdPartyLicenses/retroguard-LGPL.txt +++ /dev/null @@ -1,510 +0,0 @@ -This license applies to all yGuard library files, which reside in the -com.yworks.yguard.obf and com.yworks.yguard.obf.classfile packages as well as the -classes Conversion, ObfuscationListener and ParseException which reside in the com.yworks.yguard -package. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/tools/yguard-2.5.2/3rdPartyLicenses/retrotranslator-license.txt b/tools/yguard-2.5.2/3rdPartyLicenses/retrotranslator-license.txt deleted file mode 100644 index abce0564..00000000 --- a/tools/yguard-2.5.2/3rdPartyLicenses/retrotranslator-license.txt +++ /dev/null @@ -1,30 +0,0 @@ -Retrotranslator: a Java bytecode transformer that translates Java classes -compiled with JDK 5.0 into classes that can be run on JVM 1.4. - -Copyright (c) 2005, 2006 Taras Puchko -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holders nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE - \ No newline at end of file diff --git a/tools/yguard-2.5.2/LICENSE.html b/tools/yguard-2.5.2/LICENSE.html deleted file mode 100644 index 3e1f25a8..00000000 --- a/tools/yguard-2.5.2/LICENSE.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -
-
-yGuard Software License Agreement, 
-version 1.0, October 2002
-
-This is a legal agreement ("this Agreement") between yWorks GmbH ("yWorks") and the licensee ("the Licensee").
-This Agreement is governed by the laws of Germany.
-
-yWorks licenses the yGuard software ("the Software") only if all the following
-terms are accepted by the Licensee.  The Software includes the yGuard bytecode
-executable and any files and documents associated with it.
-
-By installing the Software, the Licensee is indicating that the Licensee has read and
-understands this Agreement and agrees to be bound by its terms and conditions.
-
-If this Agreement is unacceptable to the Licensee, the Licensee must destroy any copies of the
-Software in the Licensee's possession immediately.
-
-1. LICENSE CONDITIONS
-
-The Licensee is granted a non-exclusive and non-transferable license to install the Software.
-Any copies of the Software should be complete copies including any copyright notices.
-
-The Licensee may not reverse engineer, disassemble, decompile, alter, or translate the
-Software, or otherwise attempt to derive the source code of the Software.
-
-The Licensee acknowledges that Software furnished hereunder is under test and may be
-defective. 
-
-No claims whatsoever can be made on yWorks based on any expectation about the Software.
-
-2. TERM, TERMINATION AND SURVIVAL
-
-(A) This Agreement is effective unless terminated as follows:
-
-(B) The Licensee may terminate this Agreement at any time by destroying all copies of the
-Software in possession.
-
-(C) If the Licensee fails to comply with any term of this Agreement, this Agreement is
-terminated and the Licensee has no further right to use the Software.
-
-(E) On termination, the Licensee shall have no claim on or arising from the Software. The
-Software and any copies shall be destroyed.
-
-3. NO WARRANTY
-
-The Software is licensed to the Licensee on an "AS IS" basis.
-The Licensee is solely responsible for determining the suitability of the Software and
-accepts full responsibility and risks associated with the use of the Software.
-
-4. MAINTENANCE AND SUPPORT
-
-yWorks is not required to provide maintenance or support to the Licensee.
-
-5. LIMITATION OF LIABILITY
-
-In no event will yWorks be liable for any damages, including but not limited to any loss
-of revenue, profit, or data, however caused, directly or indirectly, by the Software or by
-this Agreement.  
-
-6. DISTRIBUTION
-
-No distribution is to be made of the Software by the Licensee.  The Licensee may make one
-copy of the Software for backup purpose only.
-
-7. AVAILABILITY
-
-The Software is not available to those not permitted by laws to have access to the Software.
-
-8. INSERTION OF MARKER
-
-The Software may insert markers into output files to identify
-that the files have been generated by the Software. yWorks bears no responsibility
-for any damages arising.
-
- - diff --git a/tools/yguard-2.5.2/README.html b/tools/yguard-2.5.2/README.html deleted file mode 100644 index 121e8227..00000000 --- a/tools/yguard-2.5.2/README.html +++ /dev/null @@ -1,693 +0,0 @@ - - -yGuard 2.5.2 Release Notes - - - -

yGuard 2.5.2 Release Notes

- -

Contents of the yGuard distribution

-
- - - - - - - - - - - - - - - - - - - - - -
LICENSE.htmlyGuard Software License
3rdPartyLicenses/3rd Party Licenses: -
README.htmlthis file
doc/documentation: -
lib/ant task library: -
    -
  • yguard.jar
  • -
  • ObfuscationAnnotation.jar
  • -
-
-

Please read the documentation for -installation instructions.

- - - -

Technical requirements

-

yGuard requires Java2 SDK 1.4.x or greater and Ant 1.5 or greater installed on your system. -It may work with earlier versions of these pieces of software as well, however this has not -been tested thoroughly. yGuard 1.3.x and upwards works together with Ant 1.6. -yGuard works well with JDK 1.6 and Ant 1.7.

-

- - -

Java 7 Compatibilty

- -

With Java 7, the Java class file version number changed, because the invokedynamic instruction was introduced. -However, the JDK 7 does not contain any means of issuing this instruction. -The invokedynamic instruction is currently generated only by compilers for other (dynamic) languages (such as JRuby), -or using third-party bytecode transformation tools. -Therefore, yGuard can handle class files that have been compiled for Java 7 and supports the -invokedynamic instruction in the obfuscation process, but does not support shrinking of class files -that contain this instruction, yet.

-

This means that although yGuard does not fully support all features of the Java 7 class file format, -there should not be any issues using this yGuard release with a Java application that targets Java 7. -

- -

Changelog

- -

yGuard 2.5.2 - Changes since 2.5.1

-

-

    -
  • - Added support for renaming META-INF/services entries if the - entry corresponds to a type that is obfuscated. -
  • -
  • - Fixed a bug that caused the stacktrace deobfuscation tool to ignore class - name mappings that started with one or more $ characters. -
  • -
-

- -

yGuard 2.5.1 - Changes since 2.5

-

-

    -
  • Fixed broken binary class file of the attached com.yworks.util.annotation.Obfuscation annotation in ObfuscationAnnotation.jar.
  • -
-

- -

yGuard 2.5 - Changes since 2.4.0.1

-

-

    -
  • Added support for controlling obfuscation exclusion via annotations.
  • -
  • Improved Java 7 support. yGuard does now support invokedynamic in the obfuscation process.
  • -
-

- -

yGuard 2.4.0.1 - Changes since 2.4

-

-

    -
  • Fixed a regexp that could cause yGuard to parse manifest files for a very long time.
  • -
-

- - -

yGuard 2.4 - Changes since 2.3.0.1

-

-

    -
  • Added basic Java 7 class file support (see the note on Java 7 compatibility).
  • -
  • Fixed a bug that caused yGuard to introduce invalid signatures for typed classes with inner classes.
  • -
  • Fixed a bug that caused yGuard to erroneously exclude all classes from obfuscation when an implements attribute - was used for a <class> element without an additional name or expose - attribute.
  • -
  • Fixed a bug that caused the shrinker to ignore the attribute element if the default - shrinking settings were used (i.e. if no keep element was defined).
  • -
-

- -

yGuard 2.3.0.1 - Changes since 2.3.0

-

-

    -
  • Fixed a bug that caused the shrinker to remove the static initializer of a non-static inner class, - when only fields of the inner class were referenced (e.g. compiler-generated switch map tables for enums).
  • -
-

- -

yGuard 2.3.0 - Changes since 2.2.0

-

-

    -
  • yGuard won't try to initialize external classes needed for resolving anymore.
  • -
  • The default behavior of the shrinker was changed to keep any referenced runtime visible annotation and parameter annotation attributes.
  • -
  • The shrinker will now correctly adhere to the "lineNumberTable", "runtimeVisibleParameterAnnotations" etc. - attributes of the <keep> element.
  • -
  • Fixed a bug that caused the shrinker to remove the enclosing method of anonymous inner classes - declared as entry points.
  • -
  • Fixed a bug that caused the shrinker to remove referenced Annotation elements from Annotation interfaces.
  • -
  • yGuard now won't rename or remove the package-info class.
  • -
  • Fixed possible "Illegal group reference" Exception in yGuard's parse tool.
  • -
  • The shrinker will now keep classes that are used as field types of - referenced fields.
  • -
  • The shrinker will now correctly keep method attributes of methods that are kept as stubs.
  • -
-

-

yGuard 2.2.0 - Changes since 2.1.0

-

-

    -
  • yGuard is now fully JDK-1.6 compatible.
  • -
  • The yGuard task now supports a way of specifying a set of jars that should be obfuscated at the same time - using simple patternset syntax.
  • -
  • yGuard now uses the same technique for all elements in the MANIFEST file to adjust fully qualified class name strings.
  • -
  • It is now possible to tell yGuard not to obfuscate specific package names.
  • -
  • yGuard can now be given a list of digest algorithms that will be used to create the digests in the manifest.
  • -
  • yGuard now issues a warning if the package or class or method name of a native method is obfuscated.
  • -
-

-

yGuard 2.1.0 - Changes since 2.0.3

-

-

    -
  • Fixed a bug that caused yGuard to throw a NullPointerException if a attribute element contained no nested patternset.
  • -
  • Fixed a bug that caused yGuard to use multiple logging instances if a yGuard task was executed multiple times.
  • -
  • Fixed LineNumberTable and SourceFile elements
  • -
  • Added overloadEnabled property
  • -
-

- -

yGuard 2.0.3 - Changes since 2.0.2

-

-

    -
  • Fixed a bug that broke the nested map element of the rename element.
  • -
-

- -

yGuard 2.0.2 - Changes since 2.0.1

-

-

    -
  • Fixed a bug that caused yGuard to fail during class file parsing if a method signature contained an inner class of a parameterized class.
  • -
  • yGuard will not complain about the Java 1.5 attributes Bridge, Enum and Varargs as 'unknown attributes' anymore.
  • -
  • Fixed a bug that caused all classnames to be kept from renaming if the extends attribute was used in combination with the classes attribute.
  • -
-

- -

yGuard 2.0.1 - Changes since 2.0

-

-

    -
  • Fixed an inconsistency between the interpretation of the Ant syntax in the rename and shrink elements. Now, both elements apply patternset elements in nested method and field elements to class names, just as stated in the yGuard documentation.
  • -
  • If the classes attribute of the class element is not set or set to "none", the shrinking engine will now include the classes that match based on the given name attribute or nested patternset, effectively ignoring the classes attribute.
  • -
-

- -

yGuard 2.0 - Changes since 1.5.0_03

-

-

    -
  • New elaborate code shrinking functionality.
  • -
  • More powerful ant syntax: extends/implements attributes for the class element.
  • -
  • General Ant syntax changes due to the introduction of the new yguard,shrink and rename elements.
  • -
  • yGuard now needs Java2 SDK 1.4.x or greater to function properly.
  • -
-

- -

yGuard 1.5.0_03 - Changes since 1.5.0_02

-

-

    -
  • -Fixed bad treatment of the new enclosing method feature in Tiger which sometimes led to AbstractMethodErrors at runtime. -
  • -
-

- -

yGuard 1.5.0_02 - Changes since 1.5.0_01

-

-

    -
  • -Improved obfuscation logic for enumerations. Now the two static methods valueOf(String) and values() don't have to be exposed manually anymore. -
  • -
  • -Fixed bad annotation handling for non-trivial annotations. Annotations had not been parsed and handled correctly, which could lead to either -errors during obfuscation or Errors at runtime. -
  • -
-

-

yGuard 1.5.0_01 - Changes since 1.5

-

-

    -
  • -Fixed a bug that made yGuard ignore some of the attributes in the expose section ("sourcefile" and "linenumbertable"). -
  • -
  • -Fixed a rare but severe bug that accidentally removed method attributes and sometimes led to ArrayIndexOutOfBoundsExceptions -during the obfuscation. -
  • -
-

-

yGuard 1.5 - Changes since 1.3.2

-

-

    -
  • -Added JDK 1.5 (a.k.a Java 5.0 code-named Tiger) compatibility. yGuard can now deal correctly with the -new JDK and Java features: generics, var-args, enumerations, annotations, new ".class" bytecode construct, -signatures, local variable type table, enclosing method information. -
  • -
  • -Implemented the ability to obfuscate/scramble/shrink line number information. This makes it possible to more easily debug -stacktraces without exposing line number information in the obfuscated version of the application. -
  • -
  • -Implemented the ability to obfuscate the source file information. This is necessary in order to view line number information -in stack traces. It is now possible to reassign the source file attribute inside class files so that the original source file -name is not exposed in the obfuscated application. -
  • -
  • -Added the ability to determine on a per-class basis what attributes to expose or obfuscate. This includes line number -information (with optional scrambling/compression or removal), source file attributes, deprecation attributes, etc. -This makes it easy to obfuscate parts of your application while keeping the public API untouched and debug information -for third party jars intact. -
  • -
  • -Improved the stacktrace deobfuscation tool. It can now unscramble line number information from stacktraces, features a -more polished view of the mapping rules and deobfuscates stacktraces more reliably if the stacktraces are ambiguous. -
  • -
-

-

yGuard 1.3.2 - Changes since 1.3.1_01

-

-

    -
  • -Improved name generation. yGuard will now generate legal identifiers -(with respect to Character.isJavaIdentifierStart() -and Character.isJavaIdentifierPart(char) and -Character.isIdentifierIgnorable(char)) and should -therefor produce jars that should verify correctly even on older jdks -if yGuard is run using newer jdks. -
  • -
  • -yGuard now helps in the detection of duplicate class files in source jars. -In pedantic mode yGuard will terminate if duplicate classes are detected -in different source jars. yGuard's obfuscate task will always fail if mutliple -class files containing a definition for the same jar are detected. The log file -displays useful information for finding the duplicate entries. -
  • -
  • -Improved xml log file output for Unicode characters. -
  • -
  • -Made the log file viewer output more consistent with inner class names that -were being mapped during obfuscation versus those who remained fixed. -
  • -
  • -Jar file entries are now being sorted prior to being written to the jar. -
  • -
  • -Improved handling of external classes. -
  • -
  • - Bugfixes: -
      -
    • Fixed a name clash problem that occurred when already obfuscated code - was being obfuscated again using different settings. -
    • -
    • - Fixed a resolution problem concerning interfaces from external classpaths. -
    • -
    -
  • -
-

-

yGuard 1.3.1_01 - Changes since 1.3.1

-

-

    -
  • -yGuard now treats the COMPATIBLE flag for the language conformity different. -Field names and class names are now made up of lower ascii-only chars. -
  • -
  • - Bugfixes: -
      -
    • Fixed a problem concerning the adjust elements throwing - a RuntimeException in the pattern matching code. -
    • -
    • - Fixed a problem where the wrong set of files was affected in the adjust - section. -
    • -
    -
  • -
-

-

yGuard 1.3.1 - Changes since 1.3

-

-

    -
  • -yGuard will now generate (empty) directory entries in the resulting jar files for each non-empty directory. -
  • -
  • -Improved the optional keeping of "Deprecated" tags. Somehow they still seem to get lost under certain conditions. -Any feedback on this topic is welcomed. -
  • -
  • -Due to a compile time dependency, yGuard could not be used with jdk 1.3.x anymore even if the automatic -resource adjustment feature was not used. This has now been made possible again. -
  • -
  • - Bugfixes: -
      -
    • Fixed a rare problem that broke obfuscated code using static method - invocations and static field references. -
    • -
    • - There was a bug in the log file viewer (java -jar yguard.jar [logfile.xml[.gz]]) that made it crash - under very rare circumstances. -
    • -
    • - Implemented a workaround for an Ant incompatibility problem, which resulted in yGuard behaving differently on - different platforms and in conjunction with different Ant versions. -
    • -
    -
  • -
-

-

yGuard 1.3 - Changes since 1.2

-

-

    -
  • - Added automatic text file and property file renaming mechanism. yGuard can - now be configured to rename .properties files according to the obfuscation. -
  • -
  • - It is now possible to process text files and replace occurances - of class names with their obfuscated versions. -
  • -
  • - One can now specify whether resource files should be kept in their original - directory while at the same time the classes residing in the respective - directory can be fully obfuscated to another package. -
  • -
  • - yGuard can now automatically create gzipped (.gz) logfiles and work directly - on compressed logfiles. This reduces the size of the logfiles drastically. -
  • -
  • - It is now possible to simply specify a list of attributes, that should not be - removed by yGuard (for example "Deprecated") using the - expose-attributes property. -
  • -
  • - yGuard has a new name generation method (language-conformity = compatible), - that creates jar file that can be successfully unzipped to the windows - filesystem. -
  • -
  • - In order to avoid namespace clashes, on can now easily specify a prefix - for completeley obfuscated package hierarchies using the obfuscation-prefix - property. -
  • -
  • - Enhanced documentation (DTD, examples, and new features description). -
  • -
  • - Bugfixes: -
      -
    • Innerclasses making use of the .class construct should now always be - correctly obfuscated using the replaceClassNameStrings feature. -
    • -
    • - The patch element had a bug concerning field name mappings, - which is now resolved. -
    • -
    • - yGuard now tests whether a newly obfuscated name already exists in external - jars and automatically generates names, that should not clash. -
    • -
    • - yGuard should now work together with Ant version 1.6 (there was an undocumented change in the API of Ant). -
    • -
    -
  • -
-

- -

yGuard 1.2 - Changes since 1.1

-

-

    -
  • - Added support for external libraries. This allows yGuard to obfuscate - jars that have external dependencies more easily and using stronger - obfuscation. It is now possible to specify dependencies using Ant classpath - elements. yGuard then uses information found in these jars to resolve - external dependencies. -
  • -
  • - Improved error handling and task and logfile output. yGuard will now produce - fewer unreasonable warnings. During the obfuscation run yGuard will give - more detailed warnings and hints when unobfuscatable classes are detected. -
  • -
  • - Added property error-checking which can be set to - pedantic. In this case yGuard will not issue warnings but a - build will fail instead of issueing simple warnings. This helps in finding problems. -
  • -
  • - Fixed a minor issue. The documentation stated, that -
    <class classes="protected"/>
    - behaved like -
    <class classes="protected">
    -  <patternset>
    -    <include name="**.*"/>
    -  </patternset>
    -</class>
    - but in the implementation <include name="*"/> - had been applied. This has now been fixed to <include - name="**.*"/>. -
  • -
  • - Fixed some bugs in the documentation. -
  • -
-

-

yGuard 1.1 - Changes since 1.0.1

-

-

    -
  • - Added support for different naming schemes. These schemes result in smaller - jar files, better obfuscation and lead to jar files, - which cannot be unpacked to normal filesystems. -
  • -
  • - Fixed two JBuilder incompatibilities. Innerclasses created by JBuilder do - not prevent yGuard from working anymore and (correct) innerclasses created - by yGuard do not crash JBuilder anymore (which btw. is a bug in JB). -
  • -
  • - Implemented a fix for the problem, where the ClassName.class - code construct prevented classes from being obfuscated entirely. -
  • -
  • - yGuard can now automatically obfuscate code of the form - Class.forName("com.mycompany.myapp.MyClass"); - so that these classes can now be obfuscated by name, too. -
  • -
  • - Improved the serialization of the obfuscation map to the xml file, which can - now be parsed back in by the included tool even for complicated naming - schemes. -
  • -
  • - Refactored the creation of the final jar files. The current implementation - leads to more standard conform jar files. -
  • -
  • - Fixed two bugs concerning the handling of manifest files. -
  • -
  • - Fixed a bug concerning the handling of the Main-Class attribute of manifest - files. -
  • -
-

-

Changes since 1.0

-

-

    -
  • - Implemented more robust handling of Manifest files. Implementation now makes - use of java.util.jar.Manifest. -
  • -
  • - The Main-Class attribute of the Manifest files will now be translated to the - obfuscated name, if the main class is not exposed. -
  • -
  • - The conserveManifest attribute of the obfuscate task now conserves the - manifest in a better way. -
  • -
-

- - diff --git a/tools/yguard-2.5.2/doc/yguard_ant_howto.html b/tools/yguard-2.5.2/doc/yguard_ant_howto.html deleted file mode 100644 index a78a3028..00000000 --- a/tools/yguard-2.5.2/doc/yguard_ant_howto.html +++ /dev/null @@ -1,3160 +0,0 @@ - - - - yGuard 2.5 - Ant Java Bytecode Obfuscator and Shrinker - Documentation - - - - - - - - - - - - - - - - - - - -

- This document explains how to use the yGuard Java obfuscation and shrinking software together with Ant. yGuard - is a product of yWorks GmbH, creator of - the outstanding JavaTM graph visualization framework - yFiles and other fine - products. -

-

- Documentation for the deprecated Ant syntax of previous yGuard releases is still available. -

- -

yGuard 2.5 Ant Task Documentation

- -

Contents

- - - - - -

Introduction

- -
-

- Using the yGuard Ant task, name obfuscation and code shrinking can be seamlessly integrated into your deployment - process.
- The yguard task contains two nested elements that perform the name obfuscation - and code shrinking separately: -

    -
  • The shrink element removes all code elements that are not reachable from - the entrypoints given in the nested keep element.
  • -
  • The rename element performs name-obfuscation, renaming all packages, - classes, methods and fields according to a selectable name-mapping scheme.
    - Elements can be excluded from the renaming process by annotating them with a certain annotation class in the source code or using - a nested keep element. -
  • -
- - Both elements operate on the same set of input and output files - specified in the containing yguard element. -

-
- - - -

Installation

- -

- In order to make use of yGuard's yguard task you must have Ant properly installed and configured - to run it. After downloading - and extracting the jar file - (yguard.jar), place it in a path near to your build script. You may use - absolute paths, but in the following example, we expect the jar file to lie - in the same directory as your build file. -

- -

- In order the get the Ant task running you should insert a couple of lines in - your build script (build.xml): -

- - - -
-    <target name="yguard">
-      <taskdef name="yguard"
-      classname="com.yworks.yguard.YGuardTask"
-      classpath="yguard.jar"/>
-      <yguard>
-        <!-- insert your yguard elements here -->
-      </yguard>
-    </target>
-
- -

- For a complete build.xml file have a look at the - examples section. -

- - - -

General Hints & Troubleshooting

- -
-

- There are a couple of things you should be aware of when obfuscating and shrinking - software.
- The weakest part of an application considering name obfuscation and code shrinking is code that uses - reflection to dynamically load classes, invoke methods etc. Therefore, you have to be especially careful - when using the yguard task on applications that rely on reflection. - - -
- The most important facts to keep in mind when using yGuard are described here briefly: -

-
    -
  • If you use the rename task, code in the form of MyApplication.class will break - if MyApplication will be obfuscated by name - and the obfuscation switch replaceClassNameStrings is set to - false. - The shrink task will currently recognize code in the form of MyApplication.class only if - the java files - were compiled using an arbitrary version of the standard javac compiler (although the shrinking engine might - recognize the .class construct also if the classes were compiled using a compiler that generates - similar bytecode). -
  • -
  • Automatic introspection and reflection will break in most cases, when - you decide to obfuscate the corresponding methods and fields. If you use the shrink task and your - application uses - reflection you should explicitly designate all entities loaded per reflection as code entrypoints using the keep element. -
    - If your application is broken after using the shrink task, consider using the - createStubs attribute of the shrink task to find out which additional entities you - need to include in the keep element. -
  • -
  • Class.forName(className) will not work when using the rename task unless you use the - obfuscated name string in your variable or the String is a local constant and - replaceClassNameStrings is not set or set to true - . - If you use the shrink task, className should be contained in the list of entrypoints - using - the keep element. -
  • The customized serialization mechanism will not work if you - obfuscated or shrinked the writeObject and readObject methods as well as the serializationUID field. -
  • -
  • Simple bean introspection will not work, if you decide to - obfuscate your public accessor methods, since it makes use of - reflection. -
  • -
  • - If you do not set the -Xmx property for the Java virtual machine, the yguard Ant task - might fail due to a java.lang.OutOfMemoryError.
    - To solve this problem, set the -Xmx option in the ANT_OPTS variable, e.g.: -
    bash> export ANT_OPTS="-Xmx512M"
    -or
    -cshell> setenv ANT_OPTS "-Xmx512M"
    -
  • -
-
- - - - - -

The yguard Element

- -
-

- The yguard task contains elements that define basic properties common to the nested - rename and shrink tasks.
- Please see the General Hints & Troubleshooting section to learn about - common pitfalls when using name obfuscation and shrinking software. - -

- - -

Attributes

- The yguard element has no attributes. - -

-

Child Elements

- -

-
- - - - -

The inoutpair Elements

- -
-

- At least one inoutpair element or one non-empty inoutpairs element - has to be specified in order - to run the yguard tasks. This elements specifies the paths to the input and output jar files. -

- -

-

Attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
inspecifies an exisiting jar file, which - contains the unshrinked and unobfuscated .class files.Yes
outspecifies a path to a jar file which - will be created and used to put the results of the shrinking and obfuscation process.Yes
resources - Will only be considered if the yguard element contains a - nested shrink element.
- Determines how the shrinking engine handles all non-.class files.
- Currently the following three resource policies are supported: -
    -
  • copy: the default, simply copies all resource files to the output jar.
  • -
  • auto: copies only those resource files that reside in a directory that still contains - one or more .class files after shrinking.
  • -
  • none: discards all resource files.
  • -
- -
No, defaults to copy.
- - -

-

Child Elements

- The inoutpair element has no child elements. -

- -
-

- -

- If multiple jar files need to be obfuscated at once the inoutpairs element can be used alternatively. -

- - -

The inoutpairs Elements

- -
-

- Additionally or alternatively to inoutpair elements this element can be specified in order - to specify the paths to the input and output jar files. -

- -

-

Attributes

- - - - - - - - - - - - - - -
AttributeDescriptionRequired
resources - Will only be considered if the yguard element contains a - nested shrink element.
- Determines how the shrinking engine handles all non-.class files.
- Currently the following three resource policies are supported: -
    -
  • copy: the default, simply copies all resource files to the output jar.
  • -
  • auto: copies only those resource files that reside in a directory that still contains - one or more .class files after shrinking.
  • -
  • none: discards all resource files.
  • -
- -
No, defaults to copy.
- - -

-

Child Elements

-
    -
  • patternset
  • -
  • optionally a mapper that determines the - name mapping between the unobfuscated and obfuscated versions of the jar files. Note that identitymapper and - mergemapper are not supported. All matched jar file names need to be mapped to exactly one jar file name - that differs from the original jar file.
  • -
-

- -
-

- -

- Some examples: -

-
-  <!-- use all jars in the input-lib-dir directory and obfuscate them
-          to *_obf.jar -->
-  <inoutpairs resources="auto">
-    <fileset dir="${input-lib-dir}">
-      <include name="myapp*.jar"/>
-      <exclude name="*_obf.jar"/>
-    </fileset>
-    <mapper type="glob" from="*.jar" to="*_obf.jar"/>
-  </inoutpairs>
-
-  <!-- the above mapper is the default one so the following snippet does the same -->
-  <inoutpairs resources="auto">
-    <fileset dir="${input-lib-dir}">
-      <include name="myapp*.jar"/>
-      <exclude name="*_obf.jar"/>
-    </fileset>
-  </inoutpairs>
-
-
- - - - - -

The externalclasses Element

- -
-

- If the jar to be processed by yGuard depends on external classes or libraries, this - element can be used to specify classpaths to these entities. - These libraries will neither be shrinked nor obfuscated. Use the - inoutpair element for this purpose! - See example 4 later in this document for an example of when to use this - element.
- In order to achieve a maximum shrinking effect by the shrink task, all external dependencies should be - declared in the externalclasses element. Otherwise, all non-private methods of classes - that inherit from unresolvable classes will not be shrinked. -

- -

- The elements attributes and child elements can be seen on the Ant documentation - page about using path elements. -

-
- - - - -

The attribute Element

- -
-

- Using the attribute element, you can specify which attributes present in the input - classes should be kept in the obfuscated output classes.
- See example 6 later in this document for an example of when to use this - element.
-

- -

-

Attributes

- - - - - - - - - - - - - - -
AttributeDescriptionRequired
nameA comma-separated list of attribute names that are to be retained in the shrinked and/or - obfuscated class - files.Yes
-
-

- -

-

Child Elements

- -

- -

- An example: -

-
-    <attribute name="SourceFile, LineNumberTable, LocalVariableTable">
-      <patternset>
-        <include name="com.mycompany.mylibrary.**"/>
-      </patternset>
-    </attribute>
- -

- This will retain the attributes named "SourceFile", "LineNumberTable", - and "LocalVariableTable" effectively enabling debugging information for all classes in the - com.mycompany.mylibaray package and subpackages. -

-
- - - -

The shrink Element

- -
-

- The shrink task removes all classes, fields and methods that are not reachable from - a number of entrypoints given by a nested keep element.
- See the Complete Examples section for explanation of some common use cases. - If your code uses reflection, please read the General Hints & Troubleshooting - section for information on this topic. -

- -

-

Attributes

- - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
logfileDetermines the name of the logfile that is generated - during the shrinking process. The logfile contains information about the - entrypoints the shrinking engine uses, the removed classes, methods and fields - as well as any warnings. -
- If the name ends with a ".gz", yGuard will automatically create a gzipped version - of the file which potentially saves a lot of disc space.
No, defaults to yshrinklog.xml
createStubs - - Instead of removing methods completely, this attribute causes the shrink task to insert a - method - stub that throws a java.lang.InternalError if it is called. This attribute is very useful if - the - shrinking - process causes your application to break and you are uncertain about which additional code entities you have - to include in the keep element.
- Note that classes considered as completely obsolete by the shrinking engine are still removed completely - - this attribute only - affects obsolete methods of non-obsolete classes. - - -
No, defaults to false
-
-

- -

-

Child Elements

- -

-
- - - - -

The entrypointjar Element

- -
-

- The entrypointjar element can be used for convenience if your application uses - libraries that are to be shrinked, but the jarfile using these libraries should be left untouched by the shrinking - engine. - Such a jarfile could be specified as an entrypointjar.
- - -

- -

-

Attributes

- - - - - - - - - - - - - -
AttributeDescriptionRequired
namePath to to the jar file to use as entrypointjar. - Yes
-
-

- -

-

Child Elements

- The entrypointjar element has no child elements. -

- -

-

Example

-
-      <yguard>
-        <inoutpair in="lib-in.jar" out="lib-out.jar" />
-        <shrink>
-          <entrypointjar name="myApp.jar"/>
-        </shrink>
-      </yguard>
-

-
- - - -

The rename Element

- -
-

- The basic idea is, that all elements will be renamed by this task. There are different use cases, where you - sometimes want to exclude or simply just have to exclude some elements from name obfuscation, - i.e. not rename them but keep in the API as is. - See the Complete Examples section for explanation of some common use cases. - If your code uses reflection, please read the General Hints & Troubleshooting - section for information on this topic. - Excluding elements can be achieved by using - the keep element, the mainclass attribute of the - rename element and by annotating elements in the source code with the annotation that is specified in the - annotationClass attribute of the rename element. - Using the nested keep element, you have to specify all classes, methods, fields, - and attributes that should be excluded from name obfuscation. - Another way is to annotate the elements directly in the source code that should be obfuscated or excluded. You can use - the yFiles obfuscation annotation com.yworks.util.annotation.Obfuscation for that or specify your own - annotation in the annotationClass attribute of this element. -

- -

-

Attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
mainclassCan be used as a shortcut to specify the mainclass - of your application. Both the class name and the main method will be excluded from - name obfuscation. Alternatively you may want to consider to exclude the main method only. If your jar - contains - a Main-Class attribute, the rename task will automatically adjust the value to the obfuscated - name. - No
logfileDetermines the name of the logfile that is generated - during the renaming process. The logfile contains information about the - mappings the name obfuscator generates as well as any warnings. -
- If the name ends with a ".gz", yGuard will automatically create a gzipped version - of the file which potentially saves a lot of disc space.
No, defaults to yguardlog.xml
conservemanifesta boolean attribute (valid values: true/false) that determines - whether - the manifest file of the jars should be left untouched - by the renaming engine. If set to false, the manifest - will be modified to reflect the new message digests.No, defaults to false.
replaceClassNameStringsa boolean attribute (valid values: true/false) - that determines whether the renaming engine should try to replace hardcoded Strings, which - are used in conjunction with the MyClass.class construct. - If set to false, those Strings will be left - untouched and code of the form MyClass.class will break if - MyClass gets obfuscated by name. If set to true (the default), yGuard will try - to workaround this problem by replacing the hardcoded String with the - appropriate obfuscated name. However this will only work if the unobfuscated - class file has been generated with the usual compilers ('javac', 'jikes' and - 'bjc') or compilers, that produce similar bytecode. This can also have the - side-effect of modifying too many Strings, e.g if you have code that looks like - System.out.println("com.mycompany.MyClass");, it might get - replaced, if MyClass.class resides in the very same class with - something like System.out.println("com.A.OoO");. It will most - likely fail if the class has been previously obfuscated by another obfuscation - tool or a different compiler has been used for compilation. Anyway it is - always worth it to give it a try, if you want to have 'full obfuscation'.No, defaults to true
annotationClassSpecifies the name of the annotation class that can be used to exclude - elements by annotating them in the source code. The specified annotation can be any annotation - that fits the convention.No, defaults to com.yworks.util.annotation.Obfuscation
-
-

- -

-

Child Elements

- -

-
- - - - -

The property Elements

- -
-

- property elements can be used to give hints to the name obfuscation - engine. Depending on the exact version of yGuard, the task may use these hints - to control the process of obfuscation. -

- -

- -

Attributes

- - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
namespecifies a key which may be interpreted - by the obfuscation task.Yes
valuespecifies the corresponding value of the - property.Yes
-
-

- - -

-

-

The following properties are supported:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
error-checkingcan be used to tell yGuard - to bail out if it detects any problems. Currently this property can - be set to the following value: -
    -
  • - pedantic will make the obfuscation run fail, i.e. the - target which uses the rename element will fail, if - yGuard detects any problems. -
  • -
naming-schemeCan be used to tell the renaming engine to use - a different naming scheme during the obfuscation. Currently this property can - be set to one of the following values: -
    -
  • - smallWill produce very short names, i.e. the resulting jar - file will be as small as possible. -
  • -
  • - bestWill produce names, that are very likely to be - misunderstood by decompilers and disassemblers. Using this naming-scheme - it is even impossible on most filesystems to successfully unjar or unzip the - resulting jar file (Windows, Standard Unix, Standard Linux, MacOS). - However this scheme takes up a lot of space and the resulting jar is likely to - become large (typically roughly double the size). -
  • -
  • - mixIs a mixture of both the other two values, which leads - to reasonable small but still hard to decompile jar files. -
  • -
-
language-conformityCan be used to advise - the renaming engine to produce names, that should be decompilable by most decompilers. On - the other hand, yGuard can produce class files that should be executable and - verifiable by all of todays virtual machines, but produces absolutely nonsense - names when decompiled (Ever tried to compile 'int class = false.this - super(String$super.init if);' ?!) - Currently this property can - be set to one of the following values: -
    -
  • - compatibleWill produce names, that are ok for (most) decompilers, - java, jar and manifest files and can be unzipped to most filesystems. -
  • -
  • - legalWill produce names, that are ok for (some) decompilers, - java, jar and manifest files. -
  • -
  • - illegalWill produce names, that will crash some tools but - usually not the jvm, but JBuilder7 in many occasions for example. -
  • -
-
overload-enabled - Determines whether the renaming engine tries to use the same names for methods with different signatures or - whether it always generates unique method names. - Setting this property to false eases the analysis of stacktraces but reduces the obfuscation effect. -
obfuscation-prefixCan be used to instruct the renaming engine - to prefix packages, that are fully obfuscated with a given package prefix, e.g. - com.mycompany.obf. -
digestsCan be used to tell yGuard which digest algorithms should be used - for the digest generation in the manifest file. Valid values are either none, - or a comma-separated list of digest-algorithm identifiers, e.g. SHA-1, MD5 (which is the default). -
expose-attributesCan be used to give yGuard - a list of attributes yGuard should expose in addition to the standard attributes. - By default yGuard removes unneeded attributes like "Deprecated" from methods. The value - can be a comma separated list of attributes as defined in - - Section 4.7 of the VM Specification of the .class File Format. E.g. in order to keep - the "Deprecated" attribute one can add the following property: -
- <property name="expose-attributes" value="Deprecated"/> -
- Note that this affects all classes which will be obfuscated. For a better control of which attributes should - be exposed in what classes use the Attribute Element. -
- -
-

- - -

-

Child Elements

- The property element has no child elements. -

- -
- - -

The keep Element

- -
-

- This element is a child of the rename or shrink - element. - It can be used to specify elements that are excluded from the parent rename or shrink - task. The excluded classes, methods and fields are defined using nested package, - class, method and field elements.
- The elements given in the keep element are considered as code entrypoints. - All code reachable from these entrypoints will be implicitly excluded from shrinking, too. -

- -

-

Attributes

- -

- The keep element provides a number of boolean attributes that determine whether debug information - and annotations present in the input class files are to be retained in the output files. - The default behavior of the rename and shrink elements for the respective attributes - is explained in the table below.
- Note that a more fine-grained control over which attributes to keep for which class files is possible using the - attribute element. Also, the attribute - element allows to define attributes to keep for both the rename and the shrink - element in a common place. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionDefault (rename)Default (shrink)
sourcefileDetermines whether the name of the original - source code file should be included in the output class files.removeremove
linenumbertableDetermines whether the line number table, - that contains a mapping from each opcode in the class file to the line number - in the original source code file - should be included in the output class files.removeremove
localvariabletableDetermines whether the local variable table, - that contains a mapping from each local variable in the class file - to the name that has been used - in the original source code file - should be included in the output class files.removeremove
localvariabletypetableDetermines whether the local variable type table, - that contains a mapping from each local variable in the class file - to the name and its generic type signature that has been used - in the original source code file - should be included in the output class files.removeremove
runtimevisibleannotationsDetermines whether annotations with the retention policy RetentionPolicy.RUNTIME - should be included in the output class files.keepkeep
runtimevisibleparameterannotationsDetermines whether method paramater annotations with the retention policy - RetentionPolicy.RUNTIME should be included in the output class files.keepkeep
runtimeinvisibleannotationsDetermines whether annotations with the retention policy RetentionPolicy.CLASS - should be included in the output class files.keepremove
runtimeinvisibleparameterannotationsDetermines whether method paramater annotations with the retention policy - RetentionPolicy.CLASS should be included in the output class files.keepremove
-
-

- - -

-

Common Child Elements

- -

- -

-

Child Elements only available in the rename task

- -

- The rename task allows for a special treatment of the - linenumbertable and sourcefile attributes. This treatment can be - specified in the following child elements: -

- -

- -
- - - -

The class Element

- -
- -

- The class element can be used for excluding certain classes and/or their fields and methods - from the renaming or shrinking process.
- If no name, extends or implements attribute is given and the class - element contains no nested patternset, a class - element matches all class names. -

- -

- The classes, methods and fields attributes - tell the shrinking and renaming engines which classes, methods and fields to keep based on their visibility. - The following table lists the possible values for all of these - attributes and shows which elements will be excluded. A '*' denotes, that - elements that have the given visibility will be excluded for the specified - attribute value. A '-' denotes that the these elements will not be excluded from the process. -

-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Value/Visibilitypublicprotectedfriendlyprivate
none----
public*---
protected**--
friendly***-
private****
-
- -
-

Attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
nameThe name of the class to be kept.No
classesThe visibility of the classes to be kept.No, defaults to none
methodsThe visibility of the methods to be kept.No, defaults to none
fieldsThe visibility of the fields to be kept.No, defaults to none
extendsIf no name attribute is given, keeps all classes that equal or extend the class - defined by the given fully qualified classname.
See example 7 for an example - usage of this attribute.
No
implementsIf no name attribute is given, keeps all classes that equal or implement the - class defined by the given fully qualified classname.
See example 7 for an - example - usage of this attribute.
No
-
-
- -

-

Child Elements

- -

- -

Explanation

- -

- There are three possible ways of specifying which classes will be excluded from the shrinking and obfuscation process: -

- -

-

    -
  1. One can specify a single java class using the fully qualified name - in java syntax with the name attribute. For example: -
    <class name="mypackage.MyClass"/>
  2. -
  3. One can specify multiple java classes using a modified version of - a patternset. The patternset's includes and excludes element should use - java syntax, but the usual wildcards are allowed. Some examples: -
    -      <class>
    -        <patternset>
    -          <include name="com.mycompany.**.*Bean"/>
    -          <exclude name="com.mycompany.secretpackage.*"/>
    -          <exclude name="com.mycompany.myapp.SecretBean"/>
    -        </patternset>
    -      </class>
    - This will expose all classes which reside in the package subtree - of com.mycompany and whose name ends with Bean except for those, that - reside in the com.mycompany.secretpackage package and the single SecretBean - in com.mycompany.myapp. -
    -      <class>
    -        <patternset>
    -          <include name="com.mycompany.myapp.MainClass"/>
    -          <include name="org.w3c.sax?."/>
    -          <exclude name="org.w3c.sax?.**.*$$*"/>
    -        </patternset>
    -      </class>
    - This will expose the MainClass class - and all classes, which reside in packages like org.w3c.sax1, org.w3c.sax2, org.w3c.saxb - except for inner classes. '$' is used as a separator between outer class names - and inner class names. Since Ant uses '$' as an escape character, you have to - use two consecutive '$'s ('$$') if you want to pass - one as an argument to the task. -
  4. - -
  5. - Finally one can specify classes depending on their visibility, i.e. depending - whether they have been declared public, protected, package friendly - or private (inner classes). This can be achieved by - additionally specifying the classes attribute in the class element. -
    -      <class classes="protected">
    -        <patternset>
    -          <include name="com.mycompany.myapi."/>
    -        </patternset>
    -      </class>
    - - This will keep all class names, that are either public or - protected and - which reside in one of the subpackages of com.mycompany.myapi - (note the - abbreviation: the trailing dot behaves like the trailing '/' in the usual - patternset, i.e. it could be rewritten as com.mycompany.myapi.**.*) -
    -      <class classes="protected"
    -        methods="protected"
    -        fields="protected">
    -        <patternset>
    -          <include name="**.*"/>
    -        </patternset>
    -      </class>
    - This example shows the very common use case of excluding a complete public API from the shrinking and obfuscation - process. - There is an abbreviation for this - use case: you can omit the patternset element, since in the case where the - classes attribute is specified and there is no - patternset child - element used, the task will automatically apply this rule. In this example - all classes will be exposed, that are either public or protected. - Their methods and fields will be exposed as long as they are declared - public or protected. If a class is package friendly - or private (inner classes), neither itself - nor its methods or fields will be exposed. - -

    - - The last example shows how to keep the public methods of certain classes only, but - neither field names nor the class names themselves. - -

    -      <class classes="none" methods="public" fields="none">
    -        <patternset>
    -          <include name="com.mycompany.myapi."/>
    -        </patternset>
    -      </class>
    - - -
  6. - -
-
- - -

The method Element

- -
-

- Using the method element you can specify methods by signature - which should be excluded from shrinking or name obfuscation. -

- -

-

Attributes

- - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
nameSpecifies the method to keep. Use the - complete signature using fully qualified class names and the return type!Yes
classSpecifies the class which contains the - method. Use the normal java syntax, i.e. the fully qualified name. - This attribute can be omitted, if the patternset element is used as - a child element, in which case all classes matching the patternset - will be searched and their corresponding methods will be kept.No
-
-

- -

-

Child Elements

- -

- -

-

Examples

-

-
-    <method class="com.mycompany.myapp.MyClass"
-      name="void main(java.lang.String[])"/>
-    <method class="com.mycompany.myapp.MyClass"
-      name="int foo(double[][], java.lang.Object)"/>
-    <method name="void writeObject(java.io.ObjectOutputStream)">
-      <patternset>
-        <include name="com.mycompany.myapp.data.*"/>
-      </patternset>
-    </method>
-    <method name="void readObject(java.io.ObjectInputStream)">
-      <patternset>
-        <include name="com.mycompany.myapp.data.*"/>
-      </patternset>
-    </method>
- -

- This will keep the main method of the MyClass class and the foo method. - Additionally all readObject and writeObject methods (used for Serialization) - will be kept in all classes of the com.mycompany.myapp.data package. - Note that you have to specify the return argument's type, even if it is void - and that you have to use the fully qualified name for all classes, even those, - that are in the java.lang package. -

-
- - -

The field Element

- -
-

- Using the field element you can specify fields by name - which should be excluded from shrinking or name obfuscation. -

- -

-

Attributes

- - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
namespecifies the field to keep. Use the name - of the field only, do not include its type!Yes
classSpecifies the class which contains the - field. Use the normal java syntax, i.e. the fully qualified name. - This attribute can be omitted, if the patternset element is used as - a child element, in which case the all classes matching the patternset - will be searched and their corresponding fields will be kept.No
-
-

- -

-

Child Elements

- -

- -

-

Examples

-

-
-    <field class="com.mycompany.myapp.MyClass" name="field"/>
-    <field name="serialVersionUID">
-      <patternset>
-        <include name="com.mycompany.myapp.data.*"/>
-      </patternset>
-    </field>
- -

- This will keep the field named 'field' of the MyClass class. - Additionally all the serialVersionUID fields (used for Serialization) - will be kept in all classes of the com.mycompany.myapp.data package. -

-
- - - -

The package Element

- -
- -

- The package element can be used for excluding certain package's names from the renaming process. It - cannot be used for the shrinking process.
- All packages that are matched be the nested patternset element will not be obfuscated. This has no influence - on the class, method, or field names but will only result in the package's name not being obfuscated. - Normally, it is not necessary to use this element, instead the class element is used - to keep class names (and thus their package names) from being obfuscated. -

- -

-

Child Elements

- -

- -

-

Examples

-

-
-    <package>
-      <patternset>
-        <include name="com.mycompany.myapp.*"/>
-      </patternset>
-    </package>
- -

- This will keep the names of all packages that are direct descendants - of com.mycompany.myapp. This will not influence the names of the classes - contained in these packages. -

-
- - - - -

The sourcefile Element

- -
- -

- The sourcefile element allows for a special treatment of the sourceFile attribute by the rename element.
- Using nested property elements, the mapping of sourceFile elements in obfuscated class files can be - adjusted. -

- -
-

The following properties are supported:

- - - - - - - - - - - - - - -
NameDescription
mapping - the value of this property determines the name all sourceFile attributes matched by the - sourcefile - element are mapped to. -
- -
- -

-

Child Elements

- -

- -

-

Examples

-

- - - -
-    <sourcefile>
-      <property name="mapping" value="y"/>
-      <patternset>
-        <include name="com.mycompany.myapp.**"/>
-      </patternset>
-    </sourcefile>
- -

- This will map all of the source file attributes in the packages below com.mycompany.myapp to " - y", - which is small and generally a nice letter. -

-
- - - - -

The linenumbertable Element

- -
- -

- The linenumbertable element allows for a special treatment of the linenumbertable attribute by the - rename.
- Using nested property elements, the mapping of linenumbertable elements in obfuscated class files can - be - adjusted. -

- -
-

The following properties are supported:

- - - - - - - - - - - - - - - - - - -
NameDescription
mapping-scheme - can be used with the following two values: -
    -
  • - scramble: this will use a non-trivial algorithm to scramble the line numbers in the existing - file. - The algorithm implemented uses for each class a different scrambling scheme. The optional - scrambling-salt - property can be used to provide an integer value that will be used to "salt" the algorithm's random seed for - the - scrambling. - The size of the (uncompressed) .class file will not change using this mapping scheme. -
  • -
  • - squeeze: this will use a simple algorithm that virtually puts all of a methods code into the - first - line of - code of the method. It will appear as if each method had been written in a single line of code. - The advantage of this scheme is drastically reduced size requirements and thus smaller .class files, while - at - the same time - it will be possible to unambiguously determine the exact method from a stacktrace. -
  • -
-
scrambling-salt - can be used in conjunction with mapping-scheme to provide an integer value that will be used to - "salt" the algorithm's random seed for the - scrambling. -
- -
- -

-

Child Elements

-
    -
  • property
  • -
  • patternset
  • -
-

- -

-

Examples

-

-
-  <linenumbertable>
-    <patternset>
-      <include name="com.mycompany.myapp.**"/>
-    </patternset>
-  </linenumbertable>
- -

- This will keep the line numbers of all the classes in the com.mycompany.myapp packages and subpackages. - Note that in order to see the line numbers in stacktraces, the sourcefile - attribute has to be retained for those files, too, since otherwise the JDK will display "Unknown source. - " - for the stack elements. -

-
-  <linenumbertable>
-    <property name="mapping-scheme" value="scramble"/>
-    <property name="scrambling-salt" value="1234"/>
-    <patternset id="CompanyPatternSet">
-      <include name="com.mycompany.myapp.**"/>
-    </patternset>
-  </linenumbertable>
-  <sourcefile>
-    <property name="mapping" value="y"/>
-    <patternset refid="CompanyPatternSet"/>
-  </sourcefile>
- -

- This will keep scrambled line numbers for all classes found in and below the com.mycompany.myapp packages. - The scrambling algorithm will use the given "salt" value to use a predefined scrambling scheme. - In order to see the scrambled line numbers, a sourcefile element is used - on the same patternset, which is referenced by its previously declared reference id, to rename the source files to - "y". -

-
- - - - -

The adjust Element

- -
-

- Using the adjust element one can specify resource files whose names and/or - contents should be adjusted by the rename engine to reflect the obfuscated class names. -
- Note: - This will only adjust files that are part of the inoutpair jars! - I.e. the fileset's root directory is the combined root of all jars that are passed to - yGuard via the inoutpair elements. yGuard will not modify any of the files - on disk, except for the out-jar! -

- -

-

Attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescriptionRequired
replaceNamespecifies whether or not the names of - the specified resources should be adjusted.No, defaults to false
replaceContentspecifies whether or not the contents of - resource files should be adjusted.No, defaults to false
replacePathspecifies whether or not the paths to the - resource files should be adjusted.No, defaults to true
-
-

- -

-

Child Elements

- The adjust element can be used just like the standard Ant - ZipFileSet element. -

- -

- Some examples: -

-
-    <!-- adjust the names of all java property files in the jars -->
-    <adjust replaceName="true">
-      <include name="**/*.properties"/>
-    </adjust>
-
-    <!-- adjust the classnames specified within a single XML file in the jar -->
-    <adjust file="plugins.xml" replaceContent="true" />
-
-    <!-- suppress the adjustment of the resource path
-    com/mycompany/myapp/resource in the jar. -->
-    <!-- the package com.mycompany.myapp still gets obfuscated. -->
-    <adjust replacePath="false">
-      <include name="com/mycompany/myapp/resource/*"/>
-    </adjust>
- -
- - -

The map Element

- -
-

The map element is an immediate optional child of the - rename element. It can be used to specify the mapping - for the renaming process directly. This is an advanced topic.

- -

-

Child Elements

-
    -
  • package
  • -
  • class
  • -
  • method
  • -
  • field
  • -
-

- -

- All of these elements use the name attribute to specify the specific - element. The method and field element need the - class attribute in order to function properly. Neither wildcards - nor nested patternset elements are allowed. - Use the map attribute to specify the new name (subpackage, classname, - methodname and fieldname respectively).
- - Some examples: -

-
-    <map>
-      <package name="com" map="etc"/>
-      <package name="com.mycompany" map="nocompany"/>
-      <package name="com.mycompany.myapp" map="asdf"/>
-      <class name="com.mycompany.myapp.MainApp" map="foo"/>
-      <method class="com.mycompany.myapp.MainApp"
-        name="void main(java.lang.String[])" map="bar"/>
-      <field class="com.mycompany.myapp.MainApp" name="field" map="a"/>
-    </map>
- -

- - In this example the package structure 'com.mycompany.myapp' will be obfuscated to - 'etc.nocompany.asdf'. The MainApp class will be called 'foo' and its main method - will be remapped to 'bar' (and can therefor not be executed from commandline anymore). - The field called 'field' will be renamed to 'a'. -

-
- - - -

Controlling obfuscation exclusion with annotations

- -
-

- In order to exclude certain elements from obfuscation, it is possible to use annotations - in the source code instead of listing those elements in the keep element. -

-

- Any annotation class can be used for this, but it must be specified in the annotationClass - attribute of the rename element and follow the convention as explained below to work. - yGuard contains such an annotation in the distribution package ready for use. The annotation class is - com.yworks.util.annotation.Obfuscation and can be found in the yGuard distribution in the - lib/ObfuscationAnnotation.jar. Feel free add this attribute definition to your own codebase - and possibly adjust the package name to your needs. Here is the source code for it: -

- -

Obfuscation.java

-
-package com.yworks.util.annotation;
-
-public @interface Obfuscation {
-
-  boolean exclude() default true;
-
-  boolean applyToMembers() default true;
-}
-
-

- This class is also the default annotation yGuard is looking for when obfuscating. -

-

- The convention for annotation classes that yGuard understands as obfuscation controlling annotations requires two attributes: -

-

-

Attributes

- - - - - - - - - - - - - - - - -
AttributeDescriptionDefault value
exclude - Specifies whether the annotated element should be excluded from the obfuscation. Note, that when retaining a class, - the hierarchy of that class, i.e. the chain of outer class names and the package name, is also retained. - true
applyToMembers - Specifies whether the child elements of the annotated element, if not otherwise specified, - should be excluded from the obfuscation. - For example, when annotating a class with exclude = true and this attribute - set to true, inner classes, fields and methods of this class will be excluded - from obfuscation. Annotating a child element of an element that has this attribute set - to true will override the parents annotation configuration. - true
-
-

-
- - - -

Generating Patch Jars

- -
-

- The true power of the map element lies in its use together - with the patch element, which itself is a child element - of the rename top level element. -

- -

-

Attributes

- The yguard element has no attributes. -

- -

-

Child Elements

- -

- -

- Using the patch element one can generate jars, that can be used - to serve as patches for versions of an application that have already been - deployed in obfuscated form. - During the main obfuscation run, yGuard produces an xml-logfile, in which - the mapping between the unobfuscated and obfuscated names is contained. - The patch element is used to declare a set of classes, that need - to be patched. During the obfuscation, yGuard will include those files - in the obfuscated jars only, that are declared inside this element.
- For example: -

-
-    <patch>
-      <class name="com.mycompany.myapp.MainClass"/>
-      <class>
-        <patternset>
-          <include name="com.mycompany.myapp.bugs.*"/>
-        </patternset>
-      </class>
-    </patch>
-    <map logfile="yguardlog.xml"/>
- -

- This will only include the MainClass class and all classes that belong to the - bugs package in a patch jar. - In order to work with the previously delivered obfuscated version, it is - important to use the map element to specify the mapping of the elements - from the previous run. This can most conveniently be achieved by - specifying the log file from the corresponding run in the map's logfile attribute. -

- -
- -

Complete Examples

- -
-

- There will be some examples given, that represent common use cases. -

- - - -

Example 1: Getting started with Ant and yGuard (for Ant newbies)

- -

- Following are the contents of a complete build.xml file. - Just copy the following lines to a new document named build.xml, - put the file into your project's root directory and edit the file to suit your needs. -

- -
-  <?xml version="1.0" encoding="UTF-8"?>
-  <!-- file build.xml in your project root directory -->
-  <!-- Ant build script for yfiles -->
-  <!-- The java based Ant tool is available from -->
-  <!-- http://jakarta.apache.org/ant -->
-  <!-- This file demonstrates the use of the yGuard byte -->
-  <!-- code obfuscator from yWorks Gmbh -->
-  <!-- yGuard can be downloaded from -->
-  <!--- http://www.yworks.com/products/yguard -->
-
-  <project name="project" default="yguard" basedir=".">
-
-    <!-- edit the following lines to your needs -->
-    <target name="init">
-    <property name="project_name" value="DemoProject"/>
-    <property name="srcDir" value="."/>
-    <property name="classDir" value="classes"/>
-    <property name="jar" value="${project_name}.jar"/>
-    <property name="obfjar" value="${project_name}_obf.jar"/>
-    <property name="renamelog" value="${project_name}_renamelog.xml"/>
-    <property name="shrinklog" value="${project_name}_shrinklog.xml"/>
-    <property name="mainclass" value="com.mycompany.myapp.Main"/>
-    <mkdir dir="${classDir}" />
-    </target>
-
-
-    <target depends="jar" name="yguard">
-      <taskdef name="yguard" classname="com.yworks.yguard.YGuardTask"
-      classpath="yguard.jar"/>
-      <!-- the following can be adjusted to your needs -->
-      <yguard>
-
-        <inoutpair in="${jar}" out="${obfjar}"/>
-
-        <shrink logfile="${shrinklog}">
-
-          <keep>
-            <class classes="protected"
-            methods="protected" fields="protected">
-              <patternset>
-                <include name="com.mycompany.publicapi.**.*"/>
-                <exclude name="com.mycompany.publicapi.private.*"/>
-                <include name="com.mycompany.menu.reflection.**.*"/>
-              </patternset>
-            </class>
-          </keep>
-        </shrink>
-
-        <rename mainclass="${mainclass}" logfile="${renamelog}">
-          <property name="error-checking" value="pedantic"/>
-
-          <keep>
-            <class classes="protected"
-            methods="protected" fields="protected">
-              <patternset>
-                <include name="com.mycompany.publicapi.**.*"/>
-                <exclude name="com.mycompany.publicapi.private.*"/>
-              </patternset>
-            </class>
-          </keep>
-        </rename>
-
-      </yguard>
-
-    </target>
-
-    <!-- compile -->
-    <target name="compile" depends="init">
-      <javac srcdir="${srcDir}" includes="com/mycompany/**/*.java"
-        destdir="${classDir}">
-      </javac>
-    </target>
-
-    <!-- create .jar -->
-    <target name="jar" depends="compile">
-      <jar jarfile="${jar}"
-        basedir="${classDir}"
-        includes="com/mycompany/**">
-        <fileset dir="${srcDir}">
-          <include name="com/mycompany/resources/*.properties"/>
-        </fileset>
-      </jar>
-    </target>
-
-    <!-- run project -->
-    <target name="run" depends="yguard">
-      <java classname="${mainclass}" fork="true">
-      <classpath>
-        <pathelement location="${obfjar}"/>
-      </classpath>
-      </java>
-    </target>
-
-    <!-- removes all that has been built -->
-    <target name="clean" depends="init">
-      <delete dir="${classDir}" includeEmptyDirs="true" />
-    </target>
-  </project>
-
-  <!-- end file build.xml -->
- -

Example 2: A Public API

- -

- An alternative yguard section could look like this: -

- - - -
-  <yguard>
-
-    <inoutpair in="classes.jar" out="classes_obf.jar"/>
-    <inoutpair in="utils.jar" out="utils_obf.jar"/>
-
-    <!-- don't let the obfuscator remove the "Deprecated" -->
-    <!-- attributes from the .class file entries -->
-    <attribute name="Deprecated"/>
-
-    <shrink
-      logfile="shrinklog.xml">
-      <keep>
-        <class classes="protected"
-        methods="protected"
-        fields="protected"/>
-      </keep>
-    </shrink>
-
-    <rename mainclass="com.mycompany.myapp.Main"
-      logfile="obflog.xml">
-      <keep>
-        <class classes="protected"
-        methods="protected"
-        fields="protected"/>
-      </keep>
-    </rename>
-
-  </yguard>
- -

- This case is especially useful when you want to provide and expose a public API. - All the classes, methods and fields, that can be seen in a javadoc generated - API will be excluded from the shrinking and renaming tasks. - Package friendly and private classes, methods and fields - will be shrinked or obfuscated whenever possible.
- This example also displays the use of the "attribute" element. In this - case it prevents the yguard task from removing the "Deprecated" flag from - the entities in the .class files. -

- - - -

Example 3: A Demo Program

- -
-  <yguard>
-
-    <inoutpair in="demo.jar" out="demo_obf.jar"/>
-
-    <shrink logfile="shrinklog.xml">
-
-      <keep>
-
-        <!-- main method -->
-        <method name="void main(java.lang.String[])" class="com.mycompany.myapp.Main" />
-
-        <!-- needed for reflection -->
-        <class name="com.mycompany.myapp.data.DataObject"
-        methods="public" fields="none"/>
-        <!-- needed for reflection (name only) -->
-        <class name="com.mycompany.myapp.data.InnerDataObject"/>
-        <!-- needed for serialization -->
-        <method name="void writeObject(java.io.ObjectOutputStream)">
-          <patternset id="datapatternset">
-            <include name="com.mycompany.myapp.data.*"/>
-          </patternset>
-        </method>
-        <method name="void readObject(java.io.ObjectInputStream)">
-          <patternset refid="datapatternset"/>
-        </method>
-        <field name="serialVersionUID">
-          <patternset refid="datapatternset"/>
-        </field>
-      </keep>
-    </shrink>
-
-    <rename mainclass="com.mycompany.myapp.Main" logfile="renamelog.xml">
-
-      <property name="language-conformity" value="illegal"/>
-      <property name="naming-scheme" value="mix"/>
-      <keep>
-        <class name="com.mycompany.myapp.data.DataObject"
-        methods="public" fields="none"/>
-        <class name="com.mycompany.myapp.data.InnerDataObject"/>
-        <method name="void writeObject(java.io.ObjectOutputStream)">
-          <patternset refid="datapatternset" />
-        </method>
-        <method name="void readObject(java.io.ObjectInputStream)">
-          <patternset refid="datapatternset"/>
-        </method>
-        <field name="serialVersionUID">
-          <patternset refid="datapatternset"/>
-        </field>
-      </keep>
-    </rename>
-
-  </yguard>
- -

- This example demonstrates the common use case of a demo program. The keep sections - of both the shrink and rename elements contain code entities that will - often have to be excluded from the shrinking and renaming process. These are the main code entrypoints (the main method), - classes that are loaded per reflection and fields and methods needed for serialization. Note how the same - patternsets can be reused using the id and refid attributes. -

- - - -

Example 4: A Program Using an External Library

- -
-
-  <yguard>
-
-    <inoutpair in="mydemo.jar" out="mydemo_obf.jar"/>
-
-    <externalclasses>
-      <pathelement location="lib/external.jar"/>
-      <pathelement location="lib/additional/classes/"/>
-    </externalclasses>
-
-    <shrink logfile="shrinklog.xml">
-      <property name="error-checking" value="pedantic"/>
-      <keep>
-        <method name="void main(java.lang.String[])" class="com.mycompany.myapp.Main" />
-        <class classes="public"/>
-      </keep>
-    </shrink>
-
-    <rename mainclass="com.mycompany.myapp.Main" logfile="renamelog.xml">
-      <property name="error-checking" value="pedantic"/>
-      <keep>
-        <class classes="public"/>
-      </keep>
-    </rename>
-
-  </yguard>
- -

- This example demonstrates full method and field obfuscation for a program, that - has external dependencies. The dependencies are specified in the - externalclasses element using standard Ant path specification - mechanisms. Classes residing in lib/external.jar and underneath - the lib/additional/classes/ directory (note the trailing slash), - will be used to resolve external dependencies during the obfuscation run. - This is necessary if external classes want to access obfuscated classes - directly using an externally defined interface or superclass. yGuard - automatically detects externally declared methods and prevents renaming and shrinking of - these items. As a result, the shrinked and obfuscated jar file can be used together with - unmodified versions of external libraries without causing any problems. -
- This example also demonstrates the use of the error-checking - property. In this case the Ant target fails if any problem is detected during - the obfuscation run. -

- - - -

Example 5: A Program with .properties Files and Other Resource Files

- -
-
-  <yguard>
-
-    <inoutpair in="myapp.jar" out="myapp_obf.jar"/>
-
-    <shrink logfile="shrinklog.xml">
-      <keep>
-        <!-- single entrypoint: main method -->
-        <method name="void main(java.lang.String[])" class="com.mycompany.myapp.Main" />
-      </keep>
-    </shrink>
-
-    <rename mainclass="com.mycompany.myapp.Main" logfile="renamelog.xml">
-
-      <adjust replaceContent="true">
-        <!-- plain-text class names in the config files will -->
-        <!-- be replaced with the obfuscated name versions -->
-        <include name="**/*.config"/>
-        <include name="com/mycompany/myapp/init/Main.properties"/>
-      </adjust>
-      <adjust replacePath="false">
-        <!-- keep the complete path to the resources, (gifs...) even if -->
-        <!-- package com.mycompany.myapp gets obfuscated by name -->
-        <include name="com/mycompany/myapp/resources/*"/>
-      </adjust>
-      <adjust replaceName="true">
-        <!-- Replace the .properties files' names with the obfuscated -->
-        <!-- versions if the corresponding .class files get obfuscated -->
-        <include name="**/*.properties"/>
-        </adjust>
-    </rename>
-
-  </yguard>
- -

- This example, too, demonstrates full method and field obfuscation for a program, that - uses .properties files and other resources files. - Some configuration files are used that contain fully qualified classnames - for plugins that are going to be obfuscated. Therefore yGuard is instructed to - automatically replace the plain-text entries in those files with the obfuscated - name versions. -
- Additionally some resources are hardcoded into the classes (image locations - and html files, e.g.). yGuard gets instructed not to move these resource files - even if they reside in a package structure that is obfuscated. -
- Since the property files have been created with the same name as the classes - that make use of them and they are being loaded using this.getClass().getName(), - yGuard is configured to rename the .properties files according to the obfuscated - names of the corresponding .class files. -

- - - - -

Example 6: A Program Linked Against a Library That Needs to be Obfuscated

- -
-
-  <yguard>
-
-    <inoutpair in="myapp.jar" out="myapp_obf.jar"/>
-    <inoutpair in="lib/thirdpartylib.jar" out="lib/thirdpartylib_obf.jar"/>
-
-    <externalclasses>
-      <pathelement location="lib/external.jar"/>
-    </externalclasses>
-
-    <!-- Keep all of the attributes for debugging, e.g. -->
-    <attribute name="Deprecated, SourceFile, LineNumberTable, LocalVariableTable>
-      <patternset refid="myopenapp"/>
-    </attribute>
-
-    <rename mainclass="org.myorg.myapp.Main" logfile="renamelog.xml">
-
-      <property name="error-checking" value="pedantic"/>
-
-      <keep>
-      <!-- Tell the obfuscator to only adjust my classes -->
-      <!-- to work with the obfuscated 3rd party library -->
-      <!-- but leave them virtually unmodified otherwise -->
-      <!-- The libconnector package however will be -->
-      <!-- obfuscated as much as possible -->
-      <class classes="private" methods="private" fields="private">
-        <patternset id="myopenapp">
-          <include name="org.myorg.myapp.**"/>
-          <exclude name="org.myorg.myapp.mylibconnector.**"/>
-        </patternset>
-      </class>
-
-      </keep>
-    </rename>
-
-  </yguard>
- -

- This example demonstrates almost no method, class, and field obfuscation for a program, that - has external dependencies and additionally depends on a third party library jar - which has to be obfuscated before deployment. Only those parts that actually interface with - the third party jar in the mylibconnector package are being obfuscated. - Nothing in the third party library jar will be - exposed in the final application, everything will be obfuscated and the code - in the open application that makes use of the third party jar will be adjusted. - Note that the public part of the application will still be debuggable since all of the - crucial attributes will be exposed for the open application part. -
- The dependencies are specified in the - externalclasses element using standard Ant path specification - mechanisms. Classes residing in lib/external.jar - will be used to resolve external dependencies during the obfuscation run. - This is not strictly necessary in this case since the public API will be fully exposed, - i.e. no methods which have been declared by interfaces or super class in external - classes will be renamed. -

- - - -

Example 7: Using the extends and implements Attributes (Serializable Exclusion)

- - -
-
-  <yguard>
-
-    <inoutpair in="myapp.jar" out="myapp_obf.jar"/>
-
-    <shrink>
-      <keep>
-        <!-- main method -->
-        <method name="void main(java.lang.String[])" class="org.myorg.myapp.Main" />
-        <!-- serializable classes -->
-        <class implements="java.io.Serializable" classes="private" methods="private" fields="private" />
-        <!-- menu items loaded per reflection -->
-        <class extends="org.myorg.myapp.MyMenuItem" classes="friendly" methods="public" fields="public" />
-      </keep>
-    </shrink>
-
-    <rename mainclass="org.myorg.myapp.Main" logfile="renamelog.xml">
-
-      <keep>
-        <method name="void readObject(java.io.ObjectInputStream)" />
-        <method name="void writeObject(java.io.ObjectOutputStream)" />
-        <field name="serialVersionUID" />
-        <class extends="org.myorg.myapp.MyMenuItem" classes="friendly" methods="public" fields="public" />
-      </keep>
-    </rename>
-
-  </yguard>
- -

- This example demonstrates the usage of the new implements and extends attributes of the - class element. All Serializable classes are excluded from shrinking by using the implements - attribute - of the class element. - Additionally, all classes that extend the base class for menu items, org.myorg.myapp.MyMenuItem, are - defined as entrypoints - for the shrinking engine using the extends attribute of the class element. - The readObject and writeObject methods and the field serialVersionUID needed - for serialization are excluded from name obfuscation as well. -

- - - - - -

Example 8: Annotations in Source Code to Control Obfuscation Exclusion

- -

- This section gives examples on how to use annotations to control which elements should - be excluded from the obfuscation process (i.e., keep their names). The following - assumes that there is an annotation class named com.yworks.util.annotation.Obfuscation - in the classpath that follows the convention as described above. -

- -

Example 8.a: Obfuscation Exclusion per Item

- -
-@com.yworks.util.annotation.Obfuscation( exclude = true, applyToMembers = false)
-public class Person {
-
-  public String name;
-
-  public String occupation;
-
-  @com.yworks.util.annotation.Obfuscation( exclude = true )
-  public int age;
-}
-
- -

-

Obfuscation

- - - - - - - - - - - - - - - - - - - - - -
ElementObfuscated?
class PersonNo
field nameYes
field occupationYes
field ageNo
-
-

- -

- The table above shows the result of the obfuscation of this example. - The Person class is annotated to be excluded from the obfuscation, but the - applyToMembers attribute is set to false, which means that the child elements - of the class (the String and int fields) do not inherit this setting from its parent. - The name and occupation fields are not annotated and do not inherit the annotation - configuration from their parent, so they are obfuscated. The age field however is also - annotated to be excluded from obfuscation and thus keeps its name. -

- -

Example 8.b: Obfuscation Exclusion for Members Using applyToMembers

- -
-@com.yworks.util.annotation.Obfuscation( exclude = true, applyToMembers = true)
-public class Person {
-
-  @com.yworks.util.annotation.Obfuscation( exclude = false )
-  public String name;
-
-  public String occupation;
-
-  public int age;
-}
-
- -

-

Obfuscation

- - - - - - - - - - - - - - - - - - - - - -
ElementObfuscated?
class PersonNo
field nameYes
field occupationNo
field ageNo
-
-

- -

- Again, the class Person keeps its name, but the configuration is inherited by its members, too. - The fields occupation and age have no annotation set and inherit the configuration - of its parent, which is exclude = true, so they keep their names. The field name - however specifies its own annotation and thus overrides the configuration of its parent and sets its own - exclusion to false, so it is obfuscated. -

- -

Example 8.c: Obfuscation Exclusion for Members using applyToMembers in the Case of Nested Classes

- -
-@Obfuscation ( exclude = true, applyToMembers = true )
-public class Person {
-
-  public String name;
-
-  public String occupation;
-
-  public int age;
-
-  @Obfuscation ( exclude = false, applyToMembers = true )
-  class BirthInfo {
-
-    String birthPlace;
-
-    class Date {
-
-      int year;
-
-      int month;
-
-      int day;
-    }
-  }
-}
-
- -

-

Obfuscation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementObfuscated?
class PersonNo
field nameNo
field occupationNo
field ageNo
class BirthInfoYes
field birthPlaceYes
class DateYes
field yearYes
field monthYes
field dayYes
-
-

- -

- The applyToMembers configuration is also applicable to inner classes: - In the above example, the top level class Person is annotated so that itself - and all its members should be excluded from obfuscation. But, the inner class - BirthInfo overrides this configuration by setting exclude - to false for itself and all of its members. When yGuard has to decide - whether to keep or obfuscate a non-annotated element, then it will look for - annotations by going up the nesting-hierarchy until the top level class is reached or a parent - has the applyToMembers configuration set to true. - In this case, when deciding whether to keep the inner class Date, - yGuard goes up the hierarchy and finds the annotation at BirthInfo, - which is annotated exclude = false. This results in Date being obfuscated. - The same applies to the members of Date. -

- -

Example 8.d: Obfuscation Exclusion Using applyToMembers in the Case of Nested Classes II

- -
-@Obfuscation ( exclude = true, applyToMembers = true )
-public class Person {
-
-  public String name;
-
-  public String occupation;
-
-  public int age;
-
-  @Obfuscation ( exclude = false, applyToMembers = false )
-  class BirthInfo {
-
-    String birthPlace;
-
-    class Date {
-
-      int year;
-
-      int month;
-
-      int day;
-    }
-  }
-}
-
- -

-

Obfuscation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementObfuscated?
class PersonNo
field nameNo
field occupationNo
field ageNo
class BirthInfoNo
field birthPlaceNo
class DateNo
field yearNo
field monthNo
field dayNo
-
-

- -

- The above example shows almost the same code as in Example 8.c, but this time the class BirthInfo - has the applyToMembers annotation set to false. One might expect that, as a result, - all members of BirthInfo are kept and only BirthInfo is obfuscated, but instead, all - elements in this example are kept. The explanation: when reaching Date, yGuard is looking up its parent's - configuration, BirthInfo, which has applyToMembers = false. yGuard then proceeds to the - next parent class in the nesting-hierarchy, Person, which has applyToMembers = true and - exclude = true set. This causes Date to be kept. But keeping a class also means - that its fully qualified name and thus its nesting-hierarchy needs to be kept. Although the annotation of - BirthInfo does not explicitly retain the the name of the class, the retention of Date and - its nesting-hierarchy causes BirthInfo to be kept. -

- - -

Example 8.e: Default Behavior

- -
-public class Person {
-
-  public String name;
-
-  public String occupation;
-
-  @com.yworks.util.annotation.Obfuscation
-  public int age;
-
-}
-
- -

-

Obfuscation

- - - - - - - - - - - - - - - - - - - - - -
ElementObfuscated?
class PersonYes
field nameYes
field occupationYes
field ageNo
-
-

- -

- This example shows the default behavior of yGuard without specifying an annotation and when not assigning - the attributes of the annotation. Person, name and occupation - are obfuscated, while age is annotated. The default value for exclude is - true, so the field age is not obfuscated. -

- -
- - - -

Deobfuscating Stacktraces Etc.

- -
-

- yGuard provides a simple tool that makes it easy for the obfuscating party to deobfuscate stacktraces - which have been obfuscated using yGuard. During the obfuscation yGuard produces an xml logfile which can - automatically be gzipped for convenient storage. You should always keep those logfiles in order to - be able to deobfuscate fully qualified classnames or methods or fields for debugging purposes e.g. -
- In order to run the yGuard deobfuscation tool do the following: -

-      Console> java -jar yguard.jar mylogfile.xml
- A tiny GUI will popup that will enable you to easily deobfuscate stacktraces and fully qualified classnames - as well as provide a convenient way to browse the mapping generated by yGuard. -
- In the main window a tree view displays the package, class, and classmember hierarchy using the unobfuscated - names. For each entry that has been obfuscated - (classes, packages, methods, and fields that have not been obfuscated at all may not always be shown in the tree) - the corresponding mapped/obfuscated name is displayed. -
- The two buttons at the top of the window allow to change the sorting of the items in the tree structure, so that - they are either sorted according to their names before or after the obfuscation. Items will always be sorted by type - first: - packages, classes, innerclasses, methods, and fields. Small icons provide a convenient way to quickly find the - corresponding items. -

- -

- The lower part of the window contains an editable text area that can be used to enter text or paste stacktraces in. - Pressing the button at the bottom of the window labelled "Deobfuscate" will trigger the deobfuscation of the - contents in - the text area. The tool will try to identify fully qualified class names (separated by dots) and use the mapping - information to reconstruct the original names. If the tool identifies a stack trace element, it will try to - deobfuscate - scrambled line numbers, too, if they have been scrambled during the obfuscation process. -

-
- - - - -

Problems and Bug Reports

- -
-

- If you experience any problems or think you have found a bug feel free to send - an email to yguard@yworks.com but - please make sure you have read the documentation thoroughly before. We will - do our best and try to answer your questions. -

-
- - - -

DTD used for Ant <yguard>

- -
-

- The obfuscation and shrinking process can be completely configured inside your Ant script. - The yguard task and nested elements should be used according to the following DTD. Note that this - is for information purposes only, i.e. you do not have to include the following lines anywhere. - This DTD should just provide a quick overview of the yGuard syntax. Due to restrictions of the DTD specification, - the given DTD does not describe all available yGuard options. Please browse through the documentation above for - complete documentation of the yGuard Ant task elements. -

- -
-  <!ELEMENT yguard (inoutpair+,externalclasses?,attribute*,(shrink|rename)+)>
-
-  <!ELEMENT inoutpair EMPTY>
-  <!ATTLIST inoutpair
-  in CDATA #REQUIRED
-  out CDATA #REQUIRED
-  resources CDATA #IMPLIED>
-  <!--
-  NOTE: the resources attribute only has an effect if a shrink element is present inside the yguard element.
-  -->
-
-  <!ELEMENT externalclasses ANY>
-  <!-- the externalclasses element is used just like Ant's classpath
-  element. See the Ant documentation for further details-->
-
-  <!ELEMENT attribute (patternset)*>
-  name CDATA #REQUIRED>
-
-  <!ELEMENT shrink (entrypointjar*,keep?)>
-  <!ATTLIST shrink
-  logfile CDATA #IMPLIED
-  createStubs CDATA #IMPLIED>
-
-  <!ELEMENT entrypointjar>
-  <!ATTLIST entrypointjar
-  name CDATA #REQUIRED>
-
-  <!ELEMENT rename (property*,patch?,adjust*,map?,keep?)>
-  <!ATTLIST rename
-  mainclass CDATA #IMPLIED
-  logfile CDATA #IMPLIED
-  conservemanifest CDATA #IMPLIED
-  replaceClassNameStrings CDATA #IMPLIED>
-
-  <!ELEMENT property EMPTY>
-  <!ATTLIST property
-  name CDATA #REQUIRED
-  value CDATA #REQUIRED>
-
-  <!ELEMENT patch (class)*>
-
-  <!ELEMENT adjust (#PCDATA)>
-  <!ATTLIST adjust
-  replaceName CDATA #REQUIRED
-  replaceContent CDATA #REQUIRED
-  replacePath CDATA #REQUIRED>
-
-  <!ELEMENT map (class|method|field|package)*>
-
-  <!ELEMENT package (patternset)*>
-  <!ATTLIST package
-  name CDATA #REQUIRED
-  map CDATA #REQUIRED>
-  <!--
-  NOTE: the map attribute is only supported
-  if the <package> element is nested inside a <map> element, whereas the patternset is
-  only supported inside the <keep>/<expose> sections.
-  -->
-
-  <!ELEMENT keep (package|class|method|field|sourcefile|linenumbertable)*>
-  <!--
-  NOTE: the nested <package>,<sourcefile>,<linenumbertable> and <attribute> sections are only
-  supported in the <rename> element.
-  -->
-  <!ATTLIST keep
-  linenumbertable CDATA #IMPLIED
-  localvariabletable CDATA #IMPLIED
-  localvariabletypetable CDATA #IMPLIED
-  runtimeinvisibleannotations CDATA #IMPLIED
-  runtimeinvisibletypeannotations CDATA #IMPLIED
-  runtimevisibleannotations CDATA #IMPLIED
-  runtimevisibletypeannotations CDATA #IMPLIED
-  sourcefile CDATA #IMPLIED>
-
-  <!ELEMENT class (patternset)*>
-  <!ATTLIST class
-  classes CDATA #IMPLIED
-  fields CDATA #IMPLIED
-  map CDATA #IMPLIED
-  methods CDATA #IMPLIED
-  name CDATA #IMPLIED>
-  <!--
-  NOTE: the map attribute is only supported
-  if the <class> element is nested inside an <rename> element.
-  -->
-
-  <!ELEMENT method (patternset)*>
-  <!ATTLIST method
-  class CDATA #IMPLIED
-  map CDATA #IMPLIED
-  name CDATA #IMPLIED>
-  <!--
-  NOTE: the map attribute is only supported
-  if the <method> element is nested inside an <rename> element.
-  -->
-
-  <!ELEMENT field (patternset)*>
-  <!ATTLIST field
-  class CDATA #IMPLIED
-  map CDATA #IMPLIED
-  name CDATA #IMPLIED>
-  <!--
-  NOTE: the field attribute is only supported
-  if the <method> element is nested inside an <rename> element.
-  -->
-
- - -

- Attention users of IDEs that "support" the creation of Ant files (e.g. IDEA's IntelliJ): - Your IDE may indicate some errors inside your ANT file when you use yGuard specific - elements. This is because the IDE does not know about the DTD used by yGuard. However - this is not a real problem, since the Ant file should nevertheless work as expected. -

- - -
- - -
- -
-

-Copyright © 2002-2014 yWorks. All Rights Reserved. -

-
- - - diff --git a/tools/yguard-2.5.2/lib/ObfuscationAnnotation.jar b/tools/yguard-2.5.2/lib/ObfuscationAnnotation.jar deleted file mode 100644 index cbc89de5..00000000 Binary files a/tools/yguard-2.5.2/lib/ObfuscationAnnotation.jar and /dev/null differ diff --git a/tools/yguard-2.5.2/lib/yguard.jar b/tools/yguard-2.5.2/lib/yguard.jar deleted file mode 100644 index 989ecf75..00000000 Binary files a/tools/yguard-2.5.2/lib/yguard.jar and /dev/null differ diff --git a/tools/yguard.jar b/tools/yguard.jar index 989ecf75..27d9e3ae 100644 Binary files a/tools/yguard.jar and b/tools/yguard.jar differ