patch 9.1.0560: bindtextdomain() does not indicate an error

Commit: 
https://github.com/vim/vim/commit/8252ef134f5a57e8a07b66ce79068c262a6386d8
Author: Christ van Willegen <cvwille...@gmail.com>
Date:   Thu Jul 11 21:36:21 2024 +0200

    patch 9.1.0560: bindtextdomain() does not indicate an error
    
    Problem:  bindtextdomain() does not indicate an error
              (after v9.1.509)
    Solution: return false on failure (OOM).
              (Chris van Willegen)
    
    closes: #15116
    
    Signed-off-by: Christ van Willegen <cvwille...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index f3baf2470..96d774e7e 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -68,7 +68,7 @@ balloon_gettext()             String  current text in the 
balloon
 balloon_show({expr})           none    show {expr} inside the balloon
 balloon_split({msg})           List    split {msg} as used for a balloon
 bindtextdomain({package}, {path})
-                               none    bind text domain to specied path
+                               Bool    bind text domain to specified path
 blob2list({blob})              List    convert {blob} into a list of numbers
 browse({save}, {title}, {initdir}, {default})
                                String  put up a file requester
@@ -1228,7 +1228,10 @@ bindtextdomain({package}, {path})                        
*bindtextdomain()*
                translations for a package.  {path} is the directory name
                for the translations. See |package-translation|.
 
