on master help sign in
Fix code generation for top level tail call definitions
commitbf63cb879192c74e3bb047de30d1f786241405ef authorEvan Czaplicki <evancz@users.noreply.github.com> dateThu 25 Jan 2018, 20:50 (9 years ago) parent4ac6981
3 files changed+48−13
src/Generate/JavaScript.hs+14−1 src/Generate/JavaScript/Expression.hs+11−10 src/Optimize/Expression.hs+23−2
src/Generate/JavaScript.hs+14−1
@@ -150,7 +150,7 @@ addGlobalHelp mode graph global state =
150150
151151 Opt.DefineTailFunc argNames body deps ->
152152 addStmt (addDeps deps state) (
153− var global (Expr.generateFunction (map Name.fromLocal argNames) (Expr.generate mode body))
153+ generateTailDef mode global argNames body
154154 )
155155
156156 Opt.Ctor name index arity ->
@@ -214,6 +214,19 @@ var (Opt.Global home name) code =
214214
215215
216216
217+-- GENERATE TAIL DEFS
218+
219+
220+generateTailDef :: Name.Mode -> Opt.Global -> [N.Name] -> Opt.Expr -> JS.Stmt
221+generateTailDef mode (Opt.Global home name) argNames body =
222+ let
223+ definition =
224+ Expr.generateTailDef mode name argNames body
225+ in
226+ JS.Var [ (Name.fromGlobal home name, Just definition) ]
227+
228+
229+
217230-- GENERATE CYCLES
218231
219232
src/Generate/JavaScript/Expression.hs+11−10
@@ -2,7 +2,7 @@
22module Generate.JavaScript.Expression
33 ( generate
44 , generateCtor
5− , generateFunction
5+ , generateTailDef
66 , generateMain
77 , Code
88 , codeToExpr
@@ -714,15 +714,16 @@ generateDef mode def =
714714 JS.Var [ (Name.fromLocal name, Just (generateJsExpr mode body)) ]
715715
716716 Opt.TailDef name argNames body ->
717− let
718− function =
719− JS.Function Nothing (map Name.fromLocal argNames)
720− [ JS.Labelled (Name.fromLocal name) $
721− JS.While (JS.Bool True) $
722− codeToStmt $ generate mode body
723− ]
724− in
725− JS.Var [ (Name.fromLocal name, Just function) ]
717+ JS.Var [ (Name.fromLocal name, Just (generateTailDef mode name argNames body)) ]
718+
719+
720+generateTailDef :: Mode -> N.Name -> [N.Name] -> Opt.Expr -> JS.Expr
721+generateTailDef mode name argNames body =
722+ JS.Function Nothing (map Name.fromLocal argNames)
723+ [ JS.Labelled (Name.fromLocal name) $
724+ JS.While (JS.Bool True) $
725+ codeToStmt $ generate mode body
726+ ]
726727
727728
728729
src/Optimize/Expression.hs+23−2
@@ -408,8 +408,29 @@ hasTailCall expression =
408408 Opt.Let _ body ->
409409 hasTailCall body
410410
411− Opt.Case _ _ _ branches ->
412− any (hasTailCall . snd) branches
411+ Opt.Destruct _ body ->
412+ hasTailCall body
413+
414+ Opt.Case _ _ decider jumps ->
415+ decidecHasTailCall decider || any (hasTailCall . snd) jumps
413416
414417 _ ->
415418 False
419+
420+
421+decidecHasTailCall :: Opt.Decider Opt.Choice -> Bool
422+decidecHasTailCall decider =
423+ case decider of
424+ Opt.Leaf choice ->
425+ case choice of
426+ Opt.Inline expr ->
427+ hasTailCall expr
428+
429+ Opt.Jump _ ->
430+ False
431+
432+ Opt.Chain _ success failure ->
433+ decidecHasTailCall success || decidecHasTailCall failure
434+
435+ Opt.FanOut _ tests fallback ->
436+ decidecHasTailCall fallback || any (decidecHasTailCall . snd) tests