Patch 9.0.1624
Problem: Crash when calling object constructor from legacy script. (Israel
Chauca Fuentes)
Solution: Pass a pointer for "ufunc". (closes #12502)
Files: src/userfunc.c, src/structs.h, src/testdir/test_vim9_class.vim
*** ../vim-9.0.1623/src/userfunc.c 2023-06-04 18:11:31.998816728 +0100
--- src/userfunc.c 2023-06-10 16:23:25.011096640 +0100
***************
*** 3666,3671 ****
--- 3666,3674 ----
if (partial != NULL)
fp = partial->pt_func;
if (fp == NULL)
+ fp = funcexe->fe_ufunc;
+
+ if (fp == NULL)
{
// Make a copy of the name, if it comes from a funcref variable it
// could be changed or deleted in the called function.
***************
*** 4161,4168 ****
if (lv.ll_ufunc != NULL)
{
! *ufunc = lv.ll_ufunc;
name = vim_strsave(lv.ll_ufunc->uf_name);
goto theend;
}
--- 4164,4173 ----
if (lv.ll_ufunc != NULL)
{
! if (ufunc != NULL)
! *ufunc = lv.ll_ufunc;
name = vim_strsave(lv.ll_ufunc->uf_name);
+ *pp = end;
goto theend;
}
***************
*** 5915,5921 ****
char_u *name,
char_u **arg,
char_u *startarg,
! funcexe_T *funcexe_init,
evalarg_T *evalarg)
{
linenr_T lnum;
--- 5920,5926 ----
char_u *name,
char_u **arg,
char_u *startarg,
! funcexe_T *funcexe_init,
evalarg_T *evalarg)
{
linenr_T lnum;
***************
*** 6204,6209 ****
--- 6209,6215 ----
int len;
int failed = FALSE;
funcdict_T fudi;
+ ufunc_T *ufunc = NULL;
partial_T *partial = NULL;
evalarg_T evalarg;
type_T *type = NULL;
***************
*** 6227,6233 ****
}
tofree = trans_function_name_ext(&arg, NULL, FALSE, TFN_INT,
! &fudi, &partial, vim9script ? &type : NULL, NULL);
if (fudi.fd_newkey != NULL)
{
// Still need to give an error message for missing key.
--- 6233,6239 ----
}
tofree = trans_function_name_ext(&arg, NULL, FALSE, TFN_INT,
! &fudi, &partial, vim9script ? &type : NULL, &ufunc);
if (fudi.fd_newkey != NULL)
{
// Still need to give an error message for missing key.
***************
*** 6275,6280 ****
--- 6281,6287 ----
CLEAR_FIELD(funcexe);
funcexe.fe_check_type = type;
+ funcexe.fe_ufunc = ufunc;
funcexe.fe_partial = partial;
funcexe.fe_selfdict = fudi.fd_dict;
funcexe.fe_firstline = eap->line1;
*** ../vim-9.0.1623/src/structs.h 2023-05-27 22:22:06.458633197 +0100
--- src/structs.h 2023-06-10 16:08:27.310608810 +0100
***************
*** 2184,2190 ****
linenr_T fe_lastline; // last line of range
int *fe_doesrange; // if not NULL: return: function
handled range
int fe_evaluate; // actually evaluate expressions
! partial_T *fe_partial; // for extra arguments
dict_T *fe_selfdict; // Dictionary for "self"
object_T *fe_object; // object, e.g. for "this.Func()"
typval_T *fe_basetv; // base for base->method()
--- 2184,2192 ----
linenr_T fe_lastline; // last line of range
int *fe_doesrange; // if not NULL: return: function
handled range
int fe_evaluate; // actually evaluate expressions
! ufunc_T *fe_ufunc; // function to be called, when NULL lookup by
! // name
! partial_T *fe_partial; // for "dict" and extra arguments
dict_T *fe_selfdict; // Dictionary for "self"
object_T *fe_object; // object, e.g. for "this.Func()"
typval_T *fe_basetv; // base for base->method()
*** ../vim-9.0.1623/src/testdir/test_vim9_class.vim 2023-06-05
16:53:20.817489906 +0100
--- src/testdir/test_vim9_class.vim 2023-06-10 16:25:59.043062525 +0100
***************
*** 1767,1772 ****
--- 1767,1795 ----
v9.CheckScriptSuccess(lines)
enddef
+ def Test_call_constructor_from_legacy()
+ var lines =<< trim END
+ vim9script
+
+ var newCalled = 'false'
+
+ class A
+ def new()
+ newCalled = 'true'
+ enddef
+ endclass
+
+ export def F(options = {}): any
+ return A
+ enddef
+
+ g:p = F()
+ legacy call p.new()
+ assert_equal('true', newCalled)
+ END
+ v9.CheckScriptSuccess(lines)
+ enddef
+
def Test_defer_with_object()
var lines =<< trim END
vim9script
*** ../vim-9.0.1623/src/version.c 2023-06-09 21:00:55.972056565 +0100
--- src/version.c 2023-06-10 16:26:42.963050003 +0100
***************
*** 697,698 ****
--- 697,700 ----
{ /* Add new patch number below this line */
+ /**/
+ 1624,
/**/
--
hundred-and-one symptoms of being an internet addict:
144. You eagerly await the update of the "Cool Site of the Day."
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/20230610154542.C48EC1C0642%40moolenaar.net.