diff options
Diffstat (limited to 'src/nvim/runtime.c')
-rw-r--r-- | src/nvim/runtime.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c index 412b78728e..038aad12a4 100644 --- a/src/nvim/runtime.c +++ b/src/nvim/runtime.c @@ -104,7 +104,7 @@ void estack_pop(void) /// ESTACK_SCRIPT for <script>. char *estack_sfile(estack_arg_T which) { - estack_T *entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1; + const estack_T *entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1; if (which == ESTACK_SFILE && entry->es_type != ETYPE_UFUNC) { if (entry->es_name == NULL) { return NULL; @@ -112,22 +112,31 @@ char *estack_sfile(estack_arg_T which) return xstrdup(entry->es_name); } - // If evaluated in a function return the path of the script where the - // function is defined, at script level the current script path is returned + // If evaluated in a function or autocommand, return the path of the script + // where it is defined, at script level the current script path is returned // instead. if (which == ESTACK_SCRIPT) { - if (entry->es_type == ETYPE_UFUNC) { - sctx_T *def_ctx = &entry->es_info.ufunc->uf_script_ctx; - if (def_ctx->sc_sid > 0) { - return xstrdup((char *)(SCRIPT_ITEM(def_ctx->sc_sid).sn_name)); - } - } else if (exestack.ga_len > 0) { - // Walk the stack backwards, starting from the current frame. - for (int idx = exestack.ga_len - 1; idx; idx--) { - entry = ((estack_T *)exestack.ga_data) + idx; - if (entry->es_type == ETYPE_SCRIPT) { - return xstrdup(entry->es_name); + assert(entry == ((estack_T *)exestack.ga_data) + exestack.ga_len - 1); + // Walk the stack backwards, starting from the current frame. + for (int idx = exestack.ga_len - 1; idx >= 0; idx--, entry--) { + if (entry->es_type == ETYPE_UFUNC) { + const sctx_T *const def_ctx = &entry->es_info.ufunc->uf_script_ctx; + + if (def_ctx->sc_sid > 0) { + return xstrdup((char *)(SCRIPT_ITEM(def_ctx->sc_sid).sn_name)); + } else { + return NULL; + } + } else if (entry->es_type == ETYPE_AUCMD) { + const sctx_T *const def_ctx = &entry->es_info.aucmd->script_ctx; + + if (def_ctx->sc_sid > 0) { + return xstrdup((char *)(SCRIPT_ITEM(def_ctx->sc_sid).sn_name)); + } else { + return NULL; } + } else if (entry->es_type == ETYPE_SCRIPT) { + return xstrdup(entry->es_name); } } return NULL; |