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)
}