diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 24 | ||||
-rw-r--r-- | src/nvim/ex_cmds2.c | 59 | ||||
-rw-r--r-- | src/nvim/ops.c | 43 |
3 files changed, 60 insertions, 66 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index f4d117c391..2106c36345 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -5152,7 +5152,7 @@ void list_append_string(list_T *l, char_u *str, int len) /* * Append "n" to list "l". */ -static void list_append_number(list_T *l, varnumber_T n) +void list_append_number(list_T *l, varnumber_T n) { listitem_T *li = listitem_alloc(); li->li_tv.v_type = VAR_NUMBER; @@ -9987,7 +9987,7 @@ static void f_has(typval_T *argvars, typval_T *rettv) } } - if (n == FALSE && provider_has_feature((char *)name)) { + if (n == FALSE && eval_has_provider((char *)name)) { n = TRUE; } @@ -11695,7 +11695,7 @@ static void f_pumvisible(typval_T *argvars, typval_T *rettv) */ static void f_pyeval(typval_T *argvars, typval_T *rettv) { - script_host_eval("python_eval", argvars, rettv); + script_host_eval("python", argvars, rettv); } /* @@ -19712,23 +19712,19 @@ static void apply_job_autocmds(int id, char *name, char *type, } } -static void script_host_eval(char *method, typval_T *argvars, typval_T *rettv) +static void script_host_eval(char *name, typval_T *argvars, typval_T *rettv) { - Array args = ARRAY_DICT_INIT; - ADD(args, vim_to_object(argvars)); - Object result = provider_call(method, args); - - if (result.type == kObjectTypeNil) { + if (check_restricted() || check_secure()) { return; } - Error err = ERROR_INIT; - - if (!object_to_vim(result, rettv, &err)){ - EMSG("Error converting value back to vim"); + if (argvars[0].v_type != VAR_STRING) { + EMSG(_(e_invarg)); } - api_free_object(result); + list_T *args = list_alloc(); + list_append_string(args, argvars[0].vval.v_string, -1); + *rettv = eval_call_provider(name, "eval", args); } typval_T eval_call_provider(char *provider, char *method, list_T *arguments) diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index 1636d62c74..ee06130cf7 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -791,17 +791,17 @@ void ex_profile(exarg_T *eap) void ex_python(exarg_T *eap) { - script_host_execute("python_execute", eap); + script_host_execute("python", eap); } void ex_pyfile(exarg_T *eap) { - script_host_execute_file("python_execute_file", eap); + script_host_execute_file("python", eap); } void ex_pydo(exarg_T *eap) { - script_host_do_range("python_do_range", eap); + script_host_do_range("python", eap); } @@ -3254,46 +3254,43 @@ char_u *get_locales(expand_T *xp, int idx) #endif -static void script_host_execute(char *method, exarg_T *eap) +static void script_host_execute(char *name, exarg_T *eap) { - char *script = (char *)script_get(eap, eap->arg); + uint8_t *script = script_get(eap, eap->arg); if (!eap->skip) { - Array args = ARRAY_DICT_INIT; - ADD(args, STRING_OBJ(cstr_to_string(script ? script : (char *)eap->arg))); - // add current range - ADD(args, INTEGER_OBJ(eap->line1)); - ADD(args, INTEGER_OBJ(eap->line2)); - Object result = provider_call(method, args); - // We don't care about the result, so free it just in case a bad provider - // returned something - api_free_object(result); + list_T *args = list_alloc(); + // script + list_append_string(args, script ? script : eap->arg, -1); + // current range + list_append_number(args, eap->line1); + list_append_number(args, eap->line2); + (void)eval_call_provider(name, "execute", args); } free(script); } -static void script_host_execute_file(char *method, exarg_T *eap) +static void script_host_execute_file(char *name, exarg_T *eap) { - char buffer[MAXPATHL]; - vim_FullName(eap->arg, (uint8_t *)buffer, sizeof(buffer), false); + uint8_t buffer[MAXPATHL]; + vim_FullName(eap->arg, buffer, sizeof(buffer), false); - Array args = ARRAY_DICT_INIT; - ADD(args, STRING_OBJ(cstr_to_string(buffer))); - // add current range - ADD(args, INTEGER_OBJ(eap->line1)); - ADD(args, INTEGER_OBJ(eap->line2)); - Object result = provider_call(method, args); - api_free_object(result); + list_T *args = list_alloc(); + // filename + list_append_string(args, buffer, -1); + // current range + list_append_number(args, eap->line1); + list_append_number(args, eap->line2); + (void)eval_call_provider(name, "execute_file", args); } -static void script_host_do_range(char *method, exarg_T *eap) +static void script_host_do_range(char *name, exarg_T *eap) { - Array args = ARRAY_DICT_INIT; - ADD(args, INTEGER_OBJ(eap->line1)); - ADD(args, INTEGER_OBJ(eap->line2)); - ADD(args, STRING_OBJ(cstr_to_string((char *)eap->arg))); - Object result = provider_call(method, args); - api_free_object(result); + list_T *args = list_alloc(); + list_append_number(args, eap->line1); + list_append_number(args, eap->line2); + list_append_string(args, eap->arg, -1); + (void)eval_call_provider(name, "do_range", args); } diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 2523e21c42..2933eec415 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -1308,7 +1308,7 @@ bool adjust_clipboard_register(int *rp) { // If no reg. specified and 'unnamedclip' is set, use the // clipboard register. - if (*rp == 0 && p_unc && provider_has_feature("clipboard")) { + if (*rp == 0 && p_unc && eval_has_provider("clipboard")) { *rp = '+'; return true; } @@ -5240,28 +5240,29 @@ static void copy_register(struct yankreg *dest, struct yankreg *src) static void get_clipboard(int name) { if (!(name == '*' || name == '+' - || (p_unc && !name && provider_has_feature("clipboard")))) { + || (p_unc && !name && eval_has_provider("clipboard")))) { return; } struct yankreg *reg = &y_regs[CLIP_REGISTER]; free_register(reg); - Array args = ARRAY_DICT_INIT; - Object result = provider_call("clipboard_get", args); + list_T *args = list_alloc(); + typval_T result = eval_call_provider("clipboard", "get", args); - if (result.type != kObjectTypeArray) { + if (result.v_type != VAR_LIST) { goto err; } - Array lines = result.data.array; - reg->y_array = xcalloc(lines.size, sizeof(uint8_t *)); - reg->y_size = lines.size; + list_T *lines = result.vval.v_list; + reg->y_array = xcalloc(lines->lv_len, sizeof(uint8_t *)); + reg->y_size = lines->lv_len; - for (size_t i = 0; i < lines.size; i++) { - if (lines.items[i].type != kObjectTypeString) { + int i = 0; + for (listitem_T *li = lines->lv_first; li != NULL; li = li->li_next) { + if (li->li_tv.v_type != VAR_STRING) { goto err; } - reg->y_array[i] = (uint8_t *)lines.items[i].data.string.data; + reg->y_array[i++] = (uint8_t *)xstrdup((char *)li->li_tv.vval.v_string); } if (!name && p_unc) { @@ -5272,8 +5273,12 @@ static void get_clipboard(int name) return; err: - api_free_object(result); - free(reg->y_array); + if (reg->y_array) { + for (int i = 0; i < reg->y_size; i++) { + free(reg->y_array[i]); + } + free(reg->y_array); + } reg->y_array = NULL; reg->y_size = 0; EMSG("Clipboard provider returned invalid data"); @@ -5282,7 +5287,7 @@ err: static void set_clipboard(int name) { if (!(name == '*' || name == '+' - || (p_unc && !name && provider_has_feature("clipboard")))) { + || (p_unc && !name && eval_has_provider("clipboard")))) { return; } @@ -5293,15 +5298,11 @@ static void set_clipboard(int name) copy_register(reg, &y_regs[0]); } - Array lines = ARRAY_DICT_INIT; + list_T *lines = list_alloc(); for (int i = 0; i < reg->y_size; i++) { - ADD(lines, STRING_OBJ(cstr_to_string((char *)reg->y_array[i]))); + list_append_string(lines, reg->y_array[i], -1); } - Array args = ARRAY_DICT_INIT; - ADD(args, ARRAY_OBJ(lines)); - - Object result = provider_call("clipboard_set", args); - api_free_object(result); + (void)eval_call_provider("clipboard", "set", lines); } |