erlang: register/whereis, Phase 5 complete (+12 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -597,6 +597,10 @@
|
||||
(= name "monitor") (er-bif-monitor vs)
|
||||
(= name "demonitor") (er-bif-demonitor vs)
|
||||
(= name "process_flag") (er-bif-process-flag vs)
|
||||
(= name "register") (er-bif-register vs)
|
||||
(= name "unregister") (er-bif-unregister vs)
|
||||
(= name "whereis") (er-bif-whereis vs)
|
||||
(= name "registered") (er-bif-registered vs)
|
||||
(= name "throw") (raise (er-mk-throw-marker (er-bif-arg1 vs "throw")))
|
||||
(= name "error") (raise (er-mk-error-marker (er-bif-arg1 vs "error")))
|
||||
:else (error
|
||||
@@ -966,6 +970,8 @@
|
||||
(reduce str "" out)))))
|
||||
|
||||
;; ── send: Pid ! Msg ──────────────────────────────────────────────
|
||||
;; Target may be a pid or a registered atom name. Atom resolution
|
||||
;; goes through the scheduler's `:registered` table.
|
||||
(define
|
||||
er-eval-send
|
||||
(fn
|
||||
@@ -973,18 +979,36 @@
|
||||
(let
|
||||
((to-val (er-eval-expr (get node :to) env))
|
||||
(msg-val (er-eval-expr (get node :msg) env)))
|
||||
(if
|
||||
(not (er-pid? to-val))
|
||||
(error "Erlang: '!': target is not a pid")
|
||||
(do
|
||||
(let
|
||||
((pid (er-resolve-send-target to-val)))
|
||||
(when
|
||||
(er-proc-exists? pid)
|
||||
(er-proc-mailbox-push! pid msg-val)
|
||||
(when
|
||||
(er-proc-exists? to-val)
|
||||
(er-proc-mailbox-push! to-val msg-val)
|
||||
(when
|
||||
(= (er-proc-field to-val :state) "waiting")
|
||||
(er-proc-set! to-val :state "runnable")
|
||||
(er-sched-enqueue! to-val)))
|
||||
msg-val)))))
|
||||
(= (er-proc-field pid :state) "waiting")
|
||||
(er-proc-set! pid :state "runnable")
|
||||
(er-sched-enqueue! pid)))
|
||||
msg-val))))
|
||||
|
||||
(define
|
||||
er-resolve-send-target
|
||||
(fn
|
||||
(v)
|
||||
(cond
|
||||
(er-pid? v) v
|
||||
(er-atom? v)
|
||||
(let
|
||||
((name (get v :name)))
|
||||
(if
|
||||
(dict-has? (er-registered) name)
|
||||
(get (er-registered) name)
|
||||
(raise
|
||||
(er-mk-error-marker
|
||||
(er-mk-tuple
|
||||
(list (er-mk-atom "badarg") v))))))
|
||||
:else (raise
|
||||
(er-mk-error-marker
|
||||
(er-mk-tuple (list (er-mk-atom "badarg") v)))))))
|
||||
|
||||
;; ── receive (selective, delimited-continuation suspension) ──────
|
||||
(define
|
||||
|
||||
Reference in New Issue
Block a user