1
0
Fork 0

Generate typed public constructors for nullable string and borrowing cases

This commit is contained in:
Brendan Szymanski 2026-07-21 17:49:38 -04:00
parent 4f1016f682
commit d6fabd56ed
12 changed files with 601 additions and 1280 deletions

View file

@ -40,6 +40,8 @@ public enum MarshalIn: Equatable, Sendable {
case boolToGboolean case boolToGboolean
/// Convert `String` to a C string (`withCString` / `utf8` pointer). /// Convert `String` to a C string (`withCString` / `utf8` pointer).
case stringToC case stringToC
/// Convert `[String]` to a NULL-terminated C `char **`.
case stringArrayToC
/// Access the underlying pointer of an object or interface wrapper. /// Access the underlying pointer of an object or interface wrapper.
case objectPointer case objectPointer
/// Access the underlying pointer of an interface-typed wrapper (a /// Access the underlying pointer of an interface-typed wrapper (a
@ -811,13 +813,24 @@ public struct ParameterPlan: Equatable, Sendable {
/// For callback-box params: the C arg index of the separate DestroyNotify /// For callback-box params: the C arg index of the separate DestroyNotify
/// parameter. `nil` when none. /// parameter. `nil` when none.
public let destroyIndex: Int? public let destroyIndex: Int?
/// When set, this C param is a synthesized array length (argc); its value is
/// `<name>.count` and it is omitted from the Swift signature.
public let synthesizedLengthOf: String?
public init(swiftName: String, cArgIndex: Int, mapping: Mapping, public init(swiftName: String, cArgIndex: Int, mapping: Mapping,
isInstanceParameter: Bool = false, isOutParameter: Bool = false, isInstanceParameter: Bool = false, isOutParameter: Bool = false,
closureIndex: Int? = nil, destroyIndex: Int? = nil) { closureIndex: Int? = nil, destroyIndex: Int? = nil,
synthesizedLengthOf: String? = nil) {
self.swiftName = swiftName; self.cArgIndex = cArgIndex self.swiftName = swiftName; self.cArgIndex = cArgIndex
self.mapping = mapping; self.isInstanceParameter = isInstanceParameter self.mapping = mapping; self.isInstanceParameter = isInstanceParameter
self.isOutParameter = isOutParameter self.isOutParameter = isOutParameter
self.closureIndex = closureIndex; self.destroyIndex = destroyIndex self.closureIndex = closureIndex; self.destroyIndex = destroyIndex
self.synthesizedLengthOf = synthesizedLengthOf
} }
} }
extension Mapping {
/// Maps a `[String]` parameter to a NULL-terminated C `char **` array.
static let stringArrayMapping = Mapping(
swiftType: "[String]", cSwiftType: "UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>?",
marshalIn: .stringArrayToC, marshalOut: .unsupported(reason: "C array return not yet bridged"))
}

View file

