-
Notifications
You must be signed in to change notification settings - Fork 384
Mangling for MJI
Suppose your method looks like
T1 foo(T2 x, T3 y, ...)
where the Ti are Java types.
If T1 is a primitive type or void, then the mangled MJI method looks
like
public static T1 foo__MT2MT3...__MT1(...)
where the MTi are the mangled versions of the Ti.
Mangling of types is described in the Mangling Types section below.
Note that T1 appears twice, once not mangled (T1) and once mangled
(MT1). The __ is two consecutive underscores: _ followed by
_.
As a not-so-special case, if foo has no arguments, then the mangled method
will have four consecutive underscores:
`T1 foo()`[[br]]
goes to
`public static T1 foo____MT1(...)`
If T1 is not a primitive type, then the mangled MJI method looks like
`public static int foo__MT2MT3...__MT1`
where the MTi are as above. Note that T1 only appears once in this
case. The method's return type is int. As before, a method with no
arguments gets mangled to something with four consecutive underscores.
Also, the use of generics is ignored when mangling names.
Constructors are treated as methods named $init with return type void.
Static initializers are treated as methods named $clinit with no
arguments and return type void. Thus, their MJI versions always
have the mangled signature:
public static void $clinit____V (MJIEnv env, int clsObjRef)
or the equivalent unmangled signature:
public static void $clinit (MJIEnv env, int clsObjRef)
-
Convert primitives and
voidas followsJava Type Mangled Type booleanZbyteBcharCshortSintIlongJfloatFdoubleDvoidV -
Convert a non-array reference type
Tin packagex.y(e.g.java.lang.String) as follows-
x.y.T-->Lx_y_T_2 - Example:
java.lang.String-->Ljava_lang_String_2
-
-
Convert an array of primitive type
T(e.g.byte[]) as follows:-
T[]-->_3MTwhereMTis the mangled version ofT(e.g. forT=byte,MT=B) - Example:
byte[]-->_3B
-
-
Convert an array of reference type
Tin packagex.y(e.g.java.lang.String[]) as follows:-
x.y.T[]-->_3Lx_y_T_2 - Example:
java.lang.String[]-->_3Ljava_lang_String_2
-
void return type, single primitive argument:
public static void resetCounter(int id)
-->
public static final void resetCounter__I__V(MJIEnv env, int objref, int id)
Primitive return type, no arguments:
public native boolean isArray()
-->
public static boolean isArray____Z(MJIEnv env, int objref)
Primitive return type, single primitive argument:
public static double abs(double a)
-->
public static double abs__D__D(MJIEnv env, int clsObjRef, double a)
Primitive return type, two primitive arguments:
public static long min(long a, long b)
-->
public static long min__JJ__J(MJIEnv env, int clsObjRef, long a, long b)
void return type, arguments include an array of a primitive type:
public native void write (byte[] buf, int off, int len);
-->
public static void write___3BII__V(MJIEnv env, int objref,
int bufRef, int off, int len)
void return type, argument is an array of a reference type:
public static void print(String s)
-->
public static void print___3Ljava_lang_String_2__V(MJIEnv env, int clsRef, int argsRef)
Array of reference types returned, no arguments:
public native Annotation[] getAnnotations()
-->
public static int getAnnotations_____3Ljava_lang_annotation_Annotation_2(MJIEnv env, int robj)
Notice there are 5 underscores before the 3L: two marking the
arguments, two marking the return type, and one from the _3
signalling an array.
Array of reference types using generics returned, no arguments:
public native Class<?>[] getParameterTypes()
-->
public static int getParameterTypes_____3Ljava_lang_Class_2(MJIEnv env, int objref)
Note: the use of generics is ignored in the mangling.
Constructors are treated as though they were methods named $init
returning void, so the method examples above should also be helpful
for constructors. Here are a few more examples.
In the class ConsoleOutputStream:
public ConsoleOutputStream()
-->
public static void $init____V(MJIEnv env, int objref)
In the class AtomicLongFieldUpdater:
protected AtomicLongFieldUpdater(Class<T> objClass, String fieldName)
-->
public static void $init__Ljava_lang_Class_2Ljava_lang_String_2__V
(MJIEnv env, int objRef,
int tClsObjRef, int fNameRef)
Please contact us by creating an issue. We are trying to fix the process below, which no longer works.
-
How to obtain and install JPF
- System requirements
- Downloading
- Creating a site properties file
- Building, testing, and running
- JPF plugins
-
Developer guide
- Top-level design
- Key mechanisms
- Extension mechanisms
- Common utilities
- Running JPF from within your application
- Writing JPF tests
- Coding conventions
- Hosting an Eclipse plugin update site