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.Flags
Language.Java.Classfile.FromBigEndian
Language.Java.Classfile.Interfaces
Language.Java.Classfile.Magic
Language.Java.Classfile.Version
other-modules:

View file

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

View file

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

View file

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

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