Skip to content

Commit f79f1cc

Browse files
author
laishikai
committed
修正TMap拷贝参数传递的BUG
1 parent 9840443 commit f79f1cc

File tree

7 files changed

+61
-20
lines changed

7 files changed

+61
-20
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# 忽略指定文件夹
22
.vs
3+
.vscode
34
Intermediate
45
Saved
56
DerivedDataCache

Content/Script/FCUIEntrypoint.lua

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ function FCUIEntrypoint:ReceiveBeginPlay()
1515
a:Add(201)
1616
a:Add(501)
1717

18-
local map = TMap("int", "int")
18+
-- local map = obj.IDMap
19+
local map = TMap("int32", "int32")
1920
map:Add(1, 10)
2021
map:Add(2, 20)
2122

@@ -25,7 +26,8 @@ function FCUIEntrypoint:ReceiveBeginPlay()
2526
it:ToNext()
2627
end
2728

28-
obj.IDMap = map
29+
obj:SetIDList(a)
30+
-- obj.IDMap = map
2931
obj:SetIDMap(map)
3032

3133
local b = obj:GetIDList()

Content/UnLua/Script/UI/UnluaEntryPointer.lua

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ function UnluaEntryPointer:ReceiveBeginPlay()
1818
local obj = NewObject(AvatarClass)
1919

2020
local map = TMap(_G.int32, _G.int32)
21+
map:Add(1, 10)
22+
map:Add(2, 20)
2123
obj:SetIDMap(map)
2224
obj:SetIDMap(map)
2325

Plugins/FCScript/Source/FCScript/Private/FCCallScriptFunc.cpp

