<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ --> <title>basicTypes/Id.lhs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> % % (c) The University of Glasgow 2006 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section[Id]{@Ids@: Value and constructor identifiers} \begin{code} <pre><a name="line-1"></a><span class='hs-comment'>-- |</span> <a name="line-2"></a><span class='hs-comment'>-- #name_types#</span> <a name="line-3"></a><span class='hs-comment'>-- GHC uses several kinds of name internally:</span> <a name="line-4"></a><span class='hs-comment'>--</span> <a name="line-5"></a><span class='hs-comment'>-- * 'OccName.OccName': see "OccName#name_types"</span> <a name="line-6"></a><span class='hs-comment'>--</span> <a name="line-7"></a><span class='hs-comment'>-- * 'RdrName.RdrName': see "RdrName#name_types"</span> <a name="line-8"></a><span class='hs-comment'>--</span> <a name="line-9"></a><span class='hs-comment'>-- * 'Name.Name': see "Name#name_types"</span> <a name="line-10"></a><span class='hs-comment'>--</span> <a name="line-11"></a><span class='hs-comment'>-- * 'Id.Id' represents names that not only have a 'Name.Name' but also a 'TypeRep.Type' and some additional</span> <a name="line-12"></a><span class='hs-comment'>-- details (a 'IdInfo.IdInfo' and one of 'Var.LocalIdDetails' or 'IdInfo.GlobalIdDetails') that</span> <a name="line-13"></a><span class='hs-comment'>-- are added, modified and inspected by various compiler passes. These 'Var.Var' names may either </span> <a name="line-14"></a><span class='hs-comment'>-- be global or local, see "Var#globalvslocal"</span> <a name="line-15"></a><span class='hs-comment'>--</span> <a name="line-16"></a><span class='hs-comment'>-- * 'Var.Var': see "Var#name_types"</span> <a name="line-17"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Id</span> <span class='hs-layout'>(</span> <a name="line-18"></a> <span class='hs-comment'>-- * The main types</span> <a name="line-19"></a> <span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>DictId</span><span class='hs-layout'>,</span> <a name="line-20"></a> <a name="line-21"></a> <span class='hs-comment'>-- ** Simple construction</span> <a name="line-22"></a> <span class='hs-varid'>mkGlobalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVanillaGlobal</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkVanillaGlobalWithInfo</span><span class='hs-layout'>,</span> <a name="line-23"></a> <span class='hs-varid'>mkLocalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkLocalIdWithInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkExportedLocalId</span><span class='hs-layout'>,</span> <a name="line-24"></a> <span class='hs-varid'>mkSysLocal</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkSysLocalM</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkUserLocal</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkUserLocalM</span><span class='hs-layout'>,</span> <a name="line-25"></a> <span class='hs-varid'>mkTemplateLocals</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTemplateLocalsNum</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTemplateLocal</span><span class='hs-layout'>,</span> <a name="line-26"></a> <span class='hs-varid'>mkWorkerId</span><span class='hs-layout'>,</span> <a name="line-27"></a> <a name="line-28"></a> <span class='hs-comment'>-- ** Taking an Id apart</span> <a name="line-29"></a> <span class='hs-varid'>idName</span><span class='hs-layout'>,</span> <span class='hs-varid'>idType</span><span class='hs-layout'>,</span> <span class='hs-varid'>idUnique</span><span class='hs-layout'>,</span> <span class='hs-varid'>idInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>idDetails</span><span class='hs-layout'>,</span> <a name="line-30"></a> <span class='hs-varid'>isId</span><span class='hs-layout'>,</span> <span class='hs-varid'>idPrimRep</span><span class='hs-layout'>,</span> <a name="line-31"></a> <span class='hs-varid'>recordSelectorFieldLabel</span><span class='hs-layout'>,</span> <a name="line-32"></a> <a name="line-33"></a> <span class='hs-comment'>-- ** Modifying an Id</span> <a name="line-34"></a> <span class='hs-varid'>setIdName</span><span class='hs-layout'>,</span> <span class='hs-varid'>setIdUnique</span><span class='hs-layout'>,</span> <span class='hs-conid'>Id</span><span class='hs-varop'>.</span><span class='hs-varid'>setIdType</span><span class='hs-layout'>,</span> <a name="line-35"></a> <span class='hs-varid'>setIdExported</span><span class='hs-layout'>,</span> <span class='hs-varid'>setIdNotExported</span><span class='hs-layout'>,</span> <a name="line-36"></a> <span class='hs-varid'>globaliseId</span><span class='hs-layout'>,</span> <span class='hs-varid'>localiseId</span><span class='hs-layout'>,</span> <a name="line-37"></a> <span class='hs-varid'>setIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>lazySetIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>modifyIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybeModifyIdInfo</span><span class='hs-layout'>,</span> <a name="line-38"></a> <span class='hs-varid'>zapLamIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapDemandIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapFragileIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>transferPolyIdInfo</span><span class='hs-layout'>,</span> <a name="line-39"></a> <a name="line-40"></a> <a name="line-41"></a> <span class='hs-comment'>-- ** Predicates on Ids</span> <a name="line-42"></a> <span class='hs-varid'>isImplicitId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDeadBinder</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDictId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isStrictId</span><span class='hs-layout'>,</span> <a name="line-43"></a> <span class='hs-varid'>isExportedId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLocalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isGlobalId</span><span class='hs-layout'>,</span> <a name="line-44"></a> <span class='hs-varid'>isRecordSelector</span><span class='hs-layout'>,</span> <span class='hs-varid'>isNaughtyRecordSelector</span><span class='hs-layout'>,</span> <a name="line-45"></a> <span class='hs-varid'>isClassOpId_maybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDFunId</span><span class='hs-layout'>,</span> <a name="line-46"></a> <span class='hs-varid'>isPrimOpId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isPrimOpId_maybe</span><span class='hs-layout'>,</span> <a name="line-47"></a> <span class='hs-varid'>isFCallId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFCallId_maybe</span><span class='hs-layout'>,</span> <a name="line-48"></a> <span class='hs-varid'>isDataConWorkId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataConWorkId_maybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDataConId_maybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>idDataCon</span><span class='hs-layout'>,</span> <a name="line-49"></a> <span class='hs-varid'>isConLikeId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isBottomingId</span><span class='hs-layout'>,</span> <span class='hs-varid'>idIsFrom</span><span class='hs-layout'>,</span> <a name="line-50"></a> <span class='hs-varid'>isTickBoxOp</span><span class='hs-layout'>,</span> <span class='hs-varid'>isTickBoxOp_maybe</span><span class='hs-layout'>,</span> <a name="line-51"></a> <span class='hs-varid'>hasNoBinding</span><span class='hs-layout'>,</span> <a name="line-52"></a> <a name="line-53"></a> <span class='hs-comment'>-- ** Inline pragma stuff</span> <a name="line-54"></a> <span class='hs-varid'>idInlinePragma</span><span class='hs-layout'>,</span> <span class='hs-varid'>setInlinePragma</span><span class='hs-layout'>,</span> <span class='hs-varid'>modifyInlinePragma</span><span class='hs-layout'>,</span> <a name="line-55"></a> <span class='hs-varid'>idInlineActivation</span><span class='hs-layout'>,</span> <span class='hs-varid'>setInlineActivation</span><span class='hs-layout'>,</span> <span class='hs-varid'>idRuleMatchInfo</span><span class='hs-layout'>,</span> <a name="line-56"></a> <a name="line-57"></a> <span class='hs-comment'>-- ** One-shot lambdas</span> <a name="line-58"></a> <span class='hs-varid'>isOneShotBndr</span><span class='hs-layout'>,</span> <span class='hs-varid'>isOneShotLambda</span><span class='hs-layout'>,</span> <span class='hs-varid'>isStateHackType</span><span class='hs-layout'>,</span> <a name="line-59"></a> <span class='hs-varid'>setOneShotLambda</span><span class='hs-layout'>,</span> <span class='hs-varid'>clearOneShotLambda</span><span class='hs-layout'>,</span> <a name="line-60"></a> <a name="line-61"></a> <span class='hs-comment'>-- ** Reading 'IdInfo' fields</span> <a name="line-62"></a> <span class='hs-varid'>idArity</span><span class='hs-layout'>,</span> <a name="line-63"></a> <span class='hs-varid'>idNewDemandInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>idNewDemandInfo_maybe</span><span class='hs-layout'>,</span> <a name="line-64"></a> <span class='hs-varid'>idNewStrictness</span><span class='hs-layout'>,</span> <span class='hs-varid'>idNewStrictness_maybe</span><span class='hs-layout'>,</span> <a name="line-65"></a> <span class='hs-varid'>idWorkerInfo</span><span class='hs-layout'>,</span> <a name="line-66"></a> <span class='hs-varid'>idUnfolding</span><span class='hs-layout'>,</span> <a name="line-67"></a> <span class='hs-varid'>idSpecialisation</span><span class='hs-layout'>,</span> <span class='hs-varid'>idCoreRules</span><span class='hs-layout'>,</span> <span class='hs-varid'>idHasRules</span><span class='hs-layout'>,</span> <a name="line-68"></a> <span class='hs-varid'>idCafInfo</span><span class='hs-layout'>,</span> <a name="line-69"></a> <span class='hs-varid'>idLBVarInfo</span><span class='hs-layout'>,</span> <a name="line-70"></a> <span class='hs-varid'>idOccInfo</span><span class='hs-layout'>,</span> <a name="line-71"></a> <a name="line-72"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-73"></a> <span class='hs-varid'>idDemandInfo</span><span class='hs-layout'>,</span> <a name="line-74"></a> <span class='hs-varid'>idStrictness</span><span class='hs-layout'>,</span> <a name="line-75"></a> <span class='hs-varid'>idCprInfo</span><span class='hs-layout'>,</span> <a name="line-76"></a><span class='hs-cpp'>#endif</span> <a name="line-77"></a> <a name="line-78"></a> <span class='hs-comment'>-- ** Writing 'IdInfo' fields</span> <a name="line-79"></a> <span class='hs-varid'>setIdUnfolding</span><span class='hs-layout'>,</span> <a name="line-80"></a> <span class='hs-varid'>setIdArity</span><span class='hs-layout'>,</span> <a name="line-81"></a> <span class='hs-varid'>setIdNewDemandInfo</span><span class='hs-layout'>,</span> <a name="line-82"></a> <span class='hs-varid'>setIdNewStrictness</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapIdNewStrictness</span><span class='hs-layout'>,</span> <a name="line-83"></a> <span class='hs-varid'>setIdWorkerInfo</span><span class='hs-layout'>,</span> <a name="line-84"></a> <span class='hs-varid'>setIdSpecialisation</span><span class='hs-layout'>,</span> <a name="line-85"></a> <span class='hs-varid'>setIdCafInfo</span><span class='hs-layout'>,</span> <a name="line-86"></a> <span class='hs-varid'>setIdOccInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapIdOccInfo</span><span class='hs-layout'>,</span> <a name="line-87"></a> <a name="line-88"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-89"></a> <span class='hs-varid'>setIdStrictness</span><span class='hs-layout'>,</span> <a name="line-90"></a> <span class='hs-varid'>setIdDemandInfo</span><span class='hs-layout'>,</span> <a name="line-91"></a> <span class='hs-varid'>setIdCprInfo</span><span class='hs-layout'>,</span> <a name="line-92"></a><span class='hs-cpp'>#endif</span> <a name="line-93"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-94"></a> <a name="line-95"></a><span class='hs-cpp'>#include "HsVersions.h"</span> <a name="line-96"></a> <a name="line-97"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span> <span class='hs-layout'>(</span> <span class='hs-conid'>CoreRule</span><span class='hs-layout'>,</span> <span class='hs-conid'>Unfolding</span> <span class='hs-layout'>)</span> <a name="line-98"></a> <a name="line-99"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IdInfo</span> <a name="line-100"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span> <a name="line-101"></a> <a name="line-102"></a><span class='hs-comment'>-- Imported and re-exported </span> <a name="line-103"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span><span class='hs-layout'>(</span> <span class='hs-conid'>Var</span><span class='hs-layout'>,</span> <span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>DictId</span><span class='hs-layout'>,</span> <a name="line-104"></a> <span class='hs-varid'>idInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>idDetails</span><span class='hs-layout'>,</span> <span class='hs-varid'>globaliseId</span><span class='hs-layout'>,</span> <a name="line-105"></a> <span class='hs-varid'>isId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLocalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isGlobalId</span><span class='hs-layout'>,</span> <span class='hs-varid'>isExportedId</span> <span class='hs-layout'>)</span> <a name="line-106"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Var</span> <a name="line-107"></a> <a name="line-108"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span> <a name="line-109"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span> <a name="line-110"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcType</span> <a name="line-111"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysPrim</span> <a name="line-112"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-113"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Demand</span> <a name="line-114"></a><span class='hs-cpp'>#endif</span> <a name="line-115"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span> <a name="line-116"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NewDemand</span> <a name="line-117"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span> <a name="line-118"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span> <a name="line-119"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span> <a name="line-120"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrimOp</span> <a name="line-121"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ForeignCall</span> <a name="line-122"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Maybes</span> <a name="line-123"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span> <a name="line-124"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span> <a name="line-125"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unique</span> <a name="line-126"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSupply</span> <a name="line-127"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span> <a name="line-128"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span><span class='hs-layout'>(</span> <span class='hs-varid'>count</span> <span class='hs-layout'>)</span> <a name="line-129"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>StaticFlags</span> <a name="line-130"></a> <a name="line-131"></a><span class='hs-comment'>-- infixl so you can say (id `set` a `set` b)</span> <a name="line-132"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>1</span> <span class='hs-varop'>`setIdUnfolding`</span><span class='hs-layout'>,</span> <a name="line-133"></a> <span class='hs-varop'>`setIdArity`</span><span class='hs-layout'>,</span> <a name="line-134"></a> <span class='hs-varop'>`setIdNewDemandInfo`</span><span class='hs-layout'>,</span> <a name="line-135"></a> <span class='hs-varop'>`setIdNewStrictness`</span><span class='hs-layout'>,</span> <a name="line-136"></a> <span class='hs-varop'>`setIdWorkerInfo`</span><span class='hs-layout'>,</span> <a name="line-137"></a> <span class='hs-varop'>`setIdSpecialisation`</span><span class='hs-layout'>,</span> <a name="line-138"></a> <span class='hs-varop'>`setInlinePragma`</span><span class='hs-layout'>,</span> <a name="line-139"></a> <span class='hs-varop'>`idCafInfo`</span> <a name="line-140"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-141"></a> <span class='hs-layout'>,</span><span class='hs-varop'>`idCprInfo`</span> <a name="line-142"></a> <span class='hs-layout'>,</span><span class='hs-varop'>`setIdStrictness`</span> <a name="line-143"></a> <span class='hs-layout'>,</span><span class='hs-varop'>`setIdDemandInfo`</span> <a name="line-144"></a><span class='hs-cpp'>#endif</span> </pre>\end{code} %************************************************************************ %* * \subsection{Basic Id manipulation} %* * %************************************************************************ \begin{code} <pre><a name="line-1"></a><a name="idName"></a><span class='hs-definition'>idName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Name</span> <a name="line-2"></a><span class='hs-definition'>idName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>varName</span> <a name="line-3"></a> <a name="line-4"></a><a name="idUnique"></a><span class='hs-definition'>idUnique</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Unique</span> <a name="line-5"></a><span class='hs-definition'>idUnique</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>varUnique</span> <a name="line-6"></a> <a name="line-7"></a><a name="idType"></a><span class='hs-definition'>idType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Kind</span> <a name="line-8"></a><span class='hs-definition'>idType</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>varType</span> <a name="line-9"></a> <a name="line-10"></a><a name="idPrimRep"></a><span class='hs-definition'>idPrimRep</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PrimRep</span> <a name="line-11"></a><span class='hs-definition'>idPrimRep</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typePrimRep</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-12"></a> <a name="line-13"></a><a name="setIdName"></a><span class='hs-definition'>setIdName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-14"></a><span class='hs-definition'>setIdName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setVarName</span> <a name="line-15"></a> <a name="line-16"></a><a name="setIdUnique"></a><span class='hs-definition'>setIdUnique</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-17"></a><span class='hs-definition'>setIdUnique</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setVarUnique</span> <a name="line-18"></a> <a name="line-19"></a><a name="setIdType"></a><span class='hs-comment'>-- | Not only does this set the 'Id' 'Type', it also evaluates the type to try and</span> <a name="line-20"></a><span class='hs-comment'>-- reduce space usage</span> <a name="line-21"></a><span class='hs-definition'>setIdType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-22"></a><span class='hs-definition'>setIdType</span> <span class='hs-varid'>id</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqType</span> <span class='hs-varid'>ty</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setVarType</span> <span class='hs-varid'>id</span> <span class='hs-varid'>ty</span> <a name="line-23"></a> <a name="line-24"></a><a name="setIdExported"></a><span class='hs-definition'>setIdExported</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-25"></a><span class='hs-definition'>setIdExported</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setIdExported</span> <a name="line-26"></a> <a name="line-27"></a><a name="setIdNotExported"></a><span class='hs-definition'>setIdNotExported</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-28"></a><span class='hs-definition'>setIdNotExported</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>setIdNotExported</span> <a name="line-29"></a> <a name="line-30"></a><a name="localiseId"></a><span class='hs-definition'>localiseId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-31"></a><span class='hs-comment'>-- Make an with the same unique and type as the </span> <a name="line-32"></a><span class='hs-comment'>-- incoming Id, but with an *Internal* Name and *LocalId* flavour</span> <a name="line-33"></a><span class='hs-definition'>localiseId</span> <span class='hs-varid'>id</span> <a name="line-34"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLocalId</span> <span class='hs-varid'>id</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>isInternalName</span> <span class='hs-varid'>name</span> <a name="line-35"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <a name="line-36"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <a name="line-37"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalIdWithInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>localiseName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-38"></a> <span class='hs-keyword'>where</span> <a name="line-39"></a> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>id</span> <a name="line-40"></a> <a name="line-41"></a><a name="lazySetIdInfo"></a><span class='hs-definition'>lazySetIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-42"></a><span class='hs-definition'>lazySetIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>lazySetIdInfo</span> <a name="line-43"></a> <a name="line-44"></a><a name="setIdInfo"></a><span class='hs-definition'>setIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-45"></a><span class='hs-definition'>setIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqIdInfo</span> <span class='hs-varid'>info</span> <span class='hs-varop'>`seq`</span> <span class='hs-layout'>(</span><span class='hs-varid'>lazySetIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span> <a name="line-46"></a> <span class='hs-comment'>-- Try to avoid spack leaks by seq'ing</span> <a name="line-47"></a> <a name="line-48"></a><a name="modifyIdInfo"></a><span class='hs-definition'>modifyIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IdInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-49"></a><span class='hs-definition'>modifyIdInfo</span> <span class='hs-varid'>fn</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-50"></a> <a name="line-51"></a><a name="maybeModifyIdInfo"></a><span class='hs-comment'>-- maybeModifyIdInfo tries to avoid unnecesary thrashing</span> <a name="line-52"></a><span class='hs-definition'>maybeModifyIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-53"></a><span class='hs-definition'>maybeModifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>new_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lazySetIdInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>new_info</span> <a name="line-54"></a><span class='hs-definition'>maybeModifyIdInfo</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> </pre>\end{code} %************************************************************************ %* * \subsection{Simple Id construction} %* * %************************************************************************ Absolutely all Ids are made by mkId. It is just like Var.mkId, but in addition it pins free-tyvar-info onto the Id's type, where it can easily be found. Note [Free type variables] ~~~~~~~~~~~~~~~~~~~~~~~~~~ At one time we cached the free type variables of the type of an Id at the root of the type in a TyNote. The idea was to avoid repeating the free-type-variable calculation. But it turned out to slow down the compiler overall. I don't quite know why; perhaps finding free type variables of an Id isn't all that common whereas applying a substitution (which changes the free type variables) is more common. Anyway, we removed it in March 2008. \begin{code} <pre><a name="line-1"></a><a name="mkGlobalId"></a><span class='hs-comment'>-- | For an explanation of global vs. local 'Id's, see "Var#globalvslocal"</span> <a name="line-2"></a><span class='hs-definition'>mkGlobalId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdDetails</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-3"></a><span class='hs-definition'>mkGlobalId</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkGlobalVar</span> <a name="line-4"></a> <a name="line-5"></a><a name="mkVanillaGlobal"></a><span class='hs-comment'>-- | Make a global 'Id' without any extra information at all</span> <a name="line-6"></a><span class='hs-definition'>mkVanillaGlobal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-7"></a><span class='hs-definition'>mkVanillaGlobal</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkVanillaGlobalWithInfo</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>vanillaIdInfo</span> <a name="line-8"></a> <a name="line-9"></a><a name="mkVanillaGlobalWithInfo"></a><span class='hs-comment'>-- | Make a global 'Id' with no global information but some generic 'IdInfo'</span> <a name="line-10"></a><span class='hs-definition'>mkVanillaGlobalWithInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-11"></a><span class='hs-definition'>mkVanillaGlobalWithInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkGlobalId</span> <span class='hs-conid'>VanillaId</span> <a name="line-12"></a> <a name="line-13"></a> <a name="line-14"></a><a name="mkLocalId"></a><span class='hs-comment'>-- | For an explanation of global vs. local 'Id's, see "Var#globalvslocal"</span> <a name="line-15"></a><span class='hs-definition'>mkLocalId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-16"></a><span class='hs-definition'>mkLocalId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalIdWithInfo</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>vanillaIdInfo</span> <a name="line-17"></a> <a name="line-18"></a><a name="mkLocalIdWithInfo"></a><span class='hs-definition'>mkLocalIdWithInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-19"></a><span class='hs-definition'>mkLocalIdWithInfo</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkLocalVar</span> <span class='hs-conid'>VanillaId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>info</span> <a name="line-20"></a> <span class='hs-comment'>-- Note [Free type variables]</span> <a name="line-21"></a> <a name="line-22"></a><a name="mkExportedLocalId"></a><span class='hs-comment'>-- | Create a local 'Id' that is marked as exported. </span> <a name="line-23"></a><span class='hs-comment'>-- This prevents things attached to it from being removed as dead code.</span> <a name="line-24"></a><span class='hs-definition'>mkExportedLocalId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-25"></a><span class='hs-definition'>mkExportedLocalId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkExportedLocalVar</span> <span class='hs-conid'>VanillaId</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>vanillaIdInfo</span> <a name="line-26"></a> <span class='hs-comment'>-- Note [Free type variables]</span> <a name="line-27"></a> <a name="line-28"></a> <a name="line-29"></a><a name="mkSysLocal"></a><span class='hs-comment'>-- | Create a system local 'Id'. These are local 'Id's (see "Var#globalvslocal") </span> <a name="line-30"></a><span class='hs-comment'>-- that are created by the compiler out of thin air</span> <a name="line-31"></a><span class='hs-definition'>mkSysLocal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-32"></a><span class='hs-definition'>mkSysLocal</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSystemVarName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>fs</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span> <a name="line-33"></a> <a name="line-34"></a><a name="mkSysLocalM"></a><span class='hs-definition'>mkSysLocalM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadUnique</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-conid'>Id</span> <a name="line-35"></a><span class='hs-definition'>mkSysLocalM</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getUniqueM</span> <span class='hs-varop'>>>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSysLocal</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-36"></a> <a name="line-37"></a> <a name="line-38"></a><a name="mkUserLocal"></a><span class='hs-comment'>-- | Create a user local 'Id'. These are local 'Id's (see "Var#globalvslocal") with a name and location that the user might recognize</span> <a name="line-39"></a><span class='hs-definition'>mkUserLocal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-40"></a><span class='hs-definition'>mkUserLocal</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>loc</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span> <a name="line-41"></a> <a name="line-42"></a><a name="mkUserLocalM"></a><span class='hs-definition'>mkUserLocalM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadUnique</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-conid'>Id</span> <a name="line-43"></a><span class='hs-definition'>mkUserLocalM</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getUniqueM</span> <span class='hs-varop'>>>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkUserLocal</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>loc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-44"></a> </pre>\end{code} Make some local @Ids@ for a template @CoreExpr@. These have bogus @Uniques@, but that's OK because the templates are supposed to be instantiated before use. \begin{code} <pre><a name="line-1"></a><a name="mkWorkerId"></a><span class='hs-comment'>-- | Workers get local names. "CoreTidy" will externalise these if necessary</span> <a name="line-2"></a><span class='hs-definition'>mkWorkerId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-3"></a><span class='hs-definition'>mkWorkerId</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>unwrkr</span> <span class='hs-varid'>ty</span> <a name="line-4"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>wkr_name</span> <span class='hs-varid'>ty</span> <a name="line-5"></a> <span class='hs-keyword'>where</span> <a name="line-6"></a> <span class='hs-varid'>wkr_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>uniq</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkWorkerOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>getOccName</span> <span class='hs-varid'>unwrkr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>getSrcSpan</span> <span class='hs-varid'>unwrkr</span><span class='hs-layout'>)</span> <a name="line-7"></a> <a name="line-8"></a><a name="mkTemplateLocal"></a><span class='hs-comment'>-- | Create a /template local/: a family of system local 'Id's in bijection with @Int@s, typically used in unfoldings</span> <a name="line-9"></a><span class='hs-definition'>mkTemplateLocal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-10"></a><span class='hs-definition'>mkTemplateLocal</span> <span class='hs-varid'>i</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkSysLocal</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"tpl"</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkBuiltinUnique</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span> <a name="line-11"></a> <a name="line-12"></a><a name="mkTemplateLocals"></a><span class='hs-comment'>-- | Create a template local for a series of types</span> <a name="line-13"></a><span class='hs-definition'>mkTemplateLocals</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <a name="line-14"></a><span class='hs-definition'>mkTemplateLocals</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTemplateLocalsNum</span> <span class='hs-num'>1</span> <a name="line-15"></a> <a name="line-16"></a><a name="mkTemplateLocalsNum"></a><span class='hs-comment'>-- | Create a template local for a series of type, but start from a specified template local</span> <a name="line-17"></a><span class='hs-definition'>mkTemplateLocalsNum</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <a name="line-18"></a><span class='hs-definition'>mkTemplateLocalsNum</span> <span class='hs-varid'>n</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zipWith</span> <span class='hs-varid'>mkTemplateLocal</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>tys</span> </pre>\end{code} %************************************************************************ %* * \subsection{Special Ids} %* * %************************************************************************ \begin{code} <pre><a name="line-1"></a><a name="recordSelectorFieldLabel"></a><span class='hs-comment'>-- | If the 'Id' is that for a record selector, extract the 'sel_tycon' and label. Panic otherwise</span> <a name="line-2"></a><span class='hs-definition'>recordSelectorFieldLabel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span><span class='hs-layout'>,</span> <span class='hs-conid'>FieldLabel</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-definition'>recordSelectorFieldLabel</span> <span class='hs-varid'>id</span> <a name="line-4"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-5"></a> <span class='hs-conid'>RecSelId</span> <span class='hs-layout'>{</span> <span class='hs-varid'>sel_tycon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tycon</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-6"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>panic</span> <span class='hs-str'>"recordSelectorFieldLabel"</span> <a name="line-7"></a> <a name="line-8"></a><a name="isRecordSelector"></a><span class='hs-definition'>isRecordSelector</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-9"></a><a name="isNaughtyRecordSelector"></a><span class='hs-definition'>isNaughtyRecordSelector</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-10"></a><a name="isPrimOpId"></a><span class='hs-definition'>isPrimOpId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-11"></a><a name="isFCallId"></a><span class='hs-definition'>isFCallId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-12"></a><a name="isDataConWorkId"></a><span class='hs-definition'>isDataConWorkId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-13"></a><a name="isDFunId"></a><span class='hs-definition'>isDFunId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-14"></a> <a name="line-15"></a><a name="isClassOpId_maybe"></a><span class='hs-definition'>isClassOpId_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Class</span> <a name="line-16"></a><a name="isPrimOpId_maybe"></a><span class='hs-definition'>isPrimOpId_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>PrimOp</span> <a name="line-17"></a><a name="isFCallId_maybe"></a><span class='hs-definition'>isFCallId_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ForeignCall</span> <a name="line-18"></a><a name="isDataConWorkId_maybe"></a><span class='hs-definition'>isDataConWorkId_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>DataCon</span> <a name="line-19"></a> <a name="line-20"></a><span class='hs-definition'>isRecordSelector</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-21"></a> <span class='hs-conid'>RecSelId</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-22"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-23"></a> <a name="line-24"></a><span class='hs-definition'>isNaughtyRecordSelector</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-25"></a> <span class='hs-conid'>RecSelId</span> <span class='hs-layout'>{</span> <span class='hs-varid'>sel_naughty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>n</span> <a name="line-26"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-27"></a> <a name="line-28"></a><span class='hs-definition'>isClassOpId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-29"></a> <span class='hs-conid'>ClassOpId</span> <span class='hs-varid'>cls</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>cls</span> <a name="line-30"></a> <span class='hs-sel'>_other</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span> <a name="line-31"></a> <a name="line-32"></a><span class='hs-definition'>isPrimOpId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-33"></a> <span class='hs-conid'>PrimOpId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-34"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-35"></a> <a name="line-36"></a><span class='hs-definition'>isDFunId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-37"></a> <span class='hs-conid'>DFunId</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-38"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-39"></a> <a name="line-40"></a><span class='hs-definition'>isPrimOpId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-41"></a> <span class='hs-conid'>PrimOpId</span> <span class='hs-varid'>op</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>op</span> <a name="line-42"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span> <a name="line-43"></a> <a name="line-44"></a><span class='hs-definition'>isFCallId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-45"></a> <span class='hs-conid'>FCallId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-46"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-47"></a> <a name="line-48"></a><span class='hs-definition'>isFCallId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-49"></a> <span class='hs-conid'>FCallId</span> <span class='hs-varid'>call</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>call</span> <a name="line-50"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span> <a name="line-51"></a> <a name="line-52"></a><span class='hs-definition'>isDataConWorkId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-53"></a> <span class='hs-conid'>DataConWorkId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-54"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-55"></a> <a name="line-56"></a><span class='hs-definition'>isDataConWorkId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-57"></a> <span class='hs-conid'>DataConWorkId</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>con</span> <a name="line-58"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span> <a name="line-59"></a> <a name="line-60"></a><a name="isDataConId_maybe"></a><span class='hs-definition'>isDataConId_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>DataCon</span> <a name="line-61"></a><span class='hs-definition'>isDataConId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-62"></a> <span class='hs-conid'>DataConWorkId</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>con</span> <a name="line-63"></a> <span class='hs-conid'>DataConWrapId</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>con</span> <a name="line-64"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span> <a name="line-65"></a> <a name="line-66"></a><a name="idDataCon"></a><span class='hs-definition'>idDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>DataCon</span> <a name="line-67"></a><span class='hs-comment'>-- ^ Get from either the worker or the wrapper 'Id' to the 'DataCon'. Currently used only in the desugarer.</span> <a name="line-68"></a><span class='hs-comment'>--</span> <a name="line-69"></a><span class='hs-comment'>-- INVARIANT: @idDataCon (dataConWrapId d) = d@: remember, 'dataConWrapId' can return either the wrapper or the worker</span> <a name="line-70"></a><span class='hs-definition'>idDataCon</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDataConId_maybe</span> <span class='hs-varid'>id</span> <span class='hs-varop'>`orElse`</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"idDataCon"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-71"></a> <a name="line-72"></a> <a name="line-73"></a><a name="isDictId"></a><span class='hs-definition'>isDictId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-74"></a><span class='hs-definition'>isDictId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDictTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-75"></a> <a name="line-76"></a><a name="hasNoBinding"></a><span class='hs-definition'>hasNoBinding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-77"></a><span class='hs-comment'>-- ^ Returns @True@ of an 'Id' which may not have a</span> <a name="line-78"></a><span class='hs-comment'>-- binding, even though it is defined in this module.</span> <a name="line-79"></a> <a name="line-80"></a><span class='hs-comment'>-- Data constructor workers used to be things of this kind, but</span> <a name="line-81"></a><span class='hs-comment'>-- they aren't any more. Instead, we inject a binding for </span> <a name="line-82"></a><span class='hs-comment'>-- them at the CorePrep stage. </span> <a name="line-83"></a><span class='hs-comment'>-- EXCEPT: unboxed tuples, which definitely have no binding</span> <a name="line-84"></a><span class='hs-definition'>hasNoBinding</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-85"></a> <span class='hs-conid'>PrimOpId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <span class='hs-comment'>-- See Note [Primop wrappers]</span> <a name="line-86"></a> <span class='hs-conid'>FCallId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-87"></a> <span class='hs-conid'>DataConWorkId</span> <span class='hs-varid'>dc</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>isUnboxedTupleCon</span> <span class='hs-varid'>dc</span> <a name="line-88"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-89"></a> <a name="line-90"></a><a name="isImplicitId"></a><span class='hs-definition'>isImplicitId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-91"></a><span class='hs-comment'>-- ^ 'isImplicitId' tells whether an 'Id's info is implied by other</span> <a name="line-92"></a><span class='hs-comment'>-- declarations, so we don't need to put its signature in an interface</span> <a name="line-93"></a><span class='hs-comment'>-- file, even if it's mentioned in some other interface unfolding.</span> <a name="line-94"></a><span class='hs-definition'>isImplicitId</span> <span class='hs-varid'>id</span> <a name="line-95"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-96"></a> <span class='hs-conid'>FCallId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-97"></a> <span class='hs-conid'>ClassOpId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-98"></a> <span class='hs-conid'>PrimOpId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-99"></a> <span class='hs-conid'>DataConWorkId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-100"></a> <span class='hs-conid'>DataConWrapId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-101"></a> <span class='hs-comment'>-- These are are implied by their type or class decl;</span> <a name="line-102"></a> <span class='hs-comment'>-- remember that all type and class decls appear in the interface file.</span> <a name="line-103"></a> <span class='hs-comment'>-- The dfun id is not an implicit Id; it must *not* be omitted, because </span> <a name="line-104"></a> <span class='hs-comment'>-- it carries version info for the instance decl</span> <a name="line-105"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-106"></a> <a name="line-107"></a><a name="idIsFrom"></a><span class='hs-definition'>idIsFrom</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-108"></a><span class='hs-definition'>idIsFrom</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameIsLocalOrFrom</span> <span class='hs-varid'>mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>idName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> </pre>\end{code} Note [Primop wrappers] ~~~~~~~~~~~~~~~~~~~~~~ Currently hasNoBinding claims that PrimOpIds don't have a curried function definition. But actually they do, in GHC.PrimopWrappers, which is auto-generated from prelude/primops.txt.pp. So actually, hasNoBinding could return 'False' for PrimOpIds. But we'd need to add something in CoreToStg to swizzle any unsaturated applications of GHC.Prim.plusInt# to GHC.PrimopWrappers.plusInt#. Nota Bene: GHC.PrimopWrappers is needed *regardless*, because it's used by GHCi, which does not implement primops direct at all. \begin{code} <pre><a name="line-1"></a><a name="isDeadBinder"></a><span class='hs-definition'>isDeadBinder</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-2"></a><span class='hs-definition'>isDeadBinder</span> <span class='hs-varid'>bndr</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isId</span> <span class='hs-varid'>bndr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDeadOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>idOccInfo</span> <span class='hs-varid'>bndr</span><span class='hs-layout'>)</span> <a name="line-3"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <span class='hs-comment'>-- TyVars count as not dead</span> </pre>\end{code} \begin{code} <pre><a name="line-1"></a><a name="isTickBoxOp"></a><span class='hs-definition'>isTickBoxOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-2"></a><span class='hs-definition'>isTickBoxOp</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <a name="line-3"></a> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-4"></a> <span class='hs-conid'>TickBoxOpId</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-5"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-6"></a> <a name="line-7"></a><a name="isTickBoxOp_maybe"></a><span class='hs-definition'>isTickBoxOp_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>TickBoxOp</span> <a name="line-8"></a><span class='hs-definition'>isTickBoxOp_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <a name="line-9"></a> <span class='hs-keyword'>case</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-10"></a> <span class='hs-conid'>TickBoxOpId</span> <span class='hs-varid'>tick</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>tick</span> <a name="line-11"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span> </pre>\end{code} %************************************************************************ %* * \subsection{IdInfo stuff} %* * %************************************************************************ \begin{code} <pre><a name="line-1"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-2"></a> <span class='hs-comment'>-- ARITY</span> <a name="line-3"></a><a name="idArity"></a><span class='hs-definition'>idArity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Arity</span> <a name="line-4"></a><span class='hs-definition'>idArity</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>arityInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-5"></a> <a name="line-6"></a><a name="setIdArity"></a><span class='hs-definition'>setIdArity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Arity</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-7"></a><span class='hs-definition'>setIdArity</span> <span class='hs-varid'>id</span> <span class='hs-varid'>arity</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setArityInfo`</span> <span class='hs-varid'>arity</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-8"></a> <a name="line-9"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-10"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-11"></a> <span class='hs-comment'>-- (OLD) STRICTNESS </span> <a name="line-12"></a><a name="idStrictness"></a><span class='hs-definition'>idStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>StrictnessInfo</span> <a name="line-13"></a><span class='hs-definition'>idStrictness</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-14"></a> <a name="line-15"></a><a name="setIdStrictness"></a><span class='hs-definition'>setIdStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>StrictnessInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-16"></a><span class='hs-definition'>setIdStrictness</span> <span class='hs-varid'>id</span> <span class='hs-varid'>strict_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setStrictnessInfo`</span> <span class='hs-varid'>strict_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-17"></a><span class='hs-cpp'>#endif</span> <a name="line-18"></a> <a name="line-19"></a><a name="isBottomingId"></a><span class='hs-comment'>-- | Returns true if an application to n args would diverge</span> <a name="line-20"></a><span class='hs-definition'>isBottomingId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-21"></a><span class='hs-definition'>isBottomingId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isBottomingSig</span> <span class='hs-layout'>(</span><span class='hs-varid'>idNewStrictness</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-22"></a> <a name="line-23"></a><a name="idNewStrictness_maybe"></a><span class='hs-definition'>idNewStrictness_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StrictSig</span> <a name="line-24"></a><a name="idNewStrictness"></a><span class='hs-definition'>idNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>StrictSig</span> <a name="line-25"></a> <a name="line-26"></a><span class='hs-definition'>idNewStrictness_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-27"></a><span class='hs-definition'>idNewStrictness</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idNewStrictness_maybe</span> <span class='hs-varid'>id</span> <span class='hs-varop'>`orElse`</span> <span class='hs-varid'>topSig</span> <a name="line-28"></a> <a name="line-29"></a><a name="setIdNewStrictness"></a><span class='hs-definition'>setIdNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-30"></a><span class='hs-definition'>setIdNewStrictness</span> <span class='hs-varid'>id</span> <span class='hs-varid'>sig</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setNewStrictnessInfo`</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>sig</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-31"></a> <a name="line-32"></a><a name="zapIdNewStrictness"></a><span class='hs-definition'>zapIdNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-33"></a><span class='hs-definition'>zapIdNewStrictness</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setNewStrictnessInfo`</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-34"></a> <a name="line-35"></a><a name="isStrictId"></a><span class='hs-comment'>-- | This predicate says whether the 'Id' has a strict demand placed on it or</span> <a name="line-36"></a><span class='hs-comment'>-- has a type such that it can always be evaluated strictly (e.g., an</span> <a name="line-37"></a><span class='hs-comment'>-- unlifted type, but see the comment for 'isStrictType'). We need to</span> <a name="line-38"></a><span class='hs-comment'>-- check separately whether the 'Id' has a so-called \"strict type\" because if</span> <a name="line-39"></a><span class='hs-comment'>-- the demand for the given @id@ hasn't been computed yet but @id@ has a strict</span> <a name="line-40"></a><span class='hs-comment'>-- type, we still want @isStrictId id@ to be @True@.</span> <a name="line-41"></a><span class='hs-definition'>isStrictId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-42"></a><span class='hs-definition'>isStrictId</span> <span class='hs-varid'>id</span> <a name="line-43"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>isId</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span> <span class='hs-str'>"isStrictId: not an id: "</span> <span class='hs-varop'><+></span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>id</span> <span class='hs-layout'>)</span> <a name="line-44"></a> <span class='hs-layout'>(</span><span class='hs-varid'>isStrictDmd</span> <span class='hs-layout'>(</span><span class='hs-varid'>idNewDemandInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <a name="line-45"></a> <span class='hs-layout'>(</span><span class='hs-varid'>isStrictType</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-46"></a> <a name="line-47"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-48"></a> <span class='hs-comment'>-- WORKER ID</span> <a name="line-49"></a><a name="idWorkerInfo"></a><span class='hs-definition'>idWorkerInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>WorkerInfo</span> <a name="line-50"></a><span class='hs-definition'>idWorkerInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>workerInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-51"></a> <a name="line-52"></a><a name="setIdWorkerInfo"></a><span class='hs-definition'>setIdWorkerInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-53"></a><span class='hs-definition'>setIdWorkerInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>work_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setWorkerInfo`</span> <span class='hs-varid'>work_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-54"></a> <a name="line-55"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-56"></a> <span class='hs-comment'>-- UNFOLDING</span> <a name="line-57"></a><a name="idUnfolding"></a><span class='hs-definition'>idUnfolding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Unfolding</span> <a name="line-58"></a><span class='hs-definition'>idUnfolding</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unfoldingInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-59"></a> <a name="line-60"></a><a name="setIdUnfolding"></a><span class='hs-definition'>setIdUnfolding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Unfolding</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-61"></a><span class='hs-definition'>setIdUnfolding</span> <span class='hs-varid'>id</span> <span class='hs-varid'>unfolding</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setUnfoldingInfo`</span> <span class='hs-varid'>unfolding</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-62"></a> <a name="line-63"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-64"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-65"></a> <span class='hs-comment'>-- (OLD) DEMAND</span> <a name="line-66"></a><a name="idDemandInfo"></a><span class='hs-definition'>idDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <a name="line-67"></a><span class='hs-definition'>idDemandInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>demandInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-68"></a> <a name="line-69"></a><a name="setIdDemandInfo"></a><span class='hs-definition'>setIdDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-70"></a><span class='hs-definition'>setIdDemandInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>demand_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setDemandInfo`</span> <span class='hs-varid'>demand_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-71"></a><span class='hs-cpp'>#endif</span> <a name="line-72"></a> <a name="line-73"></a><a name="idNewDemandInfo_maybe"></a><span class='hs-definition'>idNewDemandInfo_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <a name="line-74"></a><a name="idNewDemandInfo"></a><span class='hs-definition'>idNewDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <a name="line-75"></a> <a name="line-76"></a><span class='hs-definition'>idNewDemandInfo_maybe</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newDemandInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-77"></a><span class='hs-definition'>idNewDemandInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newDemandInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-varop'>`orElse`</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-varid'>topDmd</span> <a name="line-78"></a> <a name="line-79"></a><a name="setIdNewDemandInfo"></a><span class='hs-definition'>setIdNewDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-80"></a><span class='hs-definition'>setIdNewDemandInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>dmd</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setNewDemandInfo`</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>dmd</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-81"></a> <a name="line-82"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-83"></a> <span class='hs-comment'>-- SPECIALISATION</span> <a name="line-84"></a><a name="idSpecialisation"></a><span class='hs-definition'>idSpecialisation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>SpecInfo</span> <a name="line-85"></a><span class='hs-definition'>idSpecialisation</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>specInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-86"></a> <a name="line-87"></a><a name="idCoreRules"></a><span class='hs-definition'>idCoreRules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span> <a name="line-88"></a><span class='hs-definition'>idCoreRules</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>specInfoRules</span> <span class='hs-layout'>(</span><span class='hs-varid'>idSpecialisation</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-89"></a> <a name="line-90"></a><a name="idHasRules"></a><span class='hs-definition'>idHasRules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-91"></a><span class='hs-definition'>idHasRules</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isEmptySpecInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idSpecialisation</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-92"></a> <a name="line-93"></a><a name="setIdSpecialisation"></a><span class='hs-definition'>setIdSpecialisation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-94"></a><span class='hs-definition'>setIdSpecialisation</span> <span class='hs-varid'>id</span> <span class='hs-varid'>spec_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setSpecInfo`</span> <span class='hs-varid'>spec_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-95"></a> <a name="line-96"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-97"></a> <span class='hs-comment'>-- CAF INFO</span> <a name="line-98"></a><a name="idCafInfo"></a><span class='hs-definition'>idCafInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CafInfo</span> <a name="line-99"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-100"></a><span class='hs-definition'>idCafInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>cgInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <a name="line-101"></a> <span class='hs-conid'>NoCgInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"idCafInfo"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-102"></a> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>cgCafInfo</span> <span class='hs-varid'>info</span> <a name="line-103"></a><span class='hs-cpp'>#else</span> <a name="line-104"></a><span class='hs-definition'>idCafInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cafInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-105"></a><span class='hs-cpp'>#endif</span> <a name="line-106"></a> <a name="line-107"></a><a name="setIdCafInfo"></a><span class='hs-definition'>setIdCafInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CafInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-108"></a><span class='hs-definition'>setIdCafInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>caf_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setCafInfo`</span> <span class='hs-varid'>caf_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-109"></a> <a name="line-110"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-111"></a> <span class='hs-comment'>-- CPR INFO</span> <a name="line-112"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span> <a name="line-113"></a><a name="idCprInfo"></a><span class='hs-definition'>idCprInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CprInfo</span> <a name="line-114"></a><span class='hs-definition'>idCprInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cprInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-115"></a> <a name="line-116"></a><a name="setIdCprInfo"></a><span class='hs-definition'>setIdCprInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CprInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-117"></a><span class='hs-definition'>setIdCprInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>cpr_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setCprInfo`</span> <span class='hs-varid'>cpr_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-118"></a><span class='hs-cpp'>#endif</span> <a name="line-119"></a> <a name="line-120"></a> <span class='hs-comment'>---------------------------------</span> <a name="line-121"></a> <span class='hs-comment'>-- Occcurrence INFO</span> <a name="line-122"></a><a name="idOccInfo"></a><span class='hs-definition'>idOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>OccInfo</span> <a name="line-123"></a><span class='hs-definition'>idOccInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-124"></a> <a name="line-125"></a><a name="setIdOccInfo"></a><span class='hs-definition'>setIdOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-126"></a><span class='hs-definition'>setIdOccInfo</span> <span class='hs-varid'>id</span> <span class='hs-varid'>occ_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setOccInfo`</span> <span class='hs-varid'>occ_info</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-127"></a> <a name="line-128"></a><a name="zapIdOccInfo"></a><span class='hs-definition'>zapIdOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-129"></a><span class='hs-definition'>zapIdOccInfo</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span> <span class='hs-varop'>`setIdOccInfo`</span> <span class='hs-conid'>NoOccInfo</span> </pre>\end{code} --------------------------------- -- INLINING The inline pragma tells us to be very keen to inline this Id, but it's still OK not to if optimisation is switched off. \begin{code} <pre><a name="line-1"></a><a name="idInlinePragma"></a><span class='hs-definition'>idInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>InlinePragma</span> <a name="line-2"></a><span class='hs-definition'>idInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-3"></a> <a name="line-4"></a><a name="setInlinePragma"></a><span class='hs-definition'>setInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-5"></a><span class='hs-definition'>setInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-varid'>prag</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-varid'>prag</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-6"></a> <a name="line-7"></a><a name="modifyInlinePragma"></a><span class='hs-definition'>modifyInlinePragma</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>InlinePragma</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-8"></a><span class='hs-definition'>modifyInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-varid'>fn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>info</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>info</span> <span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-layout'>(</span><span class='hs-varid'>fn</span> <span class='hs-layout'>(</span><span class='hs-varid'>inlinePragInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-9"></a> <a name="line-10"></a><a name="idInlineActivation"></a><span class='hs-definition'>idInlineActivation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Activation</span> <a name="line-11"></a><span class='hs-definition'>idInlineActivation</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragmaActivation</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInlinePragma</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-12"></a> <a name="line-13"></a><a name="setInlineActivation"></a><span class='hs-definition'>setInlineActivation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Activation</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-14"></a><span class='hs-definition'>setInlineActivation</span> <span class='hs-varid'>id</span> <span class='hs-varid'>act</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyInlinePragma</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>InlinePragma</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>InlinePragma</span> <span class='hs-varid'>act</span> <span class='hs-varid'>match_info</span><span class='hs-layout'>)</span> <a name="line-15"></a> <a name="line-16"></a><a name="idRuleMatchInfo"></a><span class='hs-definition'>idRuleMatchInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>RuleMatchInfo</span> <a name="line-17"></a><span class='hs-definition'>idRuleMatchInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragmaRuleMatchInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInlinePragma</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-18"></a> <a name="line-19"></a><a name="isConLikeId"></a><span class='hs-definition'>isConLikeId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-20"></a><span class='hs-definition'>isConLikeId</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDataConWorkId</span> <span class='hs-varid'>id</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isConLike</span> <span class='hs-layout'>(</span><span class='hs-varid'>idRuleMatchInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> </pre>\end{code} --------------------------------- -- ONE-SHOT LAMBDAS \begin{code} <pre><a name="line-1"></a><a name="idLBVarInfo"></a><span class='hs-definition'>idLBVarInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>LBVarInfo</span> <a name="line-2"></a><span class='hs-definition'>idLBVarInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lbvarInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-3"></a> <a name="line-4"></a><a name="isOneShotBndr"></a><span class='hs-comment'>-- | Returns whether the lambda associated with the 'Id' is certainly applied at most once</span> <a name="line-5"></a><span class='hs-comment'>-- OR we are applying the \"state hack\" which makes it appear as if theis is the case for</span> <a name="line-6"></a><span class='hs-comment'>-- lambdas used in @IO@. You should prefer using this over 'isOneShotLambda'</span> <a name="line-7"></a><span class='hs-definition'>isOneShotBndr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-8"></a><span class='hs-comment'>-- This one is the "business end", called externally.</span> <a name="line-9"></a><span class='hs-comment'>-- Its main purpose is to encapsulate the Horrible State Hack</span> <a name="line-10"></a><span class='hs-definition'>isOneShotBndr</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isStateHackType</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <a name="line-11"></a> <a name="line-12"></a><a name="isStateHackType"></a><span class='hs-comment'>-- | Should we apply the state hack to values of this 'Type'?</span> <a name="line-13"></a><span class='hs-definition'>isStateHackType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-14"></a><span class='hs-definition'>isStateHackType</span> <span class='hs-varid'>ty</span> <a name="line-15"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>opt_NoStateHack</span> <a name="line-16"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-17"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <a name="line-18"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>splitTyConApp_maybe</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>of</span> <a name="line-19"></a> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>tycon</span> <span class='hs-varop'>==</span> <span class='hs-varid'>statePrimTyCon</span> <a name="line-20"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-21"></a> <span class='hs-comment'>-- This is a gross hack. It claims that </span> <a name="line-22"></a> <span class='hs-comment'>-- every function over realWorldStatePrimTy is a one-shot</span> <a name="line-23"></a> <span class='hs-comment'>-- function. This is pretty true in practice, and makes a big</span> <a name="line-24"></a> <span class='hs-comment'>-- difference. For example, consider</span> <a name="line-25"></a> <span class='hs-comment'>-- a `thenST` \ r -> ...E...</span> <a name="line-26"></a> <span class='hs-comment'>-- The early full laziness pass, if it doesn't know that r is one-shot</span> <a name="line-27"></a> <span class='hs-comment'>-- will pull out E (let's say it doesn't mention r) to give</span> <a name="line-28"></a> <span class='hs-comment'>-- let lvl = E in a `thenST` \ r -> ...lvl...</span> <a name="line-29"></a> <span class='hs-comment'>-- When `thenST` gets inlined, we end up with</span> <a name="line-30"></a> <span class='hs-comment'>-- let lvl = E in \s -> case a s of (r, s') -> ...lvl...</span> <a name="line-31"></a> <span class='hs-comment'>-- and we don't re-inline E.</span> <a name="line-32"></a> <span class='hs-comment'>--</span> <a name="line-33"></a> <span class='hs-comment'>-- It would be better to spot that r was one-shot to start with, but</span> <a name="line-34"></a> <span class='hs-comment'>-- I don't want to rely on that.</span> <a name="line-35"></a> <span class='hs-comment'>--</span> <a name="line-36"></a> <span class='hs-comment'>-- Another good example is in fill_in in PrelPack.lhs. We should be able to</span> <a name="line-37"></a> <span class='hs-comment'>-- spot that fill_in has arity 2 (and when Keith is done, we will) but we can't yet.</span> <a name="line-38"></a> <a name="line-39"></a> <a name="line-40"></a><a name="isOneShotLambda"></a><span class='hs-comment'>-- | Returns whether the lambda associated with the 'Id' is certainly applied at most once.</span> <a name="line-41"></a><span class='hs-comment'>-- You probably want to use 'isOneShotBndr' instead</span> <a name="line-42"></a><span class='hs-definition'>isOneShotLambda</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-43"></a><span class='hs-definition'>isOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>idLBVarInfo</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span> <a name="line-44"></a> <span class='hs-conid'>IsOneShotLambda</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-45"></a> <span class='hs-conid'>NoLBVarInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-46"></a> <a name="line-47"></a><a name="setOneShotLambda"></a><span class='hs-definition'>setOneShotLambda</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-48"></a><span class='hs-definition'>setOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setLBVarInfo`</span> <span class='hs-conid'>IsOneShotLambda</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-49"></a> <a name="line-50"></a><a name="clearOneShotLambda"></a><span class='hs-definition'>clearOneShotLambda</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-51"></a><span class='hs-definition'>clearOneShotLambda</span> <span class='hs-varid'>id</span> <a name="line-52"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isOneShotLambda</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varop'>`setLBVarInfo`</span> <span class='hs-conid'>NoLBVarInfo</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-53"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <a name="line-54"></a> <a name="line-55"></a><span class='hs-comment'>-- The OneShotLambda functions simply fiddle with the IdInfo flag</span> <a name="line-56"></a><span class='hs-comment'>-- But watch out: this may change the type of something else</span> <a name="line-57"></a><span class='hs-comment'>-- f = \x -> e</span> <a name="line-58"></a><span class='hs-comment'>-- If we change the one-shot-ness of x, f's type changes</span> </pre>\end{code} \begin{code} <pre><a name="line-1"></a><a name="zapInfo"></a><span class='hs-definition'>zapInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>IdInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-2"></a><span class='hs-definition'>zapInfo</span> <span class='hs-varid'>zapper</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybeModifyIdInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>zapper</span> <span class='hs-layout'>(</span><span class='hs-varid'>idInfo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <a name="line-3"></a> <a name="line-4"></a><a name="zapLamIdInfo"></a><span class='hs-definition'>zapLamIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-5"></a><span class='hs-definition'>zapLamIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zapInfo</span> <span class='hs-varid'>zapLamInfo</span> <a name="line-6"></a> <a name="line-7"></a><a name="zapDemandIdInfo"></a><span class='hs-definition'>zapDemandIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-8"></a><span class='hs-definition'>zapDemandIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zapInfo</span> <span class='hs-varid'>zapDemandInfo</span> <a name="line-9"></a> <a name="line-10"></a><a name="zapFragileIdInfo"></a><span class='hs-definition'>zapFragileIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-11"></a><span class='hs-definition'>zapFragileIdInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zapInfo</span> <span class='hs-varid'>zapFragileInfo</span> </pre>\end{code} Note [transferPolyIdInfo] ~~~~~~~~~~~~~~~~~~~~~~~~~ Suppose we have f = /\a. let g = rhs in ... where g has interesting strictness information. Then if we float thus g' = /\a. rhs f = /\a. ...[g' a/g] we *do not* want to lose g's * strictness information * arity * inline pragma (though that is bit more debatable) It's simple to retain strictness and arity, but not so simple to retain * worker info * rules so we simply discard those. Sooner or later this may bite us. This transfer is used in two places: FloatOut (long-distance let-floating) SimplUtils.abstractFloats (short-distance let-floating) If we abstract wrt one or more *value* binders, we must modify the arity and strictness info before transferring it. E.g. f = \x. e --> g' = \y. \x. e + substitute (g' y) for g Notice that g' has an arity one more than the original g \begin{code} <pre><a name="line-1"></a><a name="transferPolyIdInfo"></a><span class='hs-definition'>transferPolyIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-comment'>-- Original Id</span> <a name="line-2"></a> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Var</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- Abstract wrt these variables</span> <a name="line-3"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <span class='hs-comment'>-- New Id</span> <a name="line-4"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Id</span> <a name="line-5"></a><span class='hs-definition'>transferPolyIdInfo</span> <span class='hs-varid'>old_id</span> <span class='hs-varid'>abstract_wrt</span> <span class='hs-varid'>new_id</span> <a name="line-6"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyIdInfo</span> <span class='hs-varid'>transfer</span> <span class='hs-varid'>new_id</span> <a name="line-7"></a> <span class='hs-keyword'>where</span> <a name="line-8"></a> <span class='hs-varid'>arity_increase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>count</span> <span class='hs-varid'>isId</span> <span class='hs-varid'>abstract_wrt</span> <span class='hs-comment'>-- Arity increases by the</span> <a name="line-9"></a> <span class='hs-comment'>-- number of value binders</span> <a name="line-10"></a> <a name="line-11"></a> <span class='hs-varid'>old_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idInfo</span> <span class='hs-varid'>old_id</span> <a name="line-12"></a> <span class='hs-varid'>old_arity</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>arityInfo</span> <span class='hs-varid'>old_info</span> <a name="line-13"></a> <span class='hs-varid'>old_inline_prag</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePragInfo</span> <span class='hs-varid'>old_info</span> <a name="line-14"></a> <span class='hs-varid'>new_arity</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old_arity</span> <span class='hs-varop'>+</span> <span class='hs-varid'>arity_increase</span> <a name="line-15"></a> <span class='hs-varid'>old_strictness</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-varid'>old_info</span> <a name="line-16"></a> <span class='hs-varid'>new_strictness</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>increaseStrictSigArity</span> <span class='hs-varid'>arity_increase</span><span class='hs-layout'>)</span> <span class='hs-varid'>old_strictness</span> <a name="line-17"></a> <a name="line-18"></a> <span class='hs-varid'>transfer</span> <span class='hs-varid'>new_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_info</span> <span class='hs-varop'>`setNewStrictnessInfo`</span> <span class='hs-varid'>new_strictness</span> <a name="line-19"></a> <span class='hs-varop'>`setArityInfo`</span> <span class='hs-varid'>new_arity</span> <a name="line-20"></a> <span class='hs-varop'>`setInlinePragInfo`</span> <span class='hs-varid'>old_inline_prag</span> </pre>\end{code} </body> </html>