QH
Size: a a a
QH
I
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?
>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
QH
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?
>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
I
I
QH
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?
>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
inline fun x(f: X.() -> Unit) { // calls in place EXACTLY ONCE
BP
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?
>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
QH
I
I
I
inline fun x(f: X.() -> Unit) { // calls in place EXACTLY ONCE
BP
QH
QH
QH
class Smth {
val whatever: Int
init {
calculate({ whatever = it }, 1)
}
@OptIn(ExperimentalContracts::class)
private inline fun calculate(
block: (Int) -> Unit, oneMore: Int
) {
contract {
callsInPlace(
block,
InvocationKind.EXACTLY_ONCE
)
}
block(0)
}
}
BP
I
QH
I
QH