summaryrefslogtreecommitdiffstats
path: root/src/structs.h
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-01-26 15:56:19 +0100
committerBram Moolenaar <Bram@vim.org>2020-01-26 15:56:19 +0100
commit8a7d6542b33e5d2b352262305c3bfdb2d14e1cf8 (patch)
tree8e5f241129a1c690ea81d697a72fb4c1704c0cb6 /src/structs.h
parent1d9215b9aaa120b9d78fee49488556f73007ce78 (diff)
patch 8.2.0149: maintaining a Vim9 branch separately is more workv8.2.0149
Problem: Maintaining a Vim9 branch separately is more work. Solution: Merge the Vim9 script changes.
Diffstat (limited to 'src/structs.h')
-rw-r--r--src/structs.h135
1 files changed, 109 insertions, 26 deletions
diff --git a/src/structs.h b/src/structs.h
index 7e1508eb9c..201a89bcea 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -67,6 +67,9 @@ typedef struct terminal_S term_T;
typedef struct VimMenu vimmenu_T;
#endif
+// value for sc_version in a Vim9 script file
+#define SCRIPT_VERSION_VIM9 999999
+
/*
* SCript ConteXt (SCTX): identifies a script line.
* When sourcing a script "sc_lnum" is zero, "sourcing_lnum" is the current
@@ -1298,30 +1301,43 @@ typedef struct {
int cb_free_name; // cb_name was allocated
} callback_T;
+typedef struct dfunc_S dfunc_T; // :def function
+
typedef struct jobvar_S job_T;
typedef struct readq_S readq_T;
typedef struct writeq_S writeq_T;
typedef struct jsonq_S jsonq_T;
typedef struct cbq_S cbq_T;
typedef struct channel_S channel_T;
+typedef struct cctx_S cctx_T;
typedef enum
{
- VAR_UNKNOWN = 0,
- VAR_NUMBER, // "v_number" is used
- VAR_STRING, // "v_string" is used
- VAR_FUNC, // "v_string" is function name
- VAR_PARTIAL, // "v_partial" is used
- VAR_LIST, // "v_list" is used
- VAR_DICT, // "v_dict" is used
- VAR_FLOAT, // "v_float" is used
- VAR_BOOL, // "v_number" is VVAL_FALSE or VVAL_TRUE
- VAR_SPECIAL, // "v_number" is VVAL_NONE or VVAL_NULL
- VAR_JOB, // "v_job" is used
- VAR_CHANNEL, // "v_channel" is used
- VAR_BLOB, // "v_blob" is used
+ VAR_UNKNOWN = 0, // not set, also used for "any" type
+ VAR_VOID, // no value
+ VAR_BOOL, // "v_number" is used: VVAL_TRUE or VVAL_FALSE
+ VAR_SPECIAL, // "v_number" is used: VVAL_NULL or VVAL_NONE
+ VAR_NUMBER, // "v_number" is used
+ VAR_FLOAT, // "v_float" is used
+ VAR_STRING, // "v_string" is used
+ VAR_BLOB, // "v_blob" is used
+ VAR_FUNC, // "v_string" is function name
+ VAR_PARTIAL, // "v_partial" is used
+ VAR_LIST, // "v_list" is used
+ VAR_DICT, // "v_dict" is used
+ VAR_JOB, // "v_job" is used
+ VAR_CHANNEL, // "v_channel" is used
} vartype_T;
+// A type specification.
+typedef struct type_S type_T;
+struct type_S {
+ vartype_T tt_type;
+ short tt_argcount; // for func, partial, -1 for unknown
+ type_T *tt_member; // for list, dict, func return type
+ type_T *tt_args; // func arguments
+};
+
/*
* Structure to hold an internal variable without a name.
*/
@@ -1380,19 +1396,34 @@ struct listwatch_S
/*
* Structure to hold info about a list.
* Order of members is optimized to reduce padding.
+ * When created by range() it will at first have special value:
+ * lv_first == &range_list_item;
+ * and use lv_start, lv_end, lv_stride.
*/
struct listvar_S
{
listitem_T *lv_first; // first item, NULL if none
- listitem_T *lv_last; // last item, NULL if none
listwatch_T *lv_watch; // first watcher, NULL if none
- listitem_T *lv_idx_item; // when not NULL item at index "lv_idx"
+ union {
+ struct { // used for non-materialized range list:
+ // "lv_first" is &range_list_item
+ varnumber_T lv_start;
+ varnumber_T lv_end;
+ int lv_stride;
+ };
+ struct { // used for materialized list
+ listitem_T *lv_last; // last item, NULL if none
+ listitem_T *lv_idx_item; // when not NULL item at index "lv_idx"
+ int lv_idx; // cached index of an item
+ };
+ };
list_T *lv_copylist; // copied list used by deepcopy()
list_T *lv_used_next; // next list in used lists list
list_T *lv_used_prev; // previous list in used lists list
int lv_refcount; // reference count
int lv_len; // number of items
- int lv_idx; // cached index of an item
+ int lv_with_items; // number of items following this struct that
+ // should not be freed
int lv_copyID; // ID used by deepcopy()
char lv_lock; // zero, VAR_LOCKED, VAR_FIXED
};
@@ -1413,7 +1444,7 @@ typedef struct {
struct dictitem_S
{
typval_T di_tv; // type and value of the variable
- char_u di_flags; // flags (only used for variable)
+ char_u di_flags; // DI_FLAGS_ flags (only used for variable)
char_u di_key[1]; // key (actually longer!)
};
typedef struct dictitem_S dictitem_T;
@@ -1426,16 +1457,18 @@ typedef struct dictitem_S dictitem_T;
struct dictitem16_S
{
typval_T di_tv; // type and value of the variable
- char_u di_flags; // flags (only used for variable)
+ char_u di_flags; // DI_FLAGS_ flags (only used for variable)
char_u di_key[DICTITEM16_KEY_LEN + 1]; // key
};
typedef struct dictitem16_S dictitem16_T;
-#define DI_FLAGS_RO 1 // "di_flags" value: read-only variable
-#define DI_FLAGS_RO_SBX 2 // "di_flags" value: read-only in the sandbox
-#define DI_FLAGS_FIX 4 // "di_flags" value: fixed: no :unlet or remove()
-#define DI_FLAGS_LOCK 8 // "di_flags" value: locked variable
-#define DI_FLAGS_ALLOC 16 // "di_flags" value: separately allocated
+// Flags for "di_flags"
+#define DI_FLAGS_RO 0x01 // read-only variable
+#define DI_FLAGS_RO_SBX 0x02 // read-only in the sandbox
+#define DI_FLAGS_FIX 0x04 // fixed: no :unlet or remove()
+#define DI_FLAGS_LOCK 0x08 // locked variable
+#define DI_FLAGS_ALLOC 0x10 // separately allocated
+#define DI_FLAGS_RELOAD 0x20 // set when script sourced again
/*
* Structure to hold info about a Dictionary.
@@ -1470,12 +1503,21 @@ typedef struct funccall_S funccall_T;
*/
typedef struct
{
- int uf_varargs; // variable nr of arguments
- int uf_flags;
+ int uf_varargs; // variable nr of arguments (old style)
+ int uf_flags; // FC_ flags
int uf_calls; // nr of active calls
int uf_cleared; // func_clear() was already called
+ int uf_dfunc_idx; // >= 0 for :def function only
garray_T uf_args; // arguments
garray_T uf_def_args; // default argument expressions
+
+ // for :def (for :function uf_ret_type is NULL)
+ type_T **uf_arg_types; // argument types (count == uf_args.ga_len)
+ type_T *uf_ret_type; // return type
+ garray_T uf_type_list; // types used in arg and return types
+ char_u *uf_va_name; // name from "...name" or NULL
+ type_T *uf_va_type; // type from "...name: type" or NULL
+
garray_T uf_lines; // function lines
# ifdef FEAT_PROFILE
int uf_profiling; // TRUE when func is being profiled
@@ -1578,17 +1620,50 @@ typedef struct
} scriptvar_T;
/*
+ * Entry for "sn_var_vals". Used for script-local variables.
+ */
+typedef struct {
+ char_u *sv_name; // points into "sn_vars" di_key
+ typval_T *sv_tv; // points into "sn_vars" di_tv
+ type_T *sv_type;
+ int sv_const;
+ int sv_export; // "export let var = val"
+} svar_T;
+
+typedef struct {
+ char_u *imp_name; // name imported as (allocated)
+ int imp_sid; // script ID of "from"
+
+ // for "import * as Name", "imp_name" is "Name"
+ int imp_all;
+
+ // for variable
+ type_T *imp_type;
+ int imp_var_vals_idx; // index in sn_var_vals of "from"
+
+ // for function
+ char_u *imp_funcname; // user func name (NOT allocated)
+} imported_T;
+
+/*
* Growarray to store info about already sourced scripts.
* For Unix also store the dev/ino, so that we don't have to stat() each
* script when going through the list.
*/
typedef struct
{
+ char_u *sn_name;
+
scriptvar_T *sn_vars; // stores s: variables for this script
+ garray_T sn_var_vals; // same variables as a list of svar_T
- char_u *sn_name;
+ garray_T sn_imports; // imported items, imported_T
+
+ garray_T sn_type_list; // keeps types used by variables
int sn_version; // :scriptversion
+ int sn_had_command; // TRUE if any command was executed
+ char_u *sn_save_cpo; // 'cpo' value when :vim9script found
# ifdef UNIX
int sn_dev_valid;
@@ -3691,6 +3766,12 @@ typedef enum
EXPR_NOMATCH, // !~
EXPR_IS, // is
EXPR_ISNOT, // isnot
+ // used with ISN_OPNR
+ EXPR_ADD, // +
+ EXPR_SUB, // -
+ EXPR_MULT, // *
+ EXPR_DIV, // /
+ EXPR_REM, // %
} exptype_T;
/*
@@ -3804,6 +3885,8 @@ typedef struct
typedef struct lval_S
{
char_u *ll_name; // start of variable name (can be NULL)
+ char_u *ll_name_end; // end of variable name (can be NULL)
+ type_T *ll_type; // type of variable (can be NULL)
char_u *ll_exp_name; // NULL or expanded name in allocated memory.
typval_T *ll_tv; // Typeval of item being used. If "newkey"
// isn't NULL it's the Dict to which to add