@@ -823,11 +823,18 @@ export class GC {
823
823
this . scavengePointersFirst ( c + 8 , ptrs ) ;
824
824
return ( 1 + ptrs + non_ptrs ) << 3 ;
825
825
}
826
+ case ClosureTypes . MUT_VAR_CLEAN : {
827
+ this . scavengeClosureAt ( c + rtsConstants . offset_StgMutVar_var ) ;
828
+ return rtsConstants . offset_StgMutVar_var + 8 ;
829
+ }
830
+ case ClosureTypes . MUT_VAR_DIRTY : {
831
+ this . memory . i64Store ( c , this . symbolTable [ "stg_MUT_VAR_CLEAN_info" ] ) ;
832
+ this . scavengeClosureAt ( c + rtsConstants . offset_StgMutVar_var ) ;
833
+ return rtsConstants . offset_StgMutVar_var + 8 ;
834
+ }
826
835
case ClosureTypes . CONSTR :
827
836
case ClosureTypes . CONSTR_NOCAF :
828
837
case ClosureTypes . BLACKHOLE :
829
- case ClosureTypes . MUT_VAR_CLEAN :
830
- case ClosureTypes . MUT_VAR_DIRTY :
831
838
case ClosureTypes . PRIM :
832
839
case ClosureTypes . MUT_PRIM :
833
840
case ClosureTypes . COMPACT_NFDATA : {
@@ -917,8 +924,14 @@ export class GC {
917
924
this . scavengeClosureAt ( c + rtsConstants . offset_StgIndStatic_indirectee ) ;
918
925
return ; // size not important, this object won't be moved
919
926
}
920
- case ClosureTypes . MVAR_CLEAN :
927
+ case ClosureTypes . MVAR_CLEAN : {
928
+ this . scavengeClosureAt ( c + rtsConstants . offset_StgMVar_head ) ;
929
+ this . scavengeClosureAt ( c + rtsConstants . offset_StgMVar_tail ) ;
930
+ this . scavengeClosureAt ( c + rtsConstants . offset_StgMVar_value ) ;
931
+ return rtsConstants . offset_StgMVar_value + 8 ;
932
+ }
921
933
case ClosureTypes . MVAR_DIRTY : {
934
+ this . memory . i64Store ( c , this . symbolTable [ "stg_MVAR_CLEAN_info" ] ) ;
922
935
this . scavengeClosureAt ( c + rtsConstants . offset_StgMVar_head ) ;
923
936
this . scavengeClosureAt ( c + rtsConstants . offset_StgMVar_tail ) ;
924
937
this . scavengeClosureAt ( c + rtsConstants . offset_StgMVar_value ) ;
@@ -936,8 +949,6 @@ export class GC {
936
949
) ;
937
950
}
938
951
case ClosureTypes . MUT_ARR_PTRS_CLEAN :
939
- case ClosureTypes . MUT_ARR_PTRS_DIRTY :
940
- case ClosureTypes . MUT_ARR_PTRS_FROZEN_DIRTY :
941
952
case ClosureTypes . MUT_ARR_PTRS_FROZEN_CLEAN : {
942
953
const ptrs = Number (
943
954
this . memory . i64Load ( c + rtsConstants . offset_StgMutArrPtrs_ptrs )
@@ -948,6 +959,28 @@ export class GC {
948
959
) ;
949
960
return rtsConstants . sizeof_StgMutArrPtrs + ( ptrs << 3 ) ;
950
961
}
962
+ case ClosureTypes . MUT_ARR_PTRS_DIRTY : {
963
+ this . memory . i64Store ( c , this . symbolTable [ "stg_MUT_ARR_PTRS_CLEAN_info" ] ) ;
964
+ const ptrs = Number (
965
+ this . memory . i64Load ( c + rtsConstants . offset_StgMutArrPtrs_ptrs )
966
+ ) ;
967
+ this . scavengePointersFirst (
968
+ c + rtsConstants . offset_StgMutArrPtrs_payload ,
969
+ ptrs
970
+ ) ;
971
+ return rtsConstants . sizeof_StgMutArrPtrs + ( ptrs << 3 ) ;
972
+ }
973
+ case ClosureTypes . MUT_ARR_PTRS_FROZEN_DIRTY : {
974
+ this . memory . i64Store ( c , this . symbolTable [ "stg_MUT_ARR_PTRS_FROZEN_CLEAN_info" ] ) ;
975
+ const ptrs = Number (
976
+ this . memory . i64Load ( c + rtsConstants . offset_StgMutArrPtrs_ptrs )
977
+ ) ;
978
+ this . scavengePointersFirst (
979
+ c + rtsConstants . offset_StgMutArrPtrs_payload ,
980
+ ptrs
981
+ ) ;
982
+ return rtsConstants . sizeof_StgMutArrPtrs + ( ptrs << 3 ) ;
983
+ }
951
984
case ClosureTypes . WEAK : {
952
985
this . scavengeClosureAt ( c + rtsConstants . offset_StgWeak_cfinalizers ) ;
953
986
this . scavengeClosureAt ( c + rtsConstants . offset_StgWeak_key ) ;
@@ -956,10 +989,12 @@ export class GC {
956
989
return rtsConstants . offset_StgWeak_link + 8 ;
957
990
}
958
991
case ClosureTypes . TSO : {
992
+ this . memory . i32Store ( c + rtsConstants . offset_StgTSO_dirty , 0 ) ;
959
993
this . scavengeClosureAt ( c + rtsConstants . offset_StgTSO_stackobj ) ;
960
994
return ; // size not important, this object won't be moved
961
995
}
962
996
case ClosureTypes . STACK : {
997
+ this . memory . i32Store ( c + rtsConstants . offset_StgStack_dirty , 0 ) ;
963
998
const
964
999
stack_size =
965
1000
this . memory . i32Load ( c + rtsConstants . offset_StgStack_stack_size ) << 3 ,
@@ -969,8 +1004,6 @@ export class GC {
969
1004
return rtsConstants . offset_StgStack_stack + stack_size ;
970
1005
}
971
1006
case ClosureTypes . SMALL_MUT_ARR_PTRS_CLEAN :
972
- case ClosureTypes . SMALL_MUT_ARR_PTRS_DIRTY :
973
- case ClosureTypes . SMALL_MUT_ARR_PTRS_FROZEN_DIRTY :
974
1007
case ClosureTypes . SMALL_MUT_ARR_PTRS_FROZEN_CLEAN : {
975
1008
const ptrs = Number (
976
1009
this . memory . i64Load ( c + rtsConstants . offset_StgSmallMutArrPtrs_ptrs )
@@ -981,6 +1014,28 @@ export class GC {
981
1014
) ;
982
1015
return rtsConstants . offset_StgSmallMutArrPtrs_payload + ( ptrs << 3 ) ;
983
1016
}
1017
+ case ClosureTypes . SMALL_MUT_ARR_PTRS_DIRTY : {
1018
+ this . memory . i64Store ( c , this . symbolTable [ "stg_SMALL_MUT_ARR_PTRS_CLEAN_info" ] ) ;
1019
+ const ptrs = Number (
1020
+ this . memory . i64Load ( c + rtsConstants . offset_StgSmallMutArrPtrs_ptrs )
1021
+ ) ;
1022
+ this . scavengePointersFirst (
1023
+ c + rtsConstants . offset_StgSmallMutArrPtrs_payload ,
1024
+ ptrs
1025
+ ) ;
1026
+ return rtsConstants . offset_StgSmallMutArrPtrs_payload + ( ptrs << 3 ) ;
1027
+ }
1028
+ case ClosureTypes . SMALL_MUT_ARR_PTRS_FROZEN_DIRTY : {
1029
+ this . memory . i64Store ( c , this . symbolTable [ "stg_SMALL_MUT_ARR_PTRS_FROZEN_CLEAN_info" ] ) ;
1030
+ const ptrs = Number (
1031
+ this . memory . i64Load ( c + rtsConstants . offset_StgSmallMutArrPtrs_ptrs )
1032
+ ) ;
1033
+ this . scavengePointersFirst (
1034
+ c + rtsConstants . offset_StgSmallMutArrPtrs_payload ,
1035
+ ptrs
1036
+ ) ;
1037
+ return rtsConstants . offset_StgSmallMutArrPtrs_payload + ( ptrs << 3 ) ;
1038
+ }
984
1039
default :
985
1040
throw new WebAssembly . RuntimeError ( ) ;
986
1041
}
0 commit comments