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.Flag
|
||||||
Language.Java.Classfile.Flags
|
Language.Java.Classfile.Flags
|
||||||
Language.Java.Classfile.FromBigEndian
|
Language.Java.Classfile.FromBigEndian
|
||||||
|
Language.Java.Classfile.Interfaces
|
||||||
Language.Java.Classfile.Magic
|
Language.Java.Classfile.Magic
|
||||||
Language.Java.Classfile.Version
|
Language.Java.Classfile.Version
|
||||||
other-modules:
|
other-modules:
|
||||||
|
|
|
@ -9,6 +9,7 @@ import Language.Java.Classfile.ConstantPool (ConstantPool)
|
||||||
import Language.Java.Classfile.Flags (Flags)
|
import Language.Java.Classfile.Flags (Flags)
|
||||||
import Language.Java.Classfile.ClassFlag (ClassFlag)
|
import Language.Java.Classfile.ClassFlag (ClassFlag)
|
||||||
import Language.Java.Classfile.ConstantPool.References (ClassReference)
|
import Language.Java.Classfile.ConstantPool.References (ClassReference)
|
||||||
|
import Language.Java.Classfile.Interfaces (Interfaces)
|
||||||
|
|
||||||
data Classfile = Classfile
|
data Classfile = Classfile
|
||||||
{ magic :: Magic
|
{ magic :: Magic
|
||||||
|
@ -17,6 +18,7 @@ data Classfile = Classfile
|
||||||
, accessFlags :: Flags ClassFlag
|
, accessFlags :: Flags ClassFlag
|
||||||
, this :: ClassReference
|
, this :: ClassReference
|
||||||
, super :: ClassReference
|
, super :: ClassReference
|
||||||
|
, interfaces :: Interfaces
|
||||||
}
|
}
|
||||||
deriving stock (Show, Generic)
|
deriving stock (Show, Generic)
|
||||||
deriving Extractable via Generically Classfile
|
deriving Extractable via Generically Classfile
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
{-# LANGUAGE DerivingStrategies #-}
|
{-# LANGUAGE DerivingStrategies #-}
|
||||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
{-# LANGUAGE InstanceSigs #-}
|
||||||
|
{-# LANGUAGE TypeApplications #-}
|
||||||
module Language.Java.Classfile.ConstantPool (ConstantPool(..)) where
|
module Language.Java.Classfile.ConstantPool (ConstantPool(..)) where
|
||||||
import Data.Word (Word16)
|
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.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)
|
newtype ConstantPool = ConstantPool (Array Word16 Entry)
|
||||||
deriving stock (Show)
|
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 InstanceSigs #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE TypeOperators #-}
|
{-# LANGUAGE TypeOperators #-}
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE UndecidableInstances #-}
|
{-# LANGUAGE UndecidableInstances #-}
|
||||||
|
@ -24,7 +25,7 @@ import GHC.Float (castWord32ToFloat, castWord64ToDouble)
|
||||||
import qualified Data.Text as Text
|
import qualified Data.Text as Text
|
||||||
import GHC.TypeLits (symbolVal, KnownSymbol)
|
import GHC.TypeLits (symbolVal, KnownSymbol)
|
||||||
import Data.Proxy (Proxy(Proxy))
|
import Data.Proxy (Proxy(Proxy))
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable (Typeable, typeRep)
|
||||||
|
|
||||||
class Extractable a where
|
class Extractable a where
|
||||||
extract :: Extract a
|
extract :: Extract a
|
||||||
|
@ -61,12 +62,24 @@ instance Extractable Int64 where
|
||||||
|
|
||||||
pure $ (fromIntegral high `shiftL` 32) .|. fromIntegral low
|
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 :: Extract (Array index element)
|
||||||
extract = do
|
extract = do
|
||||||
count <- extract
|
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 () instance Extractable ()
|
||||||
deriving via Generically (a, b) instance (Extractable a, Extractable b) => Extractable (a, b)
|
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