Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
kdlibcpp
kdlibcpp
Commits
cddc3864
Commit
cddc3864
authored
Sep 29, 2019
by
ussrhero
Browse files
added SymbolProvider class
parent
c897cd07
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
127 additions
and
44 deletions
+127
-44
kdlib/include/kdlib/typeinfo.h
kdlib/include/kdlib/typeinfo.h
+13
-4
kdlib/source/clang/clang.cpp
kdlib/source/clang/clang.cpp
+22
-7
kdlib/source/clang/clang.h
kdlib/source/clang/clang.h
+31
-4
kdlib/source/dia/diaload.cpp
kdlib/source/dia/diaload.cpp
+49
-25
kdlib/source/win/dbgmgr.cpp
kdlib/source/win/dbgmgr.cpp
+1
-1
kdlib/tests/kdlibtest/clangtest.cpp
kdlib/tests/kdlibtest/clangtest.cpp
+11
-3
No files found.
kdlib/include/kdlib/typeinfo.h
View file @
cddc3864
...
...
@@ -189,20 +189,29 @@ public:
virtual
TypeInfoPtr
Next
()
=
0
;
};
class
SymbolProvider
;
typedef
boost
::
shared_ptr
<
SymbolProvider
>
SymbolProviderPtr
;
class
SymbolEnumerator
;
typedef
boost
::
shared_ptr
<
SymbolEnumerator
>
SymbolEnumeratorPtr
;
class
SymbolProvider
{
public:
virtual
SymbolEnumeratorPtr
getSymbolEnumerator
(
const
std
::
wstring
&
mask
=
L""
)
=
0
;
};
class
SymbolEnumerator
{
public:
virtual
std
::
wstring
Next
()
=
0
;
};
typedef
boost
::
shared_ptr
<
SymbolEnumerator
>
SymbolEnumeratorPtr
;
TypeInfoProviderPtr
getTypeInfoProviderFromSource
(
const
std
::
wstring
&
source
,
const
std
::
wstring
&
opts
=
L""
);
TypeInfoProviderPtr
getTypeInfoProviderFromSource
(
const
std
::
string
&
source
,
const
std
::
string
&
opts
=
""
);
TypeInfoProviderPtr
getTypeInfoProviderFromPdb
(
const
std
::
wstring
&
pdbFile
,
MEMOFFSET_64
loadBase
=
0
);
TypeInfoProviderPtr
getDefaultTypeInfoProvider
();
Symbol
Enumerato
rPtr
getSymbol
Enumerato
rFromSource
(
const
std
::
wstring
&
source
,
const
std
::
wstring
&
opts
=
L""
);
Symbol
Enumerato
rPtr
getSymbol
Enumerato
rFromSource
(
const
std
::
string
&
source
,
const
std
::
string
&
opts
=
""
);
Symbol
Provide
rPtr
getSymbol
Provide
rFromSource
(
const
std
::
wstring
&
source
,
const
std
::
wstring
&
opts
=
L""
);
Symbol
Provide
rPtr
getSymbol
Provide
rFromSource
(
const
std
::
string
&
source
,
const
std
::
string
&
opts
=
""
);
///////////////////////////////////////////////////////////////////////////////
...
...
kdlib/source/clang/clang.cpp
View file @
cddc3864
...
...
@@ -907,7 +907,7 @@ TypeInfoProviderPtr getTypeInfoProviderFromSource(const std::string& source, c
///////////////////////////////////////////////////////////////////////////////
Symbol
Enumerato
rClang
::
Symbol
Enumerato
rClang
(
const
std
::
string
&
sourceCode
,
const
std
::
string
&
compileOptions
)
Symbol
Provide
rClang
::
Symbol
Provide
rClang
(
const
std
::
string
&
sourceCode
,
const
std
::
string
&
compileOptions
)
{
std
::
vector
<
std
::
unique_ptr
<
ASTUnit
>>
ASTs
;
ASTBuilderAction
Action
(
ASTs
);
...
...
@@ -963,26 +963,41 @@ SymbolEnumeratorClang::SymbolEnumeratorClang(const std::string& sourceCode, con
///////////////////////////////////////////////////////////////////////////////
SymbolEnumeratorPtr
SymbolProviderClang
::
getSymbolEnumerator
(
const
std
::
wstring
&
mask
)
{
return
SymbolEnumeratorPtr
(
new
SymbolEnumeratorClang
(
mask
,
shared_from_this
()));
}
///////////////////////////////////////////////////////////////////////////////
std
::
wstring
SymbolEnumeratorClang
::
Next
()
{
if
(
m_index
<
m_symbols
.
size
())
return
strToWStr
(
m_symbols
[
m_index
++
]);
const
auto
&
symbols
=
m_symbolProvider
->
m_symbols
;
while
(
m_index
<
symbols
.
size
())
{
const
auto
&
sym
=
symbols
[
m_index
++
];
if
(
m_mask
.
empty
()
||
fnmatch
(
m_mask
,
sym
))
return
strToWStr
(
sym
);
}
return
L""
;
return
std
::
wstring
();
}
///////////////////////////////////////////////////////////////////////////////
Symbol
Enumerato
rPtr
getSymbol
Enumerato
rFromSource
(
const
std
::
wstring
&
source
,
const
std
::
wstring
&
opts
)
Symbol
Provide
rPtr
getSymbol
Provide
rFromSource
(
const
std
::
wstring
&
source
,
const
std
::
wstring
&
opts
)
{
return
Symbol
Enumerato
rPtr
(
new
Symbol
Enumerato
rClang
(
wstrToStr
(
source
),
wstrToStr
(
opts
)
)
);
return
Symbol
Provide
rPtr
(
new
Symbol
Provide
rClang
(
wstrToStr
(
source
),
wstrToStr
(
opts
)
)
);
}
///////////////////////////////////////////////////////////////////////////////
Symbol
Enumerato
rPtr
getSymbol
Enumerato
rFromSource
(
const
std
::
string
&
source
,
const
std
::
string
&
opts
)
Symbol
Provide
rPtr
getSymbol
Provide
rFromSource
(
const
std
::
string
&
source
,
const
std
::
string
&
opts
)
{
return
Symbol
Enumerato
rPtr
(
new
Symbol
Enumerato
rClang
(
source
,
opts
));
return
Symbol
Provide
rPtr
(
new
Symbol
Provide
rClang
(
source
,
opts
));
}
///////////////////////////////////////////////////////////////////////////////
...
...
kdlib/source/clang/clang.h
View file @
cddc3864
...
...
@@ -400,12 +400,37 @@ private:
};
class
SymbolEnumeratorClang
:
public
SymbolEnumerator
,
public
boost
::
enable_shared_from_this
<
SymbolEnumeratorClang
>
class
SymbolEnumeratorClang
;
class
SymbolProviderClang
:
public
SymbolProvider
,
public
boost
::
enable_shared_from_this
<
SymbolProviderClang
>
{
public:
friend
SymbolEnumeratorClang
;
SymbolProviderClang
(
const
std
::
string
&
sourceCode
,
const
std
::
string
&
compileOptions
);
private:
SymbolEnumeratorPtr
getSymbolEnumerator
(
const
std
::
wstring
&
mask
=
L""
)
override
;
ClangASTSessionPtr
m_astSession
;
std
::
vector
<
std
::
string
>
m_symbols
;
};
class
SymbolEnumeratorClang
:
public
SymbolEnumerator
{
public:
SymbolEnumeratorClang
(
const
std
::
string
&
sourceCode
,
const
std
::
string
&
compileOptions
);
SymbolEnumeratorClang
(
const
std
::
wstring
&
mask
,
const
boost
::
shared_ptr
<
SymbolProviderClang
>&
clangProvider
)
:
m_symbolProvider
(
clangProvider
),
m_index
(
0
),
m_mask
(
wstrToStr
(
mask
))
{}
private:
...
...
@@ -413,9 +438,11 @@ private:
private:
size_t
m_index
=
0
;
size_t
m_index
;
std
::
vector
<
std
::
string
>
m_symbols
;
std
::
string
m_mask
;
boost
::
shared_ptr
<
SymbolProviderClang
>
m_symbolProvider
;
};
}
kdlib/source/dia/diaload.cpp
View file @
cddc3864
...
...
@@ -53,22 +53,6 @@ static SymbolSessionPtr createSession(
do
{
hres
=
dataSource
.
CoCreateInstance
(
__uuidof
(
DiaSource
),
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
hres
=
dataSource
.
CoCreateInstance
(
__uuidof
(
DiaSourceAlt
),
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
hres
=
dataSource
.
CoCreateInstance
(
MSDIA12_CLASSGUID
,
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
hres
=
dataSource
.
CoCreateInstance
(
MSDIA11_CLASSGUID
,
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
HMODULE
hModule
=
NULL
;
if
(
!
GetModuleHandleEx
(
...
...
@@ -93,23 +77,63 @@ static SymbolSessionPtr createSession(
if
(
S_OK
==
hres
)
break
;
po
s
=
fileName
.
find_last_of
(
L'\\'
);
fileName
.
replace
(
pos
,
fileName
.
length
()
-
pos
,
L"
\\
msdia120.dll"
)
;
hre
s
=
dataSource
.
CoCreateInstance
(
__uuidof
(
DiaSource
),
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
hres
=
NoRegCoCreate
(
fileName
.
c_str
(),
MSDIA12_CLASSGUID
,
__uuidof
(
I
Dia
Data
Source
),
(
void
**
)
&
dataSource
);
hres
=
dataSource
.
CoCreateInstance
(
__uuidof
(
DiaSource
Alt
),
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
po
s
=
fileName
.
find_last_of
(
L'\\'
);
fileName
.
replace
(
pos
,
fileName
.
length
()
-
pos
,
L"
\\
msdia110.dll"
)
;
hre
s
=
dataSource
.
CoCreateInstance
(
MSDIA12_CLASSGUID
,
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
hres
=
NoRegCoCreate
(
fileName
.
c_str
(),
MSDIA11_CLASSGUID
,
__uuidof
(
IDiaDataSource
),
(
void
**
)
&
dataSource
);
hres
=
dataSource
.
CoCreateInstance
(
MSDIA11_CLASSGUID
,
NULL
,
CLSCTX_INPROC_SERVER
);
if
(
S_OK
==
hres
)
break
;
throw
DiaException
(
L"Call ::CoCreateInstance"
,
hres
);
//HMODULE hModule = NULL;
//if ( !GetModuleHandleEx(
// GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
// (LPCTSTR)createSession,
// &hModule) )
// throw DiaException(L"failed to load msdia library");
//DWORD fileNameSize = 0x1000;
//
//std::vector<wchar_t> fileNameBuffer(fileNameSize);
//GetModuleFileNameW(hModule, &fileNameBuffer[0], fileNameSize);
//std::wstring fileName(&fileNameBuffer[0], fileNameSize);
//size_t pos = fileName.find_last_of(L'\\');
//fileName.replace(pos, fileName.length() - pos, L"\\msdia140.dll");
//hres = NoRegCoCreate(fileName.c_str(), MSDIA14_CLASSGUID, __uuidof(IDiaDataSource), (void**)&dataSource);
//if (S_OK == hres)
// break;
//pos = fileName.find_last_of(L'\\');
//fileName.replace(pos, fileName.length() - pos, L"\\msdia120.dll");
//hres = NoRegCoCreate(fileName.c_str(), MSDIA12_CLASSGUID, __uuidof(IDiaDataSource), (void**)&dataSource);
//if (S_OK == hres)
// break;
//pos = fileName.find_last_of(L'\\');
//fileName.replace(pos, fileName.length() - pos, L"\\msdia110.dll");
//hres = NoRegCoCreate(fileName.c_str(), MSDIA11_CLASSGUID, __uuidof(IDiaDataSource), (void**)&dataSource);
//if (S_OK == hres)
// break;
//throw DiaException(L"Call ::CoCreateInstance", hres);
}
while
(
FALSE
);
...
...
kdlib/source/win/dbgmgr.cpp
View file @
cddc3864
...
...
@@ -83,7 +83,7 @@ DebugManager::~DebugManager()
client
->
SetOutputCallbacks
(
NULL
);
CoUninitialize
();
//
CoUninitialize();
}
///////////////////////////////////////////////////////////////////////////////
...
...
kdlib/tests/kdlibtest/clangtest.cpp
View file @
cddc3864
...
...
@@ -568,7 +568,7 @@ TEST_F(ClangTest, EnumFuncNames)
}; \
"
;
SymbolEnumeratorPtr
symEnum
=
getSymbol
Enumerato
rFromSource
(
srcCode
);
auto
symEnum
=
getSymbol
Provide
rFromSource
(
srcCode
)
->
getSymbolEnumerator
()
;
std
::
wstring
symbol
;
std
::
vector
<
std
::
wstring
>
symbols
;
...
...
@@ -613,8 +613,16 @@ TEST_F(ClangTest, Func)
EXPECT_EQ
(
L"Void(__cdecl)()"
,
compileType
(
srcCode
,
L"func1"
)
->
getName
());
EXPECT_EQ
(
L"Int4B(__cdecl)()"
,
compileType
(
srcCode
,
L"func2<2>"
)
->
getName
());
EXPECT_EQ
(
L"Char(__cdecl)()"
,
compileType
(
srcCode
,
L"testns::func3"
)
->
getName
());
EXPECT_EQ
(
L"Void(__cdecl testcls::)(Int4B)"
,
compileType
(
srcCode
,
L"testcls::method"
)
->
getName
());
EXPECT_EQ
(
L"Void(__cdecl testcls1<int>::)()"
,
compileType
(
srcCode
,
L"testcls1<int>::method"
)
->
getName
());
if
(
kdlib
::
is64bitSystem
())
{
EXPECT_EQ
(
L"Void(__cdecl testcls::)(Int4B)"
,
compileType
(
srcCode
,
L"testcls::method"
)
->
getName
());
EXPECT_EQ
(
L"Void(__cdecl testcls1<int>::)()"
,
compileType
(
srcCode
,
L"testcls1<int>::method"
)
->
getName
());
}
else
{
EXPECT_EQ
(
L"Void(__thiscall testcls::)(Int4B)"
,
compileType
(
srcCode
,
L"testcls::method"
)
->
getName
());
EXPECT_EQ
(
L"Void(__thiscall testcls1<int>::)()"
,
compileType
(
srcCode
,
L"testcls1<int>::method"
)
->
getName
());
}
EXPECT_THROW
(
compileType
(
srcCode
,
L"func2"
),
TypeException
);
EXPECT_THROW
(
compileType
(
srcCode
,
L"func3"
),
TypeException
);
...
...
Mikhail I. Izmestev
@izmmisha
mentioned in issue
pykd/pykd#57 (closed)
·
Oct 29, 2019
mentioned in issue
pykd/pykd#57 (closed)
mentioned in issue pykd/pykd#57
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment