Skip to content

Commit

Permalink
Resolve #907 - Handle arrays & generics properly
Browse files Browse the repository at this point in the history
  • Loading branch information
rahulmutt committed Jan 15, 2019
1 parent 36f6201 commit cd48bf7
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 2 deletions.
15 changes: 13 additions & 2 deletions compiler/Eta/DeSugar/DsForeign.hs
Original file line number Diff line number Diff line change
Expand Up @@ -858,14 +858,25 @@ genMethodParam argType argFt
| isObjectFt argFt = ReferenceParameter $ genClassMethodParam argType argFt
| otherwise = PrimitiveParameter $ baseType argFt

fieldTypeToParam :: FieldType -> [TypeParameter TypeVariable] -> ReferenceParameter TypeVariable
fieldTypeToParam ft params = case ft of
ObjectType c -> GenericReferenceParameter c params []
ArrayType ft' -> ArrayReferenceParameter (go ft')
_ -> panic "fieldTypeToParam: Not object type"
where go ft = case ft of
ObjectType c -> ReferenceParameter $ GenericReferenceParameter c [] []
ArrayType ft' -> ReferenceParameter $ ArrayReferenceParameter (go ft')
_ -> PrimitiveParameter $ baseType ft

genClassMethodParam :: Type -> FieldType -> ReferenceParameter TypeVariable
genClassMethodParam argType argFt
| Just tyVar <- getTyVar_maybe argType
= VariableReferenceParameter $ sigTyVarText tyVar
| Just (_, tyArgs) <- splitTyConApp_maybe argType
, isObjectFt argFt
= GenericReferenceParameter (IClassName (getFtClass argFt)) (map genTypeParam tyArgs) []
| otherwise = pprPanic "genClassMethodParam: Not a valid argument." (ppr argType <+> ppr (show argFt))
= fieldTypeToParam argFt (map genTypeParam tyArgs)
| otherwise = pprPanic "genClassMethodParam: Not a valid argument."
(ppr argType <+> ppr (show argFt))

getArgFt :: ExtendsInfo -> Type -> FieldType
getArgFt extendsInfo ty
Expand Down
6 changes: 6 additions & 0 deletions tests/suite/ffi/run/genArrayExport/Main.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{-# LANGUAGE ForeignFunctionInterface #-}

foreign import java unsafe "@static Utils.test" test :: IO ()

main :: IO ()
main = test
13 changes: 13 additions & 0 deletions tests/suite/ffi/run/genArrayExport/Utils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import test.Hello;
import java.util.Arrays;
import java.util.List;
import java.util.LinkedList;

public class Utils {
public static void test() {
Hello h = new Hello();
List<Integer> l = new LinkedList<Integer>();
l.add(1); l.add(2); l.add(3);
System.out.println(Arrays.toString(h.hello(l)));
}
}
16 changes: 16 additions & 0 deletions tests/suite/ffi/run/genArrayExport/export/Export.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{-# LANGUAGE ForeignFunctionInterface #-}
module Export where

import Java

data Hello = Hello @test.Hello
deriving Class

foreign export java "hello" hello :: List JInteger -> Java Hello JByteArray

hello :: List JInteger -> Java Hello JByteArray
hello list = do
let bytes = map fromJava (fromJava list :: [JInteger]) :: [Byte]
arr <- anew (length bytes)
arr <.> mapM_ (uncurry aset) (zip [0..] bytes)
return arr
8 changes: 8 additions & 0 deletions tests/suite/ffi/run/genArrayExport/export/export.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
name: export
version: 1.0
build-type: Simple
cabal-version: >= 1.2

library
build-depends: base
exposed-modules: Export
9 changes: 9 additions & 0 deletions tests/suite/ffi/run/genArrayExport/genArrayExport.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name: genArrayExport
version: 1.0
build-type: Simple
cabal-version: >= 1.2

executable genArrayExport
main-is: Main.hs
build-depends: base, export
java-sources: Utils.java
1 change: 1 addition & 0 deletions tests/suite/ffi/run/genArrayExport/genArrayExport.stdout
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[1, 2, 3]

0 comments on commit cd48bf7

Please sign in to comment.