Boxed foreign prim
Joachim Breitner
mail at joachim-breitner.de
Fri Mar 9 08:04:57 CET 2012
Hi,
Am Donnerstag, den 08.03.2012, 23:12 -0500 schrieb Edward Kmett:
> But I can only pass unboxed types to foreign prim.
>
> Is this an intrinsic limitation or just an artifact of the use cases
> that have presented themselves to date?
funny, I just stumbled over this two days ago as well. In my case, I’m
trying to investigate the actual data on the heap, so I am also trying
to pass arbitrary values to a foreign prim function, which then receive
the pointer to the heap object as the argument. Since real primops (e.g.
unpackClosure#) can take arbitrary values, I figured that this is an
artifact, as you say.
I made this change to enable this feature:
diff --git a/compiler/typecheck/TcType.lhs b/compiler/typecheck/TcType.lhs
index 669545a..83a59bd 100644
--- a/compiler/typecheck/TcType.lhs
+++ b/compiler/typecheck/TcType.lhs
@@ -1166,7 +1166,7 @@ isOverloadedTy _ = False
\begin{code}
isFloatTy, isDoubleTy, isIntegerTy, isIntTy, isWordTy, isBoolTy,
- isUnitTy, isCharTy :: Type -> Bool
+ isUnitTy, isCharTy, isAnyTy :: Type -> Bool
isFloatTy = is_tc floatTyConKey
isDoubleTy = is_tc doubleTyConKey
isIntegerTy = is_tc integerTyConKey
@@ -1175,6 +1175,7 @@ isWordTy = is_tc wordTyConKey
isBoolTy = is_tc boolTyConKey
isUnitTy = is_tc unitTyConKey
isCharTy = is_tc charTyConKey
+isAnyTy = is_tc anyTyConKey
isStringTy :: Type -> Bool
isStringTy ty
@@ -1344,7 +1345,7 @@ isFFIPrimArgumentTy :: DynFlags -> Type -> Bool
-- Checks for valid argument type for a 'foreign import prim'
-- Currently they must all be simple unlifted types.
isFFIPrimArgumentTy dflags ty
- = checkRepTyCon (legalFIPrimArgTyCon dflags) ty
+ = isAnyTy ty || checkRepTyCon (legalFIPrimArgTyCon dflags) ty
isFFIPrimResultTy :: DynFlags -> Type -> Bool
-- Checks for valid result type for a 'foreign import prim'
Initially, I had isFFIPrimArgumentTy modfified to really accept "a ->",
but I found it cleaner to just accept the Any type, to make it more
obvious that, morally speaking, not the value is passed to the function,
but a pointer to Any thing. In the Haskell code, I’m unsafeCoerce#’ing
the a to Any. Seems to work smoothly.
Greetings,
Joachim
--
Joachim "nomeata" Breitner
mail at joachim-breitner.de | nomeata at debian.org | GPG: 0x4743206C
xmpp: nomeata at joachim-breitner.de | http://www.joachim-breitner.de/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20120309/1b16b254/attachment.pgp>
More information about the Glasgow-haskell-users
mailing list