vault backup: 2024-10-12 17:19:45
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
# NeedsLatentFixup
|
||||
|
||||
- **功能描述:** 用在FLatentActionInfo::Linkage属性上,告诉蓝图VM生成跳转信息
|
||||
- **使用位置:** UPROPERTY
|
||||
- **元数据类型:** bool
|
||||
- **关联项:** [Latent](Latent.md)
|
||||
- **常用程度:** ★
|
||||
|
||||
## 在源码里找到的用处:
|
||||
|
||||
```cpp
|
||||
USTRUCT(BlueprintInternalUseOnly)
|
||||
struct FLatentActionInfo
|
||||
{
|
||||
GENERATED_USTRUCT_BODY()
|
||||
|
||||
/** The resume point within the function to execute */
|
||||
UPROPERTY(meta=(NeedsLatentFixup = true))
|
||||
int32 Linkage;
|
||||
|
||||
//...
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
## 源码里发挥作用的地方:
|
||||
|
||||
看着就是把Linkage这个属性进行单独的处理。用来在JumpTargetFixupMap里进行专门的跳转
|
||||
|
||||
```cpp
|
||||
void EmitLatentInfoTerm(FBPTerminal* Term, FProperty* LatentInfoProperty, FBlueprintCompiledStatement* TargetLabel)
|
||||
{
|
||||
// Special case of the struct property emitter. Needs to emit a linkage property for fixup
|
||||
FStructProperty* StructProperty = CastFieldChecked<FStructProperty>(LatentInfoProperty);
|
||||
check(StructProperty->Struct == LatentInfoStruct);
|
||||
|
||||
int32 StructSize = LatentInfoStruct->GetStructureSize();
|
||||
uint8* StructData = (uint8*)FMemory_Alloca(StructSize);
|
||||
StructProperty->InitializeValue(StructData);
|
||||
|
||||
// Assume that any errors on the import of the name string have been caught in the function call generation
|
||||
StructProperty->ImportText_Direct(*Term->Name, StructData, NULL, 0, GLog);
|
||||
|
||||
Writer << EX_StructConst;
|
||||
Writer << LatentInfoStruct;
|
||||
Writer << StructSize;
|
||||
|
||||
checkSlow(Schema);
|
||||
for (FProperty* Prop = LatentInfoStruct->PropertyLink; Prop; Prop = Prop->PropertyLinkNext)
|
||||
{
|
||||
if (TargetLabel && Prop->GetBoolMetaData(FBlueprintMetadata::MD_NeedsLatentFixup))
|
||||
{
|
||||
// Emit the literal and queue a fixup to correct it once the address is known
|
||||
Writer << EX_SkipOffsetConst;
|
||||
CodeSkipSizeType PatchUpNeededAtOffset = Writer.EmitPlaceholderSkip();
|
||||
JumpTargetFixupMap.Add(PatchUpNeededAtOffset, FCodeSkipInfo(FCodeSkipInfo::Fixup, TargetLabel));
|
||||
}
|
||||
else if (Prop->GetBoolMetaData(FBlueprintMetadata::MD_LatentCallbackTarget))
|
||||
{
|
||||
FBPTerminal CallbackTargetTerm;
|
||||
CallbackTargetTerm.bIsLiteral = true;
|
||||
CallbackTargetTerm.Type.PinSubCategory = UEdGraphSchema_K2::PN_Self;
|
||||
EmitTermExpr(&CallbackTargetTerm, Prop);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create a new term for each property, and serialize it out
|
||||
FBPTerminal NewTerm;
|
||||
if(Schema->ConvertPropertyToPinType(Prop, NewTerm.Type))
|
||||
{
|
||||
NewTerm.bIsLiteral = true;
|
||||
Prop->ExportText_InContainer(0, NewTerm.Name, StructData, StructData, NULL, PPF_None);
|
||||
|
||||
EmitTermExpr(&NewTerm, Prop);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Do nothing for unsupported/unhandled property types. This will leave the value unchanged from its constructed default.
|
||||
Writer << EX_Nothing;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Writer << EX_EndStructConst;
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user