Hello community,
here is the log from the commit of package ghc-haskell-gi-base for
openSUSE:Factory checked in at 2017-06-22 10:37:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-haskell-gi-base (Old)
and /work/SRC/openSUSE:Factory/.ghc-haskell-gi-base.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-haskell-gi-base"
Thu Jun 22 10:37:39 2017 rev:4 rq:504071 version:0.20.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-haskell-gi-base/ghc-haskell-gi-base.changes
2017-05-06 18:28:41.935291757 +0200
+++
/work/SRC/openSUSE:Factory/.ghc-haskell-gi-base.new/ghc-haskell-gi-base.changes
2017-06-22 10:37:40.464619275 +0200
@@ -1,0 +2,5 @@
+Thu Jun 8 11:08:19 UTC 2017 - [email protected]
+
+- Update to version 0.20.3.
+
+-------------------------------------------------------------------
Old:
----
haskell-gi-base-0.20.2.tar.gz
New:
----
haskell-gi-base-0.20.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-haskell-gi-base.spec ++++++
--- /var/tmp/diff_new_pack.yZecry/_old 2017-06-22 10:37:41.264506509 +0200
+++ /var/tmp/diff_new_pack.yZecry/_new 2017-06-22 10:37:41.268505946 +0200
@@ -18,7 +18,7 @@
%global pkg_name haskell-gi-base
Name: ghc-%{pkg_name}
-Version: 0.20.2
+Version: 0.20.3
Release: 0
Summary: Foundation for libraries generated by haskell-gi
License: LGPL-2.1+
++++++ haskell-gi-base-0.20.2.tar.gz -> haskell-gi-base-0.20.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/haskell-gi-base-0.20.2/ChangeLog.md
new/haskell-gi-base-0.20.3/ChangeLog.md
--- old/haskell-gi-base-0.20.2/ChangeLog.md 2017-04-14 10:30:46.000000000
+0200
+++ new/haskell-gi-base-0.20.3/ChangeLog.md 2017-06-03 11:47:13.000000000
+0200
@@ -1,3 +1,7 @@
+### 0.20.3
+
++ Fixes for GHC 8.2.1 (and the corresponding `base-4.10.0`).
+
### 0.20.2
+ Fix fromGVariant for empty arrays, see
[#91](https://github.com/haskell-gi/haskell-gi/issues/91) for details.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/haskell-gi-base-0.20.2/Data/GI/Base/Attributes.hs
new/haskell-gi-base-0.20.3/Data/GI/Base/Attributes.hs
--- old/haskell-gi-base-0.20.2/Data/GI/Base/Attributes.hs 2017-04-14
10:30:46.000000000 +0200
+++ new/haskell-gi-base-0.20.3/Data/GI/Base/Attributes.hs 2017-06-03
11:47:13.000000000 +0200
@@ -162,7 +162,10 @@
instance a ~ x => IsLabelProxy x (AttrLabelProxy a) where
fromLabelProxy _ = AttrLabelProxy
-#if MIN_VERSION_base(4,9,0)
+#if MIN_VERSION_base(4,10,0)
+instance a ~ x => IsLabel x (AttrLabelProxy a) where
+ fromLabel = AttrLabelProxy
+#elif MIN_VERSION_base(4,9,0)
instance a ~ x => IsLabel x (AttrLabelProxy a) where
fromLabel _ = AttrLabelProxy
#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/haskell-gi-base-0.20.2/Data/GI/Base/BasicTypes.hs
new/haskell-gi-base-0.20.3/Data/GI/Base/BasicTypes.hs
--- old/haskell-gi-base-0.20.2/Data/GI/Base/BasicTypes.hs 2017-04-14
10:30:46.000000000 +0200
+++ new/haskell-gi-base-0.20.3/Data/GI/Base/BasicTypes.hs 2017-06-03
11:47:13.000000000 +0200
@@ -59,6 +59,7 @@
import GHC.TypeLits
#endif
+import Data.GI.Base.CallStack (CallStack)
import Data.GI.Base.GType
-- | Thin wrapper over `ForeignPtr`, supporting the extra notion of
@@ -66,7 +67,8 @@
-- the foreign ptr.
data ManagedPtr a = ManagedPtr {
managedForeignPtr :: ForeignPtr a
- , managedPtrIsOwned :: IORef Bool
+ , managedPtrIsDisowned :: IORef (Maybe CallStack)
+ -- ^ When disowned, the `CallStack` for the disowning call.
}
-- | A constraint ensuring that the given type is coercible to a
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/haskell-gi-base-0.20.2/Data/GI/Base/CallStack.hs
new/haskell-gi-base-0.20.3/Data/GI/Base/CallStack.hs
--- old/haskell-gi-base-0.20.2/Data/GI/Base/CallStack.hs 2017-04-14
10:30:46.000000000 +0200
+++ new/haskell-gi-base-0.20.3/Data/GI/Base/CallStack.hs 2017-06-03
11:47:13.000000000 +0200
@@ -4,12 +4,13 @@
-- functionality itself does not work there).
module Data.GI.Base.CallStack
( HasCallStack
+ , CallStack
, prettyCallStack
, callStack
) where
#if MIN_VERSION_base(4,9,0)
-import GHC.Stack (HasCallStack, prettyCallStack, callStack)
+import GHC.Stack (HasCallStack, prettyCallStack, callStack, CallStack)
#elif MIN_VERSION_base(4,8,1)
import Data.List (intercalate)
import qualified GHC.Stack as S
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/haskell-gi-base-0.20.2/Data/GI/Base/ManagedPtr.hs
new/haskell-gi-base-0.20.3/Data/GI/Base/ManagedPtr.hs
--- old/haskell-gi-base-0.20.2/Data/GI/Base/ManagedPtr.hs 2017-04-14
10:30:46.000000000 +0200
+++ new/haskell-gi-base-0.20.3/Data/GI/Base/ManagedPtr.hs 2017-06-03
11:47:13.000000000 +0200
@@ -17,6 +17,7 @@
, withManagedPtr
, maybeWithManagedPtr
, withManagedPtrList
+ , withTransient
, unsafeManagedPtrGetPtr
, unsafeManagedPtrCastPtr
, touchManagedPtr
@@ -49,6 +50,7 @@
import Data.Coerce (coerce)
import Data.IORef (newIORef, readIORef, writeIORef, IORef)
+import Data.Maybe (isNothing)
import Foreign.C (CInt(..))
import Foreign.Ptr (Ptr, FunPtr, castPtr, nullPtr)
@@ -57,7 +59,8 @@
import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
import Data.GI.Base.BasicTypes
-import Data.GI.Base.CallStack (HasCallStack, prettyCallStack, callStack)
+import Data.GI.Base.CallStack (CallStack, HasCallStack,
+ prettyCallStack, callStack)
import Data.GI.Base.Utils
import System.IO (hPutStrLn, stderr)
@@ -65,15 +68,15 @@
-- | Thin wrapper over `Foreign.Concurrent.newForeignPtr`.
newManagedPtr :: Ptr a -> IO () -> IO (ManagedPtr a)
newManagedPtr ptr finalizer = do
- let ownedFinalizer :: IORef Bool -> IO ()
- ownedFinalizer boolRef = do
- owned <- readIORef boolRef
- when owned finalizer
- isOwnedRef <- newIORef True
- fPtr <- FC.newForeignPtr ptr (ownedFinalizer isOwnedRef)
+ let ownedFinalizer :: IORef (Maybe CallStack) -> IO ()
+ ownedFinalizer callStackRef = do
+ cs <- readIORef callStackRef
+ when (isNothing cs) finalizer
+ isDisownedRef <- newIORef Nothing
+ fPtr <- FC.newForeignPtr ptr (ownedFinalizer isDisownedRef)
return $ ManagedPtr {
managedForeignPtr = fPtr
- , managedPtrIsOwned = isOwnedRef
+ , managedPtrIsDisowned = isDisownedRef
}
foreign import ccall "dynamic"
@@ -87,18 +90,21 @@
-- | Thin wrapper over `Foreign.Concurrent.newForeignPtr_`.
newManagedPtr_ :: Ptr a -> IO (ManagedPtr a)
newManagedPtr_ ptr = do
- isOwnedRef <- newIORef True
+ isDisownedRef <- newIORef Nothing
fPtr <- newForeignPtr_ ptr
return $ ManagedPtr {
managedForeignPtr = fPtr
- , managedPtrIsOwned = isOwnedRef
+ , managedPtrIsDisowned = isDisownedRef
}
--- | Do not run the finalizers upon garbage collection of the `ManagedPtr`.
+-- | Do not run the finalizers upon garbage collection of the
+-- `ManagedPtr`, for the given reason. If later code tries to access
+-- the underlying pointer the given reason will be printed as part of
+-- the error message.
disownManagedPtr :: forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO
(Ptr a)
disownManagedPtr managed = do
ptr <- unsafeManagedPtrGetPtr managed
- writeIORef (managedPtrIsOwned c) False
+ writeIORef (managedPtrIsDisowned c) (Just callStack)
return ptr
where c = coerce managed :: ManagedPtr ()
@@ -115,11 +121,7 @@
-- `nullPtr` argument.
maybeWithManagedPtr :: (HasCallStack, ManagedPtrNewtype a) => Maybe a -> (Ptr
a -> IO c) -> IO c
maybeWithManagedPtr Nothing action = action nullPtr
-maybeWithManagedPtr (Just managed) action = do
- ptr <- unsafeManagedPtrGetPtr managed
- result <- action ptr
- touchManagedPtr managed
- return result
+maybeWithManagedPtr (Just managed) action = withManagedPtr managed action
-- | Perform an IO action taking a list of 'Ptr' on a list of managed
-- pointers.
@@ -130,6 +132,17 @@
mapM_ touchManagedPtr managedList
return result
+-- | Perform the IO action with a transient managed pointer. The
+-- managed pointer will be valid while calling the action, but will be
+-- disowned as soon as the action finished.
+withTransient :: (HasCallStack, ManagedPtrNewtype a)
+ => (ManagedPtr a -> a) -> Ptr a -> (a -> IO b) -> IO b
+withTransient constructor ptr action = do
+ managed <- constructor <$> newManagedPtr_ ptr
+ r <- action managed
+ _ <- disownManagedPtr managed
+ return r
+
-- | Return the 'Ptr' in a given managed pointer. As the name says,
-- this is potentially unsafe: the given 'Ptr' may only be used
-- /before/ a call to 'touchManagedPtr'. This function is of most
@@ -145,16 +158,19 @@
unsafeManagedPtrCastPtr m = do
let c = coerce m :: ManagedPtr ()
ptr = (castPtr . unsafeForeignPtrToPtr . managedForeignPtr) c
- owned <- readIORef (managedPtrIsOwned c)
- when (not owned) (notOwnedWarning ptr)
- return ptr
+ disowned <- readIORef (managedPtrIsDisowned c)
+ maybe (return ptr) (notOwnedWarning ptr) disowned
-- | Print a warning when we try to access a disowned foreign ptr.
-notOwnedWarning :: HasCallStack => Ptr a -> IO ()
-notOwnedWarning ptr = do
- hPutStrLn stderr ("Accessing a disowned pointer <" ++ show ptr
- ++ ">, this may lead to crashes.\n"
- ++ prettyCallStack callStack)
+notOwnedWarning :: HasCallStack => Ptr a -> CallStack -> IO (Ptr a)
+notOwnedWarning ptr cs = do
+ hPutStrLn stderr ("WARNING: Accessing a disowned pointer <" ++ show ptr
+ ++ ">, this may lead to crashes.\n\n"
+ ++ "• Callstack for the unsafe access to the pointer:\n"
+ ++ prettyCallStack callStack ++ "\n\n"
+ ++ "• The pointer was disowned at:\n"
+ ++ prettyCallStack cs ++ "\n")
+ return ptr
-- | Ensure that the 'Ptr' in the given managed pointer is still alive
-- (i.e. it has not been garbage collected by the runtime) at the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/haskell-gi-base-0.20.2/Data/GI/Base/Signals.hsc
new/haskell-gi-base-0.20.3/Data/GI/Base/Signals.hsc
--- old/haskell-gi-base-0.20.2/Data/GI/Base/Signals.hsc 2017-04-14
10:30:46.000000000 +0200
+++ new/haskell-gi-base-0.20.3/Data/GI/Base/Signals.hsc 2017-06-03
11:47:13.000000000 +0200
@@ -71,7 +71,11 @@
=> IsLabelProxy slot (SignalProxy object info) where
fromLabelProxy _ = SignalProxy
-#if MIN_VERSION_base(4,9,0)
+#if MIN_VERSION_base(4,10,0)
+instance info ~ ResolveSignal slot object =>
+ IsLabel slot (SignalProxy object info) where
+ fromLabel = SignalProxy
+#elif MIN_VERSION_base(4,9,0)
instance info ~ ResolveSignal slot object =>
IsLabel slot (SignalProxy object info) where
fromLabel _ = SignalProxy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/haskell-gi-base-0.20.2/haskell-gi-base.cabal
new/haskell-gi-base-0.20.3/haskell-gi-base.cabal
--- old/haskell-gi-base-0.20.2/haskell-gi-base.cabal 2017-04-14
10:30:46.000000000 +0200
+++ new/haskell-gi-base-0.20.3/haskell-gi-base.cabal 2017-06-03
11:47:13.000000000 +0200
@@ -1,5 +1,5 @@
name: haskell-gi-base
-version: 0.20.2
+version: 0.20.3
synopsis: Foundation for libraries generated by haskell-gi
description: Foundation for libraries generated by haskell-gi
homepage: https://github.com/haskell-gi/haskell-gi-base
@@ -59,5 +59,5 @@
build-tools: hsc2hs
cc-options: -fPIC
- extensions: CPP, ForeignFunctionInterface, DoAndIfThenElse
+ extensions: CPP, ForeignFunctionInterface, DoAndIfThenElse,
MonoLocalBinds
c-sources: c/hsgclosure.c