]> granicus.if.org Git - vim/commitdiff
patch 8.2.4716: memory allocation failure not tested when defining a function v8.2.4716
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sat, 9 Apr 2022 10:09:07 +0000 (11:09 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 9 Apr 2022 10:09:07 +0000 (11:09 +0100)
Problem:    Memory allocation failure not tested when defining a function.
Solution:   Add a test. (Yegappan Lakshmanan, closes #10127)

src/alloc.c
src/alloc.h
src/proto/alloc.pro
src/testdir/test_user_func.vim
src/testdir/test_vim9_func.vim
src/userfunc.c
src/version.c

index 9547d67192886d393740d12d9416ec740b65f4f4..5218d0046577a91641501845ca19e69612b594c1 100644 (file)
@@ -719,6 +719,20 @@ ga_grow(garray_T *gap, int n)
     return OK;
 }
 
+/*
+ * Same as ga_grow() but uses an allocation id for testing.
+ */
+    int
+ga_grow_id(garray_T *gap, int n, alloc_id_T id UNUSED)
+{
+#ifdef FEAT_EVAL
+    if (alloc_fail_id == id && alloc_does_fail(sizeof(list_T)))
+       return FAIL;
+#endif
+
+    return ga_grow(gap, n);
+}
+
     int
 ga_grow_inner(garray_T *gap, int n)
 {
index 58ae25c14461361ce8be9fcc514ba5b618dd5739..651e01f2418a1bb888e5a3755c0901a012086ea2 100644 (file)
@@ -44,5 +44,6 @@ typedef enum {
     aid_newwin_wvars,
     aid_newtabpage_tvars,
     aid_blob_alloc,
+    aid_get_func,
     aid_last
 } alloc_id_T;
index 18281adaaf8779c97aaeae3effabef7b856ff624..b605f28a516d1e88372699113e2b938ce7a5a133 100644 (file)
@@ -19,6 +19,7 @@ int ga_copy_strings(garray_T *from, garray_T *to);
 void ga_init(garray_T *gap);
 void ga_init2(garray_T *gap, size_t itemsize, int growsize);
 int ga_grow(garray_T *gap, int n);
+int ga_grow_id(garray_T *gap, int n, alloc_id_T id UNUSED);
 int ga_grow_inner(garray_T *gap, int n);
 char_u *ga_concat_strings(garray_T *gap, char *sep);
 int ga_copy_string(garray_T *gap, char_u *p);
index 6eb8a0f3305c985d34c814c14f8ee2b9975adb70..f6e25e3b5a075d76882cb46ded6bb249f2b18a42 100644 (file)
@@ -499,4 +499,34 @@ func Test_func_range()
   bwipe!
 endfunc
 
+" Test for memory allocation failure when defining a new function
+func Test_funcdef_alloc_failure()
+  new
+  let lines =<< trim END
+    func Xtestfunc()
+      return 321
+    endfunc
+  END
+  call setline(1, lines)
+  call test_alloc_fail(GetAllocId('get_func'), 0, 0)
+  call assert_fails('source', 'E342:')
+  call assert_false(exists('*Xtestfunc'))
+  call assert_fails('delfunc Xtestfunc', 'E117:')
+  %d _
+  let lines =<< trim END
+    def g:Xvim9func(): number
+      return 456
+    enddef
+  END
+  call setline(1, lines)
+  call test_alloc_fail(GetAllocId('get_func'), 0, 0)
+  call assert_fails('source', 'E342:')
+  call assert_false(exists('*Xvim9func'))
+  "call test_alloc_fail(GetAllocId('get_func'), 0, 0)
+  "call assert_fails('source', 'E342:')
+  "call assert_false(exists('*Xtestfunc'))
+  "call assert_fails('delfunc Xtestfunc', 'E117:')
+  bw!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 06168e477e13333858f9660f676941066c77e80d..9287ed5f33cf261529e7510e98dfbbfe021a0b4b 100644 (file)
@@ -4071,6 +4071,22 @@ def Test_go_beyond_end_of_cmd()
   v9.CheckScriptFailure(lines, 'E476:')
 enddef
 
+" Test for memory allocation failure when defining a new lambda
+func Test_lambda_allocation_failure()
+  new
+  let lines =<< trim END
+    vim9script
+    g:Xlambda = (x): number => {
+        return x + 1
+      }
+  END
+  call setline(1, lines)
+  call test_alloc_fail(GetAllocId('get_func'), 0, 0)
+  call assert_fails('source', 'E342:')
+  call assert_false(exists('g:Xlambda'))
+  bw!
+endfunc
+
 " The following messes up syntax highlight, keep near the end.
 if has('python3')
   def Test_python3_command()
index c80a49051ce2932796ee546f0dbf64a4b6791451..7ad338856fab72a8d31f5e41d785f9d0535a2bef 100644 (file)
@@ -1092,7 +1092,7 @@ get_function_body(
        }
 
        // Add the line to the function.
-       if (ga_grow(newlines, 1 + sourcing_lnum_off) == FAIL)
+       if (ga_grow_id(newlines, 1 + sourcing_lnum_off, aid_get_func) == FAIL)
            goto theend;
 
        if (heredoc_concat_len > 0)
index 5ffcdeb54d662302c06651866a62ce01e136fbcc..f8f15ad9fbc6f3b9b68dfc3ce391e394f2fef837 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4716,
 /**/
     4715,
 /**/