[WASM] Remove redundant bootstrap code
This commit is contained in:
@@ -62,49 +62,3 @@ internal fun <T> wasmInterfaceId(): Int =
|
|||||||
@ExcludedFromCodegen
|
@ExcludedFromCodegen
|
||||||
internal fun <T> wasmGetTypeInfoData(): TypeInfoData =
|
internal fun <T> wasmGetTypeInfoData(): TypeInfoData =
|
||||||
implementedAsIntrinsic
|
implementedAsIntrinsic
|
||||||
|
|
||||||
|
|
||||||
//REMOVE AFTER COMPILER BOOTSTRAP
|
|
||||||
internal const val TYPE_INFO_ITABLE_PTR_OFFSET = TYPE_INFO_SUPER_TYPE_OFFSET + TYPE_INFO_ELEMENT_SIZE
|
|
||||||
internal const val TYPE_INFO_VTABLE_LENGTH_OFFSET = TYPE_INFO_ITABLE_PTR_OFFSET + TYPE_INFO_ELEMENT_SIZE
|
|
||||||
internal const val TYPE_INFO_VTABLE_OFFSET = TYPE_INFO_VTABLE_LENGTH_OFFSET + TYPE_INFO_ELEMENT_SIZE
|
|
||||||
|
|
||||||
internal fun getVtablePtr(obj: Any): Int =
|
|
||||||
obj.typeInfo + TYPE_INFO_VTABLE_OFFSET
|
|
||||||
|
|
||||||
internal fun getVtableLength(obj: Any): Int =
|
|
||||||
wasm_i32_load(obj.typeInfo + TYPE_INFO_VTABLE_LENGTH_OFFSET)
|
|
||||||
|
|
||||||
internal fun getItablePtr(obj: Any): Int =
|
|
||||||
wasm_i32_load(obj.typeInfo + TYPE_INFO_ITABLE_PTR_OFFSET)
|
|
||||||
|
|
||||||
internal fun getInterfaceListLength(itablePtr: Int): Int =
|
|
||||||
wasm_i32_load(itablePtr + TYPE_INFO_VTABLE_LENGTH_OFFSET)
|
|
||||||
|
|
||||||
internal fun getVirtualMethodId(obj: Any, virtualFunctionSlot: Int): Int {
|
|
||||||
val vtablePtr = getVtablePtr(obj)
|
|
||||||
val methodIdPtr = vtablePtr + virtualFunctionSlot * TYPE_INFO_ELEMENT_SIZE
|
|
||||||
return wasm_i32_load(methodIdPtr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns -1 if obj does not implement interface
|
|
||||||
internal fun getInterfaceImplId(obj: Any, interfaceId: Int): Int {
|
|
||||||
val interfaceListSizePtr = getItablePtr(obj)
|
|
||||||
val interfaceListPtr = interfaceListSizePtr + TYPE_INFO_ELEMENT_SIZE
|
|
||||||
val interfaceListSize = wasm_i32_load(interfaceListSizePtr)
|
|
||||||
|
|
||||||
var interfaceSlot = 0
|
|
||||||
while (interfaceSlot < interfaceListSize) {
|
|
||||||
val supportedInterface = wasm_i32_load(interfaceListPtr + interfaceSlot * TYPE_INFO_ELEMENT_SIZE)
|
|
||||||
if (supportedInterface == interfaceId) {
|
|
||||||
return wasm_i32_load(interfaceListPtr + interfaceListSize * TYPE_INFO_ELEMENT_SIZE + interfaceSlot * TYPE_INFO_ELEMENT_SIZE)
|
|
||||||
}
|
|
||||||
interfaceSlot++
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun isInterface(obj: Any, interfaceId: Int): Boolean {
|
|
||||||
return getInterfaceImplId(obj, interfaceId) != -1
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user