feat: parse the entire classfile

This commit is contained in:
vegowotenks 2025-07-12 23:38:43 +02:00
parent f9fbedc87a
commit d692c3a6c0
5 changed files with 77 additions and 5 deletions

View file

@ -43,6 +43,7 @@ library
Language.Java.Classfile.FromBigEndian
Language.Java.Classfile.Interfaces
Language.Java.Classfile.Magic
Language.Java.Classfile.Methods
Language.Java.Classfile.Version
other-modules:
Paths_java_classfile

View file

@ -1,9 +1,11 @@
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DeriveGeneric #-}
module Language.Java.Classfile (Classfile(..)) where
import GHC.Generics (Generic, Generically(Generically))
import Language.Java.Classfile.Version (Version)
import Language.Java.Classfile.Magic (Magic)
import GHC.Generics (Generic, Generically(Generically))
import Language.Java.Classfile.Extractable (Extractable)
import Language.Java.Classfile.ConstantPool (ConstantPool)
import Language.Java.Classfile.Flags (Flags)
@ -11,6 +13,9 @@ import Language.Java.Classfile.ClassFlag (ClassFlag)
import Language.Java.Classfile.ConstantPool.References (ClassReference)
import Language.Java.Classfile.Interfaces (Interfaces)
import Language.Java.Classfile.Fields (Fields)
import Language.Java.Classfile.Methods (Methods)
import Language.Java.Classfile.Attributes (Attributes)
data Classfile = Classfile
{ magic :: Magic
@ -21,6 +26,8 @@ data Classfile = Classfile
, super :: ClassReference
, interfaces :: Interfaces
, fields :: Fields
, methods :: Methods
, attributes :: Attributes
}
deriving stock (Show, Generic)
deriving Extractable via Generically Classfile

View file

@ -8,7 +8,6 @@ import Data.Array.IArray (Array, listArray)
import Language.Java.Classfile.ConstantPool.Entry (Entry, StorageCount (..), storageCount)
import Language.Java.Classfile.Extractable (Extractable (extract))
import Language.Java.Classfile.Extract (Extract, traceIndex, traceType)
import Control.Monad (forM)
import qualified Data.Text as Text
newtype ConstantPool = ConstantPool (Array Word16 Entry)

View file

@ -10,7 +10,7 @@ module Language.Java.Classfile.ConstantPool.Entry (Entry(..), StorageCount(..),
import GHC.Generics (Generic, Generically(..))
import Language.Java.Classfile.Extractable (Extractable (extract))
import Language.Java.Classfile.Extractable.WithTag (Word8Tag)
import Language.Java.Classfile.ConstantPool.References (Utf8Reference, ClassReference, NameAndTypeReference, MethodHandleReferenceKind, OpaqueReference, BootstrapMethodIndex)
import Language.Java.Classfile.ConstantPool.References (ClassReference, NameAndTypeReference, MethodHandleReferenceKind, OpaqueReference, BootstrapMethodIndex, Utf8Reference)
import Data.Int (Int32, Int64)
import Data.Word (Word16)
import Data.Text (Text)
@ -63,5 +63,3 @@ storageCount :: Entry -> StorageCount
storageCount = \case
(Double _ ; Long _) -> Twice
_ -> Once

View file

@ -0,0 +1,67 @@
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeFamilies #-}
module Language.Java.Classfile.Methods (Methods(..), Method(..), MethodFlag(..)) where
import Data.Array.IArray (Array)
import Data.Word (Word16)
import Language.Java.Classfile.Flags (Flags)
import Language.Java.Classfile.Extractable (Extractable)
import Language.Java.Classfile.Flag (FlagMask (..))
import GHC.Generics ( Generically, Generic, Generically(..) )
import Language.Java.Classfile.ConstantPool.References (Utf8Reference)
import Language.Java.Classfile.Attributes (Attributes)
-- | Alias for the methods structure from the constant-pool.
newtype Methods = Methods (Array Word16 Method)
deriving stock (Show)
deriving newtype Extractable
-- | A single method record, contains attributes, name and access flags.
data Method = Method
{ flags :: Flags MethodFlag
, name :: Utf8Reference
, descriptor :: Utf8Reference
, attributes :: Attributes
}
deriving stock (Show, Generic)
deriving Extractable via Generically Method
-- | Flags for the method, such as abstract, public or static.
data MethodFlag
= Public
| Private
| Protected
| Static
| Final
| Synchronized
| Bridge
| Varargs
| Native
| Abstract
| Strict
| Synthetic
deriving stock (Show, Eq, Ord, Enum, Bounded)
instance FlagMask MethodFlag where
type FlagType MethodFlag = Word16
maskOf :: MethodFlag -> FlagType MethodFlag
maskOf = \case
Public -> 0x0001
Private -> 0x0002
Protected -> 0x0004
Static -> 0x0008
Final -> 0x0010
Synchronized -> 0x0020
Bridge -> 0x0040
Varargs -> 0x0080
Native -> 0x0100
Abstract -> 0x0400
Strict -> 0x0800
Synthetic -> 0x1000