diff options
37 files changed, 1498 insertions, 1494 deletions
diff --git a/test/1995-final-virtual-structural-multithread/src/Main.java b/test/1995-final-virtual-structural-multithread/src/Main.java index f19358d626..f3bf4f6d16 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 70734943a0..a960c7453f 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.ArrayList; 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(); + 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="); + /** + * 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 static void run() throws Exception { + Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE); + doTest(); } - public void run() { - delay.countDown(); - while (!finish && results.size() < TASK_COUNT_LIMIT) { - Transform t = new Transform(); - results.add(t.sayHi()); - } - } + 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 finish() throws Exception { - finish = true; - this.join(); - } + public void run() { + delay.countDown(); + while (!finish && results.size() < TASK_COUNT_LIMIT) { + Transform t = new Transform(); + results.add(t.sayHi()); + } + } - 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 void finish() throws Exception { + finish = true; + this.join(); } - } - } - public ArrayList<String> results; - public volatile boolean finish; - public int thr_id; - public CountDownLatch delay; - } + 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 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(); + public ArrayList<String> results; + public volatile boolean finish; + public int thr_id; + public CountDownLatch delay; } - cdl.await(); - return res; - } - public static void finishThreads(MyThread[] thrs) throws Exception { - for (MyThread t : thrs) { - t.finish(); + + 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; } - for (MyThread t : thrs) { - t.Check(); + 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 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 ade69cfe2f..ff10798fef 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 c2b1125528..2649476894 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 @@ package art; 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 3c9bc85fb3..f6552ee190 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 7309a31bd3..51865188d0 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 @@ import java.util.Base64; 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 f6aeca5b85..e35d1b199f 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 3fda936f84..3aaa9f3f24 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 @@ import java.util.Base64; public class Test1998 { - public static class SuperTransform { - public static String greeting = "Hello"; - } - - // 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 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 class SuperTransform { + public static String greeting = "Hello"; + } + + // 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 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); + } } diff --git a/test/1999-virtual-structural/src/Main.java b/test/1999-virtual-structural/src/Main.java index 86a492bcb6..f4a1bd63c7 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 f6811a90cd..694344215a 100644 --- a/test/1999-virtual-structural/src/art/Test1999.java +++ b/test/1999-virtual-structural/src/art/Test1999.java @@ -19,67 +19,67 @@ package art; 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 6011c7cd5e..2c0126a734 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$interfaceTypeTest(Object o) { - return ((Itf)o) == o; - } - - 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.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.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.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.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.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.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.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: 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$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(); - } - - 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(); - - 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) {} - - 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(); - - 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(); - - 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) {} - } + public static boolean $inline$classTypeTest(Object o) { + return ((SubMain) 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; + + /// 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.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.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.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.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.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.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: 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(); + } + + public static Object $inline$getString() { + return new String(); + } + + 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(); + } + + 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(); + + 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) {} + + 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(); + + 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(); + + 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) {} + } } 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 e97b4e3391..fe0582e151 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 4fe47237f8..feb8fdc56d 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.ArrayList; 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))); + // 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; + 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); - } + 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); - } + // 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); + // 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; - } + 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 977af8321e..18f79ceb26 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 01b4bcd391..66a3f6e785 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.lang.reflect.Method; import java.util.List; class MyClassLoader extends ClassLoader { - 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 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); - } + 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 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); - - if (dex != null) { - Class<?> clazz = (Class<?>)method.invoke(dex, className, this, null); - if (clazz != null) { - return clazz; - } + 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); + } } - } - } 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); - - 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 $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; - - static native Object cloneResolvedMethods(Class<?> cls); - static native void restoreResolvedMethods(Class<?> cls, Object saved); + 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 */ } + } + + 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 */ } + + // 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); } diff --git a/test/498-type-propagation/src/Main.java b/test/498-type-propagation/src/Main.java index b20794c31c..ceb35eb239 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 e917bc1f32..4e99771a4f 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]; - } + 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; } - 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]; - } + 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; } - 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 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); + 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 c3384adb95..ec2fbe5d5f 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 4b1f490bcf..cd38d3e0ed 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 643e3a1893..8a428a0ba2 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 10adc209e1..627c15c2a5 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 @@ class DebugProxy implements java.lang.reflect.InvocationHandler { 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 2799624f25..9a95d80c2d 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 boolean alwaysThrows() { + throw new Error(""); + } - public static void test() { - alwaysThrows(); - while (condition) { - int a = 2; - while (otherCondition) { - a = 3; - } - staticField = a; + public static void test() { + alwaysThrows(); + while (condition) { + int a = 2; + while (otherCondition) { + a = 3; + } + staticField = a; + } } - } - public static void main(String[] args) throws Exception { - try { - test(); - throw new Exception("Unexpected exception"); - } catch (Error e) { - // Expected. + 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; + 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 b92166a021..9763a8e7c9 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 1fadb86745..514770a748 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 c265db99aa..f893c8e725 100644 --- a/test/916-obsolete-jit/src/Main.java +++ b/test/916-obsolete-jit/src/Main.java @@ -26,72 +26,72 @@ public class Main { // 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 6f80b43255..e92cd9b4ef 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 a4023fb80a..5fb5e08aa9 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.Executable; 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 interface BreakpointHandler { + public void breakpointReached(Executable e, long loc); + } - public static void breakpointCatchLate() { - doNothing(); - try { - doNothing(); - } catch (Throwable t) { - System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\""); + public static void breakpoint() { + return; } - } - public static void breakpointCatch() { - try { - doNothing(); - } catch (Throwable t) { - System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\""); + public static void breakpointCatchLate() { + doNothing(); + 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) { + public static void breakpointCatch() { 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 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 1b9b0a9b4b..521d7fad33 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 f3166c33c7..29dfff228b 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.lang.reflect.Method; 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 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() {} - - 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(); + // 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; + + // 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(); + } } - } - - /* ******************************************************************************************** */ - // 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; - - // 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; + + /* ****************************************************************************************** */ + // 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; + + // 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; + } + 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()); + + 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("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("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()); } - 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()); - - 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("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("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()); - } - - 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 1927f04d50..a3e911da7e 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 a7a522dcca..88fbb879df 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.Executable; 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); + 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() {} + // 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(); + // Method with multiple paths we can break on. + public static void doMultiPath(boolean bit) { + doNothing(); + if (bit) { + doNothing(); + } else { + doNothing(); + } + doNothing(); } - doNothing(); - } - public static void notifySingleStep(Thread thr, Executable e, long loc) { - if (!e.equals(DO_MULTIPATH_METHOD)) { - // Only report steps in doMultiPath - return; + 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); + } } - 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 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); + } - 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()); } - - 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 2193a631cd..349b73e46a 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 art.Redefinition; 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 @@ public class DexCacheSmash { "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 @@ public class DexCacheSmash { "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 @@ public class DexCacheSmash { "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 56d2938a01..7b37afd5bf 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 @@ package art; 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); - } + public static void setTestConfiguration(Config type) { + nativeSetTestConfiguration(type.val); + } - private static native void nativeSetTestConfiguration(int type); + private static native void nativeSetTestConfiguration(int type); - // Transforms the class - public static native void doCommonClassRedefinition(Class<?> target, - byte[] classfile, - byte[] dexfile); + // 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<>(); + 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); + 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][])); } - 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); + 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); + 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 cd3babf46f..fcc759f0f8 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 97495c5a47..d82619f12b 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 c1b838ccc7..3bdb2b6efa 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 014ea1663f..70dc006851 100644 --- a/test/999-redefine-hiddenapi/src/Main.java +++ b/test/999-redefine-hiddenapi/src/Main.java @@ -19,92 +19,92 @@ import java.lang.reflect.Method; 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"); - } + // 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) { + 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 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 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 final String DEX_EXTRA = - new File(System.getenv("DEX_LOCATION"), "999-redefine-hiddenapi-ex.jar").getAbsolutePath(); + private static final String DEX_EXTRA = new File( + System.getenv("DEX_LOCATION"), "999-redefine-hiddenapi-ex.jar").getAbsolutePath(); - private static ClassLoader BOOT_CLASS_LOADER = Object.class.getClassLoader(); + private static ClassLoader BOOT_CLASS_LOADER = Object.class.getClassLoader(); - // 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(); + // 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"); + /** + * 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"); } |