[Wasm] Introduce utilities to get package and name of class directly from metadata and use it in some places
This commit is contained in:
+1
-1
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user