(loop))))))
(call-with-values (lambda ()
- (let ((level (vm-trace-level vm))
- (hook (vm-next-hook vm)))
+ (let ((level (vm-trace-level vm))
+ (hook (vm-next-hook vm))
+ (prev-vm (thread-vm (current-thread))))
(dynamic-wind
(lambda ()
(set-vm-trace-level! vm (+ level 1))
- (add-hook! hook collect!))
+ (add-hook! hook collect!)
+ (set-thread-vm! (current-thread) vm))
(lambda ()
(vm-apply vm thunk '()))
(lambda ()
+ (set-thread-vm! (current-thread) prev-vm)
(set-vm-trace-level! vm level)
(remove-hook! hook collect!)))))
(lambda args
#:use-module (system vm coverage)
#:use-module (system vm vm)
#:use-module (system base compile)
+ #:use-module (system foreign)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-11))
(lambda () (+ 1 2)))))
(and (coverage-data? data)
(= 3 result)
- (not (procedure-execution-count data proc)))))))
+ (not (procedure-execution-count data proc))))))
+
+ (pass-if "called from C"
+ ;; The `scm_call_N' functions use the VM returned by `the-vm'. This
+ ;; test makes sure that they get to use %TEST-VM.
+ (let ((proc (code "foo.scm" "(lambda (x y) (+ x y))"))
+ (call (pointer->procedure '*
+ (dynamic-func "scm_call_2"
+ (dynamic-link))
+ '(* * *))))
+ (let-values (((data result)
+ (with-code-coverage %test-vm
+ (lambda ()
+ (call (make-pointer (object-address proc))
+ (make-pointer (object-address 1))
+ (make-pointer (object-address 2)))))))
+ (and (coverage-data? data)
+ (= (object-address 3) (pointer-address result))
+ (= (procedure-execution-count data proc) 1))))))
\f
(with-test-prefix "instrumented-source-files"