proxy [ThreadLocal] via thread-parameter; clojure.test/*testing-vars*
- (proxy [ThreadLocal] [] (initialValue [] body)) now builds a real per-thread store backed by a Chez thread-parameter, with a lazy initialValue; .get/.set/ .remove work. Other proxies stay nil. test.check's no-seed PRNG (next-rng) uses one, so gen/sample and gen/generate (and everything built on them) now work. - clojure.test/*testing-vars* (+ *report-counters*) are bound vars now, so a defspec run through its :test metadata / default reporter doesn't hit an unbound var. make test green (+1 corpus row), shakesmoke byte-identical. One re-mint (proxy).
This commit is contained in:
parent
f32bd335e3
commit
4d61145e9c
6 changed files with 587 additions and 558 deletions
|
|
@ -697,6 +697,22 @@
|
|||
(def-var! "clojure.core" "__register-class-methods!"
|
||||
(lambda (tag members) (register-tagged-methods! tag (jmap->static-alist members)) jolt-nil))
|
||||
|
||||
;; java.lang.ThreadLocal via a Chez thread-parameter: real per-thread storage with
|
||||
;; a lazy initialValue (the proxy macro lowers (proxy [ThreadLocal] …) to this).
|
||||
;; .get returns the thread's value, computing initialValue once; .set / .remove.
|
||||
(define tl-unset (list 'tl-unset))
|
||||
(define (jolt-make-thread-local init-thunk)
|
||||
(make-jhost "threadlocal" (vector (make-thread-parameter tl-unset) init-thunk)))
|
||||
(register-host-methods! "threadlocal"
|
||||
(list (cons "get" (lambda (self)
|
||||
(let* ((st (jhost-state self)) (tp (vector-ref st 0)) (v (tp)))
|
||||
(if (eq? v tl-unset)
|
||||
(let ((nv (jolt-invoke (vector-ref st 1)))) (tp nv) nv)
|
||||
v))))
|
||||
(cons "set" (lambda (self v) ((vector-ref (jhost-state self) 0) v) jolt-nil))
|
||||
(cons "remove" (lambda (self) ((vector-ref (jhost-state self) 0) tl-unset) jolt-nil))))
|
||||
(def-var! "jolt.host" "make-thread-local" jolt-make-thread-local)
|
||||
|
||||
;; Pluggable instance? — a library registers (fn [class-name-string val] -> true
|
||||
;; | false | nil); nil means "not my class, fall through". First non-nil wins.
|
||||
(define user-instance-checks '())
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue