← All posts tagged ghc

Хочу плагин к GHC, который вычисляет какие исключения может бросать функция. Причем, какой-нить тупой, ей даешь на вход текстовый файлик со списком:

Module.function : Module.Exception

он используя эту информацию собирает код и генерит на выходе файлик дополненый всеми собранными функциями, это же реально?

а можно каким-то образом отключать ghc-options: -event-log, если через cabal/stack включается --profile? Просто обычно с профилем не собираешь, а -event-log удобно выносить сразу в cabal файл, чтобы не забывать с ним собирать, т.к. с его поддержкой код пойдет в т.ч. в production.

1.hs:16:1: error:
• Invalid declaration for ‘FieldType’; you must explicitly
declare which variables are dependent on which others.
Inferred variable kinds:
p :: N
t :: Type
i :: Fin p
• In the type synonym declaration for ‘FieldType’


А вот как это явно указать?

Make the crash happen as early as possible. -debug already turned on lots of assertions, one of which might trigger. Also, try +RTS -DS which turns on a bunch of extra "sanity checking", i.e. expensive assertions about the state of the runtime at regular points. One thing this enables is a full sweep of the heap after each garbage collection to make sure there are no dangling references. Also, it fills all free memory with the value 0xaaaaaaaa (the sound of GHC disappearing down a hole).

В продолжение предыдущему посту:

```
Prelude Control.Exception> error "a" `catch` (\e -> getMaskingState >>= print . flip const (e :: SomeException))
MaskedInterruptible
Prelude Control.Exception> getMaskingState
Unmasked
```

Вот такое вот "ха-ха". Надо теперь потестить мелкие паттерны и подумать как теперь жить с этим знанием и насколько часто можно было допустить ошибку. Т.е. не пускать действие из exception handler а делать верно, т.е.

не

go `catchSome` (const go)

а, например,

let fix f = maybe (fix f) return (Just <$> f `catchSome` (cont $ return Nothing))
in fix go

Кто-нибудь может пояснить по: (комментарий из rts/Exceptions.cmm)

Furthermore, asynchronous exceptions are masked automatically during the execution of an exception handler.

Т.к. это выглядит очень странно и go `catch` (const go) явно ж не должен
пускать go второй раз с замаскированными исключениями. Ползать по всему коду base, чтобы проследить что там происходит мне лень :)



полный текст:


A thread can request that asynchronous exceptions not be delivered
("masked") for the duration of an I/O computation. The primitives

maskAsyncExceptions# :: IO a -> IO a

and

maskUninterruptible# :: IO a -> IO a

are used for this purpose. During a masked section, asynchronous
exceptions may be unmasked again temporarily:

unmaskAsyncExceptions# :: IO a -> IO a

Furthermore, asynchronous exceptions are masked automatically during
the execution of an exception handler. All three of these primitives
leave a continuation on the stack which reverts to the previous
state (masked interruptible, masked non-interruptible, or unmasked)
on exit.

без Functor m
compiler/utils/MonadUtils.hs:82:10:
Could not deduce (Functor m)
arising from the superclasses of an instance declaration
from the context (Monad m)
bound by the instance declaration
at compiler/utils/MonadUtils.hs:82:10-44
Possible fix:
add (Functor m) to the context of the instance declaration
In the instance declaration for ‘Applicative (StateT s m)’

с Functor m
compiler/utils/MonadUtils.hs:82:10: Warning:
Redundant constraint: Functor m
In the instance declaration for ‘Applicative (StateT s m)’