/// <summary> /// Calls the method represented by this <see cref="Callable"/>. /// Arguments can be passed and should match the method's signature. /// </summary> /// <param name="args">Arguments that will be passed to the method call.</param> /// <returns>The value returned by the method.</returns> public unsafe Variant Call(params Variant[] args) { using godot_callable callable = Marshaling.ConvertCallableToNative(this); int argc = args.Length; Span <godot_variant.movable> argsStoreSpan = argc <= VarArgsSpanThreshold ? stackalloc godot_variant.movable[VarArgsSpanThreshold].Cleared() : new godot_variant.movable[argc]; Span <IntPtr> argsSpan = argc <= 10 ? stackalloc IntPtr[argc] : new IntPtr[argc]; using var variantSpanDisposer = new VariantSpanDisposer(argsStoreSpan); fixed(godot_variant *varargs = &MemoryMarshal.GetReference(argsStoreSpan).DangerousSelfRef) fixed(IntPtr * argsPtr = &MemoryMarshal.GetReference(argsSpan)) { for (int i = 0; i < argc; i++) { varargs[i] = (godot_variant)args[i].NativeVar; argsPtr[i] = new IntPtr(&varargs[i]); } godot_variant ret = NativeFuncs.godotsharp_callable_call(callable, (godot_variant **)argsPtr, argc, out _); return(Variant.CreateTakingOwnershipOfDisposableValue(ret)); } }
public static godot_variant CreateFromCallableTakingOwnershipOfDisposableValue(godot_callable from) => new()