Mangling scheme for method signatures

The following grammar documents the name mangling scheme used by the Titanium compiler for translating Titanium method signatures into unique C identifiers.

MethodNameStaticMethodNameDynamic MANGLE_METHOD_NAME_END_MARKER containerType
MethodNameDynamic → EncodedMethodName paramTypes

// mangling method name
EncodedMethodName → m MethodTypeMarkers MethodName | ε
MethodTypeMarkers → MethodLocalInferred MethodSharing | DeclaredLocal MethodSharing | ε
MethodLocalInferred
→ MANGLE_LQI_NAMESPACE_MARKER
DeclaredLocal → MANGLE_LOCAL_NAMESPACE_MARKER
MethodSharing → MANGLE_NONSHARED_NAMESPACE_MARKER | MANGLE_POLYSHARED_NAMESPACE_MARKER | ε

// mangling parameters
ParamTypes → FormalSignature ParamTypes | TypeModifiers cType ParamTypes | ε
TypeModifiers → TypeLocalInferred SharingInferred TypeSharing | LocalInferred TypeSharing | SharingInferred TypeSharing | ε
TypeLocalInferred → MANGLE_LQI_FORMAL_MARKER
SharingInferred → MANGLE_SHARING_INFERENCE_FORMAL_MARKER
TypeSharing → MANGLE_TYPE_NONSHARED_MARKER | MANGLE_TYPE_POLYSHARED_MARKER

// for primitive types
FormalSignature → B | C | D | F | I | J | S | Z

// for reference types
cType → ClassOrInterfaceType | ArrayType
ClassOrInterfaceType → Qualifier MANGLE_TYPE_MARKER TypeName
Qualifier → MANGLE_TYPE_GLOBAL_MARKER | MANGLE_TYPE_LOCAL_MARKER
ArrayType → TiArray | JavaArray
TiArray → MANGLE_TYPE_MARKER MANGLE_TI_ARRAY_TYPE_MARKER Qualifier BaseType
JavaArray → Qualifier MANGLE_TYPE_MARKER MANGLE_JAVA_ARRAY_MARKER BaseType
BaseType → PrimitiveType | cType
PrimitiveType → jboolean | jbyte | jchar | jdouble | jfloat | jint | jlong | jshort

TypeName → // see notes below
ContainerType → // see notes below

// Markers
MANGLE_LQI_NAMESPACE_MARKER "m"
MANGLE_LOCAL_NAMESPACE_MARKER "l"
MANGLE_NONSHARED_NAMESPACE_MARKER "n"
MANGLE_POLYSHARED_NAMESPACE_MARKER "p"
MANGLE_LQI_FORMAL_MARKER "M"
MANGLE_SHARING_INFERENCE_FORMAL_MARKER "s"
MANGLE_TYPE_NONSHARED_MARKER "n"
MANGLE_TYPE_POLYSHARED_MARKER "p"
MANGLE_TYPE_MARKER "T"
MANGLE_TYPE_GLOBAL_MARKER "P"
MANGLE_TYPE_LOCAL_MARKER "L"
MANGLE_TI_ARRAY_MARKER "B"
MANGLE_JAVA_ARRAY_MARKER "A"

Notes:
TypeName and ContainerType are either of the form n1s1n2s2n3s3...nksk, where ni is the length of the string si and si is a member of the package si+1, or of the form nc_n1s1n2s2n3s3...nksk where si is the enclosing class of si+1. MethodName may also take the latter form.