on master help sign in
Enforce locals shadowing top-levels
commit91bc3a418ad7613b4d9f389e54fb2e5f38fd93e2 authorjmite <jmitdase@gmail.com> dateTue 25 Aug 2015, 11:45 (11 years ago) parent2cd0692
3 files changed+24−1
src/Canonicalize/Variable.hs+14−1 src/Generate/JavaScript.hs+8 src/Optimize/TailCalls.hs+2
src/Canonicalize/Variable.hs+14−1
@@ -117,6 +117,13 @@ preferLocals' region env extract kind possibilities var =
117117 [v] ->
118118 Result.var' extract v
119119
120+ --Local vars shadow top-level vars
121+ [v1, v2] | isTopLevel (extract v1) ->
122+ Result.var' extract v2
123+
124+ [v1, v2] | isTopLevel (extract v2) ->
125+ Result.var' extract v1
126+
120127 locals ->
121128 ambiguous locals
122129 where
@@ -129,10 +136,16 @@ preferLocals' region env extract kind possibilities var =
129136 Var.Module name ->
130137 name == Env._home env
131138
139+ isTopLevel :: Var.Canonical -> Bool
140+ isTopLevel (Var.Canonical home _) =
141+ case home of
142+ Var.TopLevel _ -> True
143+ _ -> False
144+
132145 ambiguous possibleVars =
133146 Result.err (A.A region (Error.variable kind var Error.Ambiguous vars))
134147 where
135− vars = map (Var.toString . extract) possibleVars
148+ vars = map (show {-Var.toString-} . extract) possibleVars
136149
137150
138151-- NOT FOUND HELPERS
src/Generate/JavaScript.hs+8
@@ -351,6 +351,12 @@ isTailCall tcc (A.A _ func) arity =
351351 else
352352 Nothing
353353
354+ (Var (Var.Canonical (Var.TopLevel _) name), Just (tcName, tcArgs, tcLabel)) ->
355+ if name == tcName && length tcArgs == arity then
356+ Just (tcArgs, tcLabel)
357+ else
358+ Nothing
359+
354360 _ ->
355361 Nothing
356362
@@ -516,6 +522,8 @@ generateCase tcc expr branches =
516522 case expr of
517523 A.A _ (Var (Var.Canonical Var.Local x)) ->
518524 return (Case.matchSubst [(tempVar, Var.varName x)] initialMatch, [])
525+ A.A _ (Var (Var.Canonical (Var.TopLevel _) x)) ->
526+ return (Case.matchSubst [(tempVar, Var.varName x)] initialMatch, [])
519527 _ ->
520528 do expr' <- toJsExpr expr
521529 return (initialMatch, [VarDeclStmt () [varDecl tempVar expr']])
src/Optimize/TailCalls.hs+2
@@ -130,6 +130,8 @@ findTailCalls context annExpr@(A.A _ expression) =
130130 case (context, func) of
131131 ( Just (name, argNum), A.A _ (Var (Var.Canonical Var.Local name')) ) ->
132132 name == name' && length args == argNum
133+ ( Just (name, argNum), A.A _ (Var (Var.Canonical (Var.TopLevel _) name')) ) ->
134+ name == name' && length args == argNum
133135 _ ->
134136 False
135137