Skip to content

Commit e5cf79a

Browse files
refactor: replace return value of WrapperExecutor.getProperty directly
1 parent 54b9911 commit e5cf79a

File tree

4 files changed

+60
-76
lines changed

4 files changed

+60
-76
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
}
1010

1111
group = "org.tingy"
12-
version = "1.3"
12+
version = "1.4"
1313

1414
dependencies {
1515
implementation("org.ow2.asm:asm:9.7")

src/main/kotlin/org/tingy/agent/gradle/UrlReplacer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ object UrlReplacer {
2424
}
2525

2626
val newUrl = String.format(System.getenv("GRADLE_DISTRIBUTION_URL_TEMPLATE"), version, type)
27-
log("[replace] Distribution [$url] is mirrored to [$url]")
28-
println("> Gradle Agent:\nDistribution [$url] is mirrored to [$url]\n")
27+
log("[replace] Distribution [$url] is mirrored to [$newUrl]")
28+
println("> Gradle Agent:\nDistribution [$url] is mirrored to [$newUrl]\n")
2929
return newUrl
3030
}
3131
}

src/main/kotlin/org/tingy/agent/gradle/WrapperExecutorTransformer.kt

Lines changed: 55 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import org.objectweb.asm.ClassVisitor
55
import org.objectweb.asm.ClassWriter
66
import org.objectweb.asm.MethodVisitor
77
import org.objectweb.asm.Opcodes
8-
import org.objectweb.asm.commons.AdviceAdapter
98

109
object 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
}

src/test/kotlin/WrapperExecutorTransformerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ class WrapperExecutorTransformerTest {
2121
fun `transform wrapper v1`() {
2222
val bytes = WrapperExecutorTransformer.transform(bWrapperExecutorV1)
2323
assertNotNull(bytes)
24-
File(classDir, "WrapperExecutor.class").writeBytes(bytes)
24+
File(classDir, "WrapperExecutor.v1.class").writeBytes(bytes)
2525
}
2626

2727
@Test
2828
fun `transform wrapper v2`() {
2929
val bytes = WrapperExecutorTransformer.transform(bWrapperExecutorV2)
3030
assertNotNull(bytes)
31-
File(classDir, "WrapperExecutor.class").writeBytes(bytes)
31+
File(classDir, "WrapperExecutor.v2.class").writeBytes(bytes)
3232
}
3333
}

0 commit comments

Comments
 (0)