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

openSUSE Build Service is sponsored by