feat: interface list

This commit is contained in:
vegowotenks 2025-07-12 18:24:18 +02:00
parent 10ca143163
commit 62b537a93f
5 changed files with 45 additions and 8 deletions

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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)

View 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