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