Add sameMVar# primop, and use it to define an instance for Eq (MVar a).
| SizeofByteArrayOp | SizeofMutableByteArrayOp
| NewSynchVarOp -- for MVars and IVars
| SizeofByteArrayOp | SizeofMutableByteArrayOp
| NewSynchVarOp -- for MVars and IVars
| TakeMVarOp | PutMVarOp
| ReadIVarOp | WriteIVarOp
| TakeMVarOp | PutMVarOp
| ReadIVarOp | WriteIVarOp
tagOf_PrimOp ParAtForNowOp = ILIT(191)
tagOf_PrimOp CopyableOp = ILIT(192)
tagOf_PrimOp NoFollowOp = ILIT(193)
tagOf_PrimOp ParAtForNowOp = ILIT(191)
tagOf_PrimOp CopyableOp = ILIT(192)
tagOf_PrimOp NoFollowOp = ILIT(193)
+tagOf_PrimOp SameMVarOp = ILIT(194)
tagOf_PrimOp _ = panic# "tagOf_PrimOp: pattern-match"
tagOf_PrimOp _ = panic# "tagOf_PrimOp: pattern-match"
SizeofByteArrayOp,
SizeofMutableByteArrayOp,
NewSynchVarOp,
SizeofByteArrayOp,
SizeofMutableByteArrayOp,
NewSynchVarOp,
ReadArrayOp,
TakeMVarOp,
PutMVarOp,
ReadArrayOp,
TakeMVarOp,
PutMVarOp,
AlgResult SLIT("newSynchVar#") [s_tv, elt_tv] [mkStatePrimTy s]
stateAndSynchVarPrimTyCon [s, elt]
AlgResult SLIT("newSynchVar#") [s_tv, elt_tv] [mkStatePrimTy s]
stateAndSynchVarPrimTyCon [s, elt]
+primOpInfo SameMVarOp
+ = let {
+ elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
+ mvar_ty = mkSynchVarPrimTy s elt
+ } in
+ AlgResult SLIT("sameMVar#") [s_tv, elt_tv] [mvar_ty, mvar_ty]
+ boolTyCon []
+
primOpInfo TakeMVarOp
= let {
elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
primOpInfo TakeMVarOp
= let {
elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
\begin{code}
ED_(PrelBase_Z91Z93_closure);
\begin{code}
ED_(PrelBase_Z91Z93_closure);
+#define sameMVarZh(r,a,b) r=(I_)((a)==(b))
+
#define newSynchVarZh(r, hp) \
{ \
ALLOC_PRIM(MUTUPLE_HS,3,0,MUTUPLE_HS+3) /* ticky ticky */; \
#define newSynchVarZh(r, hp) \
{ \
ALLOC_PRIM(MUTUPLE_HS,3,0,MUTUPLE_HS+3) /* ticky ticky */; \
\begin{code}
--Defined in IOBase to avoid cycle: data MVar a = MVar (SynchVar# RealWorld a)
\begin{code}
--Defined in IOBase to avoid cycle: data MVar a = MVar (SynchVar# RealWorld a)
+instance Eq (MVar a) where
+ (MVar mvar1#) == (MVar mvar2#) = sameMVar# mvar1# mvar2#
+
newEmptyMVar :: IO (MVar a)
newEmptyMVar = IO $ \ s# ->
newEmptyMVar :: IO (MVar a)
newEmptyMVar = IO $ \ s# ->