feat: parse the entire classfile
This commit is contained in:
parent
f9fbedc87a
commit
d692c3a6c0
5 changed files with 77 additions and 5 deletions
|
@ -43,6 +43,7 @@ library
|
||||||
Language.Java.Classfile.FromBigEndian
|
Language.Java.Classfile.FromBigEndian
|
||||||
Language.Java.Classfile.Interfaces
|
Language.Java.Classfile.Interfaces
|
||||||
Language.Java.Classfile.Magic
|
Language.Java.Classfile.Magic
|
||||||
|
Language.Java.Classfile.Methods
|
||||||
Language.Java.Classfile.Version
|
Language.Java.Classfile.Version
|
||||||
other-modules:
|
other-modules:
|
||||||
Paths_java_classfile
|
Paths_java_classfile
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
{-# LANGUAGE DerivingVia #-}
|
{-# LANGUAGE DerivingVia #-}
|
||||||
{-# LANGUAGE DeriveGeneric #-}
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
module Language.Java.Classfile (Classfile(..)) where
|
module Language.Java.Classfile (Classfile(..)) where
|
||||||
|
|
||||||
|
import GHC.Generics (Generic, Generically(Generically))
|
||||||
|
|
||||||
import Language.Java.Classfile.Version (Version)
|
import Language.Java.Classfile.Version (Version)
|
||||||
import Language.Java.Classfile.Magic (Magic)
|
import Language.Java.Classfile.Magic (Magic)
|
||||||
import GHC.Generics (Generic, Generically(Generically))
|
|
||||||
import Language.Java.Classfile.Extractable (Extractable)
|
import Language.Java.Classfile.Extractable (Extractable)
|
||||||
import Language.Java.Classfile.ConstantPool (ConstantPool)
|
import Language.Java.Classfile.ConstantPool (ConstantPool)
|
||||||
import Language.Java.Classfile.Flags (Flags)
|
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.ConstantPool.References (ClassReference)
|
||||||
import Language.Java.Classfile.Interfaces (Interfaces)
|
import Language.Java.Classfile.Interfaces (Interfaces)
|
||||||
import Language.Java.Classfile.Fields (Fields)
|
import Language.Java.Classfile.Fields (Fields)
|
||||||
|
import Language.Java.Classfile.Methods (Methods)
|
||||||
|
import Language.Java.Classfile.Attributes (Attributes)
|
||||||
|
|
||||||
|
|
||||||
data Classfile = Classfile
|
data Classfile = Classfile
|
||||||
{ magic :: Magic
|
{ magic :: Magic
|
||||||
|
@ -21,6 +26,8 @@ data Classfile = Classfile
|
||||||
, super :: ClassReference
|
, super :: ClassReference
|
||||||
, interfaces :: Interfaces
|
, interfaces :: Interfaces
|
||||||
, fields :: Fields
|
, fields :: Fields
|
||||||
|
, methods :: Methods
|
||||||
|
, attributes :: Attributes
|
||||||
}
|
}
|
||||||
deriving stock (Show, Generic)
|
deriving stock (Show, Generic)
|
||||||
deriving Extractable via Generically Classfile
|
deriving Extractable via Generically Classfile
|
||||||
|
|
|
@ -8,7 +8,6 @@ import Data.Array.IArray (Array, listArray)
|
||||||
import Language.Java.Classfile.ConstantPool.Entry (Entry, StorageCount (..), storageCount)
|
import Language.Java.Classfile.ConstantPool.Entry (Entry, StorageCount (..), storageCount)
|
||||||
import Language.Java.Classfile.Extractable (Extractable (extract))
|
import Language.Java.Classfile.Extractable (Extractable (extract))
|
||||||
import Language.Java.Classfile.Extract (Extract, traceIndex, traceType)
|
import Language.Java.Classfile.Extract (Extract, traceIndex, traceType)
|
||||||
import Control.Monad (forM)
|
|
||||||
import qualified Data.Text as Text
|
import qualified Data.Text as Text
|
||||||
|
|
||||||
newtype ConstantPool = ConstantPool (Array Word16 Entry)
|
newtype ConstantPool = ConstantPool (Array Word16 Entry)
|
||||||
|
|
|
@ -10,7 +10,7 @@ module Language.Java.Classfile.ConstantPool.Entry (Entry(..), StorageCount(..),
|
||||||
import GHC.Generics (Generic, Generically(..))
|
import GHC.Generics (Generic, Generically(..))
|
||||||
import Language.Java.Classfile.Extractable (Extractable (extract))
|
import Language.Java.Classfile.Extractable (Extractable (extract))
|
||||||
import Language.Java.Classfile.Extractable.WithTag (Word8Tag)
|
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.Int (Int32, Int64)
|
||||||
import Data.Word (Word16)
|
import Data.Word (Word16)
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
|
@ -63,5 +63,3 @@ storageCount :: Entry -> StorageCount
|
||||||
storageCount = \case
|
storageCount = \case
|
||||||
(Double _ ; Long _) -> Twice
|
(Double _ ; Long _) -> Twice
|
||||||
_ -> Once
|
_ -> Once
|
||||||
|
|
||||||
|
|
||||||
|
|
67
src/Language/Java/Classfile/Methods.hs
Normal file
67
src/Language/Java/Classfile/Methods.hs
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue