override fun writeCodeLocation()

in trace/src/main/org/jetbrains/lincheck/trace/SerializationBase.kt [331:367]


    override fun writeCodeLocation(id: Int) {
        check(!inTracepointBody) {
            "Cannot save reference data inside tracepoint"
        }
        if (id == UNKNOWN_CODE_LOCATION_ID) return
        if (contextState.isCodeLocationSaved(id)) return

        val codeLocation = context.stackTrace(id)
        val accessPath = context.accessPath(id)
        val argumentNames = context.methodCallArgumentNames(id)
        val activeLocalsNames = context.activeLocalsNames(id)
        // All strings only once. It will have duplications with class and method descriptors,
        // but size loss is negligible and this way is simpler
        val fileNameId = writeString(codeLocation.fileName)
        val classNameId = writeString(codeLocation.className)
        val methodNameId = writeString(codeLocation.methodName)
        val accessPathId = writeAccessPath(accessPath)
        val argumentNamesIds = argumentNames?.map { writeAccessPath(it) }
        val activeLocalsIds = activeLocalsNames?.map { writeString(it) }

        // Code location into data and position into index
        val position = currentDataPosition
        dataOutput.writeKind(ObjectKind.CODE_LOCATION)
        dataOutput.writeInt(id)
        dataOutput.writeInt(fileNameId)
        dataOutput.writeInt(classNameId)
        dataOutput.writeInt(methodNameId)
        dataOutput.writeInt(codeLocation.lineNumber)
        dataOutput.writeInt(accessPathId)
        dataOutput.writeInt(argumentNamesIds?.size ?: 0)
        argumentNamesIds?.forEach { dataOutput.writeInt(it) }
        dataOutput.writeInt(activeLocalsIds?.size ?: 0)
        activeLocalsIds?.forEach { dataOutput.writeInt(it) }
        contextState.markCodeLocationSaved(id)

        writeIndexCell(ObjectKind.CODE_LOCATION, id, position, -1)
    }