Add iconv void * overloads for backwards compatibility
Since Xcode 15 the iconv APIs operate on an opaque type __tag_iconv_t* instead of void*. This causes a runtime exception in older Ktor versions which depended on iconv. ^KT-62286
This commit is contained in:
+5
-1
@@ -431,7 +431,11 @@ class StubIrBuilder(private val context: StubIrContext) {
|
|||||||
|
|
||||||
private fun generateStubsForFunction(func: FunctionDecl) {
|
private fun generateStubsForFunction(func: FunctionDecl) {
|
||||||
try {
|
try {
|
||||||
addStubs(FunctionStubBuilder(buildingContext, func, skipOverloads = true).build())
|
addStubs(FunctionStubBuilder(
|
||||||
|
buildingContext,
|
||||||
|
func,
|
||||||
|
skipOverloads = func.name !in context.configuration.allowedOverloadsForCFunctions
|
||||||
|
).build())
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
context.log("Warning: cannot generate stubs for function ${func.name}")
|
context.log("Warning: cannot generate stubs for function ${func.name}")
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -31,6 +31,7 @@ class InteropConfiguration(
|
|||||||
val nonStrictEnums: Set<String>,
|
val nonStrictEnums: Set<String>,
|
||||||
val noStringConversion: Set<String>,
|
val noStringConversion: Set<String>,
|
||||||
val exportForwardDeclarations: List<String>,
|
val exportForwardDeclarations: List<String>,
|
||||||
|
val allowedOverloadsForCFunctions: Set<String>,
|
||||||
val disableDesignatedInitializerChecks: Boolean,
|
val disableDesignatedInitializerChecks: Boolean,
|
||||||
val disableExperimentalAnnotation: Boolean,
|
val disableExperimentalAnnotation: Boolean,
|
||||||
val target: KonanTarget
|
val target: KonanTarget
|
||||||
|
|||||||
+1
@@ -324,6 +324,7 @@ private fun processCLib(
|
|||||||
nonStrictEnums = def.config.nonStrictEnums.toSet(),
|
nonStrictEnums = def.config.nonStrictEnums.toSet(),
|
||||||
noStringConversion = def.config.noStringConversion.toSet(),
|
noStringConversion = def.config.noStringConversion.toSet(),
|
||||||
exportForwardDeclarations = def.config.exportForwardDeclarations,
|
exportForwardDeclarations = def.config.exportForwardDeclarations,
|
||||||
|
allowedOverloadsForCFunctions = def.config.allowedOverloadsForCFunctions.toSet(),
|
||||||
disableDesignatedInitializerChecks = def.config.disableDesignatedInitializerChecks,
|
disableDesignatedInitializerChecks = def.config.disableDesignatedInitializerChecks,
|
||||||
disableExperimentalAnnotation = cinteropArguments.disableExperimentalAnnotation ?: false,
|
disableExperimentalAnnotation = cinteropArguments.disableExperimentalAnnotation ?: false,
|
||||||
target = target
|
target = target
|
||||||
|
|||||||
@@ -3,3 +3,10 @@ package = platform.iconv
|
|||||||
headers = iconv.h
|
headers = iconv.h
|
||||||
headerFilter = **
|
headerFilter = **
|
||||||
linkerOpts = -liconv
|
linkerOpts = -liconv
|
||||||
|
allowedOverloadsForCFunctions = iconv iconvctl iconv_close
|
||||||
|
|
||||||
|
---
|
||||||
|
typedef void* __kotlin_iconv_t;
|
||||||
|
size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv");
|
||||||
|
int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl");
|
||||||
|
int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close");
|
||||||
@@ -3,3 +3,10 @@ package = platform.iconv
|
|||||||
headers = iconv.h
|
headers = iconv.h
|
||||||
headerFilter = **
|
headerFilter = **
|
||||||
linkerOpts = -liconv
|
linkerOpts = -liconv
|
||||||
|
allowedOverloadsForCFunctions = iconv iconvctl iconv_close
|
||||||
|
|
||||||
|
---
|
||||||
|
typedef void* __kotlin_iconv_t;
|
||||||
|
size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv");
|
||||||
|
int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl");
|
||||||
|
int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close");
|
||||||
@@ -3,3 +3,10 @@ package = platform.iconv
|
|||||||
headers = iconv.h
|
headers = iconv.h
|
||||||
headerFilter = **
|
headerFilter = **
|
||||||
linkerOpts = -liconv
|
linkerOpts = -liconv
|
||||||
|
allowedOverloadsForCFunctions = iconv iconvctl iconv_close
|
||||||
|
|
||||||
|
---
|
||||||
|
typedef void* __kotlin_iconv_t;
|
||||||
|
size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv");
|
||||||
|
int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl");
|
||||||
|
int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close");
|
||||||
@@ -3,3 +3,10 @@ package = platform.iconv
|
|||||||
headers = iconv.h
|
headers = iconv.h
|
||||||
headerFilter = **
|
headerFilter = **
|
||||||
linkerOpts = -liconv
|
linkerOpts = -liconv
|
||||||
|
allowedOverloadsForCFunctions = iconv iconvctl iconv_close
|
||||||
|
|
||||||
|
---
|
||||||
|
typedef void* __kotlin_iconv_t;
|
||||||
|
size_t __attribute__((overloadable)) iconv(__kotlin_iconv_t, char **, size_t *, char **, size_t *) asm("_iconv");
|
||||||
|
int __attribute__((overloadable)) iconvctl(__kotlin_iconv_t, int, void *) asm("_iconvctl");
|
||||||
|
int __attribute__((overloadable)) iconv_close(__kotlin_iconv_t) asm("_iconv_close");
|
||||||
@@ -120,6 +120,10 @@ class DefFile(val file:File?, val config:DefFileConfig, val manifestAddendProper
|
|||||||
properties.getSpaceSeparated("exportForwardDeclarations")
|
properties.getSpaceSeparated("exportForwardDeclarations")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val allowedOverloadsForCFunctions by lazy {
|
||||||
|
properties.getSpaceSeparated("allowedOverloadsForCFunctions")
|
||||||
|
}
|
||||||
|
|
||||||
val disableDesignatedInitializerChecks by lazy {
|
val disableDesignatedInitializerChecks by lazy {
|
||||||
properties.getProperty("disableDesignatedInitializerChecks")?.toBoolean() ?: false
|
properties.getProperty("disableDesignatedInitializerChecks")?.toBoolean() ?: false
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user