Skip to content

Commit d46525d

Browse files
committed
Analysis fixes
1 parent b63aeba commit d46525d

4 files changed

Lines changed: 74 additions & 57 deletions

File tree

analysis/reanalyze/src/SideEffects.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ let rec exprNoSideEffects (expr : Typedtree.expression) =
2626
| Texp_ident _ | Texp_constant _ -> true
2727
| Texp_construct (_, _, el) -> el |> List.for_all exprNoSideEffects
2828
| Texp_function _ -> true
29+
(* Loop control changes whether subsequent code in the enclosing loop runs,
30+
so it should not be treated as a removable pure expression. *)
31+
| Texp_break | Texp_continue -> false
2932
| Texp_apply {funct = {exp_desc = Texp_ident (path, _, _)}; args}
3033
when path |> pathIsWhitelistedForSideEffects ->
3134
args |> List.for_all (fun (_, eo) -> eo |> exprOptNoSideEffects)

analysis/src/DumpAst.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ and printExprItem expr ~pos ~indentation =
170170
|> String.concat "\n")
171171
| Pexp_ident {txt} ->
172172
"Pexp_ident:" ^ (Utils.flattenLongIdent txt |> SharedTypes.ident)
173+
| Pexp_break -> "Pexp_break"
174+
| Pexp_continue -> "Pexp_continue"
173175
| Pexp_apply {funct = expr; args} ->
174176
let printLabel labelled ~pos =
175177
match labelled with

tests/analysis_tests/tests-reanalyze/deadcode/expected/deadcode.txt

