USING: compiler.cfg.instructions compiler.cfg.write-barrier tools.test ; IN: compiler.cfg.write-barrier.tests ! Do need a write barrier on a random store. [ V{ T{ ##peek f 1 } T{ ##set-slot f 2 1 3 } T{ ##write-barrier f 1 3 } } ] [ V{ T{ ##peek f 1 } T{ ##set-slot f 2 1 3 } T{ ##write-barrier f 1 3 } } write-barriers-step ] unit-test [ V{ T{ ##peek f 1 } T{ ##set-slot-imm f 2 1 } T{ ##write-barrier-imm f 1 } } ] [ V{ T{ ##peek f 1 } T{ ##set-slot-imm f 2 1 } T{ ##write-barrier-imm f 1 } } write-barriers-step ] unit-test ! Don't need a write barrier on freshly allocated objects. [ V{ T{ ##allot f 1 } T{ ##set-slot f 2 1 3 } } ] [ V{ T{ ##allot f 1 } T{ ##set-slot f 2 1 3 } T{ ##write-barrier f 1 3 } } write-barriers-step ] unit-test [ V{ T{ ##allot f 1 } T{ ##set-slot-imm f 2 1 } } ] [ V{ T{ ##allot f 1 } T{ ##set-slot-imm f 2 1 } T{ ##write-barrier-imm f 1 } } write-barriers-step ] unit-test ! Do need a write barrier if there's a subroutine call between ! the allocation and the store. [ V{ T{ ##allot f 1 } T{ ##box } T{ ##set-slot f 2 1 3 } T{ ##write-barrier f 1 3 } } ] [ V{ T{ ##allot f 1 } T{ ##box } T{ ##set-slot f 2 1 3 } T{ ##write-barrier f 1 3 } } write-barriers-step ] unit-test [ V{ T{ ##allot f 1 } T{ ##box } T{ ##set-slot-imm f 2 1 } T{ ##write-barrier-imm f 1 } } ] [ V{ T{ ##allot f 1 } T{ ##box } T{ ##set-slot-imm f 2 1 } T{ ##write-barrier-imm f 1 } } write-barriers-step ] unit-test ! ##copy instructions [ V{ T{ ##copy f 2 1 } T{ ##set-slot-imm f 3 1 } T{ ##write-barrier-imm f 2 } } ] [ V{ T{ ##copy f 2 1 } T{ ##set-slot-imm f 3 1 } T{ ##write-barrier-imm f 2 } } write-barriers-step ] unit-test [ V{ T{ ##copy f 2 1 } T{ ##set-slot-imm f 3 2 } T{ ##write-barrier-imm f 1 } } ] [ V{ T{ ##copy f 2 1 } T{ ##set-slot-imm f 3 2 } T{ ##write-barrier-imm f 1 } } write-barriers-step ] unit-test [ V{ T{ ##copy f 2 1 } T{ ##copy f 3 2 } T{ ##set-slot-imm f 3 1 } T{ ##write-barrier-imm f 2 } } ] [ V{ T{ ##copy f 2 1 } T{ ##copy f 3 2 } T{ ##set-slot-imm f 3 1 } T{ ##write-barrier-imm f 2 } } write-barriers-step ] unit-test [ V{ T{ ##copy f 2 1 } T{ ##copy f 3 2 } T{ ##set-slot-imm f 4 1 } T{ ##write-barrier-imm f 3 } } ] [ V{ T{ ##copy f 2 1 } T{ ##copy f 3 2 } T{ ##set-slot-imm f 4 1 } T{ ##write-barrier-imm f 3 } } write-barriers-step ] unit-test