45 lines
1.1 KiB
Plaintext
45 lines
1.1 KiB
Plaintext
|
|
#include "uclass.h"
|
||
|
|
namespace refl {
|
||
|
|
bool FieldPtr::Invoke(const std::vector<ArgsView>& ArgsList)const{
|
||
|
|
auto Call = type->vtable.Call;
|
||
|
|
if (Call) {
|
||
|
|
Call(this, ArgsList);
|
||
|
|
}
|
||
|
|
return Call;
|
||
|
|
}
|
||
|
|
bool FieldPtr::Invoke(std::vector<ArgsView>& ArgsList)const {
|
||
|
|
auto Call = type->vtable.Call;
|
||
|
|
if (Call) {
|
||
|
|
auto params = GetParams();
|
||
|
|
int paramsSize = params.size();
|
||
|
|
int argsSize = ArgsList.size();
|
||
|
|
if (argsSize < paramsSize && flag & FIELD_METHOD_VALUE_FLAG) {
|
||
|
|
auto [argsPtr, valueSize] = value.method();
|
||
|
|
if (argsSize + valueSize >= paramsSize) {
|
||
|
|
for (int i = valueSize + argsSize - paramsSize; i < valueSize; i++) {
|
||
|
|
ArgsList.push_back(*(argsPtr + i));
|
||
|
|
}
|
||
|
|
argsSize = paramsSize;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (argsSize < paramsSize) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
for (int i = 0; i < paramsSize; i++) {
|
||
|
|
if (ArgsList[i].cls != params[i] && !ArgsList[i].ConvertTo(params[i])) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
Call(this, ArgsList);
|
||
|
|
}
|
||
|
|
return Call;
|
||
|
|
}
|
||
|
|
std::vector<const UClass*> FieldPtr::GetParams() const {
|
||
|
|
auto GetParams = type->vtable.GetParams;
|
||
|
|
if (GetParams) {
|
||
|
|
return GetParams(type);
|
||
|
|
}
|
||
|
|
return{};
|
||
|
|
}
|
||
|
|
}
|