def dissolve(cls, flag, typeid, size):
dt = flag & cls.FF_MASKSIZE
sf = -1 if flag & idaapi.FF_SIGN == idaapi.FF_SIGN else +1
if dt == idaapi.FF_STRU and isinstance(typeid,six.integer_types):
# FIXME: figure out how to fix this recursive module dependency
t = sys.modules.get('structure', __import__('structure')).instance(typeid)
sz = t.size
return t if sz == size else [t,size // sz]
if dt not in cls.inverted:
logging.warn("{:s}.dissolve({!r}, {!r}, {!r}) : Unable to identify a pythonic type.".format('.'.join(('internal',__name__,cls.__name__)), dt, typeid, size))
t,sz = cls.inverted[dt]
# if the type and size are the same, then it's a string or pointer type
if not isinstance(sz,six.integer_types):
count = size // idaapi.get_data_elsize(idaapi.BADADDR, dt, idaapi.opinfo_t())
return [t,count] if count > 1 else t
# if the size matches, then we assume it's a single element
elif sz == size:
return t,(sz*sf)
# otherwise it's an array
return [(t,sz*sf),size // sz]
评论列表
文章目录