Example #1
0
        internal static unsafe void InvokeWithVariantArgs(IntPtr delegateGCHandle, godot_variant **args, uint argc,
                                                          godot_variant *outRet)
        {
            try
            {
                // TODO: Optimize
                var @delegate   = (Delegate)GCHandle.FromIntPtr(delegateGCHandle).Target !;
                var managedArgs = new object?[argc];

                var parameterInfos = @delegate.Method.GetParameters();
                var paramsLength   = parameterInfos.Length;

                if (argc != paramsLength)
                {
                    throw new InvalidOperationException(
                              $"The delegate expects {paramsLength} arguments, but received {argc}.");
                }

                for (uint i = 0; i < argc; i++)
                {
                    managedArgs[i] = Marshaling.ConvertVariantToManagedObjectOfType(
                        *args[i], parameterInfos[i].ParameterType);
                }

                object?invokeRet = @delegate.DynamicInvoke(managedArgs);

                *outRet = Marshaling.ConvertManagedObjectToVariant(invokeRet);
            }
            catch (Exception e)
            {
                ExceptionUtils.LogException(e);
                *outRet = default;
            }
        }