blob: cc1fcf24c377e9a2f47be9628cdee711da035ea3 [file] [log] [blame]
Clément Bérac8b2c152022-06-22 08:23:47 +02001// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5package desugaredlibrary;
6
7import org.objectweb.asm.ClassReader;
8import org.objectweb.asm.ClassVisitor;
9import org.objectweb.asm.ClassWriter;
10import org.objectweb.asm.MethodVisitor;
11import org.objectweb.asm.Opcodes;
12
13public abstract class AsmRewriter {
14
15 public static int ASM_VERSION = Opcodes.ASM9;
16
17 public static byte[] transformInvoke(byte[] bytes, MethodTransformer transformer) {
18 ClassReader reader = new ClassReader(bytes);
19 ClassWriter writer = new ClassWriter(reader, 0);
20 ClassVisitor subvisitor = new InvokeTransformer(writer, transformer);
21 reader.accept(subvisitor, 0);
22 return writer.toByteArray();
23 }
24
25 public static class InvokeTransformer extends ClassVisitor {
26
27 private final MethodTransformer transformer;
28
29 InvokeTransformer(ClassWriter writer, MethodTransformer transformer) {
30 super(ASM_VERSION, writer);
31 this.transformer = transformer;
32 }
33
34 @Override
35 public MethodVisitor visitMethod(
36 int access, String name, String descriptor, String signature, String[] exceptions) {
37 MethodVisitor sub = super.visitMethod(access, name, descriptor, signature, exceptions);
38 transformer.setMv(sub);
39 return transformer;
40 }
41 }
42
43 public static class MethodTransformer extends MethodVisitor {
44
45 protected MethodTransformer(int api) {
46 super(api);
47 }
48
49 public void setMv(MethodVisitor visitor) {
50 this.mv = visitor;
51 }
52 }
53}