+27-3
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,15 @@ void ReadScriptTArray(lua_State* L, int ValueIdx, const FCDynamicPropertyBase*
497497
if(EFCObjRefType::NewTArray == ObjRef->RefType)
498498
{
499499
FArrayProperty* Property = (FArrayProperty*)DynamicProperty->Property;
500-
Property->CopyValuesInternal(ValueAddr, ObjRef->GetPropertyAddr(), DynamicProperty->Property->ArrayDim);
500+
if (DynamicProperty->bTempNeedRef)
501+
{
502+
((FCDynamicPropertyBase*)DynamicProperty)->bTempRealRef = true;
503+
FMemory::Memcpy(ValueAddr, ObjRef->GetPropertyAddr(), sizeof(FScriptArray));
504+
}
505+
else
506+
{
507+
Property->CopyValuesInternal(ValueAddr, ObjRef->GetPropertyAddr(), DynamicProperty->Property->ArrayDim);
508+
}
501509
}
502510
else if(DynamicProperty->Type == FCPropertyType::FCPROPERTY_Array)
503511
{
@@ -519,7 +527,15 @@ void ReadScriptTMap(lua_State* L, int ValueIdx, const FCDynamicPropertyBase* Dyn
519527
{
520528
FMapProperty* Property = (FMapProperty*)DynamicProperty->Property;
521529
//Property->CopyValuesInternal(ValueAddr, ObjRef->GetPropertyAddr(), DynamicProperty->Property->ArrayDim);
522-
Property->CopyCompleteValue(ValueAddr, ObjRef->GetPropertyAddr());
530+
if(DynamicProperty->bTempNeedRef)
531+
{
532+
((FCDynamicPropertyBase *)DynamicProperty)->bTempRealRef = true;
533+
FMemory::Memcpy(ValueAddr, ObjRef->GetPropertyAddr(), sizeof(FScriptMap));
534+
}
535+
else
536+
{
537+
Property->CopyCompleteValue(ValueAddr, ObjRef->GetPropertyAddr());
538+
}
523539
}
524540
else if (DynamicProperty->Type == FCPropertyType::FCPROPERTY_Map)
525541
{
@@ -542,7 +558,15 @@ void ReadScriptTSet(lua_State* L, int ValueIdx, const FCDynamicPropertyBase* Dyn
542558
{
543559
FSetProperty* Property = (FSetProperty*)DynamicProperty->Property;
544560
//Property->CopyValuesInternal(ValueAddr, ObjRef->GetPropertyAddr(), DynamicProperty->Property->ArrayDim);
545-
Property->CopyCompleteValue(ValueAddr, ObjRef->GetPropertyAddr());
561+
if (DynamicProperty->bTempNeedRef)
562+
{
563+
((FCDynamicPropertyBase*)DynamicProperty)->bTempRealRef = true;
564+
FMemory::Memcpy(ValueAddr, ObjRef->GetPropertyAddr(), sizeof(FScriptSet));
565+
}
566+
else
567+
{
568+
Property->CopyCompleteValue(ValueAddr, ObjRef->GetPropertyAddr());
569+
}
546570
}
547571
else if (DynamicProperty->Type == FCPropertyType::FCPROPERTY_Set)
548572
{

Plugins/FCScript/Source/FCScript/Private/FCDynamicClassDesc.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ struct FCDynamicPropertyBase : public FCDynamicField
4444
const FProperty *Property;
4545
bool bRef; // 是不是引用类型
4646
bool bOuter; // 是不是输出类型
47+
bool bTempNeedRef; // 临时的上下拷贝参数标记
48+
bool bTempRealRef; //
4749

48-
FCDynamicPropertyBase() :ElementSize(0), Offset_Internal(0), PropertyIndex(0), ScriptParamIndex(0), Type(FCPropertyType::FCPROPERTY_Unkonw), Flags(CPF_None), Property(nullptr), bRef(false), bOuter(false)
50+
FCDynamicPropertyBase() :ElementSize(0), Offset_Internal(0), PropertyIndex(0), ScriptParamIndex(0), Type(FCPropertyType::FCPROPERTY_Unkonw), Flags(CPF_None), Property(nullptr), bRef(false), bOuter(false), bTempNeedRef(false), bTempRealRef(false)
4951
{
5052
}
5153
bool IsRef() const

Plugins/FCScript/Source/FCScript/Private/FCRunTimeRegister.cpp

+18-11
Original file line numberDiff line numberDiff line change
@@ -657,17 +657,19 @@ int WrapNativeCallFunction(lua_State* L, int ParamIndex, UObject *ThisObject, FC
657657
int StackSize = DynamicFunc->ParmsSize;
658658
UFunction* Function = DynamicFunc->Function;
659659
int nParamCount = DynamicFunc->ParamCount;
660-
const FCDynamicProperty* BeginProperty = DynamicFunc->m_Property.data();
661-
const FCDynamicProperty* EndProperty = BeginProperty + nParamCount;
662-
const FCDynamicProperty* DynamicProperty = BeginProperty;
660+
FCDynamicProperty* BeginProperty = DynamicFunc->m_Property.data();
661+
FCDynamicProperty* EndProperty = BeginProperty + nParamCount;
662+
FCDynamicProperty* DynamicProperty = (FCDynamicProperty *)BeginProperty;
663663
uint8* Frame = Buffer;
664664
int nAllBuffSize = Function->PropertiesSize + Function->ParmsSize;
665-
int OuterAddrOffset = nAllBuffSize;
666-
int OutParmRecOffset = OuterAddrOffset + DynamicFunc->OuterParamSize;
665+
//int OuterAddrOffset = nAllBuffSize;
666+
//int OutParmRecOffset = OuterAddrOffset + DynamicFunc->OuterParamSize;
667+
int OutParmRecOffset = nAllBuffSize;
667668
int OuterIndesOffset = OutParmRecOffset;
668669
if(DynamicFunc->bOuter)
669670
{
670-
nAllBuffSize += DynamicFunc->OuterParamSize + sizeof(FOutParmRec) * DynamicFunc->OuterParamCount;
671+
//nAllBuffSize += DynamicFunc->OuterParamSize + sizeof(FOutParmRec) * DynamicFunc->OuterParamCount;
672+
nAllBuffSize += sizeof(FOutParmRec) * DynamicFunc->OuterParamCount;
671673
OuterIndesOffset = nAllBuffSize;
672674
nAllBuffSize += sizeof(short) * DynamicFunc->OuterParamCount;
673675
}
@@ -682,7 +684,7 @@ int WrapNativeCallFunction(lua_State* L, int ParamIndex, UObject *ThisObject, FC
682684
int Index = ParamIndex;
683685
uint8 *Locals = Frame;
684686
uint8 *ValueAddr = Locals;
685-
uint8 *OuterAddr = Locals + OuterAddrOffset;
687+
//uint8 *OuterAddr = Locals + OuterAddrOffset;
686688
FOutParmRec* FristOuterParms = (FOutParmRec*)(Locals + OutParmRecOffset);
687689
FOutParmRec* OuterParms = FristOuterParms;
688690
int LatentPropertyIndex = DynamicFunc->LatentPropertyIndex;
@@ -698,17 +700,21 @@ int WrapNativeCallFunction(lua_State* L, int ParamIndex, UObject *ThisObject, FC
698700
FLatentActionInfo LatentActionInfo(ThreadRef, GetTypeHash(FGuid::NewGuid()), TEXT("OnLatentActionCompleted"), GetScriptContext()->m_Ticker);
699701
DynamicProperty->Property->CopySingleValue(ValueAddr, &LatentActionInfo);
700702
}
703+
DynamicProperty->bTempNeedRef = true;
704+
DynamicProperty->bTempRealRef = false;
701705
DynamicProperty->m_ReadScriptFunc(L, Index, DynamicProperty, ValueAddr, nullptr, nullptr);
706+
DynamicProperty->bTempNeedRef = false;
702707

703708
if(DynamicProperty->bOuter)
704709
{
705710
*OuterIndexs++ = (short)(Index - ParamIndex);
706711
//DynamicProperty->Property->InitializeValue(OuterAddr);
707-
OuterParms->NextOutParm = nullptr;
708-
OuterParms->Property = (FProperty*)DynamicProperty->Property;
709-
OuterParms->PropAddr = ValueAddr;
710712
//OuterParms->PropAddr = OuterAddr;
711713
//OuterAddr += DynamicProperty->Property->ElementSize;
714+
715+
OuterParms->PropAddr = ValueAddr;
716+
OuterParms->NextOutParm = nullptr;
717+
OuterParms->Property = (FProperty*)DynamicProperty->Property;
712718
if(OuterParms != FristOuterParms)
713719
{
714720
(OuterParms-1)->NextOutParm = OuterParms;
@@ -787,7 +793,8 @@ int WrapNativeCallFunction(lua_State* L, int ParamIndex, UObject *ThisObject, FC
787793
for (; DynamicProperty < EndProperty; ++DynamicProperty)
788794
{
789795
ValueAddr = Locals + DynamicProperty->Offset_Internal;
790-
DynamicProperty->Property->DestroyValue(ValueAddr);
796+
if(!DynamicProperty->bTempRealRef)
797+
DynamicProperty->Property->DestroyValue(ValueAddr);
791798
}
792799

793800
// 释放临时内存

Plugins/FCScript/Source/FCScript/Private/FCTemplateType.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,8 @@ FMapProperty* CreateTMapProperty(const char *KeyType, const char *ValueType)
384384
MapProperty->ValueProp = ValueProperty;
385385

386386
int ValueSize = ValueProperty->ElementSize * ValueProperty->ArrayDim;
387-
int AlignKeySize = (KeyProperty->ElementSize + 7)/8*8;
388-
int AlignValueSize = (ValueSize + 7)/8*8;
387+
int AlignKeySize = KeyProperty->GetMinAlignment();
388+
int AlignValueSize = ValueProperty->GetMinAlignment();
389389

390390
MapProperty->MapLayout = FScriptMap::GetScriptLayout(KeyProperty->ElementSize, AlignKeySize, ValueSize, AlignValueSize);
391391

@@ -429,7 +429,7 @@ FSetProperty* CreateTSetProperty(const char* ClassName)
429429
SetProperty->ElementProp = ElementProp;
430430

431431
int ValueSize = ElementProp->ElementSize * ElementProp->ArrayDim;
432-
int AlignValueSize = (ValueSize + 7) / 8 * 8;
432+
int AlignValueSize = ElementProp->GetMinAlignment();
433433

434434
SetProperty->SetLayout = FScriptSet::GetScriptLayout(ValueSize, AlignValueSize);
435435

@@ -471,6 +471,9 @@ void ReleaseTempalteProperty()
471471

472472
GPropertyBaseCopyTypeMap.clear();
473473

474+
GTempalteDynamicPropertyMap.clear();
475+
GMapTemplateDynamicPropertyMap.clear();
476+
474477
GScriptStruct = nullptr;
475478
}
476479

0 commit comments

Comments
 (0)