diff --git a/pykd/dbgtype.cpp b/pykd/dbgtype.cpp index 91706fd..66c0f64 100644 --- a/pykd/dbgtype.cpp +++ b/pykd/dbgtype.cpp @@ -112,17 +112,34 @@ getTypeClass( const std::string &moduleName, const std::string &typeName ) boost::python::object loadTypedVarList( ULONG64 address, const std::string &moduleName, const std::string &typeName, const std::string &listEntryName ) { - ULONG64 entryAddress = 0; + address = addr64(address); - boost::python::list objList; + ULONG64 entryAddress = 0; - address = addr64(address); - for( entryAddress = loadPtrByPtr( address ); entryAddress != address && entryAddress != NULL; entryAddress = loadPtrByPtr( entryAddress ) ) + const TypeInfo& typeInfo = TypeInfo::get( moduleName, typeName ); + + boost::python::list objList; + + for ( TypeInfo::TypeFieldList::const_iterator field = typeInfo.getFields().begin(); field != typeInfo.getFields().end(); field++ ) { - objList.append( containingRecord( entryAddress, moduleName, typeName, listEntryName ) ); + if ( field->name == listEntryName ) + { + if ( field->type.name() == ( typeName + "*" ) ) + { + for( entryAddress = loadPtrByPtr( address ); entryAddress != address && entryAddress != NULL; entryAddress = loadPtrByPtr( entryAddress + field->offset ) ) + objList.append( loadTypedVar( moduleName, typeName, entryAddress ) ); + } + else + { + for( entryAddress = loadPtrByPtr( address ); entryAddress != address && entryAddress != NULL; entryAddress = loadPtrByPtr( entryAddress ) ) + objList.append( containingRecord( entryAddress, moduleName, typeName, listEntryName ) ); + } + + return objList; + } } - return objList; + return boost::python::object(); } ///////////////////////////////////////////////////////////////////////////////// @@ -130,14 +147,14 @@ loadTypedVarList( ULONG64 address, const std::string &moduleName, const std::str boost::python::object loadTypedVarArray( ULONG64 address, const std::string &moduleName, const std::string &typeName, long number ) { - boost::python::dict objArr; + boost::python::list objList; const TypeInfo& typeInfo = TypeInfo::get( moduleName, typeName ); for( long i = 0; i < number; ++i ) - objArr[i] = loadTypedVar( moduleName, typeName, address + i * typeInfo.size() ); + objList.append( loadTypedVar( moduleName, typeName, address + i * typeInfo.size() ) ); - return objArr; + return objList; } ///////////////////////////////////////////////////////////////////////////////// @@ -396,12 +413,12 @@ TypeInfo::load( ULONG64 addr, ULONG offset /* = 0 */ ) const } else { - boost::python::dict arr; + boost::python::list arr; for ( unsigned int i = 0; i < field->size / field->type.size(); ++i ) { const ULONG locOffset = field->offset + i * (ULONG)field->type.size(); - arr[i] = field->type.load( addr + locOffset, offset + locOffset ); + arr.append( field->type.load( addr + locOffset, offset + locOffset ) ); } var.attr( field->name.c_str() ) = arr;