Lines changed: 63 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,13 @@
9494
addValueDeclaration +make DeadTest.res:117:4 path:+DeadTest
9595
addValueDeclaration +theSideEffectIsLogging DeadTest.res:121:4 path:+DeadTest
9696
addValueDeclaration +stringLengthNoSideEffects DeadTest.res:123:4 path:+DeadTest
97-
addValueDeclaration +globallyLive1 DeadTest.res:128:6 path:+DeadTest.GloobLive
98-
addValueDeclaration +globallyLive2 DeadTest.res:129:6 path:+DeadTest.GloobLive
99-
addValueDeclaration +globallyLive3 DeadTest.res:130:6 path:+DeadTest.GloobLive
100-
addValueDeclaration +funWithInnerVars DeadTest.res:145:4 path:+DeadTest
101-
addValueDeclaration +deadIncorrect DeadTest.res:154:4 path:+DeadTest
102-
addValueDeclaration +ira DeadTest.res:160:4 path:+DeadTest
97+
addValueDeclaration +breakChangesControlFlow DeadTest.res:125:4 path:+DeadTest
98+
addValueDeclaration +globallyLive1 DeadTest.res:134:6 path:+DeadTest.GloobLive
99+
addValueDeclaration +globallyLive2 DeadTest.res:135:6 path:+DeadTest.GloobLive
100+
addValueDeclaration +globallyLive3 DeadTest.res:136:6 path:+DeadTest.GloobLive
101+
addValueDeclaration +funWithInnerVars DeadTest.res:151:4 path:+DeadTest
102+
addValueDeclaration +deadIncorrect DeadTest.res:160:4 path:+DeadTest
103+
addValueDeclaration +ira DeadTest.res:166:4 path:+DeadTest
103104
addValueReference DeadTest.res:1:15 --> ImmutableArray.resi:9:0
104105
addValueReference DeadTest.res:8:7 --> DeadTest.res:7:4
105106
addValueReference DeadTest.res:11:7 --> DeadTest.res:10:4
@@ -156,37 +157,37 @@
156157
addValueReference DeadTest.res:117:19 --> React.res:7:0
157158
addTypeReference _none_:1:-1 --> DeadTest.res:117:12
158159
addValueReference DeadTest.res:119:16 --> DeadTest.res:117:4
159-
addVariantCaseDeclaration A DeadTest.res:134:11 path:+DeadTest.WithInclude.t
160-
addVariantCaseDeclaration A DeadTest.res:137:13 path:+DeadTest.WithInclude.T.t
161-
addVariantCaseDeclaration A DeadTest.res:137:13 path:+DeadTest.WithInclude.t
162-
addTypeReference DeadTest.res:142:7 --> DeadTest.res:134:11
163-
addValueDeclaration +x DeadTest.res:146:6 path:+DeadTest
164-
addValueDeclaration +y DeadTest.res:147:6 path:+DeadTest
165-
addValueReference DeadTest.res:145:4 --> DeadTest.res:146:6
166-
addValueReference DeadTest.res:145:4 --> DeadTest.res:147:6
167-
addRecordLabelDeclaration a DeadTest.res:151:11 path:+DeadTest.rc
168-
addValueDeclaration +_ DeadTest.res:156:0 path:+DeadTest
169-
addValueReference DeadTest.res:156:8 --> DeadTest.res:154:4
170-
addRecordLabelDeclaration IR.a DeadTest.res:158:24 path:+DeadTest.inlineRecord
171-
addRecordLabelDeclaration IR.b DeadTest.res:158:32 path:+DeadTest.inlineRecord
172-
addRecordLabelDeclaration IR.c DeadTest.res:158:40 path:+DeadTest.inlineRecord
173-
addRecordLabelDeclaration IR.d DeadTest.res:158:51 path:+DeadTest.inlineRecord
174-
addRecordLabelDeclaration IR.e DeadTest.res:158:65 path:+DeadTest.inlineRecord
175-
addVariantCaseDeclaration IR DeadTest.res:158:20 path:+DeadTest.inlineRecord
176-
addValueDeclaration +_ DeadTest.res:161:0 path:+DeadTest
177-
addTypeReference DeadTest.res:163:20 --> DeadTest.res:158:20
178-
addValueReference DeadTest.res:163:27 --> DeadTest.res:160:4
179-
addTypeReference DeadTest.res:163:35 --> DeadTest.res:158:32
180-
addValueReference DeadTest.res:163:35 --> DeadTest.res:163:7
181-
addValueReference DeadTest.res:163:40 --> DeadTest.res:163:8
182-
addTypeReference DeadTest.res:163:7 --> DeadTest.res:158:40
183-
addValueReference DeadTest.res:162:9 --> DeadTest.res:161:8
184-
addRecordLabelDeclaration IR2.a DeadTest.res:167:26 path:+DeadTest.inlineRecord2
185-
addRecordLabelDeclaration IR2.b DeadTest.res:167:34 path:+DeadTest.inlineRecord2
186-
addVariantCaseDeclaration IR2 DeadTest.res:167:21 path:+DeadTest.inlineRecord2
187-
addRecordLabelDeclaration IR3.a DeadTest.res:169:34 path:+DeadTest.inlineRecord3
188-
addRecordLabelDeclaration IR3.b DeadTest.res:169:42 path:+DeadTest.inlineRecord3
189-
addVariantCaseDeclaration IR3 DeadTest.res:169:21 path:+DeadTest.inlineRecord3
160+
addVariantCaseDeclaration A DeadTest.res:140:11 path:+DeadTest.WithInclude.t
161+
addVariantCaseDeclaration A DeadTest.res:143:13 path:+DeadTest.WithInclude.T.t
162+
addVariantCaseDeclaration A DeadTest.res:143:13 path:+DeadTest.WithInclude.t
163+
addTypeReference DeadTest.res:148:7 --> DeadTest.res:140:11
164+
addValueDeclaration +x DeadTest.res:152:6 path:+DeadTest
165+
addValueDeclaration +y DeadTest.res:153:6 path:+DeadTest
166+
addValueReference DeadTest.res:151:4 --> DeadTest.res:152:6
167+
addValueReference DeadTest.res:151:4 --> DeadTest.res:153:6
168+
addRecordLabelDeclaration a DeadTest.res:157:11 path:+DeadTest.rc
169+
addValueDeclaration +_ DeadTest.res:162:0 path:+DeadTest
170+
addValueReference DeadTest.res:162:8 --> DeadTest.res:160:4
171+
addRecordLabelDeclaration IR.a DeadTest.res:164:24 path:+DeadTest.inlineRecord
172+
addRecordLabelDeclaration IR.b DeadTest.res:164:32 path:+DeadTest.inlineRecord
173+
addRecordLabelDeclaration IR.c DeadTest.res:164:40 path:+DeadTest.inlineRecord
174+
addRecordLabelDeclaration IR.d DeadTest.res:164:51 path:+DeadTest.inlineRecord
175+
addRecordLabelDeclaration IR.e DeadTest.res:164:65 path:+DeadTest.inlineRecord
176+
addVariantCaseDeclaration IR DeadTest.res:164:20 path:+DeadTest.inlineRecord
177+
addValueDeclaration +_ DeadTest.res:167:0 path:+DeadTest
178+
addTypeReference DeadTest.res:169:20 --> DeadTest.res:164:20
179+
addValueReference DeadTest.res:169:27 --> DeadTest.res:166:4
180+
addTypeReference DeadTest.res:169:35 --> DeadTest.res:164:32
181+
addValueReference DeadTest.res:169:35 --> DeadTest.res:169:7
182+
addValueReference DeadTest.res:169:40 --> DeadTest.res:169:8
183+
addTypeReference DeadTest.res:169:7 --> DeadTest.res:164:40
184+
addValueReference DeadTest.res:168:9 --> DeadTest.res:167:8
185+
addRecordLabelDeclaration IR2.a DeadTest.res:173:26 path:+DeadTest.inlineRecord2
186+
addRecordLabelDeclaration IR2.b DeadTest.res:173:34 path:+DeadTest.inlineRecord2
187+
addVariantCaseDeclaration IR2 DeadTest.res:173:21 path:+DeadTest.inlineRecord2
188+
addRecordLabelDeclaration IR3.a DeadTest.res:175:34 path:+DeadTest.inlineRecord3
189+
addRecordLabelDeclaration IR3.b DeadTest.res:175:42 path:+DeadTest.inlineRecord3
190+
addVariantCaseDeclaration IR3 DeadTest.res:175:21 path:+DeadTest.inlineRecord3
190191
addValueReference DeadTest.res:28:2 --> DeadTest.res:31:6
191192
addValueReference DeadTest.res:36:2 --> DeadTest.res:39:6
192193
addValueReference DeadTest.res:60:2 --> DeadTest.res:64:6
@@ -1787,10 +1788,10 @@
17871788
addTypeReference DeadTest.res:35:11 --> DeadTest.res:38:11
17881789
extendTypeDependencies DeadTest.res:35:11 --> DeadTest.res:38:11
17891790
addTypeReference DeadTest.res:38:11 --> DeadTest.res:35:11
1790-
extendTypeDependencies DeadTest.res:137:13 --> DeadTest.res:134:11
1791-
addTypeReference DeadTest.res:134:11 --> DeadTest.res:137:13
1792-
extendTypeDependencies DeadTest.res:134:11 --> DeadTest.res:137:13
1793-
addTypeReference DeadTest.res:137:13 --> DeadTest.res:134:11
1791+
extendTypeDependencies DeadTest.res:143:13 --> DeadTest.res:140:11
1792+
addTypeReference DeadTest.res:140:11 --> DeadTest.res:143:13
1793+
extendTypeDependencies DeadTest.res:140:11 --> DeadTest.res:143:13
1794+
addTypeReference DeadTest.res:143:13 --> DeadTest.res:140:11
17941795
extendTypeDependencies DeadRT.res:2:2 --> DeadRT.resi:2:2
17951796
addTypeReference DeadRT.resi:2:2 --> DeadRT.res:2:2
17961797
extendTypeDependencies DeadRT.resi:2:2 --> DeadRT.res:2:2
@@ -1931,7 +1932,7 @@
19311932

