]> granicus.if.org Git - vim/commitdiff
patch 8.2.2527: Vim9: lambda return type is not determined at script level v8.2.2527
authorBram Moolenaar <Bram@vim.org>
Wed, 17 Feb 2021 16:00:27 +0000 (17:00 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 17 Feb 2021 16:00:27 +0000 (17:00 +0100)
Problem:    Vim9: lambda return type is not determined at script level.
Solution:   Compile the lambda to get the return type. (closes #7843)

src/eval.c
src/testdir/test_vim9_assign.vim
src/version.c
src/vim.h
src/vim9.h

index aae6ee8ffa9fe80388ca2dd74a7e9b958297a9f6..785d8417a46731ff417ac71fb0e5413858a094ea 100644 (file)
@@ -3421,7 +3421,17 @@ eval7(
      */
     case '(':  ret = NOTDONE;
                if (in_vim9script())
+               {
                    ret = get_lambda_tv(arg, rettv, TRUE, evalarg);
+                   if (ret == OK && evaluate)
+                   {
+                       ufunc_T *ufunc = rettv->vval.v_partial->pt_func;
+
+                       // compile it here to get the return type
+                       compile_def_function(ufunc,
+                                                TRUE, PROFILING(ufunc), NULL);
+                   }
+               }
                if (ret == NOTDONE)
                {
                    *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
index 7599df2c54c34e8edd2d61f2396da761d31bcaf8..4c63217f26aa443dba155a0713b3c8085101ee97 100644 (file)
@@ -1108,6 +1108,8 @@ def Test_assign_lambda()
       assert_equal(123, FuncRef_Func())
       var FuncRef_Any: any = () => 123
       assert_equal(123, FuncRef_Any())
+      var FuncRef_Number: func(): number = () => 321
+      assert_equal(321, FuncRef_Number())
   END
   CheckScriptSuccess(lines)
 
@@ -1115,8 +1117,7 @@ def Test_assign_lambda()
       var Ref: func(number)
       Ref = (j) => !j
   END
-  CheckDefFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool')
-  CheckScriptFailure(['vim9script'] + lines, 'E1012: Type mismatch; expected func(number) but got func(any): any')
+  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool')
 enddef
 
 def Test_heredoc()
index ea345104d5f36ac452d8429520280ae53ede3244..0fb889621df0fbb8125d8bd01f74eedab429e51f 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2527,
 /**/
     2526,
 /**/
index 73cb2692e63984b97da607814aadc8c62528c146..e27bf8bb7406d934c47f30807c4ad0157a659e98 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -1787,6 +1787,12 @@ typedef struct timeval proftime_T;
 typedef int proftime_T;            // dummy for function prototypes
 #endif
 
+#ifdef FEAT_PROFILE
+# define PROFILING(ufunc) (do_profiling == PROF_YES && (ufunc)->uf_profiling)
+#else
+# define PROFILING(ufunc) FALSE
+#endif
+
 /*
  * When compiling with 32 bit Perl time_t is 32 bits in the Perl code but 64
  * bits elsewhere.  That causes memory corruption.  Define time_T and use it
index c2a3916fd742c4a0d0798cc2148ac7522cd78391..1cf4b3c6597d057fd2087e9bfc4cab4610681bfa 100644 (file)
@@ -418,11 +418,9 @@ extern garray_T def_functions;
 #define LNUM_VARIABLE_RANGE_ABOVE -888
 
 #ifdef FEAT_PROFILE
-# define PROFILING(ufunc) (do_profiling == PROF_YES && (ufunc)->uf_profiling)
 # define INSTRUCTIONS(dfunc) \
        ((do_profiling == PROF_YES && (dfunc->df_ufunc)->uf_profiling) \
        ? (dfunc)->df_instr_prof : (dfunc)->df_instr)
 #else
-# define PROFILING(ufunc) FALSE
 # define INSTRUCTIONS(dfunc) ((dfunc)->df_instr)
 #endif