From 580e56ebbb402eaa1643d6c567ee983263638428 Mon Sep 17 00:00:00 2001 From: mrab Date: Sat, 4 May 2024 11:39:44 +0200 Subject: [PATCH] Class file data structure --- .gitignore | 8 ++++++- questions.md | 2 ++ src/ClassFile.hs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 questions.md create mode 100644 src/ClassFile.hs diff --git a/.gitignore b/.gitignore index db30022..d20ba06 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,12 @@ cabal-dev *.chs.h *.dyn_o *.dyn_hi +*.java +*.class +*.local~* +src/Parser/JavaParser.hs +src/Parser/Parser.hs +src/Parser/Lexer.hs .hpc .hsenv .cabal-sandbox/ @@ -20,4 +26,4 @@ cabal.sandbox.config cabal.project.local cabal.project.local~ .HTF/ -.ghc.environment.* \ No newline at end of file +.ghc.environment.* diff --git a/questions.md b/questions.md new file mode 100644 index 0000000..9fc4601 --- /dev/null +++ b/questions.md @@ -0,0 +1,2 @@ +# Questions +- Enum? \ No newline at end of file diff --git a/src/ClassFile.hs b/src/ClassFile.hs new file mode 100644 index 0000000..d5322a1 --- /dev/null +++ b/src/ClassFile.hs @@ -0,0 +1,62 @@ +{- + ClassFile { + u4 magic; + u2 minor_version; + u2 major_version; + u2 constant_pool_count; + cp_info constant_pool[constant_pool_count-1]; + u2 access_flags; + u2 this_class; + u2 super_class; + u2 interfaces_count; + u2 interfaces[interfaces_count]; + u2 fields_count; + field_info fields[fields_count]; + u2 methods_count; + method_info methods[methods_count]; + u2 attributes_count; + attribute_info attributes[attributes_count]; + } + + method_info { + u2 access_flags; + u2 name_index; + u2 descriptor_index; + u2 attributes_count; + attribute_info attributes[attributes_count]; +} +-} + + +import Data.Word +import Data.Int + +data ConstantInfo = ClassInfo Word16 + | FieldRefInfo Word16 Word16 + | MethodRefInfo Word16 Word16 + | IntegerInfo Int32 + | Utf8Info [Char] + deriving Show + +data Attribute = Attribute Word16 [Word8] deriving Show + +data MemberInfo = MemberInfo { + memberAccessFlags :: Word16, + memberNameIndex :: Word16, + memberDescriptorIndex :: Word16, + memberAttributes :: [Attribute] +} deriving Show + +data ClassFile = ClassFile { + magic :: Word32, + minorVersion :: Word16, + majorVersion :: Word16, + constantPool :: [ConstantInfo], + accessFlags :: Word16, + thisClass :: Word16, + superClass :: Word16, + interfaces :: [Word16], + fields :: [MemberInfo], + methods :: [MemberInfo], + attributes :: [Attribute] +} deriving Show \ No newline at end of file