diff --git a/Source/Engine/Engine/NativeInterop.Unmanaged.cs b/Source/Engine/Engine/NativeInterop.Unmanaged.cs index 7af32fc9b..33e102089 100644 --- a/Source/Engine/Engine/NativeInterop.Unmanaged.cs +++ b/Source/Engine/Engine/NativeInterop.Unmanaged.cs @@ -1197,11 +1197,17 @@ namespace FlaxEngine.Interop } [UnmanagedCallersOnly] - internal static byte GetMethodParameterIsOut(ManagedHandle methodHandle, int parameterNum) + internal static UInt64 GetMethodParameterIsOut(ManagedHandle methodHandle) { MethodHolder methodHolder = Unsafe.As(methodHandle.Target); - ParameterInfo parameterInfo = methodHolder.method.GetParameters()[parameterNum]; - return (byte)(parameterInfo.IsOut ? 1 : 0); + var parameters = methodHolder.method.GetParameters(); + UInt64 result = 0; + for (int i = 0; i < parameters.Length; i++) + { + if (parameters[i].IsOut) + result |= 1ul << i; + } + return result; } [UnmanagedCallersOnly] diff --git a/Source/Engine/Scripting/ManagedCLR/MMethod.h b/Source/Engine/Scripting/ManagedCLR/MMethod.h index 51264d1b8..f6e6b37e2 100644 --- a/Source/Engine/Scripting/ManagedCLR/MMethod.h +++ b/Source/Engine/Scripting/ManagedCLR/MMethod.h @@ -29,6 +29,7 @@ protected: int32 _paramsCount; mutable void* _returnType; mutable Array> _parameterTypes; + mutable uint64 _parameterOuts = 0; void CacheSignature() const; #else StringAnsiView _name; diff --git a/Source/Engine/Scripting/Runtime/DotNet.cpp b/Source/Engine/Scripting/Runtime/DotNet.cpp index 21d63e9d6..65dd09b44 100644 --- a/Source/Engine/Scripting/Runtime/DotNet.cpp +++ b/Source/Engine/Scripting/Runtime/DotNet.cpp @@ -1514,13 +1514,16 @@ void MMethod::CacheSignature() const static void* GetMethodReturnTypePtr = GetStaticMethodPointer(TEXT("GetMethodReturnType")); static void* GetMethodParameterTypesPtr = GetStaticMethodPointer(TEXT("GetMethodParameterTypes")); + static void* GetMethodParameterIsOutPtr = GetStaticMethodPointer(TEXT("GetMethodParameterIsOut")); _returnType = CallStaticMethod(GetMethodReturnTypePtr, _handle); + _parameterOuts = 0; if (_paramsCount != 0) { void** parameterTypeHandles; CallStaticMethod(GetMethodParameterTypesPtr, _handle, ¶meterTypeHandles); _parameterTypes.Set(parameterTypeHandles, _paramsCount); MCore::GC::FreeMemory(parameterTypeHandles); + _parameterOuts = CallStaticMethod(GetMethodParameterIsOutPtr, _handle); } _hasCachedSignature = true; @@ -1587,9 +1590,7 @@ bool MMethod::GetParameterIsOut(int32 paramIdx) const if (!_hasCachedSignature) CacheSignature(); ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < _paramsCount); - // TODO: cache GetParameterIsOut maybe? - static void* GetMethodParameterIsOutPtr = GetStaticMethodPointer(TEXT("GetMethodParameterIsOut")); - return CallStaticMethod(GetMethodParameterIsOutPtr, _handle, paramIdx); + return _parameterOuts & (1ull << paramIdx); } bool MMethod::HasAttribute(const MClass* klass) const