Optimize MMethod::GetParameterIsOut to cache all parameters in a single bit-flag
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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, ¶meterTypeHandles);
|
CallStaticMethod<void, void*, void***>(GetMethodParameterTypesPtr, _handle, ¶meterTypeHandles);
|
||||||
_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
|
||||||
|
|||||||
Reference in New Issue
Block a user