diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-12-20 15:04:29 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-12-20 15:04:29 +0000 |
commit | dc7c366f3aae65ee691010b08f37acfb26e0742b (patch) | |
tree | 90d12bd3030048100a9c5084474aef484f6fc58f /src | |
parent | a99fb23842f055c511bfe1b62de7bbd14d5a99c0 (diff) |
patch 8.2.3860: Vim9: codecov struggles with the file sizev8.2.3860
Problem: Vim9: codecov struggles with the file size.
Solution: Split vim9compile.c into four files.
Diffstat (limited to 'src')
-rw-r--r-- | src/Make_ami.mak | 3 | ||||
-rw-r--r-- | src/Make_cyg_ming.mak | 9 | ||||
-rw-r--r-- | src/Make_mvc.mak | 12 | ||||
-rw-r--r-- | src/Make_vms.mms | 20 | ||||
-rw-r--r-- | src/Makefile | 52 | ||||
-rw-r--r-- | src/proto.h | 5 | ||||
-rw-r--r-- | src/proto/vim9cmds.pro | 33 | ||||
-rw-r--r-- | src/proto/vim9compile.pro | 24 | ||||
-rw-r--r-- | src/proto/vim9expr.pro | 17 | ||||
-rw-r--r-- | src/proto/vim9instr.pro | 72 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9.h | 208 | ||||
-rw-r--r-- | src/vim9cmds.c | 2274 | ||||
-rw-r--r-- | src/vim9compile.c | 7655 | ||||
-rw-r--r-- | src/vim9execute.c | 8 | ||||
-rw-r--r-- | src/vim9expr.c | 2893 | ||||
-rw-r--r-- | src/vim9instr.c | 2208 | ||||
-rw-r--r-- | src/vim9script.c | 3 |
18 files changed, 7888 insertions, 7610 deletions
diff --git a/src/Make_ami.mak b/src/Make_ami.mak index 12f7fe5571..dd674dc616 100644 --- a/src/Make_ami.mak +++ b/src/Make_ami.mak @@ -180,8 +180,11 @@ SRC += \ userfunc.c \ version.c \ viminfo.c \ + vim9cmds.c \ vim9compile.c \ vim9execute.c \ + vim9expr.c \ + vim9instr.c \ vim9script.c \ vim9type.c \ window.c \ diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak index fe04cb57ac..d9a50d243b 100644 --- a/src/Make_cyg_ming.mak +++ b/src/Make_cyg_ming.mak @@ -825,8 +825,11 @@ OBJ = \ $(OUTDIR)/usercmd.o \ $(OUTDIR)/userfunc.o \ $(OUTDIR)/version.o \ + $(OUTDIR)/vim9cmds.o \ $(OUTDIR)/vim9compile.o \ $(OUTDIR)/vim9execute.o \ + $(OUTDIR)/vim9expr.o \ + $(OUTDIR)/vim9instr.o \ $(OUTDIR)/vim9script.o \ $(OUTDIR)/vim9type.o \ $(OUTDIR)/viminfo.o \ @@ -1203,10 +1206,16 @@ $(OUTDIR)/netbeans.o: netbeans.c $(INCL) version.h $(OUTDIR)/version.o: version.c $(INCL) version.h +$(OUTDIR)/vim9cmds.o: vim9cmds.c $(INCL) version.h + $(OUTDIR)/vim9compile.o: vim9compile.c $(INCL) version.h $(OUTDIR)/vim9execute.o: vim9execute.c $(INCL) version.h +$(OUTDIR)/vim9expr.o: vim9expr.c $(INCL) version.h + +$(OUTDIR)/vim9instr.o: vim9instr.c $(INCL) version.h + $(OUTDIR)/vim9script.o: vim9script.c $(INCL) version.h $(OUTDIR)/vim9type.o: vim9type.c $(INCL) version.h diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 2417d77270..f2a45a0af8 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -842,8 +842,11 @@ OBJ = \ $(OUTDIR)\undo.obj \ $(OUTDIR)\usercmd.obj \ $(OUTDIR)\userfunc.obj \ + $(OUTDIR)\vim9cmds.obj \ $(OUTDIR)\vim9compile.obj \ $(OUTDIR)\vim9execute.obj \ + $(OUTDIR)\vim9expr.obj \ + $(OUTDIR)\vim9instr.obj \ $(OUTDIR)\vim9script.obj \ $(OUTDIR)\vim9type.obj \ $(OUTDIR)\viminfo.obj \ @@ -1834,10 +1837,16 @@ $(OUTDIR)/userfunc.obj: $(OUTDIR) userfunc.c $(INCL) $(OUTDIR)/version.obj: $(OUTDIR) version.c $(INCL) version.h +$(OUTDIR)/vim9cmds.obj: $(OUTDIR) vim9cmds.c $(INCL) + $(OUTDIR)/vim9compile.obj: $(OUTDIR) vim9compile.c $(INCL) $(OUTDIR)/vim9execute.obj: $(OUTDIR) vim9execute.c $(INCL) +$(OUTDIR)/vim9expr.obj: $(OUTDIR) vim9expr.c $(INCL) + +$(OUTDIR)/vim9instr.obj: $(OUTDIR) vim9instr.c $(INCL) + $(OUTDIR)/vim9script.obj: $(OUTDIR) vim9script.c $(INCL) $(OUTDIR)/vim9type.obj: $(OUTDIR) vim9type.c $(INCL) @@ -2041,8 +2050,11 @@ proto.h: \ proto/undo.pro \ proto/usercmd.pro \ proto/userfunc.pro \ + proto/vim9cmds.pro \ proto/vim9compile.pro \ proto/vim9execute.pro \ + proto/vim9expr.pro \ + proto/vim9instr.pro \ proto/vim9script.pro \ proto/vim9type.pro \ proto/viminfo.pro \ diff --git a/src/Make_vms.mms b/src/Make_vms.mms index ab5be44905..54aa4c3a72 100644 --- a/src/Make_vms.mms +++ b/src/Make_vms.mms @@ -2,7 +2,7 @@ # Makefile for Vim on OpenVMS # # Maintainer: Zoltan Arpadffy <arpadffy@polarhome.com> -# Last change: 2021 Nov 19 +# Last change: 2021 Dec 20 # # This script has been tested on VMS 6.2 to 8.4 on DEC Alpha, VAX and IA64 # with MMS and MMK @@ -410,8 +410,11 @@ SRC = \ usercmd.c \ userfunc.c \ version.c \ + vim9cmds.c \ vim9compile.c \ vim9execute.c \ + vim9expr.c \ + vim9instr.c \ vim9script.c \ vim9type.c \ viminfo.c \ @@ -531,8 +534,11 @@ OBJ = \ usercmd.obj \ userfunc.obj \ version.obj \ + vim9cmds.obj \ vim9compile.obj \ vim9execute.obj \ + vim9expr.obj \ + vim9instr.obj \ vim9script.obj \ vim9type.obj \ viminfo.obj \ @@ -1112,6 +1118,10 @@ viminfo.obj : viminfo.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ errors.h globals.h version.h +vim9cmds.obj : vim9cmds.c vim.h [.auto]config.h feature.h os_unix.h \ + ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ + gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ + errors.h globals.h version.h vim9compile.obj : vim9compile.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ @@ -1120,6 +1130,14 @@ vim9execute.obj : vim9execute.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ errors.h globals.h version.h +vim9expr.obj : vim9expr.c vim.h [.auto]config.h feature.h os_unix.h \ + ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ + gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ + errors.h globals.h version.h +vim9instr.obj : vim9instr.c vim.h [.auto]config.h feature.h os_unix.h \ + ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ + gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ + errors.h globals.h version.h vim9script.obj : vim9script.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ diff --git a/src/Makefile b/src/Makefile index 8e87d1d7c9..4acc370d09 100644 --- a/src/Makefile +++ b/src/Makefile @@ -368,7 +368,7 @@ CClink = $(CC) #CONF_OPT_GUI = --enable-gui=gtk2 --disable-gtktest #CONF_OPT_GUI = --enable-gui=gnome2 #CONF_OPT_GUI = --enable-gui=gnome2 --disable-gtktest -#CONF_OPT_GUI = --enable-gui=gtk3 +CONF_OPT_GUI = --enable-gui=gtk3 #CONF_OPT_GUI = --enable-gui=gtk3 --disable-gtktest #CONF_OPT_GUI = --enable-gui=motif #CONF_OPT_GUI = --enable-gui=motif --with-motif-lib="-static -lXm -shared" @@ -404,7 +404,7 @@ CClink = $(CC) # Use --with-luajit if you want to use LuaJIT instead of Lua. # Set PATH environment variable to find lua or luajit executable. # This requires at least "normal" features, "tiny" and "small" don't work. -#CONF_OPT_LUA = --enable-luainterp +CONF_OPT_LUA = --enable-luainterp #CONF_OPT_LUA = --enable-luainterp=dynamic #CONF_OPT_LUA = --enable-luainterp --with-luajit #CONF_OPT_LUA = --enable-luainterp=dynamic --with-luajit @@ -433,7 +433,7 @@ CClink = $(CC) # When you get an error for a missing "perl.exp" file, try creating an empty # one: "touch perl.exp". # This requires at least "normal" features, "tiny" and "small" don't work. -#CONF_OPT_PERL = --enable-perlinterp +CONF_OPT_PERL = --enable-perlinterp #CONF_OPT_PERL = --enable-perlinterp=dynamic # PYTHON @@ -453,7 +453,7 @@ CClink = $(CC) #CONF_OPT_PYTHON = --enable-pythoninterp #CONF_OPT_PYTHON = --enable-pythoninterp --with-python-command=python2.7 #CONF_OPT_PYTHON = --enable-pythoninterp=dynamic -#CONF_OPT_PYTHON3 = --enable-python3interp +CONF_OPT_PYTHON3 = --enable-python3interp #CONF_OPT_PYTHON3 = --enable-python3interp --with-python3-command=python3.6 #CONF_OPT_PYTHON3 = --enable-python3interp=dynamic @@ -462,7 +462,7 @@ CClink = $(CC) # First one for static linking, second one for loading when used. # Debian package is "ruby-dev". # This requires at least "normal" features, "tiny" and "small" don't work. -#CONF_OPT_RUBY = --enable-rubyinterp +CONF_OPT_RUBY = --enable-rubyinterp #CONF_OPT_RUBY = --enable-rubyinterp=dynamic #CONF_OPT_RUBY = --enable-rubyinterp --with-ruby-command=ruby1.9.1 @@ -470,13 +470,13 @@ CClink = $(CC) # Uncomment this when you want to include the Tcl interface. # First one is for static linking, second one for dynamic loading. # Debian package is "tcl-dev". -#CONF_OPT_TCL = --enable-tclinterp +CONF_OPT_TCL = --enable-tclinterp #CONF_OPT_TCL = --enable-tclinterp=dynamic #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4 # CSCOPE # Uncomment this when you want to include the Cscope interface. -#CONF_OPT_CSCOPE = --enable-cscope +CONF_OPT_CSCOPE = --enable-cscope # NETBEANS - NetBeans interface. Only works with Motif, GTK, and gnome. # Motif version must have XPM libraries (see |netbeans-xpm|). @@ -548,7 +548,7 @@ CClink = $(CC) #CONF_OPT_FEAT = --with-features=small #CONF_OPT_FEAT = --with-features=normal #CONF_OPT_FEAT = --with-features=big -#CONF_OPT_FEAT = --with-features=huge +CONF_OPT_FEAT = --with-features=huge # COMPILED BY - For including a specific e-mail address for ":version". #CONF_OPT_COMPBY = "--with-compiledby=John Doe <JohnDoe@yahoo.com>" @@ -623,7 +623,7 @@ CClink = $(CC) # Note: If you use -Wextra and get warnings in GTK code about function # parameters, you can add -Wno-cast-function-type (but not with clang) #CFLAGS = -g -Wall -Wextra -Wshadow -Wmissing-prototypes -Wunreachable-code -Wno-cast-function-type -Wno-deprecated-declarations -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -#CFLAGS = -g -Wall -Wextra -Wshadow -Wmissing-prototypes -Wunreachable-code -Wno-deprecated-declarations -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 +CFLAGS = -g -Wall -Wextra -Wshadow -Wmissing-prototypes -Wunreachable-code -Wno-deprecated-declarations -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 # Add -Wpedantic to find // comments and other C99 constructs. # Better disable Perl and Python to avoid a lot of warnings. #CFLAGS = -g -Wall -Wextra -Wshadow -Wmissing-prototypes -Wpedantic -Wunreachable-code -Wunused-result -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 @@ -727,12 +727,12 @@ SANITIZER_LIBS = $(SANITIZER_CFLAGS) # Configuration is in the .ccmalloc or ~/.ccmalloc file. # Doesn't work very well, since memory linked to from global variables # (in libraries) is also marked as leaked memory. -#LEAK_CFLAGS = -DEXITFREE +LEAK_CFLAGS = -DEXITFREE #LEAK_LIBS = -lccmalloc # Uncomment this line to have Vim call abort() when an internal error is # detected. Useful when using a tool to find errors. -#ABORT_CFLAGS = -DABORT_ON_INTERNAL_ERROR +ABORT_CFLAGS = -DABORT_ON_INTERNAL_ERROR #################################################### ### Specific systems, check if yours is listed ### {{{ @@ -1695,8 +1695,11 @@ BASIC_SRC = \ usercmd.c \ userfunc.c \ version.c \ + vim9cmds.c, \ vim9compile.c \ vim9execute.c \ + vim9expr.c, \ + vim9instr.c, \ vim9script.c \ vim9type.c \ viminfo.c \ @@ -1848,8 +1851,11 @@ OBJ_COMMON = \ objects/usercmd.o \ objects/userfunc.o \ objects/version.o \ + objects/vim9cmds.o \ objects/vim9compile.o \ objects/vim9execute.o \ + objects/vim9expr.o \ + objects/vim9instr.o \ objects/vim9script.o \ objects/vim9type.o \ objects/viminfo.o \ @@ -2034,8 +2040,11 @@ PRO_AUTO = \ usercmd.pro \ userfunc.pro \ version.pro \ + vim9cmds.pro \ vim9compile.pro \ vim9execute.pro \ + vim9expr.pro \ + vim9instr.pro \ vim9script.pro \ vim9type.pro \ viminfo.pro \ @@ -3575,12 +3584,21 @@ objects/usercmd.o: usercmd.c objects/userfunc.o: userfunc.c $(CCC) -o $@ userfunc.c +objects/vim9cmds.o: vim9cmds.c + $(CCC) -o $@ vim9cmds.c + objects/vim9compile.o: vim9compile.c $(CCC) -o $@ vim9compile.c objects/vim9execute.o: vim9execute.c $(CCC) -o $@ vim9execute.c +objects/vim9expr.o: vim9expr.c + $(CCC) -o $@ vim9expr.c + +objects/vim9instr.o: vim9instr.c + $(CCC) -o $@ vim9instr.c + objects/vim9script.o: vim9script.c $(CCC) -o $@ vim9script.c @@ -4137,6 +4155,10 @@ objects/version.o: version.c vim.h protodef.h auto/config.h feature.h os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ proto.h globals.h errors.h version.h +objects/vim9cmds.o: vim9cmds.c vim.h protodef.h auto/config.h feature.h \ + os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ + proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ + proto.h globals.h errors.h vim9.h objects/vim9compile.o: vim9compile.c vim.h protodef.h auto/config.h feature.h \ os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ @@ -4145,6 +4167,14 @@ objects/vim9execute.o: vim9execute.c vim.h protodef.h auto/config.h feature.h \ os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ proto.h globals.h errors.h vim9.h +objects/vim9expr.o: vim9expr.c vim.h protodef.h auto/config.h feature.h \ + os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ + proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ + proto.h globals.h errors.h vim9.h +objects/vim9instr.o: vim9instr.c vim.h protodef.h auto/config.h feature.h \ + os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ + proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ + proto.h globals.h errors.h vim9.h objects/vim9script.o: vim9script.c vim.h protodef.h auto/config.h feature.h \ os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ diff --git a/src/proto.h b/src/proto.h index 6c26aee38c..d31629e0e1 100644 --- a/src/proto.h +++ b/src/proto.h @@ -212,8 +212,13 @@ void mbyte_im_set_active(int active_arg); # include "version.pro" # include "vim9script.pro" # ifdef FEAT_EVAL +// include vim9.h here, the types defined there are used by function arguments. +# include "vim9.h" +# include "vim9cmds.pro" # include "vim9compile.pro" # include "vim9execute.pro" +# include "vim9expr.pro" +# include "vim9instr.pro" # include "vim9type.pro" # endif # include "window.pro" diff --git a/src/proto/vim9cmds.pro b/src/proto/vim9cmds.pro new file mode 100644 index 0000000000..7529d63d62 --- /dev/null +++ b/src/proto/vim9cmds.pro @@ -0,0 +1,33 @@ +/* vim9cmds.c */ +void free_locals(cctx_T *cctx); +int check_vim9_unlet(char_u *name); +char_u *compile_unletlock(char_u *arg, exarg_T *eap, cctx_T *cctx); +void drop_scope(cctx_T *cctx); +char_u *compile_if(char_u *arg, cctx_T *cctx); +char_u *compile_elseif(char_u *arg, cctx_T *cctx); +char_u *compile_else(char_u *arg, cctx_T *cctx); +char_u *compile_endif(char_u *arg, cctx_T *cctx); +char_u *compile_for(char_u *arg_start, cctx_T *cctx); +char_u *compile_endfor(char_u *arg, cctx_T *cctx); +char_u *compile_while(char_u *arg, cctx_T *cctx); +char_u *compile_endwhile(char_u *arg, cctx_T *cctx); +char_u *compile_continue(char_u *arg, cctx_T *cctx); +char_u *compile_break(char_u *arg, cctx_T *cctx); +char_u *compile_block(char_u *arg, cctx_T *cctx); +void compile_endblock(cctx_T *cctx); +char_u *compile_try(char_u *arg, cctx_T *cctx); +char_u *compile_catch(char_u *arg, cctx_T *cctx); +char_u *compile_finally(char_u *arg, cctx_T *cctx); +char_u *compile_endtry(char_u *arg, cctx_T *cctx); +char_u *compile_throw(char_u *arg, cctx_T *cctx); +char_u *compile_eval(char_u *arg, cctx_T *cctx); +char_u *compile_mult_expr(char_u *arg, int cmdidx, cctx_T *cctx); +char_u *compile_put(char_u *arg, exarg_T *eap, cctx_T *cctx); +char_u *compile_exec(char_u *line_arg, exarg_T *eap, cctx_T *cctx); +char_u *compile_script(char_u *line, cctx_T *cctx); +char_u *compile_substitute(char_u *arg, exarg_T *eap, cctx_T *cctx); +char_u *compile_redir(char_u *line, exarg_T *eap, cctx_T *cctx); +char_u *compile_cexpr(char_u *line, exarg_T *eap, cctx_T *cctx); +char_u *compile_return(char_u *arg, int check_return_type, int legacy, cctx_T *cctx); +int check_global_and_subst(char_u *cmd, char_u *arg); +/* vim: set ft=c : */ diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro index 5910c67d6c..33290d09e7 100644 --- a/src/proto/vim9compile.pro +++ b/src/proto/vim9compile.pro @@ -1,26 +1,30 @@ /* vim9compile.c */ +int lookup_local(char_u *name, size_t len, lvar_T *lvar, cctx_T *cctx); +int arg_exists(char_u *name, size_t len, int *idxp, type_T **type, int *gen_load_outer, cctx_T *cctx); +int script_is_vim9(void); +int script_var_exists(char_u *name, size_t len, cctx_T *cctx); int check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg); -int check_compare_types(exprtype_T type, typval_T *tv1, typval_T *tv2); int need_type(type_T *actual, type_T *expected, int offset, int arg_idx, cctx_T *cctx, int silent, int actual_is_const); -int func_needs_compiling(ufunc_T *ufunc, compiletype_T compile_type); +lvar_T *reserve_local(cctx_T *cctx, char_u *name, size_t len, int isConst, type_T *type); int get_script_item_idx(int sid, char_u *name, int check_writable, cctx_T *cctx); imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx); imported_T *find_imported_in_script(char_u *name, size_t len, int sid); +char_u *may_peek_next_line(cctx_T *cctx, char_u *arg, char_u **nextp); char_u *peek_next_line_from_context(cctx_T *cctx); char_u *next_line_from_context(cctx_T *cctx, int skip_comment); -char_u *to_name_end(char_u *arg, int use_namespace); -char_u *to_name_const_end(char_u *arg); -int get_lambda_tv_and_compile(char_u **arg, typval_T *rettv, int types_optional, evalarg_T *evalarg); -exprtype_T get_compare_type(char_u *p, int *len, int *type_is); -void error_white_both(char_u *op, int len); +int may_get_next_line(char_u *whitep, char_u **arg, cctx_T *cctx); +int may_get_next_line_error(char_u *whitep, char_u **arg, cctx_T *cctx); void fill_exarg_from_cctx(exarg_T *eap, cctx_T *cctx); +int func_needs_compiling(ufunc_T *ufunc, compiletype_T compile_type); int assignment_len(char_u *p, int *heredoc); void vim9_declare_error(char_u *name); -int check_vim9_unlet(char_u *name); -int check_global_and_subst(char_u *cmd, char_u *arg); +int get_var_dest(char_u *name, assign_dest_T *dest, int cmdidx, int *option_scope, int *vimvaridx, type_T **type, cctx_T *cctx); +int compile_lhs(char_u *var_start, lhs_T *lhs, int cmdidx, int heredoc, int oplen, cctx_T *cctx); +int compile_assign_lhs(char_u *var_start, lhs_T *lhs, int cmdidx, int is_decl, int heredoc, int oplen, cctx_T *cctx); +int compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx); +int compile_assign_unlet(char_u *var_start, lhs_T *lhs, int is_assign, type_T *rhs_type, cctx_T *cctx); int compile_def_function(ufunc_T *ufunc, int check_return_type, compiletype_T compile_type, cctx_T *outer_cctx); void set_function_type(ufunc_T *ufunc); -void delete_instr(isn_T *isn); void unlink_def_function(ufunc_T *ufunc); void link_def_function(ufunc_T *ufunc); void free_def_functions(void); diff --git a/src/proto/vim9expr.pro b/src/proto/vim9expr.pro new file mode 100644 index 0000000000..aa8450902d --- /dev/null +++ b/src/proto/vim9expr.pro @@ -0,0 +1,17 @@ +/* vim9expr.c */ +int generate_ppconst(cctx_T *cctx, ppconst_T *ppconst); +void clear_ppconst(ppconst_T *ppconst); +int compile_member(int is_slice, int *keeping_dict, cctx_T *cctx); +int compile_load_scriptvar(cctx_T *cctx, char_u *name, char_u *start, char_u **end, int error); +int compile_load(char_u **arg, char_u *end_arg, cctx_T *cctx, int is_expr, int error); +char_u *to_name_end(char_u *arg, int use_namespace); +char_u *to_name_const_end(char_u *arg); +int get_lambda_tv_and_compile(char_u **arg, typval_T *rettv, int types_optional, evalarg_T *evalarg); +exprtype_T get_compare_type(char_u *p, int *len, int *type_is); +void skip_expr_cctx(char_u **arg, cctx_T *cctx); +int bool_on_stack(cctx_T *cctx); +void error_white_both(char_u *op, int len); +int compile_expr1(char_u **arg, cctx_T *cctx, ppconst_T *ppconst); +int compile_expr0_ext(char_u **arg, cctx_T *cctx, int *is_const); +int compile_expr0(char_u **arg, cctx_T *cctx); +/* vim: set ft=c : */ diff --git a/src/proto/vim9instr.pro b/src/proto/vim9instr.pro new file mode 100644 index 0000000000..4df3af0018 --- /dev/null +++ b/src/proto/vim9instr.pro @@ -0,0 +1,72 @@ +/* vim9instr.c */ +isn_T *generate_instr(cctx_T *cctx, isntype_T isn_type); +isn_T *generate_instr_drop(cctx_T *cctx, isntype_T isn_type, int drop); +isn_T *generate_instr_type(cctx_T *cctx, isntype_T isn_type, type_T *type); +isn_T *generate_instr_debug(cctx_T *cctx); +int may_generate_2STRING(int offset, int tolerant, cctx_T *cctx); +int generate_add_instr(cctx_T *cctx, vartype_T vartype, type_T *type1, type_T *type2, exprtype_T expr_type); +vartype_T operator_type(type_T *type1, type_T *type2); +int generate_two_op(cctx_T *cctx, char_u *op); +int check_compare_types(exprtype_T type, typval_T *tv1, typval_T *tv2); +int generate_COMPARE(cctx_T *cctx, exprtype_T exprtype, int ic); +int generate_2BOOL(cctx_T *cctx, int invert, int offset); +int generate_COND2BOOL(cctx_T *cctx); +int generate_TYPECHECK(cctx_T *cctx, type_T *expected, int offset, int argidx); +int generate_SETTYPE(cctx_T *cctx, type_T *expected); +int generate_tv_PUSH(cctx_T *cctx, typval_T *tv); +int generate_PUSHNR(cctx_T *cctx, varnumber_T number); +int generate_PUSHBOOL(cctx_T *cctx, varnumber_T number); +int generate_PUSHSPEC(cctx_T *cctx, varnumber_T number); +int generate_PUSHF(cctx_T *cctx, float_T fnumber); +int generate_PUSHS(cctx_T *cctx, char_u **str); +int generate_PUSHCHANNEL(cctx_T *cctx, channel_T *channel); +int generate_PUSHJOB(cctx_T *cctx, job_T *job); +int generate_PUSHBLOB(cctx_T *cctx, blob_T *blob); +int generate_PUSHFUNC(cctx_T *cctx, char_u *name, type_T *type); +int generate_GETITEM(cctx_T *cctx, int index, int with_op); +int generate_SLICE(cctx_T *cctx, int count); +int generate_CHECKLEN(cctx_T *cctx, int min_len, int more_OK); +int generate_STORE(cctx_T *cctx, isntype_T isn_type, int idx, char_u *name); +int generate_STOREOUTER(cctx_T *cctx, int idx, int level); +int generate_STORENR(cctx_T *cctx, int idx, varnumber_T value); +int generate_STOREOPT(cctx_T *cctx, isntype_T isn_type, char_u *name, int opt_flags); +int generate_LOAD(cctx_T *cctx, isntype_T isn_type, int idx, char_u *name, type_T *type); +int generate_LOADOUTER(cctx_T *cctx, int idx, int nesting, type_T *type); +int generate_LOADV(cctx_T *cctx, char_u *name, int error); +int generate_UNLET(cctx_T *cctx, isntype_T isn_type, char_u *name, int forceit); +int generate_LOCKCONST(cctx_T *cctx); +int generate_OLDSCRIPT(cctx_T *cctx, isntype_T isn_type, char_u *name, int sid, type_T *type); +int generate_VIM9SCRIPT(cctx_T *cctx, isntype_T isn_type, int sid, int idx, type_T *type); +int generate_NEWLIST(cctx_T *cctx, int count); +int generate_NEWDICT(cctx_T *cctx, int count); +int generate_FUNCREF(cctx_T *cctx, ufunc_T *ufunc); +int generate_NEWFUNC(cctx_T *cctx, char_u *lambda_name, char_u *func_name); +int generate_DEF(cctx_T *cctx, char_u *name, size_t len); +int generate_JUMP(cctx_T *cctx, jumpwhen_T when, int where); +int generate_JUMP_IF_ARG_SET(cctx_T *cctx, int arg_off); +int generate_FOR(cctx_T *cctx, int loop_idx); +int generate_TRYCONT(cctx_T *cctx, int levels, int where); +int generate_BCALL(cctx_T *cctx, int func_idx, int argcount, int method_call); +int generate_LISTAPPEND(cctx_T *cctx); +int generate_BLOBAPPEND(cctx_T *cctx); +int generate_CALL(cctx_T *cctx, ufunc_T *ufunc, int pushed_argcount); +int generate_UCALL(cctx_T *cctx, char_u *name, int argcount); +int generate_PCALL(cctx_T *cctx, int argcount, char_u *name, type_T *type, int at_top); +int generate_STRINGMEMBER(cctx_T *cctx, char_u *name, size_t len); +int generate_ECHO(cctx_T *cctx, int with_white, int count); +int generate_MULT_EXPR(cctx_T *cctx, isntype_T isn_type, int count); +int generate_PUT(cctx_T *cctx, int regname, linenr_T lnum); +int generate_EXEC_copy(cctx_T *cctx, isntype_T isntype, char_u *line); +int generate_EXEC(cctx_T *cctx, isntype_T isntype, char_u *str); +int generate_LEGACY_EVAL(cctx_T *cctx, char_u *line); +int generate_EXECCONCAT(cctx_T *cctx, int count); +int generate_RANGE(cctx_T *cctx, char_u *range); +int generate_UNPACK(cctx_T *cctx, int var_count, int semicolon); +int generate_cmdmods(cctx_T *cctx, cmdmod_T *cmod); +int generate_undo_cmdmods(cctx_T *cctx); +int generate_store_var(cctx_T *cctx, assign_dest_T dest, int opt_flags, int vimvaridx, int scriptvar_idx, int scriptvar_sid, type_T *type, char_u *name); +int generate_store_lhs(cctx_T *cctx, lhs_T *lhs, int instr_count); +void may_generate_prof_end(cctx_T *cctx, int prof_lnum); +void delete_instr(isn_T *isn); +void clear_instr_ga(garray_T *gap); +/* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c index 38c9e0098d..9c24b95f40 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3860, +/**/ 3859, /**/ 3858, diff --git a/src/vim9.h b/src/vim9.h index 99b952fe48..8a243ba7e9 100644 --- a/src/vim9.h +++ b/src/vim9.h @@ -11,6 +11,10 @@ * vim9.h: types and globals used for Vim9 script. */ +#ifdef VMS +# include <float.h> +#endif + typedef enum { ISN_EXEC, // execute Ex command line isn_arg.string ISN_EXECCONCAT, // execute Ex command from isn_arg.number items on stack @@ -502,14 +506,7 @@ struct dfunc_S { #define STACK_FRAME_SIZE 6 -#ifdef DEFINE_VIM9_GLOBALS -// Functions defined with :def are stored in this growarray. -// They are never removed, so that they can be found by index. -// Deleted functions have the df_deleted flag set. -garray_T def_functions = {0, 0, sizeof(dfunc_T), 50, NULL}; -#else extern garray_T def_functions; -#endif // Used for "lnum" when a range is to be taken from the stack. #define LNUM_VARIABLE_RANGE -999 @@ -531,3 +528,200 @@ extern garray_T def_functions; ? (dfunc)->df_instr_debug \ : (dfunc)->df_instr) #endif + +// Structure passed between the compile_expr* functions to keep track of +// constants that have been parsed but for which no code was produced yet. If +// possible expressions on these constants are applied at compile time. If +// that is not possible, the code to push the constants needs to be generated +// before other instructions. +// Using 50 should be more than enough of 5 levels of (). +#define PPSIZE 50 +typedef struct { + typval_T pp_tv[PPSIZE]; // stack of ppconst constants + int pp_used; // active entries in pp_tv[] + int pp_is_const; // all generated code was constants, used for a + // list or dict with constant members +} ppconst_T; + +// values for ctx_skip +typedef enum { + SKIP_NOT, // condition is a constant, produce code + SKIP_YES, // condition is a constant, do NOT produce code + SKIP_UNKNOWN // condition is not a constant, produce code +} skip_T; + +/* + * Chain of jump instructions where the end label needs to be set. + */ +typedef struct endlabel_S endlabel_T; +struct endlabel_S { + endlabel_T *el_next; // chain end_label locations + int el_end_label; // instruction idx where to set end +}; + +/* + * info specific for the scope of :if / elseif / else + */ +typedef struct { + int is_seen_else; + int is_seen_skip_not; // a block was unconditionally executed + int is_had_return; // every block ends in :return + int is_if_label; // instruction idx at IF or ELSEIF + endlabel_T *is_end_label; // instructions to set end label +} ifscope_T; + +/* + * info specific for the scope of :while + */ +typedef struct { + int ws_top_label; // instruction idx at WHILE + endlabel_T *ws_end_label; // instructions to set end +} whilescope_T; + +/* + * info specific for the scope of :for + */ +typedef struct { + int fs_top_label; // instruction idx at FOR + endlabel_T *fs_end_label; // break instructions +} forscope_T; + +/* + * info specific for the scope of :try + */ +typedef struct { + int ts_try_label; // instruction idx at TRY + endlabel_T *ts_end_label; // jump to :finally or :endtry + int ts_catch_label; // instruction idx of last CATCH + int ts_caught_all; // "catch" without argument encountered +} tryscope_T; + +typedef enum { + NO_SCOPE, + IF_SCOPE, + WHILE_SCOPE, + FOR_SCOPE, + TRY_SCOPE, + BLOCK_SCOPE +} scopetype_T; + +/* + * Info for one scope, pointed to by "ctx_scope". + */ +typedef struct scope_S scope_T; +struct scope_S { + scope_T *se_outer; // scope containing this one + scopetype_T se_type; + int se_local_count; // ctx_locals.ga_len before scope + skip_T se_skip_save; // ctx_skip before the block + union { + ifscope_T se_if; + whilescope_T se_while; + forscope_T se_for; + tryscope_T se_try; + } se_u; +}; + +/* + * Entry for "ctx_locals". Used for arguments and local variables. + */ +typedef struct { + char_u *lv_name; + type_T *lv_type; + int lv_idx; // index of the variable on the stack + int lv_from_outer; // nesting level, using ctx_outer scope + int lv_const; // when TRUE cannot be assigned to + int lv_arg; // when TRUE this is an argument +} lvar_T; + +// Destination for an assignment or ":unlet" with an index. +typedef enum { + dest_local, + dest_option, + dest_func_option, + dest_env, + dest_global, + dest_buffer, + dest_window, + dest_tab, + dest_vimvar, + dest_script, + dest_reg, + dest_expr, +} assign_dest_T; + +// Used by compile_lhs() to store information about the LHS of an assignment +// and one argument of ":unlet" with an index. +typedef struct { + assign_dest_T lhs_dest; // type of destination + + char_u *lhs_name; // allocated name excluding the last + // "[expr]" or ".name". + size_t lhs_varlen; // length of the variable without + // "[expr]" or ".name" + char_u *lhs_whole; // allocated name including the last + // "[expr]" or ".name" for :redir + size_t lhs_varlen_total; // length of the variable including + // any "[expr]" or ".name" + char_u *lhs_dest_end; // end of the destination, including + // "[expr]" or ".name". + char_u *lhs_end; // end including any type + + int lhs_has_index; // has "[expr]" or ".name" + + int lhs_new_local; // create new local variable + int lhs_opt_flags; // for when destination is an option + int lhs_vimvaridx; // for when destination is a v:var + + lvar_T lhs_local_lvar; // used for existing local destination + lvar_T lhs_arg_lvar; // used for argument destination + lvar_T *lhs_lvar; // points to destination lvar + int lhs_scriptvar_sid; + int lhs_scriptvar_idx; + + int lhs_has_type; // type was specified + type_T *lhs_type; + type_T *lhs_member_type; + + int lhs_append; // used by ISN_REDIREND +} lhs_T; + +/* + * Context for compiling lines of Vim script. + * Stores info about the local variables and condition stack. + */ +struct cctx_S { + ufunc_T *ctx_ufunc; // current function + int ctx_lnum; // line number in current function + char_u *ctx_line_start; // start of current line or NULL + garray_T ctx_instr; // generated instructions + + int ctx_prev_lnum; // line number below previous command, for + // debugging + + compiletype_T ctx_compile_type; + + garray_T ctx_locals; // currently visible local variables + + int ctx_has_closure; // set to one if a closures was created in + // the function + + garray_T ctx_imports; // imported items + + skip_T ctx_skip; + scope_T *ctx_scope; // current scope, NULL at toplevel + int ctx_had_return; // last seen statement was "return" + + cctx_T *ctx_outer; // outer scope for lambda or nested + // function + int ctx_outer_used; // var in ctx_outer was used + + garray_T ctx_type_stack; // type of each item on the stack + garray_T *ctx_type_list; // list of pointers to allocated types + + int ctx_has_cmdmod; // ISN_CMDMOD was generated + + lhs_T ctx_redir_lhs; // LHS for ":redir => var", valid when + // lhs_name is not NULL +}; + diff --git a/src/vim9cmds.c b/src/vim9cmds.c new file mode 100644 index 0000000000..fe9ead2750 --- /dev/null +++ b/src/vim9cmds.c @@ -0,0 +1,2274 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * vim9cmds.c: Dealing with commands of a compiled function + */ + +#define USING_FLOAT_STUFF +#include "vim.h" + +#if defined(FEAT_EVAL) || defined(PROTO) + +// When not generating protos this is included in proto.h +#ifdef PROTO +# include "vim9.h" +#endif + +/* + * Get the index of the current instruction. + * This compensates for a preceding ISN_CMDMOD and ISN_PROF_START. + */ + static int +current_instr_idx(c |