ART: Change indentation to 4 spaces in run-test shards 95-99.
Created with
for testName in \
`git grep -E '^ public static void main\(String\[\]' \
-- test/*<i>-*/src/Main.java | \
sed '-es/\/src\/Main.java:.*//'`; \
do \
find $testName/ -type f -name *.java | \
xargs sed -E '-es/^(( )+)/\1\1/' --in-place ; \
done
with <i> manually set to 99 down to 95 (stopping when the
change is getting large).
Manually address many long lines and fix other style issues.
Also fix indentation in two files where
https://android-review.googlesource.com/2300941
just updated previously wrong indentation.
Exclude changes to
test/595-profile-saving/src/Main.java
because of a conflict in internal.
Test: testrunner.py --host --optimizing
Test: buildbot-build.sh --target
Change-Id: I02fe676f3983610c0cdda1134aee2476f71bc7ce
diff --git a/test/1995-final-virtual-structural-multithread/src/Main.java b/test/1995-final-virtual-structural-multithread/src/Main.java
index f19358d..f3bf4f6 100644
--- a/test/1995-final-virtual-structural-multithread/src/Main.java
+++ b/test/1995-final-virtual-structural-multithread/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1995.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1995.run();
+ }
}
diff --git a/test/1995-final-virtual-structural-multithread/src/art/Test1995.java b/test/1995-final-virtual-structural-multithread/src/art/Test1995.java
index 7073494..a960c74 100644
--- a/test/1995-final-virtual-structural-multithread/src/art/Test1995.java
+++ b/test/1995-final-virtual-structural-multithread/src/art/Test1995.java
@@ -21,150 +21,153 @@
import java.util.Base64;
import java.util.concurrent.CountDownLatch;
public class Test1995 {
- private static final int NUM_THREADS = 20;
- // Don't perform more than this many repeats per thread to prevent OOMEs
- private static final int TASK_COUNT_LIMIT = 1000;
+ private static final int NUM_THREADS = 20;
+ // Don't perform more than this many repeats per thread to prevent OOMEs
+ private static final int TASK_COUNT_LIMIT = 1000;
- public static final class Transform {
- public String greetingEnglish;
- public Transform() {
- this.greetingEnglish = "Hello";
- }
- public String sayHi() {
- return greetingEnglish + " from " + Thread.currentThread().getName();
- }
- }
-
- /**
- * base64 encoded class/dex file for
- * public static final class Transform {
- * public String greetingEnglish;
- * public String greetingFrench;
- * public String greetingDanish;
- * public String greetingJapanese;
- *
- * public Transform() {
- * this.greetingEnglish = "Hello World";
- * this.greetingFrench = "Bonjour le Monde";
- * this.greetingDanish = "Hej Verden";
- * this.greetingJapanese = "こんにちは世界";
- * }
- * public String sayHi() {
- * return sayHiEnglish() + ", " + sayHiFrench() + ", " + sayHiDanish() + ", " + sayHiJapanese() + " from " + Thread.currentThread().getName();
- * }
- * public String sayHiEnglish() {
- * return greetingEnglish;
- * }
- * public String sayHiDanish() {
- * return greetingDanish;
- * }
- * public String sayHiJapanese() {
- * return greetingJapanese;
- * }
- * public String sayHiFrench() {
- * return greetingFrench;
- * }
- * }
- */
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
-"ZGV4CjAzNQCsHrUqkb8cYgT2oYN7HlVbeOxJT/kONRvgBgAAcAAAAHhWNBIAAAAAAAAAABwGAAAl" +
-"AAAAcAAAAAkAAAAEAQAABAAAACgBAAAEAAAAWAEAAAwAAAB4AQAAAQAAANgBAADoBAAA+AEAAEoD" +
-"AABSAwAAVgMAAF4DAABwAwAAfAMAAIkDAACMAwAAkAMAAKoDAAC6AwAA3gMAAP4DAAASBAAAJgQA" +
-"AEEEAABVBAAAZAQAAG8EAAByBAAAfwQAAIcEAACWBAAAnwQAAK8EAADABAAA0AQAAOIEAADoBAAA" +
-"7wQAAPwEAAAKBQAAFwUAACYFAAAwBQAANwUAAK8FAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAO" +
-"AAAADwAAABIAAAAGAAAABQAAAAAAAAAHAAAABgAAAEQDAAAGAAAABwAAAAAAAAASAAAACAAAAAAA" +
-"AAAAAAUAFwAAAAAABQAYAAAAAAAFABkAAAAAAAUAGgAAAAAAAwACAAAAAAAAABwAAAAAAAAAHQAA" +
-"AAAAAAAeAAAAAAAAAB8AAAAAAAAAIAAAAAQAAwACAAAABgADAAIAAAAGAAEAFAAAAAYAAAAhAAAA" +
-"BwACABUAAAAHAAAAFgAAAAAAAAARAAAABAAAAAAAAAAQAAAADAYAANUFAAAAAAAABwABAAIAAAAt" +
-"AwAAQQAAAG4QAwAGAAwAbhAEAAYADAFuEAIABgAMAm4QBQAGAAwDcQAKAAAADARuEAsABAAMBCIF" +
-"BgBwEAcABQBuIAgABQAaAAEAbiAIAAUAbiAIABUAbiAIAAUAbiAIACUAbiAIAAUAbiAIADUAGgAA" +
-"AG4gCAAFAG4gCABFAG4QCQAFAAwAEQAAAAIAAQAAAAAAMQMAAAMAAABUEAAAEQAAAAIAAQAAAAAA" +
-"NQMAAAMAAABUEAEAEQAAAAIAAQAAAAAAOQMAAAMAAABUEAIAEQAAAAIAAQAAAAAAPQMAAAMAAABU" +
-"EAMAEQAAAAIAAQABAAAAJAMAABQAAABwEAYAAQAaAAUAWxABABoAAwBbEAIAGgAEAFsQAAAaACQA" +
-"WxADAA4ACQAOPEtLS0sAEAAOABYADgATAA4AHAAOABkADgAAAAABAAAABQAGIGZyb20gAAIsIAAG" +
-"PGluaXQ+ABBCb25qb3VyIGxlIE1vbmRlAApIZWogVmVyZGVuAAtIZWxsbyBXb3JsZAABTAACTEwA" +
-"GExhcnQvVGVzdDE5OTUkVHJhbnNmb3JtOwAOTGFydC9UZXN0MTk5NTsAIkxkYWx2aWsvYW5ub3Rh" +
-"dGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwASTGph" +
-"dmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVp" +
-"bGRlcjsAEkxqYXZhL2xhbmcvVGhyZWFkOwANVGVzdDE5OTUuamF2YQAJVHJhbnNmb3JtAAFWAAth" +
-"Y2Nlc3NGbGFncwAGYXBwZW5kAA1jdXJyZW50VGhyZWFkAAdnZXROYW1lAA5ncmVldGluZ0Rhbmlz" +
-"aAAPZ3JlZXRpbmdFbmdsaXNoAA5ncmVldGluZ0ZyZW5jaAAQZ3JlZXRpbmdKYXBhbmVzZQAEbmFt" +
-"ZQAFc2F5SGkAC3NheUhpRGFuaXNoAAxzYXlIaUVuZ2xpc2gAC3NheUhpRnJlbmNoAA1zYXlIaUph" +
-"cGFuZXNlAAh0b1N0cmluZwAFdmFsdWUAdn5+RDh7ImNvbXBpbGF0aW9uLW1vZGUiOiJkZWJ1ZyIs" +
-"Im1pbi1hcGkiOjEsInNoYS0xIjoiNjBkYTRkNjdiMzgxYzQyNDY3NzU3YzQ5ZmI2ZTU1NzU2ZDg4" +
-"YTJmMyIsInZlcnNpb24iOiIxLjcuMTItZGV2In0AB+OBk+OCk+OBq+OBoeOBr+S4lueVjAACAgEi" +
-"GAECAwITBBkbFxEABAEFAAEBAQEBAQEAgYAE7AUBAfgDAQGMBQEBpAUBAbwFAQHUBQAAAAAAAgAA" +
-"AMYFAADMBQAAAAYAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAAAAABAAAAJQAAAHAAAAACAAAA" +
-"CQAAAAQBAAADAAAABAAAACgBAAAEAAAABAAAAFgBAAAFAAAADAAAAHgBAAAGAAAAAQAAANgBAAAB" +
-"IAAABgAAAPgBAAADIAAABgAAACQDAAABEAAAAQAAAEQDAAACIAAAJQAAAEoDAAAEIAAAAgAAAMYF" +
-"AAAAIAAAAQAAANUFAAADEAAAAgAAAPwFAAAGIAAAAQAAAAwGAAAAEAAAAQAAABwGAAA=");
-
-
- public static void run() throws Exception {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest();
- }
-
- public static final class MyThread extends Thread {
- public MyThread(CountDownLatch delay, int id) {
- super("Thread: " + id);
- this.thr_id = id;
- this.results = new ArrayList<>(TASK_COUNT_LIMIT);
- this.finish = false;
- this.delay = delay;
- }
-
- public void run() {
- delay.countDown();
- while (!finish && results.size() < TASK_COUNT_LIMIT) {
- Transform t = new Transform();
- results.add(t.sayHi());
- }
- }
-
- public void finish() throws Exception {
- finish = true;
- this.join();
- }
-
- public void Check() throws Exception {
- for (String s : results) {
- if (!s.equals("Hello from " + getName()) &&
- !s.equals("Hello, null, null, null from " + getName()) &&
- !s.equals("Hello World, Bonjour le Monde, Hej Verden, こんにちは世界 from " + getName())) {
- System.out.println("FAIL " + thr_id + ": Unexpected result: " + s);
+ public static final class Transform {
+ public String greetingEnglish;
+ public Transform() {
+ this.greetingEnglish = "Hello";
}
- }
+ public String sayHi() {
+ return greetingEnglish + " from " + Thread.currentThread().getName();
+ }
}
- public ArrayList<String> results;
- public volatile boolean finish;
- public int thr_id;
- public CountDownLatch delay;
- }
+ /**
+ * base64 encoded class/dex file for
+ * public static final class Transform {
+ * public String greetingEnglish;
+ * public String greetingFrench;
+ * public String greetingDanish;
+ * public String greetingJapanese;
+ *
+ * public Transform() {
+ * this.greetingEnglish = "Hello World";
+ * this.greetingFrench = "Bonjour le Monde";
+ * this.greetingDanish = "Hej Verden";
+ * this.greetingJapanese = "こんにちは世界";
+ * }
+ * public String sayHi() {
+ * return sayHiEnglish() + ", " + sayHiFrench() + ", " + sayHiDanish() + ", " +
+ * sayHiJapanese() + " from " + Thread.currentThread().getName();
+ * }
+ * public String sayHiEnglish() {
+ * return greetingEnglish;
+ * }
+ * public String sayHiDanish() {
+ * return greetingDanish;
+ * }
+ * public String sayHiJapanese() {
+ * return greetingJapanese;
+ * }
+ * public String sayHiFrench() {
+ * return greetingFrench;
+ * }
+ * }
+ */
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQCsHrUqkb8cYgT2oYN7HlVbeOxJT/kONRvgBgAAcAAAAHhWNBIAAAAAAAAAABwGAAAl" +
+ "AAAAcAAAAAkAAAAEAQAABAAAACgBAAAEAAAAWAEAAAwAAAB4AQAAAQAAANgBAADoBAAA+AEAAEoD" +
+ "AABSAwAAVgMAAF4DAABwAwAAfAMAAIkDAACMAwAAkAMAAKoDAAC6AwAA3gMAAP4DAAASBAAAJgQA" +
+ "AEEEAABVBAAAZAQAAG8EAAByBAAAfwQAAIcEAACWBAAAnwQAAK8EAADABAAA0AQAAOIEAADoBAAA" +
+ "7wQAAPwEAAAKBQAAFwUAACYFAAAwBQAANwUAAK8FAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAO" +
+ "AAAADwAAABIAAAAGAAAABQAAAAAAAAAHAAAABgAAAEQDAAAGAAAABwAAAAAAAAASAAAACAAAAAAA" +
+ "AAAAAAUAFwAAAAAABQAYAAAAAAAFABkAAAAAAAUAGgAAAAAAAwACAAAAAAAAABwAAAAAAAAAHQAA" +
+ "AAAAAAAeAAAAAAAAAB8AAAAAAAAAIAAAAAQAAwACAAAABgADAAIAAAAGAAEAFAAAAAYAAAAhAAAA" +
+ "BwACABUAAAAHAAAAFgAAAAAAAAARAAAABAAAAAAAAAAQAAAADAYAANUFAAAAAAAABwABAAIAAAAt" +
+ "AwAAQQAAAG4QAwAGAAwAbhAEAAYADAFuEAIABgAMAm4QBQAGAAwDcQAKAAAADARuEAsABAAMBCIF" +
+ "BgBwEAcABQBuIAgABQAaAAEAbiAIAAUAbiAIABUAbiAIAAUAbiAIACUAbiAIAAUAbiAIADUAGgAA" +
+ "AG4gCAAFAG4gCABFAG4QCQAFAAwAEQAAAAIAAQAAAAAAMQMAAAMAAABUEAAAEQAAAAIAAQAAAAAA" +
+ "NQMAAAMAAABUEAEAEQAAAAIAAQAAAAAAOQMAAAMAAABUEAIAEQAAAAIAAQAAAAAAPQMAAAMAAABU" +
+ "EAMAEQAAAAIAAQABAAAAJAMAABQAAABwEAYAAQAaAAUAWxABABoAAwBbEAIAGgAEAFsQAAAaACQA" +
+ "WxADAA4ACQAOPEtLS0sAEAAOABYADgATAA4AHAAOABkADgAAAAABAAAABQAGIGZyb20gAAIsIAAG" +
+ "PGluaXQ+ABBCb25qb3VyIGxlIE1vbmRlAApIZWogVmVyZGVuAAtIZWxsbyBXb3JsZAABTAACTEwA" +
+ "GExhcnQvVGVzdDE5OTUkVHJhbnNmb3JtOwAOTGFydC9UZXN0MTk5NTsAIkxkYWx2aWsvYW5ub3Rh" +
+ "dGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwASTGph" +
+ "dmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVp" +
+ "bGRlcjsAEkxqYXZhL2xhbmcvVGhyZWFkOwANVGVzdDE5OTUuamF2YQAJVHJhbnNmb3JtAAFWAAth" +
+ "Y2Nlc3NGbGFncwAGYXBwZW5kAA1jdXJyZW50VGhyZWFkAAdnZXROYW1lAA5ncmVldGluZ0Rhbmlz" +
+ "aAAPZ3JlZXRpbmdFbmdsaXNoAA5ncmVldGluZ0ZyZW5jaAAQZ3JlZXRpbmdKYXBhbmVzZQAEbmFt" +
+ "ZQAFc2F5SGkAC3NheUhpRGFuaXNoAAxzYXlIaUVuZ2xpc2gAC3NheUhpRnJlbmNoAA1zYXlIaUph" +
+ "cGFuZXNlAAh0b1N0cmluZwAFdmFsdWUAdn5+RDh7ImNvbXBpbGF0aW9uLW1vZGUiOiJkZWJ1ZyIs" +
+ "Im1pbi1hcGkiOjEsInNoYS0xIjoiNjBkYTRkNjdiMzgxYzQyNDY3NzU3YzQ5ZmI2ZTU1NzU2ZDg4" +
+ "YTJmMyIsInZlcnNpb24iOiIxLjcuMTItZGV2In0AB+OBk+OCk+OBq+OBoeOBr+S4lueVjAACAgEi" +
+ "GAECAwITBBkbFxEABAEFAAEBAQEBAQEAgYAE7AUBAfgDAQGMBQEBpAUBAbwFAQHUBQAAAAAAAgAA" +
+ "AMYFAADMBQAAAAYAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAAAAABAAAAJQAAAHAAAAACAAAA" +
+ "CQAAAAQBAAADAAAABAAAACgBAAAEAAAABAAAAFgBAAAFAAAADAAAAHgBAAAGAAAAAQAAANgBAAAB" +
+ "IAAABgAAAPgBAAADIAAABgAAACQDAAABEAAAAQAAAEQDAAACIAAAJQAAAEoDAAAEIAAAAgAAAMYF" +
+ "AAAAIAAAAQAAANUFAAADEAAAAgAAAPwFAAAGIAAAAQAAAAwGAAAAEAAAAQAAABwGAAA=");
- public static MyThread[] startThreads(int num_threads) throws Exception {
- CountDownLatch cdl = new CountDownLatch(num_threads);
- MyThread[] res = new MyThread[num_threads];
- for (int i = 0; i < num_threads; i++) {
- res[i] = new MyThread(cdl, i);
- res[i].start();
- }
- cdl.await();
- return res;
- }
- public static void finishThreads(MyThread[] thrs) throws Exception {
- for (MyThread t : thrs) {
- t.finish();
- }
- for (MyThread t : thrs) {
- t.Check();
- }
- }
- public static void doTest() throws Exception {
- MyThread[] threads = startThreads(NUM_THREADS);
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- finishThreads(threads);
- }
+ public static void run() throws Exception {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ doTest();
+ }
+
+ public static final class MyThread extends Thread {
+ public MyThread(CountDownLatch delay, int id) {
+ super("Thread: " + id);
+ this.thr_id = id;
+ this.results = new ArrayList<>(TASK_COUNT_LIMIT);
+ this.finish = false;
+ this.delay = delay;
+ }
+
+ public void run() {
+ delay.countDown();
+ while (!finish && results.size() < TASK_COUNT_LIMIT) {
+ Transform t = new Transform();
+ results.add(t.sayHi());
+ }
+ }
+
+ public void finish() throws Exception {
+ finish = true;
+ this.join();
+ }
+
+ public void Check() throws Exception {
+ for (String s : results) {
+ if (!s.equals("Hello from " + getName()) &&
+ !s.equals("Hello, null, null, null from " + getName()) &&
+ !s.equals(
+ "Hello World, Bonjour le Monde, Hej Verden, こんにちは世界 from " +
+ getName())) {
+ System.out.println("FAIL " + thr_id + ": Unexpected result: " + s);
+ }
+ }
+ }
+
+ public ArrayList<String> results;
+ public volatile boolean finish;
+ public int thr_id;
+ public CountDownLatch delay;
+ }
+
+ public static MyThread[] startThreads(int num_threads) throws Exception {
+ CountDownLatch cdl = new CountDownLatch(num_threads);
+ MyThread[] res = new MyThread[num_threads];
+ for (int i = 0; i < num_threads; i++) {
+ res[i] = new MyThread(cdl, i);
+ res[i].start();
+ }
+ cdl.await();
+ return res;
+ }
+ public static void finishThreads(MyThread[] thrs) throws Exception {
+ for (MyThread t : thrs) {
+ t.finish();
+ }
+ for (MyThread t : thrs) {
+ t.Check();
+ }
+ }
+
+ public static void doTest() throws Exception {
+ MyThread[] threads = startThreads(NUM_THREADS);
+ Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
+ finishThreads(threads);
+ }
}
diff --git a/test/1996-final-override-virtual-structural/src/Main.java b/test/1996-final-override-virtual-structural/src/Main.java
index ade69cf..ff10798 100644
--- a/test/1996-final-override-virtual-structural/src/Main.java
+++ b/test/1996-final-override-virtual-structural/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1996.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1996.run();
+ }
}
diff --git a/test/1996-final-override-virtual-structural/src/art/Test1996.java b/test/1996-final-override-virtual-structural/src/art/Test1996.java
index c2b1125..2649476 100644
--- a/test/1996-final-override-virtual-structural/src/art/Test1996.java
+++ b/test/1996-final-override-virtual-structural/src/art/Test1996.java
@@ -19,76 +19,76 @@
import java.util.Base64;
public class Test1996 {
- public static class SuperTransform {
- public String hiValue = "Hi";
- public String sayHi() {
- return this.hiValue;
+ public static class SuperTransform {
+ public String hiValue = "Hi";
+ public String sayHi() {
+ return this.hiValue;
+ }
}
- }
- public static final class Transform extends SuperTransform {
- public void PostTransform() { }
- public String sayHiTwice(Runnable run) {
- run.run();
- return "super: " + super.sayHi() + " this: " + sayHi();
+ public static final class Transform extends SuperTransform {
+ public void PostTransform() { }
+ public String sayHiTwice(Runnable run) {
+ run.run();
+ return "super: " + super.sayHi() + " this: " + sayHi();
+ }
}
- }
- /**
- * base64 encoded class/dex file for
- * public static final class Transform extends SuperTransform {
- * public String myGreeting;
- * public void PostTransform() {
- * myGreeting = "SALUTATIONS";
- * }
- * public String sayHiTwice(Runnable run) {
- * run.run();
- * return "super: " + super.sayHi() + " and then this: " + sayHi();
- * }
- * public String sayHi() {
- * return myGreeting;
- * }
- * }
- */
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
-"ZGV4CjAzNQAO4Dwurw97RcUtfH7np7S5RR8gsJYOfmeABQAAcAAAAHhWNBIAAAAAAAAAALwEAAAc" +
-"AAAAcAAAAAkAAADgAAAABAAAAAQBAAABAAAANAEAAAoAAAA8AQAAAQAAAIwBAADUAwAArAEAAHYC" +
-"AACIAgAAkAIAAJMCAACXAgAAtgIAANACAADgAgAABAMAACQDAAA6AwAATgMAAGkDAAB4AwAAhQMA" +
-"AJQDAACfAwAAogMAAK8DAAC3AwAAwwMAAMkDAADOAwAA1QMAAOEDAADqAwAA9AMAAPsDAAAEAAAA" +
-"BQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAABAAAAACAAAABgAAAAAAAAADAAAABgAAAGgCAAAD" +
-"AAAABwAAAHACAAAQAAAACAAAAAAAAAABAAYAEwAAAAAAAwABAAAAAAAAABYAAAABAAMAAQAAAAEA" +
-"AwAMAAAAAQAAABYAAAABAAEAFwAAAAUAAwAVAAAABwADAAEAAAAHAAIAEgAAAAcAAAAZAAAAAQAA" +
-"ABEAAAAAAAAAAAAAAA4AAACsBAAAggQAAAAAAAACAAEAAAAAAFsCAAADAAAAVBAAABEAAAAFAAIA" +
-"AgAAAF8CAAAlAAAAchAGAAQAbxABAAMADARuEAQAAwAMACIBBwBwEAcAAQAaAhgAbiAIACEAbiAI" +
-"AEEAGgQAAG4gCABBAG4gCAABAG4QCQABAAwEEQQAAAEAAQABAAAAUgIAAAQAAABwEAAAAAAOAAIA" +
-"AQAAAAAAVgIAAAUAAAAaAA0AWxAAAA4ACgAOAA0ADksAFAAOABABAA48AAAAAAEAAAAFAAAAAQAA" +
-"AAYAECBhbmQgdGhlbiB0aGlzOiAABjxpbml0PgABTAACTEwAHUxhcnQvVGVzdDE5OTYkU3VwZXJU" +
-"cmFuc2Zvcm07ABhMYXJ0L1Rlc3QxOTk2JFRyYW5zZm9ybTsADkxhcnQvVGVzdDE5OTY7ACJMZGFs" +
-"dmlrL2Fubm90YXRpb24vRW5jbG9zaW5nQ2xhc3M7AB5MZGFsdmlrL2Fubm90YXRpb24vSW5uZXJD" +
-"bGFzczsAFExqYXZhL2xhbmcvUnVubmFibGU7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xh" +
-"bmcvU3RyaW5nQnVpbGRlcjsADVBvc3RUcmFuc2Zvcm0AC1NBTFVUQVRJT05TAA1UZXN0MTk5Ni5q" +
-"YXZhAAlUcmFuc2Zvcm0AAVYAC2FjY2Vzc0ZsYWdzAAZhcHBlbmQACm15R3JlZXRpbmcABG5hbWUA" +
-"A3J1bgAFc2F5SGkACnNheUhpVHdpY2UAB3N1cGVyOiAACHRvU3RyaW5nAAV2YWx1ZQB2fn5EOHsi" +
-"Y29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFwaSI6MSwic2hhLTEiOiI2MGRhNGQ2N2Iz" +
-"ODFjNDI0Njc3NTdjNDlmYjZlNTU3NTZkODhhMmYzIiwidmVyc2lvbiI6IjEuNy4xMi1kZXYifQAC" +
-"AwEaGAICBAIRBBkUFw8AAQEDAAECgYAEoAQDAbgEAQGsAwEBxAMAAAAAAAACAAAAcwQAAHkEAACg" +
-"BAAAAAAAAAAAAAAAAAAAEAAAAAAAAAABAAAAAAAAAAEAAAAcAAAAcAAAAAIAAAAJAAAA4AAAAAMA" +
-"AAAEAAAABAEAAAQAAAABAAAANAEAAAUAAAAKAAAAPAEAAAYAAAABAAAAjAEAAAEgAAAEAAAArAEA" +
-"AAMgAAAEAAAAUgIAAAEQAAACAAAAaAIAAAIgAAAcAAAAdgIAAAQgAAACAAAAcwQAAAAgAAABAAAA" +
-"ggQAAAMQAAACAAAAnAQAAAYgAAABAAAArAQAAAAQAAABAAAAvAQAAA==");
+ /**
+ * base64 encoded class/dex file for
+ * public static final class Transform extends SuperTransform {
+ * public String myGreeting;
+ * public void PostTransform() {
+ * myGreeting = "SALUTATIONS";
+ * }
+ * public String sayHiTwice(Runnable run) {
+ * run.run();
+ * return "super: " + super.sayHi() + " and then this: " + sayHi();
+ * }
+ * public String sayHi() {
+ * return myGreeting;
+ * }
+ * }
+ */
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQAO4Dwurw97RcUtfH7np7S5RR8gsJYOfmeABQAAcAAAAHhWNBIAAAAAAAAAALwEAAAc" +
+ "AAAAcAAAAAkAAADgAAAABAAAAAQBAAABAAAANAEAAAoAAAA8AQAAAQAAAIwBAADUAwAArAEAAHYC" +
+ "AACIAgAAkAIAAJMCAACXAgAAtgIAANACAADgAgAABAMAACQDAAA6AwAATgMAAGkDAAB4AwAAhQMA" +
+ "AJQDAACfAwAAogMAAK8DAAC3AwAAwwMAAMkDAADOAwAA1QMAAOEDAADqAwAA9AMAAPsDAAAEAAAA" +
+ "BQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAABAAAAACAAAABgAAAAAAAAADAAAABgAAAGgCAAAD" +
+ "AAAABwAAAHACAAAQAAAACAAAAAAAAAABAAYAEwAAAAAAAwABAAAAAAAAABYAAAABAAMAAQAAAAEA" +
+ "AwAMAAAAAQAAABYAAAABAAEAFwAAAAUAAwAVAAAABwADAAEAAAAHAAIAEgAAAAcAAAAZAAAAAQAA" +
+ "ABEAAAAAAAAAAAAAAA4AAACsBAAAggQAAAAAAAACAAEAAAAAAFsCAAADAAAAVBAAABEAAAAFAAIA" +
+ "AgAAAF8CAAAlAAAAchAGAAQAbxABAAMADARuEAQAAwAMACIBBwBwEAcAAQAaAhgAbiAIACEAbiAI" +
+ "AEEAGgQAAG4gCABBAG4gCAABAG4QCQABAAwEEQQAAAEAAQABAAAAUgIAAAQAAABwEAAAAAAOAAIA" +
+ "AQAAAAAAVgIAAAUAAAAaAA0AWxAAAA4ACgAOAA0ADksAFAAOABABAA48AAAAAAEAAAAFAAAAAQAA" +
+ "AAYAECBhbmQgdGhlbiB0aGlzOiAABjxpbml0PgABTAACTEwAHUxhcnQvVGVzdDE5OTYkU3VwZXJU" +
+ "cmFuc2Zvcm07ABhMYXJ0L1Rlc3QxOTk2JFRyYW5zZm9ybTsADkxhcnQvVGVzdDE5OTY7ACJMZGFs" +
+ "dmlrL2Fubm90YXRpb24vRW5jbG9zaW5nQ2xhc3M7AB5MZGFsdmlrL2Fubm90YXRpb24vSW5uZXJD" +
+ "bGFzczsAFExqYXZhL2xhbmcvUnVubmFibGU7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xh" +
+ "bmcvU3RyaW5nQnVpbGRlcjsADVBvc3RUcmFuc2Zvcm0AC1NBTFVUQVRJT05TAA1UZXN0MTk5Ni5q" +
+ "YXZhAAlUcmFuc2Zvcm0AAVYAC2FjY2Vzc0ZsYWdzAAZhcHBlbmQACm15R3JlZXRpbmcABG5hbWUA" +
+ "A3J1bgAFc2F5SGkACnNheUhpVHdpY2UAB3N1cGVyOiAACHRvU3RyaW5nAAV2YWx1ZQB2fn5EOHsi" +
+ "Y29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFwaSI6MSwic2hhLTEiOiI2MGRhNGQ2N2Iz" +
+ "ODFjNDI0Njc3NTdjNDlmYjZlNTU3NTZkODhhMmYzIiwidmVyc2lvbiI6IjEuNy4xMi1kZXYifQAC" +
+ "AwEaGAICBAIRBBkUFw8AAQEDAAECgYAEoAQDAbgEAQGsAwEBxAMAAAAAAAACAAAAcwQAAHkEAACg" +
+ "BAAAAAAAAAAAAAAAAAAAEAAAAAAAAAABAAAAAAAAAAEAAAAcAAAAcAAAAAIAAAAJAAAA4AAAAAMA" +
+ "AAAEAAAABAEAAAQAAAABAAAANAEAAAUAAAAKAAAAPAEAAAYAAAABAAAAjAEAAAEgAAAEAAAArAEA" +
+ "AAMgAAAEAAAAUgIAAAEQAAACAAAAaAIAAAIgAAAcAAAAdgIAAAQgAAACAAAAcwQAAAAgAAABAAAA" +
+ "ggQAAAMQAAACAAAAnAQAAAYgAAABAAAArAQAAAAQAAABAAAAvAQAAA==");
- public static void run() {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest(new Transform());
- }
+ public static void run() {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ doTest(new Transform());
+ }
- public static void doTest(final Transform t) {
- System.out.println(t.sayHiTwice(() -> { System.out.println("Not doing anything"); }));
- System.out.println(t.sayHiTwice(
- () -> {
- System.out.println("Redefining calling class");
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- t.PostTransform();
- }));
- System.out.println(t.sayHiTwice(() -> { System.out.println("Not doing anything"); }));
- }
+ public static void doTest(final Transform t) {
+ System.out.println(t.sayHiTwice(() -> { System.out.println("Not doing anything"); }));
+ System.out.println(t.sayHiTwice(
+ () -> {
+ System.out.println("Redefining calling class");
+ Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
+ t.PostTransform();
+ }));
+ System.out.println(t.sayHiTwice(() -> { System.out.println("Not doing anything"); }));
+ }
}
diff --git a/test/1997-structural-shadow-method/src/Main.java b/test/1997-structural-shadow-method/src/Main.java
index 3c9bc85..f6552ee 100644
--- a/test/1997-structural-shadow-method/src/Main.java
+++ b/test/1997-structural-shadow-method/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1997.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1997.run();
+ }
}
diff --git a/test/1997-structural-shadow-method/src/art/Test1997.java b/test/1997-structural-shadow-method/src/art/Test1997.java
index 7309a31..5186518 100644
--- a/test/1997-structural-shadow-method/src/art/Test1997.java
+++ b/test/1997-structural-shadow-method/src/art/Test1997.java
@@ -20,65 +20,63 @@
public class Test1997 {
- public static class SuperTransform {
- // We will be shadowing this function.
- public static void sayHi() {
- System.out.println("Hello!");
+ public static class SuperTransform {
+ // We will be shadowing this function.
+ public static void sayHi() {
+ System.out.println("Hello!");
+ }
}
- }
- // The class we will be transforming.
- public static class Transform extends SuperTransform {
- public static void sayHiTwice() {
- Transform.sayHi();
- Transform.sayHi();
+ // The class we will be transforming.
+ public static class Transform extends SuperTransform {
+ public static void sayHiTwice() {
+ Transform.sayHi();
+ Transform.sayHi();
+ }
}
- }
- // public static class Transform extends SuperTransform {
- // public static void sayHiTwice() {
- // Transform.sayHi();
- // Transform.sayHi();
- // }
- // public static void sayHi() {
- // System.out.println("Hello World!");
- // }
- // }
- private static final byte[] DEX_BYTES =
- Base64.getDecoder()
- .decode(
- "ZGV4CjAzNQA9wdy7Lgbrv+sD+wixborREr0maZCK5yqABAAAcAAAAHhWNBIAAAAAAAAAALwDAAAW"
- + "AAAAcAAAAAkAAADIAAAAAgAAAOwAAAABAAAABAEAAAUAAAAMAQAAAQAAADQBAAAsAwAAVAEAAMIB"
- + "AADKAQAA2AEAAPcBAAARAgAAIQIAAEUCAABlAgAAfAIAAJACAACkAgAAswIAAL4CAADBAgAAxQIA"
- + "ANICAADYAgAA3QIAAOYCAADtAgAA+QIAAAADAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAA"
- + "CQAAAAwAAAAMAAAACAAAAAAAAAANAAAACAAAALwBAAAHAAUAEAAAAAAAAAAAAAAAAQAAAAAAAAAB"
- + "AAAAEgAAAAEAAAATAAAABQABABEAAAABAAAAAQAAAAAAAAAAAAAACgAAAKwDAACHAwAAAAAAAAEA"
- + "AQABAAAAqgEAAAQAAABwEAAAAAAOAAIAAAACAAAArgEAAAgAAABiAAAAGgEBAG4gBAAQAA4AAAAA"
- + "AAAAAACzAQAABwAAAHEAAgAAAHEAAgAAAA4ADwAOABUADngAEQAOPDwAAAAAAQAAAAYABjxpbml0"
- + "PgAMSGVsbG8gV29ybGQhAB1MYXJ0L1Rlc3QxOTk3JFN1cGVyVHJhbnNmb3JtOwAYTGFydC9UZXN0"
- + "MTk5NyRUcmFuc2Zvcm07AA5MYXJ0L1Rlc3QxOTk3OwAiTGRhbHZpay9hbm5vdGF0aW9uL0VuY2xv"
- + "c2luZ0NsYXNzOwAeTGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7ABVMamF2YS9pby9Qcmlu"
- + "dFN0cmVhbTsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07AA1UZXN0MTk5"
- + "Ny5qYXZhAAlUcmFuc2Zvcm0AAVYAAlZMAAthY2Nlc3NGbGFncwAEbmFtZQADb3V0AAdwcmludGxu"
- + "AAVzYXlIaQAKc2F5SGlUd2ljZQAFdmFsdWUAdn5+RDh7ImNvbXBpbGF0aW9uLW1vZGUiOiJkZWJ1"
- + "ZyIsIm1pbi1hcGkiOjEsInNoYS0xIjoiNjBkYTRkNjdiMzgxYzQyNDY3NzU3YzQ5ZmI2ZTU1NzU2"
- + "ZDg4YTJmMyIsInZlcnNpb24iOiIxLjcuMTItZGV2In0AAgMBFBgCAgQCDgQJDxcLAAADAAGBgATU"
- + "AgEJ7AIBCYwDAAAAAAAAAAIAAAB4AwAAfgMAAKADAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAEAAAAA"
- + "AAAAAQAAABYAAABwAAAAAgAAAAkAAADIAAAAAwAAAAIAAADsAAAABAAAAAEAAAAEAQAABQAAAAUA"
- + "AAAMAQAABgAAAAEAAAA0AQAAASAAAAMAAABUAQAAAyAAAAMAAACqAQAAARAAAAEAAAC8AQAAAiAA"
- + "ABYAAADCAQAABCAAAAIAAAB4AwAAACAAAAEAAACHAwAAAxAAAAIAAACcAwAABiAAAAEAAACsAwAA"
- + "ABAAAAEAAAC8AwAA");
+ // public static class Transform extends SuperTransform {
+ // public static void sayHiTwice() {
+ // Transform.sayHi();
+ // Transform.sayHi();
+ // }
+ // public static void sayHi() {
+ // System.out.println("Hello World!");
+ // }
+ // }
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQA9wdy7Lgbrv+sD+wixborREr0maZCK5yqABAAAcAAAAHhWNBIAAAAAAAAAALwDAAAW"
+ + "AAAAcAAAAAkAAADIAAAAAgAAAOwAAAABAAAABAEAAAUAAAAMAQAAAQAAADQBAAAsAwAAVAEAAMIB"
+ + "AADKAQAA2AEAAPcBAAARAgAAIQIAAEUCAABlAgAAfAIAAJACAACkAgAAswIAAL4CAADBAgAAxQIA"
+ + "ANICAADYAgAA3QIAAOYCAADtAgAA+QIAAAADAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAA"
+ + "CQAAAAwAAAAMAAAACAAAAAAAAAANAAAACAAAALwBAAAHAAUAEAAAAAAAAAAAAAAAAQAAAAAAAAAB"
+ + "AAAAEgAAAAEAAAATAAAABQABABEAAAABAAAAAQAAAAAAAAAAAAAACgAAAKwDAACHAwAAAAAAAAEA"
+ + "AQABAAAAqgEAAAQAAABwEAAAAAAOAAIAAAACAAAArgEAAAgAAABiAAAAGgEBAG4gBAAQAA4AAAAA"
+ + "AAAAAACzAQAABwAAAHEAAgAAAHEAAgAAAA4ADwAOABUADngAEQAOPDwAAAAAAQAAAAYABjxpbml0"
+ + "PgAMSGVsbG8gV29ybGQhAB1MYXJ0L1Rlc3QxOTk3JFN1cGVyVHJhbnNmb3JtOwAYTGFydC9UZXN0"
+ + "MTk5NyRUcmFuc2Zvcm07AA5MYXJ0L1Rlc3QxOTk3OwAiTGRhbHZpay9hbm5vdGF0aW9uL0VuY2xv"
+ + "c2luZ0NsYXNzOwAeTGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7ABVMamF2YS9pby9Qcmlu"
+ + "dFN0cmVhbTsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07AA1UZXN0MTk5"
+ + "Ny5qYXZhAAlUcmFuc2Zvcm0AAVYAAlZMAAthY2Nlc3NGbGFncwAEbmFtZQADb3V0AAdwcmludGxu"
+ + "AAVzYXlIaQAKc2F5SGlUd2ljZQAFdmFsdWUAdn5+RDh7ImNvbXBpbGF0aW9uLW1vZGUiOiJkZWJ1"
+ + "ZyIsIm1pbi1hcGkiOjEsInNoYS0xIjoiNjBkYTRkNjdiMzgxYzQyNDY3NzU3YzQ5ZmI2ZTU1NzU2"
+ + "ZDg4YTJmMyIsInZlcnNpb24iOiIxLjcuMTItZGV2In0AAgMBFBgCAgQCDgQJDxcLAAADAAGBgATU"
+ + "AgEJ7AIBCYwDAAAAAAAAAAIAAAB4AwAAfgMAAKADAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAEAAAAA"
+ + "AAAAAQAAABYAAABwAAAAAgAAAAkAAADIAAAAAwAAAAIAAADsAAAABAAAAAEAAAAEAQAABQAAAAUA"
+ + "AAAMAQAABgAAAAEAAAA0AQAAASAAAAMAAABUAQAAAyAAAAMAAACqAQAAARAAAAEAAAC8AQAAAiAA"
+ + "ABYAAADCAQAABCAAAAIAAAB4AwAAACAAAAEAAACHAwAAAxAAAAIAAACcAwAABiAAAAEAAACsAwAA"
+ + "ABAAAAEAAAC8AwAA");
- public static void run() throws Exception {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest();
- }
+ public static void run() throws Exception {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ doTest();
+ }
- public static void doTest() throws Exception {
- Transform.sayHiTwice();
- Transform.sayHi();
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- Transform.sayHiTwice();
- Transform.sayHi();
- }
+ public static void doTest() throws Exception {
+ Transform.sayHiTwice();
+ Transform.sayHi();
+ Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
+ Transform.sayHiTwice();
+ Transform.sayHi();
+ }
}
diff --git a/test/1998-structural-shadow-field/src/Main.java b/test/1998-structural-shadow-field/src/Main.java
index f6aeca5..e35d1b1 100644
--- a/test/1998-structural-shadow-field/src/Main.java
+++ b/test/1998-structural-shadow-field/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1998.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1998.run();
+ }
}
diff --git a/test/1998-structural-shadow-field/src/art/Test1998.java b/test/1998-structural-shadow-field/src/art/Test1998.java
index 3fda936..3aaa9f3 100644
--- a/test/1998-structural-shadow-field/src/art/Test1998.java
+++ b/test/1998-structural-shadow-field/src/art/Test1998.java
@@ -20,46 +20,44 @@
public class Test1998 {
- public static class SuperTransform {
- public static String greeting = "Hello";
- }
+ public static class SuperTransform {
+ public static String greeting = "Hello";
+ }
- // The class we will be transforming.
- public static class Transform extends SuperTransform { }
+ // The class we will be transforming.
+ public static class Transform extends SuperTransform { }
- // public static class Transform extends SuperTransform {
- // public static String greeting;
- // }
- private static final byte[] DEX_BYTES =
- Base64.getDecoder()
- .decode(
-"ZGV4CjAzNQCYmnoWz4BqygrZQM4zf/mJ/25+dM86MHKAAwAAcAAAAHhWNBIAAAAAAAAAAMgCAAAP" +
-"AAAAcAAAAAcAAACsAAAAAQAAAMgAAAABAAAA1AAAAAIAAADcAAAAAQAAAOwAAAB0AgAADAEAACgB" +
-"AAAwAQAATwEAAGkBAAB5AQAAnQEAAL0BAADRAQAA4AEAAOsBAADuAQAA+wEAAAUCAAALAgAAEgIA" +
-"AAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAkAAAAJAAAABgAAAAAAAAABAAUACwAAAAAAAAAAAAAA" +
-"AQAAAAAAAAABAAAAAQAAAAAAAAAAAAAABwAAALgCAACZAgAAAAAAAAEAAQABAAAAJAEAAAQAAABw" +
-"EAAAAAAOAAUADgAGPGluaXQ+AB1MYXJ0L1Rlc3QxOTk4JFN1cGVyVHJhbnNmb3JtOwAYTGFydC9U" +
-"ZXN0MTk5OCRUcmFuc2Zvcm07AA5MYXJ0L1Rlc3QxOTk4OwAiTGRhbHZpay9hbm5vdGF0aW9uL0Vu" +
-"Y2xvc2luZ0NsYXNzOwAeTGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7ABJMamF2YS9sYW5n" +
-"L1N0cmluZzsADVRlc3QxOTk4LmphdmEACVRyYW5zZm9ybQABVgALYWNjZXNzRmxhZ3MACGdyZWV0" +
-"aW5nAARuYW1lAAV2YWx1ZQB2fn5EOHsiY29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFw" +
-"aSI6MSwic2hhLTEiOiI2MGRhNGQ2N2IzODFjNDI0Njc3NTdjNDlmYjZlNTU3NTZkODhhMmYzIiwi" +
-"dmVyc2lvbiI6IjEuNy4xMi1kZXYifQACAwENGAICBAIKBAkMFwgBAAEAAAkBgYAEjAIAAAAAAAAA" +
-"AgAAAIoCAACQAgAArAIAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAAC" +
-"AAAABwAAAKwAAAADAAAAAQAAAMgAAAAEAAAAAQAAANQAAAAFAAAAAgAAANwAAAAGAAAAAQAAAOwA" +
-"AAABIAAAAQAAAAwBAAADIAAAAQAAACQBAAACIAAADwAAACgBAAAEIAAAAgAAAIoCAAAAIAAAAQAA" +
-"AJkCAAADEAAAAgAAAKgCAAAGIAAAAQAAALgCAAAAEAAAAQAAAMgCAAA=");
+ // public static class Transform extends SuperTransform {
+ // public static String greeting;
+ // }
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQCYmnoWz4BqygrZQM4zf/mJ/25+dM86MHKAAwAAcAAAAHhWNBIAAAAAAAAAAMgCAAAP" +
+ "AAAAcAAAAAcAAACsAAAAAQAAAMgAAAABAAAA1AAAAAIAAADcAAAAAQAAAOwAAAB0AgAADAEAACgB" +
+ "AAAwAQAATwEAAGkBAAB5AQAAnQEAAL0BAADRAQAA4AEAAOsBAADuAQAA+wEAAAUCAAALAgAAEgIA" +
+ "AAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAkAAAAJAAAABgAAAAAAAAABAAUACwAAAAAAAAAAAAAA" +
+ "AQAAAAAAAAABAAAAAQAAAAAAAAAAAAAABwAAALgCAACZAgAAAAAAAAEAAQABAAAAJAEAAAQAAABw" +
+ "EAAAAAAOAAUADgAGPGluaXQ+AB1MYXJ0L1Rlc3QxOTk4JFN1cGVyVHJhbnNmb3JtOwAYTGFydC9U" +
+ "ZXN0MTk5OCRUcmFuc2Zvcm07AA5MYXJ0L1Rlc3QxOTk4OwAiTGRhbHZpay9hbm5vdGF0aW9uL0Vu" +
+ "Y2xvc2luZ0NsYXNzOwAeTGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7ABJMamF2YS9sYW5n" +
+ "L1N0cmluZzsADVRlc3QxOTk4LmphdmEACVRyYW5zZm9ybQABVgALYWNjZXNzRmxhZ3MACGdyZWV0" +
+ "aW5nAARuYW1lAAV2YWx1ZQB2fn5EOHsiY29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFw" +
+ "aSI6MSwic2hhLTEiOiI2MGRhNGQ2N2IzODFjNDI0Njc3NTdjNDlmYjZlNTU3NTZkODhhMmYzIiwi" +
+ "dmVyc2lvbiI6IjEuNy4xMi1kZXYifQACAwENGAICBAIKBAkMFwgBAAEAAAkBgYAEjAIAAAAAAAAA" +
+ "AgAAAIoCAACQAgAArAIAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAAC" +
+ "AAAABwAAAKwAAAADAAAAAQAAAMgAAAAEAAAAAQAAANQAAAAFAAAAAgAAANwAAAAGAAAAAQAAAOwA" +
+ "AAABIAAAAQAAAAwBAAADIAAAAQAAACQBAAACIAAADwAAACgBAAAEIAAAAgAAAIoCAAAAIAAAAQAA" +
+ "AJkCAAADEAAAAgAAAKgCAAAGIAAAAQAAALgCAAAAEAAAAQAAAMgCAAA=");
- public static void run() throws Exception {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest();
- }
+ public static void run() throws Exception {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ doTest();
+ }
- public static void doTest() throws Exception {
- System.out.println(Transform.greeting);
- System.out.println(SuperTransform.greeting);
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- System.out.println(Transform.greeting);
- System.out.println(SuperTransform.greeting);
- }
+ public static void doTest() throws Exception {
+ System.out.println(Transform.greeting);
+ System.out.println(SuperTransform.greeting);
+ Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
+ System.out.println(Transform.greeting);
+ System.out.println(SuperTransform.greeting);
+ }
}
diff --git a/test/1999-virtual-structural/src/Main.java b/test/1999-virtual-structural/src/Main.java
index 86a492b..f4a1bd6 100644
--- a/test/1999-virtual-structural/src/Main.java
+++ b/test/1999-virtual-structural/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1999.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1999.run();
+ }
}
diff --git a/test/1999-virtual-structural/src/art/Test1999.java b/test/1999-virtual-structural/src/art/Test1999.java
index f6811a9..6943442 100644
--- a/test/1999-virtual-structural/src/art/Test1999.java
+++ b/test/1999-virtual-structural/src/art/Test1999.java
@@ -19,67 +19,67 @@
import java.util.Base64;
public class Test1999 {
- public static class Transform {
- public String getGreeting() {
- return "Hi";
+ public static class Transform {
+ public String getGreeting() {
+ return "Hi";
+ }
}
- }
- public static class SubTransform extends Transform {
- private int count = 0;
- public void sayHi() {
- System.out.println(getGreeting() + "(SubTransform called " + (++count) + " times)");
+ public static class SubTransform extends Transform {
+ private int count = 0;
+ public void sayHi() {
+ System.out.println(getGreeting() + "(SubTransform called " + (++count) + " times)");
+ }
}
- }
- /**
- * base64 encoded class/dex file for
- * public static class Transform {
- * private int count;
- * public String getGreeting() {
- * return "Hello (Transform called " + incrCount() + " times)";
- * }
- * protected int incrCount() {
- * return ++count;
- * }
- * }
- */
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
-"ZGV4CjAzNQAwwbMpPdPdWkU+6UJnvqa7v4VBdcuq2vkMBQAAcAAAAHhWNBIAAAAAAAAAAEgEAAAa" +
-"AAAAcAAAAAkAAADYAAAABQAAAPwAAAABAAAAOAEAAAgAAABAAQAAAQAAAIABAABsAwAAoAEAADoC" +
-"AABDAgAASwIAAGUCAABoAgAAawIAAG8CAABzAgAAjQIAAJ0CAADBAgAA4QIAAPUCAAAJAwAAJAMA" +
-"ADMDAAA+AwAAQQMAAE4DAABWAwAAXQMAAGoDAAB1AwAAewMAAIUDAACMAwAAAwAAAAcAAAAIAAAA" +
-"CQAAAAoAAAALAAAADAAAAA0AAAAQAAAAAwAAAAAAAAAAAAAABAAAAAYAAAAAAAAABQAAAAcAAAAs" +
-"AgAABgAAAAcAAAA0AgAAEAAAAAgAAAAAAAAAAQAAABMAAAABAAQAAQAAAAEAAQAUAAAAAQAAABUA" +
-"AAAFAAQAAQAAAAcABAABAAAABwACABIAAAAHAAMAEgAAAAcAAQAXAAAAAQAAAAEAAAAFAAAAAAAA" +
-"AA4AAAA4BAAAEwQAAAAAAAACAAEAAAAAACgCAAAHAAAAUhAAANgAAAFZEAAADwAAAAQAAQACAAAA" +
-"JAIAABsAAABuEAIAAwAKACIBBwBwEAQAAQAaAgIAbiAGACEAbiAFAAEAGgAAAG4gBgABAG4QBwAB" +
-"AAwAEQAAAAEAAQABAAAAIAIAAAQAAABwEAMAAAAOAAMADgAGAA4ACQAOAAEAAAAAAAAAAQAAAAYA" +
-"ByB0aW1lcykABjxpbml0PgAYSGVsbG8gKFRyYW5zZm9ybSBjYWxsZWQgAAFJAAFMAAJMSQACTEwA" +
-"GExhcnQvVGVzdDE5OTkkVHJhbnNmb3JtOwAOTGFydC9UZXN0MTk5OTsAIkxkYWx2aWsvYW5ub3Rh" +
-"dGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwASTGph" +
-"dmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVp" +
-"bGRlcjsADVRlc3QxOTk5LmphdmEACVRyYW5zZm9ybQABVgALYWNjZXNzRmxhZ3MABmFwcGVuZAAF" +
-"Y291bnQAC2dldEdyZWV0aW5nAAlpbmNyQ291bnQABG5hbWUACHRvU3RyaW5nAAV2YWx1ZQB2fn5E" +
-"OHsiY29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFwaSI6MSwic2hhLTEiOiI2MGRhNGQ2" +
-"N2IzODFjNDI0Njc3NTdjNDlmYjZlNTU3NTZkODhhMmYzIiwidmVyc2lvbiI6IjEuNy4xMi1kZXYi" +
-"fQACAwEYGAICBAIRBAkWFw8AAQECAAIAgYAEiAQBAcADAQSgAwAAAAAAAgAAAAQEAAAKBAAALAQA" +
-"AAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAAAAABAAAAGgAAAHAAAAACAAAACQAAANgAAAADAAAA" +
-"BQAAAPwAAAAEAAAAAQAAADgBAAAFAAAACAAAAEABAAAGAAAAAQAAAIABAAABIAAAAwAAAKABAAAD" +
-"IAAAAwAAACACAAABEAAAAgAAACwCAAACIAAAGgAAADoCAAAEIAAAAgAAAAQEAAAAIAAAAQAAABME" +
-"AAADEAAAAgAAACgEAAAGIAAAAQAAADgEAAAAEAAAAQAAAEgEAAA=");
+ /**
+ * base64 encoded class/dex file for
+ * public static class Transform {
+ * private int count;
+ * public String getGreeting() {
+ * return "Hello (Transform called " + incrCount() + " times)";
+ * }
+ * protected int incrCount() {
+ * return ++count;
+ * }
+ * }
+ */
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQAwwbMpPdPdWkU+6UJnvqa7v4VBdcuq2vkMBQAAcAAAAHhWNBIAAAAAAAAAAEgEAAAa" +
+ "AAAAcAAAAAkAAADYAAAABQAAAPwAAAABAAAAOAEAAAgAAABAAQAAAQAAAIABAABsAwAAoAEAADoC" +
+ "AABDAgAASwIAAGUCAABoAgAAawIAAG8CAABzAgAAjQIAAJ0CAADBAgAA4QIAAPUCAAAJAwAAJAMA" +
+ "ADMDAAA+AwAAQQMAAE4DAABWAwAAXQMAAGoDAAB1AwAAewMAAIUDAACMAwAAAwAAAAcAAAAIAAAA" +
+ "CQAAAAoAAAALAAAADAAAAA0AAAAQAAAAAwAAAAAAAAAAAAAABAAAAAYAAAAAAAAABQAAAAcAAAAs" +
+ "AgAABgAAAAcAAAA0AgAAEAAAAAgAAAAAAAAAAQAAABMAAAABAAQAAQAAAAEAAQAUAAAAAQAAABUA" +
+ "AAAFAAQAAQAAAAcABAABAAAABwACABIAAAAHAAMAEgAAAAcAAQAXAAAAAQAAAAEAAAAFAAAAAAAA" +
+ "AA4AAAA4BAAAEwQAAAAAAAACAAEAAAAAACgCAAAHAAAAUhAAANgAAAFZEAAADwAAAAQAAQACAAAA" +
+ "JAIAABsAAABuEAIAAwAKACIBBwBwEAQAAQAaAgIAbiAGACEAbiAFAAEAGgAAAG4gBgABAG4QBwAB" +
+ "AAwAEQAAAAEAAQABAAAAIAIAAAQAAABwEAMAAAAOAAMADgAGAA4ACQAOAAEAAAAAAAAAAQAAAAYA" +
+ "ByB0aW1lcykABjxpbml0PgAYSGVsbG8gKFRyYW5zZm9ybSBjYWxsZWQgAAFJAAFMAAJMSQACTEwA" +
+ "GExhcnQvVGVzdDE5OTkkVHJhbnNmb3JtOwAOTGFydC9UZXN0MTk5OTsAIkxkYWx2aWsvYW5ub3Rh" +
+ "dGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwASTGph" +
+ "dmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVp" +
+ "bGRlcjsADVRlc3QxOTk5LmphdmEACVRyYW5zZm9ybQABVgALYWNjZXNzRmxhZ3MABmFwcGVuZAAF" +
+ "Y291bnQAC2dldEdyZWV0aW5nAAlpbmNyQ291bnQABG5hbWUACHRvU3RyaW5nAAV2YWx1ZQB2fn5E" +
+ "OHsiY29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFwaSI6MSwic2hhLTEiOiI2MGRhNGQ2" +
+ "N2IzODFjNDI0Njc3NTdjNDlmYjZlNTU3NTZkODhhMmYzIiwidmVyc2lvbiI6IjEuNy4xMi1kZXYi" +
+ "fQACAwEYGAICBAIRBAkWFw8AAQECAAIAgYAEiAQBAcADAQSgAwAAAAAAAgAAAAQEAAAKBAAALAQA" +
+ "AAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAAAAABAAAAGgAAAHAAAAACAAAACQAAANgAAAADAAAA" +
+ "BQAAAPwAAAAEAAAAAQAAADgBAAAFAAAACAAAAEABAAAGAAAAAQAAAIABAAABIAAAAwAAAKABAAAD" +
+ "IAAAAwAAACACAAABEAAAAgAAACwCAAACIAAAGgAAADoCAAAEIAAAAgAAAAQEAAAAIAAAAQAAABME" +
+ "AAADEAAAAgAAACgEAAAGIAAAAQAAADgEAAAAEAAAAQAAAEgEAAA=");
- public static void run() {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest(new SubTransform());
- }
+ public static void run() {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ doTest(new SubTransform());
+ }
- public static void doTest(SubTransform t) {
- t.sayHi();
- t.sayHi();
- t.sayHi();
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- t.sayHi();
- }
+ public static void doTest(SubTransform t) {
+ t.sayHi();
+ t.sayHi();
+ t.sayHi();
+ Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
+ t.sayHi();
+ }
}
diff --git a/test/495-checker-checkcast-tests/src/Main.java b/test/495-checker-checkcast-tests/src/Main.java
index 6011c7c..2c0126a 100644
--- a/test/495-checker-checkcast-tests/src/Main.java
+++ b/test/495-checker-checkcast-tests/src/Main.java
@@ -15,207 +15,207 @@
*/
public class Main {
- public static boolean $inline$classTypeTest(Object o) {
- return ((SubMain)o) == o;
- }
+ public static boolean $inline$classTypeTest(Object o) {
+ return ((SubMain) o) == o;
+ }
- public static boolean $inline$interfaceTypeTest(Object o) {
- return ((Itf)o) == o;
- }
+ public static boolean $inline$interfaceTypeTest(Object o) {
+ return ((Itf) o) == o;
+ }
- public static SubMain subMain;
- public static Main mainField;
- public static Unrelated unrelatedField;
- public static FinalUnrelated finalUnrelatedField;
+ public static SubMain subMain;
+ public static Main mainField;
+ public static Unrelated unrelatedField;
+ public static FinalUnrelated finalUnrelatedField;
- /// CHECK-START: boolean Main.classTypeTestNull() register (after)
- /// CHECK-NOT: CheckCast
- public static boolean classTypeTestNull() {
- return $inline$classTypeTest(null);
- }
+ /// CHECK-START: boolean Main.classTypeTestNull() register (after)
+ /// CHECK-NOT: CheckCast
+ public static boolean classTypeTestNull() {
+ return $inline$classTypeTest(null);
+ }
- /// CHECK-START: boolean Main.classTypeTestExactMain() register (after)
- /// CHECK: CheckCast
- public static boolean classTypeTestExactMain() {
- return $inline$classTypeTest(new Main());
- }
+ /// CHECK-START: boolean Main.classTypeTestExactMain() register (after)
+ /// CHECK: CheckCast
+ public static boolean classTypeTestExactMain() {
+ return $inline$classTypeTest(new Main());
+ }
- /// CHECK-START: boolean Main.classTypeTestExactSubMain() register (after)
- /// CHECK-NOT: CheckCast
- public static boolean classTypeTestExactSubMain() {
- return $inline$classTypeTest(new SubMain());
- }
+ /// CHECK-START: boolean Main.classTypeTestExactSubMain() register (after)
+ /// CHECK-NOT: CheckCast
+ public static boolean classTypeTestExactSubMain() {
+ return $inline$classTypeTest(new SubMain());
+ }
- /// CHECK-START: boolean Main.classTypeTestSubMainOrNull() register (after)
- /// CHECK-NOT: CheckCast
- public static boolean classTypeTestSubMainOrNull() {
- return $inline$classTypeTest(subMain);
- }
+ /// CHECK-START: boolean Main.classTypeTestSubMainOrNull() register (after)
+ /// CHECK-NOT: CheckCast
+ public static boolean classTypeTestSubMainOrNull() {
+ return $inline$classTypeTest(subMain);
+ }
- /// CHECK-START: boolean Main.classTypeTestMainOrNull() register (after)
- /// CHECK: CheckCast
- public static boolean classTypeTestMainOrNull() {
- return $inline$classTypeTest(mainField);
- }
+ /// CHECK-START: boolean Main.classTypeTestMainOrNull() register (after)
+ /// CHECK: CheckCast
+ public static boolean classTypeTestMainOrNull() {
+ return $inline$classTypeTest(mainField);
+ }
- /// CHECK-START: boolean Main.classTypeTestUnrelated() register (after)
- /// CHECK: CheckCast
- public static boolean classTypeTestUnrelated() {
- return $inline$classTypeTest(unrelatedField);
- }
+ /// CHECK-START: boolean Main.classTypeTestUnrelated() register (after)
+ /// CHECK: CheckCast
+ public static boolean classTypeTestUnrelated() {
+ return $inline$classTypeTest(unrelatedField);
+ }
- /// CHECK-START: boolean Main.classTypeTestFinalUnrelated() register (after)
- /// CHECK: CheckCast
- public static boolean classTypeTestFinalUnrelated() {
- return $inline$classTypeTest(finalUnrelatedField);
- }
+ /// CHECK-START: boolean Main.classTypeTestFinalUnrelated() register (after)
+ /// CHECK: CheckCast
+ public static boolean classTypeTestFinalUnrelated() {
+ return $inline$classTypeTest(finalUnrelatedField);
+ }
- /// CHECK-START: boolean Main.interfaceTypeTestNull() register (after)
- /// CHECK-NOT: CheckCast
- public static boolean interfaceTypeTestNull() {
- return $inline$interfaceTypeTest(null);
- }
+ /// CHECK-START: boolean Main.interfaceTypeTestNull() register (after)
+ /// CHECK-NOT: CheckCast
+ public static boolean interfaceTypeTestNull() {
+ return $inline$interfaceTypeTest(null);
+ }
- /// CHECK-START: boolean Main.interfaceTypeTestExactMain() register (after)
- /// CHECK: CheckCast
- public static boolean interfaceTypeTestExactMain() {
- return $inline$interfaceTypeTest(new Main());
- }
+ /// CHECK-START: boolean Main.interfaceTypeTestExactMain() register (after)
+ /// CHECK: CheckCast
+ public static boolean interfaceTypeTestExactMain() {
+ return $inline$interfaceTypeTest(new Main());
+ }
- /// CHECK-START: boolean Main.interfaceTypeTestExactSubMain() register (after)
- /// CHECK-NOT: CheckCast
- public static boolean interfaceTypeTestExactSubMain() {
- return $inline$interfaceTypeTest(new SubMain());
- }
+ /// CHECK-START: boolean Main.interfaceTypeTestExactSubMain() register (after)
+ /// CHECK-NOT: CheckCast
+ public static boolean interfaceTypeTestExactSubMain() {
+ return $inline$interfaceTypeTest(new SubMain());
+ }
- /// CHECK-START: boolean Main.interfaceTypeTestSubMainOrNull() register (after)
- /// CHECK-NOT: CheckCast
- public static boolean interfaceTypeTestSubMainOrNull() {
- return $inline$interfaceTypeTest(subMain);
- }
+ /// CHECK-START: boolean Main.interfaceTypeTestSubMainOrNull() register (after)
+ /// CHECK-NOT: CheckCast
+ public static boolean interfaceTypeTestSubMainOrNull() {
+ return $inline$interfaceTypeTest(subMain);
+ }
- /// CHECK-START: boolean Main.interfaceTypeTestMainOrNull() register (after)
- /// CHECK: CheckCast
- public static boolean interfaceTypeTestMainOrNull() {
- return $inline$interfaceTypeTest(mainField);
- }
+ /// CHECK-START: boolean Main.interfaceTypeTestMainOrNull() register (after)
+ /// CHECK: CheckCast
+ public static boolean interfaceTypeTestMainOrNull() {
+ return $inline$interfaceTypeTest(mainField);
+ }
- /// CHECK-START: boolean Main.interfaceTypeTestUnrelated() register (after)
- /// CHECK: CheckCast
- public static boolean interfaceTypeTestUnrelated() {
- return $inline$interfaceTypeTest(unrelatedField);
- }
+ /// CHECK-START: boolean Main.interfaceTypeTestUnrelated() register (after)
+ /// CHECK: CheckCast
+ public static boolean interfaceTypeTestUnrelated() {
+ return $inline$interfaceTypeTest(unrelatedField);
+ }
- /// CHECK-START: boolean Main.interfaceTypeTestFinalUnrelated() register (after)
- /// CHECK: CheckCast
- public static boolean interfaceTypeTestFinalUnrelated() {
- return $inline$interfaceTypeTest(finalUnrelatedField);
- }
+ /// CHECK-START: boolean Main.interfaceTypeTestFinalUnrelated() register (after)
+ /// CHECK: CheckCast
+ public static boolean interfaceTypeTestFinalUnrelated() {
+ return $inline$interfaceTypeTest(finalUnrelatedField);
+ }
- /// CHECK-START: java.lang.String Main.knownTestWithLoadedClass() register (after)
- /// CHECK-NOT: CheckCast
- public static String knownTestWithLoadedClass() {
- return (String)$inline$getString();
- }
+ /// CHECK-START: java.lang.String Main.knownTestWithLoadedClass() register (after)
+ /// CHECK-NOT: CheckCast
+ public static String knownTestWithLoadedClass() {
+ return (String)$inline$getString();
+ }
- /// CHECK-START: Itf Main.knownTestWithUnloadedClass() register (after)
- /// CHECK: CheckCast
- public static Itf knownTestWithUnloadedClass() {
- return (Itf)$inline$getString();
- }
+ /// CHECK-START: Itf Main.knownTestWithUnloadedClass() register (after)
+ /// CHECK: CheckCast
+ public static Itf knownTestWithUnloadedClass() {
+ return (Itf)$inline$getString();
+ }
- public static Object $inline$getString() {
- return new String();
- }
+ public static Object $inline$getString() {
+ return new String();
+ }
- public static Object $inline$getMain() {
- return new Main();
- }
+ public static Object $inline$getMain() {
+ return new Main();
+ }
- /// CHECK-START: void Main.nonNullBoundType() register (after)
- /// CHECK-NOT: NullCheck
- public static void nonNullBoundType() {
- Main main = (Main)$inline$getMain();
- main.getClass();
- }
+ /// CHECK-START: void Main.nonNullBoundType() register (after)
+ /// CHECK-NOT: NullCheck
+ public static void nonNullBoundType() {
+ Main main = (Main)$inline$getMain();
+ main.getClass();
+ }
- public static void main(String[] args) {
- classTypeTestNull();
- try {
- classTypeTestExactMain();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
- classTypeTestExactSubMain();
+ public static void main(String[] args) {
+ classTypeTestNull();
+ try {
+ classTypeTestExactMain();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
+ classTypeTestExactSubMain();
- subMain = null;
- classTypeTestSubMainOrNull();
- subMain = new SubMain();
- classTypeTestSubMainOrNull();
+ subMain = null;
+ classTypeTestSubMainOrNull();
+ subMain = new SubMain();
+ classTypeTestSubMainOrNull();
- mainField = null;
- classTypeTestMainOrNull();
- mainField = new Main();
- try {
- classTypeTestMainOrNull();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
- mainField = new SubMain();
- classTypeTestMainOrNull();
+ mainField = null;
+ classTypeTestMainOrNull();
+ mainField = new Main();
+ try {
+ classTypeTestMainOrNull();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
+ mainField = new SubMain();
+ classTypeTestMainOrNull();
- unrelatedField = null;
- classTypeTestUnrelated();
- unrelatedField = new Unrelated();
- try {
- classTypeTestUnrelated();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
+ unrelatedField = null;
+ classTypeTestUnrelated();
+ unrelatedField = new Unrelated();
+ try {
+ classTypeTestUnrelated();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
- finalUnrelatedField = null;
- classTypeTestFinalUnrelated();
- finalUnrelatedField = new FinalUnrelated();
- try {
- classTypeTestFinalUnrelated();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
+ finalUnrelatedField = null;
+ classTypeTestFinalUnrelated();
+ finalUnrelatedField = new FinalUnrelated();
+ try {
+ classTypeTestFinalUnrelated();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
- interfaceTypeTestNull();
- try {
- interfaceTypeTestExactMain();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
- interfaceTypeTestExactSubMain();
+ interfaceTypeTestNull();
+ try {
+ interfaceTypeTestExactMain();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
+ interfaceTypeTestExactSubMain();
- subMain = null;
- interfaceTypeTestSubMainOrNull();
- subMain = new SubMain();
- interfaceTypeTestSubMainOrNull();
+ subMain = null;
+ interfaceTypeTestSubMainOrNull();
+ subMain = new SubMain();
+ interfaceTypeTestSubMainOrNull();
- mainField = null;
- interfaceTypeTestMainOrNull();
- mainField = new Main();
- try {
- interfaceTypeTestMainOrNull();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
- mainField = new SubMain();
- interfaceTypeTestMainOrNull();
+ mainField = null;
+ interfaceTypeTestMainOrNull();
+ mainField = new Main();
+ try {
+ interfaceTypeTestMainOrNull();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
+ mainField = new SubMain();
+ interfaceTypeTestMainOrNull();
- unrelatedField = null;
- interfaceTypeTestUnrelated();
- unrelatedField = new Unrelated();
- try {
- interfaceTypeTestUnrelated();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
+ unrelatedField = null;
+ interfaceTypeTestUnrelated();
+ unrelatedField = new Unrelated();
+ try {
+ interfaceTypeTestUnrelated();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
- finalUnrelatedField = null;
- interfaceTypeTestFinalUnrelated();
- finalUnrelatedField = new FinalUnrelated();
- try {
- interfaceTypeTestFinalUnrelated();
- throw new Error("ClassCastException expected");
- } catch (ClassCastException e) {}
- }
+ finalUnrelatedField = null;
+ interfaceTypeTestFinalUnrelated();
+ finalUnrelatedField = new FinalUnrelated();
+ try {
+ interfaceTypeTestFinalUnrelated();
+ throw new Error("ClassCastException expected");
+ } catch (ClassCastException e) {}
+ }
}
interface Itf {
diff --git a/test/496-checker-inlining-class-loader/src/FirstSeenByMyClassLoader.java b/test/496-checker-inlining-class-loader/src/FirstSeenByMyClassLoader.java
index e97b4e3..fe0582e 100644
--- a/test/496-checker-inlining-class-loader/src/FirstSeenByMyClassLoader.java
+++ b/test/496-checker-inlining-class-loader/src/FirstSeenByMyClassLoader.java
@@ -15,12 +15,12 @@
*/
public class FirstSeenByMyClassLoader {
- public static void $inline$bar() {
- }
+ public static void $inline$bar() {
+ }
- public static void $noinline$bar() {
- try {
- System.out.println("In $noinline$bar");
- } catch (Throwable t) { /* Ignore */ }
- }
+ public static void $noinline$bar() {
+ try {
+ System.out.println("In $noinline$bar");
+ } catch (Throwable t) { /* Ignore */ }
+ }
}
diff --git a/test/496-checker-inlining-class-loader/src/Main.java b/test/496-checker-inlining-class-loader/src/Main.java
index 4fe4723..feb8fdc 100644
--- a/test/496-checker-inlining-class-loader/src/Main.java
+++ b/test/496-checker-inlining-class-loader/src/Main.java
@@ -20,115 +20,116 @@
import java.util.List;
class MyClassLoader extends ClassLoader {
- MyClassLoader() throws Exception {
- super(MyClassLoader.class.getClassLoader());
+ MyClassLoader() throws Exception {
+ super(MyClassLoader.class.getClassLoader());
- // Some magic to get access to the pathList field of BaseDexClassLoader.
- ClassLoader loader = getClass().getClassLoader();
- Class<?> baseDexClassLoader = loader.getClass().getSuperclass();
- Field f = baseDexClassLoader.getDeclaredField("pathList");
- f.setAccessible(true);
- Object pathList = f.get(loader);
+ // Some magic to get access to the pathList field of BaseDexClassLoader.
+ ClassLoader loader = getClass().getClassLoader();
+ Class<?> baseDexClassLoader = loader.getClass().getSuperclass();
+ Field f = baseDexClassLoader.getDeclaredField("pathList");
+ f.setAccessible(true);
+ Object pathList = f.get(loader);
- // Some magic to get access to the dexField field of pathList.
- // Need to make a copy of the dex elements since we don't want an app image with pre-resolved
- // things.
- f = pathList.getClass().getDeclaredField("dexElements");
- f.setAccessible(true);
- Object[] dexElements = (Object[]) f.get(pathList);
- f = dexElements[0].getClass().getDeclaredField("dexFile");
- f.setAccessible(true);
- for (Object element : dexElements) {
- Object dexFile = f.get(element);
- // Make copy.
- Field fileNameField = dexFile.getClass().getDeclaredField("mFileName");
- fileNameField.setAccessible(true);
- dexFiles.add(dexFile.getClass().getDeclaredConstructor(String.class).newInstance(
- fileNameField.get(dexFile)));
- }
- }
-
- ArrayList<Object> dexFiles = new ArrayList<Object>();
- Field dexFileField;
-
- protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException {
- // Other classes may also get loaded, ignore those.
- if (className.equals("LoadedByMyClassLoader") || className.equals("FirstSeenByMyClassLoader")) {
- System.out.println("Request for " + className);
- }
-
- // We're only going to handle LoadedByMyClassLoader.
- if (className != "LoadedByMyClassLoader") {
- return getParent().loadClass(className);
- }
-
- // Mimic what DexPathList.findClass is doing.
- try {
- for (Object dexFile : dexFiles) {
- Method method = dexFile.getClass().getDeclaredMethod(
- "loadClassBinaryName", String.class, ClassLoader.class, List.class);
-
- if (dexFile != null) {
- Class<?> clazz = (Class<?>)method.invoke(dexFile, className, this, null);
- if (clazz != null) {
- return clazz;
- }
+ // Some magic to get access to the dexField field of pathList.
+ // Need to make a copy of the dex elements since we don't want an app image
+ // with pre-resolved things.
+ f = pathList.getClass().getDeclaredField("dexElements");
+ f.setAccessible(true);
+ Object[] dexElements = (Object[]) f.get(pathList);
+ f = dexElements[0].getClass().getDeclaredField("dexFile");
+ f.setAccessible(true);
+ for (Object element : dexElements) {
+ Object dexFile = f.get(element);
+ // Make copy.
+ Field fileNameField = dexFile.getClass().getDeclaredField("mFileName");
+ fileNameField.setAccessible(true);
+ dexFiles.add(dexFile.getClass().getDeclaredConstructor(String.class).newInstance(
+ fileNameField.get(dexFile)));
}
- }
- } catch (Exception e) { /* Ignore */ }
- return null;
- }
+ }
+
+ ArrayList<Object> dexFiles = new ArrayList<Object>();
+ Field dexFileField;
+
+ protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException {
+ // Other classes may also get loaded, ignore those.
+ if (className.equals("LoadedByMyClassLoader")
+ || className.equals("FirstSeenByMyClassLoader")) {
+ System.out.println("Request for " + className);
+ }
+
+ // We're only going to handle LoadedByMyClassLoader.
+ if (className != "LoadedByMyClassLoader") {
+ return getParent().loadClass(className);
+ }
+
+ // Mimic what DexPathList.findClass is doing.
+ try {
+ for (Object dexFile : dexFiles) {
+ Method method = dexFile.getClass().getDeclaredMethod(
+ "loadClassBinaryName", String.class, ClassLoader.class, List.class);
+
+ if (dexFile != null) {
+ Class<?> clazz = (Class<?>) method.invoke(dexFile, className, this, null);
+ if (clazz != null) {
+ return clazz;
+ }
+ }
+ }
+ } catch (Exception e) { /* Ignore */ }
+ return null;
+ }
}
class LoadedByMyClassLoader {
- /// CHECK-START: void LoadedByMyClassLoader.bar() inliner (before)
- /// CHECK: LoadClass class_name:FirstSeenByMyClassLoader
- /// CHECK-NEXT: ClinitCheck
- /// CHECK-NEXT: InvokeStaticOrDirect
- /// CHECK-NEXT: LoadClass class_name:java.lang.System
- /// CHECK-NEXT: ClinitCheck
- /// CHECK-NEXT: StaticFieldGet
- /// CHECK-NEXT: LoadString
- /// CHECK-NEXT: NullCheck
- /// CHECK-NEXT: InvokeVirtual
+ /// CHECK-START: void LoadedByMyClassLoader.bar() inliner (before)
+ /// CHECK: LoadClass class_name:FirstSeenByMyClassLoader
+ /// CHECK-NEXT: ClinitCheck
+ /// CHECK-NEXT: InvokeStaticOrDirect
+ /// CHECK-NEXT: LoadClass class_name:java.lang.System
+ /// CHECK-NEXT: ClinitCheck
+ /// CHECK-NEXT: StaticFieldGet
+ /// CHECK-NEXT: LoadString
+ /// CHECK-NEXT: NullCheck
+ /// CHECK-NEXT: InvokeVirtual
- /// CHECK-START: void LoadedByMyClassLoader.bar() inliner (after)
- /// CHECK: LoadClass class_name:FirstSeenByMyClassLoader
- /// CHECK-NEXT: ClinitCheck
- /* We inlined FirstSeenByMyClassLoader.$inline$bar */
- /// CHECK-NEXT: LoadClass class_name:java.lang.System
- /// CHECK-NEXT: ClinitCheck
- /// CHECK-NEXT: StaticFieldGet
- /// CHECK-NEXT: LoadString
- /// CHECK-NEXT: NullCheck
- /// CHECK-NEXT: InvokeVirtual
+ /// CHECK-START: void LoadedByMyClassLoader.bar() inliner (after)
+ /// CHECK: LoadClass class_name:FirstSeenByMyClassLoader
+ /// CHECK-NEXT: ClinitCheck
+ /* We inlined FirstSeenByMyClassLoader.$inline$bar */
+ /// CHECK-NEXT: LoadClass class_name:java.lang.System
+ /// CHECK-NEXT: ClinitCheck
+ /// CHECK-NEXT: StaticFieldGet
+ /// CHECK-NEXT: LoadString
+ /// CHECK-NEXT: NullCheck
+ /// CHECK-NEXT: InvokeVirtual
- /// CHECK-START: void LoadedByMyClassLoader.bar() register (before)
- /* Load and initialize FirstSeenByMyClassLoader */
- /// CHECK: LoadClass class_name:FirstSeenByMyClassLoader gen_clinit_check:true
- /* Load and initialize System */
- // There may be HX86ComputeBaseMethodAddress here.
- /// CHECK: LoadClass class_name:java.lang.System
- // The ClinitCheck may (PIC) or may not (non-PIC) be merged into the LoadClass.
- // (The merging checks for environment match but HLoadClass/kBootImageAddress
- // used for non-PIC mode does not have an environment at all.)
- /// CHECK: StaticFieldGet
- // There may be HX86ComputeBaseMethodAddress here.
- /// CHECK: LoadString
- /// CHECK-NEXT: NullCheck
- /// CHECK-NEXT: InvokeVirtual
- public static void bar() {
- FirstSeenByMyClassLoader.$inline$bar();
- System.out.println("In between the two calls.");
- FirstSeenByMyClassLoader.$noinline$bar();
- }
+ /// CHECK-START: void LoadedByMyClassLoader.bar() register (before)
+ /* Load and initialize FirstSeenByMyClassLoader */
+ /// CHECK: LoadClass class_name:FirstSeenByMyClassLoader gen_clinit_check:true
+ /* Load and initialize System */
+ // There may be HX86ComputeBaseMethodAddress here.
+ /// CHECK: LoadClass class_name:java.lang.System
+ // The ClinitCheck may (PIC) or may not (non-PIC) be merged into the LoadClass.
+ // (The merging checks for environment match but HLoadClass/kBootImageAddress
+ // used for non-PIC mode does not have an environment at all.)
+ /// CHECK: StaticFieldGet
+ // There may be HX86ComputeBaseMethodAddress here.
+ /// CHECK: LoadString
+ /// CHECK-NEXT: NullCheck
+ /// CHECK-NEXT: InvokeVirtual
+ public static void bar() {
+ FirstSeenByMyClassLoader.$inline$bar();
+ System.out.println("In between the two calls.");
+ FirstSeenByMyClassLoader.$noinline$bar();
+ }
}
public class Main {
- public static void main(String[] args) throws Exception {
- MyClassLoader o = new MyClassLoader();
- Class<?> foo = o.loadClass("LoadedByMyClassLoader");
- Method m = foo.getDeclaredMethod("bar");
- m.invoke(null);
- }
+ public static void main(String[] args) throws Exception {
+ MyClassLoader o = new MyClassLoader();
+ Class<?> foo = o.loadClass("LoadedByMyClassLoader");
+ Method m = foo.getDeclaredMethod("bar");
+ m.invoke(null);
+ }
}
diff --git a/test/497-inlining-and-class-loader/src/Level1.java b/test/497-inlining-and-class-loader/src/Level1.java
index 977af83..18f79ce 100644
--- a/test/497-inlining-and-class-loader/src/Level1.java
+++ b/test/497-inlining-and-class-loader/src/Level1.java
@@ -15,13 +15,13 @@
*/
public class Level1 {
- public static void $inline$bar() {
- Level2.$inline$bar();
- }
+ public static void $inline$bar() {
+ Level2.$inline$bar();
+ }
}
class Level2 {
- public static void $inline$bar() {
- Main.$noinline$bar();
- }
+ public static void $inline$bar() {
+ Main.$noinline$bar();
+ }
}
diff --git a/test/497-inlining-and-class-loader/src/Main.java b/test/497-inlining-and-class-loader/src/Main.java
index 01b4bcd..66a3f6e 100644
--- a/test/497-inlining-and-class-loader/src/Main.java
+++ b/test/497-inlining-and-class-loader/src/Main.java
@@ -19,112 +19,112 @@
import java.util.List;
class MyClassLoader extends ClassLoader {
- MyClassLoader() throws Exception {
- super(MyClassLoader.class.getClassLoader());
+ MyClassLoader() throws Exception {
+ super(MyClassLoader.class.getClassLoader());
- // Some magic to get access to the pathList field of BaseDexClassLoader.
- ClassLoader loader = getClass().getClassLoader();
- Class<?> baseDexClassLoader = loader.getClass().getSuperclass();
- Field f = baseDexClassLoader.getDeclaredField("pathList");
- f.setAccessible(true);
- Object pathList = f.get(loader);
+ // Some magic to get access to the pathList field of BaseDexClassLoader.
+ ClassLoader loader = getClass().getClassLoader();
+ Class<?> baseDexClassLoader = loader.getClass().getSuperclass();
+ Field f = baseDexClassLoader.getDeclaredField("pathList");
+ f.setAccessible(true);
+ Object pathList = f.get(loader);
- // Some magic to get access to the dexField field of pathList.
- f = pathList.getClass().getDeclaredField("dexElements");
- f.setAccessible(true);
- dexElements = (Object[]) f.get(pathList);
- dexFileField = dexElements[0].getClass().getDeclaredField("dexFile");
- dexFileField.setAccessible(true);
- }
-
- Object[] dexElements;
- Field dexFileField;
-
- static ClassLoader level1ClassLoader;
-
- protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException {
- if (this != level1ClassLoader) {
- if (className.equals("Level1")) {
- return level1ClassLoader.loadClass(className);
- } else if (className.equals("Level2")) {
- throw new ClassNotFoundException("None of my methods require Level2!");
- } else if (!className.equals("LoadedByMyClassLoader")) {
- // We're only going to handle LoadedByMyClassLoader.
- return getParent().loadClass(className);
- }
- } else {
- if (className != "Level1" && className != "Level2") {
- return getParent().loadClass(className);
- }
+ // Some magic to get access to the dexField field of pathList.
+ f = pathList.getClass().getDeclaredField("dexElements");
+ f.setAccessible(true);
+ dexElements = (Object[]) f.get(pathList);
+ dexFileField = dexElements[0].getClass().getDeclaredField("dexFile");
+ dexFileField.setAccessible(true);
}
- // Mimic what DexPathList.findClass is doing.
- try {
- for (Object element : dexElements) {
- Object dex = dexFileField.get(element);
- Method method = dex.getClass().getDeclaredMethod(
- "loadClassBinaryName", String.class, ClassLoader.class, List.class);
+ Object[] dexElements;
+ Field dexFileField;
- if (dex != null) {
- Class<?> clazz = (Class<?>)method.invoke(dex, className, this, null);
- if (clazz != null) {
- return clazz;
- }
+ static ClassLoader level1ClassLoader;
+
+ protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException {
+ if (this != level1ClassLoader) {
+ if (className.equals("Level1")) {
+ return level1ClassLoader.loadClass(className);
+ } else if (className.equals("Level2")) {
+ throw new ClassNotFoundException("None of my methods require Level2!");
+ } else if (!className.equals("LoadedByMyClassLoader")) {
+ // We're only going to handle LoadedByMyClassLoader.
+ return getParent().loadClass(className);
+ }
+ } else {
+ if (className != "Level1" && className != "Level2") {
+ return getParent().loadClass(className);
+ }
}
- }
- } catch (Exception e) { /* Ignore */ }
- return null;
- }
+
+ // Mimic what DexPathList.findClass is doing.
+ try {
+ for (Object element : dexElements) {
+ Object dex = dexFileField.get(element);
+ Method method = dex.getClass().getDeclaredMethod(
+ "loadClassBinaryName", String.class, ClassLoader.class, List.class);
+
+ if (dex != null) {
+ Class<?> clazz = (Class<?>) method.invoke(dex, className, this, null);
+ if (clazz != null) {
+ return clazz;
+ }
+ }
+ }
+ } catch (Exception e) { /* Ignore */ }
+ return null;
+ }
}
class LoadedByMyClassLoader {
- public static void bar() {
- Level1.$inline$bar();
- }
+ public static void bar() {
+ Level1.$inline$bar();
+ }
}
class Main {
- public static void main(String[] args) throws Exception {
- System.loadLibrary(args[0]);
- // Clone resolved methods, to restore the original version just
- // before we walk the stack in $noinline$bar.
- savedResolvedMethods = cloneResolvedMethods(Main.class);
+ public static void main(String[] args) throws Exception {
+ System.loadLibrary(args[0]);
+ // Clone resolved methods, to restore the original version just
+ // before we walk the stack in $noinline$bar.
+ savedResolvedMethods = cloneResolvedMethods(Main.class);
- MyClassLoader o = new MyClassLoader();
- MyClassLoader.level1ClassLoader = new MyClassLoader();
- Class<?> foo = o.loadClass("LoadedByMyClassLoader");
- Method m = foo.getDeclaredMethod("bar");
- try {
- m.invoke(null);
- } catch (Error e) { /* Ignore */ }
- }
+ MyClassLoader o = new MyClassLoader();
+ MyClassLoader.level1ClassLoader = new MyClassLoader();
+ Class<?> foo = o.loadClass("LoadedByMyClassLoader");
+ Method m = foo.getDeclaredMethod("bar");
+ try {
+ m.invoke(null);
+ } catch (Error e) { /* Ignore */ }
+ }
- public static void $inline$bar() {
- }
+ public static void $inline$bar() {
+ }
- public static void $noinline$bar() {
- try {
- // Be evil and clear all dex cache entries.
- Field f = Class.class.getDeclaredField("dexCache");
- f.setAccessible(true);
- Object dexCache = f.get(Main.class);
- f = dexCache.getClass().getDeclaredField("resolvedTypes");
- f.setAccessible(true);
- Object[] array = (Object[]) f.get(dexCache);
- for (int i = 0; i < array.length; i++) {
- array[i] = null;
- }
- restoreResolvedMethods(Main.class, savedResolvedMethods);
- } catch (Throwable t) { /* Ignore */ }
+ public static void $noinline$bar() {
+ try {
+ // Be evil and clear all dex cache entries.
+ Field f = Class.class.getDeclaredField("dexCache");
+ f.setAccessible(true);
+ Object dexCache = f.get(Main.class);
+ f = dexCache.getClass().getDeclaredField("resolvedTypes");
+ f.setAccessible(true);
+ Object[] array = (Object[]) f.get(dexCache);
+ for (int i = 0; i < array.length; i++) {
+ array[i] = null;
+ }
+ restoreResolvedMethods(Main.class, savedResolvedMethods);
+ } catch (Throwable t) { /* Ignore */ }
- // This will walk the stack, trying to resolve methods in it.
- // Because we cleared dex cache entries, we will have to find
- // classes again, which require to use the correct class loader
- // in the presence of inlining.
- new Exception().printStackTrace(System.out);
- }
- static Object savedResolvedMethods;
+ // This will walk the stack, trying to resolve methods in it.
+ // Because we cleared dex cache entries, we will have to find
+ // classes again, which require to use the correct class loader
+ // in the presence of inlining.
+ new Exception().printStackTrace(System.out);
+ }
+ static Object savedResolvedMethods;
- static native Object cloneResolvedMethods(Class<?> cls);
- static native void restoreResolvedMethods(Class<?> cls, Object saved);
+ static native Object cloneResolvedMethods(Class<?> cls);
+ static native void restoreResolvedMethods(Class<?> cls, Object saved);
}
diff --git a/test/498-type-propagation/src/Main.java b/test/498-type-propagation/src/Main.java
index b20794c..ceb35eb 100644
--- a/test/498-type-propagation/src/Main.java
+++ b/test/498-type-propagation/src/Main.java
@@ -17,11 +17,11 @@
import java.lang.reflect.Method;
public class Main {
- public static void main(String[] args) throws Exception {
- Class<?> c = Class.forName("TypePropagation");
- Method m = c.getMethod("method", int[].class);
- int[] array = new int[7];
- Object[] arguments = { array };
- m.invoke(null, arguments);
- }
+ public static void main(String[] args) throws Exception {
+ Class<?> c = Class.forName("TypePropagation");
+ Method m = c.getMethod("method", int[].class);
+ int[] array = new int[7];
+ Object[] arguments = { array };
+ m.invoke(null, arguments);
+ }
}
diff --git a/test/499-bce-phi-array-length/src/Main.java b/test/499-bce-phi-array-length/src/Main.java
index e917bc1..4e99771 100644
--- a/test/499-bce-phi-array-length/src/Main.java
+++ b/test/499-bce-phi-array-length/src/Main.java
@@ -15,50 +15,50 @@
*/
public class Main {
- public static int foo(int start, int[] array) {
- int result = 0;
- // We will create HDeoptimize nodes for this first loop, and a phi
- // for the array length which will only be used within the loop.
- for (int i = start; i < 3; i++) {
- result += array[i];
- for (int j = 0; j < 2; ++j) {
- // The HBoundsCheck for this array access will be updated to access
- // the array length phi created for the deoptimization checks of the
- // first loop. This crashed the compiler which used to DCHECK an array
- // length in a bounds check cannot be a phi.
- result += array[j];
- }
- }
- return result;
- }
-
- public static int bar(int start, int[] array) {
- int result = 0;
- for (int i = start; i < 3; i++) {
- result += array[i];
- for (int j = 0; j < 2; ++j) {
- result += array[j];
- // The following operations would lead to BCE wanting to add another
- // deoptimization, but it crashed assuming the input of a `HBoundsCheck`
- // must be a `HArrayLength`.
- result += array[0];
- result += array[1];
- result += array[2];
- }
- }
- return result;
- }
-
- public static void main(String[] args) {
- int[] a = new int[] { 1, 2, 3, 4, 5 };
- int result = foo(1, a);
- if (result != 11) {
- throw new Error("Got " + result + ", expected " + 11);
+ public static int foo(int start, int[] array) {
+ int result = 0;
+ // We will create HDeoptimize nodes for this first loop, and a phi
+ // for the array length which will only be used within the loop.
+ for (int i = start; i < 3; i++) {
+ result += array[i];
+ for (int j = 0; j < 2; ++j) {
+ // The HBoundsCheck for this array access will be updated to access
+ // the array length phi created for the deoptimization checks of the
+ // first loop. This crashed the compiler which used to DCHECK an array
+ // length in a bounds check cannot be a phi.
+ result += array[j];
+ }
+ }
+ return result;
}
- result = bar(1, a);
- if (result != 35) {
- throw new Error("Got " + result + ", expected " + 35);
+ public static int bar(int start, int[] array) {
+ int result = 0;
+ for (int i = start; i < 3; i++) {
+ result += array[i];
+ for (int j = 0; j < 2; ++j) {
+ result += array[j];
+ // The following operations would lead to BCE wanting to add another
+ // deoptimization, but it crashed assuming the input of a `HBoundsCheck`
+ // must be a `HArrayLength`.
+ result += array[0];
+ result += array[1];
+ result += array[2];
+ }
+ }
+ return result;
}
- }
+
+ public static void main(String[] args) {
+ int[] a = new int[] { 1, 2, 3, 4, 5 };
+ int result = foo(1, a);
+ if (result != 11) {
+ throw new Error("Got " + result + ", expected " + 11);
+ }
+
+ result = bar(1, a);
+ if (result != 35) {
+ throw new Error("Got " + result + ", expected " + 35);
+ }
+ }
}
diff --git a/test/596-checker-dead-phi/src/Main.java b/test/596-checker-dead-phi/src/Main.java
index c3384ad..ec2fbe5 100644
--- a/test/596-checker-dead-phi/src/Main.java
+++ b/test/596-checker-dead-phi/src/Main.java
@@ -17,13 +17,13 @@
import java.lang.reflect.Method;
public class Main {
- public static void main(String[] args) throws Exception {
- Class<?> c = Class.forName("IrreducibleLoop");
- // Note that we don't actually enter the loops in the 'liveness'
- // method, so this is just a verification that that part of the code we
- // generated for that method is correct.
- Method m = c.getMethod("liveness", int.class, int.class);
- Object[] arguments = {42, 12};
- System.out.println(m.invoke(null, arguments));
- }
+ public static void main(String[] args) throws Exception {
+ Class<?> c = Class.forName("IrreducibleLoop");
+ // Note that we don't actually enter the loops in the 'liveness'
+ // method, so this is just a verification that that part of the code we
+ // generated for that method is correct.
+ Method m = c.getMethod("liveness", int.class, int.class);
+ Object[] arguments = {42, 12};
+ System.out.println(m.invoke(null, arguments));
+ }
}
diff --git a/test/598-checker-irreducible-dominance/src/Main.java b/test/598-checker-irreducible-dominance/src/Main.java
index 4b1f490..cd38d3e 100644
--- a/test/598-checker-irreducible-dominance/src/Main.java
+++ b/test/598-checker-irreducible-dominance/src/Main.java
@@ -15,8 +15,8 @@
*/
public class Main {
- public static void main(String[] args) {
- // Nothing to run. This regression test merely makes sure the smali test
- // case successfully compiles.
- }
+ public static void main(String[] args) {
+ // Nothing to run. This regression test merely makes sure the smali test
+ // case successfully compiles.
+ }
}
diff --git a/test/599-checker-irreducible-loop/src/Main.java b/test/599-checker-irreducible-loop/src/Main.java
index 643e3a1..8a428a0 100644
--- a/test/599-checker-irreducible-loop/src/Main.java
+++ b/test/599-checker-irreducible-loop/src/Main.java
@@ -17,11 +17,11 @@
import java.lang.reflect.Method;
public class Main {
- public static void main(String[] args) throws Exception {
- Class<?> c = Class.forName("IrreducibleLoop");
- Method m = c.getMethod("test", int.class);
- Object[] arguments = { 42 };
- // Invoke the code just for validation purposes.
- System.out.println(m.invoke(null, arguments));
- }
+ public static void main(String[] args) throws Exception {
+ Class<?> c = Class.forName("IrreducibleLoop");
+ Method m = c.getMethod("test", int.class);
+ Object[] arguments = { 42 };
+ // Invoke the code just for validation purposes.
+ System.out.println(m.invoke(null, arguments));
+ }
}
diff --git a/test/616-cha-proxy-method-inline/src/Main.java b/test/616-cha-proxy-method-inline/src/Main.java
index 10adc20..627c15c 100644
--- a/test/616-cha-proxy-method-inline/src/Main.java
+++ b/test/616-cha-proxy-method-inline/src/Main.java
@@ -23,9 +23,7 @@
public static Object newInstance(Object obj) {
return java.lang.reflect.Proxy.newProxyInstance(
- Foo.class.getClassLoader(),
- interfaces,
- new DebugProxy(obj));
+ Foo.class.getClassLoader(), interfaces, new DebugProxy(obj));
}
private DebugProxy(Object obj) {
diff --git a/test/695-simplify-throws/src/Main.java b/test/695-simplify-throws/src/Main.java
index 2799624..9a95d80 100644
--- a/test/695-simplify-throws/src/Main.java
+++ b/test/695-simplify-throws/src/Main.java
@@ -15,31 +15,31 @@
*/
public class Main {
- public static boolean alwaysThrows() {
- throw new Error("");
- }
-
- public static void test() {
- alwaysThrows();
- while (condition) {
- int a = 2;
- while (otherCondition) {
- a = 3;
- }
- staticField = a;
+ public static boolean alwaysThrows() {
+ throw new Error("");
}
- }
- public static void main(String[] args) throws Exception {
- try {
- test();
- throw new Exception("Unexpected exception");
- } catch (Error e) {
- // Expected.
+ public static void test() {
+ alwaysThrows();
+ while (condition) {
+ int a = 2;
+ while (otherCondition) {
+ a = 3;
+ }
+ staticField = a;
+ }
}
- }
- static boolean condition = false;
- static boolean otherCondition = false;
- static int staticField = 1;
+ public static void main(String[] args) throws Exception {
+ try {
+ test();
+ throw new Exception("Unexpected exception");
+ } catch (Error e) {
+ // Expected.
+ }
+ }
+
+ static boolean condition = false;
+ static boolean otherCondition = false;
+ static int staticField = 1;
}
diff --git a/test/696-loop/src/Main.java b/test/696-loop/src/Main.java
index b92166a..9763a8e 100644
--- a/test/696-loop/src/Main.java
+++ b/test/696-loop/src/Main.java
@@ -15,24 +15,24 @@
*/
public class Main {
- static int[] sA = new int[12];
- static int a = 1;
+ static int[] sA = new int[12];
+ static int a = 1;
- static void doIt(int n) {
- for (int i = 0; i < 2; i++) {
- n+=a;
+ static void doIt(int n) {
+ for (int i = 0; i < 2; i++) {
+ n += a;
+ }
+ for (int i = 0; i < n; i++) {
+ sA[i] += 1;
+ }
}
- for (int i = 0; i < n; i++) {
- sA[i] += 1;
- }
- }
- public static void main(String[] args) {
- doIt(10);
- for (int i = 0; i < sA.length; i++) {
- if (sA[i] != 1) {
- throw new Error("Expected 1, got " + sA[i]);
- }
+ public static void main(String[] args) {
+ doIt(10);
+ for (int i = 0; i < sA.length; i++) {
+ if (sA[i] != 1) {
+ throw new Error("Expected 1, got " + sA[i]);
+ }
+ }
}
- }
}
diff --git a/test/698-selects/src/Main.java b/test/698-selects/src/Main.java
index 1fadb86..514770a 100644
--- a/test/698-selects/src/Main.java
+++ b/test/698-selects/src/Main.java
@@ -15,28 +15,28 @@
*/
public class Main {
- public static int mZenMode = 0;
+ public static int mZenMode = 0;
- public static int $noinline$foo(int internal, boolean check1, boolean check2) {
- int result = internal;
- if (check1) {
- // This block is to ensure `result` is a phi in the return block. Without this block
- // the compiler could just generate one block with selects.
- if (check2) {
- mZenMode = 42;
- }
- result = (internal == 1) ? 1 : 0;
+ public static int $noinline$foo(int internal, boolean check1, boolean check2) {
+ int result = internal;
+ if (check1) {
+ // This block is to ensure `result` is a phi in the return block. Without this block
+ // the compiler could just generate one block with selects.
+ if (check2) {
+ mZenMode = 42;
+ }
+ result = (internal == 1) ? 1 : 0;
+ }
+ // The optimization bug was to make the incorrect assumption that:
+ // phi = (internal, (internal == 1))
+ // meant `internal` was a boolean.
+ return result;
}
- // The optimization bug was to make the incorrect assumption that:
- // phi = (internal, (internal == 1))
- // meant `internal` was a boolean.
- return result;
- }
- public static void main(String[] args) {
- int result = $noinline$foo(2, true, true);
- if (result != 0) {
- throw new Error("Expected 0, got " + result);
+ public static void main(String[] args) {
+ int result = $noinline$foo(2, true, true);
+ if (result != 0) {
+ throw new Error("Expected 0, got " + result);
+ }
}
- }
}
diff --git a/test/916-obsolete-jit/src/Main.java b/test/916-obsolete-jit/src/Main.java
index c265db9..f893c8e 100644
--- a/test/916-obsolete-jit/src/Main.java
+++ b/test/916-obsolete-jit/src/Main.java
@@ -26,72 +26,72 @@
// import java.util.function.Consumer;
//
// class Transform {
- // private void Start(Consumer<String> reporter) {
- // reporter.accept("Hello - private - Transformed");
- // }
+ // private void Start(Consumer<String> reporter) {
+ // reporter.accept("Hello - private - Transformed");
+ // }
//
- // private void Finish(Consumer<String> reporter) {
- // reporter.accept("Goodbye - private - Transformed");
- // }
+ // private void Finish(Consumer<String> reporter) {
+ // reporter.accept("Goodbye - private - Transformed");
+ // }
//
- // public void sayHi(Runnable r, Consumer<String> reporter) {
- // reporter.accept("pre Start private method call - Transformed");
- // Start(reporter);
- // reporter.accept("post Start private method call - Transformed");
- // r.run();
- // reporter.accept("pre Finish private method call - Transformed");
- // Finish(reporter);
- // reporter.accept("post Finish private method call - Transformed");
- // }
+ // public void sayHi(Runnable r, Consumer<String> reporter) {
+ // reporter.accept("pre Start private method call - Transformed");
+ // Start(reporter);
+ // reporter.accept("post Start private method call - Transformed");
+ // r.run();
+ // reporter.accept("pre Finish private method call - Transformed");
+ // Finish(reporter);
+ // reporter.accept("post Finish private method call - Transformed");
+ // }
// }
private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
- "yv66vgAAADQAMAoADQAcCAAdCwAeAB8IACAIACEKAAwAIggAIwsAJAAlCAAmCgAMACcIACgHACkH" +
- "ACoBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAFU3RhcnQBACAoTGph" +
- "dmEvdXRpbC9mdW5jdGlvbi9Db25zdW1lcjspVgEACVNpZ25hdHVyZQEANChMamF2YS91dGlsL2Z1" +
- "bmN0aW9uL0NvbnN1bWVyPExqYXZhL2xhbmcvU3RyaW5nOz47KVYBAAZGaW5pc2gBAAVzYXlIaQEA" +
- "NChMamF2YS9sYW5nL1J1bm5hYmxlO0xqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXI7KVYBAEgo" +
- "TGphdmEvbGFuZy9SdW5uYWJsZTtMamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyPExqYXZhL2xh" +
- "bmcvU3RyaW5nOz47KVYBAApTb3VyY2VGaWxlAQAOVHJhbnNmb3JtLmphdmEMAA4ADwEAHUhlbGxv" +
- "IC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVkBwArDAAsAC0BAB9Hb29kYnllIC0gcHJpdmF0ZSAtIFRy" +
- "YW5zZm9ybWVkAQArcHJlIFN0YXJ0IHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAwA" +
- "EgATAQAscG9zdCBTdGFydCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQHAC4MAC8A" +
- "DwEALHByZSBGaW5pc2ggcHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkDAAWABMBAC1w" +
- "b3N0IEZpbmlzaCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQBAAlUcmFuc2Zvcm0B" +
- "ABBqYXZhL2xhbmcvT2JqZWN0AQAbamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyAQAGYWNjZXB0" +
- "AQAVKExqYXZhL2xhbmcvT2JqZWN0OylWAQASamF2YS9sYW5nL1J1bm5hYmxlAQADcnVuACAADAAN" +
- "AAAAAAAEAAAADgAPAAEAEAAAAB0AAQABAAAABSq3AAGxAAAAAQARAAAABgABAAAAEwACABIAEwAC" +
- "ABAAAAAlAAIAAgAAAAkrEgK5AAMCALEAAAABABEAAAAKAAIAAAAVAAgAFgAUAAAAAgAVAAIAFgAT" +
- "AAIAEAAAACUAAgACAAAACSsSBLkAAwIAsQAAAAEAEQAAAAoAAgAAABkACAAaABQAAAACABUAAQAX" +
- "ABgAAgAQAAAAZQACAAMAAAAxLBIFuQADAgAqLLcABiwSB7kAAwIAK7kACAEALBIJuQADAgAqLLcA" +
- "CiwSC7kAAwIAsQAAAAEAEQAAACIACAAAAB0ACAAeAA0AHwAVACAAGwAhACMAIgAoACMAMAAkABQA" +
- "AAACABkAAQAaAAAAAgAb");
+ "yv66vgAAADQAMAoADQAcCAAdCwAeAB8IACAIACEKAAwAIggAIwsAJAAlCAAmCgAMACcIACgHACkH" +
+ "ACoBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAFU3RhcnQBACAoTGph" +
+ "dmEvdXRpbC9mdW5jdGlvbi9Db25zdW1lcjspVgEACVNpZ25hdHVyZQEANChMamF2YS91dGlsL2Z1" +
+ "bmN0aW9uL0NvbnN1bWVyPExqYXZhL2xhbmcvU3RyaW5nOz47KVYBAAZGaW5pc2gBAAVzYXlIaQEA" +
+ "NChMamF2YS9sYW5nL1J1bm5hYmxlO0xqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXI7KVYBAEgo" +
+ "TGphdmEvbGFuZy9SdW5uYWJsZTtMamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyPExqYXZhL2xh" +
+ "bmcvU3RyaW5nOz47KVYBAApTb3VyY2VGaWxlAQAOVHJhbnNmb3JtLmphdmEMAA4ADwEAHUhlbGxv" +
+ "IC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVkBwArDAAsAC0BAB9Hb29kYnllIC0gcHJpdmF0ZSAtIFRy" +
+ "YW5zZm9ybWVkAQArcHJlIFN0YXJ0IHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAwA" +
+ "EgATAQAscG9zdCBTdGFydCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQHAC4MAC8A" +
+ "DwEALHByZSBGaW5pc2ggcHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkDAAWABMBAC1w" +
+ "b3N0IEZpbmlzaCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQBAAlUcmFuc2Zvcm0B" +
+ "ABBqYXZhL2xhbmcvT2JqZWN0AQAbamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyAQAGYWNjZXB0" +
+ "AQAVKExqYXZhL2xhbmcvT2JqZWN0OylWAQASamF2YS9sYW5nL1J1bm5hYmxlAQADcnVuACAADAAN" +
+ "AAAAAAAEAAAADgAPAAEAEAAAAB0AAQABAAAABSq3AAGxAAAAAQARAAAABgABAAAAEwACABIAEwAC" +
+ "ABAAAAAlAAIAAgAAAAkrEgK5AAMCALEAAAABABEAAAAKAAIAAAAVAAgAFgAUAAAAAgAVAAIAFgAT" +
+ "AAIAEAAAACUAAgACAAAACSsSBLkAAwIAsQAAAAEAEQAAAAoAAgAAABkACAAaABQAAAACABUAAQAX" +
+ "ABgAAgAQAAAAZQACAAMAAAAxLBIFuQADAgAqLLcABiwSB7kAAwIAK7kACAEALBIJuQADAgAqLLcA" +
+ "CiwSC7kAAwIAsQAAAAEAEQAAACIACAAAAB0ACAAeAA0AHwAVACAAGwAhACMAIgAoACMAMAAkABQA" +
+ "AAACABkAAQAaAAAAAgAb");
private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
- "ZGV4CjAzNQBc8wr9PcHqnOR61m+0kimXTSddVMToJPuYBQAAcAAAAHhWNBIAAAAAAAAAAOAEAAAc" +
- "AAAAcAAAAAYAAADgAAAABAAAAPgAAAAAAAAAAAAAAAcAAAAoAQAAAQAAAGABAAAYBAAAgAEAAHoC" +
- "AAB9AgAAgAIAAIgCAACOAgAAlgIAALcCAADWAgAA4wIAAAIDAAAWAwAALAMAAEADAABeAwAAfQMA" +
- "AIQDAACUAwAAlwMAAJsDAACgAwAAqAMAALwDAADrAwAAGQQAAEcEAAB0BAAAeQQAAIAEAAAHAAAA" +
- "CAAAAAkAAAAKAAAADQAAABAAAAAQAAAABQAAAAAAAAARAAAABQAAAGQCAAASAAAABQAAAGwCAAAR" +
- "AAAABQAAAHQCAAAAAAAAAgAAAAAAAwAEAAAAAAADAA4AAAAAAAIAGgAAAAIAAAACAAAAAwAAABkA" +
- "AAAEAAEAEwAAAAAAAAAAAAAAAgAAAAAAAAAPAAAAPAIAAMoEAAAAAAAAAQAAAKgEAAABAAAAuAQA" +
- "AAEAAQABAAAAhwQAAAQAAABwEAQAAAAOAAMAAgACAAAAjAQAAAcAAAAbAAUAAAByIAYAAgAOAAAA" +
- "AwACAAIAAACTBAAABwAAABsABgAAAHIgBgACAA4AAAAEAAMAAgAAAJoEAAAiAAAAGwAYAAAAciAG" +
- "AAMAcCACADEAGwAWAAAAciAGAAMAchAFAAIAGwAXAAAAciAGAAMAcCABADEAGwAVAAAAciAGAAMA" +
- "DgAAAAAAAAAAAAMAAAAAAAAAAQAAAIABAAACAAAAgAEAAAMAAACIAQAAAQAAAAIAAAACAAAAAwAE" +
- "AAEAAAAEAAEoAAE8AAY8aW5pdD4ABD47KVYABkZpbmlzaAAfR29vZGJ5ZSAtIHByaXZhdGUgLSBU" +
- "cmFuc2Zvcm1lZAAdSGVsbG8gLSBwcml2YXRlIC0gVHJhbnNmb3JtZWQAC0xUcmFuc2Zvcm07AB1M" +
- "ZGFsdmlrL2Fubm90YXRpb24vU2lnbmF0dXJlOwASTGphdmEvbGFuZy9PYmplY3Q7ABRMamF2YS9s" +
- "YW5nL1J1bm5hYmxlOwASTGphdmEvbGFuZy9TdHJpbmc7ABxMamF2YS91dGlsL2Z1bmN0aW9uL0Nv" +
- "bnN1bWVyAB1MamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyOwAFU3RhcnQADlRyYW5zZm9ybS5q" +
- "YXZhAAFWAAJWTAADVkxMAAZhY2NlcHQAEmVtaXR0ZXI6IGphY2stNC4xOQAtcG9zdCBGaW5pc2gg" +
- "cHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkACxwb3N0IFN0YXJ0IHByaXZhdGUgbWV0" +
- "aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAAscHJlIEZpbmlzaCBwcml2YXRlIG1ldGhvZCBjYWxsIC0g" +
- "VHJhbnNmb3JtZWQAK3ByZSBTdGFydCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQA" +
- "A3J1bgAFc2F5SGkABXZhbHVlABMABw4AGQEABw5pABUBAAcOaQAdAgAABw5pPGk8aTxpAAIBARsc" +
- "BRcAFwwXARcLFwMCAQEbHAYXABcKFwwXARcLFwMAAAMBAICABJADAQKoAwECyAMDAegDDwAAAAAA" +
- "AAABAAAAAAAAAAEAAAAcAAAAcAAAAAIAAAAGAAAA4AAAAAMAAAAEAAAA+AAAAAUAAAAHAAAAKAEA" +
- "AAYAAAABAAAAYAEAAAMQAAACAAAAgAEAAAEgAAAEAAAAkAEAAAYgAAABAAAAPAIAAAEQAAADAAAA" +
- "ZAIAAAIgAAAcAAAAegIAAAMgAAAEAAAAhwQAAAQgAAACAAAAqAQAAAAgAAABAAAAygQAAAAQAAAB" +
- "AAAA4AQAAA==");
+ "ZGV4CjAzNQBc8wr9PcHqnOR61m+0kimXTSddVMToJPuYBQAAcAAAAHhWNBIAAAAAAAAAAOAEAAAc" +
+ "AAAAcAAAAAYAAADgAAAABAAAAPgAAAAAAAAAAAAAAAcAAAAoAQAAAQAAAGABAAAYBAAAgAEAAHoC" +
+ "AAB9AgAAgAIAAIgCAACOAgAAlgIAALcCAADWAgAA4wIAAAIDAAAWAwAALAMAAEADAABeAwAAfQMA" +
+ "AIQDAACUAwAAlwMAAJsDAACgAwAAqAMAALwDAADrAwAAGQQAAEcEAAB0BAAAeQQAAIAEAAAHAAAA" +
+ "CAAAAAkAAAAKAAAADQAAABAAAAAQAAAABQAAAAAAAAARAAAABQAAAGQCAAASAAAABQAAAGwCAAAR" +
+ "AAAABQAAAHQCAAAAAAAAAgAAAAAAAwAEAAAAAAADAA4AAAAAAAIAGgAAAAIAAAACAAAAAwAAABkA" +
+ "AAAEAAEAEwAAAAAAAAAAAAAAAgAAAAAAAAAPAAAAPAIAAMoEAAAAAAAAAQAAAKgEAAABAAAAuAQA" +
+ "AAEAAQABAAAAhwQAAAQAAABwEAQAAAAOAAMAAgACAAAAjAQAAAcAAAAbAAUAAAByIAYAAgAOAAAA" +
+ "AwACAAIAAACTBAAABwAAABsABgAAAHIgBgACAA4AAAAEAAMAAgAAAJoEAAAiAAAAGwAYAAAAciAG" +
+ "AAMAcCACADEAGwAWAAAAciAGAAMAchAFAAIAGwAXAAAAciAGAAMAcCABADEAGwAVAAAAciAGAAMA" +
+ "DgAAAAAAAAAAAAMAAAAAAAAAAQAAAIABAAACAAAAgAEAAAMAAACIAQAAAQAAAAIAAAACAAAAAwAE" +
+ "AAEAAAAEAAEoAAE8AAY8aW5pdD4ABD47KVYABkZpbmlzaAAfR29vZGJ5ZSAtIHByaXZhdGUgLSBU" +
+ "cmFuc2Zvcm1lZAAdSGVsbG8gLSBwcml2YXRlIC0gVHJhbnNmb3JtZWQAC0xUcmFuc2Zvcm07AB1M" +
+ "ZGFsdmlrL2Fubm90YXRpb24vU2lnbmF0dXJlOwASTGphdmEvbGFuZy9PYmplY3Q7ABRMamF2YS9s" +
+ "YW5nL1J1bm5hYmxlOwASTGphdmEvbGFuZy9TdHJpbmc7ABxMamF2YS91dGlsL2Z1bmN0aW9uL0Nv" +
+ "bnN1bWVyAB1MamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyOwAFU3RhcnQADlRyYW5zZm9ybS5q" +
+ "YXZhAAFWAAJWTAADVkxMAAZhY2NlcHQAEmVtaXR0ZXI6IGphY2stNC4xOQAtcG9zdCBGaW5pc2gg" +
+ "cHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkACxwb3N0IFN0YXJ0IHByaXZhdGUgbWV0" +
+ "aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAAscHJlIEZpbmlzaCBwcml2YXRlIG1ldGhvZCBjYWxsIC0g" +
+ "VHJhbnNmb3JtZWQAK3ByZSBTdGFydCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQA" +
+ "A3J1bgAFc2F5SGkABXZhbHVlABMABw4AGQEABw5pABUBAAcOaQAdAgAABw5pPGk8aTxpAAIBARsc" +
+ "BRcAFwwXARcLFwMCAQEbHAYXABcKFwwXARcLFwMAAAMBAICABJADAQKoAwECyAMDAegDDwAAAAAA" +
+ "AAABAAAAAAAAAAEAAAAcAAAAcAAAAAIAAAAGAAAA4AAAAAMAAAAEAAAA+AAAAAUAAAAHAAAAKAEA" +
+ "AAYAAAABAAAAYAEAAAMQAAACAAAAgAEAAAEgAAAEAAAAkAEAAAYgAAABAAAAPAIAAAEQAAADAAAA" +
+ "ZAIAAAIgAAAcAAAAegIAAAMgAAAEAAAAhwQAAAQgAAACAAAAqAQAAAAgAAABAAAAygQAAAAQAAAB" +
+ "AAAA4AQAAA==");
// A class that we can use to keep track of the output of this test.
private static class TestWatcher implements Consumer<String> {
diff --git a/test/995-breakpoints-throw/src/Main.java b/test/995-breakpoints-throw/src/Main.java
index 6f80b43..e92cd9b 100644
--- a/test/995-breakpoints-throw/src/Main.java
+++ b/test/995-breakpoints-throw/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test995.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test995.run();
+ }
}
diff --git a/test/995-breakpoints-throw/src/art/Test995.java b/test/995-breakpoints-throw/src/art/Test995.java
index a4023fb..5fb5e08 100644
--- a/test/995-breakpoints-throw/src/art/Test995.java
+++ b/test/995-breakpoints-throw/src/art/Test995.java
@@ -21,116 +21,119 @@
import java.lang.reflect.Method;
public class Test995 {
- public static final Breakpoint.Manager MANAGER = new Breakpoint.Manager();
- public static BreakpointHandler HANDLER = null;
+ public static final Breakpoint.Manager MANAGER = new Breakpoint.Manager();
+ public static BreakpointHandler HANDLER = null;
- public static void doNothing() { }
+ public static void doNothing() { }
- public static interface BreakpointHandler {
- public void breakpointReached(Executable e, long loc);
- }
-
- public static void breakpoint() {
- return;
- }
-
- public static void breakpointCatchLate() {
- doNothing();
- try {
- doNothing();
- } catch (Throwable t) {
- System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
+ public static interface BreakpointHandler {
+ public void breakpointReached(Executable e, long loc);
}
- }
- public static void breakpointCatch() {
- try {
- doNothing();
- } catch (Throwable t) {
- System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
+ public static void breakpoint() {
+ return;
}
- }
- public static void notifyBreakpointReached(Thread thr, Executable e, long loc) {
- System.out.println("\tBreakpoint: " + e + " @ line=" + Breakpoint.locationToLine(e, loc));
- HANDLER.breakpointReached(e, loc);
- }
-
-
- public static BreakpointHandler makeHandler(String name, BreakpointHandler h) {
- return new BreakpointHandler() {
- public String toString() {
- return name;
- }
- public void breakpointReached(Executable e, long loc) {
- h.breakpointReached(e, loc);
- }
- };
- }
-
- public static Runnable makeTest(String name, Runnable test) {
- return new Runnable() {
- public String toString() { return name; }
- public void run() { test.run(); }
- };
- }
-
- public static void run() throws Exception {
- // Set up breakpoints
- Breakpoint.stopBreakpointWatch(Thread.currentThread());
- Breakpoint.startBreakpointWatch(
- Test995.class,
- Test995.class.getDeclaredMethod(
- "notifyBreakpointReached", Thread.class, Executable.class, Long.TYPE),
- Thread.currentThread());
-
- Method breakpoint_method = Test995.class.getDeclaredMethod("breakpoint");
- Method breakpoint_catch_method = Test995.class.getDeclaredMethod("breakpointCatch");
- Method breakpoint_catch_late_method = Test995.class.getDeclaredMethod("breakpointCatchLate");
- MANAGER.setBreakpoint(breakpoint_method, Breakpoint.getStartLocation(breakpoint_method));
- MANAGER.setBreakpoint(
- breakpoint_catch_method, Breakpoint.getStartLocation(breakpoint_catch_method));
- MANAGER.setBreakpoint(
- breakpoint_catch_late_method, Breakpoint.getStartLocation(breakpoint_catch_late_method));
-
- BreakpointHandler[] handlers = new BreakpointHandler[] {
- makeHandler("do nothing", (e, l) -> {}),
- makeHandler("throw", (e, l) -> { throw new Error("throwing error!"); }),
- };
-
- Runnable[] tests = new Runnable[] {
- makeTest("call Test995::breakpoint", Test995::breakpoint),
- makeTest("call Test995::breakpointCatch", Test995::breakpointCatch),
- makeTest("call Test995::breakpointCatchLate", Test995::breakpointCatchLate),
- makeTest("catch subroutine Test995::breakpoint",
- () -> {
- try {
- breakpoint();
- } catch (Throwable t) {
- System.out.printf("Caught %s:\"%s\"\n", t.getClass().getName(), t.getMessage());
- }
- }),
- };
-
- for (BreakpointHandler handler : handlers) {
- for (Runnable test : tests) {
+ public static void breakpointCatchLate() {
+ doNothing();
try {
- HANDLER = handler;
- System.out.printf("Test \"%s\": Running breakpoint with handler \"%s\"\n",
- test, handler);
- test.run();
- System.out.printf("Test \"%s\": No error caught with handler \"%s\"\n",
- test, handler);
- } catch (Throwable e) {
- System.out.printf("Test \"%s\": Caught error %s:\"%s\" with handler \"%s\"\n",
- test, e.getClass().getName(), e.getMessage(), handler);
+ doNothing();
+ } catch (Throwable t) {
+ System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
}
- System.out.printf("Test \"%s\": Finished running with handler \"%s\"\n", test, handler);
- HANDLER = null;
- }
}
- MANAGER.clearAllBreakpoints();
- Breakpoint.stopBreakpointWatch(Thread.currentThread());
- }
+ public static void breakpointCatch() {
+ try {
+ doNothing();
+ } catch (Throwable t) {
+ System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
+ }
+ }
+
+ public static void notifyBreakpointReached(Thread thr, Executable e, long loc) {
+ System.out.println("\tBreakpoint: " + e + " @ line=" + Breakpoint.locationToLine(e, loc));
+ HANDLER.breakpointReached(e, loc);
+ }
+
+
+ public static BreakpointHandler makeHandler(String name, BreakpointHandler h) {
+ return new BreakpointHandler() {
+ public String toString() {
+ return name;
+ }
+ public void breakpointReached(Executable e, long loc) {
+ h.breakpointReached(e, loc);
+ }
+ };
+ }
+
+ public static Runnable makeTest(String name, Runnable test) {
+ return new Runnable() {
+ public String toString() { return name; }
+ public void run() { test.run(); }
+ };
+ }
+
+ public static void run() throws Exception {
+ // Set up breakpoints
+ Breakpoint.stopBreakpointWatch(Thread.currentThread());
+ Breakpoint.startBreakpointWatch(
+ Test995.class,
+ Test995.class.getDeclaredMethod(
+ "notifyBreakpointReached", Thread.class, Executable.class, Long.TYPE),
+ Thread.currentThread());
+
+ Method breakpoint_method = Test995.class.getDeclaredMethod("breakpoint");
+ Method breakpoint_catch_method = Test995.class.getDeclaredMethod("breakpointCatch");
+ Method breakpoint_catch_late_method =
+ Test995.class.getDeclaredMethod("breakpointCatchLate");
+ MANAGER.setBreakpoint(breakpoint_method, Breakpoint.getStartLocation(breakpoint_method));
+ MANAGER.setBreakpoint(
+ breakpoint_catch_method, Breakpoint.getStartLocation(breakpoint_catch_method));
+ MANAGER.setBreakpoint(breakpoint_catch_late_method,
+ Breakpoint.getStartLocation(breakpoint_catch_late_method));
+
+ BreakpointHandler[] handlers = new BreakpointHandler[] {
+ makeHandler("do nothing", (e, l) -> {}),
+ makeHandler("throw", (e, l) -> { throw new Error("throwing error!"); }),
+ };
+
+ Runnable[] tests = new Runnable[] {
+ makeTest("call Test995::breakpoint", Test995::breakpoint),
+ makeTest("call Test995::breakpointCatch", Test995::breakpointCatch),
+ makeTest("call Test995::breakpointCatchLate", Test995::breakpointCatchLate),
+ makeTest("catch subroutine Test995::breakpoint",
+ () -> {
+ try {
+ breakpoint();
+ } catch (Throwable t) {
+ System.out.printf("Caught %s:\"%s\"\n", t.getClass().getName(),
+ t.getMessage());
+ }
+ }),
+ };
+
+ for (BreakpointHandler handler : handlers) {
+ for (Runnable test : tests) {
+ try {
+ HANDLER = handler;
+ System.out.printf(
+ "Test \"%s\": Running breakpoint with handler \"%s\"\n", test, handler);
+ test.run();
+ System.out.printf(
+ "Test \"%s\": No error caught with handler \"%s\"\n", test, handler);
+ } catch (Throwable e) {
+ System.out.printf("Test \"%s\": Caught error %s:\"%s\" with handler \"%s\"\n",
+ test, e.getClass().getName(), e.getMessage(), handler);
+ }
+ System.out.printf(
+ "Test \"%s\": Finished running with handler \"%s\"\n", test, handler);
+ HANDLER = null;
+ }
+ }
+
+ MANAGER.clearAllBreakpoints();
+ Breakpoint.stopBreakpointWatch(Thread.currentThread());
+ }
}
diff --git a/test/996-breakpoint-obsolete/src/Main.java b/test/996-breakpoint-obsolete/src/Main.java
index 1b9b0a9..521d7fa 100644
--- a/test/996-breakpoint-obsolete/src/Main.java
+++ b/test/996-breakpoint-obsolete/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test996.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test996.run();
+ }
}
diff --git a/test/996-breakpoint-obsolete/src/art/Test996.java b/test/996-breakpoint-obsolete/src/art/Test996.java
index f3166c3..29dfff2 100644
--- a/test/996-breakpoint-obsolete/src/art/Test996.java
+++ b/test/996-breakpoint-obsolete/src/art/Test996.java
@@ -21,132 +21,133 @@
import java.util.Base64;
public class Test996 {
- // The line we are going to break on. This should be the println in the Transform class. We set a
- // breakpoint here after we have redefined the class.
- public static final int TRANSFORM_BREAKPOINT_REDEFINED_LINE = 40;
+ // The line we are going to break on. This should be the println in the Transform class.
+ // We set a breakpoint here after we have redefined the class.
+ public static final int TRANSFORM_BREAKPOINT_REDEFINED_LINE = 40;
- // The line we initially set a breakpoint on. This should be the doNothing call. This should be
- // cleared by the redefinition and should only be caught on the initial run.
- public static final int TRANSFORM_BREAKPOINT_INITIAL_LINE = 42;
+ // The line we initially set a breakpoint on. This should be the doNothing call. This should be
+ // cleared by the redefinition and should only be caught on the initial run.
+ public static final int TRANSFORM_BREAKPOINT_INITIAL_LINE = 42;
- // A function that doesn't do anything. Used for giving places to break on in a function.
- public static void doNothing() {}
+ // A function that doesn't do anything. Used for giving places to break on in a function.
+ public static void doNothing() {}
- public static final class Transform {
- public void run(Runnable r) {
- r.run();
- // Make sure we don't change anything above this line to keep all the breakpoint stuff
- // working. We will be putting a breakpoint before this line in the runnable.
- System.out.println("Should be after first breakpoint.");
- // This is set as a breakpoint prior to redefinition. It should not be hit.
- doNothing();
+ public static final class Transform {
+ public void run(Runnable r) {
+ r.run();
+ // Make sure we don't change anything above this line to keep all the breakpoint stuff
+ // working. We will be putting a breakpoint before this line in the runnable.
+ System.out.println("Should be after first breakpoint.");
+ // This is set as a breakpoint prior to redefinition. It should not be hit.
+ doNothing();
+ }
}
- }
- /* ******************************************************************************************** */
- // Try to keep all edits to this file below the above line. If edits need to be made above this
- // line be sure to update the TRANSFORM_BREAKPOINT_REDEFINED_LINE and
- // TRANSFORM_BREAKPOINT_INITIAL_LINE to their appropriate values.
+ /* ****************************************************************************************** */
+ // Try to keep all edits to this file below the above line. If edits need to be made above this
+ // line be sure to update the TRANSFORM_BREAKPOINT_REDEFINED_LINE and
+ // TRANSFORM_BREAKPOINT_INITIAL_LINE to their appropriate values.
- public static final int TRANSFORM_BREAKPOINT_POST_REDEFINITION_LINE = 8;
+ public static final int TRANSFORM_BREAKPOINT_POST_REDEFINITION_LINE = 8;
- // The base64 encoding of the following class. The redefined 'run' method should have the same
- // instructions as the original. This means that the locations of each line should stay the same
- // and the set of valid locations will not change. We use this to ensure that breakpoints are
- // removed from the redefined method.
- // public static final class Transform {
- // public void run(Runnable r) {
- // r.run();
- // System.out.println("Doing nothing transformed");
- // doNothing(); // try to catch non-removed breakpoints
- // }
- // }
- private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
- "yv66vgAAADQAKAoACAARCwASABMJABQAFQgAFgoAFwAYCgAZABoHABsHAB4BAAY8aW5pdD4BAAMo" +
- "KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQADcnVuAQAXKExqYXZhL2xhbmcvUnVubmFibGU7" +
- "KVYBAApTb3VyY2VGaWxlAQAMVGVzdDk5Ni5qYXZhDAAJAAoHAB8MAA0ACgcAIAwAIQAiAQAZRG9p" +
- "bmcgbm90aGluZyB0cmFuc2Zvcm1lZAcAIwwAJAAlBwAmDAAnAAoBABVhcnQvVGVzdDk5NiRUcmFu" +
- "c2Zvcm0BAAlUcmFuc2Zvcm0BAAxJbm5lckNsYXNzZXMBABBqYXZhL2xhbmcvT2JqZWN0AQASamF2" +
- "YS9sYW5nL1J1bm5hYmxlAQAQamF2YS9sYW5nL1N5c3RlbQEAA291dAEAFUxqYXZhL2lvL1ByaW50" +
- "U3RyZWFtOwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmludGxuAQAVKExqYXZhL2xhbmcvU3Ry" +
- "aW5nOylWAQALYXJ0L1Rlc3Q5OTYBAAlkb05vdGhpbmcAMQAHAAgAAAAAAAIAAQAJAAoAAQALAAAA" +
- "HQABAAEAAAAFKrcAAbEAAAABAAwAAAAGAAEAAAAEAAEADQAOAAEACwAAADYAAgACAAAAEiu5AAIB" +
- "ALIAAxIEtgAFuAAGsQAAAAEADAAAABIABAAAAAYABgAHAA4ACAARAAkAAgAPAAAAAgAQAB0AAAAK" +
- "AAEABwAZABwAGQ==");
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
- "ZGV4CjAzNQBzn3TiKGAiM0fubj25v816W0k+niqj+SQcBAAAcAAAAHhWNBIAAAAAAAAAAFgDAAAW" +
- "AAAAcAAAAAoAAADIAAAAAwAAAPAAAAABAAAAFAEAAAYAAAAcAQAAAQAAAEwBAACwAgAAbAEAANoB" +
- "AADiAQAA/QEAABYCAAAlAgAASQIAAGkCAACAAgAAlAIAAKoCAAC+AgAA0gIAAOACAADrAgAA7gIA" +
- "APICAAD/AgAACgMAABADAAAVAwAAHgMAACMDAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAA" +
- "CQAAAAoAAAANAAAADQAAAAkAAAAAAAAADgAAAAkAAADMAQAADgAAAAkAAADUAQAACAAEABIAAAAA" +
- "AAAAAAAAAAAAAQAUAAAAAQAAABAAAAAEAAIAEwAAAAUAAAAAAAAABgAAABQAAAAAAAAAEQAAAAUA" +
- "AAAAAAAACwAAALwBAABHAwAAAAAAAAIAAAA4AwAAPgMAAAEAAQABAAAAKgMAAAQAAABwEAQAAAAO" +
- "AAQAAgACAAAALwMAAA4AAAByEAUAAwBiAAAAGgEBAG4gAwAQAHEAAgAAAA4AbAEAAAAAAAAAAAAA" +
- "AAAAAAEAAAAGAAAAAQAAAAcABjxpbml0PgAZRG9pbmcgbm90aGluZyB0cmFuc2Zvcm1lZAAXTGFy" +
- "dC9UZXN0OTk2JFRyYW5zZm9ybTsADUxhcnQvVGVzdDk5NjsAIkxkYWx2aWsvYW5ub3RhdGlvbi9F" +
- "bmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAVTGphdmEvaW8v" +
- "UHJpbnRTdHJlYW07ABJMamF2YS9sYW5nL09iamVjdDsAFExqYXZhL2xhbmcvUnVubmFibGU7ABJM" +
- "amF2YS9sYW5nL1N0cmluZzsAEkxqYXZhL2xhbmcvU3lzdGVtOwAMVGVzdDk5Ni5qYXZhAAlUcmFu" +
- "c2Zvcm0AAVYAAlZMAAthY2Nlc3NGbGFncwAJZG9Ob3RoaW5nAARuYW1lAANvdXQAB3ByaW50bG4A" +
- "A3J1bgAFdmFsdWUABAAHDgAGAQAHDjx4PAACAgEVGAECAwIPBBkRFwwAAAEBAIGABPgCAQGQAwAA" +
- "ABAAAAAAAAAAAQAAAAAAAAABAAAAFgAAAHAAAAACAAAACgAAAMgAAAADAAAAAwAAAPAAAAAEAAAA" +
- "AQAAABQBAAAFAAAABgAAABwBAAAGAAAAAQAAAEwBAAADEAAAAQAAAGwBAAABIAAAAgAAAHgBAAAG" +
- "IAAAAQAAALwBAAABEAAAAgAAAMwBAAACIAAAFgAAANoBAAADIAAAAgAAACoDAAAEIAAAAgAAADgD" +
- "AAAAIAAAAQAAAEcDAAAAEAAAAQAAAFgDAAA=");
+ // The base64 encoding of the following class. The redefined 'run' method should have the same
+ // instructions as the original. This means that the locations of each line should stay the same
+ // and the set of valid locations will not change. We use this to ensure that breakpoints are
+ // removed from the redefined method.
+ // public static final class Transform {
+ // public void run(Runnable r) {
+ // r.run();
+ // System.out.println("Doing nothing transformed");
+ // doNothing(); // try to catch non-removed breakpoints
+ // }
+ // }
+ private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
+ "yv66vgAAADQAKAoACAARCwASABMJABQAFQgAFgoAFwAYCgAZABoHABsHAB4BAAY8aW5pdD4BAAMo" +
+ "KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQADcnVuAQAXKExqYXZhL2xhbmcvUnVubmFibGU7" +
+ "KVYBAApTb3VyY2VGaWxlAQAMVGVzdDk5Ni5qYXZhDAAJAAoHAB8MAA0ACgcAIAwAIQAiAQAZRG9p" +
+ "bmcgbm90aGluZyB0cmFuc2Zvcm1lZAcAIwwAJAAlBwAmDAAnAAoBABVhcnQvVGVzdDk5NiRUcmFu" +
+ "c2Zvcm0BAAlUcmFuc2Zvcm0BAAxJbm5lckNsYXNzZXMBABBqYXZhL2xhbmcvT2JqZWN0AQASamF2" +
+ "YS9sYW5nL1J1bm5hYmxlAQAQamF2YS9sYW5nL1N5c3RlbQEAA291dAEAFUxqYXZhL2lvL1ByaW50" +
+ "U3RyZWFtOwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmludGxuAQAVKExqYXZhL2xhbmcvU3Ry" +
+ "aW5nOylWAQALYXJ0L1Rlc3Q5OTYBAAlkb05vdGhpbmcAMQAHAAgAAAAAAAIAAQAJAAoAAQALAAAA" +
+ "HQABAAEAAAAFKrcAAbEAAAABAAwAAAAGAAEAAAAEAAEADQAOAAEACwAAADYAAgACAAAAEiu5AAIB" +
+ "ALIAAxIEtgAFuAAGsQAAAAEADAAAABIABAAAAAYABgAHAA4ACAARAAkAAgAPAAAAAgAQAB0AAAAK" +
+ "AAEABwAZABwAGQ==");
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQBzn3TiKGAiM0fubj25v816W0k+niqj+SQcBAAAcAAAAHhWNBIAAAAAAAAAAFgDAAAW" +
+ "AAAAcAAAAAoAAADIAAAAAwAAAPAAAAABAAAAFAEAAAYAAAAcAQAAAQAAAEwBAACwAgAAbAEAANoB" +
+ "AADiAQAA/QEAABYCAAAlAgAASQIAAGkCAACAAgAAlAIAAKoCAAC+AgAA0gIAAOACAADrAgAA7gIA" +
+ "APICAAD/AgAACgMAABADAAAVAwAAHgMAACMDAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAA" +
+ "CQAAAAoAAAANAAAADQAAAAkAAAAAAAAADgAAAAkAAADMAQAADgAAAAkAAADUAQAACAAEABIAAAAA" +
+ "AAAAAAAAAAAAAQAUAAAAAQAAABAAAAAEAAIAEwAAAAUAAAAAAAAABgAAABQAAAAAAAAAEQAAAAUA" +
+ "AAAAAAAACwAAALwBAABHAwAAAAAAAAIAAAA4AwAAPgMAAAEAAQABAAAAKgMAAAQAAABwEAQAAAAO" +
+ "AAQAAgACAAAALwMAAA4AAAByEAUAAwBiAAAAGgEBAG4gAwAQAHEAAgAAAA4AbAEAAAAAAAAAAAAA" +
+ "AAAAAAEAAAAGAAAAAQAAAAcABjxpbml0PgAZRG9pbmcgbm90aGluZyB0cmFuc2Zvcm1lZAAXTGFy" +
+ "dC9UZXN0OTk2JFRyYW5zZm9ybTsADUxhcnQvVGVzdDk5NjsAIkxkYWx2aWsvYW5ub3RhdGlvbi9F" +
+ "bmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAVTGphdmEvaW8v" +
+ "UHJpbnRTdHJlYW07ABJMamF2YS9sYW5nL09iamVjdDsAFExqYXZhL2xhbmcvUnVubmFibGU7ABJM" +
+ "amF2YS9sYW5nL1N0cmluZzsAEkxqYXZhL2xhbmcvU3lzdGVtOwAMVGVzdDk5Ni5qYXZhAAlUcmFu" +
+ "c2Zvcm0AAVYAAlZMAAthY2Nlc3NGbGFncwAJZG9Ob3RoaW5nAARuYW1lAANvdXQAB3ByaW50bG4A" +
+ "A3J1bgAFdmFsdWUABAAHDgAGAQAHDjx4PAACAgEVGAECAwIPBBkRFwwAAAEBAIGABPgCAQGQAwAA" +
+ "ABAAAAAAAAAAAQAAAAAAAAABAAAAFgAAAHAAAAACAAAACgAAAMgAAAADAAAAAwAAAPAAAAAEAAAA" +
+ "AQAAABQBAAAFAAAABgAAABwBAAAGAAAAAQAAAEwBAAADEAAAAQAAAGwBAAABIAAAAgAAAHgBAAAG" +
+ "IAAAAQAAALwBAAABEAAAAgAAAMwBAAACIAAAFgAAANoBAAADIAAAAgAAACoDAAAEIAAAAgAAADgD" +
+ "AAAAIAAAAQAAAEcDAAAAEAAAAQAAAFgDAAA=");
- public static void notifyBreakpointReached(Thread thr, Executable e, long loc) {
- int line = Breakpoint.locationToLine(e, loc);
- if (line == -1 && e.getName().equals("run") && e.getDeclaringClass().equals(Transform.class)) {
- // RI always reports line = -1 for obsolete methods. Just replace it with the real line for
- // consistency.
- line = TRANSFORM_BREAKPOINT_REDEFINED_LINE;
+ public static void notifyBreakpointReached(Thread thr, Executable e, long loc) {
+ int line = Breakpoint.locationToLine(e, loc);
+ if (line == -1 && e.getName().equals("run")
+ && e.getDeclaringClass().equals(Transform.class)) {
+ // RI always reports line = -1 for obsolete methods. Just replace it with the real line
+ // for consistency.
+ line = TRANSFORM_BREAKPOINT_REDEFINED_LINE;
+ }
+ System.out.println("Breakpoint reached: " + e + " @ line=" + line);
}
- System.out.println("Breakpoint reached: " + e + " @ line=" + line);
- }
- public static void run() throws Exception {
- // Set up breakpoints
- Breakpoint.stopBreakpointWatch(Thread.currentThread());
- Breakpoint.startBreakpointWatch(
- Test996.class,
- Test996.class.getDeclaredMethod(
- "notifyBreakpointReached", Thread.class, Executable.class, Long.TYPE),
- Thread.currentThread());
+ public static void run() throws Exception {
+ // Set up breakpoints
+ Breakpoint.stopBreakpointWatch(Thread.currentThread());
+ Breakpoint.startBreakpointWatch(
+ Test996.class,
+ Test996.class.getDeclaredMethod(
+ "notifyBreakpointReached", Thread.class, Executable.class, Long.TYPE),
+ Thread.currentThread());
- Transform t = new Transform();
- Method non_obsolete_run_method = Transform.class.getDeclaredMethod("run", Runnable.class);
- final long obsolete_breakpoint_location =
- Breakpoint.lineToLocation(non_obsolete_run_method, TRANSFORM_BREAKPOINT_REDEFINED_LINE);
+ Transform t = new Transform();
+ Method non_obsolete_run_method = Transform.class.getDeclaredMethod("run", Runnable.class);
+ final long obsolete_breakpoint_location = Breakpoint.lineToLocation(
+ non_obsolete_run_method, TRANSFORM_BREAKPOINT_REDEFINED_LINE);
- System.out.println("Initially setting breakpoint to line " + TRANSFORM_BREAKPOINT_INITIAL_LINE);
- long initial_breakpoint_location =
- Breakpoint.lineToLocation(non_obsolete_run_method, TRANSFORM_BREAKPOINT_INITIAL_LINE);
- Breakpoint.setBreakpoint(non_obsolete_run_method, initial_breakpoint_location);
+ System.out.println(
+ "Initially setting breakpoint to line " + TRANSFORM_BREAKPOINT_INITIAL_LINE);
+ long initial_breakpoint_location = Breakpoint.lineToLocation(
+ non_obsolete_run_method, TRANSFORM_BREAKPOINT_INITIAL_LINE);
+ Breakpoint.setBreakpoint(non_obsolete_run_method, initial_breakpoint_location);
- System.out.println("Running transform without redefinition.");
- t.run(() -> {});
+ System.out.println("Running transform without redefinition.");
+ t.run(() -> {});
- System.out.println("Running transform with redefinition.");
- t.run(() -> {
- System.out.println("Redefining calling function!");
- // This should clear the breakpoint set to TRANSFORM_BREAKPOINT_INITIAL_LINE
- Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
- System.out.println("Setting breakpoint on now obsolete method to line " +
- TRANSFORM_BREAKPOINT_REDEFINED_LINE);
- setBreakpointOnObsoleteMethod(obsolete_breakpoint_location);
- });
- System.out.println("Running transform post redefinition. Should not hit any breakpoints.");
- t.run(() -> {});
+ System.out.println("Running transform with redefinition.");
+ t.run(() -> {
+ System.out.println("Redefining calling function!");
+ // This should clear the breakpoint set to TRANSFORM_BREAKPOINT_INITIAL_LINE
+ Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
+ System.out.println("Setting breakpoint on now obsolete method to line " +
+ TRANSFORM_BREAKPOINT_REDEFINED_LINE);
+ setBreakpointOnObsoleteMethod(obsolete_breakpoint_location);
+ });
+ System.out.println("Running transform post redefinition. Should not hit any breakpoints.");
+ t.run(() -> {});
- System.out.println("Setting initial breakpoint on redefined method.");
- long final_breakpoint_location =
- Breakpoint.lineToLocation(non_obsolete_run_method,
- TRANSFORM_BREAKPOINT_POST_REDEFINITION_LINE);
- Breakpoint.setBreakpoint(non_obsolete_run_method, final_breakpoint_location);
- t.run(() -> {});
+ System.out.println("Setting initial breakpoint on redefined method.");
+ long final_breakpoint_location = Breakpoint.lineToLocation(
+ non_obsolete_run_method, TRANSFORM_BREAKPOINT_POST_REDEFINITION_LINE);
+ Breakpoint.setBreakpoint(non_obsolete_run_method, final_breakpoint_location);
+ t.run(() -> {});
- Breakpoint.stopBreakpointWatch(Thread.currentThread());
- }
+ Breakpoint.stopBreakpointWatch(Thread.currentThread());
+ }
- public static native void setBreakpointOnObsoleteMethod(long location);
+ public static native void setBreakpointOnObsoleteMethod(long location);
}
diff --git a/test/997-single-step/src/Main.java b/test/997-single-step/src/Main.java
index 1927f04..a3e911d 100644
--- a/test/997-single-step/src/Main.java
+++ b/test/997-single-step/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test997.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test997.run();
+ }
}
diff --git a/test/997-single-step/src/art/Test997.java b/test/997-single-step/src/art/Test997.java
index a7a522d..88fbb87 100644
--- a/test/997-single-step/src/art/Test997.java
+++ b/test/997-single-step/src/art/Test997.java
@@ -21,62 +21,63 @@
import java.lang.reflect.Method;
public class Test997 {
- static final int NO_LAST_LINE_NUMBER = -1;
- static int LAST_LINE_NUMBER = NO_LAST_LINE_NUMBER;
- static Method DO_MULTIPATH_METHOD;
+ static final int NO_LAST_LINE_NUMBER = -1;
+ static int LAST_LINE_NUMBER = NO_LAST_LINE_NUMBER;
+ static Method DO_MULTIPATH_METHOD;
- static {
- try {
- DO_MULTIPATH_METHOD = Test997.class.getDeclaredMethod("doMultiPath", Boolean.TYPE);
- } catch (Exception e) {
- throw new Error("could not find method doMultiPath", e);
- }
- }
-
- // Function that acts simply to ensure there are multiple lines.
- public static void doNothing() {}
-
- // Method with multiple paths we can break on.
- public static void doMultiPath(boolean bit) {
- doNothing();
- if (bit) {
- doNothing();
- } else {
- doNothing();
- }
- doNothing();
- }
-
- public static void notifySingleStep(Thread thr, Executable e, long loc) {
- if (!e.equals(DO_MULTIPATH_METHOD)) {
- // Only report steps in doMultiPath
- return;
- }
- int cur_line = Breakpoint.locationToLine(e, loc);
- // Only report anything when the line number changes. This is so we can run this test against
- // both the RI and ART and also to prevent front-end compiler changes from affecting output.
- if (LAST_LINE_NUMBER == NO_LAST_LINE_NUMBER || LAST_LINE_NUMBER != cur_line) {
- LAST_LINE_NUMBER = cur_line;
- System.out.println("Single step: " + e + " @ line=" + cur_line);
- }
- }
-
- public static void resetTest() {
- LAST_LINE_NUMBER = NO_LAST_LINE_NUMBER;
- }
-
- public static void run() throws Exception {
- boolean[] values = new boolean[] { true, false };
- Trace.enableSingleStepTracing(Test997.class,
- Test997.class.getDeclaredMethod(
- "notifySingleStep", Thread.class, Executable.class, Long.TYPE),
- Thread.currentThread());
- for (boolean arg : values) {
- System.out.println("Stepping through doMultiPath(" + arg + ")");
- resetTest();
- doMultiPath(arg);
+ static {
+ try {
+ DO_MULTIPATH_METHOD = Test997.class.getDeclaredMethod("doMultiPath", Boolean.TYPE);
+ } catch (Exception e) {
+ throw new Error("could not find method doMultiPath", e);
+ }
}
- Trace.disableTracing(Thread.currentThread());
- }
+ // Function that acts simply to ensure there are multiple lines.
+ public static void doNothing() {}
+
+ // Method with multiple paths we can break on.
+ public static void doMultiPath(boolean bit) {
+ doNothing();
+ if (bit) {
+ doNothing();
+ } else {
+ doNothing();
+ }
+ doNothing();
+ }
+
+ public static void notifySingleStep(Thread thr, Executable e, long loc) {
+ if (!e.equals(DO_MULTIPATH_METHOD)) {
+ // Only report steps in doMultiPath
+ return;
+ }
+ int cur_line = Breakpoint.locationToLine(e, loc);
+ // Only report anything when the line number changes. This is so we can run this test
+ // against both the RI and ART and also to prevent front-end compiler changes from
+ // affecting output.
+ if (LAST_LINE_NUMBER == NO_LAST_LINE_NUMBER || LAST_LINE_NUMBER != cur_line) {
+ LAST_LINE_NUMBER = cur_line;
+ System.out.println("Single step: " + e + " @ line=" + cur_line);
+ }
+ }
+
+ public static void resetTest() {
+ LAST_LINE_NUMBER = NO_LAST_LINE_NUMBER;
+ }
+
+ public static void run() throws Exception {
+ boolean[] values = new boolean[] { true, false };
+ Trace.enableSingleStepTracing(Test997.class,
+ Test997.class.getDeclaredMethod(
+ "notifySingleStep", Thread.class, Executable.class, Long.TYPE),
+ Thread.currentThread());
+ for (boolean arg : values) {
+ System.out.println("Stepping through doMultiPath(" + arg + ")");
+ resetTest();
+ doMultiPath(arg);
+ }
+
+ Trace.disableTracing(Thread.currentThread());
+ }
}
diff --git a/test/998-redefine-use-after-free/src-ex/DexCacheSmash.java b/test/998-redefine-use-after-free/src-ex/DexCacheSmash.java
index 2193a63..349b73e 100644
--- a/test/998-redefine-use-after-free/src-ex/DexCacheSmash.java
+++ b/test/998-redefine-use-after-free/src-ex/DexCacheSmash.java
@@ -18,26 +18,24 @@
import java.util.Base64;
public class DexCacheSmash {
- static class Transform {
- public void foo() {}
- public void bar() {}
- public String getId() {
- return "TRANSFORM_INITIAL";
+ static class Transform {
+ public void foo() {}
+ public void bar() {}
+ public String getId() {
+ return "TRANSFORM_INITIAL";
+ }
}
- }
- static class Transform2 {
- public String getId() {
- return "TRANSFORM2_INITIAL";
+ static class Transform2 {
+ public String getId() {
+ return "TRANSFORM2_INITIAL";
+ }
}
- }
- /**
- * A base64 encoding of the dex/class file of the Transform class above.
- */
- static final Redefinition.CommonClassDefinition TRANSFORM_INITIAL =
- new Redefinition.CommonClassDefinition(Transform.class,
- Base64.getDecoder().decode(
+ /**
+ * A base64 encoding of the dex/class file of the Transform class above.
+ */
+ static final byte[] TRANSFORM_INITIAL_CLASS_FILE_BYTES = Base64.getDecoder().decode(
"yv66vgAAADQAFwoABAAPCAAQBwASBwAVAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1i" +
"ZXJUYWJsZQEAA2ZvbwEAA2JhcgEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3Vy" +
"Y2VGaWxlAQASRGV4Q2FjaGVTbWFzaC5qYXZhDAAFAAYBABFUUkFOU0ZPUk1fSU5JVElBTAcAFgEA" +
@@ -46,8 +44,8 @@
"AAEAAAAFKrcAAbEAAAABAAgAAAAGAAEAAAATAAEACQAGAAEABwAAABkAAAABAAAAAbEAAAABAAgA" +
"AAAGAAEAAAAUAAEACgAGAAEABwAAABkAAAABAAAAAbEAAAABAAgAAAAGAAEAAAAVAAEACwAMAAEA" +
"BwAAABsAAQABAAAAAxICsAAAAAEACAAAAAYAAQAAABcAAgANAAAAAgAOABQAAAAKAAEAAwARABMA" +
- "CA=="),
- Base64.getDecoder().decode(
+ "CA==");
+ static final byte[] TRANSFORM_INITIAL_DEX_FILE_BYTES = Base64.getDecoder().decode(
"ZGV4CjAzNQDhg9CfghG1SRlLClguRuFYsqihr4F7NsGQAwAAcAAAAHhWNBIAAAAAAAAAAOQCAAAS" +
"AAAAcAAAAAcAAAC4AAAAAgAAANQAAAAAAAAAAAAAAAUAAADsAAAAAQAAABQBAABcAgAANAEAAKgB" +
"AACwAQAAxAEAAMcBAADiAQAA8wEAABcCAAA3AgAASwIAAF8CAAByAgAAfQIAAIACAACNAgAAkgIA" +
@@ -63,59 +61,60 @@
"AAcOABUABw4AFAAHDgAXAAcOAAICAREYAQIDAgwECBAXCgAAAQMAgIAEwAIBAdgCAQHsAgEBgAMO" +
"AAAAAAAAAAEAAAAAAAAAAQAAABIAAABwAAAAAgAAAAcAAAC4AAAAAwAAAAIAAADUAAAABQAAAAUA" +
"AADsAAAABgAAAAEAAAAUAQAAAxAAAAEAAAA0AQAAASAAAAQAAABAAQAABiAAAAEAAACYAQAAAiAA" +
- "ABIAAACoAQAAAyAAAAQAAACrAgAABCAAAAIAAAC/AgAAACAAAAEAAADOAgAAABAAAAEAAADkAgAA"));
+ "ABIAAACoAQAAAyAAAAQAAACrAgAABCAAAAIAAAC/AgAAACAAAAEAAADOAgAAABAAAAEAAADkAgAA");
+ static final Redefinition.CommonClassDefinition TRANSFORM_INITIAL =
+ new Redefinition.CommonClassDefinition(Transform.class,
+ TRANSFORM_INITIAL_CLASS_FILE_BYTES, TRANSFORM_INITIAL_DEX_FILE_BYTES);
- /**
- * A base64 encoding of the following (invalid) class.
- *
- * .class LDexCacheSmash$Transform2;
- * .super Ljava/lang/Object;
- * .source "DexCacheSmash.java"
- *
- * # annotations
- * .annotation system Ldalvik/annotation/EnclosingClass;
- * value = LDexCacheSmash;
- * .end annotation
- *
- * .annotation system Ldalvik/annotation/InnerClass;
- * accessFlags = 0x8
- * name = "Transform2"
- * .end annotation
- *
- *
- * # direct methods
- * .method constructor <init>()V
- * .registers 1
- *
- * .prologue
- * .line 26
- * invoke-direct {p0}, Ljava/lang/Object;-><init>()V
- *
- * return-void
- * .end method
- *
- *
- * # virtual methods
- * .method public getId()Ljava/lang/String;
- * .registers 2
- *
- * .prologue
- * .line 28
- * # NB Fails verification due to this function not returning a String.
- * return-void
- * .end method
- */
- static final Redefinition.CommonClassDefinition TRANSFORM2_INVALID =
- new Redefinition.CommonClassDefinition(Transform2.class,
- Base64.getDecoder().decode(
+ /**
+ * A base64 encoding of the following (invalid) class.
+ *
+ * .class LDexCacheSmash$Transform2;
+ * .super Ljava/lang/Object;
+ * .source "DexCacheSmash.java"
+ *
+ * # annotations
+ * .annotation system Ldalvik/annotation/EnclosingClass;
+ * value = LDexCacheSmash;
+ * .end annotation
+ *
+ * .annotation system Ldalvik/annotation/InnerClass;
+ * accessFlags = 0x8
+ * name = "Transform2"
+ * .end annotation
+ *
+ *
+ * # direct methods
+ * .method constructor <init>()V
+ * .registers 1
+ *
+ * .prologue
+ * .line 26
+ * invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+ *
+ * return-void
+ * .end method
+ *
+ *
+ * # virtual methods
+ * .method public getId()Ljava/lang/String;
+ * .registers 2
+ *
+ * .prologue
+ * .line 28
+ * # NB Fails verification due to this function not returning a String.
+ * return-void
+ * .end method
+ */
+ static final byte[] TRANSFORM2_INVALID_CLASS_FILE_BYTES = Base64.getDecoder().decode(
"yv66vgAAADQAEwcAEgcAEQEABjxpbml0PgEAAygpVgEABENvZGUKAAIAEAEAD0xpbmVOdW1iZXJU" +
"YWJsZQEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQASRGV4Q2Fj" +
"aGVTbWFzaC5qYXZhAQAMSW5uZXJDbGFzc2VzBwAPAQAKVHJhbnNmb3JtMgEADURleENhY2hlU21h" +
"c2gMAAMABAEAEGphdmEvbGFuZy9PYmplY3QBABhEZXhDYWNoZVNtYXNoJFRyYW5zZm9ybTIAIAAB" +
"AAIAAAAAAAIAAAADAAQAAQAFAAAAHQABAAEAAAAFKrcABrEAAAABAAcAAAAGAAEAAAAaAAEACAAJ" +
"AAEABQAAABkAAQABAAAAAbEAAAABAAcAAAAGAAEAAAAcAAIACgAAAAIACwAMAAAACgABAAEADQAO" +
- "AAg="),
- Base64.getDecoder().decode(
+ "AAg=");
+ static final byte[] TRANSFORM2_INVALID_DEX_FILE_BYTES = Base64.getDecoder().decode(
"ZGV4CjAzNQCFcegr6Ns+I7iEF4uLRkUX4yGrLhP6soEgAwAAcAAAAHhWNBIAAAAAAAAAAHQCAAAP" +
"AAAAcAAAAAcAAACsAAAAAgAAAMgAAAAAAAAAAAAAAAMAAADgAAAAAQAAAPgAAAAIAgAAGAEAABgB" +
"AAAgAQAANAEAADcBAABTAQAAZAEAAIgBAACoAQAAvAEAANABAADcAQAA3wEAAOwBAADzAQAA+QEA" +
@@ -130,26 +129,31 @@
"BA4AAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAABwAAAKwAAAADAAAAAgAAAMgAAAAFAAAA" +
"AwAAAOAAAAAGAAAAAQAAAPgAAAACIAAADwAAABgBAAAEIAAAAgAAAAACAAADEAAAAgAAABACAAAG" +
"IAAAAQAAACACAAADIAAAAgAAADACAAABIAAAAgAAADwCAAAAIAAAAQAAAGYCAAAAEAAAAQAAAHQC" +
- "AAA="));
+ "AAA=");
+ static final Redefinition.CommonClassDefinition TRANSFORM2_INVALID =
+ new Redefinition.CommonClassDefinition(Transform2.class,
+ TRANSFORM2_INVALID_CLASS_FILE_BYTES, TRANSFORM2_INVALID_DEX_FILE_BYTES);
- public static void run() throws Exception {
- try {
- Redefinition.doMultiClassRedefinition(TRANSFORM2_INVALID);
- } catch (Exception e) {
- if (!e.getMessage().endsWith("JVMTI_ERROR_FAILS_VERIFICATION")) {
- throw new Error(
- "Unexpected error: Expected failure due to JVMTI_ERROR_FAILS_VERIFICATION", e);
- }
+ public static void run() throws Exception {
+ try {
+ Redefinition.doMultiClassRedefinition(TRANSFORM2_INVALID);
+ } catch (Exception e) {
+ if (!e.getMessage().endsWith("JVMTI_ERROR_FAILS_VERIFICATION")) {
+ throw new Error(
+ "Unexpected error: Expected failure due to JVMTI_ERROR_FAILS_VERIFICATION",
+ e);
+ }
+ }
+ // Doing this redefinition after a redefinition that failed due to FAILS_VERIFICATION could
+ // cause a use-after-free of the Transform2's DexCache by the redefinition code if it
+ // happens that the native pointer of the art::DexFile created for the Transform
+ // redefinition aliases the one created for Transform2's failed redefinition.
+ //
+ // Due to the order of checks performed by the redefinition code FAILS_VERIFICATION is the
+ // only failure mode that can cause Use-after-frees in this way.
+ //
+ // This should never throw any exceptions (except perhaps OOME in very strange
+ // circumstances).
+ Redefinition.doMultiClassRedefinition(TRANSFORM_INITIAL);
}
- // Doing this redefinition after a redefinition that failed due to FAILS_VERIFICATION could
- // cause a use-after-free of the Transform2's DexCache by the redefinition code if it happens
- // that the native pointer of the art::DexFile created for the Transform redefinition aliases
- // the one created for Transform2's failed redefinition.
- //
- // Due to the order of checks performed by the redefinition code FAILS_VERIFICATION is the only
- // failure mode that can cause Use-after-frees in this way.
- //
- // This should never throw any exceptions (except perhaps OOME in very strange circumstances).
- Redefinition.doMultiClassRedefinition(TRANSFORM_INITIAL);
- }
}
diff --git a/test/998-redefine-use-after-free/src-ex/art/Redefinition.java b/test/998-redefine-use-after-free/src-ex/art/Redefinition.java
index 56d2938..7b37afd 100644
--- a/test/998-redefine-use-after-free/src-ex/art/Redefinition.java
+++ b/test/998-redefine-use-after-free/src-ex/art/Redefinition.java
@@ -19,73 +19,69 @@
import java.util.ArrayList;
// Common Redefinition functions. Placed here for use by CTS
public class Redefinition {
- public static final class CommonClassDefinition {
- public final Class<?> target;
- public final byte[] class_file_bytes;
- public final byte[] dex_file_bytes;
+ public static final class CommonClassDefinition {
+ public final Class<?> target;
+ public final byte[] class_file_bytes;
+ public final byte[] dex_file_bytes;
- public CommonClassDefinition(Class<?> target, byte[] class_file_bytes, byte[] dex_file_bytes) {
- this.target = target;
- this.class_file_bytes = class_file_bytes;
- this.dex_file_bytes = dex_file_bytes;
+ public CommonClassDefinition(
+ Class<?> target, byte[] class_file_bytes, byte[] dex_file_bytes) {
+ this.target = target;
+ this.class_file_bytes = class_file_bytes;
+ this.dex_file_bytes = dex_file_bytes;
+ }
}
- }
- // A set of possible test configurations. Test should set this if they need to.
- // This must be kept in sync with the defines in ti-agent/common_helper.cc
- public static enum Config {
- COMMON_REDEFINE(0),
- COMMON_RETRANSFORM(1),
- COMMON_TRANSFORM(2);
+ // A set of possible test configurations. Test should set this if they need to.
+ // This must be kept in sync with the defines in ti-agent/common_helper.cc
+ public static enum Config {
+ COMMON_REDEFINE(0),
+ COMMON_RETRANSFORM(1),
+ COMMON_TRANSFORM(2);
- private final int val;
- private Config(int val) {
- this.val = val;
+ private final int val;
+ private Config(int val) {
+ this.val = val;
+ }
}
- }
- public static void setTestConfiguration(Config type) {
- nativeSetTestConfiguration(type.val);
- }
-
- private static native void nativeSetTestConfiguration(int type);
-
- // Transforms the class
- public static native void doCommonClassRedefinition(Class<?> target,
- byte[] classfile,
- byte[] dexfile);
-
- public static void doMultiClassRedefinition(CommonClassDefinition... defs) {
- ArrayList<Class<?>> classes = new ArrayList<>();
- ArrayList<byte[]> class_files = new ArrayList<>();
- ArrayList<byte[]> dex_files = new ArrayList<>();
-
- for (CommonClassDefinition d : defs) {
- classes.add(d.target);
- class_files.add(d.class_file_bytes);
- dex_files.add(d.dex_file_bytes);
+ public static void setTestConfiguration(Config type) {
+ nativeSetTestConfiguration(type.val);
}
- doCommonMultiClassRedefinition(classes.toArray(new Class<?>[0]),
- class_files.toArray(new byte[0][]),
- dex_files.toArray(new byte[0][]));
- }
- public static void addMultiTransformationResults(CommonClassDefinition... defs) {
- for (CommonClassDefinition d : defs) {
- addCommonTransformationResult(d.target.getCanonicalName(),
- d.class_file_bytes,
- d.dex_file_bytes);
+ private static native void nativeSetTestConfiguration(int type);
+
+ // Transforms the class
+ public static native void doCommonClassRedefinition(
+ Class<?> target, byte[] classfile, byte[] dexfile);
+
+ public static void doMultiClassRedefinition(CommonClassDefinition... defs) {
+ ArrayList<Class<?>> classes = new ArrayList<>();
+ ArrayList<byte[]> class_files = new ArrayList<>();
+ ArrayList<byte[]> dex_files = new ArrayList<>();
+
+ for (CommonClassDefinition d : defs) {
+ classes.add(d.target);
+ class_files.add(d.class_file_bytes);
+ dex_files.add(d.dex_file_bytes);
+ }
+ doCommonMultiClassRedefinition(classes.toArray(new Class<?>[0]),
+ class_files.toArray(new byte[0][]), dex_files.toArray(new byte[0][]));
}
- }
- public static native void doCommonMultiClassRedefinition(Class<?>[] targets,
- byte[][] classfiles,
- byte[][] dexfiles);
- public static native void doCommonClassRetransformation(Class<?>... target);
- public static native void setPopRetransformations(boolean pop);
- public static native void popTransformationFor(String name);
- public static native void enableCommonRetransformation(boolean enable);
- public static native void addCommonTransformationResult(String target_name,
- byte[] class_bytes,
- byte[] dex_bytes);
+ public static void addMultiTransformationResults(CommonClassDefinition... defs) {
+ for (CommonClassDefinition d : defs) {
+ addCommonTransformationResult(
+ d.target.getCanonicalName(), d.class_file_bytes, d.dex_file_bytes);
+ }
+ }
+
+ public static native void doCommonMultiClassRedefinition(
+ Class<?>[] targets, byte[][] classfiles, byte[][] dexfiles);
+ public static native void doCommonClassRetransformation(Class<?>... target);
+ public static native void setPopRetransformations(boolean pop);
+ public static native void popTransformationFor(String name);
+ public static native void enableCommonRetransformation(boolean enable);
+ public static native void addCommonTransformationResult(
+ String target_name, byte[] class_bytes, byte[] dex_bytes);
}
diff --git a/test/998-redefine-use-after-free/src/Main.java b/test/998-redefine-use-after-free/src/Main.java
index cd3babf..fcc759f 100644
--- a/test/998-redefine-use-after-free/src/Main.java
+++ b/test/998-redefine-use-after-free/src/Main.java
@@ -17,38 +17,39 @@
import java.lang.reflect.*;
public class Main {
- public static final String TEST_NAME = "998-redefine-use-after-free";
- public static final int REPS = 1000;
- public static final int STEP = 100;
+ public static final String TEST_NAME = "998-redefine-use-after-free";
+ public static final int REPS = 1000;
+ public static final int STEP = 100;
- public static void main(String[] args) throws Exception {
- for (int i = 0; i < REPS; i += STEP) {
- runSeveralTimes(STEP);
+ public static void main(String[] args) throws Exception {
+ for (int i = 0; i < REPS; i += STEP) {
+ runSeveralTimes(STEP);
+ }
}
- }
- public static ClassLoader getClassLoaderFor(String location) throws Exception {
- try {
- Class<?> class_loader_class = Class.forName("dalvik.system.PathClassLoader");
- Constructor<?> ctor = class_loader_class.getConstructor(String.class, ClassLoader.class);
- return (ClassLoader)ctor.newInstance(location + "/" + TEST_NAME + "-ex.jar",
- Main.class.getClassLoader());
- } catch (ClassNotFoundException e) {
- // Running on RI. Use URLClassLoader.
- return new java.net.URLClassLoader(
- new java.net.URL[] { new java.net.URL("file://" + location + "/classes-ex/") });
+ public static ClassLoader getClassLoaderFor(String location) throws Exception {
+ try {
+ Class<?> class_loader_class = Class.forName("dalvik.system.PathClassLoader");
+ Constructor<?> ctor =
+ class_loader_class.getConstructor(String.class, ClassLoader.class);
+ return (ClassLoader) ctor.newInstance(
+ location + "/" + TEST_NAME + "-ex.jar", Main.class.getClassLoader());
+ } catch (ClassNotFoundException e) {
+ // Running on RI. Use URLClassLoader.
+ return new java.net.URLClassLoader(
+ new java.net.URL[] { new java.net.URL("file://" + location + "/classes-ex/") });
+ }
}
- }
- // Run the redefinition several times on a single class-loader to try to trigger the
- // Use-after-free bug b/62237378
- public static void runSeveralTimes(int times) throws Exception {
- ClassLoader c = getClassLoaderFor(System.getenv("DEX_LOCATION"));
+ // Run the redefinition several times on a single class-loader to try to trigger the
+ // Use-after-free bug b/62237378
+ public static void runSeveralTimes(int times) throws Exception {
+ ClassLoader c = getClassLoaderFor(System.getenv("DEX_LOCATION"));
- Class<?> klass = (Class<?>)c.loadClass("DexCacheSmash");
- Method m = klass.getDeclaredMethod("run");
- for (int i = 0 ; i < times; i++) {
- m.invoke(null);
+ Class<?> klass = (Class<?>) c.loadClass("DexCacheSmash");
+ Method m = klass.getDeclaredMethod("run");
+ for (int i = 0; i < times; i++) {
+ m.invoke(null);
+ }
}
- }
}
diff --git a/test/999-redefine-hiddenapi/src-ex/Test999.java b/test/999-redefine-hiddenapi/src-ex/Test999.java
index 97495c5..d82619f 100644
--- a/test/999-redefine-hiddenapi/src-ex/Test999.java
+++ b/test/999-redefine-hiddenapi/src-ex/Test999.java
@@ -17,9 +17,9 @@
package art;
public class Test999 {
- public void foo() {
- System.out.println("hello");
- }
+ public void foo() {
+ System.out.println("hello");
+ }
- public int bar = 42;
+ public int bar = 42;
}
diff --git a/test/999-redefine-hiddenapi/src-redefine/art/Test999.java b/test/999-redefine-hiddenapi/src-redefine/art/Test999.java
index c1b838c..3bdb2b6 100644
--- a/test/999-redefine-hiddenapi/src-redefine/art/Test999.java
+++ b/test/999-redefine-hiddenapi/src-redefine/art/Test999.java
@@ -17,9 +17,9 @@
package art;
public class Test999 {
- public void foo() {
- System.out.println("Goodbye");
- }
+ public void foo() {
+ System.out.println("Goodbye");
+ }
- public int bar = 64;
+ public int bar = 64;
}
diff --git a/test/999-redefine-hiddenapi/src/Main.java b/test/999-redefine-hiddenapi/src/Main.java
index 014ea16..70dc006 100644
--- a/test/999-redefine-hiddenapi/src/Main.java
+++ b/test/999-redefine-hiddenapi/src/Main.java
@@ -19,92 +19,92 @@
import java.util.Base64;
public class Main {
- public static void main(String[] args) throws ClassNotFoundException {
- System.loadLibrary(args[0]);
+ public static void main(String[] args) throws ClassNotFoundException {
+ System.loadLibrary(args[0]);
- // Run the initialization routine. This will enable hidden API checks in
- // the runtime, in case they are not enabled by default.
- init();
+ // Run the initialization routine. This will enable hidden API checks in
+ // the runtime, in case they are not enabled by default.
+ init();
- // Load the '-ex' APK and attach it to the boot class path.
- appendToBootClassLoader(DEX_EXTRA, /* isCorePlatform */ false);
+ // Load the '-ex' APK and attach it to the boot class path.
+ appendToBootClassLoader(DEX_EXTRA, /* isCorePlatform */ false);
- // Find the test class in boot class loader and verify that its members are hidden.
- Class<?> klass = Class.forName("art.Test999", true, BOOT_CLASS_LOADER);
- assertFieldIsHidden(klass, "before redefinition");
- assertMethodIsHidden(klass, "before redefinition");
+ // Find the test class in boot class loader and verify that its members are hidden.
+ Class<?> klass = Class.forName("art.Test999", true, BOOT_CLASS_LOADER);
+ assertFieldIsHidden(klass, "before redefinition");
+ assertMethodIsHidden(klass, "before redefinition");
- // Redefine the class using JVMTI. Use dex file without hiddenapi flags.
- art.Redefinition.setTestConfiguration(art.Redefinition.Config.COMMON_REDEFINE);
- art.Redefinition.doCommonClassRedefinition(klass, CLASS_BYTES, DEX_BYTES);
+ // Redefine the class using JVMTI. Use dex file without hiddenapi flags.
+ art.Redefinition.setTestConfiguration(art.Redefinition.Config.COMMON_REDEFINE);
+ art.Redefinition.doCommonClassRedefinition(klass, CLASS_BYTES, DEX_BYTES);
- // Verify that the class members are still hidden.
- assertFieldIsHidden(klass, "after first redefinition");
- assertMethodIsHidden(klass, "after first redefinition");
- }
-
- private static void assertMethodIsHidden(Class<?> klass, String msg) {
- try {
- klass.getDeclaredMethod("foo");
- // Unexpected. Should have thrown NoSuchMethodException.
- throw new RuntimeException("Method should not be accessible " + msg);
- } catch (NoSuchMethodException ex) {
+ // Verify that the class members are still hidden.
+ assertFieldIsHidden(klass, "after first redefinition");
+ assertMethodIsHidden(klass, "after first redefinition");
}
- }
- private static void assertFieldIsHidden(Class<?> klass, String msg) {
- try {
- klass.getDeclaredField("bar");
- // Unexpected. Should have thrown NoSuchFieldException.
- throw new RuntimeException("Field should not be accessible " + msg);
- } catch (NoSuchFieldException ex) {
+ private static void assertMethodIsHidden(Class<?> klass, String msg) {
+ try {
+ klass.getDeclaredMethod("foo");
+ // Unexpected. Should have thrown NoSuchMethodException.
+ throw new RuntimeException("Method should not be accessible " + msg);
+ } catch (NoSuchMethodException ex) {
+ }
}
- }
- private static final String DEX_EXTRA =
- new File(System.getenv("DEX_LOCATION"), "999-redefine-hiddenapi-ex.jar").getAbsolutePath();
+ private static void assertFieldIsHidden(Class<?> klass, String msg) {
+ try {
+ klass.getDeclaredField("bar");
+ // Unexpected. Should have thrown NoSuchFieldException.
+ throw new RuntimeException("Field should not be accessible " + msg);
+ } catch (NoSuchFieldException ex) {
+ }
+ }
- private static ClassLoader BOOT_CLASS_LOADER = Object.class.getClassLoader();
+ private static final String DEX_EXTRA = new File(
+ System.getenv("DEX_LOCATION"), "999-redefine-hiddenapi-ex.jar").getAbsolutePath();
- // Native functions. Note that these are implemented in 674-hiddenapi/hiddenapi.cc.
- private static native void appendToBootClassLoader(String dexPath, boolean isCorePlatform);
- private static native void init();
+ private static ClassLoader BOOT_CLASS_LOADER = Object.class.getClassLoader();
- /**
- * base64 encoded class/dex file for
- *
- * public class Test999 {
- * public void foo() {
- * System.out.println("Goodbye");
- * }
- *
- * public int bar = 64;
- * }
- */
- private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
- "yv66vgAAADUAIAoABwARCQAGABIJABMAFAgAFQoAFgAXBwAYBwAZAQADYmFyAQABSQEABjxpbml0" +
- "PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAANmb28BAApTb3VyY2VGaWxlAQAMVGVz" +
- "dDk5OS5qYXZhDAAKAAsMAAgACQcAGgwAGwAcAQAHR29vZGJ5ZQcAHQwAHgAfAQALYXJ0L1Rlc3Q5" +
- "OTkBABBqYXZhL2xhbmcvT2JqZWN0AQAQamF2YS9sYW5nL1N5c3RlbQEAA291dAEAFUxqYXZhL2lv" +
- "L1ByaW50U3RyZWFtOwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmludGxuAQAVKExqYXZhL2xh" +
- "bmcvU3RyaW5nOylWACEABgAHAAAAAQABAAgACQAAAAIAAQAKAAsAAQAMAAAAJwACAAEAAAALKrcA" +
- "ASoQQLUAArEAAAABAA0AAAAKAAIAAAATAAQAGAABAA4ACwABAAwAAAAlAAIAAQAAAAmyAAMSBLYA" +
- "BbEAAAABAA0AAAAKAAIAAAAVAAgAFgABAA8AAAACABA=");
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
- "ZGV4CjAzNQDlfmgFfKulToQpDF+P4dsgeOkgfzzH+5lgAwAAcAAAAHhWNBIAAAAAAAAAALQCAAAQ" +
- "AAAAcAAAAAcAAACwAAAAAgAAAMwAAAACAAAA5AAAAAQAAAD0AAAAAQAAABQBAAAsAgAANAEAAIYB" +
- "AACOAQAAlwEAAJoBAACpAQAAwAEAANQBAADoAQAA/AEAAAoCAAANAgAAEQIAABYCAAAbAgAAIAIA" +
- "ACkCAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAJAAAACQAAAAYAAAAAAAAACgAAAAYAAACAAQAA" +
- "AQAAAAsAAAAFAAIADQAAAAEAAAAAAAAAAQAAAAwAAAACAAEADgAAAAMAAAAAAAAAAQAAAAEAAAAD" +
- "AAAAAAAAAAgAAAAAAAAAoAIAAAAAAAACAAEAAQAAAHQBAAAIAAAAcBADAAEAEwBAAFkQAAAOAAMA" +
- "AQACAAAAeQEAAAgAAABiAAEAGgEBAG4gAgAQAA4AEwAOQAAVAA54AAAAAQAAAAQABjxpbml0PgAH" +
- "R29vZGJ5ZQABSQANTGFydC9UZXN0OTk5OwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABJMamF2YS9s" +
- "YW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07AAxUZXN0" +
- "OTk5LmphdmEAAVYAAlZMAANiYXIAA2ZvbwADb3V0AAdwcmludGxuAHV+fkQ4eyJjb21waWxhdGlv" +
- "bi1tb2RlIjoiZGVidWciLCJtaW4tYXBpIjoxLCJzaGEtMSI6ImQyMmFiNGYxOWI3NTYxNDQ3NTI4" +
- "NTdjYTg2YjJjZWU0ZGQ5Y2ExNjYiLCJ2ZXJzaW9uIjoiMS40LjktZGV2In0AAAEBAQABAIGABLQC" +
- "AQHUAgAAAAAOAAAAAAAAAAEAAAAAAAAAAQAAABAAAABwAAAAAgAAAAcAAACwAAAAAwAAAAIAAADM" +
- "AAAABAAAAAIAAADkAAAABQAAAAQAAAD0AAAABgAAAAEAAAAUAQAAASAAAAIAAAA0AQAAAyAAAAIA" +
- "AAB0AQAAARAAAAEAAACAAQAAAiAAABAAAACGAQAAACAAAAEAAACgAgAAAxAAAAEAAACwAgAAABAA" +
- "AAEAAAC0AgAA");
+ // Native functions. Note that these are implemented in 674-hiddenapi/hiddenapi.cc.
+ private static native void appendToBootClassLoader(String dexPath, boolean isCorePlatform);
+ private static native void init();
+
+ /**
+ * base64 encoded class/dex file for
+ *
+ * public class Test999 {
+ * public void foo() {
+ * System.out.println("Goodbye");
+ * }
+ *
+ * public int bar = 64;
+ * }
+ */
+ private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
+ "yv66vgAAADUAIAoABwARCQAGABIJABMAFAgAFQoAFgAXBwAYBwAZAQADYmFyAQABSQEABjxpbml0" +
+ "PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAANmb28BAApTb3VyY2VGaWxlAQAMVGVz" +
+ "dDk5OS5qYXZhDAAKAAsMAAgACQcAGgwAGwAcAQAHR29vZGJ5ZQcAHQwAHgAfAQALYXJ0L1Rlc3Q5" +
+ "OTkBABBqYXZhL2xhbmcvT2JqZWN0AQAQamF2YS9sYW5nL1N5c3RlbQEAA291dAEAFUxqYXZhL2lv" +
+ "L1ByaW50U3RyZWFtOwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmludGxuAQAVKExqYXZhL2xh" +
+ "bmcvU3RyaW5nOylWACEABgAHAAAAAQABAAgACQAAAAIAAQAKAAsAAQAMAAAAJwACAAEAAAALKrcA" +
+ "ASoQQLUAArEAAAABAA0AAAAKAAIAAAATAAQAGAABAA4ACwABAAwAAAAlAAIAAQAAAAmyAAMSBLYA" +
+ "BbEAAAABAA0AAAAKAAIAAAAVAAgAFgABAA8AAAACABA=");
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQDlfmgFfKulToQpDF+P4dsgeOkgfzzH+5lgAwAAcAAAAHhWNBIAAAAAAAAAALQCAAAQ" +
+ "AAAAcAAAAAcAAACwAAAAAgAAAMwAAAACAAAA5AAAAAQAAAD0AAAAAQAAABQBAAAsAgAANAEAAIYB" +
+ "AACOAQAAlwEAAJoBAACpAQAAwAEAANQBAADoAQAA/AEAAAoCAAANAgAAEQIAABYCAAAbAgAAIAIA" +
+ "ACkCAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAJAAAACQAAAAYAAAAAAAAACgAAAAYAAACAAQAA" +
+ "AQAAAAsAAAAFAAIADQAAAAEAAAAAAAAAAQAAAAwAAAACAAEADgAAAAMAAAAAAAAAAQAAAAEAAAAD" +
+ "AAAAAAAAAAgAAAAAAAAAoAIAAAAAAAACAAEAAQAAAHQBAAAIAAAAcBADAAEAEwBAAFkQAAAOAAMA" +
+ "AQACAAAAeQEAAAgAAABiAAEAGgEBAG4gAgAQAA4AEwAOQAAVAA54AAAAAQAAAAQABjxpbml0PgAH" +
+ "R29vZGJ5ZQABSQANTGFydC9UZXN0OTk5OwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABJMamF2YS9s" +
+ "YW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07AAxUZXN0" +
+ "OTk5LmphdmEAAVYAAlZMAANiYXIAA2ZvbwADb3V0AAdwcmludGxuAHV+fkQ4eyJjb21waWxhdGlv" +
+ "bi1tb2RlIjoiZGVidWciLCJtaW4tYXBpIjoxLCJzaGEtMSI6ImQyMmFiNGYxOWI3NTYxNDQ3NTI4" +
+ "NTdjYTg2YjJjZWU0ZGQ5Y2ExNjYiLCJ2ZXJzaW9uIjoiMS40LjktZGV2In0AAAEBAQABAIGABLQC" +
+ "AQHUAgAAAAAOAAAAAAAAAAEAAAAAAAAAAQAAABAAAABwAAAAAgAAAAcAAACwAAAAAwAAAAIAAADM" +
+ "AAAABAAAAAIAAADkAAAABQAAAAQAAAD0AAAABgAAAAEAAAAUAQAAASAAAAIAAAA0AQAAAyAAAAIA" +
+ "AAB0AQAAARAAAAEAAACAAQAAAiAAABAAAACGAQAAACAAAAEAAACgAgAAAxAAAAEAAACwAgAAABAA" +
+ "AAEAAAC0AgAA");
}