From 8e53a619ea956fde28d03a559241f5fd4dcacdca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=81=C4=99picki?= Date: Mon, 22 Apr 2024 20:08:29 +0200 Subject: [PATCH 1/4] Expose getting process dictionary value for specific key in Process.info/2 This functionality is present since OTP 26.2: https://github.com/erlang/otp/pull/7707 --- lib/elixir/lib/process.ex | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/elixir/lib/process.ex b/lib/elixir/lib/process.ex index 387f28463fd..c98cdce7b42 100644 --- a/lib/elixir/lib/process.ex +++ b/lib/elixir/lib/process.ex @@ -826,6 +826,9 @@ defmodule Process do @spec flag(pid, :save_calls, 0..10000) :: 0..10000 defdelegate flag(pid, flag, value), to: :erlang, as: :process_flag + @type process_info_item :: atom | {:dictionary, term} + @type process_info_result_item :: {process_info_item, term} + @doc """ Returns information about the process identified by `pid`, or returns `nil` if the process is not alive. @@ -834,7 +837,7 @@ defmodule Process do See `:erlang.process_info/1` for more information. """ - @spec info(pid) :: keyword | nil + @spec info(pid) :: [process_info_result_item] | nil def info(pid) do nilify(:erlang.process_info(pid)) end @@ -845,7 +848,8 @@ defmodule Process do See `:erlang.process_info/2` for more information. """ - @spec info(pid, atom | [atom]) :: {atom, term} | [{atom, term}] | nil + @spec info(pid, process_info_item | [process_info_item]) :: + process_info_result_item | [process_info_result_item] | nil def info(pid, spec) def info(pid, :registered_name) do @@ -856,6 +860,10 @@ defmodule Process do end end + def info(pid, {:dictionary, key}) do + nilify(:erlang.process_info(pid, {:dictionary, key})) + end + def info(pid, spec) when is_atom(spec) or is_list(spec) do nilify(:erlang.process_info(pid, spec)) end From 7c9e2dc6cf28c7efd166995aa9321abc911de07d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=81=C4=99picki?= Date: Mon, 22 Apr 2024 21:28:04 +0200 Subject: [PATCH 2/4] Revert the change to info/1 spec --- lib/elixir/lib/process.ex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/elixir/lib/process.ex b/lib/elixir/lib/process.ex index c98cdce7b42..8a58d24719e 100644 --- a/lib/elixir/lib/process.ex +++ b/lib/elixir/lib/process.ex @@ -826,9 +826,6 @@ defmodule Process do @spec flag(pid, :save_calls, 0..10000) :: 0..10000 defdelegate flag(pid, flag, value), to: :erlang, as: :process_flag - @type process_info_item :: atom | {:dictionary, term} - @type process_info_result_item :: {process_info_item, term} - @doc """ Returns information about the process identified by `pid`, or returns `nil` if the process is not alive. @@ -837,11 +834,14 @@ defmodule Process do See `:erlang.process_info/1` for more information. """ - @spec info(pid) :: [process_info_result_item] | nil + @spec info(pid) :: keyword | nil def info(pid) do nilify(:erlang.process_info(pid)) end + @type process_info_item :: atom | {:dictionary, term} + @type process_info_result_item :: {process_info_item, term} + @doc """ Returns information about the process identified by `pid`, or returns `nil` if the process is not alive. From 16ae690c569171a2999352855442967c9f2a1d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=81=C4=99picki?= Date: Mon, 22 Apr 2024 21:29:13 +0200 Subject: [PATCH 3/4] Remove guard from Process.info/2 We can rely on better ArgumentError messages on newer OTP --- lib/elixir/lib/process.ex | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/elixir/lib/process.ex b/lib/elixir/lib/process.ex index 8a58d24719e..5fdba8bf36e 100644 --- a/lib/elixir/lib/process.ex +++ b/lib/elixir/lib/process.ex @@ -860,11 +860,7 @@ defmodule Process do end end - def info(pid, {:dictionary, key}) do - nilify(:erlang.process_info(pid, {:dictionary, key})) - end - - def info(pid, spec) when is_atom(spec) or is_list(spec) do + def info(pid, spec) do nilify(:erlang.process_info(pid, spec)) end From 03549370cea2af326e05ab6fb84d0eecd1379480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=81=C4=99picki?= Date: Mon, 22 Apr 2024 22:21:16 +0200 Subject: [PATCH 4/4] Improve Process.info/2 spec by defining it for two non overlaping clauses --- lib/elixir/lib/process.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/elixir/lib/process.ex b/lib/elixir/lib/process.ex index 5fdba8bf36e..387a52a727a 100644 --- a/lib/elixir/lib/process.ex +++ b/lib/elixir/lib/process.ex @@ -848,8 +848,8 @@ defmodule Process do See `:erlang.process_info/2` for more information. """ - @spec info(pid, process_info_item | [process_info_item]) :: - process_info_result_item | [process_info_result_item] | nil + @spec info(pid, process_info_item) :: process_info_result_item | nil + @spec info(pid, [process_info_item]) :: [process_info_result_item] | nil def info(pid, spec) def info(pid, :registered_name) do