feat: interface list
This commit is contained in:
parent
10ca143163
commit
62b537a93f
5 changed files with 45 additions and 8 deletions
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
12
src/Language/Java/Classfile/Interfaces.hs
Normal file
12
src/Language/Java/Classfile/Interfaces.hs
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue