diff --git a/sources/libClangSharp/ClangSharp.cpp b/sources/libClangSharp/ClangSharp.cpp index 3a134e7f..41c96de3 100644 --- a/sources/libClangSharp/ClangSharp.cpp +++ b/sources/libClangSharp/ClangSharp.cpp @@ -4693,23 +4693,50 @@ CXCursor clangsharp_Cursor_getVBase(CXCursor C, unsigned i) { return clang_getNullCursor(); } -int64_t clangsharp_Cursor_getVtblIdx(CXCursor C) { +namespace { + int64_t getVtblIdx(const GlobalDecl& d) + { + const CXXMethodDecl* CMD = static_cast(d.getDecl()); + if (VTableContextBase::hasVtableSlot(CMD)) { + VTableContextBase* VTC = CMD->getASTContext().getVTableContext(); + + if (MicrosoftVTableContext* MSVTC = dyn_cast(VTC)) { + MethodVFTableLocation ML = MSVTC->getMethodVFTableLocation(d); + return ML.Index; + } + + if (ItaniumVTableContext* IVTC = dyn_cast(VTC)) { + return IVTC->getMethodVTableIndex(d); + } + } + + return -1; + } +} + +int64_t clangsharp_Cursor_getDtorVtblIdx(CXCursor C, CX_DestructorType dtor) +{ if (isDeclOrTU(C.kind)) { const Decl* D = getCursorDecl(C); - if (const CXXMethodDecl* CMD = dyn_cast(D)) { - if (VTableContextBase::hasVtableSlot(CMD)) { - VTableContextBase* VTC = getASTUnit(getCursorTU(C))->getASTContext().getVTableContext(); + if (const CXXDestructorDecl* CMD = dyn_cast(D)) { + return getVtblIdx(GlobalDecl(CMD, dtor)); + } + } + return -1; +} - if (MicrosoftVTableContext* MSVTC = dyn_cast(VTC)) { - MethodVFTableLocation ML = MSVTC->getMethodVFTableLocation(CMD); - return ML.Index; - } +int64_t clangsharp_Cursor_getVtblIdx(CXCursor C) { + if (isDeclOrTU(C.kind)) { + const Decl* D = getCursorDecl(C); - if (ItaniumVTableContext* IVTC = dyn_cast(VTC)) { - return IVTC->getMethodVTableIndex(CMD); - } + if (const CXXMethodDecl* CMD = dyn_cast(D)) { + int64_t dtorIdx = clangsharp_Cursor_getDtorVtblIdx(C, Deleting); + if (dtorIdx != -1) { + return dtorIdx; } + + return getVtblIdx(CMD); } } diff --git a/sources/libClangSharp/ClangSharp.h b/sources/libClangSharp/ClangSharp.h index 9a018a99..5363f35d 100644 --- a/sources/libClangSharp/ClangSharp.h +++ b/sources/libClangSharp/ClangSharp.h @@ -202,6 +202,13 @@ enum CX_VariableCaptureKind { CX_VCK_VLAType = clang::CapturedStmt::VCK_VLAType + 1 }; +enum CX_DestructorType { + Deleting = clang::Dtor_Deleting, + Complete = clang::Dtor_Complete, + Base = clang::Dtor_Base, + Comdat = clang::Dtor_Comdat +}; + struct CX_TemplateArgument { CXTemplateArgumentKind kind; int xdata; @@ -722,6 +729,8 @@ CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getUsedContext(CXCursor C); CLANGSHARP_LINKAGE CXCursor clangsharp_Cursor_getVBase(CXCursor C, unsigned i); +CLANGSHARP_LINKAGE int64_t clangsharp_Cursor_getDtorVtblIdx(CXCursor C, CX_DestructorType dtor); + CLANGSHARP_LINKAGE int64_t clangsharp_Cursor_getVtblIdx(CXCursor C); CLANGSHARP_LINKAGE void clangsharp_TemplateArgument_dispose(CX_TemplateArgument T);