Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
asm
asm
Commits
0dd78422
Commit
0dd78422
authored
Sep 19, 2021
by
Eric Bruneton
Browse files
Merge branch 'field-handles' into 'master'
Remap invokedynamic field handles properly Closes
#317954
See merge request
!327
parents
cf20d046
2a70d3a5
Pipeline
#15914
passed with stage
in 6 minutes and 23 seconds
Changes
2
Pipelines
1
Show whitespace changes
Inline
Side-by-side
asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java
View file @
0dd78422
...
...
@@ -160,13 +160,15 @@ public abstract class Remapper {
}
if
(
value
instanceof
Handle
)
{
Handle
handle
=
(
Handle
)
value
;
boolean
isFieldHandle
=
handle
.
getTag
()
<=
Opcodes
.
H_PUTSTATIC
;
return
new
Handle
(
handle
.
getTag
(),
mapType
(
handle
.
getOwner
()),
mapMethodName
(
handle
.
getOwner
(),
handle
.
getName
(),
handle
.
getDesc
()),
handle
.
getTag
()
<=
Opcodes
.
H_PUTSTATIC
?
map
Desc
(
handle
.
getDesc
())
:
mapMethodDesc
(
handle
.
getDesc
()),
isFieldHandle
?
mapFieldName
(
handle
.
getOwner
(),
handle
.
getName
(),
handle
.
getDesc
())
:
map
MethodName
(
handle
.
getOwner
(),
handle
.
getName
(),
handle
.
getDesc
())
,
isFieldHandle
?
mapDesc
(
handle
.
getDesc
())
:
mapMethodDesc
(
handle
.
getDesc
()),
handle
.
isInterface
());
}
if
(
value
instanceof
ConstantDynamic
)
{
...
...
asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java
View file @
0dd78422
...
...
@@ -50,6 +50,7 @@ import org.objectweb.asm.Type;
import
org.objectweb.asm.test.AsmTest
;
import
org.objectweb.asm.test.ClassFile
;
import
org.objectweb.asm.tree.ClassNode
;
import
org.objectweb.asm.tree.InvokeDynamicInsnNode
;
import
org.objectweb.asm.tree.LdcInsnNode
;
import
org.objectweb.asm.util.CheckMethodAdapter
;
...
...
@@ -209,6 +210,38 @@ public class ClassRemapperTest extends AsmTest {
assertEquals
(
"()Ljava/lang/Integer;"
,
constantDynamic
.
getBootstrapMethod
().
getDesc
());
}
@Test
public
void
testInvokeDynamicInsn_field
()
{
ClassNode
classNode
=
new
ClassNode
();
ClassRemapper
classRemapper
=
new
ClassRemapper
(
/* latest api */
Opcodes
.
ASM9
,
classNode
,
new
Remapper
()
{
@Override
public
String
mapFieldName
(
final
String
owner
,
final
String
name
,
final
String
descriptor
)
{
if
(
"a"
.
equals
(
name
))
{
return
"demo"
;
}
return
name
;
}
});
classRemapper
.
visit
(
Opcodes
.
V11
,
Opcodes
.
ACC_PUBLIC
,
"C"
,
null
,
"java/lang/Object"
,
null
);
MethodVisitor
methodVisitor
=
classRemapper
.
visitMethod
(
Opcodes
.
ACC_PUBLIC
,
"hello"
,
"()V"
,
null
,
null
);
methodVisitor
.
visitCode
();
methodVisitor
.
visitInvokeDynamicInsn
(
"foo"
,
"()Ljava/lang/String;"
,
new
Handle
(
Opcodes
.
H_GETFIELD
,
"pkg/B"
,
"a"
,
"Ljava/lang/String;"
,
false
));
InvokeDynamicInsnNode
invokeDynamic
=
(
InvokeDynamicInsnNode
)
classNode
.
methods
.
get
(
0
).
instructions
.
get
(
0
);
assertEquals
(
"demo"
,
invokeDynamic
.
bsm
.
getName
());
}
/** Tests that classes transformed with a ClassRemapper can be loaded and instantiated. */
@ParameterizedTest
@MethodSource
(
ALL_CLASSES_AND_ALL_APIS
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment