X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcType.lhs;h=4ebeeb726cc0bcd2037676722d34bdb948a715cb;hb=36b27193c994b4a267c8dfdbf833d73b455130aa;hp=4b6e7b814e0b46d4698f1f4b8b8317bf3ece7adc;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcType.lhs b/compiler/typecheck/TcType.lhs index 4b6e7b8..4ebeeb7 100644 --- a/compiler/typecheck/TcType.lhs +++ b/compiler/typecheck/TcType.lhs @@ -82,7 +82,7 @@ module TcType ( isFFIDotnetTy, -- :: DynFlags -> Type -> Bool isFFIDotnetObjTy, -- :: Type -> Bool isFFITy, -- :: Type -> Bool - + tcSplitIOType_maybe, -- :: Type -> Maybe Type toDNType, -- :: Type -> DNType -------------------------------- @@ -160,7 +160,7 @@ import Type ( -- Re-exports substTy, substTys, substTyWith, substTheta, substTyVar, substTyVarBndr, substPred, lookupTyVar, - typeKind, repType, + typeKind, repType, coreView, pprKind, pprParendKind, pprType, pprParendType, pprTyThingCategory, pprPred, pprTheta, pprThetaArrow, pprClassPred @@ -1029,6 +1029,23 @@ restricted set of types as arguments and results (the restricting factor being the ) \begin{code} +tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type) +-- (isIOType t) returns (Just (IO,t')) if t is of the form (IO t'), or +-- some newtype wrapping thereof +-- returns Nothing otherwise +tcSplitIOType_maybe ty + | Just (io_tycon, [io_res_ty]) <- tcSplitTyConApp_maybe ty, + -- This split absolutely has to be a tcSplit, because we must + -- see the IO type; and it's a newtype which is transparent to splitTyConApp. + io_tycon `hasKey` ioTyConKey + = Just (io_tycon, io_res_ty) + + | Just ty' <- coreView ty -- Look through non-recursive newtypes + = tcSplitIOType_maybe ty' + + | otherwise + = Nothing + isFFITy :: Type -> Bool -- True for any TyCon that can possibly be an arg or result of an FFI call isFFITy ty = checkRepTyCon legalFFITyCon ty @@ -1066,8 +1083,7 @@ isFFILabelTy = checkRepTyConKey [ptrTyConKey, funPtrTyConKey, addrTyConKey] isFFIDotnetTy :: DynFlags -> Type -> Bool isFFIDotnetTy dflags ty - = checkRepTyCon (\ tc -> not (isByteArrayLikeTyCon tc) && - (legalFIResultTyCon dflags tc || + = checkRepTyCon (\ tc -> (legalFIResultTyCon dflags tc || isFFIDotnetObjTy ty || isStringTy ty)) ty -- Support String as an argument or result from a .NET FFI call. @@ -1143,35 +1159,24 @@ These chaps do the work; they are not exported \begin{code} legalFEArgTyCon :: TyCon -> Bool --- It's illegal to return foreign objects and (mutable) --- bytearrays from a _ccall_ / foreign declaration --- (or be passed them as arguments in foreign exported functions). legalFEArgTyCon tc - | isByteArrayLikeTyCon tc - = False - -- It's also illegal to make foreign exports that take unboxed + -- It's illegal to make foreign exports that take unboxed -- arguments. The RTS API currently can't invoke such things. --SDM 7/2000 - | otherwise = boxedMarshalableTyCon tc legalFIResultTyCon :: DynFlags -> TyCon -> Bool legalFIResultTyCon dflags tc - | isByteArrayLikeTyCon tc = False | tc == unitTyCon = True | otherwise = marshalableTyCon dflags tc legalFEResultTyCon :: TyCon -> Bool legalFEResultTyCon tc - | isByteArrayLikeTyCon tc = False | tc == unitTyCon = True | otherwise = boxedMarshalableTyCon tc legalOutgoingTyCon :: DynFlags -> Safety -> TyCon -> Bool -- Checks validity of types going from Haskell -> external world legalOutgoingTyCon dflags safety tc - | playSafe safety && isByteArrayLikeTyCon tc - = False - | otherwise = marshalableTyCon dflags tc legalFFITyCon :: TyCon -> Bool @@ -1192,11 +1197,6 @@ boxedMarshalableTyCon tc , addrTyConKey, ptrTyConKey, funPtrTyConKey , charTyConKey , stablePtrTyConKey - , byteArrayTyConKey, mutableByteArrayTyConKey , boolTyConKey ] - -isByteArrayLikeTyCon :: TyCon -> Bool -isByteArrayLikeTyCon tc = - getUnique tc `elem` [byteArrayTyConKey, mutableByteArrayTyConKey] \end{code}