[Wasm] Introduce utilities to get package and name of class directly from metadata and use it in some places

This commit is contained in:
Zalim Bashorov
2023-03-28 22:40:58 +02:00
parent f206b0b72d
commit 14af47bbd9
8 changed files with 34 additions and 17 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
// TARGET_BACKEND: WASM
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 132_428
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 114_138
// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 6_517
// FILE: test.kt
+1 -1
View File
@@ -1,6 +1,6 @@
// TARGET_BACKEND: WASM
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 132_749
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 114_456
// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 6_458
fun box(): String {
+1 -1
View File
@@ -1,6 +1,6 @@
// TARGET_BACKEND: WASM
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 135_298
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 126_639
// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 6_956
// FILE: test.kt
+1 -1
View File
@@ -1,6 +1,6 @@
// TARGET_BACKEND: WASM
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 132_479
// WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 114_189
// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 6_389
fun box() = "OK"
+4 -2
View File
@@ -57,8 +57,10 @@ public open class Any @WasmPrimitiveConstructor constructor() {
* Returns a string representation of the object.
*/
public open fun toString(): String {
val typeData = getTypeInfoTypeDataByPtr(typeInfo)
val qualifiedName = if (typeData.packageName.isEmpty()) typeData.typeName else "${typeData.packageName}.${typeData.typeName}"
val typeInfoPtr = this.typeInfo
val packageName = getPackageName(typeInfoPtr)
val simpleName = getSimpleName(typeInfoPtr)
val qualifiedName = if (packageName.isEmpty()) simpleName else "$packageName.$simpleName"
return "$qualifiedName@${identityHashCode()}"
}
}
@@ -6,6 +6,7 @@
package kotlin
import kotlin.wasm.internal.ExternalInterfaceType
import kotlin.wasm.internal.getSimpleName
import kotlin.wasm.internal.jsToKotlinStringAdapter
/**
@@ -34,8 +35,7 @@ public open class Throwable(open val message: String?, open val cause: kotlin.Th
* followed by the exception message if it is not null.
*/
public override fun toString(): String {
val kClass = this::class
val s = kClass.simpleName ?: "Throwable"
val s = getSimpleName(this.typeInfo)
return if (message != null) s + ": " + message.toString() else s
}
}
@@ -17,7 +17,7 @@ private fun throwJsError(message: String?, wasmTypeName: String?, stack: String)
}
internal fun throwAsJsException(t: Throwable): Nothing {
throwJsError(t.message, t::class.simpleName, t.stackTraceToString())
throwJsError(t.message, getSimpleName(t.typeInfo), t.stackTraceToString())
}
internal var isNotFirstWasmExportCall: Boolean = false
@@ -25,17 +25,32 @@ internal val TypeInfoData.isInterfaceType
get() = typeId < 0
internal fun getTypeInfoTypeDataByPtr(typeInfoPtr: Int): TypeInfoData {
val fqNameLength = wasm_i32_load(typeInfoPtr + TYPE_INFO_TYPE_PACKAGE_NAME_LENGTH_OFFSET)
val fqNameId = wasm_i32_load(typeInfoPtr + TYPE_INFO_TYPE_PACKAGE_NAME_ID_OFFSET)
val fqNamePtr = wasm_i32_load(typeInfoPtr + TYPE_INFO_TYPE_PACKAGE_NAME_PRT_OFFSET)
val simpleNameLength = wasm_i32_load(typeInfoPtr + TYPE_INFO_TYPE_SIMPLE_NAME_LENGTH_OFFSET)
val simpleNameId = wasm_i32_load(typeInfoPtr + TYPE_INFO_TYPE_SIMPLE_NAME_ID_OFFSET)
val simpleNamePtr = wasm_i32_load(typeInfoPtr + TYPE_INFO_TYPE_SIMPLE_NAME_PRT_OFFSET)
val packageName = stringLiteral(fqNameId, fqNamePtr, fqNameLength)
val simpleName = stringLiteral(simpleNameId, simpleNamePtr, simpleNameLength)
val packageName = getPackageName(typeInfoPtr)
val simpleName = getSimpleName(typeInfoPtr)
return TypeInfoData(typeInfoPtr, packageName, simpleName)
}
internal fun getSimpleName(typeInfoPtr: Int) = getString(
typeInfoPtr,
TYPE_INFO_TYPE_SIMPLE_NAME_LENGTH_OFFSET,
TYPE_INFO_TYPE_SIMPLE_NAME_ID_OFFSET,
TYPE_INFO_TYPE_SIMPLE_NAME_PRT_OFFSET
)
internal fun getPackageName(typeInfoPtr: Int) = getString(
typeInfoPtr,
TYPE_INFO_TYPE_PACKAGE_NAME_LENGTH_OFFSET,
TYPE_INFO_TYPE_PACKAGE_NAME_ID_OFFSET,
TYPE_INFO_TYPE_PACKAGE_NAME_PRT_OFFSET
)
private fun getString(typeInfoPtr: Int, lengthOffset: Int, idOffset: Int, ptrOffset: Int): String {
val length = wasm_i32_load(typeInfoPtr + lengthOffset)
val id = wasm_i32_load(typeInfoPtr + idOffset)
val ptr = wasm_i32_load(typeInfoPtr + ptrOffset)
return stringLiteral(id, ptr, length)
}
internal fun getSuperTypeId(typeInfoPtr: Int): Int =
wasm_i32_load(typeInfoPtr + TYPE_INFO_SUPER_TYPE_OFFSET)