[Wasm] Support Number type for external functions

This commit is contained in:
Igor Yakovlev
2022-12-27 16:22:57 +01:00
committed by teamcity
parent 4dedd47172
commit 1b2b7ce34c
5 changed files with 74 additions and 0 deletions
@@ -287,6 +287,7 @@ class WasmSymbols(
inner class JsInteropAdapters {
val kotlinToJsStringAdapter = getInternalFunction("kotlinToJsStringAdapter")
val kotlinToJsAnyAdapter = getInternalFunction("kotlinToJsAnyAdapter")
val numberToDoubleAdapter = getInternalFunction("numberToDoubleAdapter")
val jsCheckIsNullOrUndefinedAdapter = getInternalFunction("jsCheckIsNullOrUndefinedAdapter")
@@ -65,6 +65,13 @@ class JsInteropFunctionsLowering(val context: WasmBackendContext) : DeclarationT
return (newDeclarations ?: listOf(declaration)) + additionalDeclarations
}
private fun doubleIfNumber(possiblyNumber: IrType): IrType {
val isNullable = possiblyNumber.isNullable()
val notNullType = possiblyNumber.makeNotNull()
if (notNullType != builtIns.numberType) return possiblyNumber
return if (isNullable) builtIns.doubleType.makeNullable() else builtIns.doubleType
}
/**
* external fun foo(x: KotlinType): KotlinType
*
@@ -79,6 +86,9 @@ class JsInteropFunctionsLowering(val context: WasmBackendContext) : DeclarationT
if (function.valueParameters.any { it.defaultValue != null })
return null
// Patch function types for Number parameters as double
function.returnType = doubleIfNumber(function.returnType)
val valueParametersAdapters = function.valueParameters.map {
it.type.kotlinToJsAdapterIfNeeded(isReturn = false)
}
@@ -193,6 +203,16 @@ class JsInteropFunctionsLowering(val context: WasmBackendContext) : DeclarationT
}
val notNullType = makeNotNull()
if (notNullType == builtIns.numberType) {
return NullOrAdapter(
CombineAdapter(
FunctionBasedAdapter(adapters.kotlinDoubleToExternRefAdapter.owner),
FunctionBasedAdapter(adapters.numberToDoubleAdapter.owner)
)
)
}
val primitiveToExternRefAdapter = when (notNullType) {
builtIns.byteType -> adapters.kotlinByteToExternRefAdapter.owner
builtIns.shortType -> adapters.kotlinShortToExternRefAdapter.owner
@@ -222,6 +242,7 @@ class JsInteropFunctionsLowering(val context: WasmBackendContext) : DeclarationT
builtIns.stringType -> return FunctionBasedAdapter(adapters.kotlinToJsStringAdapter.owner)
builtIns.booleanType -> return FunctionBasedAdapter(adapters.kotlinBooleanToExternRefAdapter.owner)
builtIns.anyType -> return FunctionBasedAdapter(adapters.kotlinToJsAnyAdapter.owner)
builtIns.numberType -> return FunctionBasedAdapter(adapters.numberToDoubleAdapter.owner)
builtIns.byteType,
builtIns.shortType,