git.iko.soy/rowtype-yoga/purescm
on bytevector help sign in
Fix bug with PrimEffect (#188)

Fix bug where all previous bindings in a do block were dropped if the last `bind` was a `PrimEffect`.

commita93e889b2b2c95d22c8734dea5446c0eec834c41 authorAntti Holvikari <antti@anttih.com> dateFri 13 Oct 2023, 16:57 (3 years ago) parente31cb50
3 files changed+26−9
src/PureScript/Backend/Chez/Convert.purs+6−6 test-snapshots/src/snapshots-input/Snapshot.EffectRef.purs+7 test-snapshots/src/snapshots-output/Snapshot.EffectRef.ss+13−3
src/PureScript/Backend/Chez/Convert.purs+6−6
@@ -332,23 +332,23 @@ codegenChain chainMode codegenEnv = collect []
332332 _ ->
333333 S.unthunk $ codegenExpr codegenEnv expression
334334
335− finish :: Boolean -> Array _ -> NeutralExpr -> ChezExpr
335+ finish :: Boolean -> Array _ -> ChezExpr -> ChezExpr
336336 finish shouldUnthunk bindings expression = do
337337 let
338338 maybeUnthunk :: ChezExpr -> ChezExpr
339339 maybeUnthunk = if shouldUnthunk then S.unthunk else identity
340340 case NEA.fromArray bindings of
341− Nothing -> maybeUnthunk $ codegenExpr codegenEnv expression
342− Just bindings' -> S.Let recursive bindings' $ maybeUnthunk $ codegenExpr codegenEnv expression
341+ Nothing -> maybeUnthunk expression
342+ Just bindings' -> S.Let recursive bindings' $ maybeUnthunk expression
343343
344344 collect :: Array _ -> NeutralExpr -> ChezExpr
345345 collect bindings expression = case unwrap expression of
346346 Let i l v e' ->
347347 collect (Array.snoc bindings $ Tuple (toChezIdent i l) (codegenExpr codegenEnv v)) e'
348348 EffectPure e' | chainMode.effect ->
349− finish false bindings e'
349+ finish false bindings (codegenExpr codegenEnv e')
350350 PrimEffect e' | chainMode.effect ->
351− codegenPrimEffect codegenEnv e'
351+ finish false bindings (codegenPrimEffect codegenEnv e')
352352 EffectBind i l v e' | chainMode.effect ->
353353 collect
354354 (Array.snoc bindings $ Tuple (toChezIdent i l) (codegenEffectBind v))
@@ -356,7 +356,7 @@ codegenChain chainMode codegenEnv = collect []
356356 EffectDefer e' | chainMode.effect ->
357357 collect bindings e'
358358 _ ->
359− finish chainMode.effect bindings expression
359+ finish chainMode.effect bindings (codegenExpr codegenEnv expression)
360360
361361codegenPrimOp :: CodegenEnv -> BackendOperator NeutralExpr -> ChezExpr
362362codegenPrimOp codegenEnv@{ currentModule } = case _ of
test-snapshots/src/snapshots-input/Snapshot.EffectRef.purs+7
@@ -31,7 +31,14 @@ onLetTest = do
3131 v <- read n
3232 assert $ v == 5
3333
34+primEffectAtTheEnd :: Effect Int
35+primEffectAtTheEnd = do
36+ n <- new 1
37+ read n
38+
3439main :: Effect Unit
3540main = do
3641 basicTest
3742 onLetTest
43+ _ <- primEffectAtTheEnd
44+ pure unit
test-snapshots/src/snapshots-output/Snapshot.EffectRef.ss+13−3
@@ -7,12 +7,19 @@
77 main
88 onLet
99 onLetTest
10− positionZero)
10+ positionZero
11+ primEffectAtTheEnd)
1112 (import
1213 (prefix (chezscheme) scm:)
1314 (prefix (purs runtime lib) rt:)
15+ (prefix (Data.Unit lib) Data.Unit.)
1416 (prefix (Test.Assert lib) Test.Assert.))
1517
18+ (scm:define primEffectAtTheEnd
19+ (scm:lambda ()
20+ (scm:let ([n0 (scm:box 1)])
21+ (scm:unbox n0))))
22+
1623 (scm:define positionZero
1724 (scm:lambda ()
1825 (scm:box 0)))
@@ -44,5 +51,8 @@
4451
4552 (scm:define main
4653 (scm:lambda ()
47− (scm:let ([_ (basicTest)])
48− (onLetTest)))))
54+ (scm:let*
55+ ([_ (basicTest)]
56+ [_ (onLetTest)]
57+ [_ (primEffectAtTheEnd)])
58+ Data.Unit.unit))))