Skip to content

Commit

Permalink
fix adt match calling in the wrong order
Browse files Browse the repository at this point in the history
  • Loading branch information
bristermitten committed May 10, 2024
1 parent c3d9a16 commit a396b22
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/Elara/Emit/ADT.hs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ import Elara.Data.Unique (makeUnique)
import Elara.Emit.Lambda (lambdaTypeName)
import Elara.Emit.Method (createMethodWithCodeBuilder)
import Elara.Emit.Monad (InnerEmit, addClass, addInnerClass)
import Elara.Emit.Params (GenParams)
import Elara.Emit.State (MethodCreationState (maxLocalVariables), findLocalVariable)
import Elara.Emit.Utils (createQualifiedClassName, createQualifiedInnerClassName, generateFieldType)
import Elara.Parse.Type (functionType)
Expand All @@ -77,8 +78,9 @@ import JVM.Data.Abstract.Descriptor
import JVM.Data.Abstract.Instruction
import JVM.Data.Abstract.Type
import Polysemy
import Polysemy.Reader (Reader)

generateADTClasses :: InnerEmit r => CoreTypeDecl -> Sem r ()
generateADTClasses :: (InnerEmit r, Member (Reader GenParams) r) => CoreTypeDecl -> Sem r ()
generateADTClasses (CoreTypeDecl _ _ _ (CoreTypeAlias _)) = pass -- nothing to generate for type aliases
generateADTClasses (CoreTypeDecl name kind tvs (CoreDataDecl ctors)) = do
let typeClassName = createQualifiedClassName name
Expand Down Expand Up @@ -154,7 +156,7 @@ generateADTClasses (CoreTypeDecl name kind tvs (CoreDataDecl ctors)) = do
-- generate the match impl
createMethodWithCodeBuilder thisName matchSig [MPublic] "match" $ do
emit $ ALoad i
for_ (zip fields [0 ..]) $ \(field, i) -> do
for_ (reverse $ zip fields [0 ..]) $ \(field, i) -> do
emit $ ALoad 0
emit $ GetField (ClassInfoType thisName) ("field" <> show i) (generateFieldType field)
-- call the corresponding lambda param
Expand All @@ -163,6 +165,6 @@ generateADTClasses (CoreTypeDecl name kind tvs (CoreDataDecl ctors)) = do
(ClassInfoType $ lambdaTypeName $ length fields)
"run"
( MethodDescriptor
(generateFieldType <$> fields)
(ObjectFieldType "java/lang/Object" <$ fields)
(TypeReturn $ ObjectFieldType "java/lang/Object")
)

0 comments on commit a396b22

Please sign in to comment.