1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-11 06:20:23 +02:00

Add current-thread VM op

* libguile/vm-engine.c (current-thread): New op.
* module/language/cps/effects-analysis.scm (&thread): New memory kind.

* module/language/cps/compile-bytecode.scm (compile-function):
* module/language/cps/effects-analysis.scm (current-thread):
* module/language/cps/types.scm (current-thread):
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
* module/system/vm/assembler.scm (emit-current-thread): Wire up the new
  op.
This commit is contained in:
Andy Wingo 2015-11-27 16:32:14 +01:00
parent c3240d09b2
commit 8c75a5eb1b
6 changed files with 38 additions and 2 deletions

View file

@ -3468,7 +3468,20 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
NEXT (3); NEXT (3);
} }
VM_DEFINE_OP (160, unused_160, NULL, NOP) /* current-thread dst:24
*
* Write the current thread into DST.
*/
VM_DEFINE_OP (160, current_thread, "current-thread", OP1 (X8_S24) | OP_DST)
{
scm_t_uint32 dst;
UNPACK_24 (op, dst);
SP_SET (dst, thread->handle);
NEXT (1);
}
VM_DEFINE_OP (161, unused_161, NULL, NOP) VM_DEFINE_OP (161, unused_161, NULL, NOP)
VM_DEFINE_OP (162, unused_162, NULL, NOP) VM_DEFINE_OP (162, unused_162, NULL, NOP)
VM_DEFINE_OP (163, unused_163, NULL, NOP) VM_DEFINE_OP (163, unused_163, NULL, NOP)

View file

@ -140,6 +140,8 @@
(emit-make-closure asm (from-sp dst) k nfree)) (emit-make-closure asm (from-sp dst) k nfree))
(($ $primcall 'current-module) (($ $primcall 'current-module)
(emit-current-module asm (from-sp dst))) (emit-current-module asm (from-sp dst)))
(($ $primcall 'current-thread)
(emit-current-thread asm (from-sp dst)))
(($ $primcall 'cached-toplevel-box (scope name bound?)) (($ $primcall 'cached-toplevel-box (scope name bound?))
(emit-cached-toplevel-box asm (from-sp dst) (emit-cached-toplevel-box asm (from-sp dst)
(constant scope) (constant name) (constant scope) (constant name)

View file

@ -62,6 +62,7 @@
&module &module
&struct &struct
&string &string
&thread
&bytevector &bytevector
&closure &closure
@ -170,6 +171,9 @@
;; Indicates that an expression depends on the current module. ;; Indicates that an expression depends on the current module.
&module &module
;; Indicates that an expression depends on the current thread.
&thread
;; Indicates that an expression depends on the value of a struct ;; Indicates that an expression depends on the value of a struct
;; field. The effect field indicates the specific field, or zero for ;; field. The effect field indicates the specific field, or zero for
;; an unknown field. ;; an unknown field.
@ -285,6 +289,12 @@ is or might be a read or a write to the same location as A."
((push-fluid f v) (&write-object &fluid) &type-check) ((push-fluid f v) (&write-object &fluid) &type-check)
((pop-fluid) (&write-object &fluid) &type-check)) ((pop-fluid) (&write-object &fluid) &type-check))
;; Threads. Calls cause &all-effects, which reflects the fact that any
;; call can capture a partial continuation and reinstate it on another
;; thread.
(define-primitive-effects
((current-thread) (&read-object &thread)))
;; Prompts. ;; Prompts.
(define-primitive-effects (define-primitive-effects
((make-prompt-tag #:optional arg) (&allocate &unknown-memory-kinds))) ((make-prompt-tag #:optional arg) (&allocate &unknown-memory-kinds)))

View file

@ -547,6 +547,16 @@ minimum, and maximum."
((pop-fluid))) ((pop-fluid)))
;;;
;;; Threads. We don't currently track threads as an object type.
;;;
(define-simple-types
((current-thread) &all-types))
;;; ;;;

View file

@ -83,7 +83,7 @@
current-module define! current-module define!
fluid-ref fluid-set! with-fluid* current-thread fluid-ref fluid-set! with-fluid*
call-with-prompt call-with-prompt
abort-to-prompt* abort-to-prompt abort-to-prompt* abort-to-prompt

View file

@ -116,6 +116,7 @@
emit-unwind emit-unwind
(emit-push-fluid* . emit-push-fluid) (emit-push-fluid* . emit-push-fluid)
emit-pop-fluid emit-pop-fluid
emit-current-thread
(emit-fluid-ref* . emit-fluid-ref) (emit-fluid-ref* . emit-fluid-ref)
(emit-fluid-set* . emit-fluid-set) (emit-fluid-set* . emit-fluid-set)
(emit-string-length* . emit-string-length) (emit-string-length* . emit-string-length)