diff options
Diffstat (limited to 'src/ILCompiler.Compiler/src/Compiler/CoreRTNameMangler.cs')
-rw-r--r-- | src/ILCompiler.Compiler/src/Compiler/CoreRTNameMangler.cs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/ILCompiler.Compiler/src/Compiler/CoreRTNameMangler.cs b/src/ILCompiler.Compiler/src/Compiler/CoreRTNameMangler.cs index 86cac8dc0..8c5636c21 100644 --- a/src/ILCompiler.Compiler/src/Compiler/CoreRTNameMangler.cs +++ b/src/ILCompiler.Compiler/src/Compiler/CoreRTNameMangler.cs @@ -331,7 +331,13 @@ namespace ILCompiler } else { + // This is a type definition. Since we didn't fall in the `is EcmaType` case above, + // it's likely a compiler-generated type. mangledName = SanitizeName(((DefType)type).GetFullName(), true); + + // Always generate a fully qualified name + if (_mangleForCplusPlus) + mangledName = "::" + mangledName; } break; } @@ -404,6 +410,35 @@ namespace ILCompiler return sb.ToUtf8String(); } + private Utf8String GetPrefixMangledSignatureName(IPrefixMangledSignature prefixMangledSignature) + { + Utf8StringBuilder sb = new Utf8StringBuilder(); + sb.Append(EnterNameScopeSequence).Append(prefixMangledSignature.Prefix).Append(ExitNameScopeSequence); + + var signature = prefixMangledSignature.BaseSignature; + sb.Append(signature.Flags.ToStringInvariant()); + + sb.Append(EnterNameScopeSequence); + + string sigRetTypeName = GetMangledTypeName(signature.ReturnType); + if (_mangleForCplusPlus) + sigRetTypeName = sigRetTypeName.Replace("::", "_"); + sb.Append(sigRetTypeName); + + for (int i = 0; i < signature.Length; i++) + { + sb.Append("__"); + string sigArgName = GetMangledTypeName(signature[i]); + if (_mangleForCplusPlus) + sigArgName = sigArgName.Replace("::", "_"); + sb.Append(sigArgName); + } + + sb.Append(ExitNameScopeSequence); + + return sb.ToUtf8String(); + } + private Utf8String GetPrefixMangledMethodName(IPrefixMangledMethod prefixMangledMetod) { Utf8StringBuilder sb = new Utf8StringBuilder(); @@ -491,6 +526,10 @@ namespace ILCompiler { utf8MangledName = GetPrefixMangledTypeName((IPrefixMangledType)method); } + else if (method is IPrefixMangledSignature) + { + utf8MangledName = GetPrefixMangledSignatureName((IPrefixMangledSignature)method); + } else { // Assume that Name is unique for all other methods |