19321933
Forward Liveness Analysis
19331934

1934-
decls: 695
1935+
decls: 696
19351936
roots(external targets): 134
19361937
decl-deps: decls_with_out=407 edges_to_decls=288
19371938

@@ -1944,7 +1945,6 @@ Forward Liveness Analysis
19441945
Root (external ref): Value +CreateErrorHandler2.Error2.+notification
19451946
Root (annotated): Value +DeadTest.+fortyTwoButExported
19461947
Root (annotated): Value +ScopedAnnotationsOverride.M.+live1
1947-
Root (external ref): RecordLabel +DeadTest.inlineRecord.IR.b
19481948
Root (annotated): Value +Docstrings.+twoU
19491949
Root (external ref): RecordLabel +TypeReexportCrossFileB.reexportedRecord.usedField
19501950
Root (annotated): Value +NestedModules.Universe.Nested2.+nested2Function
@@ -1954,12 +1954,12 @@ Forward Liveness Analysis
19541954
Root (external ref): VariantCase +DeadTypeTest.deadType.OnlyInImplementation
19551955
Root (annotated): Value +TestImport.+valueStartingWithUpperCaseLetter
19561956
Root (external ref): Value +TypeReexport.VariantUseReexported.+value
1957+
Root (annotated): RecordLabel +DeadTest.inlineRecord.IR.e
19571958
Root (external ref): Value +OptionalArgsLiveDead.+liveCaller
19581959
Root (annotated): RecordLabel +ImportHookDefault.props.renderMe
19591960
Root (annotated): Value +TypeParams3.+test
19601961
Root (annotated): Value +Variants.+sunday
19611962
Root (annotated): Value +NestedModules.Universe.Nested2.Nested3.+nested3Value
1962-
Root (annotated): Value +DeadTest.GloobLive.+globallyLive2
19631963
Root (annotated): Value +Hooks.+functionWithRenamedArgs
19641964
Root (external ref): RecordLabel +Unison.t.doc
19651965
Root (annotated): Value +Tuples.+computeAreaWithIdent
@@ -1973,7 +1973,6 @@ Forward Liveness Analysis
19731973
Root (external ref): Value +Newton.+f
19741974
Root (external ref): RecordLabel +Records.record.v
19751975
Root (external ref): VariantCase +DeadTest.VariantUsedOnlyInImplementation.t.A
1976-
Root (annotated): Value +DeadTest.GloobLive.+globallyLive3
19771976
Root (external ref): Value +Hooks.RenderPropRequiresConversion.+car
19781977
Root (external ref): RecordLabel +Records.person.address
19791978
Root (annotated): Value +Variants.+testConvert2
@@ -2029,10 +2028,10 @@ Forward Liveness Analysis
20292028
Root (annotated): Value +TestImport.+defaultValue
20302029
Root (external ref): Value +OptArg.+threeArgs
20312030
Root (annotated): Value +Types.+setMatch
2031+
Root (external ref): Value +DeadTest.+deadIncorrect
20322032
Root (external ref): RecordLabel +TypeReexport.UseReexported.reexportedType.usedField
20332033
Root (annotated): Value +Docstrings.+signMessage
20342034
Root (external ref): Value +DeadExn.+eInside
2035-
Root (external ref): VariantCase +DeadTest.inlineRecord.IR
20362035
Root (external ref): RecordLabel +ComponentAsProp.props.button
20372036
Root (annotated): Value +ImportJsValue.+returnedFromHigherOrder
20382037
Root (annotated): Value +TestImport.+innerStuffContents
@@ -2042,8 +2041,7 @@ Forward Liveness Analysis
20422041
Root (external ref): VariantCase +Unison.break_.IfNeed
20432042
Root (external ref): Value +DeadTest.+make
20442043
Root (annotated): Value +Records.+testMyRecBsAs
2045-
Root (external ref): Value +DeadTest.+ira
2046-
Root (external ref): Value +DeadTest.+deadIncorrect
2044+
Root (external ref): RecordLabel +DeadTest.inlineRecord.IR.c
20472045
Root (annotated): Value +Records.+origin
20482046
Root (annotated): Value +Variants.+onlySunday
20492047
Root (annotated): Value +Docstrings.+treeU
@@ -2056,9 +2054,9 @@ Forward Liveness Analysis
20562054
Root (annotated): Value +References.+get
20572055
Root (annotated): Value +ModuleAliases.+testNested
20582056
Root (external ref): Value +FirstClassModules.SomeFunctor.+ww
2059-
Root (external ref): VariantCase +DeadTest.WithInclude.t.A
20602057
Root (annotated): Value +ImportJsValue.+area
20612058
Root (annotated): Value +Records.+testMyRec
2059+
Root (annotated): Value +DeadTest.GloobLive.+globallyLive3
20622060
Root (external ref): RecordLabel +Uncurried.auth.login
20632061
Root (annotated): Value +ImportJsValue.+roundedNumber
20642062
Root (external ref): RecordLabel +RepeatedLabel.tabState.a
@@ -2102,10 +2100,12 @@ Forward Liveness Analysis
21022100
Root (annotated): Value +Hooks.RenderPropRequiresConversion.+make
21032101
Root (annotated): Value +LetPrivate.local_1.+x
21042102
Root (annotated): Value +TestImport.+make
2103+
Root (annotated): Value +DeadTest.GloobLive.+globallyLive1
21052104
Root (annotated): Value +Docstrings.+grouped
21062105
Root (annotated): Value +OcamlWarningSuppressToplevel.M.+suppressed4
21072106
Root (annotated): Value +Types.+optFunction
21082107
Root (annotated): Value +Records.+getPayloadRecordPlusOne
2108+
Root (external ref): VariantCase +DeadTest.inlineRecord.IR
21092109
Root (annotated): Value +Types.+swap
21102110
Root (annotated): Value +Types.+jsonStringify
21112111
Root (annotated): RecordLabel +ImportHookDefault.props.person
@@ -2131,7 +2131,6 @@ Forward Liveness Analysis
21312131
Root (annotated): Value +ImportJsValue.+useColor
21322132
Root (annotated): Value +Tuples.+changeSecondAge
21332133
Root (external ref): Value +Unison.+group
2134-
Root (annotated): RecordLabel +DeadTest.inlineRecord.IR.e
21352134
Root (annotated): Value +Docstrings.+unnamed1U
21362135
Root (annotated): Value +Records.+recordValue
21372136
Root (annotated): Value +ImportHookDefault.+make
@@ -2145,8 +2144,8 @@ Forward Liveness Analysis
21452144
Root (annotated): Value +References.+create
21462145
Root (annotated): Value +Types.+currentTime
21472146
Root (annotated): Value +Records.+someBusiness2
2147+
Root (external ref): Value +DeadTest.+ira
21482148
Root (annotated): Value +FirstClassModules.+testConvert
2149-
Root (external ref): RecordLabel +DeadTest.inlineRecord.IR.c
21502149
Root (external ref): RecordLabel +Records.coord.z
21512150
Root (annotated): Value +Types.+someIntList
21522151
Root (annotated): Value +Types.+jsString2T
@@ -2227,6 +2226,7 @@ Forward Liveness Analysis
22272226
Root (annotated): Value +TestModuleAliases.+testInner1Expanded
22282227
Root (external ref): Value +TypeReexport.OnlyReexportedDead.+value
22292228
Root (annotated): Value +ImportIndex.+make
2229+
Root (external ref): RecordLabel +DeadTest.inlineRecord.IR.b
22302230
Root (annotated): Value +Unboxed.+testV1
22312231
Root (annotated): Value +NestedModules.Universe.+theAnswer
22322232
Root (annotated): Value +References.+access
@@ -2238,10 +2238,11 @@ Forward Liveness Analysis
22382238
Root (annotated): Value +References.+update
22392239
Root (annotated): Value +Opaque.+noConversion
22402240
Root (external ref): RecordLabel +RepeatedLabel.tabState.b
2241+
Root (annotated): Value +DeadTest.GloobLive.+globallyLive2
22412242
Root (external ref): RecordLabel +TypeReexport.OnlyReexportedDead.reexportedType.usedField
22422243
Root (annotated): Value +Docstrings.+unitArgWithConversion
2243-
Root (annotated): Value +DeadTest.GloobLive.+globallyLive1
22442244
Root (external ref): RecordLabel +Records.business.owner
2245+
Root (external ref): VariantCase +DeadTest.WithInclude.t.A
22452246
Root (external ref): VariantCase +DeadTypeTest.deadType.InBoth
22462247
Root (external ref): RecordLabel +Records.business.address
22472248
Root (external ref): RecordLabel +VariantsWithPayload.payload.y
@@ -2273,7 +2274,6 @@ Forward Liveness Analysis
22732274
Propagate: DeadTypeTest.deadType.OnlyInInterface -> +DeadTypeTest.deadType.OnlyInInterface
22742275
Propagate: +TypeReexport.UseReexported.reexportedType.usedField -> +TypeReexport.UseReexported.originalType.usedField
22752276
Propagate: +References.+get -> +References.R.+get
2276-
Propagate: +DeadTest.WithInclude.t.A -> +DeadTest.WithInclude.t.A
22772277
Propagate: ErrorHandler.Make.+notify -> +ErrorHandler.Make.+notify
22782278
Propagate: +References.+make -> +References.R.+make
22792279
Propagate: +ScopedAnnotationsLiveVsDead.LiveScope.+root -> +ScopedAnnotationsLiveVsDead.+middleLive
@@ -2297,6 +2297,7 @@ Forward Liveness Analysis
22972297
Propagate: +ImportJsValue.+useGetAbs -> +ImportJsValue.AbsoluteValue.+getAbs
22982298
Propagate: +TypeReexport.VariantUseOriginal.reexportedType.A -> +TypeReexport.VariantUseOriginal.originalType.A
22992299
Propagate: +TypeReexport.OnlyReexportedDead.reexportedType.usedField -> +TypeReexport.OnlyReexportedDead.originalType.usedField
2300+
Propagate: +DeadTest.WithInclude.t.A -> +DeadTest.WithInclude.t.A
23002301
Propagate: +References.R.+get -> +References.R.+get
23012302
Propagate: +References.R.+make -> +References.R.+make
23022303
Propagate: +ScopedAnnotationsLiveVsDead.+middleLive -> +ScopedAnnotationsLiveVsDead.+leafLive
@@ -2499,6 +2500,7 @@ Forward Liveness Analysis
24992500
<- +DeadTest.+make (live)
25002501
Dead Value +DeadTest.+theSideEffectIsLogging
25012502
Dead Value +DeadTest.+stringLengthNoSideEffects
2503+
Dead Value +DeadTest.+breakChangesControlFlow
25022504
Live (annotated) Value +DeadTest.GloobLive.+globallyLive1
25032505
Live (annotated) Value +DeadTest.GloobLive.+globallyLive2
25042506
Live (annotated) Value +DeadTest.GloobLive.+globallyLive3
@@ -3956,7 +3958,7 @@ Forward Liveness Analysis
39563958
Live (annotated) Value +VariantsWithPayload.+testVariant1Object
39573959

