1
+ package io.github.chao2zhang
2
+
3
+ import org.objectweb.asm.Label
4
+ import org.objectweb.asm.MethodVisitor
5
+ import org.objectweb.asm.Opcodes
6
+
7
+ /* *
8
+ * private void logValue(String methodName, T value) {
9
+ * StackTraceElement[] traces = Thread.currentThread().getStackTrace();
10
+ * if (traces.length > 3) {
11
+ * Log.i("LiveData", methodName + "() called with LiveData = " + this + " Value = " + value + " Caller = " + traces[3].toString());
12
+ * }
13
+ * }
14
+ */
15
+ fun visitLogValueMethod (methodVisitor : MethodVisitor ) {
16
+ methodVisitor.visitCode()
17
+ val label0 = Label ()
18
+ methodVisitor.visitLabel(label0)
19
+ methodVisitor.visitLineNumber(302 , label0)
20
+ methodVisitor.visitMethodInsn(Opcodes .INVOKESTATIC , " java/lang/Thread" , " currentThread" , " ()Ljava/lang/Thread;" , false )
21
+ methodVisitor.visitMethodInsn(
22
+ Opcodes .INVOKEVIRTUAL ,
23
+ " java/lang/Thread" ,
24
+ " getStackTrace" ,
25
+ " ()[Ljava/lang/StackTraceElement;" ,
26
+ false
27
+ )
28
+ methodVisitor.visitVarInsn(Opcodes .ASTORE , 3 )
29
+ val label1 = Label ()
30
+ methodVisitor.visitLabel(label1)
31
+ methodVisitor.visitLineNumber(303 , label1)
32
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 3 )
33
+ methodVisitor.visitInsn(Opcodes .ARRAYLENGTH )
34
+ methodVisitor.visitInsn(Opcodes .ICONST_5 )
35
+ val label2 = Label ()
36
+ methodVisitor.visitJumpInsn(Opcodes .IF_ICMPLE , label2)
37
+ val label3 = Label ()
38
+ methodVisitor.visitLabel(label3)
39
+ methodVisitor.visitLineNumber(304 , label3)
40
+ methodVisitor.visitLdcInsn(" LiveData" )
41
+ methodVisitor.visitTypeInsn(Opcodes .NEW , " java/lang/StringBuilder" )
42
+ methodVisitor.visitInsn(Opcodes .DUP )
43
+ methodVisitor.visitMethodInsn(Opcodes .INVOKESPECIAL , " java/lang/StringBuilder" , " <init>" , " ()V" , false )
44
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 1 )
45
+ methodVisitor.visitMethodInsn(
46
+ Opcodes .INVOKEVIRTUAL ,
47
+ " java/lang/StringBuilder" ,
48
+ " append" ,
49
+ " (Ljava/lang/String;)Ljava/lang/StringBuilder;" ,
50
+ false
51
+ )
52
+ methodVisitor.visitLdcInsn(" () called with LiveData = " )
53
+ methodVisitor.visitMethodInsn(
54
+ Opcodes .INVOKEVIRTUAL ,
55
+ " java/lang/StringBuilder" ,
56
+ " append" ,
57
+ " (Ljava/lang/String;)Ljava/lang/StringBuilder;" ,
58
+ false
59
+ )
60
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 0 )
61
+ methodVisitor.visitMethodInsn(
62
+ Opcodes .INVOKEVIRTUAL ,
63
+ " java/lang/StringBuilder" ,
64
+ " append" ,
65
+ " (Ljava/lang/Object;)Ljava/lang/StringBuilder;" ,
66
+ false
67
+ )
68
+ methodVisitor.visitLdcInsn(" Value = " )
69
+ methodVisitor.visitMethodInsn(
70
+ Opcodes .INVOKEVIRTUAL ,
71
+ " java/lang/StringBuilder" ,
72
+ " append" ,
73
+ " (Ljava/lang/String;)Ljava/lang/StringBuilder;" ,
74
+ false
75
+ )
76
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 2 )
77
+ methodVisitor.visitMethodInsn(
78
+ Opcodes .INVOKEVIRTUAL ,
79
+ " java/lang/StringBuilder" ,
80
+ " append" ,
81
+ " (Ljava/lang/Object;)Ljava/lang/StringBuilder;" ,
82
+ false
83
+ )
84
+ methodVisitor.visitLdcInsn(" Caller = " )
85
+ methodVisitor.visitMethodInsn(
86
+ Opcodes .INVOKEVIRTUAL ,
87
+ " java/lang/StringBuilder" ,
88
+ " append" ,
89
+ " (Ljava/lang/String;)Ljava/lang/StringBuilder;" ,
90
+ false
91
+ )
92
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 3 )
93
+ methodVisitor.visitInsn(Opcodes .ICONST_5 )
94
+ methodVisitor.visitInsn(Opcodes .AALOAD )
95
+ methodVisitor.visitMethodInsn(
96
+ Opcodes .INVOKEVIRTUAL ,
97
+ " java/lang/StackTraceElement" ,
98
+ " toString" ,
99
+ " ()Ljava/lang/String;" ,
100
+ false
101
+ )
102
+ methodVisitor.visitMethodInsn(
103
+ Opcodes .INVOKEVIRTUAL ,
104
+ " java/lang/StringBuilder" ,
105
+ " append" ,
106
+ " (Ljava/lang/String;)Ljava/lang/StringBuilder;" ,
107
+ false
108
+ )
109
+ methodVisitor.visitMethodInsn(
110
+ Opcodes .INVOKEVIRTUAL ,
111
+ " java/lang/StringBuilder" ,
112
+ " toString" ,
113
+ " ()Ljava/lang/String;" ,
114
+ false
115
+ )
116
+ methodVisitor.visitMethodInsn(
117
+ Opcodes .INVOKESTATIC ,
118
+ " android/util/Log" ,
119
+ " i" ,
120
+ " (Ljava/lang/String;Ljava/lang/String;)I" ,
121
+ false
122
+ )
123
+ methodVisitor.visitInsn(Opcodes .POP )
124
+ methodVisitor.visitLabel(label2)
125
+ methodVisitor.visitLineNumber(306 , label2)
126
+ methodVisitor.visitFrame(Opcodes .F_APPEND , 1 , arrayOf<Any >(" [Ljava/lang/StackTraceElement;" ), 0 , null )
127
+ methodVisitor.visitInsn(Opcodes .RETURN )
128
+ val label4 = Label ()
129
+ methodVisitor.visitLabel(label4)
130
+ methodVisitor.visitLocalVariable(
131
+ " this" ,
132
+ " Landroidx/lifecycle/LiveData;" ,
133
+ " Landroidx/lifecycle/LiveData<TT;>;" ,
134
+ label0,
135
+ label4,
136
+ 0
137
+ )
138
+ methodVisitor.visitLocalVariable(" methodName" , " Ljava/lang/String;" , null , label0, label4, 1 )
139
+ methodVisitor.visitLocalVariable(" value" , " Ljava/lang/Object;" , " TT;" , label0, label4, 2 )
140
+ methodVisitor.visitLocalVariable(" traces" , " [Ljava/lang/StackTraceElement;" , null , label1, label4, 3 )
141
+ methodVisitor.visitMaxs(4 , 4 )
142
+ methodVisitor.visitEnd()
143
+ }
0 commit comments