diff options
Diffstat (limited to 'src/vim9execute.c')
-rw-r--r-- | src/vim9execute.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/vim9execute.c b/src/vim9execute.c index 961e4507c..1412d0836 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -235,6 +235,23 @@ dict_stack_clear(int len) } /* + * Get a pointer to useful "pt_outer" of "pt". + */ + static outer_T * +get_pt_outer(partial_T *pt) +{ + partial_T *ptref = pt->pt_outer_partial; + + if (ptref == NULL) + return &pt->pt_outer; + + // partial using partial (recursively) + while (ptref->pt_outer_partial != NULL) + ptref = ptref->pt_outer_partial; + return &ptref->pt_outer; +} + +/* * Call compiled function "cdf_idx" from compiled code. * This adds a stack frame and sets the instruction pointer to the start of the * called function. @@ -421,13 +438,13 @@ call_dfunc( return FAIL; if (pt != NULL) { - ref->or_outer = &pt->pt_outer; + ref->or_outer = get_pt_outer(pt); ++pt->pt_refcount; ref->or_partial = pt; } else if (ufunc->uf_partial != NULL) { - ref->or_outer = &ufunc->uf_partial->pt_outer; + ref->or_outer = get_pt_outer(ufunc->uf_partial); ++ufunc->uf_partial->pt_refcount; ref->or_partial = ufunc->uf_partial; } @@ -5086,7 +5103,9 @@ call_def_function( goto failed_early; if (partial != NULL) { - if (partial->pt_outer.out_stack == NULL) + outer_T *outer = get_pt_outer(partial); + + if (outer->out_stack == NULL) { if (current_ectx != NULL) { @@ -5099,7 +5118,7 @@ call_def_function( } else { - ectx.ec_outer_ref->or_outer = &partial->pt_outer; + ectx.ec_outer_ref->or_outer = outer; ++partial->pt_refcount; ectx.ec_outer_ref->or_partial = partial; } |