]> gitweb.factorcode.org Git - factor.git/commitdiff
cpu.x86.32: commit 05ba77262afe897bc67e1b26084d7c8b36a0e847 only fixed the start...
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 23 Aug 2010 02:30:54 +0000 (19:30 -0700)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 23 Aug 2010 02:30:54 +0000 (19:30 -0700)
basis/cpu/x86/32/bootstrap.factor
basis/threads/threads-tests.factor

index d6f1618f7072c41d24d1ccffe107cd1e79869f33..5eb25fc033d6e20ed244670651364779d66a3706 100644 (file)
@@ -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
index 01578d4e64a8767e49918de6d1d81b1d46496874..d5e2f806b6e98f7c3bf6489c4e2c1ea633430e30 100644 (file)
@@ -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.
+
+[ { } ] [
+    <promise> [
+        '[
+            _ [
+                callstack swap fulfill stop
+            ] start-context-and-delete
+        ] in-thread
+    ] [ ?promise callstack>array ] bi
+] unit-test