Ответ
Suspend-функции используют механизм Continuation Passing Style (CPS). При компиляции в байткод каждая suspend-функция получает дополнительный параметр Continuation, который хранит состояние и точку возобновления.
Когда функция приостанавливается (например, при вызове другой suspend-функции или delay()), она возвращает специальное значение COROUTINE_SUSPENDED. Это сигнализирует корутине, что выполнение нужно приостановить.
Пример:
suspend fun fetchData(): String {
delay(1000) // здесь происходит приостановка
return "Data"
}
После компиляции этот код превращается в машину состояний, где каждое состояние соответствует точке приостановки, а Continuation сохраняет текущее состояние и локальные переменные.