Optimize MMethod::GetParameterIsOut to cache all parameters in a single bit-flag

This commit is contained in:
2026-03-30 19:56:32 +02:00
parent 2748216190
commit d96e1297f7
3 changed files with 14 additions and 6 deletions
@@ -1197,11 +1197,17 @@ namespace FlaxEngine.Interop
} }
[UnmanagedCallersOnly] [UnmanagedCallersOnly]
internal static byte GetMethodParameterIsOut(ManagedHandle methodHandle, int parameterNum) internal static UInt64 GetMethodParameterIsOut(ManagedHandle methodHandle)
{ {
MethodHolder methodHolder = Unsafe.As<MethodHolder>(methodHandle.Target); MethodHolder methodHolder = Unsafe.As<MethodHolder>(methodHandle.Target);
ParameterInfo parameterInfo = methodHolder.method.GetParameters()[parameterNum]; var parameters = methodHolder.method.GetParameters();
return (byte)(parameterInfo.IsOut ? 1 : 0); UInt64 result = 0;
for (int i = 0; i < parameters.Length; i++)
{
if (parameters[i].IsOut)
result |= 1ul << i;
}
return result;
} }
[UnmanagedCallersOnly] [UnmanagedCallersOnly]
@@ -29,6 +29,7 @@ protected:
int32 _paramsCount; int32 _paramsCount;
mutable void* _returnType; mutable void* _returnType;
mutable Array<void*, InlinedAllocation<8>> _parameterTypes; mutable Array<void*, InlinedAllocation<8>> _parameterTypes;
mutable uint64 _parameterOuts = 0;
void CacheSignature() const; void CacheSignature() const;
#else #else
StringAnsiView _name; StringAnsiView _name;
+4 -3
View File
@@ -1514,13 +1514,16 @@ void MMethod::CacheSignature() const
static void* GetMethodReturnTypePtr = GetStaticMethodPointer(TEXT("GetMethodReturnType")); static void* GetMethodReturnTypePtr = GetStaticMethodPointer(TEXT("GetMethodReturnType"));
static void* GetMethodParameterTypesPtr = GetStaticMethodPointer(TEXT("GetMethodParameterTypes")); static void* GetMethodParameterTypesPtr = GetStaticMethodPointer(TEXT("GetMethodParameterTypes"));
static void* GetMethodParameterIsOutPtr = GetStaticMethodPointer(TEXT("GetMethodParameterIsOut"));
_returnType = CallStaticMethod<void*, void*>(GetMethodReturnTypePtr, _handle); _returnType = CallStaticMethod<void*, void*>(GetMethodReturnTypePtr, _handle);
_parameterOuts = 0;
if (_paramsCount != 0) if (_paramsCount != 0)
{ {
void** parameterTypeHandles; void** parameterTypeHandles;
CallStaticMethod<void, void*, void***>(GetMethodParameterTypesPtr, _handle, &parameterTypeHandles); CallStaticMethod<void, void*, void***>(GetMethodParameterTypesPtr, _handle, &parameterTypeHandles);
_parameterTypes.Set(parameterTypeHandles, _paramsCount); _parameterTypes.Set(parameterTypeHandles, _paramsCount);
MCore::GC::FreeMemory(parameterTypeHandles); MCore::GC::FreeMemory(parameterTypeHandles);
_parameterOuts = CallStaticMethod<uint64, void*>(GetMethodParameterIsOutPtr, _handle);
} }
_hasCachedSignature = true; _hasCachedSignature = true;
@@ -1587,9 +1590,7 @@ bool MMethod::GetParameterIsOut(int32 paramIdx) const
if (!_hasCachedSignature) if (!_hasCachedSignature)
CacheSignature(); CacheSignature();
ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < _paramsCount); ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < _paramsCount);
// TODO: cache GetParameterIsOut maybe? return _parameterOuts & (1ull << paramIdx);
static void* GetMethodParameterIsOutPtr = GetStaticMethodPointer(TEXT("GetMethodParameterIsOut"));
return CallStaticMethod<bool, void*, int>(GetMethodParameterIsOutPtr, _handle, paramIdx);
} }
bool MMethod::HasAttribute(const MClass* klass) const bool MMethod::HasAttribute(const MClass* klass) const