[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
@@ -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)