func CForwardDeclaration30(bi *gi.BaseInfo) { fullnm := strings.ToLower(bi.Namespace()) + "." + bi.Name() switch bi.Type() { case gi.INFO_TYPE_STRUCT: si := gi.ToStructInfo(bi) size := si.Size() if _, ok := GConfig.Sys.DisguisedTypes[fullnm]; ok { return } cctype := CTypeForInterface(bi, TypeNone) if size == 0 { printf("struct _%s {};\n", cctype) } else { printf("struct _%s { uint8_t _data[%d]; };\n", cctype, size) } case gi.INFO_TYPE_UNION: ui := gi.ToUnionInfo(bi) size := ui.Size() cctype := CTypeForInterface(bi, TypeNone) if size == 0 { printf("struct _%s {};\n", cctype) } else { printf("struct _%s { uint8_t _data[%d]; };\n", cctype, size) } } }
func (this *binding_generator) c_forward_declaration30(bi *gi.BaseInfo) { p := printer_to(this.out_h) fullnm := strings.ToLower(bi.Namespace()) + "." + bi.Name() switch bi.Type() { case gi.INFO_TYPE_STRUCT: si := gi.ToStructInfo(bi) size := si.Size() if config.is_disguised(fullnm) { return } cctype := c_type_for_interface(bi, type_none) if size == 0 { p("struct _%s {};\n", cctype) } else { p("struct _%s { uint8_t _data[%d]; };\n", cctype, size) } case gi.INFO_TYPE_UNION: ui := gi.ToUnionInfo(bi) size := ui.Size() cctype := c_type_for_interface(bi, type_none) if size == 0 { p("struct _%s {};\n", cctype) } else { p("struct _%s { uint8_t _data[%d]; };\n", cctype, size) } } }
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 (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 CgoToGoForInterface(bi *gi.BaseInfo, arg1, arg2 string, flags ConvFlags) string { var out bytes.Buffer printf := PrinterTo(&out) switch bi.Type() { case gi.INFO_TYPE_OBJECT, gi.INFO_TYPE_INTERFACE: gotype := GoTypeForInterface(bi, TypeReturn) if flags&ConvOwnEverything != 0 { printf("%s = (*%s)(%sObjectWrap(unsafe.Pointer(%s), false))", arg2, gotype, Config.Sys.GNS, arg1) } else { printf("%s = (*%s)(%sObjectWrap(unsafe.Pointer(%s), true))", arg2, gotype, Config.Sys.GNS, arg1) } case gi.INFO_TYPE_ENUM, gi.INFO_TYPE_FLAGS: gotype := GoTypeForInterface(bi, TypeReturn) printf("%s = %s(%s)", arg2, gotype, arg1) case gi.INFO_TYPE_STRUCT, gi.INFO_TYPE_UNION: ns := bi.Namespace() if ns == "cairo" { printf(CairoCgoToGoForInterface(bi, arg1, arg2, flags)) break } fullnm := strings.ToLower(ns) + "." + bi.Name() gotype := GoTypeForInterface(bi, TypeReturn) if flags&ConvListMember != 0 { printf("%s = *(*%s)(unsafe.Pointer(%s))", arg2, gotype, arg1) break } if _, ok := GConfig.Sys.DisguisedTypes[fullnm]; ok { printf("%s = %s{unsafe.Pointer(%s)}", arg2, gotype, arg1) break } if flags&ConvPointer != 0 { printf("%s = (*%s)(unsafe.Pointer(%s))", arg2, gotype, arg1) } else { printf("%s = *(*%s)(unsafe.Pointer(&%s))", arg2, gotype, arg1) } } return out.String() }
func c_type_for_interface(bi *gi.BaseInfo, flags type_flags) string { var out bytes.Buffer ns := bi.Namespace() nm := bi.Name() fullnm := strings.ToLower(ns) + "." + nm out.WriteString(gi.DefaultRepository().CPrefix(ns)) out.WriteString(bi.Name()) if flags&type_pointer != 0 && !config.is_disguised(fullnm) { out.WriteString("*") } return out.String() }
func CTypeForInterface(bi *gi.BaseInfo, flags TypeFlags) string { var out bytes.Buffer ns := bi.Namespace() nm := bi.Name() fullnm := strings.ToLower(ns) + "." + nm out.WriteString(gi.DefaultRepository().CPrefix(ns)) out.WriteString(bi.Name()) _, disguised := GConfig.Sys.DisguisedTypes[fullnm] if flags&TypePointer != 0 && !disguised { out.WriteString("*") } return out.String() }
func cgo_type_for_interface(bi *gi.BaseInfo, flags type_flags) string { var out bytes.Buffer switch bi.Type() { case gi.INFO_TYPE_CALLBACK: out.WriteString("unsafe.Pointer") default: ns := bi.Namespace() nm := bi.Name() fullnm := strings.ToLower(ns) + "." + nm if flags&type_pointer != 0 && !config.is_disguised(fullnm) { out.WriteString("*") } out.WriteString("C.") out.WriteString(gi.DefaultRepository().CPrefix(ns)) out.WriteString(bi.Name()) } return out.String() }
func CgoTypeForInterface(bi *gi.BaseInfo, flags TypeFlags) string { var out bytes.Buffer switch bi.Type() { case gi.INFO_TYPE_CALLBACK: out.WriteString("unsafe.Pointer") default: ns := bi.Namespace() nm := bi.Name() fullnm := strings.ToLower(ns) + "." + nm _, disguised := GConfig.Sys.DisguisedTypes[fullnm] if flags&TypePointer != 0 && !disguised { out.WriteString("*") } out.WriteString("C.") out.WriteString(gi.DefaultRepository().CPrefix(ns)) out.WriteString(bi.Name()) } return out.String() }
func GoToCgoForInterface(bi *gi.BaseInfo, arg0, arg1 string, flags ConvFlags) string { var out bytes.Buffer printf := PrinterTo(&out) switch bi.Type() { case gi.INFO_TYPE_OBJECT: prefix := gi.DefaultRepository().CPrefix(bi.Namespace()) printf("if %s != nil {\n", arg0) printf("\t%s = %s.InheritedFrom%s%s()\n", arg1, arg0, prefix, bi.Name()) printf("}") case gi.INFO_TYPE_ENUM, gi.INFO_TYPE_FLAGS: ctype := CgoTypeForInterface(bi, TypeNone) printf("%s = %s(%s)", arg1, ctype, arg0) case gi.INFO_TYPE_INTERFACE: prefix := gi.DefaultRepository().CPrefix(bi.Namespace()) printf("if %s != nil {\n", arg0) printf("\t%s = %s.Implements%s%s()", arg1, arg0, prefix, bi.Name()) printf("}") case gi.INFO_TYPE_STRUCT: ns := bi.Namespace() if ns == "cairo" { printf(CairoGoToCgoForInterface(bi, arg0, arg1, flags)) break } fullnm := strings.ToLower(ns) + "." + bi.Name() if _, ok := GConfig.Sys.DisguisedTypes[fullnm]; ok { flags &^= ConvPointer } ctype := CgoTypeForInterface(bi, TypeNone) if flags&ConvPointer != 0 { printf("%s = (*%s)(unsafe.Pointer(%s))", arg1, ctype, arg0) } else { printf("%s = *(*%s)(unsafe.Pointer(&%s))", arg1, ctype, arg0) } case gi.INFO_TYPE_CALLBACK: printf("if %s != nil {\n", arg0) printf("\t%s = unsafe.Pointer(&%s)", arg1, arg0) printf("}") } return out.String() }
func GoTypeForInterface(bi *gi.BaseInfo, flags TypeFlags) string { var out bytes.Buffer printf := PrinterTo(&out) ns := bi.Namespace() fullnm := strings.ToLower(ns) + "." + bi.Name() if flags&TypeListMember != 0 { switch bi.Type() { case gi.INFO_TYPE_OBJECT, gi.INFO_TYPE_INTERFACE: return GoTypeForInterface(bi, TypePointer|TypeReturn) default: return GoTypeForInterface(bi, TypeReturn) } } switch t := bi.Type(); t { case gi.INFO_TYPE_OBJECT, gi.INFO_TYPE_INTERFACE: if flags&TypeExact != 0 { // exact type for object/interface is always an unsafe.Pointer printf("unsafe.Pointer") break } if flags&(TypeReturn|TypeReceiver) != 0 && flags&TypePointer != 0 { // receivers and return values are actual types, // and a pointer most likely printf("*") } if ns != Config.Namespace { // prepend foreign types with appropriate namespace printf("%s.", strings.ToLower(ns)) } printf(bi.Name()) if flags&(TypeReturn|TypeReceiver) == 0 { // ordinary function arguments are substituted by their *Like // counterparts printf("Like") } if flags&TypeReceiver != 0 && t == gi.INFO_TYPE_INTERFACE { // special case for interfaces, we use *Impl structures // as receivers printf("Impl") } case gi.INFO_TYPE_CALLBACK: if flags&TypeExact != 0 { printf("unsafe.Pointer") break } goto handle_default case gi.INFO_TYPE_STRUCT: if ns == "cairo" { printf(CairoGoTypeForInterface(bi, flags)) break } goto handle_default default: goto handle_default } return out.String() handle_default: _, disguised := GConfig.Sys.DisguisedTypes[fullnm] if flags&TypePointer != 0 && !disguised { printf("*") } if ns != Config.Namespace { printf("%s.", strings.ToLower(ns)) } printf(bi.Name()) return out.String() }
func go_type_for_interface(bi *gi.BaseInfo, flags type_flags) string { var out bytes.Buffer printf := printer_to(&out) ns := bi.Namespace() fullnm := strings.ToLower(ns) + "." + bi.Name() if flags&type_list_member != 0 { switch bi.Type() { case gi.INFO_TYPE_OBJECT, gi.INFO_TYPE_INTERFACE: return go_type_for_interface(bi, type_pointer|type_return) default: return go_type_for_interface(bi, type_return) } } switch t := bi.Type(); t { case gi.INFO_TYPE_OBJECT, gi.INFO_TYPE_INTERFACE: if flags&type_exact != 0 { // exact type for object/interface is always an unsafe.Pointer printf("unsafe.Pointer") break } if flags&(type_return|type_receiver) != 0 && flags&type_pointer != 0 { // receivers and return values are actual types, // and a pointer most likely printf("*") } if ns != config.namespace { // prepend foreign types with appropriate namespace printf("%s.", strings.ToLower(ns)) } printf(bi.Name()) if flags&(type_return|type_receiver) == 0 { // ordinary function arguments are substituted by their *Like // counterparts printf("Like") } if flags&type_receiver != 0 && t == gi.INFO_TYPE_INTERFACE { // special case for interfaces, we use *Impl structures // as receivers printf("Impl") } case gi.INFO_TYPE_CALLBACK: if flags&type_exact != 0 { printf("unsafe.Pointer") break } goto handle_default case gi.INFO_TYPE_STRUCT: if ns == "cairo" { printf(cairo_go_type_for_interface(bi, flags)) break } goto handle_default default: goto handle_default } return out.String() handle_default: if flags&type_pointer != 0 && !config.is_disguised(fullnm) { printf("*") } if ns != config.namespace { printf("%s.", strings.ToLower(ns)) } printf(bi.Name()) return out.String() }