def _get_target_with_struct_hack(self, name): """ because we rename "struct x" to struct_x, we have to reverse that """ target = util.get_cursor(self.parser.tu, name) if target is None: target = util.get_cursor(self.parser.tu, name.replace('struct_', '')) if target is None: target = util.get_cursor(self.parser.tu, name.replace('union_', '')) return target
def make_ctypes_convertor(self, _flags): """ Fix clang types to ctypes convertion for this parsing isntance. Some architecture dependent size types ahve to be changed if the target architecture is not the same as local """ tu = util.get_tu(''' typedef short short_t; typedef int int_t; typedef long long_t; typedef long long longlong_t; typedef float float_t; typedef double double_t; typedef long double longdouble_t; typedef void* pointer_t;''', flags=_flags) size = util.get_cursor(tu, 'short_t').type.get_size() * 8 self.ctypes_typename[TypeKind.SHORT] = 'c_int%d' % (size) self.ctypes_typename[TypeKind.USHORT] = 'c_uint%d' % (size) self.ctypes_sizes[TypeKind.SHORT] = size self.ctypes_sizes[TypeKind.USHORT] = size size = util.get_cursor(tu, 'int_t').type.get_size() * 8 self.ctypes_typename[TypeKind.INT] = 'c_int%d' % (size) self.ctypes_typename[TypeKind.UINT] = 'c_uint%d' % (size) self.ctypes_sizes[TypeKind.INT] = size self.ctypes_sizes[TypeKind.UINT] = size size = util.get_cursor(tu, 'long_t').type.get_size() * 8 self.ctypes_typename[TypeKind.LONG] = 'c_int%d' % (size) self.ctypes_typename[TypeKind.ULONG] = 'c_uint%d' % (size) self.ctypes_sizes[TypeKind.LONG] = size self.ctypes_sizes[TypeKind.ULONG] = size size = util.get_cursor(tu, 'longlong_t').type.get_size() * 8 self.ctypes_typename[TypeKind.LONGLONG] = 'c_int%d' % (size) self.ctypes_typename[TypeKind.ULONGLONG] = 'c_uint%d' % (size) self.ctypes_sizes[TypeKind.LONGLONG] = size self.ctypes_sizes[TypeKind.ULONGLONG] = size # FIXME : Float && http://en.wikipedia.org/wiki/Long_double size0 = util.get_cursor(tu, 'float_t').type.get_size() * 8 size1 = util.get_cursor(tu, 'double_t').type.get_size() * 8 size2 = util.get_cursor(tu, 'longdouble_t').type.get_size() * 8 # 2014-01 stop generating crap. # 2015-01 reverse until better solution is found # the idea is that a you cannot assume a c_double will be same format as a c_long_double. # at least this pass size TU if size1 != size2: self.ctypes_typename[TypeKind.LONGDOUBLE] = 'c_long_double_t' else: self.ctypes_typename[TypeKind.LONGDOUBLE] = 'c_double' self.ctypes_sizes[TypeKind.FLOAT] = size0 self.ctypes_sizes[TypeKind.DOUBLE] = size1 self.ctypes_sizes[TypeKind.LONGDOUBLE] = size2 # save the target pointer size. size = util.get_cursor(tu, 'pointer_t').type.get_size() * 8 self.ctypes_sizes[TypeKind.POINTER] = size self.ctypes_sizes[TypeKind.NULLPTR] = size log.debug('ARCH sizes: long:%s longdouble:%s', self.ctypes_typename[TypeKind.LONG], self.ctypes_typename[TypeKind.LONGDOUBLE]) return