mirror of
https://github.com/neovim/neovim
synced 2025-07-16 09:11:51 +00:00
fix(eval): don't shorten $HOME in v:stacktrace (#32634)
This commit is contained in:
@ -229,8 +229,7 @@ char *estack_sfile(estack_arg_T which)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void stacktrace_push_item(list_T *const l, ufunc_T *const fp, const char *const event,
|
static void stacktrace_push_item(list_T *const l, ufunc_T *const fp, const char *const event,
|
||||||
const linenr_T lnum, char *const filepath,
|
const linenr_T lnum, char *const filepath)
|
||||||
const bool filepath_alloced)
|
|
||||||
{
|
{
|
||||||
dict_T *const d = tv_dict_alloc_lock(VAR_FIXED);
|
dict_T *const d = tv_dict_alloc_lock(VAR_FIXED);
|
||||||
typval_T tv = {
|
typval_T tv = {
|
||||||
@ -246,11 +245,7 @@ static void stacktrace_push_item(list_T *const l, ufunc_T *const fp, const char
|
|||||||
tv_dict_add_str(d, S_LEN("event"), event);
|
tv_dict_add_str(d, S_LEN("event"), event);
|
||||||
}
|
}
|
||||||
tv_dict_add_nr(d, S_LEN("lnum"), lnum);
|
tv_dict_add_nr(d, S_LEN("lnum"), lnum);
|
||||||
if (filepath_alloced) {
|
tv_dict_add_str(d, S_LEN("filepath"), filepath);
|
||||||
tv_dict_add_allocated_str(d, S_LEN("filepath"), filepath);
|
|
||||||
} else {
|
|
||||||
tv_dict_add_str(d, S_LEN("filepath"), filepath);
|
|
||||||
}
|
|
||||||
|
|
||||||
tv_list_append_tv(l, &tv);
|
tv_list_append_tv(l, &tv);
|
||||||
}
|
}
|
||||||
@ -265,20 +260,18 @@ list_T *stacktrace_create(void)
|
|||||||
linenr_T lnum = entry->es_lnum;
|
linenr_T lnum = entry->es_lnum;
|
||||||
|
|
||||||
if (entry->es_type == ETYPE_SCRIPT) {
|
if (entry->es_type == ETYPE_SCRIPT) {
|
||||||
stacktrace_push_item(l, NULL, NULL, lnum, entry->es_name, false);
|
stacktrace_push_item(l, NULL, NULL, lnum, entry->es_name);
|
||||||
} else if (entry->es_type == ETYPE_UFUNC) {
|
} else if (entry->es_type == ETYPE_UFUNC) {
|
||||||
ufunc_T *const fp = entry->es_info.ufunc;
|
ufunc_T *const fp = entry->es_info.ufunc;
|
||||||
const sctx_T sctx = fp->uf_script_ctx;
|
const sctx_T sctx = fp->uf_script_ctx;
|
||||||
bool filepath_alloced = false;
|
char *filepath = sctx.sc_sid > 0 ? get_scriptname(sctx, NULL) : "";
|
||||||
char *filepath = sctx.sc_sid > 0 ? get_scriptname(sctx, &filepath_alloced) : "";
|
|
||||||
lnum += sctx.sc_lnum;
|
lnum += sctx.sc_lnum;
|
||||||
stacktrace_push_item(l, fp, NULL, lnum, filepath, filepath_alloced);
|
stacktrace_push_item(l, fp, NULL, lnum, filepath);
|
||||||
} else if (entry->es_type == ETYPE_AUCMD) {
|
} else if (entry->es_type == ETYPE_AUCMD) {
|
||||||
const sctx_T sctx = entry->es_info.aucmd->script_ctx;
|
const sctx_T sctx = entry->es_info.aucmd->script_ctx;
|
||||||
bool filepath_alloced = false;
|
char *filepath = sctx.sc_sid > 0 ? get_scriptname(sctx, NULL) : "";
|
||||||
char *filepath = sctx.sc_sid > 0 ? get_scriptname(sctx, &filepath_alloced) : "";
|
|
||||||
lnum += sctx.sc_lnum;
|
lnum += sctx.sc_lnum;
|
||||||
stacktrace_push_item(l, NULL, entry->es_name, lnum, filepath, filepath_alloced);
|
stacktrace_push_item(l, NULL, entry->es_name, lnum, filepath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return l;
|
return l;
|
||||||
@ -2434,9 +2427,14 @@ void scriptnames_slash_adjust(void)
|
|||||||
|
|
||||||
/// Get a pointer to a script name. Used for ":verbose set".
|
/// Get a pointer to a script name. Used for ":verbose set".
|
||||||
/// Message appended to "Last set from "
|
/// Message appended to "Last set from "
|
||||||
|
///
|
||||||
|
/// @param should_free if non-NULL and the script name is a file path, call
|
||||||
|
/// home_replace_save() on it and set *should_free to true.
|
||||||
char *get_scriptname(sctx_T script_ctx, bool *should_free)
|
char *get_scriptname(sctx_T script_ctx, bool *should_free)
|
||||||
{
|
{
|
||||||
*should_free = false;
|
if (should_free != NULL) {
|
||||||
|
*should_free = false;
|
||||||
|
}
|
||||||
|
|
||||||
switch (script_ctx.sc_sid) {
|
switch (script_ctx.sc_sid) {
|
||||||
case SID_MODELINE:
|
case SID_MODELINE:
|
||||||
@ -2465,9 +2463,12 @@ char *get_scriptname(sctx_T script_ctx, bool *should_free)
|
|||||||
script_ctx.sc_sid);
|
script_ctx.sc_sid);
|
||||||
return IObuff;
|
return IObuff;
|
||||||
}
|
}
|
||||||
|
if (should_free != NULL) {
|
||||||
*should_free = true;
|
*should_free = true;
|
||||||
return home_replace_save(NULL, sname);
|
return home_replace_save(NULL, sname);
|
||||||
|
} else {
|
||||||
|
return sname;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -292,3 +292,29 @@ describe(':source', function()
|
|||||||
os.remove(test_file)
|
os.remove(test_file)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('$HOME is not shortened in filepath in v:stacktrace from sourced file', function()
|
||||||
|
local sep = n.get_pathsep()
|
||||||
|
local xhome = table.concat({ vim.uv.cwd(), 'Xhome' }, sep)
|
||||||
|
mkdir(xhome)
|
||||||
|
clear({ env = { HOME = xhome } })
|
||||||
|
finally(function()
|
||||||
|
rmdir(xhome)
|
||||||
|
end)
|
||||||
|
local filepath = table.concat({ xhome, 'Xstacktrace.vim' }, sep)
|
||||||
|
local script = [[
|
||||||
|
func Xfunc()
|
||||||
|
throw 'Exception from Xfunc'
|
||||||
|
endfunc
|
||||||
|
]]
|
||||||
|
write_file(filepath, script)
|
||||||
|
exec('source ' .. filepath)
|
||||||
|
exec([[
|
||||||
|
try
|
||||||
|
call Xfunc()
|
||||||
|
catch
|
||||||
|
let g:stacktrace = v:stacktrace
|
||||||
|
endtry
|
||||||
|
]])
|
||||||
|
eq(filepath, n.eval('g:stacktrace[-1].filepath'))
|
||||||
|
end)
|
||||||
|
Reference in New Issue
Block a user