: 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
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
jit-save-quot-and-param
! Make the new context active
+ jit-load-vm
+ jit-save-context
EAX jit-switch-context
jit-push-param
-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
! 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.
+
+[ { } ] [
+ <promise> [
+ '[
+ _ [
+ callstack swap fulfill stop
+ ] start-context-and-delete
+ ] in-thread
+ ] [ ?promise callstack>array ] bi
+] unit-test