Monadify deSugar/DsUtils: use do, return, applicative, standard monad functions
[ghc-hetmet.git] / compiler / deSugar / DsUtils.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 Utilities for desugaring
7
8 This module exports some utility functions of no great interest.
9
10 \begin{code}
11
12 module DsUtils (
13         EquationInfo(..), 
14         firstPat, shiftEqns,
15         
16         mkDsLet, mkDsLets, mkDsApp, mkDsApps,
17
18         MatchResult(..), CanItFail(..), 
19         cantFailMatchResult, alwaysFailMatchResult,
20         extractMatchResult, combineMatchResults, 
21         adjustMatchResult,  adjustMatchResultDs,
22         mkCoLetMatchResult, mkViewMatchResult, mkGuardedMatchResult, 
23         matchCanFail, mkEvalMatchResult,
24         mkCoPrimCaseMatchResult, mkCoAlgCaseMatchResult,
25         wrapBind, wrapBinds,
26
27         mkErrorAppDs, mkNilExpr, mkConsExpr, mkListExpr,
28         mkIntExpr, mkCharExpr,
29         mkStringExpr, mkStringExprFS, mkIntegerExpr, 
30
31     seqVar,
32         
33     -- Core tuples
34     mkCoreVarTup, mkCoreTup, mkCoreVarTupTy, mkCoreTupTy, 
35     mkBigCoreVarTup, mkBigCoreTup, mkBigCoreVarTupTy, mkBigCoreTupTy,
36     
37     -- LHs tuples
38     mkLHsVarTup, mkLHsTup, mkLHsVarPatTup, mkLHsPatTup,
39     mkBigLHsVarTup, mkBigLHsTup, mkBigLHsVarPatTup, mkBigLHsPatTup,
40     
41     -- Tuple bindings
42         mkSelectorBinds, mkTupleSelector, 
43         mkSmallTupleCase, mkTupleCase, 
44         
45         dsSyntaxTable, lookupEvidence,
46
47         selectSimpleMatchVarL, selectMatchVars, selectMatchVar,
48         mkTickBox, mkOptTickBox, mkBinaryTickBox
49     ) where
50
51 #include "HsVersions.h"
52
53 import {-# SOURCE #-}   Match ( matchSimply )
54 import {-# SOURCE #-}   DsExpr( dsExpr )
55
56 import HsSyn
57 import TcHsSyn
58 import CoreSyn
59 import Constants
60 import DsMonad
61
62 import CoreUtils
63 import MkId
64 import Id
65 import Var
66 import Name
67 import Literal
68 import TyCon
69 import DataCon
70 import Type
71 import Coercion
72 import TysPrim
73 import TysWiredIn
74 import BasicTypes
75 import UniqSet
76 import UniqSupply
77 import PrelNames
78 import Outputable
79 import SrcLoc
80 import Util
81 import ListSetOps
82 import FastString
83 import StaticFlags
84
85 import Data.Char
86
87 infixl 4 `mkDsApp`, `mkDsApps`
88 \end{code}
89
90
91
92 %************************************************************************
93 %*                                                                      *
94                 Rebindable syntax
95 %*                                                                      *
96 %************************************************************************
97
98 \begin{code}
99 dsSyntaxTable :: SyntaxTable Id 
100                -> DsM ([CoreBind],      -- Auxiliary bindings
101                        [(Name,Id)])     -- Maps the standard name to its value
102
103 dsSyntaxTable rebound_ids = do
104     (binds_s, prs) <- mapAndUnzipM mk_bind rebound_ids
105     return (concat binds_s, prs)
106   where
107         -- The cheapo special case can happen when we 
108         -- make an intermediate HsDo when desugaring a RecStmt
109     mk_bind (std_name, HsVar id) = return ([], (std_name, id))
110     mk_bind (std_name, expr) = do
111            rhs <- dsExpr expr
112            id <- newSysLocalDs (exprType rhs)
113            return ([NonRec id rhs], (std_name, id))
114
115 lookupEvidence :: [(Name, Id)] -> Name -> Id
116 lookupEvidence prs std_name
117   = assocDefault (mk_panic std_name) prs std_name
118   where
119     mk_panic std_name = pprPanic "dsSyntaxTable" (ptext SLIT("Not found:") <+> ppr std_name)
120 \end{code}
121
122
123 %************************************************************************
124 %*                                                                      *
125 \subsection{Building lets}
126 %*                                                                      *
127 %************************************************************************
128
129 Use case, not let for unlifted types.  The simplifier will turn some
130 back again.
131
132 \begin{code}
133 mkDsLet :: CoreBind -> CoreExpr -> CoreExpr
134 mkDsLet (NonRec bndr rhs) body  -- See Note [CoreSyn let/app invariant]
135   | isUnLiftedType (idType bndr) && not (exprOkForSpeculation rhs)
136   = Case rhs bndr (exprType body) [(DEFAULT,[],body)]
137 mkDsLet bind body
138   = Let bind body
139
140 mkDsLets :: [CoreBind] -> CoreExpr -> CoreExpr
141 mkDsLets binds body = foldr mkDsLet body binds
142
143 -----------
144 mkDsApp :: CoreExpr -> CoreExpr -> CoreExpr
145 -- Check the invariant that the arg of an App is ok-for-speculation if unlifted
146 -- See CoreSyn Note [CoreSyn let/app invariant]
147 mkDsApp fun (Type ty) = App fun (Type ty)
148 mkDsApp fun arg       = mk_val_app fun arg arg_ty res_ty
149                       where
150                         (arg_ty, res_ty) = splitFunTy (exprType fun)
151
152 -----------
153 mkDsApps :: CoreExpr -> [CoreExpr] -> CoreExpr
154 -- Slightly more efficient version of (foldl mkDsApp)
155 mkDsApps fun args
156   = go fun (exprType fun) args
157   where
158     go fun _      []               = fun
159     go fun fun_ty (Type ty : args) = go (App fun (Type ty)) (applyTy fun_ty ty) args
160     go fun fun_ty (arg     : args) = go (mk_val_app fun arg arg_ty res_ty) res_ty args
161                                    where
162                                      (arg_ty, res_ty) = splitFunTy fun_ty
163 -----------
164 mk_val_app :: CoreExpr -> CoreExpr -> Type -> Type -> CoreExpr
165 mk_val_app fun arg arg_ty _     -- See Note [CoreSyn let/app invariant]
166   | not (isUnLiftedType arg_ty) || exprOkForSpeculation arg
167   = App fun arg         -- The vastly common case
168
169 mk_val_app (Var f `App` Type ty1 `App` Type _ `App` arg1) arg2 _ res_ty
170   | f == seqId          -- Note [Desugaring seq]
171   = Case arg1 (mkWildId ty1) res_ty [(DEFAULT,[],arg2)]
172
173 mk_val_app fun arg arg_ty res_ty
174   = Case arg (mkWildId arg_ty) res_ty [(DEFAULT,[],App fun (Var arg_id))]
175   where
176     arg_id = mkWildId arg_ty    -- Lots of shadowing, but it doesn't matter,
177                                 -- because 'fun ' should not have a free wild-id
178 \end{code}
179
180 Note [Desugaring seq]  cf Trac #1031
181 ~~~~~~~~~~~~~~~~~~~~~
182    f x y = x `seq` (y `seq` (# x,y #))
183
184 The [CoreSyn let/app invariant] means that, other things being equal, because 
185 the argument to the outer 'seq' has an unlifted type, we'll use call-by-value thus:
186
187    f x y = case (y `seq` (# x,y #)) of v -> x `seq` v
188
189 But that is bad for two reasons: 
190   (a) we now evaluate y before x, and 
191   (b) we can't bind v to an unboxed pair
192
193 Seq is very, very special!  So we recognise it right here, and desugar to
194         case x of _ -> case y of _ -> (# x,y #)
195
196 The special case would be valid for all calls to 'seq', but it's only *necessary*
197 for ones whose second argument has an unlifted type. So we only catch the latter
198 case here, to avoid unnecessary tests.
199
200
201 %************************************************************************
202 %*                                                                      *
203 \subsection{ Selecting match variables}
204 %*                                                                      *
205 %************************************************************************
206
207 We're about to match against some patterns.  We want to make some
208 @Ids@ to use as match variables.  If a pattern has an @Id@ readily at
209 hand, which should indeed be bound to the pattern as a whole, then use it;
210 otherwise, make one up.
211
212 \begin{code}
213 selectSimpleMatchVarL :: LPat Id -> DsM Id
214 selectSimpleMatchVarL pat = selectMatchVar (unLoc pat)
215
216 -- (selectMatchVars ps tys) chooses variables of type tys
217 -- to use for matching ps against.  If the pattern is a variable,
218 -- we try to use that, to save inventing lots of fresh variables.
219 --
220 -- OLD, but interesting note:
221 --    But even if it is a variable, its type might not match.  Consider
222 --      data T a where
223 --        T1 :: Int -> T Int
224 --        T2 :: a   -> T a
225 --
226 --      f :: T a -> a -> Int
227 --      f (T1 i) (x::Int) = x
228 --      f (T2 i) (y::a)   = 0
229 --    Then we must not choose (x::Int) as the matching variable!
230 -- And nowadays we won't, because the (x::Int) will be wrapped in a CoPat
231
232 selectMatchVars :: [Pat Id] -> DsM [Id]
233 selectMatchVars ps = mapM selectMatchVar ps
234
235 selectMatchVar :: Pat Id -> DsM Id
236 selectMatchVar (BangPat pat)   = selectMatchVar (unLoc pat)
237 selectMatchVar (LazyPat pat)   = selectMatchVar (unLoc pat)
238 selectMatchVar (ParPat pat)    = selectMatchVar (unLoc pat)
239 selectMatchVar (VarPat var)    = return var
240 selectMatchVar (AsPat var _) = return (unLoc var)
241 selectMatchVar other_pat       = newSysLocalDs (hsPatType other_pat)
242                                   -- OK, better make up one...
243 \end{code}
244
245
246 %************************************************************************
247 %*                                                                      *
248 %* type synonym EquationInfo and access functions for its pieces        *
249 %*                                                                      *
250 %************************************************************************
251 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
252
253 The ``equation info'' used by @match@ is relatively complicated and
254 worthy of a type synonym and a few handy functions.
255
256 \begin{code}
257 firstPat :: EquationInfo -> Pat Id
258 firstPat eqn = ASSERT( notNull (eqn_pats eqn) ) head (eqn_pats eqn)
259
260 shiftEqns :: [EquationInfo] -> [EquationInfo]
261 -- Drop the first pattern in each equation
262 shiftEqns eqns = [ eqn { eqn_pats = tail (eqn_pats eqn) } | eqn <- eqns ]
263 \end{code}
264
265 Functions on MatchResults
266
267 \begin{code}
268 matchCanFail :: MatchResult -> Bool
269 matchCanFail (MatchResult CanFail _)  = True
270 matchCanFail (MatchResult CantFail _) = False
271
272 alwaysFailMatchResult :: MatchResult
273 alwaysFailMatchResult = MatchResult CanFail (\fail -> return fail)
274
275 cantFailMatchResult :: CoreExpr -> MatchResult
276 cantFailMatchResult expr = MatchResult CantFail (\_ -> return expr)
277
278 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
279 extractMatchResult (MatchResult CantFail match_fn) _
280   = match_fn (error "It can't fail!")
281
282 extractMatchResult (MatchResult CanFail match_fn) fail_expr = do
283     (fail_bind, if_it_fails) <- mkFailurePair fail_expr
284     body <- match_fn if_it_fails
285     return (mkDsLet fail_bind body)
286
287
288 combineMatchResults :: MatchResult -> MatchResult -> MatchResult
289 combineMatchResults (MatchResult CanFail      body_fn1)
290                     (MatchResult can_it_fail2 body_fn2)
291   = MatchResult can_it_fail2 body_fn
292   where
293     body_fn fail = do body2 <- body_fn2 fail
294                       (fail_bind, duplicatable_expr) <- mkFailurePair body2
295                       body1 <- body_fn1 duplicatable_expr
296                       return (Let fail_bind body1)
297
298 combineMatchResults match_result1@(MatchResult CantFail _) _
299   = match_result1
300
301 adjustMatchResult :: DsWrapper -> MatchResult -> MatchResult
302 adjustMatchResult encl_fn (MatchResult can_it_fail body_fn)
303   = MatchResult can_it_fail (\fail -> encl_fn <$> body_fn fail)
304
305 adjustMatchResultDs :: (CoreExpr -> DsM CoreExpr) -> MatchResult -> MatchResult
306 adjustMatchResultDs encl_fn (MatchResult can_it_fail body_fn)
307   = MatchResult can_it_fail (\fail -> encl_fn =<< body_fn fail)
308
309 wrapBinds :: [(Var,Var)] -> CoreExpr -> CoreExpr
310 wrapBinds [] e = e
311 wrapBinds ((new,old):prs) e = wrapBind new old (wrapBinds prs e)
312
313 wrapBind :: Var -> Var -> CoreExpr -> CoreExpr
314 wrapBind new old body
315   | new==old    = body
316   | isTyVar new = App (Lam new body) (Type (mkTyVarTy old))
317   | otherwise   = Let (NonRec new (Var old)) body
318
319 seqVar :: Var -> CoreExpr -> CoreExpr
320 seqVar var body = Case (Var var) var (exprType body)
321                         [(DEFAULT, [], body)]
322
323 mkCoLetMatchResult :: CoreBind -> MatchResult -> MatchResult
324 mkCoLetMatchResult bind = adjustMatchResult (mkDsLet bind)
325
326 -- (mkViewMatchResult var' viewExpr var mr) makes the expression
327 -- let var' = viewExpr var in mr
328 mkViewMatchResult :: Id -> CoreExpr -> Id -> MatchResult -> MatchResult
329 mkViewMatchResult var' viewExpr var = 
330     adjustMatchResult (mkDsLet (NonRec var' (mkDsApp viewExpr (Var var))))
331
332 mkEvalMatchResult :: Id -> Type -> MatchResult -> MatchResult
333 mkEvalMatchResult var ty
334   = adjustMatchResult (\e -> Case (Var var) var ty [(DEFAULT, [], e)]) 
335
336 mkGuardedMatchResult :: CoreExpr -> MatchResult -> MatchResult
337 mkGuardedMatchResult pred_expr (MatchResult _ body_fn)
338   = MatchResult CanFail (\fail -> do body <- body_fn fail
339                                      return (mkIfThenElse pred_expr body fail))
340
341 mkCoPrimCaseMatchResult :: Id                           -- Scrutinee
342                     -> Type                             -- Type of the case
343                     -> [(Literal, MatchResult)]         -- Alternatives
344                     -> MatchResult
345 mkCoPrimCaseMatchResult var ty match_alts
346   = MatchResult CanFail mk_case
347   where
348     mk_case fail = do
349         alts <- mapM (mk_alt fail) sorted_alts
350         return (Case (Var var) var ty ((DEFAULT, [], fail) : alts))
351
352     sorted_alts = sortWith fst match_alts       -- Right order for a Case
353     mk_alt fail (lit, MatchResult _ body_fn) = do body <- body_fn fail
354                                                   return (LitAlt lit, [], body)
355
356
357 mkCoAlgCaseMatchResult :: Id                                    -- Scrutinee
358                     -> Type                                     -- Type of exp
359                     -> [(DataCon, [CoreBndr], MatchResult)]     -- Alternatives
360                     -> MatchResult
361 mkCoAlgCaseMatchResult var ty match_alts 
362   | isNewTyCon tycon            -- Newtype case; use a let
363   = ASSERT( null (tail match_alts) && null (tail arg_ids1) )
364     mkCoLetMatchResult (NonRec arg_id1 newtype_rhs) match_result1
365
366   | isPArrFakeAlts match_alts   -- Sugared parallel array; use a literal case 
367   = MatchResult CanFail mk_parrCase
368
369   | otherwise                   -- Datatype case; use a case
370   = MatchResult fail_flag mk_case
371   where
372     tycon = dataConTyCon con1
373         -- [Interesting: becuase of GADTs, we can't rely on the type of 
374         --  the scrutinised Id to be sufficiently refined to have a TyCon in it]
375
376         -- Stuff for newtype
377     (con1, arg_ids1, match_result1) = ASSERT( notNull match_alts ) head match_alts
378     arg_id1     = ASSERT( notNull arg_ids1 ) head arg_ids1
379     var_ty      = idType var
380     (tc, ty_args) = splitNewTyConApp var_ty
381     newtype_rhs = unwrapNewTypeBody tc ty_args (Var var)
382                 
383         -- Stuff for data types
384     data_cons      = tyConDataCons tycon
385     match_results  = [match_result | (_,_,match_result) <- match_alts]
386
387     fail_flag | exhaustive_case
388               = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
389               | otherwise
390               = CanFail
391
392     wild_var = mkWildId (idType var)
393     sorted_alts  = sortWith get_tag match_alts
394     get_tag (con, _, _) = dataConTag con
395     mk_case fail = do alts <- mapM (mk_alt fail) sorted_alts
396                       return (Case (Var var) wild_var ty (mk_default fail ++ alts))
397
398     mk_alt fail (con, args, MatchResult _ body_fn) = do
399           body <- body_fn fail
400           us <- newUniqueSupply
401           return (mkReboxingAlt (uniqsFromSupply us) con args body)
402
403     mk_default fail | exhaustive_case = []
404                     | otherwise       = [(DEFAULT, [], fail)]
405
406     un_mentioned_constructors
407         = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
408     exhaustive_case = isEmptyUniqSet un_mentioned_constructors
409
410         -- Stuff for parallel arrays
411         -- 
412         --  * the following is to desugar cases over fake constructors for
413         --   parallel arrays, which are introduced by `tidy1' in the `PArrPat'
414         --   case
415         --
416         -- Concerning `isPArrFakeAlts':
417         --
418         --  * it is *not* sufficient to just check the type of the type
419         --   constructor, as we have to be careful not to confuse the real
420         --   representation of parallel arrays with the fake constructors;
421         --   moreover, a list of alternatives must not mix fake and real
422         --   constructors (this is checked earlier on)
423         --
424         -- FIXME: We actually go through the whole list and make sure that
425         --        either all or none of the constructors are fake parallel
426         --        array constructors.  This is to spot equations that mix fake
427         --        constructors with the real representation defined in
428         --        `PrelPArr'.  It would be nicer to spot this situation
429         --        earlier and raise a proper error message, but it can really
430         --        only happen in `PrelPArr' anyway.
431         --
432     isPArrFakeAlts [(dcon, _, _)]      = isPArrFakeCon dcon
433     isPArrFakeAlts ((dcon, _, _):alts) = 
434       case (isPArrFakeCon dcon, isPArrFakeAlts alts) of
435         (True , True ) -> True
436         (False, False) -> False
437         _              -> panic "DsUtils: you may not mix `[:...:]' with `PArr' patterns"
438     isPArrFakeAlts [] = panic "DsUtils: unexpectedly found an empty list of PArr fake alternatives"
439     --
440     mk_parrCase fail = do
441       lengthP <- dsLookupGlobalId lengthPName
442       alt <- unboxAlt
443       return (Case (len lengthP) (mkWildId intTy) ty [alt])
444       where
445         elemTy      = case splitTyConApp (idType var) of
446                         (_, [elemTy]) -> elemTy
447                         _               -> panic panicMsg
448         panicMsg    = "DsUtils.mkCoAlgCaseMatchResult: not a parallel array?"
449         len lengthP = mkApps (Var lengthP) [Type elemTy, Var var]
450         --
451         unboxAlt = do
452           l      <- newSysLocalDs intPrimTy
453           indexP <- dsLookupGlobalId indexPName
454           alts   <- mapM (mkAlt indexP) sorted_alts
455           return (DataAlt intDataCon, [l], (Case (Var l) wild ty (dft : alts)))
456           where
457             wild = mkWildId intPrimTy
458             dft  = (DEFAULT, [], fail)
459         --
460         -- each alternative matches one array length (corresponding to one
461         -- fake array constructor), so the match is on a literal; each
462         -- alternative's body is extended by a local binding for each
463         -- constructor argument, which are bound to array elements starting
464         -- with the first
465         --
466         mkAlt indexP (con, args, MatchResult _ bodyFun) = do
467           body <- bodyFun fail
468           return (LitAlt lit, [], mkDsLets binds body)
469           where
470             lit   = MachInt $ toInteger (dataConSourceArity con)
471             binds = [NonRec arg (indexExpr i) | (i, arg) <- zip [1..] args]
472             --
473             indexExpr i = mkApps (Var indexP) [Type elemTy, Var var, mkIntExpr i]
474 \end{code}
475
476
477 %************************************************************************
478 %*                                                                      *
479 \subsection{Desugarer's versions of some Core functions}
480 %*                                                                      *
481 %************************************************************************
482
483 \begin{code}
484 mkErrorAppDs :: Id              -- The error function
485              -> Type            -- Type to which it should be applied
486              -> String          -- The error message string to pass
487              -> DsM CoreExpr
488
489 mkErrorAppDs err_id ty msg = do
490     src_loc <- getSrcSpanDs
491     let
492         full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
493         core_msg = Lit (mkStringLit full_msg)
494         -- mkStringLit returns a result of type String#
495     return (mkApps (Var err_id) [Type ty, core_msg])
496 \end{code}
497
498
499 *************************************************************
500 %*                                                                      *
501 \subsection{Making literals}
502 %*                                                                      *
503 %************************************************************************
504
505 \begin{code}
506 mkCharExpr     :: Char       -> CoreExpr      -- Returns        C# c :: Int
507 mkIntExpr      :: Integer    -> CoreExpr      -- Returns        I# i :: Int
508 mkIntegerExpr  :: Integer    -> DsM CoreExpr  -- Result :: Integer
509 mkStringExpr   :: String     -> DsM CoreExpr  -- Result :: String
510 mkStringExprFS :: FastString -> DsM CoreExpr  -- Result :: String
511
512 mkIntExpr  i = mkConApp intDataCon  [mkIntLit i]
513 mkCharExpr c = mkConApp charDataCon [mkLit (MachChar c)]
514
515 mkIntegerExpr i
516   | inIntRange i        -- Small enough, so start from an Int
517     = do integer_dc <- dsLookupDataCon  smallIntegerDataConName
518          return (mkSmallIntegerLit integer_dc i)
519
520 -- Special case for integral literals with a large magnitude:
521 -- They are transformed into an expression involving only smaller
522 -- integral literals. This improves constant folding.
523
524   | otherwise = do       -- Big, so start from a string
525       plus_id <- dsLookupGlobalId plusIntegerName
526       times_id <- dsLookupGlobalId timesIntegerName
527       integer_dc <- dsLookupDataCon  smallIntegerDataConName
528       let
529            lit i = mkSmallIntegerLit integer_dc i
530            plus a b  = Var plus_id  `App` a `App` b
531            times a b = Var times_id `App` a `App` b
532
533            -- Transform i into (x1 + (x2 + (x3 + (...) * b) * b) * b) with abs xi <= b
534            horner :: Integer -> Integer -> CoreExpr
535            horner b i | abs q <= 1 = if r == 0 || r == i 
536                                      then lit i 
537                                      else lit r `plus` lit (i-r)
538                       | r == 0     =               horner b q `times` lit b
539                       | otherwise  = lit r `plus` (horner b q `times` lit b)
540                       where
541                         (q,r) = i `quotRem` b
542
543       return (horner tARGET_MAX_INT i)
544
545 mkSmallIntegerLit :: DataCon -> Integer -> CoreExpr
546 mkSmallIntegerLit small_integer_data_con i = mkConApp small_integer_data_con [mkIntLit i]
547
548 mkStringExpr str = mkStringExprFS (mkFastString str)
549
550 mkStringExprFS str
551   | nullFS str
552   = return (mkNilExpr charTy)
553
554   | lengthFS str == 1
555   = do let the_char = mkCharExpr (headFS str)
556        return (mkConsExpr charTy the_char (mkNilExpr charTy))
557
558   | all safeChar chars
559   = do unpack_id <- dsLookupGlobalId unpackCStringName
560        return (App (Var unpack_id) (Lit (MachStr str)))
561
562   | otherwise
563   = do unpack_id <- dsLookupGlobalId unpackCStringUtf8Name
564        return (App (Var unpack_id) (Lit (MachStr str)))
565
566   where
567     chars = unpackFS str
568     safeChar c = ord c >= 1 && ord c <= 0x7F
569 \end{code}
570
571
572 %************************************************************************
573 %*                                                                      *
574 \subsection[mkSelectorBind]{Make a selector bind}
575 %*                                                                      *
576 %************************************************************************
577
578 This is used in various places to do with lazy patterns.
579 For each binder $b$ in the pattern, we create a binding:
580 \begin{verbatim}
581     b = case v of pat' -> b'
582 \end{verbatim}
583 where @pat'@ is @pat@ with each binder @b@ cloned into @b'@.
584
585 ToDo: making these bindings should really depend on whether there's
586 much work to be done per binding.  If the pattern is complex, it
587 should be de-mangled once, into a tuple (and then selected from).
588 Otherwise the demangling can be in-line in the bindings (as here).
589
590 Boring!  Boring!  One error message per binder.  The above ToDo is
591 even more helpful.  Something very similar happens for pattern-bound
592 expressions.
593
594 \begin{code}
595 mkSelectorBinds :: LPat Id      -- The pattern
596                 -> CoreExpr     -- Expression to which the pattern is bound
597                 -> DsM [(Id,CoreExpr)]
598
599 mkSelectorBinds (L _ (VarPat v)) val_expr
600   = return [(v, val_expr)]
601
602 mkSelectorBinds pat val_expr
603   | isSingleton binders || is_simple_lpat pat = do
604         -- Given   p = e, where p binds x,y
605         -- we are going to make
606         --      v = p   (where v is fresh)
607         --      x = case v of p -> x
608         --      y = case v of p -> x
609
610         -- Make up 'v'
611         -- NB: give it the type of *pattern* p, not the type of the *rhs* e.
612         -- This does not matter after desugaring, but there's a subtle 
613         -- issue with implicit parameters. Consider
614         --      (x,y) = ?i
615         -- Then, ?i is given type {?i :: Int}, a PredType, which is opaque
616         -- to the desugarer.  (Why opaque?  Because newtypes have to be.  Why
617         -- does it get that type?  So that when we abstract over it we get the
618         -- right top-level type  (?i::Int) => ...)
619         --
620         -- So to get the type of 'v', use the pattern not the rhs.  Often more
621         -- efficient too.
622       val_var <- newSysLocalDs (hsLPatType pat)
623
624         -- For the error message we make one error-app, to avoid duplication.
625         -- But we need it at different types... so we use coerce for that
626       err_expr <- mkErrorAppDs iRREFUT_PAT_ERROR_ID  unitTy (showSDoc (ppr pat))
627       err_var <- newSysLocalDs unitTy
628       binds <- mapM (mk_bind val_var err_var) binders
629       return ( (val_var, val_expr) : 
630                (err_var, err_expr) :
631                binds )
632
633
634   | otherwise = do
635       error_expr <- mkErrorAppDs iRREFUT_PAT_ERROR_ID   tuple_ty (showSDoc (ppr pat))
636       tuple_expr <- matchSimply val_expr PatBindRhs pat local_tuple error_expr
637       tuple_var <- newSysLocalDs tuple_ty
638       let
639           mk_tup_bind binder
640             = (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
641       return ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
642   where
643     binders     = collectPatBinders pat
644     local_tuple = mkBigCoreVarTup binders
645     tuple_ty    = exprType local_tuple
646
647     mk_bind scrut_var err_var bndr_var = do
648     -- (mk_bind sv err_var) generates
649     --          bv = case sv of { pat -> bv; other -> coerce (type-of-bv) err_var }
650     -- Remember, pat binds bv
651         rhs_expr <- matchSimply (Var scrut_var) PatBindRhs pat
652                                 (Var bndr_var) error_expr
653         return (bndr_var, rhs_expr)
654       where
655         error_expr = mkCoerce co (Var err_var)
656         co         = mkUnsafeCoercion (exprType (Var err_var)) (idType bndr_var)
657
658     is_simple_lpat p = is_simple_pat (unLoc p)
659
660     is_simple_pat (TuplePat ps Boxed _)        = all is_triv_lpat ps
661     is_simple_pat (ConPatOut{ pat_args = ps }) = all is_triv_lpat (hsConPatArgs ps)
662     is_simple_pat (VarPat _)                   = True
663     is_simple_pat (ParPat p)                   = is_simple_lpat p
664     is_simple_pat _                                    = False
665
666     is_triv_lpat p = is_triv_pat (unLoc p)
667
668     is_triv_pat (VarPat _)  = True
669     is_triv_pat (WildPat _) = True
670     is_triv_pat (ParPat p)  = is_triv_lpat p
671     is_triv_pat _           = False
672 \end{code}
673
674
675 %************************************************************************
676 %*                                                                      *
677                 Big Tuples
678 %*                                                                      *
679 %************************************************************************
680
681 Nesting policy.  Better a 2-tuple of 10-tuples (3 objects) than
682 a 10-tuple of 2-tuples (11 objects).  So we want the leaves to be big.
683
684 \begin{code}
685
686 mkBigTuple :: ([a] -> a) -> [a] -> a
687 mkBigTuple small_tuple as = mk_big_tuple (chunkify as)
688   where
689         -- Each sub-list is short enough to fit in a tuple
690     mk_big_tuple [as] = small_tuple as
691     mk_big_tuple as_s = mk_big_tuple (chunkify (map small_tuple as_s))
692
693 chunkify :: [a] -> [[a]]
694 -- The sub-lists of the result all have length <= mAX_TUPLE_SIZE
695 -- But there may be more than mAX_TUPLE_SIZE sub-lists
696 chunkify xs
697   | n_xs <= mAX_TUPLE_SIZE = {- pprTrace "Small" (ppr n_xs) -} [xs] 
698   | otherwise                  = {- pprTrace "Big"   (ppr n_xs) -} (split xs)
699   where
700     n_xs     = length xs
701     split [] = []
702     split xs = take mAX_TUPLE_SIZE xs : split (drop mAX_TUPLE_SIZE xs)
703     
704 \end{code}
705
706 Creating tuples and their types for Core expressions 
707
708 @mkBigCoreVarTup@ builds a tuple; the inverse to @mkTupleSelector@.  
709
710 * If it has only one element, it is the identity function.
711
712 * If there are more elements than a big tuple can have, it nests 
713   the tuples.  
714
715 \begin{code}
716
717 -- Small tuples: build exactly the specified tuple
718 mkCoreVarTup :: [Id] -> CoreExpr
719 mkCoreVarTup ids = mkCoreTup (map Var ids)
720
721 mkCoreVarTupTy :: [Id] -> Type
722 mkCoreVarTupTy ids = mkCoreTupTy (map idType ids)
723
724
725 mkCoreTup :: [CoreExpr] -> CoreExpr
726 mkCoreTup []  = Var unitDataConId
727 mkCoreTup [c] = c
728 mkCoreTup cs  = mkConApp (tupleCon Boxed (length cs))
729                          (map (Type . exprType) cs ++ cs)
730
731 mkCoreTupTy :: [Type] -> Type
732 mkCoreTupTy [ty] = ty
733 mkCoreTupTy tys  = mkTupleTy Boxed (length tys) tys
734
735
736
737 -- Big tuples
738 mkBigCoreVarTup :: [Id] -> CoreExpr
739 mkBigCoreVarTup ids = mkBigCoreTup (map Var ids)
740
741 mkBigCoreVarTupTy :: [Id] -> Type
742 mkBigCoreVarTupTy ids = mkBigCoreTupTy (map idType ids)
743
744
745 mkBigCoreTup :: [CoreExpr] -> CoreExpr
746 mkBigCoreTup = mkBigTuple mkCoreTup
747
748 mkBigCoreTupTy :: [Type] -> Type
749 mkBigCoreTupTy = mkBigTuple mkCoreTupTy
750
751 \end{code}
752
753 Creating tuples and their types for full Haskell expressions
754
755 \begin{code}
756
757 -- Smart constructors for source tuple expressions
758 mkLHsVarTup :: [Id] -> LHsExpr Id
759 mkLHsVarTup ids  = mkLHsTup (map nlHsVar ids)
760
761 mkLHsTup :: [LHsExpr Id] -> LHsExpr Id
762 mkLHsTup []     = nlHsVar unitDataConId
763 mkLHsTup [lexp] = lexp
764 mkLHsTup lexps  = noLoc $ ExplicitTuple lexps Boxed
765
766
767 -- Smart constructors for source tuple patterns
768 mkLHsVarPatTup :: [Id] -> LPat Id
769 mkLHsVarPatTup bs  = mkLHsPatTup (map nlVarPat bs)
770
771 mkLHsPatTup :: [LPat Id] -> LPat Id
772 mkLHsPatTup [lpat] = lpat
773 mkLHsPatTup lpats  = noLoc $ mkVanillaTuplePat lpats Boxed -- Handles the case where lpats = [] gracefully
774
775
776 -- The Big equivalents for the source tuple expressions
777 mkBigLHsVarTup :: [Id] -> LHsExpr Id
778 mkBigLHsVarTup ids = mkBigLHsTup (map nlHsVar ids)
779
780 mkBigLHsTup :: [LHsExpr Id] -> LHsExpr Id
781 mkBigLHsTup = mkBigTuple mkLHsTup
782
783
784 -- The Big equivalents for the source tuple patterns
785 mkBigLHsVarPatTup :: [Id] -> LPat Id
786 mkBigLHsVarPatTup bs = mkBigLHsPatTup (map nlVarPat bs)
787
788 mkBigLHsPatTup :: [LPat Id] -> LPat Id
789 mkBigLHsPatTup = mkBigTuple mkLHsPatTup
790
791 \end{code}
792
793
794 @mkTupleSelector@ builds a selector which scrutises the given
795 expression and extracts the one name from the list given.
796 If you want the no-shadowing rule to apply, the caller
797 is responsible for making sure that none of these names
798 are in scope.
799
800 If there is just one id in the ``tuple'', then the selector is
801 just the identity.
802
803 If it's big, it does nesting
804         mkTupleSelector [a,b,c,d] b v e
805           = case e of v { 
806                 (p,q) -> case p of p {
807                            (a,b) -> b }}
808 We use 'tpl' vars for the p,q, since shadowing does not matter.
809
810 In fact, it's more convenient to generate it innermost first, getting
811
812         case (case e of v 
813                 (p,q) -> p) of p
814           (a,b) -> b
815
816 \begin{code}
817 mkTupleSelector :: [Id]         -- The tuple args
818                 -> Id           -- The selected one
819                 -> Id           -- A variable of the same type as the scrutinee
820                 -> CoreExpr     -- Scrutinee
821                 -> CoreExpr
822
823 mkTupleSelector vars the_var scrut_var scrut
824   = mk_tup_sel (chunkify vars) the_var
825   where
826     mk_tup_sel [vars] the_var = mkCoreSel vars the_var scrut_var scrut
827     mk_tup_sel vars_s the_var = mkCoreSel group the_var tpl_v $
828                                 mk_tup_sel (chunkify tpl_vs) tpl_v
829         where
830           tpl_tys = [mkCoreTupTy (map idType gp) | gp <- vars_s]
831           tpl_vs  = mkTemplateLocals tpl_tys
832           [(tpl_v, group)] = [(tpl,gp) | (tpl,gp) <- zipEqual "mkTupleSelector" tpl_vs vars_s,
833                                          the_var `elem` gp ]
834 \end{code}
835
836 A generalization of @mkTupleSelector@, allowing the body
837 of the case to be an arbitrary expression.
838
839 If the tuple is big, it is nested:
840
841         mkTupleCase uniqs [a,b,c,d] body v e
842           = case e of v { (p,q) ->
843             case p of p { (a,b) ->
844             case q of q { (c,d) ->
845             body }}}
846
847 To avoid shadowing, we use uniqs to invent new variables p,q.
848
849 ToDo: eliminate cases where none of the variables are needed.
850
851 \begin{code}
852 mkTupleCase
853         :: UniqSupply   -- for inventing names of intermediate variables
854         -> [Id]         -- the tuple args
855         -> CoreExpr     -- body of the case
856         -> Id           -- a variable of the same type as the scrutinee
857         -> CoreExpr     -- scrutinee
858         -> CoreExpr
859
860 mkTupleCase uniqs vars body scrut_var scrut
861   = mk_tuple_case uniqs (chunkify vars) body
862   where
863     -- This is the case where don't need any nesting
864     mk_tuple_case _ [vars] body
865       = mkSmallTupleCase vars body scrut_var scrut
866       
867     -- This is the case where we must make nest tuples at least once
868     mk_tuple_case us vars_s body
869       = let (us', vars', body') = foldr one_tuple_case (us, [], body) vars_s
870             in mk_tuple_case us' (chunkify vars') body'
871     
872     one_tuple_case chunk_vars (us, vs, body)
873       = let (us1, us2) = splitUniqSupply us
874             scrut_var = mkSysLocal FSLIT("ds") (uniqFromSupply us1)
875               (mkCoreTupTy (map idType chunk_vars))
876             body' = mkSmallTupleCase chunk_vars body scrut_var (Var scrut_var)
877         in (us2, scrut_var:vs, body')
878 \end{code}
879
880 The same, but with a tuple small enough not to need nesting.
881
882 \begin{code}
883 mkSmallTupleCase
884         :: [Id]         -- the tuple args
885         -> CoreExpr     -- body of the case
886         -> Id           -- a variable of the same type as the scrutinee
887         -> CoreExpr     -- scrutinee
888         -> CoreExpr
889
890 mkSmallTupleCase [var] body _scrut_var scrut
891   = bindNonRec var scrut body
892 mkSmallTupleCase vars body scrut_var scrut
893 -- One branch no refinement?
894   = Case scrut scrut_var (exprType body) [(DataAlt (tupleCon Boxed (length vars)), vars, body)]
895 \end{code}
896
897 %************************************************************************
898 %*                                                                      *
899 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
900 %*                                                                      *
901 %************************************************************************
902
903 Call the constructor Ids when building explicit lists, so that they
904 interact well with rules.
905
906 \begin{code}
907 mkNilExpr :: Type -> CoreExpr
908 mkNilExpr ty = mkConApp nilDataCon [Type ty]
909
910 mkConsExpr :: Type -> CoreExpr -> CoreExpr -> CoreExpr
911 mkConsExpr ty hd tl = mkConApp consDataCon [Type ty, hd, tl]
912
913 mkListExpr :: Type -> [CoreExpr] -> CoreExpr
914 mkListExpr ty xs = foldr (mkConsExpr ty) (mkNilExpr ty) xs
915
916 mkCoreSel :: [Id]       -- The tuple args
917           -> Id         -- The selected one
918           -> Id         -- A variable of the same type as the scrutinee
919           -> CoreExpr   -- Scrutinee
920           -> CoreExpr
921
922 -- mkCoreSel [x] x v e 
923 -- ===>  e
924 mkCoreSel [var] should_be_the_same_var _ scrut
925   = ASSERT(var == should_be_the_same_var)
926     scrut
927
928 -- mkCoreSel [x,y,z] x v e
929 -- ===>  case e of v { (x,y,z) -> x
930 mkCoreSel vars the_var scrut_var scrut
931   = ASSERT( notNull vars )
932     Case scrut scrut_var (idType the_var)
933          [(DataAlt (tupleCon Boxed (length vars)), vars, Var the_var)]
934 \end{code}
935
936 %************************************************************************
937 %*                                                                      *
938 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
939 %*                                                                      *
940 %************************************************************************
941
942 Generally, we handle pattern matching failure like this: let-bind a
943 fail-variable, and use that variable if the thing fails:
944 \begin{verbatim}
945         let fail.33 = error "Help"
946         in
947         case x of
948                 p1 -> ...
949                 p2 -> fail.33
950                 p3 -> fail.33
951                 p4 -> ...
952 \end{verbatim}
953 Then
954 \begin{itemize}
955 \item
956 If the case can't fail, then there'll be no mention of @fail.33@, and the
957 simplifier will later discard it.
958
959 \item
960 If it can fail in only one way, then the simplifier will inline it.
961
962 \item
963 Only if it is used more than once will the let-binding remain.
964 \end{itemize}
965
966 There's a problem when the result of the case expression is of
967 unboxed type.  Then the type of @fail.33@ is unboxed too, and
968 there is every chance that someone will change the let into a case:
969 \begin{verbatim}
970         case error "Help" of
971           fail.33 -> case ....
972 \end{verbatim}
973
974 which is of course utterly wrong.  Rather than drop the condition that
975 only boxed types can be let-bound, we just turn the fail into a function
976 for the primitive case:
977 \begin{verbatim}
978         let fail.33 :: Void -> Int#
979             fail.33 = \_ -> error "Help"
980         in
981         case x of
982                 p1 -> ...
983                 p2 -> fail.33 void
984                 p3 -> fail.33 void
985                 p4 -> ...
986 \end{verbatim}
987
988 Now @fail.33@ is a function, so it can be let-bound.
989
990 \begin{code}
991 mkFailurePair :: CoreExpr       -- Result type of the whole case expression
992               -> DsM (CoreBind, -- Binds the newly-created fail variable
993                                 -- to either the expression or \ _ -> expression
994                       CoreExpr) -- Either the fail variable, or fail variable
995                                 -- applied to unit tuple
996 mkFailurePair expr
997   | isUnLiftedType ty = do
998      fail_fun_var <- newFailLocalDs (unitTy `mkFunTy` ty)
999      fail_fun_arg <- newSysLocalDs unitTy
1000      return (NonRec fail_fun_var (Lam fail_fun_arg expr),
1001              App (Var fail_fun_var) (Var unitDataConId))
1002
1003   | otherwise = do
1004      fail_var <- newFailLocalDs ty
1005      return (NonRec fail_var expr, Var fail_var)
1006   where
1007     ty = exprType expr
1008 \end{code}
1009
1010 \begin{code}
1011 mkOptTickBox :: Maybe (Int,[Id]) -> CoreExpr -> DsM CoreExpr
1012 mkOptTickBox Nothing e   = return e
1013 mkOptTickBox (Just (ix,ids)) e = mkTickBox ix ids e
1014
1015 mkTickBox :: Int -> [Id] -> CoreExpr -> DsM CoreExpr
1016 mkTickBox ix vars e = do
1017        uq <- newUnique  
1018        mod <- getModuleDs
1019        let tick | opt_Hpc   = mkTickBoxOpId uq mod ix
1020                 | otherwise = mkBreakPointOpId uq mod ix
1021        uq2 <- newUnique         
1022        let occName = mkVarOcc "tick"
1023        let name = mkInternalName uq2 occName noSrcSpan   -- use mkSysLocal?
1024        let var  = Id.mkLocalId name realWorldStatePrimTy
1025        scrut <- 
1026           if opt_Hpc 
1027             then return (Var tick)
1028             else do
1029               let tickVar = Var tick
1030               let tickType = mkFunTys (map idType vars) realWorldStatePrimTy 
1031               let scrutApTy = App tickVar (Type tickType)
1032               return (mkApps scrutApTy (map Var vars) :: Expr Id)
1033        return $ Case scrut var ty [(DEFAULT,[],e)]
1034   where
1035      ty = exprType e
1036
1037 mkBinaryTickBox :: Int -> Int -> CoreExpr -> DsM CoreExpr
1038 mkBinaryTickBox ixT ixF e = do
1039        uq <- newUnique  
1040        let bndr1 = mkSysLocal FSLIT("t1") uq boolTy 
1041        falseBox <- mkTickBox ixF [] $ Var falseDataConId
1042        trueBox  <- mkTickBox ixT [] $ Var trueDataConId
1043        return $ Case e bndr1 boolTy
1044                        [ (DataAlt falseDataCon, [], falseBox)
1045                        , (DataAlt trueDataCon,  [], trueBox)
1046                        ]
1047 \end{code}