Пример #1
0
        /// <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));
            }
        }
Пример #2
0
 public static godot_variant CreateFromCallableTakingOwnershipOfDisposableValue(godot_callable from)
 => new()