summaryrefslogtreecommitdiffstats
path: root/src/evalvars.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-06 21:10:28 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-06 21:10:28 +0000
commitd5f400c607182db6d4fbe2964471d796277f67e8 (patch)
tree285e08dceecf77069c17d1c513e3c918140b18dc /src/evalvars.c
parent18f4740f043b353abe47b7a00131317052457686 (diff)
patch 8.2.4019: Vim9: import mechanism is too complicatedv8.2.4019
Problem: Vim9: import mechanism is too complicated. Solution: Do not use the Javascript mechanism but a much simpler one.
Diffstat (limited to 'src/evalvars.c')
-rw-r--r--src/evalvars.c105
1 files changed, 49 insertions, 56 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 055d49f5ef..2de6f224b7 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1232,7 +1232,7 @@ list_arg_vars(exarg_T *eap, char_u *arg, int *first)
arg = skipwhite(arg);
if (tofree != NULL)
name = tofree;
- if (eval_variable(name, len, &tv, NULL,
+ if (eval_variable(name, len, 0, &tv, NULL,
EVAL_VAR_VERBOSE) == FAIL)
error = TRUE;
else
@@ -2645,6 +2645,7 @@ set_cmdarg(exarg_T *eap, char_u *oldarg)
eval_variable(
char_u *name,
int len, // length of "name"
+ scid_T sid, // script ID for imported item or zero
typval_T *rettv, // NULL when only checking existence
dictitem_T **dip, // non-NULL when typval's dict item is needed
int flags) // EVAL_VAR_ flags
@@ -2678,48 +2679,50 @@ eval_variable(
if (tv == NULL && (in_vim9script() || STRNCMP(name, "s:", 2) == 0))
{
- imported_T *import;
+ imported_T *import = NULL;
char_u *p = STRNCMP(name, "s:", 2) == 0 ? name + 2 : name;
- import = find_imported(p, 0, NULL);
+ if (sid == 0)
+ import = find_imported(p, 0, NULL);
// imported variable from another script
- if (import != NULL)
+ if (import != NULL || sid != 0)
{
- if (import->imp_funcname != NULL)
+ if ((flags & EVAL_VAR_IMPORT) == 0)
{
- found = TRUE;
- if (rettv != NULL)
+ if (sid != 0 && SCRIPT_ID_VALID(sid))
{
- rettv->v_type = VAR_FUNC;
- rettv->vval.v_string = vim_strsave(import->imp_funcname);
+ ht = &SCRIPT_VARS(sid);
+ if (ht != NULL)
+ {
+ dictitem_T *v = find_var_in_ht(ht, 0, name,
+ flags & EVAL_VAR_NOAUTOLOAD);
+
+ if (v != NULL)
+ {
+ tv = &v->di_tv;
+ if (dip != NULL)
+ *dip = v;
+ }
+ else
+ ht = NULL;
+ }
}
- }
- else if (import->imp_flags & IMP_FLAGS_STAR)
- {
- if ((flags & EVAL_VAR_IMPORT) == 0)
+ else
{
if (flags & EVAL_VAR_VERBOSE)
emsg(_(e_import_as_name_not_supported_here));
ret = FAIL;
}
- else
- {
- if (rettv != NULL)
- {
- rettv->v_type = VAR_ANY;
- rettv->vval.v_number = import->imp_sid;
- }
- found = TRUE;
- }
}
else
{
- scriptitem_T *si = SCRIPT_ITEM(import->imp_sid);
- svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data)
- + import->imp_var_vals_idx;
- tv = sv->sv_tv;
- type = sv->sv_type;
+ if (rettv != NULL)
+ {
+ rettv->v_type = VAR_ANY;
+ rettv->vval.v_number = sid != 0 ? sid : import->imp_sid;
+ }
+ found = TRUE;
}
}
else if (in_vim9script() && (flags & EVAL_VAR_NO_FUNC) == 0)
@@ -2760,7 +2763,7 @@ eval_variable(
if (ht != NULL && ht == get_script_local_ht()
&& tv != &SCRIPT_SV(current_sctx.sc_sid)->sv_var.di_tv)
{
- svar_T *sv = find_typval_in_script(tv);
+ svar_T *sv = find_typval_in_script(tv, 0);
if (sv != NULL)
type = sv->sv_type;
@@ -3278,17 +3281,19 @@ set_var(
typval_T *tv,
int copy) // make copy of value in "tv"
{
- set_var_const(name, NULL, tv, copy, ASSIGN_DECL, 0);
+ set_var_const(name, 0, NULL, tv, copy, ASSIGN_DECL, 0);
}
/*
* Set variable "name" to value in "tv".
+ * When "sid" is non-zero "name" is in the script with this ID.
* If the variable already exists and "is_const" is FALSE the value is updated.
* Otherwise the variable is created.
*/
void
set_var_const(
char_u *name,
+ scid_T sid,
type_T *type_arg,
typval_T *tv_arg,
int copy, // make copy of value in "tv"
@@ -3301,20 +3306,27 @@ set_var_const(
dictitem_T *di;
typval_T *dest_tv = NULL;
char_u *varname;
- hashtab_T *ht;
+ hashtab_T *ht = NULL;
int is_script_local;
int vim9script = in_vim9script();
int var_in_vim9script;
int flags = flags_arg;
int free_tv_arg = !copy; // free tv_arg if not used
- ht = find_var_ht(name, &varname);
+ if (sid != 0)
+ {
+ if (SCRIPT_ID_VALID(sid))
+ ht = &SCRIPT_VARS(sid);
+ varname = name;
+ }
+ else
+ ht = find_var_ht(name, &varname);
if (ht == NULL || *varname == NUL)
{
semsg(_(e_illegal_variable_name_str), name);
goto failed;
}
- is_script_local = ht == get_script_local_ht();
+ is_script_local = ht == get_script_local_ht() || sid != 0;
if (vim9script
&& !is_script_local
@@ -3347,33 +3359,14 @@ set_var_const(
if (import != NULL)
{
- scriptitem_T *si = SCRIPT_ITEM(import->imp_sid);
- svar_T *sv;
- where_T where = WHERE_INIT;
-
- // imported variable from another script
+ // imported name space cannot be used
if ((flags & ASSIGN_NO_DECL) == 0)
{
semsg(_(e_redefining_imported_item_str), name);
goto failed;
}
- if (import->imp_flags & IMP_FLAGS_STAR)
- {
- semsg(_(e_cannot_use_str_itself_it_is_imported_with_star),
- name);
- goto failed;
- }
- sv = ((svar_T *)si->sn_var_vals.ga_data) + import->imp_var_vals_idx;
-
- where.wt_variable = TRUE;
- if (check_typval_type(sv->sv_type, tv, where) == FAIL
- || value_check_lock(sv->sv_tv->v_lock, name, FALSE))
- {
- goto failed;
- }
-
- dest_tv = sv->sv_tv;
- clear_tv(dest_tv);
+ semsg(_(e_cannot_use_str_itself_it_is_imported), name);
+ goto failed;
}
}
@@ -3419,7 +3412,7 @@ set_var_const(
if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0)
{
where_T where = WHERE_INIT;
- svar_T *sv = find_typval_in_script(&di->di_tv);
+ svar_T *sv = find_typval_in_script(&di->di_tv, sid);
if (sv != NULL)
{
@@ -3956,7 +3949,7 @@ var_exists(char_u *var)
{
if (tofree != NULL)
name = tofree;
- n = (eval_variable(name, len, &tv, NULL,
+ n = (eval_variable(name, len, 0, &tv, NULL,
EVAL_VAR_NOAUTOLOAD + EVAL_VAR_IMPORT) == OK);
if (n)
{