-               Return type: none
+               Returns v:true on success and v:false on failure (out of
+               memory).
+
+               Return type: |vim9-boolean|
 
 blob2list({blob})                                      *blob2list()*
                Return a List containing the number value of each byte in Blob
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 370b26bd8..7e3241037 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1827,7 +1827,7 @@ static funcentry_T global_functions[] =
 #endif
                        },
     {"bindtextdomain", 2, 2, 0,            arg2_string,
-                       ret_void,           f_bindtextdomain},
+                       ret_bool,           f_bindtextdomain},
     {"blob2list",      1, 1, FEARG_1,      arg1_blob,
                        ret_list_number,    f_blob2list},
     {"browse",         4, 4, 0,            arg4_browse,
@@ -3486,8 +3486,11 @@ get_buf_arg(typval_T *arg)
  * "bindtextdomain(package, path)" function
  */
     static void
-f_bindtextdomain(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+f_bindtextdomain(typval_T *argvars, typval_T *rettv)
 {
+    rettv->v_type = VAR_BOOL;
+    rettv->vval.v_number = VVAL_TRUE;
+
     if (check_for_nonempty_string_arg(argvars, 0) == FAIL
            || check_for_nonempty_string_arg(argvars, 1) == FAIL)
        return;
@@ -3495,7 +3498,13 @@ f_bindtextdomain(typval_T *argvars UNUSED, typval_T 
*rettv UNUSED)
     if (strcmp((const char *)argvars[0].vval.v_string, VIMPACKAGE) == 0)
        semsg(_(e_invalid_argument_str), tv_get_string(&argvars[0]));
     else
-       bindtextdomain((const char *)argvars[0].vval.v_string, (const char 
*)argvars[1].vval.v_string);
+    {
+       if (bindtextdomain((const char *)argvars[0].vval.v_string, (const char 
*)argvars[1].vval.v_string) == NULL)
+       {
+           do_outofmem_msg((long)0);
+           rettv->vval.v_number = VVAL_FALSE;
+       }
+    }
 
     return;
 }
diff --git a/src/testdir/test_gettext.vim b/src/testdir/test_gettext.vim
index 6a5aafdfe..a990121a8 100644
--- a/src/testdir/test_gettext.vim
+++ b/src/testdir/test_gettext.vim
@@ -1,5 +1,7 @@
 source check.vim
 
+CheckFeature gettext
+
 " Test for gettext()
 func Test_gettext()
   call assert_fails('call bindtextdomain("test")', 'E119:')
diff --git a/src/testdir/test_gettext_cp1251.vim 
b/src/testdir/test_gettext_cp1251.vim
index c91f7848a..69d2bbf4c 100644
--- a/src/testdir/test_gettext_cp1251.vim
+++ b/src/testdir/test_gettext_cp1251.vim
@@ -2,22 +2,32 @@ source check.vim
 " This fail on CI MacOS 14 because bindtextdomain() is not available there
 " (missing library?)
 CheckNotMac
+CheckFeature gettext
 
 " Test for gettext()
 func Test_gettext()
   set encoding=cp1251
-  call bindtextdomain("__PACKAGE__", getcwd())
-  try
-    language messages ru_RU
-    call assert_equal('呜攘世: ', gettext("ERROR: ", "__PACKAGE__"))
-  catch /^Vim\%(( \+)\)\=:E197:/
-    throw "Skipped: not possible to set locale to ru (missing?)"
-  endtry
+  call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+
   try
-    language messages en_GB.UTF-8
-    call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
-  catch /^Vim\%(( \+)\)\=:E197:/
-    throw "Skipped: not possible to set locale to en (missing?)"
+    call assert_true(bindtextdomain("__PACKAGE__", getcwd()))
+
+    try
+      language messages ru_RU
+      call assert_equal('呜攘世: ', gettext("ERROR: ", "__PACKAGE__"))
+    catch /^Vim\%(( \+)\)\=:E197:/
+      throw "Skipped: not possible to set locale to ru (missing?)"
+    endtry
+
+    try
+      language messages en_GB.UTF-8
+      call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+    catch /^Vim\%(( \+)\)\=:E197:/
+      throw "Skipped: not possible to set locale to en (missing?)"
+    endtry
+
+  catch /^Vim\%(( \+)\)\=:E342:/
+    throw "Skipped: out of memory executing bindtextdomain()"
   endtry
   set encoding&
 endfunc
diff --git a/src/testdir/test_gettext_utf8.vim 
b/src/testdir/test_gettext_utf8.vim
index 7862e39e0..b96f8ea8e 100644
--- a/src/testdir/test_gettext_utf8.vim
+++ b/src/testdir/test_gettext_utf8.vim
@@ -2,22 +2,32 @@ source check.vim
 " This fail on CI MacOS 14 because bindtextdomain() is not available there
 " (missing library?)
 CheckNotMac
+CheckFeature gettext
 
 " Test for gettext()
 func Test_gettext()
   set encoding=utf-8
-  call bindtextdomain("__PACKAGE__", getcwd())
-  try
-    language messages ru_RU
-    call assert_equal('袨楔袠袘袣袗: ', gettext("ERROR: ", "__PACKAGE__"))
-  catch /^Vim\%(( \+)\)\=:E197:/
-    throw "Skipped: not possible to set locale to ru (missing?)"
-  endtry
+  call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+
   try
-    language messages en_GB.UTF-8
-    call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
-  catch /^Vim\%(( \+)\)\=:E197:/
-    throw "Skipped: not possible to set locale to en (missing?)"
+    call assert_true(bindtextdomain("__PACKAGE__", getcwd()))
+
+    try
+      language messages ru_RU
+      call assert_equal('袨楔袠袘袣袗: ', gettext("ERROR: ", "__PACKAGE__"))
+    catch /^Vim\%(( \+)\)\=:E197:/
+      throw "Skipped: not possible to set locale to ru (missing?)"
+    endtry
+
+    try
+      language messages en_GB.UTF-8
+      call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+    catch /^Vim\%(( \+)\)\=:E197:/
+      throw "Skipped: not possible to set locale to en (missing?)"
+    endtry
+
+  catch /^Vim\%(( \+)\)\=:E342:/
+    throw "Skipped: out of memory executing bindtextdomain()"
   endtry
   set encoding&
 endfunc
diff --git a/src/version.c b/src/version.c
index cc2713aa0..ddb02d1ee 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    560,
 /**/
     559,
 /**/
diff --git a/src/vim.h b/src/vim.h
index 1b64e0dd9..ae7458ad7 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -598,7 +598,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 # ifdef bindtextdomain
 #  undef bindtextdomain
 # endif
-# define bindtextdomain(x, y) // empty
+# define bindtextdomain(x, y) ""
 # ifdef bind_textdomain_codeset
 #  undef bind_textdomain_codeset
 # endif

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1sRzix-000NOK-IV%40256bit.org.

Raspunde prin e-mail lui