diff --git a/.gitignore b/.gitignore index 944bbe0..b9aff61 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ tags cscope.out cscope.in.out cscope.po.out +*.idea/ +*.pyc diff --git a/CMakeLists.txt b/CMakeLists.txt index 82d7183..f385dc2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,8 @@ target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/lib/vectorwrapper/include ) +set(gdb_scripts_path "${CMAKE_CURRENT_SOURCE_DIR}/tools/gdb") + #add_subdirectory(lib/sprout) add_subdirectory(src) add_subdirectory(test) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c0f7cfb..1ad20f7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -25,3 +25,5 @@ target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES} ) + +configure_file(${gdb_scripts_path}/libdoorkeeper-gdb.py ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-gdb.py) diff --git a/tools/gdb/libdoorkeeper-gdb.py b/tools/gdb/libdoorkeeper-gdb.py new file mode 100644 index 0000000..235f47b --- /dev/null +++ b/tools/gdb/libdoorkeeper-gdb.py @@ -0,0 +1,6 @@ +import sys; +sys.path.append("@gdb_scripts_path@"); + +import libdoorkeeper; + +libdoorkeeper.register_printers(gdb.current_objfile()); diff --git a/tools/gdb/libdoorkeeper.py b/tools/gdb/libdoorkeeper.py new file mode 100644 index 0000000..faf94f4 --- /dev/null +++ b/tools/gdb/libdoorkeeper.py @@ -0,0 +1,37 @@ +import gdb; +import re; + +class VectorWrapperPrinter: + def __init__(self, parVal): + self.val = parVal + + def to_string(self): + sz = int(self.val["m_wrapped"].type.template_argument(1)); + arr_vals = ", ".join(str(self.val["m_wrapped"]["_M_elems"][z]) for z in range(0, sz)); + return "<{0}>".format(arr_vals); + +def vector_wrapper_match(parVal): + tag_value = str(parVal.type.strip_typedefs().tag); + if tag_value == None: + return None; + + reg_vecbase = re.compile("^vwr::implem::VecBase<.*>$"); + reg_vec = re.compile("^vwr::Vec<.*>$"); + if reg_vecbase.match(tag_value) or reg_vec.match(tag_value): + return VectorWrapperPrinter(parVal); + else: + return None; + +def display_hint(self): + return "array"; + +def register_printers(parObjfile): + parObjfile.pretty_printers.append(vector_wrapper_match); + +# (gdb) p parFrom +# $1 = (const dk::Viewport<2u>::coords &) @0x7fffffffb810: { >> = {m_wrapped = {_M_elems = {0, +# 0}}}, , 2u>> = {, true>> = {}, }, static unit_x = , static unit_y = } + +# (gdb) p parFrom +# $1 = (const dk::Viewport<2u>::coords &) @0x7fffffffb810: { >> = +# {0, 0}, , 2u>> = {, true>> = {}, }, static unit_x = , static unit_y = }