mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +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_allocated_str(d, S_LEN("filepath"), filepath); |  | ||||||
|   } else { |  | ||||||
|   tv_dict_add_str(d, S_LEN("filepath"), filepath); |   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) | ||||||
| { | { | ||||||
|  |   if (should_free != NULL) { | ||||||
|     *should_free = false; |     *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
	 zeertzjq
					zeertzjq