39583960
Incorrect Dead Annotation
3959-
DeadTest.res:153:1-28
3961+
DeadTest.res:159:1-28
39603962
deadIncorrect is annotated @dead but is live
39613963

39623964
Warning Dead Module
@@ -4083,12 +4085,16 @@ Forward Liveness Analysis
40834085
DeadTest.res:123:1-54
40844086
stringLengthNoSideEffects is never used and could have side effects
40854087

4088+
Warning Dead Value With Side Effects
4089+
DeadTest.res:125:1-62
4090+
breakChangesControlFlow is never used and could have side effects
4091+
40864092
Warning Dead Type
4087-
DeadTest.res:151:12-17
4093+
DeadTest.res:157:12-17
40884094
rc.a is a record label never used to read a value
40894095

40904096
Warning Dead Type
4091-
DeadTest.res:158:25-30
4097+
DeadTest.res:164:25-30
40924098
inlineRecord.IR.a is a record label never used to read a value
40934099

40944100
Warning Dead Module
@@ -5223,4 +5229,4 @@ Forward Liveness Analysis
52235229
OptArg.res:26:1-70
52245230
optional argument c of function wrapfourArgs is always supplied (2 calls)
52255231

5226-
Analysis reported 317 issues (Incorrect Dead Annotation:1, Warning Dead Exception:2, Warning Dead Module:22, Warning Dead Type:93, Warning Dead Value:179, Warning Dead Value With Side Effects:2, Warning Redundant Optional Argument:6, Warning Unused Argument:12)
5232+
Analysis reported 318 issues (Incorrect Dead Annotation:1, Warning Dead Exception:2, Warning Dead Module:22, Warning Dead Type:93, Warning Dead Value:179, Warning Dead Value With Side Effects:3, Warning Redundant Optional Argument:6, Warning Unused Argument:12)

tests/analysis_tests/tests-reanalyze/deadcode/src/DeadTest.res

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ let theSideEffectIsLogging = Js.log(123)
122122

123123
let stringLengthNoSideEffects = String.length("sdkdl")
124124

125+
let breakChangesControlFlow = {
126+
while true {
127+
break
128+
}
129+
}
130+
125131
// Trace.infok("", "", ({pf}) => pf("%s", ""))
126132

127133
module GloobLive = {

0 commit comments

Comments
 (0)