override fun beforeWriteField()

in src/jvm/main/org/jetbrains/kotlinx/lincheck/strategy/managed/ManagedStrategy.kt [1400:1440]


    override fun beforeWriteField(
        threadDescriptor: ThreadDescriptor,
        codeLocation: Int,
        obj: Any?,
        value: Any?,
        fieldId: Int
    ): Unit = threadDescriptor.runInsideIgnoredSection {
        val threadId = threadScheduler.getCurrentThreadId()
        val fieldDescriptor = context.getFieldDescriptor(fieldId)
        if (!fieldDescriptor.isStatic && obj == null) {
            return // ignore, `NullPointerException` will be thrown
        }
        updateSnapshotOnFieldAccess(obj, fieldDescriptor.className, fieldDescriptor.fieldName)
        objectTracker.registerObjectLink(fromObject = obj, toObject = value)
        if (!shouldTrackFieldAccess(obj, fieldDescriptor)) {
            getNextEventId() // increment event id as required by the method's contract
            return
        }
        newSwitchPoint(threadId, codeLocation)

        // TODO: consider moving trace point addition to `afterWriteField`.
        val eventId = getNextEventId()
        val tracePoint = if (collectTrace) {
            WriteTracePoint(
                context = context,
                eventId = eventId,
                iThread = threadId,
                actorId = currentActorId[threadId]!!,
                ownerRepresentation = findOwnerName(obj, fieldDescriptor.className, codeLocation),
                fieldName = fieldDescriptor.fieldName,
                codeLocation = codeLocation,
                isLocal = false,
            ).also {
                it.initializeWrittenValue(objectTracker.getObjectRepresentation(value), objectFqTypeName(value))
            }
        } else {
            null
        }
        traceCollector?.addTracePointInternal(tracePoint)
        loopDetector.beforeWriteField(obj, value)
    }