18a7d6542SBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet: 28a7d6542SBram Moolenaar * 38a7d6542SBram Moolenaar * VIM - Vi IMproved by Bram Moolenaar 48a7d6542SBram Moolenaar * 58a7d6542SBram Moolenaar * Do ":help uganda" in Vim to read copying and usage conditions. 68a7d6542SBram Moolenaar * Do ":help credits" in Vim to see a list of people who contributed. 78a7d6542SBram Moolenaar * See README.txt for an overview of the Vim source code. 88a7d6542SBram Moolenaar */ 98a7d6542SBram Moolenaar 108a7d6542SBram Moolenaar /* 118a7d6542SBram Moolenaar * vim9.h: types and globals used for Vim9 script. 128a7d6542SBram Moolenaar */ 138a7d6542SBram Moolenaar 148a7d6542SBram Moolenaar typedef enum { 158a7d6542SBram Moolenaar ISN_EXEC, // execute Ex command line isn_arg.string 16cfe435d7SBram Moolenaar ISN_EXECCONCAT, // execute Ex command from isn_arg.number items on stack 172067733bSBram Moolenaar ISN_EXEC_SPLIT, // execute Ex command from isn_arg.string split at NL 183b1373b1SBram Moolenaar ISN_LEGACY_EVAL, // evaluate expression isn_arg.string with legacy syntax. 197de62623SBram Moolenaar ISN_ECHO, // :echo with isn_arg.echo.echo_count items on top of stack 207de62623SBram Moolenaar ISN_EXECUTE, // :execute with isn_arg.number items on top of stack 217de62623SBram Moolenaar ISN_ECHOMSG, // :echomsg with isn_arg.number items on top of stack 227de62623SBram Moolenaar ISN_ECHOCONSOLE, // :echoconsole with isn_arg.number items on top of stack 237de62623SBram Moolenaar ISN_ECHOERR, // :echoerr with isn_arg.number items on top of stack 2408597875SBram Moolenaar ISN_RANGE, // compute range from isn_arg.string, push to stack 254c137214SBram Moolenaar ISN_SUBSTITUTE, // :s command with expression 26f18332fbSBram Moolenaar ISN_INSTR, // instructions compiled from expression 278a7d6542SBram Moolenaar 288a7d6542SBram Moolenaar // get and set variables 298a7d6542SBram Moolenaar ISN_LOAD, // push local variable isn_arg.number 308a7d6542SBram Moolenaar ISN_LOADV, // push v: variable isn_arg.number 318a7d6542SBram Moolenaar ISN_LOADG, // push g: variable isn_arg.string 3203290b84SBram Moolenaar ISN_LOADAUTO, // push g: autoload variable isn_arg.string 33d3aac291SBram Moolenaar ISN_LOADB, // push b: variable isn_arg.string 34d3aac291SBram Moolenaar ISN_LOADW, // push w: variable isn_arg.string 35d3aac291SBram Moolenaar ISN_LOADT, // push t: variable isn_arg.string 362f8ce0aeSBram Moolenaar ISN_LOADGDICT, // push g: dict 372f8ce0aeSBram Moolenaar ISN_LOADBDICT, // push b: dict 382f8ce0aeSBram Moolenaar ISN_LOADWDICT, // push w: dict 392f8ce0aeSBram Moolenaar ISN_LOADTDICT, // push t: dict 40b283a8a6SBram Moolenaar ISN_LOADS, // push s: variable isn_arg.loadstore 41ab360526SBram Moolenaar ISN_LOADOUTER, // push variable from outer scope isn_arg.outer 42b283a8a6SBram Moolenaar ISN_LOADSCRIPT, // push script-local variable isn_arg.script. 438a7d6542SBram Moolenaar ISN_LOADOPT, // push option isn_arg.string 448a7d6542SBram Moolenaar ISN_LOADENV, // push environment variable isn_arg.string 458a7d6542SBram Moolenaar ISN_LOADREG, // push register isn_arg.number 468a7d6542SBram Moolenaar 478a7d6542SBram Moolenaar ISN_STORE, // pop into local variable isn_arg.number 48b283a8a6SBram Moolenaar ISN_STOREV, // pop into v: variable isn_arg.number 498a7d6542SBram Moolenaar ISN_STOREG, // pop into global variable isn_arg.string 5003290b84SBram Moolenaar ISN_STOREAUTO, // pop into global autoload variable isn_arg.string 51d3aac291SBram Moolenaar ISN_STOREB, // pop into buffer-local variable isn_arg.string 52d3aac291SBram Moolenaar ISN_STOREW, // pop into window-local variable isn_arg.string 53d3aac291SBram Moolenaar ISN_STORET, // pop into tab-local variable isn_arg.string 545deeb3f1SBram Moolenaar ISN_STORES, // pop into script variable isn_arg.loadstore 55ab360526SBram Moolenaar ISN_STOREOUTER, // pop variable into outer scope isn_arg.outer 565deeb3f1SBram Moolenaar ISN_STORESCRIPT, // pop into script variable isn_arg.script 578a7d6542SBram Moolenaar ISN_STOREOPT, // pop into option isn_arg.string 58b283a8a6SBram Moolenaar ISN_STOREENV, // pop into environment variable isn_arg.string 59b283a8a6SBram Moolenaar ISN_STOREREG, // pop into register isn_arg.number 608a7d6542SBram Moolenaar // ISN_STOREOTHER, // pop into other script variable isn_arg.other. 618a7d6542SBram Moolenaar 62a471eeaeSBram Moolenaar ISN_STORENR, // store number into local variable isn_arg.storenr.stnr_idx 634f5e3977SBram Moolenaar ISN_STOREINDEX, // store into list or dictionary, type isn_arg.vartype, 644f5e3977SBram Moolenaar // value/index/variable on stack 6568452177SBram Moolenaar ISN_STORERANGE, // store into blob, 6668452177SBram Moolenaar // value/index 1/index 2/variable on stack 678a7d6542SBram Moolenaar 68d72c1bf0SBram Moolenaar ISN_UNLET, // unlet variable isn_arg.unlet.ul_name 697bdaea6eSBram Moolenaar ISN_UNLETENV, // unlet environment variable isn_arg.unlet.ul_name 70752fc692SBram Moolenaar ISN_UNLETINDEX, // unlet item of list or dict 715b5ae29bSBram Moolenaar ISN_UNLETRANGE, // unlet items of list 72d72c1bf0SBram Moolenaar 73aacc966cSBram Moolenaar ISN_LOCKUNLOCK, // :lock and :unlock for local variable member 740b4c66c6SBram Moolenaar ISN_LOCKCONST, // lock constant value 750b4c66c6SBram Moolenaar 768a7d6542SBram Moolenaar // constants 778a7d6542SBram Moolenaar ISN_PUSHNR, // push number isn_arg.number 788a7d6542SBram Moolenaar ISN_PUSHBOOL, // push bool value isn_arg.number 798a7d6542SBram Moolenaar ISN_PUSHSPEC, // push special value isn_arg.number 808a7d6542SBram Moolenaar ISN_PUSHF, // push float isn_arg.fnumber 818a7d6542SBram Moolenaar ISN_PUSHS, // push string isn_arg.string 828a7d6542SBram Moolenaar ISN_PUSHBLOB, // push blob isn_arg.blob 8342a480bfSBram Moolenaar ISN_PUSHFUNC, // push func isn_arg.string 8442a480bfSBram Moolenaar ISN_PUSHCHANNEL, // push channel isn_arg.channel 8542a480bfSBram Moolenaar ISN_PUSHJOB, // push channel isn_arg.job 868a7d6542SBram Moolenaar ISN_NEWLIST, // push list from stack items, size is isn_arg.number 878a7d6542SBram Moolenaar ISN_NEWDICT, // push dict from stack items, size is isn_arg.number 888a7d6542SBram Moolenaar 898a7d6542SBram Moolenaar // function call 908a7d6542SBram Moolenaar ISN_BCALL, // call builtin function isn_arg.bfunc 918a7d6542SBram Moolenaar ISN_DCALL, // call def function isn_arg.dfunc 928a7d6542SBram Moolenaar ISN_UCALL, // call user function or funcref/partial isn_arg.ufunc 938a7d6542SBram Moolenaar ISN_PCALL, // call partial, use isn_arg.pfunc 94bd5da371SBram Moolenaar ISN_PCALL_END, // cleanup after ISN_PCALL with cpf_top set 958a7d6542SBram Moolenaar ISN_RETURN, // return, result is on top of stack 96f57b43c2SBram Moolenaar ISN_RETURN_VOID, // Push void, then return 97bf67ea1aSBram Moolenaar ISN_FUNCREF, // push a function ref to dfunc isn_arg.funcref 9838ddf333SBram Moolenaar ISN_NEWFUNC, // create a global function from a lambda function 996abdcf82SBram Moolenaar ISN_DEF, // list functions 1008a7d6542SBram Moolenaar 1018a7d6542SBram Moolenaar // expression operations 1028a7d6542SBram Moolenaar ISN_JUMP, // jump if condition is matched isn_arg.jump 1034c137214SBram Moolenaar ISN_JUMP_IF_ARG_SET, // jump if argument is already set, uses 1044c137214SBram Moolenaar // isn_arg.jumparg 1058a7d6542SBram Moolenaar 1068a7d6542SBram Moolenaar // loop 1078a7d6542SBram Moolenaar ISN_FOR, // get next item from a list, uses isn_arg.forloop 1088a7d6542SBram Moolenaar 1098a7d6542SBram Moolenaar ISN_TRY, // add entry to ec_trystack, uses isn_arg.try 1108a7d6542SBram Moolenaar ISN_THROW, // pop value of stack, store in v:exception 1118a7d6542SBram Moolenaar ISN_PUSHEXC, // push v:exception 1128a7d6542SBram Moolenaar ISN_CATCH, // drop v:exception 1137e82c5f3SBram Moolenaar ISN_FINALLY, // start of :finally block 1148a7d6542SBram Moolenaar ISN_ENDTRY, // take entry off from ec_trystack 115c150c09eSBram Moolenaar ISN_TRYCONT, // handle :continue inside a :try statement 1168a7d6542SBram Moolenaar 1178a7d6542SBram Moolenaar // more expression operations 1181dcae599SBram Moolenaar ISN_ADDLIST, // add two lists 1191dcae599SBram Moolenaar ISN_ADDBLOB, // add two blobs 1208a7d6542SBram Moolenaar 121657137caSBram Moolenaar // operation with two arguments; isn_arg.op.op_type is exprtype_T 1228a7d6542SBram Moolenaar ISN_OPNR, 1238a7d6542SBram Moolenaar ISN_OPFLOAT, 1248a7d6542SBram Moolenaar ISN_OPANY, 1258a7d6542SBram Moolenaar 126657137caSBram Moolenaar // comparative operations; isn_arg.op.op_type is exprtype_T, op_ic used 1278a7d6542SBram Moolenaar ISN_COMPAREBOOL, 1288a7d6542SBram Moolenaar ISN_COMPARESPECIAL, 1298a7d6542SBram Moolenaar ISN_COMPARENR, 1308a7d6542SBram Moolenaar ISN_COMPAREFLOAT, 1318a7d6542SBram Moolenaar ISN_COMPARESTRING, 1328a7d6542SBram Moolenaar ISN_COMPAREBLOB, 1338a7d6542SBram Moolenaar ISN_COMPARELIST, 1348a7d6542SBram Moolenaar ISN_COMPAREDICT, 1358a7d6542SBram Moolenaar ISN_COMPAREFUNC, 1368a7d6542SBram Moolenaar ISN_COMPAREANY, 1378a7d6542SBram Moolenaar 1388a7d6542SBram Moolenaar // expression operations 1398a7d6542SBram Moolenaar ISN_CONCAT, 140bf9d8c37SBram Moolenaar ISN_STRINDEX, // [expr] string index 14111107babSBram Moolenaar ISN_STRSLICE, // [expr:expr] string slice 1421dcae599SBram Moolenaar ISN_LISTAPPEND, // append to a list, like add() 143bf9d8c37SBram Moolenaar ISN_LISTINDEX, // [expr] list index 144ed591877SBram Moolenaar ISN_LISTSLICE, // [expr:expr] list slice 145cfc3023cSBram Moolenaar ISN_BLOBINDEX, // [expr] blob index 146cfc3023cSBram Moolenaar ISN_BLOBSLICE, // [expr:expr] blob slice 147cc673e74SBram Moolenaar ISN_ANYINDEX, // [expr] runtime index 148cc673e74SBram Moolenaar ISN_ANYSLICE, // [expr:expr] runtime slice 1499af78769SBram Moolenaar ISN_SLICE, // drop isn_arg.number items from start of list 15080b0e5eaSBram Moolenaar ISN_BLOBAPPEND, // append to a blob, like add() 15147a519a9SBram Moolenaar ISN_GETITEM, // push list item, isn_arg.number is the index 1521cc2a94fSBram Moolenaar ISN_MEMBER, // dict[member] 1531cc2a94fSBram Moolenaar ISN_STRINGMEMBER, // dict.member using isn_arg.string 1545fa9b244SBram Moolenaar ISN_2BOOL, // falsy/truthy to bool, uses isn_arg.tobool 1552bb2658bSBram Moolenaar ISN_COND2BOOL, // convert value to bool 1565fa9b244SBram Moolenaar ISN_2STRING, // convert value to string at isn_arg.tostring on stack 157418f1df5SBram Moolenaar ISN_2STRING_ANY, // like ISN_2STRING but check type 1588a7d6542SBram Moolenaar ISN_NEGATENR, // apply "-" to number 1598a7d6542SBram Moolenaar 1608a7d6542SBram Moolenaar ISN_CHECKNR, // check value can be used as a number 161628c102dSBram Moolenaar ISN_CHECKTYPE, // check value type is isn_arg.type.ct_type 1629af78769SBram Moolenaar ISN_CHECKLEN, // check list length is isn_arg.checklen.cl_min_len 163628c102dSBram Moolenaar ISN_SETTYPE, // set dict type to isn_arg.type.ct_type 1648a7d6542SBram Moolenaar 165b1b6f4deSBram Moolenaar ISN_CLEARDICT, // clear dict saved by ISN_MEMBER/ISN_STRINGMEMBER 166b1b6f4deSBram Moolenaar ISN_USEDICT, // use or clear dict saved by ISN_MEMBER/ISN_STRINGMEMBER 167b1b6f4deSBram Moolenaar 168c3516f7eSBram Moolenaar ISN_PUT, // ":put", uses isn_arg.put 169c3516f7eSBram Moolenaar 17002194d2bSBram Moolenaar ISN_CMDMOD, // set cmdmod 17102194d2bSBram Moolenaar ISN_CMDMOD_REV, // undo ISN_CMDMOD 172f4c6e1e7SBram Moolenaar 173b2049903SBram Moolenaar ISN_PROF_START, // start a line for profiling 174b2049903SBram Moolenaar ISN_PROF_END, // end a line for profiling 175b2049903SBram Moolenaar 1768cec9273SBram Moolenaar ISN_DEBUG, // check for debug breakpoint, uses isn_arg.debug 177e99d422bSBram Moolenaar 178792f786aSBram Moolenaar ISN_UNPACK, // unpack list into items, uses isn_arg.unpack 179389df259SBram Moolenaar ISN_SHUFFLE, // move item on stack up or down 1804c137214SBram Moolenaar ISN_DROP, // pop stack and discard value 1814c137214SBram Moolenaar 1822d1c57edSBram Moolenaar ISN_REDIRSTART, // :redir => 1832d1c57edSBram Moolenaar ISN_REDIREND, // :redir END, isn_arg.number == 1 for append 1842d1c57edSBram Moolenaar 1855f7d4c04SBram Moolenaar ISN_CEXPR_AUCMD, // first part of :cexpr isn_arg.number is cmdidx 1865f7d4c04SBram Moolenaar ISN_CEXPR_CORE, // second part of :cexpr, uses isn_arg.cexpr 1875f7d4c04SBram Moolenaar 1884c137214SBram Moolenaar ISN_FINISH // end marker in list of instructions 1898a7d6542SBram Moolenaar } isntype_T; 1908a7d6542SBram Moolenaar 1918a7d6542SBram Moolenaar 1928a7d6542SBram Moolenaar // arguments to ISN_BCALL 1938a7d6542SBram Moolenaar typedef struct { 1948a7d6542SBram Moolenaar int cbf_idx; // index in "global_functions" 1958a7d6542SBram Moolenaar int cbf_argcount; // number of arguments on top of stack 1968a7d6542SBram Moolenaar } cbfunc_T; 1978a7d6542SBram Moolenaar 1988a7d6542SBram Moolenaar // arguments to ISN_DCALL 1998a7d6542SBram Moolenaar typedef struct { 2008a7d6542SBram Moolenaar int cdf_idx; // index in "def_functions" for ISN_DCALL 2018a7d6542SBram Moolenaar int cdf_argcount; // number of arguments on top of stack 2028a7d6542SBram Moolenaar } cdfunc_T; 2038a7d6542SBram Moolenaar 2048a7d6542SBram Moolenaar // arguments to ISN_PCALL 2058a7d6542SBram Moolenaar typedef struct { 2068a7d6542SBram Moolenaar int cpf_top; // when TRUE partial is above the arguments 2078a7d6542SBram Moolenaar int cpf_argcount; // number of arguments on top of stack 2088a7d6542SBram Moolenaar } cpfunc_T; 2098a7d6542SBram Moolenaar 2108a7d6542SBram Moolenaar // arguments to ISN_UCALL and ISN_XCALL 2118a7d6542SBram Moolenaar typedef struct { 2128a7d6542SBram Moolenaar char_u *cuf_name; 2138a7d6542SBram Moolenaar int cuf_argcount; // number of arguments on top of stack 2148a7d6542SBram Moolenaar } cufunc_T; 2158a7d6542SBram Moolenaar 216035bd1c9SBram Moolenaar // arguments to ISN_GETITEM 217035bd1c9SBram Moolenaar typedef struct { 218035bd1c9SBram Moolenaar varnumber_T gi_index; 219035bd1c9SBram Moolenaar int gi_with_op; 220035bd1c9SBram Moolenaar } getitem_T; 221035bd1c9SBram Moolenaar 2228a7d6542SBram Moolenaar typedef enum { 2238a7d6542SBram Moolenaar JUMP_ALWAYS, 224*1a7ee4ddSBram Moolenaar JUMP_NEVER, 2258a7d6542SBram Moolenaar JUMP_IF_FALSE, // pop and jump if false 2262bb2658bSBram Moolenaar JUMP_AND_KEEP_IF_TRUE, // jump if top of stack is truthy, drop if not 2272bb2658bSBram Moolenaar JUMP_AND_KEEP_IF_FALSE, // jump if top of stack is falsy, drop if not 2282bb2658bSBram Moolenaar JUMP_IF_COND_TRUE, // jump if top of stack is true, drop if not 2292bb2658bSBram Moolenaar JUMP_IF_COND_FALSE, // jump if top of stack is false, drop if not 2308a7d6542SBram Moolenaar } jumpwhen_T; 2318a7d6542SBram Moolenaar 2328a7d6542SBram Moolenaar // arguments to ISN_JUMP 2338a7d6542SBram Moolenaar typedef struct { 2348a7d6542SBram Moolenaar jumpwhen_T jump_when; 2358a7d6542SBram Moolenaar int jump_where; // position to jump to 2368a7d6542SBram Moolenaar } jump_T; 2378a7d6542SBram Moolenaar 23838a3bfa9SBram Moolenaar // arguments to ISN_JUMP_IF_ARG_SET 23938a3bfa9SBram Moolenaar typedef struct { 24038a3bfa9SBram Moolenaar int jump_arg_off; // argument index, negative 24138a3bfa9SBram Moolenaar int jump_where; // position to jump to 24238a3bfa9SBram Moolenaar } jumparg_T; 24338a3bfa9SBram Moolenaar 2448a7d6542SBram Moolenaar // arguments to ISN_FOR 2458a7d6542SBram Moolenaar typedef struct { 2468a7d6542SBram Moolenaar int for_idx; // loop variable index 2478a7d6542SBram Moolenaar int for_end; // position to jump to after done 2488a7d6542SBram Moolenaar } forloop_T; 2498a7d6542SBram Moolenaar 2507e82c5f3SBram Moolenaar // indirect arguments to ISN_TRY 2518a7d6542SBram Moolenaar typedef struct { 2528a7d6542SBram Moolenaar int try_catch; // position to jump to on throw 253c150c09eSBram Moolenaar int try_finally; // :finally or :endtry position to jump to 2547e82c5f3SBram Moolenaar int try_endtry; // :endtry position to jump to 2557e82c5f3SBram Moolenaar } tryref_T; 2567e82c5f3SBram Moolenaar 2577e82c5f3SBram Moolenaar // arguments to ISN_TRY 2587e82c5f3SBram Moolenaar typedef struct { 2597e82c5f3SBram Moolenaar tryref_T *try_ref; 2608a7d6542SBram Moolenaar } try_T; 2618a7d6542SBram Moolenaar 262c150c09eSBram Moolenaar // arguments to ISN_TRYCONT 263c150c09eSBram Moolenaar typedef struct { 264c150c09eSBram Moolenaar int tct_levels; // number of nested try statements 265c150c09eSBram Moolenaar int tct_where; // position to jump to, WHILE or FOR 266c150c09eSBram Moolenaar } trycont_T; 267c150c09eSBram Moolenaar 2688a7d6542SBram Moolenaar // arguments to ISN_ECHO 2698a7d6542SBram Moolenaar typedef struct { 2708a7d6542SBram Moolenaar int echo_with_white; // :echo instead of :echon 2718a7d6542SBram Moolenaar int echo_count; // number of expressions 2728a7d6542SBram Moolenaar } echo_T; 2738a7d6542SBram Moolenaar 2748a7d6542SBram Moolenaar // arguments to ISN_OPNR, ISN_OPFLOAT, etc. 2758a7d6542SBram Moolenaar typedef struct { 276657137caSBram Moolenaar exprtype_T op_type; 2778a7d6542SBram Moolenaar int op_ic; // TRUE with '#', FALSE with '?', else MAYBE 2788a7d6542SBram Moolenaar } opexpr_T; 2798a7d6542SBram Moolenaar 2808a7d6542SBram Moolenaar // arguments to ISN_CHECKTYPE 2818a7d6542SBram Moolenaar typedef struct { 2825e654230SBram Moolenaar type_T *ct_type; 283b3005ce1SBram Moolenaar int8_T ct_off; // offset in stack, -1 is bottom 284b3005ce1SBram Moolenaar int8_T ct_arg_idx; // argument index or zero 2858a7d6542SBram Moolenaar } checktype_T; 2868a7d6542SBram Moolenaar 2878a7d6542SBram Moolenaar // arguments to ISN_STORENR 2888a7d6542SBram Moolenaar typedef struct { 289a471eeaeSBram Moolenaar int stnr_idx; 290a471eeaeSBram Moolenaar varnumber_T stnr_val; 2918a7d6542SBram Moolenaar } storenr_T; 2928a7d6542SBram Moolenaar 2938a7d6542SBram Moolenaar // arguments to ISN_STOREOPT 2948a7d6542SBram Moolenaar typedef struct { 2958a7d6542SBram Moolenaar char_u *so_name; 2968a7d6542SBram Moolenaar int so_flags; 2978a7d6542SBram Moolenaar } storeopt_T; 2988a7d6542SBram Moolenaar 299b283a8a6SBram Moolenaar // arguments to ISN_LOADS and ISN_STORES 3008a7d6542SBram Moolenaar typedef struct { 3015deeb3f1SBram Moolenaar char_u *ls_name; // variable name (with s: for ISN_STORES) 3028a7d6542SBram Moolenaar int ls_sid; // script ID 303b283a8a6SBram Moolenaar } loadstore_T; 3048a7d6542SBram Moolenaar 305b283a8a6SBram Moolenaar // arguments to ISN_LOADSCRIPT and ISN_STORESCRIPT 3068a7d6542SBram Moolenaar typedef struct { 3074aab88d9SBram Moolenaar int sref_sid; // script ID 3084aab88d9SBram Moolenaar int sref_idx; // index in sn_var_vals 3094aab88d9SBram Moolenaar int sref_seq; // sn_script_seq when compiled 31007a65d26SBram Moolenaar type_T *sref_type; // type of the variable when compiled 3114aab88d9SBram Moolenaar } scriptref_T; 3124aab88d9SBram Moolenaar 3134aab88d9SBram Moolenaar typedef struct { 3144aab88d9SBram Moolenaar scriptref_T *scriptref; 3158a7d6542SBram Moolenaar } script_T; 3168a7d6542SBram Moolenaar 317d72c1bf0SBram Moolenaar // arguments to ISN_UNLET 318d72c1bf0SBram Moolenaar typedef struct { 319d72c1bf0SBram Moolenaar char_u *ul_name; // variable name with g:, w:, etc. 320d72c1bf0SBram Moolenaar int ul_forceit; // forceit flag 321d72c1bf0SBram Moolenaar } unlet_T; 322d72c1bf0SBram Moolenaar 323bf67ea1aSBram Moolenaar // arguments to ISN_FUNCREF 324bf67ea1aSBram Moolenaar typedef struct { 325bf67ea1aSBram Moolenaar int fr_func; // function index 326bf67ea1aSBram Moolenaar } funcref_T; 327bf67ea1aSBram Moolenaar 32838ddf333SBram Moolenaar // arguments to ISN_NEWFUNC 32938ddf333SBram Moolenaar typedef struct { 33038ddf333SBram Moolenaar char_u *nf_lambda; // name of the lambda already defined 33138ddf333SBram Moolenaar char_u *nf_global; // name of the global function to be created 33238ddf333SBram Moolenaar } newfunc_T; 33338ddf333SBram Moolenaar 3349af78769SBram Moolenaar // arguments to ISN_CHECKLEN 3359af78769SBram Moolenaar typedef struct { 3369af78769SBram Moolenaar int cl_min_len; // minimum length 3379af78769SBram Moolenaar int cl_more_OK; // longer is allowed 3389af78769SBram Moolenaar } checklen_T; 3399af78769SBram Moolenaar 340389df259SBram Moolenaar // arguments to ISN_SHUFFLE 341389df259SBram Moolenaar typedef struct { 342389df259SBram Moolenaar int shfl_item; // item to move (relative to top of stack) 343389df259SBram Moolenaar int shfl_up; // places to move upwards 344389df259SBram Moolenaar } shuffle_T; 345389df259SBram Moolenaar 346c3516f7eSBram Moolenaar // arguments to ISN_PUT 347c3516f7eSBram Moolenaar typedef struct { 348c3516f7eSBram Moolenaar int put_regname; // register, can be NUL 349c3516f7eSBram Moolenaar linenr_T put_lnum; // line number to put below 350c3516f7eSBram Moolenaar } put_T; 351c3516f7eSBram Moolenaar 35202194d2bSBram Moolenaar // arguments to ISN_CMDMOD 35302194d2bSBram Moolenaar typedef struct { 35402194d2bSBram Moolenaar cmdmod_T *cf_cmdmod; // allocated 35502194d2bSBram Moolenaar } cmod_T; 35602194d2bSBram Moolenaar 357792f786aSBram Moolenaar // arguments to ISN_UNPACK 358792f786aSBram Moolenaar typedef struct { 359792f786aSBram Moolenaar int unp_count; // number of items to produce 360792f786aSBram Moolenaar int unp_semicolon; // last item gets list of remainder 361792f786aSBram Moolenaar } unpack_T; 362792f786aSBram Moolenaar 363ab360526SBram Moolenaar // arguments to ISN_LOADOUTER and ISN_STOREOUTER 364ab360526SBram Moolenaar typedef struct { 365ab360526SBram Moolenaar int outer_idx; // index 366ab360526SBram Moolenaar int outer_depth; // nesting level, stack frames to go up 3670186e586SBram Moolenaar } isn_outer_T; 368ab360526SBram Moolenaar 3694c137214SBram Moolenaar // arguments to ISN_SUBSTITUTE 3704c137214SBram Moolenaar typedef struct { 3714c137214SBram Moolenaar char_u *subs_cmd; // :s command 3724c137214SBram Moolenaar isn_T *subs_instr; // sequence of instructions 3734c137214SBram Moolenaar } subs_T; 3744c137214SBram Moolenaar 3755f7d4c04SBram Moolenaar // indirect arguments to ISN_TRY 3765f7d4c04SBram Moolenaar typedef struct { 3775f7d4c04SBram Moolenaar int cer_cmdidx; 3785f7d4c04SBram Moolenaar char_u *cer_cmdline; 3795f7d4c04SBram Moolenaar int cer_forceit; 3805f7d4c04SBram Moolenaar } cexprref_T; 3815f7d4c04SBram Moolenaar 3825f7d4c04SBram Moolenaar // arguments to ISN_CEXPR_CORE 3835f7d4c04SBram Moolenaar typedef struct { 3845f7d4c04SBram Moolenaar cexprref_T *cexpr_ref; 3855f7d4c04SBram Moolenaar } cexpr_T; 3865f7d4c04SBram Moolenaar 3875fa9b244SBram Moolenaar // arguments to ISN_2STRING and ISN_2STRING_ANY 3885fa9b244SBram Moolenaar typedef struct { 3895fa9b244SBram Moolenaar int offset; 3905fa9b244SBram Moolenaar int tolerant; 3915fa9b244SBram Moolenaar } tostring_T; 3925fa9b244SBram Moolenaar 3935fa9b244SBram Moolenaar // arguments to ISN_2BOOL 3945fa9b244SBram Moolenaar typedef struct { 3955fa9b244SBram Moolenaar int offset; 3965fa9b244SBram Moolenaar int invert; 3975fa9b244SBram Moolenaar } tobool_T; 3985fa9b244SBram Moolenaar 3998cec9273SBram Moolenaar // arguments to ISN_DEBUG 4008cec9273SBram Moolenaar typedef struct { 4018cec9273SBram Moolenaar varnumber_T dbg_var_names_len; // current number of local variables 4028cec9273SBram Moolenaar int dbg_break_lnum; // first line to break after 4038cec9273SBram Moolenaar } debug_T; 4048cec9273SBram Moolenaar 4058a7d6542SBram Moolenaar /* 4068a7d6542SBram Moolenaar * Instruction 4078a7d6542SBram Moolenaar */ 40820431c9dSBram Moolenaar struct isn_S { 4098a7d6542SBram Moolenaar isntype_T isn_type; 4108a7d6542SBram Moolenaar int isn_lnum; 4118a7d6542SBram Moolenaar union { 4128a7d6542SBram Moolenaar char_u *string; 4138a7d6542SBram Moolenaar varnumber_T number; 4148a7d6542SBram Moolenaar blob_T *blob; 4154f5e3977SBram Moolenaar vartype_T vartype; 4168a7d6542SBram Moolenaar #ifdef FEAT_FLOAT 4178a7d6542SBram Moolenaar float_T fnumber; 4188a7d6542SBram Moolenaar #endif 41942a480bfSBram Moolenaar channel_T *channel; 42042a480bfSBram Moolenaar job_T *job; 421087d2e15SBram Moolenaar partial_T *partial; 4228a7d6542SBram Moolenaar jump_T jump; 42338a3bfa9SBram Moolenaar jumparg_T jumparg; 4248a7d6542SBram Moolenaar forloop_T forloop; 4258a7d6542SBram Moolenaar try_T try; 426c150c09eSBram Moolenaar trycont_T trycont; 4278a7d6542SBram Moolenaar cbfunc_T bfunc; 4288a7d6542SBram Moolenaar cdfunc_T dfunc; 4298a7d6542SBram Moolenaar cpfunc_T pfunc; 4308a7d6542SBram Moolenaar cufunc_T ufunc; 4318a7d6542SBram Moolenaar echo_T echo; 4328a7d6542SBram Moolenaar opexpr_T op; 4338a7d6542SBram Moolenaar checktype_T type; 4348a7d6542SBram Moolenaar storenr_T storenr; 4358a7d6542SBram Moolenaar storeopt_T storeopt; 436b283a8a6SBram Moolenaar loadstore_T loadstore; 4378a7d6542SBram Moolenaar script_T script; 438d72c1bf0SBram Moolenaar unlet_T unlet; 439bf67ea1aSBram Moolenaar funcref_T funcref; 44038ddf333SBram Moolenaar newfunc_T newfunc; 4419af78769SBram Moolenaar checklen_T checklen; 442389df259SBram Moolenaar shuffle_T shuffle; 443c3516f7eSBram Moolenaar put_T put; 44402194d2bSBram Moolenaar cmod_T cmdmod; 445792f786aSBram Moolenaar unpack_T unpack; 4460186e586SBram Moolenaar isn_outer_T outer; 4474c137214SBram Moolenaar subs_T subs; 4485f7d4c04SBram Moolenaar cexpr_T cexpr; 449f18332fbSBram Moolenaar isn_T *instr; 4505fa9b244SBram Moolenaar tostring_T tostring; 4515fa9b244SBram Moolenaar tobool_T tobool; 452035bd1c9SBram Moolenaar getitem_T getitem; 4538cec9273SBram Moolenaar debug_T debug; 4548a7d6542SBram Moolenaar } isn_arg; 45520431c9dSBram Moolenaar }; 4568a7d6542SBram Moolenaar 4578a7d6542SBram Moolenaar /* 4588a7d6542SBram Moolenaar * Info about a function defined with :def. Used in "def_functions". 4598a7d6542SBram Moolenaar */ 4608a7d6542SBram Moolenaar struct dfunc_S { 4618a7d6542SBram Moolenaar ufunc_T *df_ufunc; // struct containing most stuff 462cd45ed03SBram Moolenaar int df_refcount; // how many ufunc_T point to this dfunc_T 4638a7d6542SBram Moolenaar int df_idx; // index in def_functions 4648a7d6542SBram Moolenaar int df_deleted; // if TRUE function was deleted 4654aab88d9SBram Moolenaar int df_script_seq; // Value of sctx_T sc_seq when the function 4664aab88d9SBram Moolenaar // was compiled. 4673276f584SDominique Pelle char_u *df_name; // name used for error messages 4688a7d6542SBram Moolenaar 4698a7d6542SBram Moolenaar garray_T df_def_args_isn; // default argument instructions 470b69c6fb7SBram Moolenaar garray_T df_var_names; // names of local vars 471b2049903SBram Moolenaar 472b2049903SBram Moolenaar // After compiling "df_instr" and/or "df_instr_prof" is not NULL. 4738a7d6542SBram Moolenaar isn_T *df_instr; // function body to be executed 474b2049903SBram Moolenaar int df_instr_count; // size of "df_instr" 4753276f584SDominique Pelle int df_instr_debug_count; // size of "df_instr_debug" 4763276f584SDominique Pelle isn_T *df_instr_debug; // like "df_instr" with debugging 477f002a41dSBram Moolenaar #ifdef FEAT_PROFILE 478b2049903SBram Moolenaar isn_T *df_instr_prof; // like "df_instr" with profiling 479b2049903SBram Moolenaar int df_instr_prof_count; // size of "df_instr_prof" 480f002a41dSBram Moolenaar #endif 4818a7d6542SBram Moolenaar 4828a7d6542SBram Moolenaar int df_varcount; // number of local variables 483148ce7aeSBram Moolenaar int df_has_closure; // one if a closure was created 4848a7d6542SBram Moolenaar }; 4858a7d6542SBram Moolenaar 4868a7d6542SBram Moolenaar // Number of entries used by stack frame for a function call. 4875366e1aeSBram Moolenaar // - ec_dfunc_idx: function index 4885366e1aeSBram Moolenaar // - ec_iidx: instruction index 4895930ddcdSBram Moolenaar // - ec_instr: instruction list pointer 4900186e586SBram Moolenaar // - ec_outer: stack used for closures 4912fecb531SBram Moolenaar // - funclocal: function-local data 4925366e1aeSBram Moolenaar // - ec_frame_idx: previous frame index 4930186e586SBram Moolenaar #define STACK_FRAME_FUNC_OFF 0 4940186e586SBram Moolenaar #define STACK_FRAME_IIDX_OFF 1 4955930ddcdSBram Moolenaar #define STACK_FRAME_INSTR_OFF 2 4965930ddcdSBram Moolenaar #define STACK_FRAME_OUTER_OFF 3 4975930ddcdSBram Moolenaar #define STACK_FRAME_FUNCLOCAL_OFF 4 4985930ddcdSBram Moolenaar #define STACK_FRAME_IDX_OFF 5 4995930ddcdSBram Moolenaar #define STACK_FRAME_SIZE 6 5008a7d6542SBram Moolenaar 5018a7d6542SBram Moolenaar 5028a7d6542SBram Moolenaar #ifdef DEFINE_VIM9_GLOBALS 5038a7d6542SBram Moolenaar // Functions defined with :def are stored in this growarray. 5048a7d6542SBram Moolenaar // They are never removed, so that they can be found by index. 5058a7d6542SBram Moolenaar // Deleted functions have the df_deleted flag set. 50605afceedSBram Moolenaar garray_T def_functions = {0, 0, sizeof(dfunc_T), 50, NULL}; 5078a7d6542SBram Moolenaar #else 5088a7d6542SBram Moolenaar extern garray_T def_functions; 5098a7d6542SBram Moolenaar #endif 5108a7d6542SBram Moolenaar 51108597875SBram Moolenaar // Used for "lnum" when a range is to be taken from the stack. 51208597875SBram Moolenaar #define LNUM_VARIABLE_RANGE -999 51308597875SBram Moolenaar 51408597875SBram Moolenaar // Used for "lnum" when a range is to be taken from the stack and "!" is used. 51508597875SBram Moolenaar #define LNUM_VARIABLE_RANGE_ABOVE -888 516e5ea346aSBram Moolenaar 517c3a27bbdSBram Moolenaar // Keep in sync with COMPILE_TYPE() 518e5ea346aSBram Moolenaar #ifdef FEAT_PROFILE 519e5ea346aSBram Moolenaar # define INSTRUCTIONS(dfunc) \ 52026a4484dSBram Moolenaar (debug_break_level > 0 || may_break_in_function(dfunc->df_ufunc) \ 521c3a27bbdSBram Moolenaar ? (dfunc)->df_instr_debug \ 522c3a27bbdSBram Moolenaar : ((do_profiling == PROF_YES && (dfunc->df_ufunc)->uf_profiling) \ 523c3a27bbdSBram Moolenaar ? (dfunc)->df_instr_prof \ 524c3a27bbdSBram Moolenaar : (dfunc)->df_instr)) 525e5ea346aSBram Moolenaar #else 526c3a27bbdSBram Moolenaar # define INSTRUCTIONS(dfunc) \ 52726a4484dSBram Moolenaar (debug_break_level > 0 || may_break_in_function(dfunc->df_ufunc) \ 528c3a27bbdSBram Moolenaar ? (dfunc)->df_instr_debug \ 529c3a27bbdSBram Moolenaar : (dfunc)->df_instr) 530e5ea346aSBram Moolenaar #endif 531