| 405 | | stateAssignHack :: Exp -> Exp |
| 406 | | stateAssignHack exp@(Syn "=" [lhs, _]) | isStateAssign lhs = |
| 407 | | let pad = unsafePerformSTM $! do |
| 408 | | state_first_run <- newTVar =<< (fmap scalarRef $! newTVar (VInt 0)) |
| 409 | | state_fresh <- newTVar False |
| 410 | | return $! mkPad [(cast "$?STATE_START_RUN", [(state_fresh, state_first_run)])] in |
| 411 | | Syn "block" |
| 412 | | [ Pad SState pad $! |
| 413 | | Syn "if" |
| 414 | | [ App (_Var "&postfix:++") Nothing [_Var "$?STATE_START_RUN"] |
| 415 | | , lhs |
| 416 | | , exp |
| 417 | | ] |
| 418 | | ] |
| 419 | | where |
| 420 | | isStateAssign (Ann (Decl SState) _) = True |
| 421 | | isStateAssign (Ann _ exp) = isStateAssign exp |
| 422 | | isStateAssign _ = False |
| 423 | | stateAssignHack others = others |
| | 405 | declAssignHack :: Exp -> Exp |
| | 406 | declAssignHack exp@(Syn "=" [lhs, _]) |
| | 407 | | isDecl SState lhs = |
| | 408 | let pad = unsafePerformSTM $! do |
| | 409 | state_first_run <- newTVar =<< (fmap scalarRef $! newTVar (VInt 0)) |
| | 410 | state_fresh <- newTVar False |
| | 411 | return $! mkPad [(cast "$?STATE_START_RUN", [(state_fresh, state_first_run)])] in |
| | 412 | Syn "block" |
| | 413 | [ Pad SState pad $! |
| | 414 | Syn "if" |
| | 415 | [ App (_Var "&postfix:++") Nothing [_Var "$?STATE_START_RUN"] |
| | 416 | , lhs |
| | 417 | , exp |
| | 418 | ] |
| | 419 | ] |
| | 420 | where |
| | 421 | isDecl s (Ann (Decl d) _) = s == d |
| | 422 | isDecl s (Ann _ exp) = isDecl s exp |
| | 423 | isDecl _ _ = False |
| | 424 | declAssignHack others = others |