@@ -5,7 +5,6 @@ import org.objectweb.asm.ClassVisitor
55import org.objectweb.asm.ClassWriter
66import org.objectweb.asm.MethodVisitor
77import org.objectweb.asm.Opcodes
8- import org.objectweb.asm.commons.AdviceAdapter
98
109object WrapperExecutorTransformer {
1110
@@ -29,81 +28,66 @@ object WrapperExecutorTransformer {
2928
3029 if (name != " readDistroUrl" ) return mv
3130
32- return object : AdviceAdapter (ASM9 , mv, access, name, descriptor) {
33-
34- override fun onMethodExit (opcode : Int ) {
35- if (opcode != ARETURN ) return
36-
37- when (descriptor) {
38-
39- " ()Ljava/lang/String;" -> {
40- // stack: [String]
41- visitFieldInsn(
42- GETSTATIC ,
43- " org/tingy/agent/gradle/UrlReplacer" ,
44- " INSTANCE" ,
45- " Lorg/tingy/agent/gradle/UrlReplacer;"
46- )
47- visitInsn(SWAP )
48- visitMethodInsn(
49- INVOKEVIRTUAL ,
50- " org/tingy/agent/gradle/UrlReplacer" ,
51- " replace" ,
52- " (Ljava/lang/String;)Ljava/lang/String;" ,
53- false
54- )
55- }
56-
57- " ()Ljava/net/URI;" -> {
58- // stack: [URI]
59-
60- visitInsn(DUP )
61- visitMethodInsn(
62- INVOKEVIRTUAL ,
63- " java/net/URI" ,
64- " toString" ,
65- " ()Ljava/lang/String;" ,
66- false
67- )
31+ return ReplaceReturnValueVisitor (mv)
32+ }
33+ }
6834
69- // stack: [URI, String]
70- visitFieldInsn(
71- GETSTATIC ,
72- " org/tingy/agent/gradle/UrlReplacer" ,
73- " INSTANCE" ,
74- " Lorg/tingy/agent/gradle/UrlReplacer;"
75- )
76- visitInsn(SWAP )
35+ cr.accept(cv, ClassReader .EXPAND_FRAMES )
36+ return cw.toByteArray()
37+ }
7738
78- // stack: [URI, INSTANCE, String]
79- visitMethodInsn(
80- INVOKEVIRTUAL ,
81- " org/tingy/agent/gradle/UrlReplacer" ,
82- " replace" ,
83- " (Ljava/lang/String;)Ljava/lang/String;" ,
84- false
85- )
8639
87- // stack: [URI, String]
88- visitTypeInsn(NEW , " java/net/URI" )
89- visitInsn(DUP_X1 )
90- visitInsn(SWAP )
91- visitMethodInsn(
92- INVOKESPECIAL ,
93- " java/net/URI" ,
94- " <init>" ,
95- " (Ljava/lang/String;)V" ,
96- false
97- )
98- // stack: [URI]
99- }
100- }
101- }
40+ /* *
41+ * Replace return value of org/tingy/agent/gradle/WrapperExecutor.getProperty
42+ *
43+ * key instruction:
44+ * ```
45+ * INVOKESPECIAL org/tingy/agent/gradle/WrapperExecutor.getProperty (Ljava/lang/String;)Ljava/lang/String;
46+ * ```
47+ * @param targetOrder The order of the target instruction should be replaced, start from 1.
48+ */
49+ private class ReplaceReturnValueVisitor (
50+ mv : MethodVisitor ,
51+ private val targetOrder : Int = 1
52+ ) : MethodVisitor(Opcodes .ASM9 , mv) {
53+
54+ private var count = 0
55+
56+ override fun visitMethodInsn (
57+ opcode : Int ,
58+ owner : String? ,
59+ name : String? ,
60+ descriptor : String? ,
61+ isInterface : Boolean
62+ ) {
63+ super .visitMethodInsn(opcode, owner, name, descriptor, isInterface)
64+ // stack [... String]
65+
66+ if (opcode == Opcodes .INVOKESPECIAL
67+ && " org/gradle/wrapper/WrapperExecutor" == owner
68+ && " getProperty" == name
69+ && " (Ljava/lang/String;)Ljava/lang/String;" == descriptor
70+ ) {
71+ if (++ count == targetOrder) {
72+ super .visitFieldInsn(
73+ Opcodes .GETSTATIC ,
74+ " org/tingy/agent/gradle/UrlReplacer" ,
75+ " INSTANCE" ,
76+ " Lorg/tingy/agent/gradle/UrlReplacer;"
77+ )
78+ // stack [... String, UrlReplacer]
79+ super .visitInsn(Opcodes .SWAP )
80+ // stack [... UrlReplacer, String]
81+ super .visitMethodInsn(
82+ Opcodes .INVOKEVIRTUAL ,
83+ " org/tingy/agent/gradle/UrlReplacer" ,
84+ " replace" ,
85+ " (Ljava/lang/String;)Ljava/lang/String;" ,
86+ false
87+ )
88+ // stack [... String]
10289 }
10390 }
10491 }
105-
106- cr.accept(cv, ClassReader .EXPAND_FRAMES )
107- return cw.toByteArray()
10892 }
10993}
0 commit comments