diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-05-24 23:45:24 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-05-24 23:45:24 +0200 |
commit | 6ff71d8b7fbdf667a2f119a2487302e240961816 (patch) | |
tree | 90e14c4469b447139f22501d5ff942441c90ece8 /src/vim9compile.c | |
parent | f40e51a880a95f94dbbbecc9476559506c2cc345 (diff) | |
download | vim-git-6ff71d8b7fbdf667a2f119a2487302e240961816.tar.gz |
patch 8.2.0820: Vim9: function type isn't set until compiledv8.2.0820
Problem: Vim9: function type isn't set until compiled.
Solution: Set function type early.
Diffstat (limited to 'src/vim9compile.c')
-rw-r--r-- | src/vim9compile.c | 95 |
1 files changed, 47 insertions, 48 deletions
diff --git a/src/vim9compile.c b/src/vim9compile.c index d41dd5396..7d302da83 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -6763,54 +6763,6 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) ufunc->uf_flags |= FC_CLOSURE; } - { - int varargs = ufunc->uf_va_name != NULL; - int argcount = ufunc->uf_args.ga_len; - - // Create a type for the function, with the return type and any - // argument types. - // A vararg is included in uf_args.ga_len but not in uf_arg_types. - // The type is included in "tt_args". - if (argcount > 0 || varargs) - { - ufunc->uf_func_type = alloc_func_type(ufunc->uf_ret_type, - argcount, &ufunc->uf_type_list); - // Add argument types to the function type. - if (func_type_add_arg_types(ufunc->uf_func_type, - argcount + varargs, - &ufunc->uf_type_list) == FAIL) - { - ret = FAIL; - goto erret; - } - ufunc->uf_func_type->tt_argcount = argcount + varargs; - ufunc->uf_func_type->tt_min_argcount = - argcount - ufunc->uf_def_args.ga_len; - if (ufunc->uf_arg_types == NULL) - { - int i; - - // lambda does not have argument types. - for (i = 0; i < argcount; ++i) - ufunc->uf_func_type->tt_args[i] = &t_any; - } - else - mch_memmove(ufunc->uf_func_type->tt_args, - ufunc->uf_arg_types, sizeof(type_T *) * argcount); - if (varargs) - { - ufunc->uf_func_type->tt_args[argcount] = - ufunc->uf_va_type == NULL ? &t_any : ufunc->uf_va_type; - ufunc->uf_func_type->tt_flags = TTFLAG_VARARGS; - } - } - else - // No arguments, can use a predefined type. - ufunc->uf_func_type = get_func_type(ufunc->uf_ret_type, - argcount, &ufunc->uf_type_list); - - } - ret = OK; erret: @@ -6847,6 +6799,53 @@ erret: return ret; } + void +set_function_type(ufunc_T *ufunc) +{ + int varargs = ufunc->uf_va_name != NULL; + int argcount = ufunc->uf_args.ga_len; + + // Create a type for the function, with the return type and any + // argument types. + // A vararg is included in uf_args.ga_len but not in uf_arg_types. + // The type is included in "tt_args". + if (argcount > 0 || varargs) + { + ufunc->uf_func_type = alloc_func_type(ufunc->uf_ret_type, + argcount, &ufunc->uf_type_list); + // Add argument types to the function type. + if (func_type_add_arg_types(ufunc->uf_func_type, + argcount + varargs, + &ufunc->uf_type_list) == FAIL) + return; + ufunc->uf_func_type->tt_argcount = argcount + varargs; + ufunc->uf_func_type->tt_min_argcount = + argcount - ufunc->uf_def_args.ga_len; + if (ufunc->uf_arg_types == NULL) + { + int i; + + // lambda does not have argument types. + for (i = 0; i < argcount; ++i) + ufunc->uf_func_type->tt_args[i] = &t_any; + } + else + mch_memmove(ufunc->uf_func_type->tt_args, + ufunc->uf_arg_types, sizeof(type_T *) * argcount); + if (varargs) + { + ufunc->uf_func_type->tt_args[argcount] = + ufunc->uf_va_type == NULL ? &t_any : ufunc->uf_va_type; + ufunc->uf_func_type->tt_flags = TTFLAG_VARARGS; + } + } + else + // No arguments, can use a predefined type. + ufunc->uf_func_type = get_func_type(ufunc->uf_ret_type, + argcount, &ufunc->uf_type_list); +} + + /* * Delete an instruction, free what it contains. */ |