funcexe.fe_lastline = curwin->w_cursor.lnum;
funcexe.fe_evaluate = evaluate;
funcexe.fe_partial = partial;
+ if (partial != NULL)
+ {
+ funcexe.fe_object = partial->pt_obj;
+ if (funcexe.fe_object != NULL)
+ ++funcexe.fe_object->obj_refcount;
+ }
funcexe.fe_basetv = basetv;
funcexe.fe_check_type = type;
funcexe.fe_found_var = found_var;
END
v9.CheckSourceSuccess(lines)
+ # Using object method funcref at the script level
+ lines =<< trim END
+ vim9script
+ class A
+ this.val: number
+ def Foo(): number
+ return this.val
+ enddef
+ endclass
+ var a = A.new(345)
+ var Fn = a.Foo
+ assert_equal(345, Fn())
+ END
+ v9.CheckSourceSuccess(lines)
+
# Using object method funcref from another object method
lines =<< trim END
vim9script
a.Bar()
END
v9.CheckSourceSuccess(lines)
+
+ # Using object method funcref using call()
+ lines =<< trim END
+ vim9script
+ class A
+ this.val: number
+ def Foo(): number
+ return this.val
+ enddef
+ endclass
+
+ def Bar(obj: A)
+ assert_equal(123, call(obj.Foo, []))
+ enddef
+
+ var a = A.new(123)
+ Bar(a)
+ assert_equal(123, call(a.Foo, []))
+ END
+ v9.CheckSourceSuccess(lines)
enddef
" Test for using a class method as a funcref
END
v9.CheckSourceSuccess(lines)
+ # Using class method funcref at the script level
+ lines =<< trim END
+ vim9script
+ class A
+ public static val: number
+ static def Foo(): number
+ return val
+ enddef
+ endclass
+ A.val = 567
+ var Fn = A.Foo
+ assert_equal(567, Fn())
+ END
+ v9.CheckSourceSuccess(lines)
+
# Using function() to get a class method funcref
lines =<< trim END
vim9script
A.Bar()
END
v9.CheckSourceSuccess(lines)
+
+ # Using class method funcref using call()
+ lines =<< trim END
+ vim9script
+ class A
+ public static val: number
+ static def Foo(): number
+ return val
+ enddef
+ endclass
+
+ def Bar()
+ A.val = 468
+ assert_equal(468, call(A.Foo, []))
+ enddef
+ Bar()
+ assert_equal(468, call(A.Foo, []))
+ END
+ v9.CheckSourceSuccess(lines)
enddef
" Test for using an object member as a funcref
funcexe.fe_lastline = curwin->w_cursor.lnum;
funcexe.fe_evaluate = TRUE;
funcexe.fe_partial = partial;
+ if (partial != NULL)
+ {
+ funcexe.fe_object = partial->pt_obj;
+ if (funcexe.fe_object != NULL)
+ ++funcexe.fe_object->obj_refcount;
+ }
funcexe.fe_selfdict = selfdict;
r = call_func(name, -1, rettv, argc, argv, &funcexe);
}
CLEAR_FIELD(funcexe);
funcexe.fe_evaluate = TRUE;
funcexe.fe_partial = callback->cb_partial;
+ if (callback->cb_partial != NULL)
+ {
+ funcexe.fe_object = callback->cb_partial->pt_obj;
+ if (funcexe.fe_object != NULL)
+ ++funcexe.fe_object->obj_refcount;
+ }
++callback_depth;
ret = call_func(callback->cb_name, len, rettv, argcount, argvars, &funcexe);
--callback_depth;