func CForwardDeclaration10(bi *gi.BaseInfo) { switch bi.Type() { case gi.INFO_TYPE_OBJECT: cctype := CTypeForInterface(bi, TypeNone) printf("typedef struct _%s %s;\n", cctype, cctype) case gi.INFO_TYPE_FLAGS, gi.INFO_TYPE_ENUM: ei := gi.ToEnumInfo(bi) printf("typedef %s %s;\n", CTypeForTag(ei.StorageType(), TypeNone), CTypeForInterface(bi, TypeNone)) case gi.INFO_TYPE_STRUCT, gi.INFO_TYPE_INTERFACE, gi.INFO_TYPE_UNION: fullnm := strings.ToLower(bi.Namespace()) + "." + bi.Name() cctype := CTypeForInterface(bi, TypeNone) if _, ok := GConfig.Sys.DisguisedTypes[fullnm]; ok { printf("typedef void *%s;\n", cctype) } else { printf("typedef struct _%s %s;\n", cctype, cctype) } case gi.INFO_TYPE_CALLBACK: ctype := CTypeForInterface(bi, TypeNone) // type doesn't matter here, it's just a pointer after all printf("typedef void* %s;\n", ctype) // also generate wrapper declarations printf("extern void _%s_c_wrapper();\n", ctype) printf("extern void _%s_c_wrapper_once();\n", ctype) } }
func SimpleCgoType(ti *gi.TypeInfo, flags TypeFlags) string { tag := ti.Tag() switch tag { case gi.TYPE_TAG_VOID: if ti.IsPointer() { return "unsafe.Pointer" } panic("Non-pointer void type is not supported") case gi.TYPE_TAG_INTERFACE: bi := ti.Interface() switch bi.Type() { case gi.INFO_TYPE_ENUM, gi.INFO_TYPE_FLAGS: ei := gi.ToEnumInfo(bi) return GoTypeForTag(ei.StorageType(), flags|TypeExact) case gi.INFO_TYPE_STRUCT: ns := bi.Namespace() nm := bi.Name() fullnm := strings.ToLower(ns) + "." + nm if _, ok := GConfig.Sys.DisguisedTypes[fullnm]; ok { return "unsafe.Pointer" } } } if !strings.HasPrefix(CgoType(ti, flags), "*") { return GoTypeForTag(tag, flags|TypeExact) } return "unsafe.Pointer" }
func simple_cgo_type(ti *gi.TypeInfo, flags type_flags) string { tag := ti.Tag() switch tag { case gi.TYPE_TAG_VOID: if ti.IsPointer() { return "unsafe.Pointer" } panic("Non-pointer void type is not supported") case gi.TYPE_TAG_INTERFACE: bi := ti.Interface() switch bi.Type() { case gi.INFO_TYPE_ENUM, gi.INFO_TYPE_FLAGS: ei := gi.ToEnumInfo(bi) return go_type_for_tag(ei.StorageType(), flags|type_exact) case gi.INFO_TYPE_STRUCT: ns := bi.Namespace() nm := bi.Name() fullnm := strings.ToLower(ns) + "." + nm if config.is_disguised(fullnm) { return "unsafe.Pointer" } } } if !strings.HasPrefix(cgo_type(ti, flags), "*") { return go_type_for_tag(tag, flags|type_exact) } return "unsafe.Pointer" }
func (this *binding_generator) c_forward_declaration10(bi *gi.BaseInfo) { p := printer_to(this.out_h) switch bi.Type() { case gi.INFO_TYPE_OBJECT: cctype := c_type_for_interface(bi, type_none) p("typedef struct _%s %s;\n", cctype, cctype) case gi.INFO_TYPE_FLAGS, gi.INFO_TYPE_ENUM: ei := gi.ToEnumInfo(bi) p("typedef %s %s;\n", c_type_for_tag(ei.StorageType(), type_none), c_type_for_interface(bi, type_none)) case gi.INFO_TYPE_STRUCT, gi.INFO_TYPE_INTERFACE, gi.INFO_TYPE_UNION: fullnm := strings.ToLower(bi.Namespace()) + "." + bi.Name() cctype := c_type_for_interface(bi, type_none) if config.is_disguised(fullnm) { p("typedef void *%s;\n", cctype) } else { p("typedef struct _%s %s;\n", cctype, cctype) } case gi.INFO_TYPE_CALLBACK: pc := printer_to(this.out_c) ctype := c_type_for_interface(bi, type_none) // type doesn't matter here, it's just a pointer after all p("typedef void* %s;\n", ctype) // and wrapper declarations for .c file only (cgo has problems // with that) pc("extern void _%s_c_wrapper();\n", ctype) pc("extern void _%s_c_wrapper_once();\n", ctype) } }
func (this *binding_generator) process_base_info(bi *gi.BaseInfo) { p := printer_to(&this.go_bindings) if config.is_object_blacklisted(bi) { p("// blacklisted: %s (%s)\n", bi.Name(), bi.Type()) return } switch bi.Type() { case gi.INFO_TYPE_UNION: this.process_union_info(gi.ToUnionInfo(bi)) case gi.INFO_TYPE_STRUCT: this.process_struct_info(gi.ToStructInfo(bi)) case gi.INFO_TYPE_ENUM, gi.INFO_TYPE_FLAGS: this.process_enum_info(gi.ToEnumInfo(bi)) case gi.INFO_TYPE_CONSTANT: this.process_constant_info(gi.ToConstantInfo(bi)) case gi.INFO_TYPE_CALLBACK: this.process_callback_info(gi.ToCallableInfo(bi)) case gi.INFO_TYPE_FUNCTION: this.process_function_info(gi.ToFunctionInfo(bi)) case gi.INFO_TYPE_INTERFACE: this.process_interface_info(gi.ToInterfaceInfo(bi)) case gi.INFO_TYPE_OBJECT: this.process_object_info(gi.ToObjectInfo(bi)) default: p("// TODO: %s (%s)\n", bi.Name(), bi.Type()) } }
func ProcessBaseInfo(bi *gi.BaseInfo) { switch bi.Type() { case gi.INFO_TYPE_UNION: if IsBlacklisted("unions", bi.Name()) { goto blacklisted } ProcessUnionInfo(gi.ToUnionInfo(bi)) case gi.INFO_TYPE_STRUCT: if IsBlacklisted("structs", bi.Name()) { goto blacklisted } ProcessStructInfo(gi.ToStructInfo(bi)) case gi.INFO_TYPE_ENUM, gi.INFO_TYPE_FLAGS: if IsBlacklisted("enums", bi.Name()) { goto blacklisted } ProcessEnumInfo(gi.ToEnumInfo(bi)) case gi.INFO_TYPE_CONSTANT: if IsBlacklisted("constants", bi.Name()) { goto blacklisted } ProcessConstantInfo(gi.ToConstantInfo(bi)) case gi.INFO_TYPE_CALLBACK: if IsBlacklisted("callbacks", bi.Name()) { goto blacklisted } ProcessCallbackInfo(gi.ToCallableInfo(bi)) case gi.INFO_TYPE_FUNCTION: if IsBlacklisted("functions", bi.Name()) { goto blacklisted } ProcessFunctionInfo(gi.ToFunctionInfo(bi), nil) case gi.INFO_TYPE_INTERFACE: if IsBlacklisted("interfaces", bi.Name()) { goto blacklisted } ProcessInterfaceInfo(gi.ToInterfaceInfo(bi)) case gi.INFO_TYPE_OBJECT: if IsBlacklisted("objects", bi.Name()) { goto blacklisted } ProcessObjectInfo(gi.ToObjectInfo(bi)) default: printf("// TODO: %s (%s)\n", bi.Name(), bi.Type()) } return blacklisted: printf("// blacklisted: %s (%s)\n", bi.Name(), bi.Type()) }
func TypeSizeForInterface(bi *gi.BaseInfo, flags TypeFlags) int { ptrsize := int(unsafe.Sizeof(unsafe.Pointer(nil))) if flags&TypePointer != 0 { return ptrsize } switch t := bi.Type(); t { case gi.INFO_TYPE_OBJECT, gi.INFO_TYPE_INTERFACE: return ptrsize case gi.INFO_TYPE_STRUCT: si := gi.ToStructInfo(bi) return si.Size() case gi.INFO_TYPE_UNION: ui := gi.ToUnionInfo(bi) return ui.Size() case gi.INFO_TYPE_ENUM, gi.INFO_TYPE_FLAGS: ei := gi.ToEnumInfo(bi) return TypeSizeForTag(ei.StorageType(), flags) case gi.INFO_TYPE_CALLBACK: return ptrsize } panic("unreachable: " + bi.Type().String()) }