forked from GitHub/gf-core
bug fixes in code size analysis
This commit is contained in:
@@ -36,27 +36,20 @@ stripInfo i = case i of
|
|||||||
CncFun mict mte mtf -> CncFun mict Nothing Nothing
|
CncFun mict mte mtf -> CncFun mict Nothing Nothing
|
||||||
AnyInd b f -> i
|
AnyInd b f -> i
|
||||||
|
|
||||||
constantsInTerm :: Term -> [Term]
|
constantsInTerm :: Term -> [QIdent]
|
||||||
constantsInTerm = nub . consts where
|
constantsInTerm = nub . consts where
|
||||||
consts t = case t of
|
consts t = case t of
|
||||||
Q _ -> [t]
|
Q c -> [c]
|
||||||
QC _ -> [t]
|
QC c -> [c]
|
||||||
_ -> collectOp consts t
|
_ -> collectOp consts t
|
||||||
|
|
||||||
constantDeps :: SourceGrammar -> QIdent -> Err [Term]
|
constantDeps :: SourceGrammar -> QIdent -> Err [QIdent]
|
||||||
constantDeps sgr f = do
|
constantDeps sgr f = return $ nub $ iterFix more start where
|
||||||
ts <- deps f
|
start = constants f
|
||||||
let cs = [i | t <- ts, Ok i <- [getIdTerm t]]
|
more = concatMap constants
|
||||||
ds <- mapM deps cs
|
constants c = (c :) $ errVal [] $ do
|
||||||
return $ nub $ concat $ ts:ds
|
ts <- termsOfConstant sgr c
|
||||||
where
|
return $ concatMap constantsInTerm ts
|
||||||
deps c = case lookupOverload sgr c of
|
|
||||||
Ok tts ->
|
|
||||||
return $ concat [constantsInTerm ty ++ constantsInTerm tr | (_,(ty,tr)) <- tts]
|
|
||||||
_ -> do
|
|
||||||
ty <- lookupResType sgr c
|
|
||||||
tr <- lookupResDef sgr c
|
|
||||||
return $ constantsInTerm ty ++ constantsInTerm tr
|
|
||||||
|
|
||||||
getIdTerm :: Term -> Err QIdent
|
getIdTerm :: Term -> Err QIdent
|
||||||
getIdTerm t = case t of
|
getIdTerm t = case t of
|
||||||
@@ -68,14 +61,20 @@ getIdTerm t = case t of
|
|||||||
constantDepsTerm :: SourceGrammar -> Term -> Err [Term]
|
constantDepsTerm :: SourceGrammar -> Term -> Err [Term]
|
||||||
constantDepsTerm sgr t = do
|
constantDepsTerm sgr t = do
|
||||||
i <- getIdTerm t
|
i <- getIdTerm t
|
||||||
constantDeps sgr i
|
cs <- constantDeps sgr i
|
||||||
|
return $ map Q cs --- losing distinction Q/QC
|
||||||
|
|
||||||
|
termsOfConstant :: SourceGrammar -> QIdent -> Err [Term]
|
||||||
|
termsOfConstant sgr c = case lookupOverload sgr c of
|
||||||
|
Ok tts -> return $ concat [[ty,tr] | (_,(ty,tr)) <- tts]
|
||||||
|
_ -> return $
|
||||||
|
[ty | Ok ty <- [lookupResType sgr c]] ++ -- type sig may be missing
|
||||||
|
[ty | Ok ty <- [lookupResDef sgr c]]
|
||||||
|
|
||||||
sizeConstant :: SourceGrammar -> Term -> Int
|
sizeConstant :: SourceGrammar -> Term -> Int
|
||||||
sizeConstant sgr t = err (const 0) id $ do
|
sizeConstant sgr t = err (const 0) id $ do
|
||||||
c <- getIdTerm t
|
c <- getIdTerm t
|
||||||
ty <- return $ err (const 0) sizeTerm $ lookupResType sgr c -- if no type sig, return 0
|
fmap (sum . map sizeTerm) $ termsOfConstant sgr c
|
||||||
tr <- return $ err (const 0) sizeTerm $ lookupResDef sgr c
|
|
||||||
return $ ty + tr
|
|
||||||
|
|
||||||
-- the number of constructors in a term, ignoring position information and unnecessary types
|
-- the number of constructors in a term, ignoring position information and unnecessary types
|
||||||
-- ground terms count as 1, i.e. as "one work" each
|
-- ground terms count as 1, i.e. as "one work" each
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ execute1 opts gfenv0 s0 =
|
|||||||
ops <- case ts of
|
ops <- case ts of
|
||||||
_:_ -> do
|
_:_ -> do
|
||||||
let Right t = runP pExp (encodeUnicode utf8 (unwords ts))
|
let Right t = runP pExp (encodeUnicode utf8 (unwords ts))
|
||||||
err error return $ constantDepsTerm sgr t
|
err error (return . (t:)) $ constantDepsTerm sgr t
|
||||||
_ -> error "give a term as argument"
|
_ -> error "give a term as argument"
|
||||||
let prTerm = showTerm sgr TermPrintDefault Qualified
|
let prTerm = showTerm sgr TermPrintDefault Qualified
|
||||||
let size = sizeConstant sgr
|
let size = sizeConstant sgr
|
||||||
|
|||||||
Reference in New Issue
Block a user