@ -347,6 +347,37 @@ private func renderSupport(moduleName: String, dependencyModules: [String] = [],
func _rawPointer(_ p: OpaquePointer) -> UnsafeMutableRawPointer { func _rawPointer(_ p: OpaquePointer) -> UnsafeMutableRawPointer {
UnsafeMutableRawPointer(p) UnsafeMutableRawPointer(p)
} }
/// Copies a transfer-full C string into a Swift `String` and frees the source.
@inline(__always)
func _takeString(_ p: UnsafeMutablePointer<CChar>!) -> String {
defer { g_free(p) }
return String(cString: p)
}
/// Copies a nullable transfer-full C string, freeing the source; `nil` in `nil` out.
@inline(__always)
func _takeStringIfPresent(_ p: UnsafeMutablePointer<CChar>?) -> String? {
guard let p else { return nil }
defer { g_free(p) }
return String(cString: p)
}
/// Bridges an optional `String?` to a C `const char *`, passing `nil` when absent.
@inline(__always)
func _withOptionalCString<R>(_ s: String?, _ body: (UnsafePointer<CChar>?) throws -> R) rethrows -> R {
guard let s else { return try body(nil) }
return try s.withCString(body)
}
/// Bridges a `[String]` to a NULL-terminated C `char **`, freeing the copies after `body`.
@inline(__always)
func _withStringArray<R>(_ strings: [String], _ body: (UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>?) throws -> R) rethrows -> R {
var cStrings: [UnsafeMutablePointer<CChar>?] = strings.map { g_strdup($0) }
cStrings.append(nil)
defer { for p in cStrings { g_free(p) } }
return try cStrings.withUnsafeMutableBufferPointer { try body($0.baseAddress) }
}
\(glibError)\(gtypeConstants)\(closureBoxSupport)\(signalSupport)\(primitiveShims) \(glibError)\(gtypeConstants)\(closureBoxSupport)\(signalSupport)\(primitiveShims)
""" """
} }
@ -523,7 +554,7 @@ private func renderRecord(_ plan: RecordPlan) -> String {
if let doc = plan.doc { if let doc = plan.doc {
lines.append(contentsOf: renderDocComment(doc)) lines.append(contentsOf: renderDocComment(doc))
} }
lines.append("public final class \(plan.name) {") lines.append("@MainActor public final class \(plan.name) {")
lines.append(" @_spi(SGTKInternal) public let pointer: UnsafeMutableRawPointer") lines.append(" @_spi(SGTKInternal) public let pointer: UnsafeMutableRawPointer")
lines.append("") lines.append("")
if plan.freeFunction != nil { if plan.freeFunction != nil {
@ -635,10 +666,10 @@ private func renderInterface(_ plan: InterfacePlan) -> String {
// `Self: \(classPrereq)` (a class-typed prerequisite), so the Ref // `Self: \(classPrereq)` (a class-typed prerequisite), so the Ref
// must literally subclass it inheriting its pointer storage, // must literally subclass it inheriting its pointer storage,
// inits, and deinit rather than declaring its own. // inits, and deinit rather than declaring its own.
lines.append("public final class \(plan.name)Ref: \(classPrereq), @MainActor \(plan.name) {") lines.append("@MainActor public final class \(plan.name)Ref: \(classPrereq), @MainActor \(plan.name) {")
lines.append("}") lines.append("}")
} else { } else {
lines.append("public final class \(plan.name)Ref: @MainActor \(plan.name) {") lines.append("@MainActor public final class \(plan.name)Ref: @MainActor \(plan.name) {")
lines.append(" @_spi(SGTKInternal) public let pointer: UnsafeMutableRawPointer") lines.append(" @_spi(SGTKInternal) public let pointer: UnsafeMutableRawPointer")
lines.append("") lines.append("")
lines.append(" @_spi(SGTKInternal) public init(retaining pointer: UnsafeMutableRawPointer) {") lines.append(" @_spi(SGTKInternal) public init(retaining pointer: UnsafeMutableRawPointer) {")
@ -685,7 +716,7 @@ private func renderClass(_ plan: ClassPlan) -> String {
} else { } else {
parentDecl = "" parentDecl = ""
} }
lines.append("\(access) class \(plan.name)\(parentDecl) {") lines.append("@MainActor \(access) class \(plan.name)\(parentDecl) {")
let isRoot = plan.parent == nil let isRoot = plan.parent == nil
@ -700,7 +731,7 @@ private func renderClass(_ plan: ClassPlan) -> String {
let needsInits = isRoot || !plan.isAbstract let needsInits = isRoot || !plan.isAbstract
if needsInits { if needsInits {
let initModifier = isRoot ? "" : "@_spi(SGTKInternal) public override " let initModifier = isRoot ? "" : "@_spi(SGTKInternal) public "
// takingOwnership init // takingOwnership init
if isRoot { if isRoot {
@ -938,7 +969,7 @@ private func renderSignalConnect(_ plan: SignalPlan, className: String) -> [Stri
return lines return lines
} }
private func swiftSignature(_ plan: CallablePlan) -> String { private func swiftSignature(_ plan: CallablePlan) -> String {
plan.parameters.filter { !$0.isInstanceParameter && !$0.isOutParameter }.map { param in plan.parameters.filter { !$0.isInstanceParameter && !$0.isOutParameter && $0.synthesizedLengthOf == nil }.map { param in
let typeStr: String let typeStr: String
if param.mapping.category == .callback { if param.mapping.category == .callback {
typeStr = "@escaping \(param.mapping.swiftType)" typeStr = "@escaping \(param.mapping.swiftType)"
@ -949,6 +980,19 @@ private func swiftSignature(_ plan: CallablePlan) -> String {
}.joined(separator: ", ") }.joined(separator: ", ")
} }
/// How a string/array parameter is wrapped for the C call.
private enum CWrapKind { case plain, optional, array }
/// Generates the closure opener for a string/array parameter: `withCString`,
/// `_withOptionalCString`, or `_withStringArray`.
private func cWrapOpener(_ cName: String, _ swiftName: String, _ kind: CWrapKind) -> String {
switch kind {
case .plain: return "\(swiftName).withCString { \(cName) in"
case .optional: return "_withOptionalCString(\(swiftName)) { \(cName) in"
case .array: return "_withStringArray(\(swiftName)) { \(cName) in"
}
}
/// Builds the C call: the C-function-call string with each argument marshalled, /// Builds the C call: the C-function-call string with each argument marshalled,
/// plus the string parameters that must be wrapped in `withCString`. The /// plus the string parameters that must be wrapped in `withCString`. The
/// instance parameter if any is passed as `self.pointer`. /// instance parameter if any is passed as `self.pointer`.
@ -956,13 +1000,11 @@ private func swiftSignature(_ plan: CallablePlan) -> String {
/// Callback-box parameters: the data pointer replaces the closure arg at the /// Callback-box parameters: the data pointer replaces the closure arg at the
/// callback's cArgIndex, and also replaces any separate user-data slot /// callback's cArgIndex, and also replaces any separate user-data slot
/// identified by `closureIndex`. /// identified by `closureIndex`.
private func cArguments(_ plan: CallablePlan, error: Bool = false) -> (cCall: String, stringParams: [(cName: String, swiftName: String)]) { private func cArguments(_ plan: CallablePlan, error: Bool = false) -> (cCall: String, stringParams: [(cName: String, swiftName: String, kind: CWrapKind)]) {
var stringParams: [(cName: String, swiftName: String)] = [] var stringParams: [(cName: String, swiftName: String, kind: CWrapKind)] = []
var cArgExprs: [String] = [] var cArgExprs: [String] = []
var outIndex = 0 var outIndex = 0
// Build map: closureIndex -> callback data ptr name, so separate user-data
// params get replaced with the box pointer.
var closureDataMap: [Int: String] = [:] var closureDataMap: [Int: String] = [:]
for p in plan.parameters { for p in plan.parameters {
if case .callbackBox(_, _) = p.mapping.marshalIn, let ci = p.closureIndex { if case .callbackBox(_, _) = p.mapping.marshalIn, let ci = p.closureIndex {
@ -977,9 +1019,16 @@ private func cArguments(_ plan: CallablePlan, error: Bool = false) -> (cCall: St
outIndex += 1 outIndex += 1
} else if param.isInstanceParameter { } else if param.isInstanceParameter {
cArgExprs.append("_instancePointer(self.pointer)") cArgExprs.append("_instancePointer(self.pointer)")
} else if let arrName = param.synthesizedLengthOf {
cArgExprs.append("numericCast(\(arrName).count)")
} else if param.mapping.marshalIn == .stringToC { } else if param.mapping.marshalIn == .stringToC {
let cName = "cString\(stringParams.count)" let cName = "cString\(stringParams.count)"
stringParams.append((cName: cName, swiftName: param.swiftName)) let kind: CWrapKind = param.mapping.swiftType.hasSuffix("?") ? .optional : .plain
stringParams.append((cName: cName, swiftName: param.swiftName, kind: kind))
cArgExprs.append(cName)
} else if param.mapping.marshalIn == .stringArrayToC {
let cName = "cArray\(stringParams.count)"
stringParams.append((cName: cName, swiftName: param.swiftName, kind: .array))
cArgExprs.append(cName) cArgExprs.append(cName)
} else if let dataPtrName = closureDataMap[param.cArgIndex], !isCallbackBox(param) { } else if let dataPtrName = closureDataMap[param.cArgIndex], !isCallbackBox(param) {
cArgExprs.append(dataPtrName) cArgExprs.append(dataPtrName)
@ -1071,11 +1120,10 @@ private func outParamInitValue(_ param: ParameterPlan) -> String {
case .enumRaw, .bitfieldRaw: case .enumRaw, .bitfieldRaw:
return ".init(rawValue: 0)" return ".init(rawValue: 0)"
default: default:
return "nil" return "UnsafeMutablePointer<Int8>?"
} }
} }
/// Generates the expression that converts an out-param's C value to Swift.
/// `varName` is the local variable after the C call filled it in. /// `varName` is the local variable after the C call filled it in.
private func outParamValueExpr(_ param: ParameterPlan, varName: String) -> String { private func outParamValueExpr(_ param: ParameterPlan, varName: String) -> String {
switch param.mapping.marshalOut { switch param.mapping.marshalOut {
@ -1086,11 +1134,10 @@ private func outParamValueExpr(_ param: ParameterPlan, varName: String) -> Strin
case .gbooleanToBool: case .gbooleanToBool:
return "\(varName) != 0" return "\(varName) != 0"
case .stringCopy(let free, _): case .stringCopy(let free, _):
let note = ""
if param.mapping.swiftType.hasSuffix("?") { if param.mapping.swiftType.hasSuffix("?") {
return "\(varName).map { String(cString: $0) }\(note)" return free ? "_takeStringIfPresent(\(varName))" : "\(varName).map { String(cString: $0) }"
} }
return "String(cString: \(varName)!)\(note)" return free ? "_takeString(\(varName))" : "String(cString: \(varName)!)"
case .enumFromRaw(let swiftType): case .enumFromRaw(let swiftType):
return "\(swiftType)(rawValue: numericCast(\(varName).rawValue))!" return "\(swiftType)(rawValue: numericCast(\(varName).rawValue))!"
case .bitfieldFromRaw(let swiftType): case .bitfieldFromRaw(let swiftType):
@ -1189,7 +1236,7 @@ private func renderMultiStatementBody(_ plan: CallablePlan, indent: String) -> [
var scope = indent var scope = indent
for sp in stringParams { for sp in stringParams {
let openerPrefix = plan.throwsError ? "return try " : "return " let openerPrefix = plan.throwsError ? "return try " : "return "
lines.append("\(scope)\(openerPrefix)\(sp.swiftName).withCString { \(sp.cName) in") lines.append("\(scope)\(openerPrefix)\(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " " scope += " "
} }
for ld in localDecls { for ld in localDecls {
@ -1219,7 +1266,7 @@ private func renderCallExpression(_ plan: CallablePlan) -> String {
let (cCall, stringParams) = cArguments(plan) let (cCall, stringParams) = cArguments(plan)
var expr = cCall var expr = cCall
for sp in stringParams.reversed() { for sp in stringParams.reversed() {
expr = "\(sp.swiftName).withCString { \(sp.cName) in \(expr) }" expr = "\(cWrapOpener(sp.cName, sp.swiftName, sp.kind)) \(expr) }"
} }
return expr return expr
} }
@ -1269,7 +1316,7 @@ private func renderCallBody(_ plan: CallablePlan, indent: String) -> [String] {
var scope = indent var scope = indent
let openerPrefix = hasReturn ? "return " : "" let openerPrefix = hasReturn ? "return " : ""
for sp in stringParams { for sp in stringParams {
lines.append("\(scope)\(openerPrefix)\(sp.swiftName).withCString { \(sp.cName) in") lines.append("\(scope)\(openerPrefix)\(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " " scope += " "
} }
for stmt in setupStmts { for stmt in setupStmts {
@ -1331,7 +1378,7 @@ private func renderThrowingBody(_ plan: CallablePlan, indent: String) -> [String
var lines: [String] = [] var lines: [String] = []
var scope = indent var scope = indent
for sp in stringParams { for sp in stringParams {
lines.append("\(scope)return try \(sp.swiftName).withCString { \(sp.cName) in") lines.append("\(scope)return try \(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " " scope += " "
} }
for stmt in setupStmts { for stmt in setupStmts {
@ -1419,8 +1466,9 @@ private func renderStaticFunction(_ plan: CallablePlan) -> [String] {
} }
/// Renders a constructor as a `convenience init`. The C constructor's returned /// Renders a constructor as a `convenience init`. The C constructor's returned
/// instance pointer is adopted through the designated `init(takingOwnership:)`, /// instance pointer is adopted through the designated `init(takingOwnership:)`
/// which sinks a floating reference for `InitiallyUnowned` descendants. /// or `init(retaining:)`, depending on the GIR `transfer-ownership` annotation
/// on the constructor's return value.
private func renderConstructor(_ plan: CallablePlan) -> [String] { private func renderConstructor(_ plan: CallablePlan) -> [String] {
var lines: [String] = [] var lines: [String] = []
if let doc = plan.doc { lines.append(contentsOf: renderDocComment(doc).map { " \($0)" }) } if let doc = plan.doc { lines.append(contentsOf: renderDocComment(doc).map { " \($0)" }) }
@ -1441,14 +1489,14 @@ private func renderConstructor(_ plan: CallablePlan) -> [String] {
lines.append("\(indent)var error: UnsafeMutablePointer<GError>? = nil") lines.append("\(indent)var error: UnsafeMutablePointer<GError>? = nil")
lines.append("\(indent)let _ptr = \(cCall)") lines.append("\(indent)let _ptr = \(cCall)")
lines.append(contentsOf: errorCheck) lines.append(contentsOf: errorCheck)
lines.append("\(indent)self.init(takingOwnership: _rawPointer(_ptr!))") lines.append("\(indent)\(ownInitCall(plan, "_rawPointer(_ptr!)"))")
} else { } else {
lines.append("\(indent)var error: UnsafeMutablePointer<GError>? = nil") lines.append("\(indent)var error: UnsafeMutablePointer<GError>? = nil")
var scope = indent var scope = indent
for i in stringParams.indices { for i in stringParams.indices {
let sp = stringParams[i] let sp = stringParams[i]
let prefix = i == 0 ? "let _result = " : "" let prefix = i == 0 ? "let _result = " : ""
lines.append("\(scope)\(prefix)\(sp.swiftName).withCString { \(sp.cName) in") lines.append("\(scope)\(prefix)\(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " " scope += " "
} }
// `self.init` (a delegating initializer call) cannot be nested // `self.init` (a delegating initializer call) cannot be nested
@ -1465,17 +1513,31 @@ private func renderConstructor(_ plan: CallablePlan) -> [String] {
lines.append("\(scope)}") lines.append("\(scope)}")
} }
lines += errorCheck lines += errorCheck
lines.append("\(indent)self.init(takingOwnership: _rawPointer(_result!))") lines.append("\(indent)\(ownInitCall(plan, "_rawPointer(_result!)"))")
} }
} else { } else {
let expr = renderCallExpression(plan) let expr = renderCallExpression(plan)
lines.append(" self.init(takingOwnership: _rawPointer(\(expr)))") lines.append(" \(ownInitCall(plan, "_rawPointer(\(expr))"))")
} }
lines.append(" }") lines.append(" }")
return lines return lines
} }
/// Selects `init(takingOwnership:)` or `init(retaining:)` based on the
/// constructor's ownership annotation from GIR.
private func ownInitCall(_ plan: CallablePlan, _ pointerExpr: String) -> String {
// ownershipInit is nil for non-constructor callables; default to takingOwnership.
switch plan.ownershipInit {
case .takingOwnership?, .sinkingRef?:
return "self.init(takingOwnership: \(pointerExpr))"
case .retaining?:
return "self.init(retaining: \(pointerExpr))"
case nil:
return "self.init(takingOwnership: \(pointerExpr))"
}
}
/// Generates the argument expression for a callable parameter. /// Generates the argument expression for a callable parameter.
private func marshalCallArg(_ param: ParameterPlan) -> String { private func marshalCallArg(_ param: ParameterPlan) -> String {
switch param.mapping.marshalIn { switch param.mapping.marshalIn {
@ -1498,6 +1560,8 @@ private func marshalCallArg(_ param: ParameterPlan) -> String {
return "\(param.swiftName) ? 1 : 0" return "\(param.swiftName) ? 1 : 0"
case .stringToC: case .stringToC:
return param.swiftName return param.swiftName
case .stringArrayToC:
return param.swiftName
case .objectPointer, .interfacePointer: case .objectPointer, .interfacePointer:
return pointerArg(param) return pointerArg(param)
case .boxedPointer: case .boxedPointer:
@ -1533,11 +1597,14 @@ private func marshalReturn(_ cCall: String, mapping: Mapping) -> String {
return "numericCast(\(cCall))" return "numericCast(\(cCall))"
case .gbooleanToBool: case .gbooleanToBool:
return "\(cCall) != 0" return "\(cCall) != 0"
case .stringCopy(_, _): case .stringCopy(let free, _):
if mapping.swiftType.hasSuffix("?") { let optional = mapping.swiftType.hasSuffix("?")
return "\(cCall).map { String(cString: $0) }" switch (free, optional) {
case (true, false): return "_takeString(\(cCall))"
case (true, true): return "_takeStringIfPresent(\(cCall))"
case (false, false): return "String(cString: \(cCall))"
case (false, true): return "\(cCall).map { String(cString: $0) }"
} }
return "String(cString: \(cCall))"
case .objectWrap: case .objectWrap:
let isOptional = mapping.swiftType.hasSuffix("?") let isOptional = mapping.swiftType.hasSuffix("?")
let baseType = isOptional ? String(mapping.swiftType.dropLast()) : mapping.swiftType let baseType = isOptional ? String(mapping.swiftType.dropLast()) : mapping.swiftType
@ -1724,8 +1791,24 @@ private func gvalueSetterBody(swiftType: String, girName: String,
"g_value_unset(&gvalue)", "g_value_unset(&gvalue)",
] ]
} }
private func renderDocComment(_ text: String) -> [String] { private func renderDocComment(_ text: String) -> [String] {
text.components(separatedBy: "\n").map { "/// \($0)" } convertGtkDocToDocC(text).components(separatedBy: "\n").map { "/// \($0)" }
}
/// Converts raw gtk-doc markup to DocC-compatible Markdown:
/// - `|[<!-- language="C" -->` fences code blocks
/// - `#Type`, `%CONST`, `@param` `` `backtick` `` references
/// - `%TRUE`, `%FALSE`, `%NULL` `` `true` ``, `` `false` ``, `` `nil` ``
private func convertGtkDocToDocC(_ text: String) -> String {
var s = text
s = s.replacing(/\|\[(<!--.*?-->)?/, with: "```")
s = s.replacing(/\]\|/, with: "```")
s = s.replacingOccurrences(of: "%TRUE", with: "`true`")
s = s.replacingOccurrences(of: "%FALSE", with: "`false`")
s = s.replacingOccurrences(of: "%NULL", with: "`nil`")
s = s.replacing(/[#%@]([A-Za-z_][A-Za-z0-9_]*)/) { "`\($0.1)`" }
return s
} }
/// Converts a raw GIR bitfield value string to a Swift `UInt32` literal. /// Converts a raw GIR bitfield value string to a Swift `UInt32` literal.

View file

@ -77,7 +77,7 @@ public func planModules(
// labels AND types, a different selector, no relation to include). // labels AND types, a different selector, no relation to include).
func methodSignature(_ m: CallablePlan) -> String { func methodSignature(_ m: CallablePlan) -> String {
let params = m.parameters let params = m.parameters
.filter { !$0.isInstanceParameter && !$0.isOutParameter } .filter { !$0.isInstanceParameter && !$0.isOutParameter && $0.synthesizedLengthOf == nil }
.map { "\($0.swiftName):\($0.mapping.swiftType)" } .map { "\($0.swiftName):\($0.mapping.swiftType)" }
.joined(separator: ",") .joined(separator: ",")
return "\(m.name)|throws:\(m.throwsError)|(\(params))" return "\(m.name)|throws:\(m.throwsError)|(\(params))"
@ -350,7 +350,7 @@ private func planNamespace(_ ns: Namespace, context: MapContext) -> ModulePlan {
private func signatureKey(_ plan: CallablePlan) -> String { private func signatureKey(_ plan: CallablePlan) -> String {
let retType = plan.returnMapping?.swiftType ?? "Void" let retType = plan.returnMapping?.swiftType ?? "Void"
let params = plan.parameters let params = plan.parameters
.filter { !$0.isInstanceParameter && !$0.isOutParameter } .filter { !$0.isInstanceParameter && !$0.isOutParameter && $0.synthesizedLengthOf == nil }
.map { "\($0.swiftName):\($0.mapping.swiftType)" } .map { "\($0.swiftName):\($0.mapping.swiftType)" }
.joined(separator: ",") .joined(separator: ",")
return "throws:\(plan.throwsError)|ret:\(retType)|(\(params))" return "throws:\(plan.throwsError)|ret:\(retType)|(\(params))"
@ -606,7 +606,7 @@ private let knownMissingCFunctions: Set<String> = [
"g_settings_backend_changed", "g_settings_backend_changed_tree", "g_settings_backend_changed", "g_settings_backend_changed_tree",
"g_settings_backend_get_default", "g_settings_backend_path_changed", "g_settings_backend_get_default", "g_settings_backend_path_changed",
"g_settings_backend_path_writable_changed", "g_settings_backend_writable_changed", "g_settings_backend_path_writable_changed", "g_settings_backend_writable_changed",
"g_null_settings_backend_new", "g_memory_settings_backend_new", "g_null_settings_backend_new", "g_memory_settings_backend_new", "g_keyfile_settings_backend_new",
// Declared in <gio/gnetworking.h>, likewise excluded from <gio/gio.h>. // Declared in <gio/gnetworking.h>, likewise excluded from <gio/gio.h>.
"g_networking_init", "g_networking_init",
// Declared in the GdkPixbuf GIR but not exported through the public // Declared in the GdkPixbuf GIR but not exported through the public
@ -1438,11 +1438,29 @@ func planConstructor(_ ctor: Constructor, className: String, descendsIU: Bool, c
reason: .constructorOutParams, reason: .constructorOutParams,
detail: "out-param constructors are not expressible as Swift init")) detail: "out-param constructors are not expressible as Swift init"))
} }
// Derive ownership from the GIR return's transfer-ownership annotation.
// Most GObject _new constructors return transfer-ownership="full"
// (or a floating reference for InitiallyUnowned descendants). A
// transfer-ownership="none" return indicates a borrowed reference,
// which the convenience init must wrap via init(retaining:) instead
// of init(takingOwnership:).
//
// CRITICAL: descendsIU takes precedence over the GIR annotation because
// most widget constructors declare transfer-ownership="none" even though
// they return a *floating* reference that must be sunk, not borrowed.
let ownership: OwnershipInit
if descendsIU {
ownership = .sinkingRef
} else if ctor.returnValue.transferOwnership == .none {
ownership = .retaining
} else {
ownership = .takingOwnership
}
return .success(CallablePlan( return .success(CallablePlan(
name: swiftFunctionName(ctor.name), cIdentifier: ctor.cIdentifier, name: swiftFunctionName(ctor.name), cIdentifier: ctor.cIdentifier,
parameters: paramPlans, returnMapping: nil, parameters: paramPlans, returnMapping: nil,
isStatic: false, isConstructor: true, isStatic: false, isConstructor: true,
ownershipInit: descendsIU ? .sinkingRef : .takingOwnership, ownershipInit: ownership,
throwsError: ctor.throwsGError, doc: ctor.doc)) throwsError: ctor.throwsGError, doc: ctor.doc))
} }
@ -1456,6 +1474,17 @@ func planParameters(
// These are plain gpointer params that would otherwise fail the pointer // These are plain gpointer params that would otherwise fail the pointer
// check the callback-box mechanism handles them. // check the callback-box mechanism handles them.
let closureTargets = Set(parameters.compactMap(\.closureIndex)) let closureTargets = Set(parameters.compactMap(\.closureIndex))
// Pre-scan length parameters for C arrays of strings (e.g. argc for argv).
// Map the length param's position to the array's Swift name.
let hasInstance = parameters.contains(where: \.isInstanceParameter)
var lengthElision: [Int: String] = [:]
for p in parameters {
if case .cArray(let el, let info) = p.type,
el == .string || el == .filename,
let li = info.lengthParameterIndex {
lengthElision[li + (hasInstance ? 1 : 0)] = swiftParameterName(p.name)
}
}
for (index, param) in parameters.enumerated() { for (index, param) in parameters.enumerated() {
// The instance parameter is always `self` passed as `self.pointer`, // The instance parameter is always `self` passed as `self.pointer`,
// never type-checked (its type is the enclosing class, which is a // never type-checked (its type is the enclosing class, which is a
@ -1532,6 +1561,23 @@ func planParameters(
return .skip(SkipEntry(symbol: "", cIdentifier: nil, return .skip(SkipEntry(symbol: "", cIdentifier: nil,
reason: .inoutParameter, detail: "'\(param.name)' has direction=inout")) reason: .inoutParameter, detail: "'\(param.name)' has direction=inout"))
} }
// Intercept length params (argc) synthesize from array's count.
if let arrName = lengthElision[index] {
plans.append(ParameterPlan(
swiftName: swiftParameterName(param.name), cArgIndex: index,
mapping: Mapping(swiftType: "Int", cSwiftType: "", marshalIn: .direct, marshalOut: .direct),
synthesizedLengthOf: arrName))
continue
}
// Intercept C arrays of strings with a known length param [String].
if case .cArray(let el, let info) = param.type,
el == .string || el == .filename, info.lengthParameterIndex != nil {
plans.append(ParameterPlan(
swiftName: swiftParameterName(param.name), cArgIndex: index,
mapping: .stringArrayMapping))
continue
}
// Map the type // Map the type
let mappingResult = Result { try map(param.type, nullable: param.isNullable, let mappingResult = Result { try map(param.type, nullable: param.isNullable,
@ -1550,11 +1596,6 @@ func planParameters(
} }
let isString = paramMapping.marshalIn == .stringToC let isString = paramMapping.marshalIn == .stringToC
// A nullable string needs an optional-aware bridge; deferred.
if isString && paramMapping.swiftType.hasSuffix("?") {
return .skip(SkipEntry(symbol: "", cIdentifier: nil,
reason: .unknownType, detail: "parameter '\(param.name)' is a nullable string"))
}
// Only a single-level `const gchar*` input string can be bridged // Only a single-level `const gchar*` input string can be bridged
// from an immutable Swift `String` via `withCString`. A mutable // from an immutable Swift `String` via `withCString`. A mutable
// `gchar*` is a caller-allocated output buffer, and a `gchar**` // `gchar*` is a caller-allocated output buffer, and a `gchar**`

View file

@ -62,8 +62,8 @@ struct InterfaceSignalGenerationTests {
// pattern as class signals) this is the D4.2 regression check: // pattern as class signals) this is the D4.2 regression check:
// the previous implementation planned interface signals but the // the previous implementation planned interface signals but the
// renderer silently dropped them. // renderer silently dropped them.
#expect(source.contains("@_cdecl(\"_trampoline_GObject_Clickable_clicked\")")) #expect(source.contains("@_cdecl(\"_trampolineGObjectClickableClicked\")"))
#expect(source.contains("nonisolated func _trampoline_GObject_Clickable_clicked(")) #expect(source.contains("nonisolated func _trampolineGObjectClickableClicked("))
#expect(source.contains("MainActor.assumeIsolated")) #expect(source.contains("MainActor.assumeIsolated"))
} }

View file

@ -107,7 +107,7 @@ struct PropertyGenerationTests {
#expect(skips.isEmpty) #expect(skips.isEmpty)
#expect(plan.properties.count == 1) #expect(plan.properties.count == 1)
#expect(source.contains("public var length: Int32")) #expect(source.contains("public var length: Int32"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_INT)")) #expect(source.contains("g_value_init(&gvalue, gTypeInt)"))
#expect(source.contains("g_value_get_int(&gvalue)")) #expect(source.contains("g_value_get_int(&gvalue)"))
#expect(source.contains("g_object_get_property(_instancePointer(pointer), \"length\", &gvalue)")) #expect(source.contains("g_object_get_property(_instancePointer(pointer), \"length\", &gvalue)"))
// Read-only: no setter. // Read-only: no setter.
@ -186,7 +186,7 @@ struct PropertyGenerationTests {
#expect(skips.isEmpty) #expect(skips.isEmpty)
#expect(plan.properties.count == 1) #expect(plan.properties.count == 1)
#expect(source.contains("public var orientation: Orientation")) #expect(source.contains("public var orientation: Orientation"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_ENUM)")) #expect(source.contains("g_value_init(&gvalue, gTypeEnum)"))
// `g_value_get_enum` returns Int32; the enum's raw value is Int, so the // `g_value_get_enum` returns Int32; the enum's raw value is Int, so the
// result MUST be numericCast a bare cast would not compile. // result MUST be numericCast a bare cast would not compile.
#expect(source.contains("Orientation(rawValue: numericCast(g_value_get_enum(&gvalue)))!")) #expect(source.contains("Orientation(rawValue: numericCast(g_value_get_enum(&gvalue)))!"))
@ -201,7 +201,7 @@ struct PropertyGenerationTests {
let (source, _, skips) = renderClass(named: "Widget", properties: [prop]) let (source, _, skips) = renderClass(named: "Widget", properties: [prop])
#expect(skips.isEmpty) #expect(skips.isEmpty)
#expect(source.contains("public var stateFlags: StateFlags")) #expect(source.contains("public var stateFlags: StateFlags"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_FLAGS)")) #expect(source.contains("g_value_init(&gvalue, gTypeFlags)"))
#expect(source.contains("StateFlags(rawValue: numericCast(g_value_get_flags(&gvalue)))")) #expect(source.contains("StateFlags(rawValue: numericCast(g_value_get_flags(&gvalue)))"))
} }
@ -215,7 +215,7 @@ struct PropertyGenerationTests {
let (source, _, skips) = renderClass(named: "Bin", properties: [prop]) let (source, _, skips) = renderClass(named: "Bin", properties: [prop])
#expect(skips.isEmpty) #expect(skips.isEmpty)
#expect(source.contains("public var child: Object")) #expect(source.contains("public var child: Object"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_OBJECT)")) #expect(source.contains("g_value_init(&gvalue, gTypeObject)"))
#expect(source.contains("Object(retaining: g_value_get_object(&gvalue))")) #expect(source.contains("Object(retaining: g_value_get_object(&gvalue))"))
} }
@ -379,7 +379,7 @@ struct PropertyGenerationTests {
if case .gvalue = plan.properties[0].getter {} else { if case .gvalue = plan.properties[0].getter {} else {
Issue.record("expected GValue fallback, got \(plan.properties[0].getter)") Issue.record("expected GValue fallback, got \(plan.properties[0].getter)")
} }
#expect(source.contains("g_value_init(&gvalue, G_TYPE_ENUM)")) #expect(source.contains("g_value_init(&gvalue, gTypeEnum)"))
#expect(source.contains("numericCast(g_value_get_enum(&gvalue))")) #expect(source.contains("numericCast(g_value_get_enum(&gvalue))"))
} }

View file

@ -367,4 +367,106 @@ struct RendererCallableTests {
#expect(!content.contains("import Foundation"), "\(name) unexpectedly imports Foundation") #expect(!content.contains("import Foundation"), "\(name) unexpectedly imports Foundation")
} }
} }
// MARK: - E3: nullable string constructor params
@Test("Constructor with nullable string parameter generates String? and _withOptionalCString")
func nullableStringConstructorParam() throws {
let klass = Class(
name: "Alert", cType: "GAlert", parent: "Object",
getTypeFunction: "g_alert_get_type",
constructors: [
Constructor(name: "new", cIdentifier: "g_alert_new",
parameters: [
Parameter(name: "message", type: .string,
cType: "const char*", isNullable: true),
],
returnValue: ReturnValue(transferOwnership: .full)),
]
)
let (plan, _) = planClass(klass, context: makeContext())
let module = ModulePlan(module: "GObject", types: [.class(plan)], skips: [],
coverage: CoverageStats())
let src = renderModule(module)["Alert.swift"] ?? ""
// The signature must show String? for the nullable string parameter.
#expect(src.contains("convenience init(message: String?)"))
// The body wraps the nullable param with _withOptionalCString.
#expect(src.contains("_withOptionalCString(message)"))
// The convenience init must NOT be SPI-gated (check the init line is not preceded by @_spi).
let initLines = src.components(separatedBy: "\n")
let convenienceLines = initLines.filter { $0.contains("convenience init") }
#expect(!convenienceLines.isEmpty, "expected a convenience init line")
for line in convenienceLines {
#expect(!line.contains("@_spi"), "convenience init should not be SPI-gated, got: \(line)")
}
// Uses takingOwnership for transfer-ownership="full".
if !src.contains("self.init(takingOwnership:") {
Issue.record("expected self.init(takingOwnership:) for transfer-ownership=full")
}
}
@Test("Constructor with mixed nullable and required string params generates correct bridging")
func constructorWithMixedNullableAndRequiredParams() throws {
let klass = Class(
name: "Dialog", cType: "GAlertDialog", parent: "Object",
getTypeFunction: "g_alert_dialog_get_type",
constructors: [
Constructor(name: "new", cIdentifier: "g_alert_dialog_new",
parameters: [
Parameter(name: "heading", type: .string,
cType: "const char*", isNullable: true),
Parameter(name: "body", type: .string,
cType: "const char*"),
],
returnValue: ReturnValue(transferOwnership: .full)),
]
)
let (plan, _) = planClass(klass, context: makeContext())
let module = ModulePlan(module: "GObject", types: [.class(plan)], skips: [],
coverage: CoverageStats())
let src = renderModule(module)["Dialog.swift"] ?? ""
// The signature must show String? for the nullable param and String for the required param.
#expect(src.contains("convenience init(heading: String?, body: String)"))
// The nullable param gets _withOptionalCString, the required param gets .withCString.
#expect(src.contains("_withOptionalCString(heading)"))
#expect(src.contains("body.withCString"))
// The convenience init line must NOT be SPI-gated (the class file has SPI-gated
// designated inits, but the convenience init itself is public).
let initLines2 = src.components(separatedBy: "\n")
let convenienceLines2 = initLines2.filter { $0.contains("convenience init") }
#expect(!convenienceLines2.isEmpty, "expected a convenience init line")
for line in convenienceLines2 {
#expect(!line.contains("@_spi"), "convenience init should not be SPI-gated, got: \(line)")
}
}
// MARK: - E3: constructor borrowing ownership
@Test("Constructor with ownership .none return generates convenience init calling self.init(retaining:)")
func constructorBorrowedReturnUsesRetaining() throws {
let klass = Class(
name: "Borrowed", cType: "GBorrowed", parent: "Object",
getTypeFunction: "g_borrowed_get_type",
constructors: [
Constructor(name: "new", cIdentifier: "g_borrowed_new",
parameters: [
Parameter(name: "name", type: .string,
cType: "const char*"),
],
returnValue: ReturnValue(transferOwnership: .none)),
]
)
let (plan, _) = planClass(klass, context: makeContext())
let module3 = ModulePlan(module: "GObject", types: [.class(plan)], skips: [],
coverage: CoverageStats())
let src = renderModule(module3)["Borrowed.swift"] ?? ""
#expect(src.contains("self.init(retaining:"), "expected self.init(retaining:) for transfer-ownership=none, got: \(src)")
#expect(!src.contains("self.init(takingOwnership:"), "should NOT use init(takingOwnership:) for transfer-ownership=none")
// The convenience init line must NOT be SPI-gated.
let initLines3 = src.components(separatedBy: "\n")
let convenienceLines3 = initLines3.filter { $0.contains("convenience init") }
for line in convenienceLines3 {
#expect(!line.contains("@_spi"), "convenience init should not be SPI-gated, got: \(line)")
}
}
} }

View file

@ -80,8 +80,8 @@ struct SignalGenerationTests {
let (source, plan, skips) = renderClass(named: "Object", signals: [notify]) let (source, plan, skips) = renderClass(named: "Object", signals: [notify])
#expect(skips.isEmpty) #expect(skips.isEmpty)
#expect(plan.signals.count == 1) #expect(plan.signals.count == 1)
#expect(source.contains("@_cdecl(\"_trampoline_GObject_Object_notify\")")) #expect(source.contains("@_cdecl(\"_trampolineGObjectObjectNotify\")"))
#expect(source.contains("nonisolated func _trampoline_GObject_Object_notify(")) #expect(source.contains("nonisolated func _trampolineGObjectObjectNotify("))
#expect(source.contains("_ instance: UnsafeMutableRawPointer")) #expect(source.contains("_ instance: UnsafeMutableRawPointer"))
#expect(source.contains("_ data: UnsafeMutableRawPointer?")) #expect(source.contains("_ data: UnsafeMutableRawPointer?"))
// Body re-enters MainActor before touching the raw pointers. // Body re-enters MainActor before touching the raw pointers.
@ -123,12 +123,12 @@ struct SignalGenerationTests {
// The destroy closure matches GClosureNotify's 2-arg C signature // The destroy closure matches GClosureNotify's 2-arg C signature
// (gpointer data, GClosure *closure) not GDestroyNotify's 1-arg form. // (gpointer data, GClosure *closure) not GDestroyNotify's 1-arg form.
#expect(source.contains("@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void")) #expect(source.contains("@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void"))
#expect(source.contains("_sgtk_destroy_notify_impl(data, nil)")) #expect(source.contains("_sgtkDestroyNotifyImpl(data, nil)"))
// The wired destroy arg is passed (non-nil) to the connect call // The wired destroy arg is passed (non-nil) to the connect call
// the D3 leak regression this test guards against. // the D3 leak regression this test guards against.
#expect(source.contains("unsafeBitCast(destroyFn as (@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void), to: UnsafeRawPointer.self)")) #expect(source.contains("unsafeBitCast(destroyFn as (@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void), to: UnsafeRawPointer.self)"))
#expect(source.contains("_sgtk_signal_connect_data(")) #expect(source.contains("_sgtkSignalConnectData("))
#expect(!source.contains("_sgtk_signal_connect_data(ptr, cName, unsafeBitCast(\\(plan.trampolineCName)")) #expect(!source.contains("_sgtkSignalConnectData(ptr, cName, unsafeBitCast(\\(plan.trampolineCName)"))
} }
@Test("Support.swift hides GLibError.init(consuming:), SignalHandle.instance/init, and _sgtk_* helpers behind @_spi(SGTKInternal)") @Test("Support.swift hides GLibError.init(consuming:), SignalHandle.instance/init, and _sgtk_* helpers behind @_spi(SGTKInternal)")
@ -143,9 +143,9 @@ struct SignalGenerationTests {
let support = renderModule(module)["Support.swift"] ?? "" let support = renderModule(module)["Support.swift"] ?? ""
#expect(support.contains("@_spi(SGTKInternal) public let instance: UnsafeMutableRawPointer")) #expect(support.contains("@_spi(SGTKInternal) public let instance: UnsafeMutableRawPointer"))
#expect(support.contains("@_spi(SGTKInternal) public init(id: UInt, instance: UnsafeMutableRawPointer)")) #expect(support.contains("@_spi(SGTKInternal) public init(id: UInt, instance: UnsafeMutableRawPointer)"))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtk_destroy_notify_impl(")) #expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtkDestroyNotifyImpl("))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtk_signal_connect_data(")) #expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtkSignalConnectData("))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtk_signal_handler_disconnect(")) #expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtkSignalHandlerDisconnect("))
// SignalHandle itself and its id/disconnect() stay plain public only // SignalHandle itself and its id/disconnect() stay plain public only
// the raw-pointer members are hidden. // the raw-pointer members are hidden.
#expect(support.contains("public struct SignalHandle {")) #expect(support.contains("public struct SignalHandle {"))

View file

@ -900,12 +900,6 @@
"reason" : "deprecatedRemoved", "reason" : "deprecatedRemoved",
"symbol" : "GLib.byte_array_unref" "symbol" : "GLib.byte_array_unref"
}, },
{
"cIdentifier" : "g_canonicalize_filename",
"detail" : "parameter 'relative_to' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.canonicalize_filename"
},
{ {
"cIdentifier" : "g_chdir", "cIdentifier" : "g_chdir",
"detail" : "C symbol 'g_chdir' is not exported by the system library", "detail" : "C symbol 'g_chdir' is not exported by the system library",
@ -1182,42 +1176,12 @@
"reason" : "deprecatedRemoved", "reason" : "deprecatedRemoved",
"symbol" : "GLib.date_valid_year" "symbol" : "GLib.date_valid_year"
}, },
{
"cIdentifier" : "g_dcgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dcgettext"
},
{
"cIdentifier" : "g_dgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dgettext"
},
{ {
"cIdentifier" : "g_dir_make_tmp", "cIdentifier" : "g_dir_make_tmp",
"detail" : "deprecatedRemoved", "detail" : "deprecatedRemoved",
"reason" : "deprecatedRemoved", "reason" : "deprecatedRemoved",
"symbol" : "GLib.dir_make_tmp" "symbol" : "GLib.dir_make_tmp"
}, },
{
"cIdentifier" : "g_dngettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dngettext"
},
{
"cIdentifier" : "g_dpgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext"
},
{
"cIdentifier" : "g_dpgettext2",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext2"
},
{ {
"cIdentifier" : "g_environ_getenv", "cIdentifier" : "g_environ_getenv",
"detail" : "parameter 'envp': C array bridging not yet implemented", "detail" : "parameter 'envp': C array bridging not yet implemented",
@ -1254,12 +1218,6 @@
"reason" : "arrayBridgingUnimplemented", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_get_contents" "symbol" : "GLib.file_get_contents"
}, },
{
"cIdentifier" : "g_file_open_tmp",
"detail" : "parameter 'tmpl' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.file_open_tmp"
},
{ {
"cIdentifier" : "g_file_set_contents", "cIdentifier" : "g_file_set_contents",
"detail" : "parameter 'contents': C array bridging not yet implemented", "detail" : "parameter 'contents': C array bridging not yet implemented",
@ -1272,12 +1230,6 @@
"reason" : "arrayBridgingUnimplemented", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_set_contents_full" "symbol" : "GLib.file_set_contents_full"
}, },
{
"cIdentifier" : "g_filename_to_uri",
"detail" : "parameter 'hostname' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.filename_to_uri"
},
{ {
"cIdentifier" : "g_fopen", "cIdentifier" : "g_fopen",
"detail" : "C symbol 'g_fopen' is not exported by the system library", "detail" : "C symbol 'g_fopen' is not exported by the system library",
@ -1584,18 +1536,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.idle_add_once" "symbol" : "GLib.idle_add_once"
}, },
{
"cIdentifier" : "g_intern_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_static_string"
},
{
"cIdentifier" : "g_intern_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_string"
},
{ {
"cIdentifier" : "g_io_add_watch", "cIdentifier" : "g_io_add_watch",
"detail" : "shadowedSymbol", "detail" : "shadowedSymbol",
@ -1662,12 +1602,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.log" "symbol" : "GLib.log"
}, },
{
"cIdentifier" : "g_log_default_handler",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_default_handler"
},
{ {
"cIdentifier" : "g_log_set_default_handler", "cIdentifier" : "g_log_set_default_handler",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -1682,8 +1616,8 @@
}, },
{ {
"cIdentifier" : "g_log_set_handler_full", "cIdentifier" : "g_log_set_handler_full",
"detail" : "parameter 'log_domain' is a nullable string", "detail" : "callback param 'log_func' deferred to Phase D4.3",
"reason" : "unknownType", "reason" : "callbackWithoutUserData",
"symbol" : "GLib.log_set_handler_full" "symbol" : "GLib.log_set_handler_full"
}, },
{ {
@ -1710,12 +1644,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.log_structured_standard" "symbol" : "GLib.log_structured_standard"
}, },
{
"cIdentifier" : "g_log_variant",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_variant"
},
{ {
"cIdentifier" : "g_log_writer_default", "cIdentifier" : "g_log_writer_default",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
@ -1724,16 +1652,10 @@
}, },
{ {
"cIdentifier" : "g_log_writer_default_set_debug_domains", "cIdentifier" : "g_log_writer_default_set_debug_domains",
"detail" : "parameter 'domains' is a nullable string", "detail" : "parameter 'domains' is not a single const input string ('const gchar* const*')",
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.log_writer_default_set_debug_domains" "symbol" : "GLib.log_writer_default_set_debug_domains"
}, },
{
"cIdentifier" : "g_log_writer_default_would_drop",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_writer_default_would_drop"
},
{ {
"cIdentifier" : "g_log_writer_format_fields", "cIdentifier" : "g_log_writer_format_fields",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
@ -1872,12 +1794,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.nullify_pointer" "symbol" : "GLib.nullify_pointer"
}, },
{
"cIdentifier" : "g_on_error_stack_trace",
"detail" : "parameter 'prg_name' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.on_error_stack_trace"
},
{ {
"cIdentifier" : "g_once_init_enter", "cIdentifier" : "g_once_init_enter",
"detail" : "deprecatedRemoved", "detail" : "deprecatedRemoved",
@ -1916,8 +1832,8 @@
}, },
{ {
"cIdentifier" : "g_parse_debug_string", "cIdentifier" : "g_parse_debug_string",
"detail" : "parameter 'string' is a nullable string", "detail" : "parameter 'keys': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.parse_debug_string" "symbol" : "GLib.parse_debug_string"
}, },
{ {
@ -2058,24 +1974,6 @@
"reason" : "callbackWithoutUserData", "reason" : "callbackWithoutUserData",
"symbol" : "GLib.qsort_with_data" "symbol" : "GLib.qsort_with_data"
}, },
{
"cIdentifier" : "g_quark_from_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_static_string"
},
{
"cIdentifier" : "g_quark_from_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_string"
},
{
"cIdentifier" : "g_quark_try_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_try_string"
},
{ {
"cIdentifier" : "g_rc_box_release_full", "cIdentifier" : "g_rc_box_release_full",
"detail" : "callback param 'clear_func' deferred to Phase D4.3", "detail" : "callback param 'clear_func' deferred to Phase D4.3",
@ -2336,26 +2234,26 @@
}, },
{ {
"cIdentifier" : "g_spawn_async", "cIdentifier" : "g_spawn_async",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async" "symbol" : "GLib.spawn_async"
}, },
{ {
"cIdentifier" : "g_spawn_async_with_fds", "cIdentifier" : "g_spawn_async_with_fds",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_fds" "symbol" : "GLib.spawn_async_with_fds"
}, },
{ {
"cIdentifier" : "g_spawn_async_with_pipes", "cIdentifier" : "g_spawn_async_with_pipes",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes" "symbol" : "GLib.spawn_async_with_pipes"
}, },
{ {
"cIdentifier" : "g_spawn_async_with_pipes_and_fds", "cIdentifier" : "g_spawn_async_with_pipes_and_fds",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes_and_fds" "symbol" : "GLib.spawn_async_with_pipes_and_fds"
}, },
{ {
@ -2366,8 +2264,8 @@
}, },
{ {
"cIdentifier" : "g_spawn_sync", "cIdentifier" : "g_spawn_sync",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_sync" "symbol" : "GLib.spawn_sync"
}, },
{ {
@ -2388,16 +2286,10 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.stpcpy" "symbol" : "GLib.stpcpy"
}, },
{
"cIdentifier" : "g_str_to_ascii",
"detail" : "parameter 'from_locale' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.str_to_ascii"
},
{ {
"cIdentifier" : "g_str_tokenize_and_fold", "cIdentifier" : "g_str_tokenize_and_fold",
"detail" : "parameter 'translit_locale' is a nullable string", "detail" : "out-param 'ascii_alternates': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.str_tokenize_and_fold" "symbol" : "GLib.str_tokenize_and_fold"
}, },
{ {
@ -2418,12 +2310,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.strchug" "symbol" : "GLib.strchug"
}, },
{
"cIdentifier" : "g_strcmp0",
"detail" : "parameter 'str1' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strcmp0"
},
{ {
"cIdentifier" : "g_strconcat", "cIdentifier" : "g_strconcat",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2442,12 +2328,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.strdown" "symbol" : "GLib.strdown"
}, },
{
"cIdentifier" : "g_strdup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strdup"
},
{ {
"cIdentifier" : "g_strdup_printf", "cIdentifier" : "g_strdup_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2466,12 +2346,6 @@
"reason" : "arrayBridgingUnimplemented", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strdupv" "symbol" : "GLib.strdupv"
}, },
{
"cIdentifier" : "g_strescape",
"detail" : "parameter 'exceptions' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strescape"
},
{ {
"cIdentifier" : "g_strfreev", "cIdentifier" : "g_strfreev",
"detail" : "parameter 'str_array': C array bridging not yet implemented", "detail" : "parameter 'str_array': C array bridging not yet implemented",
@ -2486,8 +2360,8 @@
}, },
{ {
"cIdentifier" : "g_strjoinv", "cIdentifier" : "g_strjoinv",
"detail" : "parameter 'separator' is a nullable string", "detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strjoinv" "symbol" : "GLib.strjoinv"
}, },
{ {
@ -2502,12 +2376,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.strlcpy" "symbol" : "GLib.strlcpy"
}, },
{
"cIdentifier" : "g_strndup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strndup"
},
{ {
"cIdentifier" : "g_strreverse", "cIdentifier" : "g_strreverse",
"detail" : "parameter 'string' is not a single const input string ('gchar*')", "detail" : "parameter 'string' is not a single const input string ('gchar*')",
@ -2598,12 +2466,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.test_create_suite" "symbol" : "GLib.test_create_suite"
}, },
{
"cIdentifier" : "g_test_expect_message",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_expect_message"
},
{ {
"cIdentifier" : "g_test_fail_printf", "cIdentifier" : "g_test_fail_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2622,12 +2484,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.test_get_root" "symbol" : "GLib.test_get_root"
}, },
{
"cIdentifier" : "g_test_incomplete",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_incomplete"
},
{ {
"cIdentifier" : "g_test_incomplete_printf", "cIdentifier" : "g_test_incomplete_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2676,28 +2532,16 @@
"reason" : "plainRecord", "reason" : "plainRecord",
"symbol" : "GLib.test_run_suite" "symbol" : "GLib.test_run_suite"
}, },
{
"cIdentifier" : "g_test_skip",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_skip"
},
{ {
"cIdentifier" : "g_test_skip_printf", "cIdentifier" : "g_test_skip_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.test_skip_printf" "symbol" : "GLib.test_skip_printf"
}, },
{
"cIdentifier" : "g_test_trap_subprocess",
"detail" : "parameter 'test_path' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_trap_subprocess"
},
{ {
"cIdentifier" : "g_test_trap_subprocess_with_envp", "cIdentifier" : "g_test_trap_subprocess_with_envp",
"detail" : "parameter 'test_path' is a nullable string", "detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.test_trap_subprocess_with_envp" "symbol" : "GLib.test_trap_subprocess_with_envp"
}, },
{ {
@ -3048,12 +2892,6 @@
"reason" : "arrayBridgingUnimplemented", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf16_to_utf8" "symbol" : "GLib.utf16_to_utf8"
}, },
{
"cIdentifier" : "g_utf8_find_next_char",
"detail" : "parameter 'end' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.utf8_find_next_char"
},
{ {
"cIdentifier" : "g_utf8_strncpy", "cIdentifier" : "g_utf8_strncpy",
"detail" : "parameter 'dest' is not a single const input string ('gchar*')", "detail" : "parameter 'dest' is not a single const input string ('gchar*')",
@ -3201,7 +3039,7 @@
], ],
"module" : "GLib", "module" : "GLib",
"stats" : { "stats" : {
"boundCallables" : 271, "boundCallables" : 298,
"boundCallbacks" : 61, "boundCallbacks" : 61,
"boundSignals" : 0, "boundSignals" : 0,
"boundTypes" : 287, "boundTypes" : 287,

View file

@ -554,7 +554,7 @@
}, },
{ {
"cIdentifier" : "g_object_getv", "cIdentifier" : "g_object_getv",
"detail" : "parameter 'names': C array bridging not yet implemented", "detail" : "parameter 'values': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.getv" "symbol" : "GObject.getv"
}, },
@ -576,144 +576,18 @@
"reason" : "plainRecord", "reason" : "plainRecord",
"symbol" : "GObject.interface_list_properties" "symbol" : "GObject.interface_list_properties"
}, },
{
"cIdentifier" : "g_param_spec_boolean",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boolean"
},
{
"cIdentifier" : "g_param_spec_boxed",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boxed"
},
{
"cIdentifier" : "g_param_spec_char",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_char"
},
{
"cIdentifier" : "g_param_spec_double",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_double"
},
{
"cIdentifier" : "g_param_spec_enum",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_enum"
},
{
"cIdentifier" : "g_param_spec_flags",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_flags"
},
{
"cIdentifier" : "g_param_spec_float",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_float"
},
{
"cIdentifier" : "g_param_spec_gtype",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_gtype"
},
{
"cIdentifier" : "g_param_spec_int",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int"
},
{
"cIdentifier" : "g_param_spec_int64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int64"
},
{
"cIdentifier" : "g_param_spec_long",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_long"
},
{
"cIdentifier" : "g_param_spec_object",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_object"
},
{ {
"cIdentifier" : "g_param_spec_override", "cIdentifier" : "g_param_spec_override",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_override" "symbol" : "GObject.param_spec_override"
}, },
{
"cIdentifier" : "g_param_spec_param",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_param"
},
{
"cIdentifier" : "g_param_spec_pointer",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_pointer"
},
{
"cIdentifier" : "g_param_spec_string",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_string"
},
{
"cIdentifier" : "g_param_spec_uchar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uchar"
},
{
"cIdentifier" : "g_param_spec_uint",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint"
},
{
"cIdentifier" : "g_param_spec_uint64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint64"
},
{
"cIdentifier" : "g_param_spec_ulong",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_ulong"
},
{
"cIdentifier" : "g_param_spec_unichar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_unichar"
},
{ {
"cIdentifier" : "g_param_spec_value_array", "cIdentifier" : "g_param_spec_value_array",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_value_array" "symbol" : "GObject.param_spec_value_array"
}, },
{
"cIdentifier" : "g_param_spec_variant",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_variant"
},
{ {
"cIdentifier" : "g_param_type_register_static", "cIdentifier" : "g_param_type_register_static",
"detail" : "parameter 'pspec_info': 'GObject.ParamSpecTypeInfo' has no GType registration or lifetime functions", "detail" : "parameter 'pspec_info': 'GObject.ParamSpecTypeInfo' has no GType registration or lifetime functions",
@ -1113,7 +987,7 @@
], ],
"module" : "GObject", "module" : "GObject",
"stats" : { "stats" : {
"boundCallables" : 113, "boundCallables" : 134,
"boundCallbacks" : 32, "boundCallbacks" : 32,
"boundSignals" : 3, "boundSignals" : 3,
"boundTypes" : 76, "boundTypes" : 76,

View file

@ -705,7 +705,7 @@
{ {
"cIdentifier" : "g_base64_decode", "cIdentifier" : "g_base64_decode",
"detail" : "C array bridging not yet implemented", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.base64_decode" "symbol" : "GLib.base64_decode"
}, },
{ {
@ -723,7 +723,7 @@
{ {
"cIdentifier" : "g_base64_encode", "cIdentifier" : "g_base64_encode",
"detail" : "parameter 'data': C array bridging not yet implemented", "detail" : "parameter 'data': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.base64_encode" "symbol" : "GLib.base64_encode"
}, },
{ {
@ -735,7 +735,7 @@
{ {
"cIdentifier" : "g_base64_encode_step", "cIdentifier" : "g_base64_encode_step",
"detail" : "parameter 'in': C array bridging not yet implemented", "detail" : "parameter 'in': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.base64_encode_step" "symbol" : "GLib.base64_encode_step"
}, },
{ {
@ -788,8 +788,8 @@
}, },
{ {
"cIdentifier" : "g_build_filenamev", "cIdentifier" : "g_build_filenamev",
"detail" : "parameter 'args': C array has no length annotation", "detail" : "parameter 'args': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.build_filenamev" "symbol" : "GLib.build_filenamev"
}, },
{ {
@ -800,8 +800,8 @@
}, },
{ {
"cIdentifier" : "g_build_pathv", "cIdentifier" : "g_build_pathv",
"detail" : "parameter 'args': C array has no length annotation", "detail" : "parameter 'args': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.build_pathv" "symbol" : "GLib.build_pathv"
}, },
{ {
@ -900,12 +900,6 @@
"reason" : "deprecatedRemoved", "reason" : "deprecatedRemoved",
"symbol" : "GLib.byte_array_unref" "symbol" : "GLib.byte_array_unref"
}, },
{
"cIdentifier" : "g_canonicalize_filename",
"detail" : "parameter 'relative_to' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.canonicalize_filename"
},
{ {
"cIdentifier" : "g_chdir", "cIdentifier" : "g_chdir",
"detail" : "C symbol 'g_chdir' is not exported by the system library", "detail" : "C symbol 'g_chdir' is not exported by the system library",
@ -969,19 +963,19 @@
{ {
"cIdentifier" : "g_compute_checksum_for_data", "cIdentifier" : "g_compute_checksum_for_data",
"detail" : "parameter 'data': C array bridging not yet implemented", "detail" : "parameter 'data': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.compute_checksum_for_data" "symbol" : "GLib.compute_checksum_for_data"
}, },
{ {
"cIdentifier" : "g_compute_hmac_for_data", "cIdentifier" : "g_compute_hmac_for_data",
"detail" : "parameter 'key': C array bridging not yet implemented", "detail" : "parameter 'key': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.compute_hmac_for_data" "symbol" : "GLib.compute_hmac_for_data"
}, },
{ {
"cIdentifier" : "g_compute_hmac_for_string", "cIdentifier" : "g_compute_hmac_for_string",
"detail" : "parameter 'key': C array bridging not yet implemented", "detail" : "parameter 'key': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.compute_hmac_for_string" "symbol" : "GLib.compute_hmac_for_string"
}, },
{ {
@ -993,13 +987,13 @@
{ {
"cIdentifier" : "g_convert", "cIdentifier" : "g_convert",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.convert" "symbol" : "GLib.convert"
}, },
{ {
"cIdentifier" : "g_convert_with_fallback", "cIdentifier" : "g_convert_with_fallback",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.convert_with_fallback" "symbol" : "GLib.convert_with_fallback"
}, },
{ {
@ -1182,58 +1176,28 @@
"reason" : "deprecatedRemoved", "reason" : "deprecatedRemoved",
"symbol" : "GLib.date_valid_year" "symbol" : "GLib.date_valid_year"
}, },
{
"cIdentifier" : "g_dcgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dcgettext"
},
{
"cIdentifier" : "g_dgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dgettext"
},
{ {
"cIdentifier" : "g_dir_make_tmp", "cIdentifier" : "g_dir_make_tmp",
"detail" : "deprecatedRemoved", "detail" : "deprecatedRemoved",
"reason" : "deprecatedRemoved", "reason" : "deprecatedRemoved",
"symbol" : "GLib.dir_make_tmp" "symbol" : "GLib.dir_make_tmp"
}, },
{
"cIdentifier" : "g_dngettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dngettext"
},
{
"cIdentifier" : "g_dpgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext"
},
{
"cIdentifier" : "g_dpgettext2",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext2"
},
{ {
"cIdentifier" : "g_environ_getenv", "cIdentifier" : "g_environ_getenv",
"detail" : "parameter 'envp': C array has no length annotation", "detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.environ_getenv" "symbol" : "GLib.environ_getenv"
}, },
{ {
"cIdentifier" : "g_environ_setenv", "cIdentifier" : "g_environ_setenv",
"detail" : "parameter 'envp': C array has no length annotation", "detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.environ_setenv" "symbol" : "GLib.environ_setenv"
}, },
{ {
"cIdentifier" : "g_environ_unsetenv", "cIdentifier" : "g_environ_unsetenv",
"detail" : "parameter 'envp': C array has no length annotation", "detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.environ_unsetenv" "symbol" : "GLib.environ_unsetenv"
}, },
{ {
@ -1251,33 +1215,21 @@
{ {
"cIdentifier" : "g_file_get_contents", "cIdentifier" : "g_file_get_contents",
"detail" : "out-param 'contents': C array bridging not yet implemented", "detail" : "out-param 'contents': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_get_contents" "symbol" : "GLib.file_get_contents"
}, },
{
"cIdentifier" : "g_file_open_tmp",
"detail" : "parameter 'tmpl' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.file_open_tmp"
},
{ {
"cIdentifier" : "g_file_set_contents", "cIdentifier" : "g_file_set_contents",
"detail" : "parameter 'contents': C array bridging not yet implemented", "detail" : "parameter 'contents': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_set_contents" "symbol" : "GLib.file_set_contents"
}, },
{ {
"cIdentifier" : "g_file_set_contents_full", "cIdentifier" : "g_file_set_contents_full",
"detail" : "parameter 'contents': C array bridging not yet implemented", "detail" : "parameter 'contents': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_set_contents_full" "symbol" : "GLib.file_set_contents_full"
}, },
{
"cIdentifier" : "g_filename_to_uri",
"detail" : "parameter 'hostname' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.filename_to_uri"
},
{ {
"cIdentifier" : "g_fopen", "cIdentifier" : "g_fopen",
"detail" : "C symbol 'g_fopen' is not exported by the system library", "detail" : "C symbol 'g_fopen' is not exported by the system library",
@ -1322,32 +1274,32 @@
}, },
{ {
"cIdentifier" : "g_get_environ", "cIdentifier" : "g_get_environ",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_environ" "symbol" : "GLib.get_environ"
}, },
{ {
"cIdentifier" : "g_get_filename_charsets", "cIdentifier" : "g_get_filename_charsets",
"detail" : "out-param 'filename_charsets': C array has no length annotation", "detail" : "out-param 'filename_charsets': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_filename_charsets" "symbol" : "GLib.get_filename_charsets"
}, },
{ {
"cIdentifier" : "g_get_language_names", "cIdentifier" : "g_get_language_names",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_language_names" "symbol" : "GLib.get_language_names"
}, },
{ {
"cIdentifier" : "g_get_language_names_with_category", "cIdentifier" : "g_get_language_names_with_category",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_language_names_with_category" "symbol" : "GLib.get_language_names_with_category"
}, },
{ {
"cIdentifier" : "g_get_locale_variants", "cIdentifier" : "g_get_locale_variants",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_locale_variants" "symbol" : "GLib.get_locale_variants"
}, },
{ {
@ -1358,14 +1310,14 @@
}, },
{ {
"cIdentifier" : "g_get_system_config_dirs", "cIdentifier" : "g_get_system_config_dirs",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_system_config_dirs" "symbol" : "GLib.get_system_config_dirs"
}, },
{ {
"cIdentifier" : "g_get_system_data_dirs", "cIdentifier" : "g_get_system_data_dirs",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_system_data_dirs" "symbol" : "GLib.get_system_data_dirs"
}, },
{ {
@ -1584,18 +1536,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.idle_add_once" "symbol" : "GLib.idle_add_once"
}, },
{
"cIdentifier" : "g_intern_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_static_string"
},
{
"cIdentifier" : "g_intern_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_string"
},
{ {
"cIdentifier" : "g_io_add_watch", "cIdentifier" : "g_io_add_watch",
"detail" : "shadowedSymbol", "detail" : "shadowedSymbol",
@ -1640,20 +1580,20 @@
}, },
{ {
"cIdentifier" : "g_listenv", "cIdentifier" : "g_listenv",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.listenv" "symbol" : "GLib.listenv"
}, },
{ {
"cIdentifier" : "g_locale_from_utf8", "cIdentifier" : "g_locale_from_utf8",
"detail" : "C array bridging not yet implemented", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.locale_from_utf8" "symbol" : "GLib.locale_from_utf8"
}, },
{ {
"cIdentifier" : "g_locale_to_utf8", "cIdentifier" : "g_locale_to_utf8",
"detail" : "parameter 'opsysstring': C array bridging not yet implemented", "detail" : "parameter 'opsysstring': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.locale_to_utf8" "symbol" : "GLib.locale_to_utf8"
}, },
{ {
@ -1662,12 +1602,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.log" "symbol" : "GLib.log"
}, },
{
"cIdentifier" : "g_log_default_handler",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_default_handler"
},
{ {
"cIdentifier" : "g_log_set_default_handler", "cIdentifier" : "g_log_set_default_handler",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -1682,8 +1616,8 @@
}, },
{ {
"cIdentifier" : "g_log_set_handler_full", "cIdentifier" : "g_log_set_handler_full",
"detail" : "parameter 'log_domain' is a nullable string", "detail" : "callback param 'log_func' deferred to Phase D4.3",
"reason" : "unknownType", "reason" : "callbackWithoutUserData",
"symbol" : "GLib.log_set_handler_full" "symbol" : "GLib.log_set_handler_full"
}, },
{ {
@ -1701,7 +1635,7 @@
{ {
"cIdentifier" : "g_log_structured_array", "cIdentifier" : "g_log_structured_array",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_structured_array" "symbol" : "GLib.log_structured_array"
}, },
{ {
@ -1710,52 +1644,40 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.log_structured_standard" "symbol" : "GLib.log_structured_standard"
}, },
{
"cIdentifier" : "g_log_variant",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_variant"
},
{ {
"cIdentifier" : "g_log_writer_default", "cIdentifier" : "g_log_writer_default",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_default" "symbol" : "GLib.log_writer_default"
}, },
{ {
"cIdentifier" : "g_log_writer_default_set_debug_domains", "cIdentifier" : "g_log_writer_default_set_debug_domains",
"detail" : "parameter 'domains' is a nullable string", "detail" : "parameter 'domains' is not a single const input string ('const gchar* const*')",
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.log_writer_default_set_debug_domains" "symbol" : "GLib.log_writer_default_set_debug_domains"
}, },
{
"cIdentifier" : "g_log_writer_default_would_drop",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_writer_default_would_drop"
},
{ {
"cIdentifier" : "g_log_writer_format_fields", "cIdentifier" : "g_log_writer_format_fields",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_format_fields" "symbol" : "GLib.log_writer_format_fields"
}, },
{ {
"cIdentifier" : "g_log_writer_journald", "cIdentifier" : "g_log_writer_journald",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_journald" "symbol" : "GLib.log_writer_journald"
}, },
{ {
"cIdentifier" : "g_log_writer_standard_streams", "cIdentifier" : "g_log_writer_standard_streams",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_standard_streams" "symbol" : "GLib.log_writer_standard_streams"
}, },
{ {
"cIdentifier" : "g_log_writer_syslog", "cIdentifier" : "g_log_writer_syslog",
"detail" : "parameter 'fields': C array bridging not yet implemented", "detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_syslog" "symbol" : "GLib.log_writer_syslog"
}, },
{ {
@ -1872,12 +1794,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.nullify_pointer" "symbol" : "GLib.nullify_pointer"
}, },
{
"cIdentifier" : "g_on_error_stack_trace",
"detail" : "parameter 'prg_name' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.on_error_stack_trace"
},
{ {
"cIdentifier" : "g_once_init_enter", "cIdentifier" : "g_once_init_enter",
"detail" : "deprecatedRemoved", "detail" : "deprecatedRemoved",
@ -1916,8 +1832,8 @@
}, },
{ {
"cIdentifier" : "g_parse_debug_string", "cIdentifier" : "g_parse_debug_string",
"detail" : "parameter 'string' is a nullable string", "detail" : "parameter 'keys': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.parse_debug_string" "symbol" : "GLib.parse_debug_string"
}, },
{ {
@ -2058,24 +1974,6 @@
"reason" : "callbackWithoutUserData", "reason" : "callbackWithoutUserData",
"symbol" : "GLib.qsort_with_data" "symbol" : "GLib.qsort_with_data"
}, },
{
"cIdentifier" : "g_quark_from_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_static_string"
},
{
"cIdentifier" : "g_quark_from_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_string"
},
{
"cIdentifier" : "g_quark_try_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_try_string"
},
{ {
"cIdentifier" : "g_rc_box_release_full", "cIdentifier" : "g_rc_box_release_full",
"detail" : "callback param 'clear_func' deferred to Phase D4.3", "detail" : "callback param 'clear_func' deferred to Phase D4.3",
@ -2277,7 +2175,7 @@
{ {
"cIdentifier" : "g_shell_parse_argv", "cIdentifier" : "g_shell_parse_argv",
"detail" : "out-param 'argvp': C array bridging not yet implemented", "detail" : "out-param 'argvp': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.shell_parse_argv" "symbol" : "GLib.shell_parse_argv"
}, },
{ {
@ -2336,38 +2234,38 @@
}, },
{ {
"cIdentifier" : "g_spawn_async", "cIdentifier" : "g_spawn_async",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async" "symbol" : "GLib.spawn_async"
}, },
{ {
"cIdentifier" : "g_spawn_async_with_fds", "cIdentifier" : "g_spawn_async_with_fds",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_fds" "symbol" : "GLib.spawn_async_with_fds"
}, },
{ {
"cIdentifier" : "g_spawn_async_with_pipes", "cIdentifier" : "g_spawn_async_with_pipes",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes" "symbol" : "GLib.spawn_async_with_pipes"
}, },
{ {
"cIdentifier" : "g_spawn_async_with_pipes_and_fds", "cIdentifier" : "g_spawn_async_with_pipes_and_fds",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes_and_fds" "symbol" : "GLib.spawn_async_with_pipes_and_fds"
}, },
{ {
"cIdentifier" : "g_spawn_command_line_sync", "cIdentifier" : "g_spawn_command_line_sync",
"detail" : "out-param 'standard_output': C array has no length annotation", "detail" : "out-param 'standard_output': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_command_line_sync" "symbol" : "GLib.spawn_command_line_sync"
}, },
{ {
"cIdentifier" : "g_spawn_sync", "cIdentifier" : "g_spawn_sync",
"detail" : "parameter 'working_directory' is a nullable string", "detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_sync" "symbol" : "GLib.spawn_sync"
}, },
{ {
@ -2388,16 +2286,10 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.stpcpy" "symbol" : "GLib.stpcpy"
}, },
{
"cIdentifier" : "g_str_to_ascii",
"detail" : "parameter 'from_locale' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.str_to_ascii"
},
{ {
"cIdentifier" : "g_str_tokenize_and_fold", "cIdentifier" : "g_str_tokenize_and_fold",
"detail" : "parameter 'translit_locale' is a nullable string", "detail" : "out-param 'ascii_alternates': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.str_tokenize_and_fold" "symbol" : "GLib.str_tokenize_and_fold"
}, },
{ {
@ -2418,12 +2310,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.strchug" "symbol" : "GLib.strchug"
}, },
{
"cIdentifier" : "g_strcmp0",
"detail" : "parameter 'str1' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strcmp0"
},
{ {
"cIdentifier" : "g_strconcat", "cIdentifier" : "g_strconcat",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2442,12 +2328,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.strdown" "symbol" : "GLib.strdown"
}, },
{
"cIdentifier" : "g_strdup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strdup"
},
{ {
"cIdentifier" : "g_strdup_printf", "cIdentifier" : "g_strdup_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2462,20 +2342,14 @@
}, },
{ {
"cIdentifier" : "g_strdupv", "cIdentifier" : "g_strdupv",
"detail" : "parameter 'str_array': C array has no length annotation", "detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strdupv" "symbol" : "GLib.strdupv"
}, },
{
"cIdentifier" : "g_strescape",
"detail" : "parameter 'exceptions' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strescape"
},
{ {
"cIdentifier" : "g_strfreev", "cIdentifier" : "g_strfreev",
"detail" : "parameter 'str_array': C array has no length annotation", "detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strfreev" "symbol" : "GLib.strfreev"
}, },
{ {
@ -2486,8 +2360,8 @@
}, },
{ {
"cIdentifier" : "g_strjoinv", "cIdentifier" : "g_strjoinv",
"detail" : "parameter 'separator' is a nullable string", "detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strjoinv" "symbol" : "GLib.strjoinv"
}, },
{ {
@ -2502,12 +2376,6 @@
"reason" : "unknownType", "reason" : "unknownType",
"symbol" : "GLib.strlcpy" "symbol" : "GLib.strlcpy"
}, },
{
"cIdentifier" : "g_strndup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strndup"
},
{ {
"cIdentifier" : "g_strreverse", "cIdentifier" : "g_strreverse",
"detail" : "parameter 'string' is not a single const input string ('gchar*')", "detail" : "parameter 'string' is not a single const input string ('gchar*')",
@ -2516,14 +2384,14 @@
}, },
{ {
"cIdentifier" : "g_strsplit", "cIdentifier" : "g_strsplit",
"detail" : "C array has no length annotation", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strsplit" "symbol" : "GLib.strsplit"
}, },
{ {
"cIdentifier" : "g_strsplit_set", "cIdentifier" : "g_strsplit_set",
"detail" : "parameter 'delimiters': C array has no length annotation", "detail" : "parameter 'delimiters': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strsplit_set" "symbol" : "GLib.strsplit_set"
}, },
{ {
@ -2534,14 +2402,14 @@
}, },
{ {
"cIdentifier" : "g_strv_contains", "cIdentifier" : "g_strv_contains",
"detail" : "parameter 'strv': C array has no length annotation", "detail" : "parameter 'strv': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strv_contains" "symbol" : "GLib.strv_contains"
}, },
{ {
"cIdentifier" : "g_strv_equal", "cIdentifier" : "g_strv_equal",
"detail" : "parameter 'strv1': C array has no length annotation", "detail" : "parameter 'strv1': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strv_equal" "symbol" : "GLib.strv_equal"
}, },
{ {
@ -2552,8 +2420,8 @@
}, },
{ {
"cIdentifier" : "g_strv_length", "cIdentifier" : "g_strv_length",
"detail" : "parameter 'str_array': C array has no length annotation", "detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strv_length" "symbol" : "GLib.strv_length"
}, },
{ {
@ -2598,12 +2466,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.test_create_suite" "symbol" : "GLib.test_create_suite"
}, },
{
"cIdentifier" : "g_test_expect_message",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_expect_message"
},
{ {
"cIdentifier" : "g_test_fail_printf", "cIdentifier" : "g_test_fail_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2622,12 +2484,6 @@
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.test_get_root" "symbol" : "GLib.test_get_root"
}, },
{
"cIdentifier" : "g_test_incomplete",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_incomplete"
},
{ {
"cIdentifier" : "g_test_incomplete_printf", "cIdentifier" : "g_test_incomplete_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
@ -2676,28 +2532,16 @@
"reason" : "plainRecord", "reason" : "plainRecord",
"symbol" : "GLib.test_run_suite" "symbol" : "GLib.test_run_suite"
}, },
{
"cIdentifier" : "g_test_skip",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_skip"
},
{ {
"cIdentifier" : "g_test_skip_printf", "cIdentifier" : "g_test_skip_printf",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GLib.test_skip_printf" "symbol" : "GLib.test_skip_printf"
}, },
{
"cIdentifier" : "g_test_trap_subprocess",
"detail" : "parameter 'test_path' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_trap_subprocess"
},
{ {
"cIdentifier" : "g_test_trap_subprocess_with_envp", "cIdentifier" : "g_test_trap_subprocess_with_envp",
"detail" : "parameter 'test_path' is a nullable string", "detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "unknownType", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.test_trap_subprocess_with_envp" "symbol" : "GLib.test_trap_subprocess_with_envp"
}, },
{ {
@ -2865,13 +2709,13 @@
{ {
"cIdentifier" : "g_ucs4_to_utf16", "cIdentifier" : "g_ucs4_to_utf16",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.ucs4_to_utf16" "symbol" : "GLib.ucs4_to_utf16"
}, },
{ {
"cIdentifier" : "g_ucs4_to_utf8", "cIdentifier" : "g_ucs4_to_utf8",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.ucs4_to_utf8" "symbol" : "GLib.ucs4_to_utf8"
}, },
{ {
@ -2895,7 +2739,7 @@
{ {
"cIdentifier" : "g_unicode_canonical_ordering", "cIdentifier" : "g_unicode_canonical_ordering",
"detail" : "parameter 'string': C array bridging not yet implemented", "detail" : "parameter 'string': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.unicode_canonical_ordering" "symbol" : "GLib.unicode_canonical_ordering"
}, },
{ {
@ -3039,21 +2883,15 @@
{ {
"cIdentifier" : "g_utf16_to_ucs4", "cIdentifier" : "g_utf16_to_ucs4",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf16_to_ucs4" "symbol" : "GLib.utf16_to_ucs4"
}, },
{ {
"cIdentifier" : "g_utf16_to_utf8", "cIdentifier" : "g_utf16_to_utf8",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf16_to_utf8" "symbol" : "GLib.utf16_to_utf8"
}, },
{
"cIdentifier" : "g_utf8_find_next_char",
"detail" : "parameter 'end' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.utf8_find_next_char"
},
{ {
"cIdentifier" : "g_utf8_strncpy", "cIdentifier" : "g_utf8_strncpy",
"detail" : "parameter 'dest' is not a single const input string ('gchar*')", "detail" : "parameter 'dest' is not a single const input string ('gchar*')",
@ -3081,13 +2919,13 @@
{ {
"cIdentifier" : "g_utf8_validate", "cIdentifier" : "g_utf8_validate",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf8_validate" "symbol" : "GLib.utf8_validate"
}, },
{ {
"cIdentifier" : "g_utf8_validate_len", "cIdentifier" : "g_utf8_validate_len",
"detail" : "parameter 'str': C array bridging not yet implemented", "detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf8_validate_len" "symbol" : "GLib.utf8_validate_len"
}, },
{ {
@ -3201,7 +3039,7 @@
], ],
"module" : "GLib", "module" : "GLib",
"stats" : { "stats" : {
"boundCallables" : 271, "boundCallables" : 298,
"boundCallbacks" : 61, "boundCallbacks" : 61,
"boundSignals" : 0, "boundSignals" : 0,
"boundTypes" : 287, "boundTypes" : 287,

View file

@ -105,7 +105,7 @@
{ {
"cIdentifier" : "g_object_newv", "cIdentifier" : "g_object_newv",
"detail" : "parameter 'parameters': C array bridging not yet implemented", "detail" : "parameter 'parameters': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.Object.newv" "symbol" : "GObject.Object.newv"
}, },
{ {
@ -518,8 +518,8 @@
}, },
{ {
"cIdentifier" : "g_enum_register_static", "cIdentifier" : "g_enum_register_static",
"detail" : "parameter 'const_static_values': C array has no length annotation", "detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.enum_register_static" "symbol" : "GObject.enum_register_static"
}, },
{ {
@ -548,14 +548,14 @@
}, },
{ {
"cIdentifier" : "g_flags_register_static", "cIdentifier" : "g_flags_register_static",
"detail" : "parameter 'const_static_values': C array has no length annotation", "detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.flags_register_static" "symbol" : "GObject.flags_register_static"
}, },
{ {
"cIdentifier" : "g_object_getv", "cIdentifier" : "g_object_getv",
"detail" : "parameter 'names': C array bridging not yet implemented", "detail" : "parameter 'values': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.getv" "symbol" : "GObject.getv"
}, },
{ {
@ -576,144 +576,18 @@
"reason" : "plainRecord", "reason" : "plainRecord",
"symbol" : "GObject.interface_list_properties" "symbol" : "GObject.interface_list_properties"
}, },
{
"cIdentifier" : "g_param_spec_boolean",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boolean"
},
{
"cIdentifier" : "g_param_spec_boxed",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boxed"
},
{
"cIdentifier" : "g_param_spec_char",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_char"
},
{
"cIdentifier" : "g_param_spec_double",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_double"
},
{
"cIdentifier" : "g_param_spec_enum",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_enum"
},
{
"cIdentifier" : "g_param_spec_flags",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_flags"
},
{
"cIdentifier" : "g_param_spec_float",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_float"
},
{
"cIdentifier" : "g_param_spec_gtype",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_gtype"
},
{
"cIdentifier" : "g_param_spec_int",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int"
},
{
"cIdentifier" : "g_param_spec_int64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int64"
},
{
"cIdentifier" : "g_param_spec_long",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_long"
},
{
"cIdentifier" : "g_param_spec_object",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_object"
},
{ {
"cIdentifier" : "g_param_spec_override", "cIdentifier" : "g_param_spec_override",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_override" "symbol" : "GObject.param_spec_override"
}, },
{
"cIdentifier" : "g_param_spec_param",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_param"
},
{
"cIdentifier" : "g_param_spec_pointer",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_pointer"
},
{
"cIdentifier" : "g_param_spec_string",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_string"
},
{
"cIdentifier" : "g_param_spec_uchar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uchar"
},
{
"cIdentifier" : "g_param_spec_uint",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint"
},
{
"cIdentifier" : "g_param_spec_uint64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint64"
},
{
"cIdentifier" : "g_param_spec_ulong",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_ulong"
},
{
"cIdentifier" : "g_param_spec_unichar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_unichar"
},
{ {
"cIdentifier" : "g_param_spec_value_array", "cIdentifier" : "g_param_spec_value_array",
"detail" : "notIntrospectable", "detail" : "notIntrospectable",
"reason" : "notIntrospectable", "reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_value_array" "symbol" : "GObject.param_spec_value_array"
}, },
{
"cIdentifier" : "g_param_spec_variant",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_variant"
},
{ {
"cIdentifier" : "g_param_type_register_static", "cIdentifier" : "g_param_type_register_static",
"detail" : "parameter 'pspec_info': 'GObject.ParamSpecTypeInfo' has no GType registration or lifetime functions", "detail" : "parameter 'pspec_info': 'GObject.ParamSpecTypeInfo' has no GType registration or lifetime functions",
@ -722,14 +596,14 @@
}, },
{ {
"cIdentifier" : "g_type_module_register_enum", "cIdentifier" : "g_type_module_register_enum",
"detail" : "parameter 'const_static_values': C array has no length annotation", "detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.register_enum" "symbol" : "GObject.register_enum"
}, },
{ {
"cIdentifier" : "g_type_module_register_flags", "cIdentifier" : "g_type_module_register_flags",
"detail" : "parameter 'const_static_values': C array has no length annotation", "detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.register_flags" "symbol" : "GObject.register_flags"
}, },
{ {
@ -813,7 +687,7 @@
{ {
"cIdentifier" : "g_signal_list_ids", "cIdentifier" : "g_signal_list_ids",
"detail" : "C array bridging not yet implemented", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.signal_list_ids" "symbol" : "GObject.signal_list_ids"
}, },
{ {
@ -927,7 +801,7 @@
{ {
"cIdentifier" : "g_type_children", "cIdentifier" : "g_type_children",
"detail" : "C array bridging not yet implemented", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.type_children" "symbol" : "GObject.type_children"
}, },
{ {
@ -1029,7 +903,7 @@
{ {
"cIdentifier" : "g_type_interfaces", "cIdentifier" : "g_type_interfaces",
"detail" : "C array bridging not yet implemented", "detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength", "reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.type_interfaces" "symbol" : "GObject.type_interfaces"
}, },
{ {
@ -1113,7 +987,7 @@
], ],
"module" : "GObject", "module" : "GObject",
"stats" : { "stats" : {
"boundCallables" : 113, "boundCallables" : 134,
"boundCallbacks" : 32, "boundCallbacks" : 32,
"boundSignals" : 3, "boundSignals" : 3,
"boundTypes" : 76, "boundTypes" : 76,

File diff suppressed because it is too large Load diff