[Wasm] extract some "mages numbers" to simplify their update and improve readability

In preparation for KT-59720
This commit is contained in:
Zalim Bashorov
2023-07-17 18:59:02 +02:00
committed by Space Team
parent 04dce8a3f0
commit a819a734b8
@@ -13,6 +13,23 @@ import org.jetbrains.kotlin.wasm.ir.source.location.Box
import org.jetbrains.kotlin.wasm.ir.source.location.SourceLocation
import org.jetbrains.kotlin.wasm.ir.source.location.SourceLocationMapping
private object WasmBinary {
const val MAGIC = 0x6d736100u
const val VERSION = 1u
// https://webassembly.github.io/spec/core/binary/instructions.html#control-instructions
const val EMPTY_TYPE_FOR_BLOCK: Byte = -0x40 // 0x40
// TODO Change the link to final spec when it's merged
// https://webassembly.github.io/gc/core/binary/types.html
const val FUNC_TYPE: Byte = -0x20 // 0x60
const val STRUCT_TYPE: Byte = -0x21 // 0x5F
const val ARRAY_TYPE: Byte = -0x22 // 0x5E
const val SUB_TYPE: Byte = -0x30 // 0x50
const val SUB_FINAL_TYPE: Byte = -0x32 // 0x4E
const val REC_GROUP: Byte = -0x31 // 0x4F
}
class WasmIrToBinary(
outputStream: OutputStream,
val module: WasmModule,
@@ -29,8 +46,8 @@ class WasmIrToBinary(
private var offsets = persistentListOf<Box>()
fun appendWasmModule() {
b.writeUInt32(0x6d736100u) // WebAssembly magic
b.writeUInt32(1u) // version
b.writeUInt32(WasmBinary.MAGIC)
b.writeUInt32(WasmBinary.VERSION)
with(module) {
// type section
@@ -39,7 +56,7 @@ class WasmIrToBinary(
appendVectorSize(functionTypes.size + numRecGroups)
functionTypes.forEach { appendFunctionTypeDeclaration(it) }
if (!recGroupTypes.isEmpty()) {
b.writeByte(0x4f)
b.writeVarInt7(WasmBinary.REC_GROUP)
appendVectorSize(recGroupTypes.size)
recGroupTypes.forEach {
when (it) {
@@ -297,7 +314,7 @@ class WasmIrToBinary(
}
private fun appendFunctionTypeDeclaration(type: WasmFunctionType) {
b.writeVarInt7(-0x20)
b.writeVarInt7(WasmBinary.FUNC_TYPE)
b.writeVarUInt32(type.parameterTypes.size)
type.parameterTypes.forEach { appendType(it) }
b.writeVarUInt32(type.resultTypes.size)
@@ -308,7 +325,7 @@ class WasmIrToBinary(
when (type) {
is WasmImmediate.BlockType.Function -> appendModuleFieldReference(type.type)
is WasmImmediate.BlockType.Value -> when (type.type) {
null -> b.writeVarInt7(-0x40)
null -> b.writeVarInt7(WasmBinary.EMPTY_TYPE_FOR_BLOCK)
else -> appendType(type.type)
}
}
@@ -320,7 +337,7 @@ class WasmIrToBinary(
}
private fun appendStructTypeDeclaration(type: WasmStructDeclaration) {
b.writeVarInt7(-0x30)
b.writeVarInt7(WasmBinary.SUB_TYPE)
val superType = type.superType
if (superType != null) {
@@ -330,7 +347,7 @@ class WasmIrToBinary(
appendVectorSize(0)
}
b.writeVarInt7(-0x21)
b.writeVarInt7(WasmBinary.STRUCT_TYPE)
b.writeVarUInt32(type.fields.size)
type.fields.forEach {
appendFiledType(it)
@@ -338,7 +355,7 @@ class WasmIrToBinary(
}
private fun appendArrayTypeDeclaration(type: WasmArrayDeclaration) {
b.writeVarInt7(-0x22)
b.writeVarInt7(WasmBinary.ARRAY_TYPE)
appendFiledType(type.field)
}