Commit cbb4090f authored by Tobias Hombücher's avatar Tobias Hombücher
Browse files

WIP: adds updates to processing of double conditionals, updates...

WIP: adds updates to processing of double conditionals, updates concrete/generic interpreters, fixes bugs in preprocessing
parent 8842b978
Pipeline #150697 failed with stages
in 69 minutes and 20 seconds
File mode changed from 100755 to 100644
......@@ -375,12 +375,12 @@ Reference : Array_ref {$1}
Array_ref : identifier Fixed_array_descriptor {Gen.ArrayRef (pack $1) $2}
| quoted_name Fixed_array_descriptor {Gen.ArrayRef (pack $1) $2}
Field_ref : Local_name dot Field_signature {Gen.FieldRef $1 (fst $3) (snd $3)}
| Field_signature {Gen.SignatureRef (fst $1) (snd $1)}
Field_ref : Local_name dot Field_signature {Gen.FieldRef $1 (fst $ snd $3) (snd $ snd $3)}
| Field_signature {Gen.SignatureRef (fst $1) (fst $ snd $1) (snd $ snd $1)}
-- not sure here, i think the name of the field is more relevant
-- then the type. However, maybe the type will be needed as well at some point
Field_signature : cmplt Class_name colon Type Name cmpgt {($4,$5)}
Field_signature : cmplt Class_name colon Type Name cmpgt {($2,($4,$5))}
Fixed_array_descriptor : l_bracket Immediate r_bracket {$2}
......
This diff is collapsed.
......@@ -36,6 +36,7 @@ import Control.Arrow.Store (ArrowStore,write,read')
import qualified Control.Arrow.Store as Store
import GHC.Exts
import Text.Printf
import qualified Data.Text as Text
data Frame val =
Frame
......@@ -68,43 +69,86 @@ type ArrowInterp addr val err c =
, Show val
)
initStaticClass :: ArrowInterp addr val err c => StmtInterpreter val c -> c ClassId ()
initStaticClass run' = proc klass -> do
b <- checkStaticInit -< klass
if b
then returnA -< ()
else do
-- what happens if this method does not exist?
let clinit = methodSignature Void (Text.pack "<clinit>") []
_ <- registerStatics -< klass
_ <- evalInvoke run' -< InvokeStatic klass clinit []
returnA -< ()
eval :: ArrowInterp addr val err c => StmtInterpreter val c -> c Expr val
eval run' = proc expr -> case expr of
New typ -> new -< typ
NewArray typ e -> do
len <- evalImmediate -< e
len <- evalImmediate run' -< e
newArray -< (typ,[len])
NewMultiArray typ es -> do
lens <- map evalImmediate -< catMaybes es
lens <- map (evalImmediate run') -< catMaybes es
newArray -< (typ,lens)
Cast typ e -> do
val <- evalImmediate -< e
val <- evalImmediate run' -< e
cast -< (typ,val)
InstanceOf e typ -> do
val <- evalImmediate -< e
val <- evalImmediate run' -< e
instanceOf -< (val,typ)
InvokeExpr method ->
evalInvoke run' -< method
Ref ref -> do
addr <- lookup' -< ReferenceVar ref
addr_ <- deRef -< addr
val <- read' -< addr_
returnA -< val
Ref ref -> case ref of
SignatureRef klass t name -> do
_ <- initStaticClass run' -< klass
val <- lookupStaticStore -< (klass, name)
returnA -< val
_ -> do
addr <- lookup' -< ReferenceVar ref
addr_ <- deRef -< addr
val <- read' -< addr_
case ref of
ArrayRef _ imm -> do
idx <- evalImmediate run' -< imm
getArrAtIdx -< (val, idx)
FieldRef _ _ field -> do
getField -< (val, field)
_ -> returnA -< val
Binop e1 op e2 -> do
v1 <- evalImmediate -< e1
v2 <- evalImmediate -< e2
v1 <- evalImmediate run' -< e1
v2 <- evalImmediate run' -< e2
binop -< (op,v1,v2)
Unop op e -> do
v <- evalImmediate -< e
v <- evalImmediate run' -< e
unop -< (op,v)
Immediate e -> evalImmediate -< e
Immediate e -> evalImmediate run' -< e
{-# INLINE eval #-}
evalImmediate :: ArrowInterp addr val err c => c Immediate val
evalImmediate = proc i -> case i of
evalImmediate :: ArrowInterp addr val err c => StmtInterpreter val c -> c Immediate val
evalImmediate run' = proc i -> case i of
Local name -> lookup' -< LocalVar name
StringConstant str -> do
-- fail -< fromString $ show str
-- first check whether string constant already exists
-- if it exists return ???
-- else allocate default string instance in store and return ???
v <- allocStringConst -< str
returnA -< v
-- let tmpVar = LocalVar "tmp"
-- refCharArr <- strToCharArr -< str
-- extend run' -< (tmpVar, val, rest)
-- run' -< Assign tmpVar refCharArr
-- let klass = classId [] (Text.pack "java.lang.String")
-- let meth = methodSignature Void (Text.pack "<init>") [Array Char]
-- let var = LocalVar str
-- run' -< Assign var (New $ Object klass)
-- _ <- evalInvoke run' -< InvokeSpecial var klass meth [Local "tmp"]
-- fail -< fromString "test"
_ -> constant -< i
{-# INLINE evalImmediate #-}
......@@ -121,12 +165,14 @@ evalInvoke run' = proc e -> case e of
receiver <- lookup' -< obj
invoke -< (receiver,klass,methodSig,args)
InvokeStatic klass methodSig args -> do
receiver <- lookup' -< StaticInstance klass
invoke -< (receiver,klass,methodSig,args)
-- there exists no receiver ('this') in static methods
classObj <- lookup' -< StaticInstance klass
invoke -< (classObj,klass,methodSig,args)
-- InvokeDynamic {} -> fail -< "We currently do not support dynamic method lookup"
where
invoke = proc (receiver,klass,methodSig,args) -> do
argVals <- map evalImmediate -< args
-- _ <- registerStaticClass run' -< klass
argVals <- map (evalImmediate run') -< args
lookupMethod (proc (receiver,body,decls,argVals) -> do
let frame = Frame { this = receiver
, params = Vec.fromList argVals
......@@ -152,18 +198,21 @@ run = fix $ \run' -> proc stmts_ -> do
EnterMonitor {} -> fail -< "JVM monitor statements are not supported"
ExitMonitor {} -> fail -< "JVM monitor statements are not supported"
Switch key cases def -> do
val <- evalImmediate -< key
val <- evalImmediate run' -< key
switch run' -< (val,cases,def,rest)
LoopLeaveTrue cond body -> do
v1 <- eval run' -< cond
-- fail -< fromString $ "bodý: " ++ show body ++ "rest: " ++ show rest
loopLeaveTrue run' -< (v1, body, rest, stmt)
-- loopLeaveTrue run' -< (v1, body, rest, stmt)
if_ run' run' -< (v1, (rest, body ++ [stmt] ++ rest))
-- currently this is assumed to be do .. while
-- this means that we need to perform at least one iteration
-- before leaving the loop
-- I'm not sure if this is the case for all LoopLeaveFalse stmts
LoopLeaveFalse cond body -> do
run' -< body ++ [LoopLeaveFalseHelp cond body] ++ rest -- not sure if this is correct
v1 <- eval run' -< cond
if_ run' run' -< (v1, (body ++ [stmt] ++ rest, rest))
-- run' -< body ++ [LoopLeaveFalseHelp cond body] ++ rest -- not sure if this is correct
LoopLeaveFalseHelp cond body -> do
v1 <- eval run' -< cond
loopLeaveFalse run' -< (v1, body, rest, stmt)
......@@ -174,11 +223,33 @@ run = fix $ \run' -> proc stmts_ -> do
Assign var e -> do
val <- eval run' -< e
case var of
ReferenceVar (FieldRef var1 _ _) -> do
ReferenceVar (FieldRef var1 _ field) -> do
addr <- lookup' -< LocalVar var1
addr_ <- deRef -< addr
obj <- Store.read' -< addr_
obj_ <- updateField -< (obj, field, val)
write -< (addr_, obj_)
run' -< rest
ReferenceVar (ArrayRef var1 imm) -> do
addr <- lookup' -< LocalVar var1
addr_ <- deRef -< addr
write -< (addr_, val)
arrOld <- read' -< addr_
arrType <- getArrType -< arrOld
idx <- evalImmediate run' -< imm
val_ <- cast -< (arrType,val)
arrNew <- updateArr -< (arrOld, val_, idx)
write -< (addr_, arrNew)
run' -< rest
ReferenceVar (SignatureRef klass t var) -> do
-- OPTIMIZE HERE
-- fail -< fromString $ "here?"
-- classObj <- lookup' -< StaticInstance klass
-- _ <- registerStaticClass run' -< classObj
nullVal <- assignStatic -< (var, val)
run' -< rest
-- fail -< "not yet supported"
LocalVar _ -> extend run' -< (var, val, rest)
_ -> fail -< "not yet supported"
If cond then_stmts else_stmts -> do
......@@ -187,13 +258,20 @@ run = fix $ \run' -> proc stmts_ -> do
Nop -> run' -< rest
Ret maybeImm -> fail -< "not yet supported"
Return ret -> case ret of Nothing -> void -< ()
Just e -> evalImmediate -< e
Just e -> evalImmediate run' -< e
Throw e -> fail -< "not yet supported"--throw <<< evalImmediate -< e
InvokeStmt invoke -> do
-- registerStaticClass?
evalInvoke run' -< invoke
run' -< rest
Goto _ -> run' -< rest
Label _ -> run' -< rest
Goto_ target -> do
let rest_ = dropWhile (/= Target_ target) rest
if null rest_
then fail -< fromString $ "Couldn't find target label: " ++ show target
else run' -< rest_
Target_ _ -> run' -< rest
[] -> failString -< printf "PC out of range: #instr=%d" (Vec.length (stmts frame))
{-# INLINE run #-}
......@@ -209,7 +287,7 @@ class IsVal v c | c -> v where
-- loopLeaveFalse :: JoinVal z c => c x z -> c y z -> c (v, x, y) z
loopLeaveTrue :: JoinVal z c => c [Statement] z -> c (v, [Statement], [Statement], Statement) z
-- lookupswitch :: JoinVal y c => c x y -> c (v, IntMap Label, Label) y
lookupMethod :: JoinVal y c => c (v,Vector Statement, HashMap Text v ,x) y -> c (v,ClassId,MethodSignature,x) y
lookupMethod :: JoinVal y c => c (v,Vector Statement, HashMap Text v ,[v]) y -> c (v,ClassId,MethodSignature,[v]) y
matchException :: JoinVal y c => c (v,CatchClause) y -> c (v,PC,HashMap ClassId CatchClause) y
new :: c Type v
deRef :: c v Int
......@@ -228,8 +306,17 @@ class IsVal v c | c -> v where
unop :: c (Unop, v) v
cast :: c (Type,v) v
instanceOf :: c (v,Type) v
updateArr :: c (v, v, v) v
getArrAtIdx :: c (v,v) v
assignStatic :: c (Text,v) v
registerStatics :: c ClassId ()
lookupStaticStore :: c (ClassId,Text) v
checkStaticInit :: c ClassId Bool
strToCharArr :: c Text Variable
allocStringConst :: c Text v
getField :: c (v, Text) v
updateField :: c (v, Text, v) v
getArrType :: c v Type
-- handleExceptions :: ArrowInterp addr val err c => StmtInterpreter val c -> StmtInterpreter val c
-- handleExceptions run' = catch run' $ proc (pc,exc) -> do
-- frame <- askFrame -< ()
......
module Preprocessing.SimpleCFG where
import Syntax.Unstructured ( Statement )
import Syntax.Unstructured ( Statement, Statement'(If))
import Prelude hiding(pred)
import Data.List (union)
......@@ -62,7 +62,15 @@ insertEdgeWithEdge graph (node1, node2, label) = edge_eval
++ "l: " ++ show ls
else FGL.insEdge (node1_eval, node2_eval,label) graph
_ -> if FGL.hasEdge graph (node1_eval, node2_eval)
then error $ "You cannot overwrite edges."
then case getStatement graph node1_eval of
If _ _ -> if FGL.hasLEdge graph (node1_eval, node2_eval,label)
then error $ "inserting two of the same branches to if stmt."
++ " Node1: " ++ show node1_eval
++ " Node2: " ++ show node2_eval
++ " Edge: " ++ show label
++ "\ngraph\n" ++ FGL.prettify graph
else FGL.insEdge (node1_eval, node2_eval,ConditionalTop) graph
_ -> error $ "You cannot overwrite edges."
++ " Node1: " ++ show node1_eval
++ " Node2: " ++ show node2_eval
++ " Edge: " ++ show label
......@@ -170,7 +178,7 @@ relinkForward graph node = do
relabel :: CFG -> FGL.Node -> Statement -> CFG
relabel graph node newLabel =
let inEdges = FGL.inn graph node
outEdges = FGL.out graph node
-- outEdges = FGL.out graph node
graph_ = FGL.delNode node graph
graph__ = FGL.insNode (node,newLabel) graph_
in FGL.insEdges (inEdges) graph__
\ No newline at end of file
in FGL.insEdges inEdges graph__
\ No newline at end of file
......@@ -36,16 +36,23 @@ statementsToNodes (zpd:stmts) = uncurry (SCFG.insertNode (statementsToNodes stmt
statementsToEdges :: [(Int, Statement)] -> IntMap Int -> [SCFG.CFGEdge]
statementsToEdges [] _ = []
statementsToEdges ((inum, Goto lnum):stmts) labels =
(inum,labels ! lnum,SCFG.Empty):statementsToEdges stmts labels
if inum == 10
then (inum,labels ! lnum,SCFG.Empty):statementsToEdges stmts labels
else (inum,labels ! lnum,SCFG.Empty):statementsToEdges stmts labels
statementsToEdges [(inum, If _ lnum)] labels = -- this case only occurs if jimple code is invalid
[(inum,labels ! lnum,SCFG.Condition True)]
statementsToEdges ((inum, If _ lnum):pd:stmts) labels =
let e1 = (inum,labels ! lnum,SCFG.Condition True)
-- e2 = [(inum,fst pd, SCFG.Condition False)]
e2 = [(inum,fst pd, SCFG.Condition False) | fst pd /= (labels ! lnum)]
in if null e2
then (inum, fst pd, SCFG.ConditionalTop ) : statementsToEdges (pd:stmts) labels
else e1:e2++statementsToEdges (pd:stmts) labels
in if inum == 9
then if null e2
then (inum, fst pd, SCFG.ConditionalTop ) : statementsToEdges (pd:stmts) labels
else e1:e2++statementsToEdges (pd:stmts) labels
-- error $ "are we here?" ++ show e1 ++ show e2 ++ FGL.prettify graph
else if null e2
then (inum, fst pd, SCFG.ConditionalTop ) : statementsToEdges (pd:stmts) labels
else e1:e2++statementsToEdges (pd:stmts) labels
statementsToEdges ((inum, TableSwitch _ vec defaultLNum):stmts) labels =
let defaultEdge = (inum,labels ! defaultLNum,SCFG.Default)
caseEdges = [(inum,node2,label)
......
......@@ -99,6 +99,7 @@ data Expr
| Binop Immediate Binop Immediate
| Unop Unop Immediate
| Immediate Immediate
| StackAssign Variable Expr -- maybe this is a problem, since it can become recursive, however this should not happen in praxis
deriving (Eq)
data Immediate
......@@ -125,7 +126,7 @@ data Variable
data Reference
= ArrayRef Text Immediate
| FieldRef Text Type Text
| SignatureRef Type Text -- what is signature ref? Field Ref without "dot"?
| SignatureRef ClassId Type Text -- what is signature ref? Field Ref without "dot"?
deriving (Eq)
data Invoke
......@@ -137,10 +138,12 @@ data Invoke
deriving (Eq)
data Binop
= And | Or | Xor | Mod | Rem
= And | NotAndNot | NotAnd | AndNot
| Or | Xor | Mod | Rem
| Cmp | Cmpg | Cmpl | Cmpeq | Cmpne |Cmpgt | Cmpge | Cmplt | Cmple
| Shl | Shr | Ushr
| Plus | Minus | Mult | Div
deriving (Eq)
data Unop
......@@ -319,7 +322,7 @@ instance Pretty Reference where
pretty ref = case ref of
ArrayRef text imm -> "ArrayRef" <+> pretty text <+> pretty imm
FieldRef text1 type_ text2 -> "FieldRef" <+> pretty text1 <+> pretty type_ <+> pretty text2
SignatureRef type_ text -> "SigRef" <+> pretty type_ <+> pretty text
SignatureRef id_ type_ text -> "SigRef" <+> pretty id_ <+> pretty type_ <+> pretty text
instance Show Invoke where show = show . pretty
instance Pretty Invoke where
......
......@@ -28,6 +28,13 @@ data Statement
| InvokeStmt Invoke
| Goto GotoLabel
| Label TargetLabel
| Goto_ Label_
| Target_ Label_
deriving (Eq)
data Label_
= Break_ Int
| Continue_ Int
deriving (Eq)
data GotoLabel
......@@ -71,6 +78,14 @@ instance Pretty Statement where
InvokeStmt invoke -> "InvokeStmt" <+> pretty invoke
Goto gotoLabel -> "Goto" <+> pretty gotoLabel
Label targetLabel -> "Label" <+> pretty targetLabel
Goto_ l -> "Goto" <+> pretty l
Target_ l -> "Target" <+> pretty l
instance Show Label_ where show = show . pretty
instance Pretty Label_ where
pretty l = case l of
Break_ i -> "Break" <+> pretty i
Continue_ i -> "Continue" <+> pretty i
instance Show GotoLabel where show = show . pretty
instance Pretty GotoLabel where
......
......@@ -15,16 +15,18 @@ getFields table id_ = case Map.lookup id_ table of
Just Class {members = memsMap} -> do
let memNames = Map.keys memsMap
Prelude.map (\x -> case x of MemberFieldName f -> f; _ -> pack "") $ Prelude.filter (\x -> case x of MemberFieldName _ -> True; _ -> False) memNames
_ -> undefined
x -> error $ "not yet supported: " ++ show id_ ++ "\ntable\n" ++ show table
getArgTypes :: MethodSignature -> Vec.Vector Type
getArgTypes MethodSignature {methodArgumentTypes = argTypes} = argTypes
getMethod :: ClassTable -> ClassId -> MethodSignature -> MethodBody
getMethod :: ClassTable -> ClassId -> MethodSignature -> Maybe MethodBody
getMethod classTable id sig = case Map.lookup id classTable of
Just Class { members = mems }-> case Map.lookup (MemberMethodSignature sig) mems of
Just (MemberMethod Method { methodBody = Just body }) -> body
_ -> error "Expected signature"
_ -> error $ "Expected class but got " ++ show id
\ No newline at end of file
Just (MemberMethod Method { methodBody = x }) -> x
-- Just (MemberMethod Method { methodBody = _ }) -> []
x -> error $ "Expected signature but got" ++ show sig ++ "\nwhich maps to:\n"++ show x -- "\nmembers:\n" ++ show (Map.keys mems)
_ -> error $ "Expected class but got " ++ show id ++ "\nclasstable:\n" ++ show (Map.keys classTable)
\ No newline at end of file
......@@ -4,7 +4,7 @@ cabal-version: 1.12
--
-- see: https://github.com/sol/hpack
--
-- hash: 811f154303437c964816d364cb152635b38f22e22baa56978b4296fcb35b157c
-- hash: ff768d11c68a79b4eb0e9d5724c0698fdd248ffa6db90940a8bdce35cdd3e048
name: sturdy-jimple
version: 0.1.0.0
......@@ -66,25 +66,11 @@ test-suite spec
type: exitcode-stdio-1.0
main-is: Spec.hs
other-modules:
AbsyTreeSpec
AllModulesSpec
Classes.ArrayFieldExample
Classes.FactorialExample
Classes.PersonExample
Classes.SingleMethodExample
Classes.TryCatchExample
ConcreteSpec
ConcreteSpec_
ConvertStatementSpec
GraphToStatementsSpec
IntervalSpec_
Java.Lang.ArithmeticException
Java.Lang.ArrayIndexOutOfBoundsException
Java.Lang.ClassCastException
Java.Lang.IllegalArgumentException
Java.Lang.NullPointerException
Java.Lang.Object
Java.Lang.Throwable
JimpleSoundness
NullnessSpec_
PrakTests.Gs
......
module Classes.ArrayFieldExample where
-- import Syntax
-- import Java.Lang.Object
-- arrayFieldExampleArrSignature :: FieldSignature
-- arrayFieldExampleArrSignature = FieldSignature
-- "ArrayFieldExample"
-- (ArrayType IntType)
-- "arr"
-- arrayFieldExampleArrField :: Field
-- arrayFieldExampleArrField = Field {
-- fieldModifiers = [Public],
-- fieldType = ArrayType IntType,
-- fieldName = "arr"
-- }
-- arrayFieldExampleInitSignature :: MethodSignature
-- arrayFieldExampleInitSignature = MethodSignature
-- "ArrayFieldExample"
-- VoidType
-- "<init>"
-- []
-- arrayFieldExampleInitMethod :: Method
-- arrayFieldExampleInitMethod = Method {
-- methodModifiers = [Public],
-- returnType = VoidType,
-- methodName = "<init>",
-- parameters = [],
-- throws = [],
-- methodBody = FullBody {
-- declarations = [
-- (RefType "ArrayFieldExample", ["r0"])
-- ],
-- statements = [
-- Identity "r0" ThisRef (RefType "ArrayFieldExample"),
-- Invoke (SpecialInvoke "r0" objectInitSignature []),
-- Return Nothing
-- ],
-- catchClauses = []
-- }
-- }
-- arrayFieldExampleMainMethod :: Method
-- arrayFieldExampleMainMethod = Method {
-- methodModifiers = [Public, Static],
-- returnType = VoidType,
-- methodName = "main",
-- parameters = [
-- IntType
-- ],
-- throws = [],
-- methodBody = FullBody {
-- declarations = [
-- (IntType, ["r0"]),
-- (ArrayType IntType, ["r1"]),
-- (RefType "ArrayFieldExample", ["$r2"])
-- ],
-- statements = [
-- Identity "r0" (ParameterRef 0) IntType,
-- Assign (LocalVar "$r2") (NewExpr (RefType "ArrayFieldExample")),
-- Invoke (SpecialInvoke "$r2" arrayFieldExampleInitSignature []),
-- Invoke (VirtualInvoke "$r2" arrayFieldExampleFillSignature [Local "r0"]),
-- Assign (LocalVar "r1") (RefExpr (FieldRef "$r2" arrayFieldExampleArrSignature)),
-- Return (Just (Local "r1"))
-- ],
-- catchClauses = []
-- }
-- }
-- arrayFieldExampleFillSignature :: MethodSignature
-- arrayFieldExampleFillSignature = MethodSignature
-- "ArrayFieldExample"
-- VoidType
-- "fill"
-- [IntType]
-- arrayFieldExampleFillMethod :: Method
-- arrayFieldExampleFillMethod = Method {
-- methodModifiers = [Private],
-- returnType = VoidType,
-- methodName = "fill",
-- parameters = [IntType],
-- throws = [],
-- methodBody = FullBody {
-- declarations = [
-- (RefType "ArrayFieldExample", ["r0"]),
-- (IntType, ["p0","p1"]),
-- (ArrayType IntType, ["a0"])
-- ],
-- statements = [
-- Identity "r0" ThisRef (RefType "ArrayFieldExample"),
-- Assign (LocalVar "a0") (NewArrayExpr IntType (IntConstant 4)),
-- Identity "p0" (ParameterRef 0) IntType,
-- Assign (ReferenceVar (ArrayRef "a0" (IntConstant 0))) (ImmediateExpr (Local "p0")),
-- Assign (LocalVar "p0") (BinopExpr (Local "p0") Mult (IntConstant 2)),
-- Assign (ReferenceVar (ArrayRef "a0" (IntConstant 1))) (ImmediateExpr (Local "p0")),
-- Identity "p1" (ParameterRef 0) IntType,
-- Assign (ReferenceVar (ArrayRef "a0" (IntConstant 2))) (ImmediateExpr (Local "p1")),
-- Assign (LocalVar "p1") (BinopExpr (Local "p1") Mult (IntConstant 2)),
-- Assign (ReferenceVar (ArrayRef "a0" (IntConstant 3))) (ImmediateExpr (Local "p1")),
-- Assign (ReferenceVar (FieldRef "r0" arrayFieldExampleArrSignature)) (ImmediateExpr (Local "a0")),
-- Return Nothing
-- ],
-- catchClauses = []
-- }
-- }
-- arrayFieldExampleFile :: CompilationUnit
-- arrayFieldExampleFile = CompilationUnit {
-- fileModifiers = [Public],
-- fileType = ClassFile,
-- fileName = "ArrayFieldExample",
-- extends = Just "java.lang.Object",
-- implements = [],
-- fileBody = [
-- FieldMember arrayFieldExampleArrField,
-- MethodMember arrayFieldExampleInitMethod,
-- MethodMember arrayFieldExampleMainMethod,
-- MethodMember arrayFieldExampleFillMethod
-- ]
-- }
module Classes.FactorialExample where
-- import Syntax
-- import Java.Lang.Object
-- import Java.Lang.IllegalArgumentException
-- factorialExampleInitSignature :: MethodSignature
-- factorialExampleInitSignature = MethodSignature
-- "FactorialExample"
-- VoidType
-- "<init>"
-- []
-- factorialExampleInitMethod :: Method
-- factorialExampleInitMethod = Method {
-- methodModifiers = [Public],