[project @ 2001-06-07 16:00:18 by sewardj]
[ghc-hetmet.git] / ghc / compiler / deSugar / DsUtils.lhs
index 7446c22..12ea7df 100644 (file)
@@ -41,13 +41,12 @@ import DsMonad
 
 import CoreUtils       ( exprType, mkIfThenElse )
 import PrelInfo                ( iRREFUT_PAT_ERROR_ID )
+import MkId            ( rebuildConArgs )
 import Id              ( idType, Id, mkWildId )
 import Literal         ( Literal(..), inIntRange, tARGET_MAX_INT )
 import TyCon           ( isNewTyCon, tyConDataCons )
-import DataCon         ( DataCon, StrictnessMark, maybeMarkedUnboxed, 
-                         dataConStrictMarks, dataConId, splitProductType_maybe
-                       )
-import Type            ( mkFunTy, isUnLiftedType, splitAlgTyConApp, unUsgTy,
+import DataCon         ( DataCon, dataConStrictMarks, dataConId )
+import Type            ( mkFunTy, isUnLiftedType, splitAlgTyConApp,
                          Type
                        )
 import TysPrim         ( intPrimTy, charPrimTy, floatPrimTy, doublePrimTy )
@@ -63,8 +62,8 @@ import TysWiredIn     ( nilDataCon, consDataCon,
                        )
 import BasicTypes      ( Boxity(..) )
 import UniqSet         ( mkUniqSet, minusUniqSet, isEmptyUniqSet, UniqSet )
-import PrelNames       ( unpackCStringIdKey, unpackCStringUtf8IdKey, 
-                         plusIntegerIdKey, timesIntegerIdKey )
+import PrelNames       ( unpackCStringName, unpackCStringUtf8Name, 
+                         plusIntegerName, timesIntegerName )
 import Outputable
 import UnicodeUtil      ( stringToUtf8 )
 \end{code}
@@ -278,8 +277,8 @@ mkCoAlgCaseMatchResult var match_alts
        -- Stuff for newtype
     (_, arg_ids, match_result) = head match_alts
     arg_id                    = head arg_ids
-    coercion_bind             = NonRec arg_id (Note (Coerce (unUsgTy (idType arg_id)) 
-                                                            (unUsgTy scrut_ty))
+    coercion_bind             = NonRec arg_id (Note (Coerce (idType arg_id)
+                                                            scrut_ty)
                                                     (Var var))
     newtype_sanity            = null (tail match_alts) && null (tail arg_ids)
 
@@ -298,10 +297,12 @@ mkCoAlgCaseMatchResult var match_alts
                   returnDs (Case (Var var) wild_var (alts ++ mk_default fail))
 
     mk_alt fail (con, args, MatchResult _ body_fn)
-       = body_fn fail          `thenDs` \ body ->
-         rebuildConArgs con args (dataConStrictMarks con) body 
-                               `thenDs` \ (body', real_args) ->
-         returnDs (DataAlt con, real_args, body')
+       = body_fn fail                                          `thenDs` \ body ->
+         getUniquesDs                                          `thenDs` \ us ->
+         let
+            (binds, real_args) = rebuildConArgs args (dataConStrictMarks con) us
+         in
+         returnDs (DataAlt con, real_args, mkDsLets binds body)
 
     mk_default fail | exhaustive_case = []
                    | otherwise       = [(DEFAULT, [], fail)]
@@ -310,39 +311,7 @@ mkCoAlgCaseMatchResult var match_alts
         = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
     exhaustive_case = isEmptyUniqSet un_mentioned_constructors
 \end{code}
-%
-For each constructor we match on, we might need to re-pack some
-of the strict fields if they are unpacked in the constructor.
-%
-\begin{code}
-rebuildConArgs
-  :: DataCon                           -- the con we're matching on
-  -> [Id]                              -- the source-level args
-  -> [StrictnessMark]                  -- the strictness annotations (per-arg)
-  -> CoreExpr                          -- the body
-  -> DsM (CoreExpr, [Id])
-
-rebuildConArgs con [] stricts body = returnDs (body, [])
-rebuildConArgs con (arg:args) stricts body | isTyVar arg
-  = rebuildConArgs con args stricts body `thenDs` \ (body', args') ->
-    returnDs (body',arg:args')
-rebuildConArgs con (arg:args) (str:stricts) body
-  = rebuildConArgs con args stricts body `thenDs` \ (body', real_args) ->
-    case maybeMarkedUnboxed str of
-       Just (pack_con1, _) -> 
-           case splitProductType_maybe (idType arg) of
-               Just (_, tycon_args, pack_con, con_arg_tys) ->
-                   ASSERT( pack_con == pack_con1 )
-                   newSysLocalsDs con_arg_tys          `thenDs` \ unpacked_args ->
-                   returnDs (
-                        mkDsLet (NonRec arg (mkConApp pack_con 
-                                                 (map Type tycon_args ++
-                                                  map Var  unpacked_args))) body', 
-                        unpacked_args ++ real_args
-                   )
-               
-       _ -> returnDs (body', arg:real_args)
-\end{code}
+
 
 %************************************************************************
 %*                                                                     *
@@ -362,8 +331,7 @@ mkErrorAppDs err_id ty msg
        full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
     in
     mkStringLit full_msg               `thenDs` \ core_msg ->
-    returnDs (mkApps (Var err_id) [(Type . unUsgTy) ty, core_msg])
-    -- unUsgTy *required* -- KSW 1999-04-07
+    returnDs (mkApps (Var err_id) [Type ty, core_msg])
 \end{code}
 
 
@@ -384,8 +352,8 @@ mkIntegerLit i
 -- integral literals. This improves constant folding.
 
   | otherwise          -- Big, so start from a string
-  = dsLookupGlobalValue plusIntegerIdKey       `thenDs` \ plus_id ->
-    dsLookupGlobalValue timesIntegerIdKey      `thenDs` \ times_id ->
+  = dsLookupGlobalValue plusIntegerName                `thenDs` \ plus_id ->
+    dsLookupGlobalValue timesIntegerName       `thenDs` \ times_id ->
     let 
         plus a b  = Var plus_id  `App` a `App` b
         times a b = Var times_id `App` a `App` b
@@ -420,11 +388,11 @@ mkStringLitFS str
     returnDs (mkConsExpr charTy the_char (mkNilExpr charTy))
 
   | all safeChar chars
-  = dsLookupGlobalValue unpackCStringIdKey     `thenDs` \ unpack_id ->
+  = dsLookupGlobalValue unpackCStringName      `thenDs` \ unpack_id ->
     returnDs (App (Var unpack_id) (Lit (MachStr str)))
 
   | otherwise
-  = dsLookupGlobalValue unpackCStringUtf8IdKey `thenDs` \ unpack_id ->
+  = dsLookupGlobalValue unpackCStringUtf8Name  `thenDs` \ unpack_id ->
     returnDs (App (Var unpack_id) (Lit (MachStr (_PK_ (stringToUtf8 chars)))))
 
   where
@@ -484,7 +452,7 @@ mkSelectorBinds pat val_expr
   | otherwise
   = mkErrorAppDs iRREFUT_PAT_ERROR_ID tuple_ty (showSDoc (ppr pat))
     `thenDs` \ error_expr ->
-    matchSimply val_expr LetMatch pat local_tuple error_expr
+    matchSimply val_expr PatBindRhs pat local_tuple error_expr
     `thenDs` \ tuple_expr ->
     newSysLocalDs tuple_ty
     `thenDs` \ tuple_var ->
@@ -502,7 +470,7 @@ mkSelectorBinds pat val_expr
     -- (mk_bind sv bv) generates
     --         bv = case sv of { pat -> bv; other -> error-msg }
     -- Remember, pat binds bv
-      = matchSimply (Var scrut_var) LetMatch pat
+      = matchSimply (Var scrut_var) PatBindRhs pat
                    (Var bndr_var) error_expr                   `thenDs` \ rhs_expr ->
         returnDs (bndr_var, rhs_expr)
       where
@@ -522,8 +490,7 @@ mkSelectorBinds pat val_expr
 
 
 @mkTupleExpr@ builds a tuple; the inverse to @mkTupleSelector@.  If it
-has only one element, it is the identity function.  Notice we must
-throw out any usage annotation on the outside of an Id. 
+has only one element, it is the identity function.
 
 \begin{code}
 mkTupleExpr :: [Id] -> CoreExpr
@@ -531,7 +498,7 @@ mkTupleExpr :: [Id] -> CoreExpr
 mkTupleExpr []  = Var unitDataConId
 mkTupleExpr [id] = Var id
 mkTupleExpr ids         = mkConApp (tupleCon Boxed (length ids))
-                           (map (Type . unUsgTy . idType) ids ++ [ Var i | i <- ids ])
+                           (map (Type . idType) ids ++ [ Var i | i <- ids ])
 \end{code}