File 1951-stdlib-Resolve-ETS-table-id-from-name-only-once-per-.patch of Package erlang
From 0cde97c6227ea18c2f88ceb0004a4dac5bd600c4 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Thu, 8 Jan 2026 17:34:36 +0100
Subject: [PATCH 1/3] stdlib: Resolve ETS table id from name only once per
function call
---
lib/stdlib/src/dets.erl | 24 +++++++++++++++++-------
lib/stdlib/src/ets.erl | 26 +++++++++++++++-----------
2 files changed, 32 insertions(+), 18 deletions(-)
diff --git a/lib/stdlib/src/dets.erl b/lib/stdlib/src/dets.erl
index 7f2e382a83..786d422960 100644
--- a/lib/stdlib/src/dets.erl
+++ b/lib/stdlib/src/dets.erl
@@ -478,7 +478,12 @@ calling process.
EtsTab :: ets:table(),
Reason :: term().
-from_ets(DTab, ETab) ->
+from_ets(DTab, ETabArg) ->
+ ETab = case ensure_ets_tid(ETabArg) of
+ undefined ->
+ error(badarg, [DTab, ETabArg]);
+ ERef -> ERef
+ end,
ets:safe_fixtable(ETab, true),
Spec = ?PATTERN_TO_OBJECT_MATCH_SPEC('_'),
LC = ets:select(ETab, Spec, 100),
@@ -1508,15 +1513,20 @@ of the ETS table are kept unless overwritten.
EtsTab :: ets:table(),
Reason :: term().
-to_ets(DTab, ETab) ->
- case ets:info(ETab, protection) of
+to_ets(DTab, ETabArg) ->
+ case ensure_ets_tid(ETabArg) of
undefined ->
- erlang:error(badarg, [DTab, ETab]);
- _ ->
- Fun = fun(X, T) -> true = ets:insert(T, X), T end,
- foldl(Fun, ETab, DTab)
+ erlang:error(badarg, [DTab, ETabArg]);
+ ETab ->
+ Fun = fun(X, _) -> true = ets:insert(ETab, X), ETabArg end,
+ foldl(Fun, ETabArg, DTab)
end.
+ensure_ets_tid(EtsTabName) when is_atom(EtsTabName) ->
+ ets:whereis(EtsTabName);
+ensure_ets_tid(EtsTid) ->
+ EtsTid.
+
-doc """
Applies `Fun` to each object stored in table `Name` in some unspecified order.
Different actions are taken depending on the return value of `Fun`. The
diff --git a/lib/stdlib/src/ets.erl b/lib/stdlib/src/ets.erl
index 4f92e3cf05..d50cd43073 100644
--- a/lib/stdlib/src/ets.erl
+++ b/lib/stdlib/src/ets.erl
@@ -2217,7 +2217,8 @@ for duplicated objects stored in tables of type `bag`.
Arg :: 'read' | 'close',
Res :: 'end_of_input' | {Objects :: [term()], InitFun} | term().
-init_table(Table, Fun) ->
+init_table(TableArg, Fun) ->
+ Table = soft_whereis(TableArg),
ets:delete_all_objects(Table),
init_table_continue(Table, Fun(read)).
@@ -2334,8 +2335,16 @@ written to the disk before `tab2file` returns. Defaults to `{sync, false}`.
ExtInfo :: 'md5sum' | 'object_count',
Reason :: term().
-tab2file(Table, File, Options) ->
+tab2file(TabArg, File, Options) ->
try
+ Info0 = case ets:info(TabArg) of
+ undefined ->
+ throw(badtab);
+ I ->
+ I
+ end,
+ {id, Table} = lists:keyfind(id, 1, Info0),
+
{ok, FtOptions} = parse_ft_options(Options),
_ = file:delete(File),
case file:read_file_info(File) of
@@ -2351,13 +2360,6 @@ tab2file(Table, File, Options) ->
throw(Reason)
end,
try
- Info0 = case ets:info(Table) of
- undefined ->
- %% erlang:error(badarg, [Table, File, Options]);
- throw(badtab);
- I ->
- I
- end,
Info = [list_to_tuple(Info0 ++
[{major_version,?MAJOR_F2T_VERSION},
{minor_version,?MINOR_F2T_VERSION},
@@ -3134,7 +3136,8 @@ identical information is returned for the two query handles.
TraverseMethod :: 'first_next' | 'last_prev'
| 'select' | {'select', MatchSpec :: match_spec()}.
-table(Table, Opts) ->
+table(TableArg, Opts) ->
+ Table = soft_whereis(TableArg),
case options(Opts, [traverse, n_objects]) of
{badarg,_} ->
erlang:error(badarg, [Table, Opts]);
@@ -3339,7 +3342,8 @@ i(Table, Height) ->
-doc false.
-spec i(table(), pos_integer(), pos_integer()) -> 'ok'.
-i(Table, Height, Width) ->
+i(TableArg, Height, Width) ->
+ Table = soft_whereis(TableArg),
First = ets:first(Table),
display_items(Height, Width, Table, First, 1, 1).
--
2.51.0