on master help sign in
Generate JS booleans, fix top-level tail defs, make JsEnums ints
commit3492239a7ccd5f9128e35dfd011d78c4a8b6be3a authorEvan Czaplicki <evancz@users.noreply.github.com> dateFri 26 Jan 2018, 16:26 (9 years ago) parent0b00f1c
4 files changed+86−87
src/AST/Optimized.hs+56−53 src/Generate/JavaScript.hs+9−25 src/Generate/JavaScript/Expression.hs+16−8 src/Optimize/Names.hs+5−1
src/AST/Optimized.hs+56−53
@@ -39,7 +39,8 @@ import qualified Reporting.Region as R
3939
4040
4141data Expr
42− = Chr Text
42+ = Bool Bool
43+ | Chr Text
4344 | Str Text
4445 | Int Int
4546 | Float Double
@@ -186,62 +187,64 @@ instance Binary Global where
186187instance Binary Expr where
187188 put expr =
188189 case expr of
189− Chr a -> putWord8 0 >> put a
190− Str a -> putWord8 1 >> put a
191− Int a -> putWord8 2 >> put a
192− Float a -> putWord8 3 >> put a
193− VarLocal a -> putWord8 4 >> put a
194− VarGlobal a -> putWord8 5 >> put a
195− VarEnum a b -> putWord8 6 >> put a >> put b
196− VarBox a -> putWord8 7 >> put a
197− VarCycle a b -> putWord8 8 >> put a >> put b
198− VarDebug a b c d -> putWord8 9 >> put a >> put b >> put c >> put d
199− VarKernel a b -> putWord8 10 >> put a >> put b
200− List a -> putWord8 11 >> put a
201− Function a b -> putWord8 12 >> put a >> put b
202− Call a b -> putWord8 13 >> put a >> put b
203− TailCall a b -> putWord8 14 >> put a >> put b
204− If a b -> putWord8 15 >> put a >> put b
205− Let a b -> putWord8 16 >> put a >> put b
206− Destruct a b -> putWord8 17 >> put a >> put b
207− Case a b c d -> putWord8 18 >> put a >> put b >> put c >> put d
208− Accessor a -> putWord8 19 >> put a
209− Access a b -> putWord8 20 >> put a >> put b
210− Update a b -> putWord8 21 >> put a >> put b
211− Record a -> putWord8 22 >> put a
212− Unit -> putWord8 23
213− Tuple a b c -> putWord8 24 >> put a >> put b >> put c
214− Shader a -> putWord8 25 >> put a
190+ Bool a -> putWord8 0 >> put a
191+ Chr a -> putWord8 1 >> put a
192+ Str a -> putWord8 2 >> put a
193+ Int a -> putWord8 3 >> put a
194+ Float a -> putWord8 4 >> put a
195+ VarLocal a -> putWord8 5 >> put a
196+ VarGlobal a -> putWord8 6 >> put a
197+ VarEnum a b -> putWord8 7 >> put a >> put b
198+ VarBox a -> putWord8 8 >> put a
199+ VarCycle a b -> putWord8 9 >> put a >> put b
200+ VarDebug a b c d -> putWord8 10 >> put a >> put b >> put c >> put d
201+ VarKernel a b -> putWord8 11 >> put a >> put b
202+ List a -> putWord8 12 >> put a
203+ Function a b -> putWord8 13 >> put a >> put b
204+ Call a b -> putWord8 14 >> put a >> put b
205+ TailCall a b -> putWord8 15 >> put a >> put b
206+ If a b -> putWord8 16 >> put a >> put b
207+ Let a b -> putWord8 17 >> put a >> put b
208+ Destruct a b -> putWord8 18 >> put a >> put b
209+ Case a b c d -> putWord8 19 >> put a >> put b >> put c >> put d
210+ Accessor a -> putWord8 20 >> put a
211+ Access a b -> putWord8 21 >> put a >> put b
212+ Update a b -> putWord8 22 >> put a >> put b
213+ Record a -> putWord8 23 >> put a
214+ Unit -> putWord8 24
215+ Tuple a b c -> putWord8 25 >> put a >> put b >> put c
216+ Shader a -> putWord8 26 >> put a
215217
216218 get =
217219 do word <- getWord8
218220 case word of
219− 0 -> liftM Chr get
220− 1 -> liftM Str get
221− 2 -> liftM Int get
222− 3 -> liftM Float get
223− 4 -> liftM VarLocal get
224− 5 -> liftM VarGlobal get
225− 6 -> liftM2 VarEnum get get
226− 7 -> liftM VarBox get
227− 8 -> liftM2 VarCycle get get
228− 9 -> liftM4 VarDebug get get get get
229− 10 -> liftM2 VarKernel get get
230− 11 -> liftM List get
231− 12 -> liftM2 Function get get
232− 13 -> liftM2 Call get get
233− 14 -> liftM2 TailCall get get
234− 15 -> liftM2 If get get
235− 16 -> liftM2 Let get get
236− 17 -> liftM2 Destruct get get
237− 18 -> liftM4 Case get get get get
238− 19 -> liftM Accessor get
239− 20 -> liftM2 Access get get
240− 21 -> liftM2 Update get get
241− 22 -> liftM Record get
242− 23 -> pure Unit
243− 24 -> liftM3 Tuple get get get
244− 25 -> liftM Shader get
221+ 0 -> liftM Bool get
222+ 1 -> liftM Chr get
223+ 2 -> liftM Str get
224+ 3 -> liftM Int get
225+ 4 -> liftM Float get
226+ 5 -> liftM VarLocal get
227+ 6 -> liftM VarGlobal get
228+ 7 -> liftM2 VarEnum get get
229+ 8 -> liftM VarBox get
230+ 9 -> liftM2 VarCycle get get
231+ 10 -> liftM4 VarDebug get get get get
232+ 11 -> liftM2 VarKernel get get
233+ 12 -> liftM List get
234+ 13 -> liftM2 Function get get
235+ 14 -> liftM2 Call get get
236+ 15 -> liftM2 TailCall get get
237+ 16 -> liftM2 If get get
238+ 17 -> liftM2 Let get get
239+ 18 -> liftM2 Destruct get get
240+ 19 -> liftM4 Case get get get get
241+ 20 -> liftM Accessor get
242+ 21 -> liftM2 Access get get
243+ 22 -> liftM2 Update get get
244+ 23 -> liftM Record get
245+ 24 -> pure Unit
246+ 25 -> liftM3 Tuple get get get
247+ 26 -> liftM Shader get
245248 _ -> error "problem getting Opt.Expr binary"
246249
247250
src/Generate/JavaScript.hs+9−25
@@ -150,7 +150,8 @@ addGlobalHelp mode graph global state =
150150
151151 Opt.DefineTailFunc argNames body deps ->
152152 addStmt (addDeps deps state) (
153− generateTailDef mode global argNames body
153+ let (Opt.Global _ name) = global in
154+ var global (Expr.generateTailDef mode name argNames body)
154155 )
155156
156157 Opt.Ctor name index arity ->
@@ -214,19 +215,6 @@ var (Opt.Global home name) code =
214215
215216
216217
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−
230218-- GENERATE CYCLES
231219
232220
@@ -287,7 +275,7 @@ addChunk mode builder chunk =
287275 Name.toBuilder (Name.fromInt int) <> builder
288276
289277 Opt.JsEnum int ->
290− Name.toBuilder (Name.fromInt int) <> builder
278+ B.intDec int <> builder
291279
292280 Opt.Debug ->
293281 case mode of
@@ -329,17 +317,13 @@ generateEnum mode (Opt.Global home name) ctorName index =
329317
330318
331319generateBox :: Name.Mode -> Opt.Global -> N.Name -> JS.Stmt
332−generateBox mode (Opt.Global home name) ctorName =
333− let
334− definition =
335− case mode of
336− Name.Debug _ ->
337− Expr.codeToExpr $ Expr.generateCtor mode ctorName Index.first 1
320+generateBox mode global ctorName =
321+ case mode of
322+ Name.Debug _ ->
323+ var global (Expr.generateCtor mode ctorName Index.first 1)
338324
339− Name.Prod _ _ ->
340− JS.Ref (Name.fromGlobal ModuleName.basics N.identity)
341− in
342− JS.Var [ (Name.fromGlobal home name, Just definition) ]
325+ Name.Prod _ _ ->
326+ JS.EmptyStmt
343327
344328
345329
src/Generate/JavaScript/Expression.hs+16−8
@@ -52,6 +52,9 @@ generateJsExpr mode expression =
5252generate :: Mode -> Opt.Expr -> Code
5353generate mode expression =
5454 case expression of
55+ Opt.Bool bool ->
56+ JsExpr $ JS.Bool bool
57+
5558 Opt.Chr char ->
5659 JsExpr $
5760 case mode of
@@ -100,11 +103,16 @@ generate mode expression =
100103 JsExpr $ JS.Ref (Name.fromKernel home name)
101104
102105 Opt.List entries ->
103− JsExpr $
104− JS.Call
105− (JS.Ref (Name.fromKernel N.list "fromArray"))
106− [ JS.Array $ map (generateJsExpr mode) entries
107− ]
106+ case entries of
107+ [] ->
108+ JsExpr $ JS.Ref (Name.fromKernel N.list "Nil")
109+
110+ _ ->
111+ JsExpr $
112+ JS.Call
113+ (JS.Ref (Name.fromKernel N.list "fromArray"))
114+ [ JS.Array $ map (generateJsExpr mode) entries
115+ ]
108116
109117 Opt.Function args body ->
110118 generateFunction (map Name.fromLocal args) (generate mode body)
@@ -698,12 +706,12 @@ generateDef mode def =
698706 JS.Var [ (Name.fromLocal name, Just (generateJsExpr mode body)) ]
699707
700708 Opt.TailDef name argNames body ->
701− JS.Var [ (Name.fromLocal name, Just (generateTailDef mode name argNames body)) ]
709+ JS.Var [ (Name.fromLocal name, Just (codeToExpr (generateTailDef mode name argNames body))) ]
702710
703711
704−generateTailDef :: Mode -> N.Name -> [N.Name] -> Opt.Expr -> JS.Expr
712+generateTailDef :: Mode -> N.Name -> [N.Name] -> Opt.Expr -> Code
705713generateTailDef mode name argNames body =
706− JS.Function Nothing (map Name.fromLocal argNames)
714+ generateFunction (map Name.fromLocal argNames) $ JsBlock $
707715 [ JS.Labelled (Name.fromLocal name) $
708716 JS.While (JS.Bool True) $
709717 codeToStmt $ generate mode body
src/Optimize/Names.hs+5−1
@@ -85,7 +85,11 @@ registerCtor home name index opts =
8585 ok uid newDeps fields (Opt.VarGlobal global)
8686
8787 Can.Enum ->
88− ok uid newDeps fields (Opt.VarEnum global index)
88+ ok uid newDeps fields $
89+ case name of
90+ "True" | home == ModuleName.basics -> Opt.Bool True
91+ "False" | home == ModuleName.basics -> Opt.Bool False
92+ _ -> Opt.VarEnum global index
8993
9094 Can.Unbox ->
9195 ok uid (Set.insert identity newDeps) fields (Opt.VarBox global)