diff --git a/basis/cpu/x86/32/bootstrap.factor b/basis/cpu/x86/32/bootstrap.factor index d6f1618f70..5eb25fc033 100644 --- a/basis/cpu/x86/32/bootstrap.factor +++ b/basis/cpu/x86/32/bootstrap.factor @@ -253,10 +253,6 @@ IN: bootstrap.x86 : jit-switch-context ( reg -- ) -4 jit-scrub-return - ! Save ds, rs registers - jit-load-vm - jit-save-context - ! Make the new context the current one ctx-reg swap MOV vm-reg vm-context-offset [+] ctx-reg MOV @@ -277,6 +273,10 @@ IN: bootstrap.x86 EDX ds-reg -4 [+] MOV ds-reg 8 SUB + ! Save ds, rs registers + jit-load-vm + jit-save-context + ! Make the new context active EAX jit-switch-context @@ -311,6 +311,8 @@ IN: bootstrap.x86 jit-save-quot-and-param ! Make the new context active + jit-load-vm + jit-save-context EAX jit-switch-context jit-push-param diff --git a/basis/threads/threads-tests.factor b/basis/threads/threads-tests.factor index 01578d4e64..d5e2f806b6 100644 --- a/basis/threads/threads-tests.factor +++ b/basis/threads/threads-tests.factor @@ -1,6 +1,6 @@ -USING: namespaces io tools.test threads kernel +USING: namespaces io tools.test threads threads.private kernel concurrency.combinators concurrency.promises locals math -words calendar sequences ; +words calendar sequences fry ; IN: threads.tests 3 "x" set @@ -59,3 +59,21 @@ yield ! Test system traps inside threads [ ] [ [ dup ] in-thread yield ] unit-test + +! The start-context-and-delete primitive wasn't rewinding the +! callstack properly. + +! This got fixed for x86-64 but the problem remained on x86-32. + +! The unit test asserts that the callstack is empty from the +! quotation passed to start-context-and-delete. + +[ { } ] [ + [ + '[ + _ [ + callstack swap fulfill stop + ] start-context-and-delete + ] in-thread + ] [ ?promise callstack>array ] bi +] unit-test