diff --git a/java-classfile.cabal b/java-classfile.cabal index 1b1f151..abee9b8 100644 --- a/java-classfile.cabal +++ b/java-classfile.cabal @@ -38,6 +38,7 @@ library Language.Java.Classfile.Flag Language.Java.Classfile.Flags Language.Java.Classfile.FromBigEndian + Language.Java.Classfile.Interfaces Language.Java.Classfile.Magic Language.Java.Classfile.Version other-modules: diff --git a/src/Language/Java/Classfile.hs b/src/Language/Java/Classfile.hs index f115291..00507bb 100644 --- a/src/Language/Java/Classfile.hs +++ b/src/Language/Java/Classfile.hs @@ -9,6 +9,7 @@ import Language.Java.Classfile.ConstantPool (ConstantPool) import Language.Java.Classfile.Flags (Flags) import Language.Java.Classfile.ClassFlag (ClassFlag) import Language.Java.Classfile.ConstantPool.References (ClassReference) +import Language.Java.Classfile.Interfaces (Interfaces) data Classfile = Classfile { magic :: Magic @@ -17,6 +18,7 @@ data Classfile = Classfile , accessFlags :: Flags ClassFlag , this :: ClassReference , super :: ClassReference + , interfaces :: Interfaces } deriving stock (Show, Generic) deriving Extractable via Generically Classfile diff --git a/src/Language/Java/Classfile/ConstantPool.hs b/src/Language/Java/Classfile/ConstantPool.hs index 006d492..946706a 100644 --- a/src/Language/Java/Classfile/ConstantPool.hs +++ b/src/Language/Java/Classfile/ConstantPool.hs @@ -1,11 +1,20 @@ {-# LANGUAGE DerivingStrategies #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE InstanceSigs #-} +{-# LANGUAGE TypeApplications #-} module Language.Java.Classfile.ConstantPool (ConstantPool(..)) where import Data.Word (Word16) -import Data.Array.IArray (Array) +import Data.Array.IArray (Array, listArray) import Language.Java.Classfile.ConstantPool.Entry (Entry) -import Language.Java.Classfile.Extractable (Extractable) +import Language.Java.Classfile.Extractable (Extractable (extract)) +import Language.Java.Classfile.Extract (Extract, traceIndex) +import Control.Monad (forM) newtype ConstantPool = ConstantPool (Array Word16 Entry) deriving stock (Show) - deriving newtype Extractable + +instance Extractable ConstantPool where + extract :: Extract ConstantPool + extract = do + count <- extract @Word16 + elements <- forM [1..fromIntegral count - 1] $ \ i -> traceIndex i extract + pure . ConstantPool $ listArray (1, count - 1) elements diff --git a/src/Language/Java/Classfile/Extractable.hs b/src/Language/Java/Classfile/Extractable.hs index e46f8ad..109e7d4 100644 --- a/src/Language/Java/Classfile/Extractable.hs +++ b/src/Language/Java/Classfile/Extractable.hs @@ -1,4 +1,5 @@ {-# LANGUAGE InstanceSigs #-} +{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UndecidableInstances #-} @@ -24,7 +25,7 @@ import GHC.Float (castWord32ToFloat, castWord64ToDouble) import qualified Data.Text as Text import GHC.TypeLits (symbolVal, KnownSymbol) import Data.Proxy (Proxy(Proxy)) -import Data.Typeable (Typeable) +import Data.Typeable (Typeable, typeRep) class Extractable a where extract :: Extract a @@ -61,12 +62,24 @@ instance Extractable Int64 where pure $ (fromIntegral high `shiftL` 32) .|. fromIntegral low -instance (Extractable index, Extractable element, Ix index, Integral index) => Extractable (Array index element) where +instance (Extractable index, Extractable element, Ix index, Integral index, Show index, Typeable element) => Extractable (Array index element) where extract :: Extract (Array index element) extract = do count <- extract - elements <- forM [1..fromIntegral count - 1] $ \ i -> traceIndex i extract - pure $ listArray (1, count - 1) elements + + let typeName = Text.concat + [ "Array (0, " + , Text.pack . show $ count + , ") " + , (Text.pack . show) (typeRep (Proxy :: Proxy element)) + ] + + if count == 0 + then pure $ listArray (1, 0) [] + else traceType typeName $ do + + elements <- forM [0..fromIntegral count] $ \ i -> traceIndex i extract + pure $ listArray (1, count) elements deriving via Generically () instance Extractable () deriving via Generically (a, b) instance (Extractable a, Extractable b) => Extractable (a, b) diff --git a/src/Language/Java/Classfile/Interfaces.hs b/src/Language/Java/Classfile/Interfaces.hs new file mode 100644 index 0000000..6c4f485 --- /dev/null +++ b/src/Language/Java/Classfile/Interfaces.hs @@ -0,0 +1,12 @@ +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DerivingVia #-} +module Language.Java.Classfile.Interfaces (Interfaces(..)) where +import Data.Array.IArray (Array) +import Data.Word (Word16) +import Language.Java.Classfile.ConstantPool.References (ClassReference) +import Language.Java.Classfile.Extractable (Extractable) +import GHC.Generics ( Generic, Generically, Generically(..) ) + +newtype Interfaces = Interfaces (Array Word16 ClassReference) + deriving stock (Show, Generic) + deriving Extractable via Generically Interfaces