From a0bcbe95df30f33259c5bd12b842ef6ea02bb8fb Mon Sep 17 00:00:00 2001 From: chibash Date: Mon, 9 Jun 2014 19:34:43 +0900 Subject: [PATCH] JIRA JASSIST-224 --- .../bytecode/MethodParametersAttribute.java | 87 +++++++++++++++++++ src/test/test4/MethodParamTest.java | 5 ++ 2 files changed, 92 insertions(+) create mode 100644 src/main/javassist/bytecode/MethodParametersAttribute.java create mode 100644 src/test/test4/MethodParamTest.java diff --git a/src/main/javassist/bytecode/MethodParametersAttribute.java b/src/main/javassist/bytecode/MethodParametersAttribute.java new file mode 100644 index 00000000..b67a0f54 --- /dev/null +++ b/src/main/javassist/bytecode/MethodParametersAttribute.java @@ -0,0 +1,87 @@ +package javassist.bytecode; + +import java.io.DataInputStream; +import java.io.IOException; +import java.util.Map; + +/** + * MethodParameters_attribute. + */ +public class MethodParametersAttribute extends AttributeInfo { + /** + * The name of this attribute "MethodParameters". + */ + public static final String tag = "MethodParameters"; + + MethodParametersAttribute(ConstPool cp, int n, DataInputStream in) + throws IOException + { + super(cp, n, in); + } + + /** + * Constructs an attribute. + * + * @param cp a constant pool table. + * @param names an array of parameter names. + * The i-th element is the name of the i-th parameter. + * @param flags an array of parameter access flags. + */ + public MethodParametersAttribute(ConstPool cp, String[] names, int[] flags) { + super(cp, tag); + byte[] data = new byte[names.length * 4 + 1]; + data[0] = (byte)names.length; + for (int i = 0; i < names.length; i++) { + ByteArray.write16bit(cp.addUtf8Info(names[i]), data, i * 4 + 1); + ByteArray.write16bit(flags[i], data, i * 4 + 3); + } + + set(data); + } + + /** + * Returns parameters_count, which is the number of + * parameters. + */ + public int size() { + return info[0] & 0xff; + } + + /** + * Returns the value of name_index of the i-th element of parameters. + * + * @param i the position of the parameter. + */ + public int name(int i) { + return ByteArray.readU16bit(info, i * 4 + 1); + } + + /** + * Returns the value of access_flags of the i-th element of parameters. + * + * @param i the position of the parameter. + * @see AccessFlag + */ + public int accessFlags(int i) { + return ByteArray.readU16bit(info, i * 4 + 3); + } + + /** + * Makes a copy. + * + * @param newCp the constant pool table used by the new copy. + * @param classnames ignored. + */ + public AttributeInfo copy(ConstPool newCp, Map classnames) { + int s = size(); + ConstPool cp = getConstPool(); + String[] names = new String[s]; + int[] flags = new int[s]; + for (int i = 0; i < s; i++) { + names[i] = cp.getUtf8Info(name(i)); + flags[i] = accessFlags(i); + } + + return new MethodParametersAttribute(newCp, names, flags); + } +} diff --git a/src/test/test4/MethodParamTest.java b/src/test/test4/MethodParamTest.java new file mode 100644 index 00000000..9f64e15e --- /dev/null +++ b/src/test/test4/MethodParamTest.java @@ -0,0 +1,5 @@ +package test4; + +public class MethodParamTest { + public void test(int i, String s) {} +} -- 2.39.5