From bae93791721859ac68c6dc333770b57f2f0726df Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 23 Apr 2023 21:15:18 +0200 Subject: [PATCH 1/2] More cursedness --- .../viaproxy/injection/Java17ToJava8.java | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java b/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java index c6ed00e..704cbf9 100644 --- a/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java +++ b/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java @@ -143,11 +143,7 @@ public class Java17ToJava8 implements IBytecodeTransformer { list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableList", "(Ljava/util/List;)Ljava/util/List;")); } } else if (min.name.equals("copyOf")) { - // TODO: Fix - /*list.add(new TypeInsnNode(Opcodes.NEW, "java/util/ArrayList")); - list.add(new InsnNode(Opcodes.DUP)); - list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "", "(Ljava/util/Collection;)V"));*/ - list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableList", "(Ljava/util/List;)Ljava/util/List;")); + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/google/common/collect/ImmutableList", "copyOf", "(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableList;")); } if (list.size() != 0) { @@ -188,11 +184,7 @@ public class Java17ToJava8 implements IBytecodeTransformer { list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableSet", "(Ljava/util/Set;)Ljava/util/Set;")); } } else if (min.name.equals("copyOf")) { - // TODO: Fix - /*list.add(new TypeInsnNode(Opcodes.NEW, "java/util/HashSet")); - list.add(new InsnNode(Opcodes.DUP)); - list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/HashSet", "", "(Ljava/util/Collection;)V"));*/ - list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableSet", "(Ljava/util/Set;)Ljava/util/Set;")); + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/google/common/collect/ImmutableSet", "copyOf", "(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableSet;")); } @@ -216,11 +208,30 @@ public class Java17ToJava8 implements IBytecodeTransformer { if (min.name.equals("of")) { final Type[] args = Type.getArgumentTypes(min.desc); - if (args.length == 0) { + if (args.length != 1 || args[0].getSort() != Type.ARRAY) { + int freeVarIndex = ASMUtils.getFreeVarIndex(method); + + int argCount = args.length; + if (argCount % 2 != 0) { + throw new RuntimeException("Map.of() requires an even number of arguments"); + } + list.add(new TypeInsnNode(Opcodes.NEW, "java/util/HashMap")); list.add(new InsnNode(Opcodes.DUP)); list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/HashMap", "", "()V")); + list.add(new VarInsnNode(Opcodes.ASTORE, freeVarIndex)); + for (int i = 0; i < argCount / 2; i++) { + list.add(new VarInsnNode(Opcodes.ALOAD, freeVarIndex)); + list.add(new InsnNode(Opcodes.DUP_X2)); + list.add(new InsnNode(Opcodes.POP)); + list.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, "java/util/Map", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")); + list.add(new InsnNode(Opcodes.POP)); + } + list.add(new VarInsnNode(Opcodes.ALOAD, freeVarIndex)); + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableMap", "(Ljava/util/Map;)Ljava/util/Map;")); } + } else if (min.name.equals("copyOf")) { + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/google/common/collect/ImmutableMap", "copyOf", "(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;")); } if (list.size() != 0) { From fc9ee03e07eab7f0e1d04674bbfccdb27571bed5 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sun, 23 Apr 2023 21:50:36 +0200 Subject: [PATCH 2/2] Replaced guava usage --- .../viaproxy/injection/Java17ToJava8.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java b/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java index 704cbf9..f59293b 100644 --- a/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java +++ b/src/main/java/net/raphimc/viaproxy/injection/Java17ToJava8.java @@ -143,7 +143,11 @@ public class Java17ToJava8 implements IBytecodeTransformer { list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableList", "(Ljava/util/List;)Ljava/util/List;")); } } else if (min.name.equals("copyOf")) { - list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/google/common/collect/ImmutableList", "copyOf", "(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableList;")); + list.add(new TypeInsnNode(Opcodes.NEW, "java/util/ArrayList")); + list.add(new InsnNode(Opcodes.DUP_X1)); + list.add(new InsnNode(Opcodes.SWAP)); + list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "", "(Ljava/util/Collection;)V")); + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableList", "(Ljava/util/List;)Ljava/util/List;")); } if (list.size() != 0) { @@ -184,7 +188,11 @@ public class Java17ToJava8 implements IBytecodeTransformer { list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableSet", "(Ljava/util/Set;)Ljava/util/Set;")); } } else if (min.name.equals("copyOf")) { - list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/google/common/collect/ImmutableSet", "copyOf", "(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableSet;")); + list.add(new TypeInsnNode(Opcodes.NEW, "java/util/HashSet")); + list.add(new InsnNode(Opcodes.DUP_X1)); + list.add(new InsnNode(Opcodes.SWAP)); + list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/HashSet", "", "(Ljava/util/Collection;)V")); + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableSet", "(Ljava/util/Set;)Ljava/util/Set;")); } @@ -231,7 +239,11 @@ public class Java17ToJava8 implements IBytecodeTransformer { list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableMap", "(Ljava/util/Map;)Ljava/util/Map;")); } } else if (min.name.equals("copyOf")) { - list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/google/common/collect/ImmutableMap", "copyOf", "(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;")); + list.add(new TypeInsnNode(Opcodes.NEW, "java/util/HashMap")); + list.add(new InsnNode(Opcodes.DUP_X1)); + list.add(new InsnNode(Opcodes.SWAP)); + list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/HashMap", "", "(Ljava/util/Map;)V")); + list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Collections", "unmodifiableMap", "(Ljava/util/Map;)Ljava/util/Map;")); } if (list.size() != 0) {