UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VVMVerseClass.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6
8#include "Misc/NotNull.h"
9#include "UObject/Class.h"
11#include "UObject/Package.h"
16#if WITH_VERSE_VM || defined(__INTELLISENSE__)
17#include "VerseVM/VVMClass.h"
19#include "VerseVM/VVMOpResult.h"
21#include "VerseVM/VVMShape.h"
22#endif
23
24#include "VVMVerseClass.generated.h"
25
27struct FVniTypeDesc;
28
29#if WITH_VERSE_VM || defined(__INTELLISENSE__)
30namespace Verse
31{
33struct VPackage;
34} // namespace Verse
35#endif
36
37USTRUCT()
55
56USTRUCT()
71
72USTRUCT()
74{
76
77 UPROPERTY()
79
80 UPROPERTY()
81 bool bIsInstanceMember{false};
82
83 UPROPERTY()
84 bool bIsFallible{false};
85};
86
87USTRUCT()
98
100{
101 UObject* Owner = nullptr;
102 UFunction* Function = nullptr; // May be nullptr even when valid
103 FName DisplayName = NAME_None;
104 FName UEName = NAME_None;
105
107
113 : Owner(InOwner)
115 , DisplayName(InDisplayName)
116 , UEName(InUEName)
117 {
118 }
119
120 operator bool() const
121 {
122 return Owner != nullptr;
123 }
124};
125
126// This class is deliberately simple (i.e. POD) to keep generated code size down.
127#if WITH_VERSE_VM || defined(__INTELLISENSE__)
129{
130 const char* NameUTF8;
131 Verse::VNativeFunction::FThunkFn Pointer;
132};
133#endif
134
135UCLASS(MinimalAPI, within = Package, Config = Engine)
137{
139
140public:
141 UVerseClass() = default;
142 explicit UVerseClass(
144 FName InName,
151 ClassConstructorType InClassConstructor,
152 ClassVTableHelperCtorCallerType InClassVTableHelperCtorCaller,
155
156#if UE_WITH_CONSTINIT_UOBJECT
157 consteval UVerseClass(
158 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
159 UE::CodeGen::ConstInit::FUFieldParams UFieldParams,
160 UE::CodeGen::ConstInit::FStructParams StructParams,
161 UE::CodeGen::ConstInit::FClassParams ClassParams,
162 UE::CodeGen::ConstInit::FVerseClassParams InVerseParams)
163 : Super(ObjectParams, UFieldParams, StructParams, ClassParams)
164 , CompiledInMangledPackageVersePath(InVerseParams.MangledPackageVersePath)
165 , SolClassFlags(VCLASS_UHTNative)
166 , TaskClasses(ConstEval)
167 , PersistentVars(ConstEval)
168 , SessionVars(ConstEval)
169 , VarAccessors(ConstEval)
170 , CompiledInPackageRelativeVersePath(InVerseParams.PackageRelativeVersePath)
171 , PackageRelativeVersePath(ConstEval)
172 , DisplayNameToUENameFunctionMap(ConstEval)
173 , DirectInterfaces(ConstEval)
174 , PropertiesWrittenByInitCDO(ConstEval)
175 , FunctionMangledNames(ConstEval)
176 , PredictsFunctionNames(ConstEval)
177 , PredictsVarNames(ConstEval)
178 , PredictsCoercedFunctions(ConstEval)
179 , IntPropertyConstraints(ConstEval)
180 , DoublePropertyConstraints(ConstEval)
183#endif // WITH_VERSE_COMPILER && WITH_EDITORONLY_DATA
186#endif
187 {
188 }
189#endif
190
191public:
192 //~ Begin UObjectBaseUtility interface
193 COREUOBJECT_API virtual UE::Core::FVersePath GetVersePath() const override;
194 //~ End UObjectBaseUtility interface
195
196#if WITH_EDITORONLY_DATA
198#endif
199
200private:
201 //~ Begin UObject interface
202 virtual bool IsAsset() const override;
203 COREUOBJECT_API virtual void GetPreloadDependencies(TArray<UObject*>& OutDeps) override;
204 COREUOBJECT_API virtual void GetAssetRegistryTags(FAssetRegistryTagsContext Context) const override;
205 COREUOBJECT_API virtual void PreSave(FObjectPreSaveContext ObjectSaveContext) override;
206 //~ End UObject interface
207
208 //~ Begin UStruct interface
209 COREUOBJECT_API virtual void Link(FArchive& Ar, bool bRelinkExistingProperties) override;
210 COREUOBJECT_API virtual void PreloadChildren(FArchive& Ar) override;
211 COREUOBJECT_API virtual FString GetAuthoredNameForField(const FField* Field) const override;
212 //~ End UStruct interface
213
214 //~ Begin UClass interface
215 COREUOBJECT_API virtual void PostInitInstance(UObject* InObj, FObjectInstancingGraph* InstanceGraph) override;
216 COREUOBJECT_API virtual void PostLoadInstance(UObject* InObj) override;
217 virtual bool CanCreateAssetOfClass() const override
218 {
219 return false;
220 }
221#if WITH_EDITORONLY_DATA
222 COREUOBJECT_API virtual bool CanCreateInstanceDataObject() const override;
223 COREUOBJECT_API virtual void SerializeDefaultObject(UObject* Object, FStructuredArchive::FSlot Slot) override;
224#endif
225#if WITH_EDITOR
227#endif
228 //~ End UClass interface
229
230 // UField interface.
231 COREUOBJECT_API virtual const TCHAR* GetPrefixCPP() const override;
232 // End of UField interface.
233
234public:
235#if UE_WITH_CONSTINIT_UOBJECT
236 // CONSTINIT_UOBJECT_TODO: Size increase
238#endif // UE_WITH_CONSTINIT_UOBJECT
239
240 UPROPERTY()
241 uint32 SolClassFlags = VCLASS_None;
242
243 // All coroutine task classes belonging to this class (one for each coroutine in this class)
244 UPROPERTY()
246
248 UPROPERTY()
249 TObjectPtr<UFunction> InitInstanceFunction;
250
251 UPROPERTY()
253
254 UPROPERTY()
256
257 UPROPERTY()
259
260 UPROPERTY()
261 EVerseEffectSet ConstructorEffects = EVerseEffectSet::None;
262
263 UPROPERTY()
264 FName MangledPackageVersePath; // Storing as FName since it's shared between classes
265
266#if UE_WITH_CONSTINIT_UOBJECT
267 // CONSTINIT_UOBJECT_TODO: Size increase
269#endif // UE_WITH_CONSTINIT_UOBJECT
270
271 UPROPERTY()
272 FString PackageRelativeVersePath;
273
274 //~ This map is technically wrong since the FName is caseless...
275 UPROPERTY()
276 TMap<FName, FName> DisplayNameToUENameFunctionMap;
277
278 // All interface class types that this class implements
279 UPROPERTY()
280 TArray<TObjectPtr<UVerseClass>> DirectInterfaces;
281
282 UPROPERTY()
283 TArray<TFieldPath<FProperty>> PropertiesWrittenByInitCDO;
284
285 // Store a mapping from all previous function mangled names used by the
286 // code generator to the current version of name mangling. Store
287 // NAME_None if there are multiple possible current versions for any
288 // previous version. If a previous function mangled name matches the
289 // current mangled name, nothing is stored.
290 UPROPERTY()
291 TMap<FName, FName> FunctionMangledNames;
292
293 UPROPERTY()
294 TArray<FName> PredictsFunctionNames;
295
296 UPROPERTY()
297 TMap<FAnsiString, FName> PredictsVarNames;
298
299 UPROPERTY()
300 TMap<FName, FName> PredictsCoercedFunctions;
301
302 UPROPERTY()
304
305 UPROPERTY()
307
308#if WITH_VERSE_COMPILER && WITH_EDITORONLY_DATA
310 FString PreviousPathName;
311#endif // WITH_VERSE_COMPILER && WITH_EDITORONLY_DATA
312
316
317 // Name of the CDO init function
320
321 // This is the asset path that all `UVerseClass` get when generated (we use it to identify assets as Verse classes)
323
324#if WITH_VERSE_VM || defined(__INTELLISENSE__)
325 UPROPERTY()
327
328 // The VShape representing this class's layout. This is a placeholder before linking.
329 Verse::VRestValue Shape{0};
330
331 // A pointer to the CDO. This is a placeholder before its Verse constructor has run.
332 Verse::VRestValue ConstructedDefaultObject{0};
333
334 void SetShape(Verse::FAllocationContext Context, Verse::VShape* InShape);
335
336 static Verse::FOpResult LoadField(Verse::FAllocationContext Context, UObject* Object, Verse::VUniqueString& FieldName, Verse::VNativeConstructorWrapper* Wrapper = nullptr);
337 static void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector);
338#endif
339
344 COREUOBJECT_API static void RenameDefaultSubobjects(UObject* InObject);
345
351 COREUOBJECT_API static bool ValidateSubobjectArchetypes(UObject* InObject, UObject* InArchetype);
352
354 {
355 bNeedsSubobjectInstancingForLoadedInstances = bNeedsInstancing;
356 }
357
358 // Allows dynamic instanced reference support to be toggled on/off for this class.
359 COREUOBJECT_API void EnableDynamicInstancedReferenceSupport();
360 COREUOBJECT_API void DisableDynamicInstancedReferenceSupport();
361
362 bool IsNativeBound() const { return (SolClassFlags & VCLASS_NativeBound) != VCLASS_None; }
363 bool IsUniversallyAccessible() const { return (SolClassFlags & VCLASS_UniversallyAccessible) != VCLASS_None; }
364 bool IsConcrete() const { return (SolClassFlags & VCLASS_Concrete) != VCLASS_None; }
365 bool IsVerseModule() const { return (SolClassFlags & VCLASS_Module) != VCLASS_None; }
366 bool IsUHTNative() const { return (SolClassFlags & VCLASS_UHTNative) != VCLASS_None; }
367 bool IsEpicInternal() const { return (SolClassFlags & VCLASS_EpicInternal) != VCLASS_None; }
368 bool HasInstancedSemantics() const { return (SolClassFlags & VCLASS_HasInstancedSemantics) != VCLASS_None; }
369 bool IsFinalSuper() const { return (SolClassFlags & VCLASS_FinalSuper) != VCLASS_None; }
370 bool IsExplicitlyCastable() const { return (SolClassFlags & VCLASS_Castable) != VCLASS_None; }
371 bool IsConstructorEpicInternal() const { return (SolClassFlags & VCLASS_EpicInternalConstructor) != VCLASS_None; }
372 bool IsPersistable() const { return (SolClassFlags & VCLASS_Persistable) != VCLASS_None; }
373 bool IsParametric() const { return (SolClassFlags & VCLASS_Parametric) != VCLASS_None; }
374 bool IsVNIEpicInternal() const { return (SolClassFlags & VCLASS_VNIEpicInternal) != VCLASS_None; }
375 bool IsErrIncomplete() const { return (SolClassFlags & VCLASS_Err_Incomplete) != VCLASS_None; }
376
377 void SetNativeBound() { SolClassFlags |= VCLASS_NativeBound; }
378
380 {
381 const UVerseClass* VerseClass = this;
382 while (VerseClass)
383 {
384 if (const FName* VarPropertyName = VerseClass->PredictsVarNames.Find(VarName))
385 {
386 return VarPropertyName;
387 }
388
389 VerseClass = Cast<UVerseClass>(VerseClass->GetSuperClass());
390 }
391 return nullptr;
392 }
393
395 {
396 const UVerseClass* VerseClass = this;
397 while (VerseClass)
398 {
399 if (const FVerseClassVarAccessors* Accessors = VerseClass->VarAccessors.Find(VarName))
400 {
401 return Accessors;
402 }
403
404 VerseClass = Cast<UVerseClass>(VerseClass->GetSuperClass());
405 }
406 return nullptr;
407 }
408
410 {
411 const UVerseClass* VerseClass = this;
412 while (VerseClass)
413 {
414 if (VerseClass->PredictsFunctionNames.Contains(FuncName))
415 {
416 return true;
417 }
418
419 VerseClass = Cast<UVerseClass>(VerseClass->GetSuperClass());
420 }
421 return false;
422 }
423
431
433 {
434 if (FName* NewMangledName = FindFunctionMangledName(MangledName))
435 {
436 return *NewMangledName;
437 }
438 return MangledName;
439 }
440
442 {
443 if (FName* NewMangledName = FindClassFunctionMangledName(MangledName))
444 {
445 return NewMangledName;
446 }
447 if (FName* NewMangledName = FindInterfaceFunctionMangledName(MangledName))
448 {
449 return NewMangledName;
450 }
451 return nullptr;
452 }
453
455 {
456 for (const FImplementedInterface& Interface : Interfaces)
457 {
459 {
460 if (FName* NewMangledName = SuperVerseClass->FunctionMangledNames.Find(MangledName))
461 {
462 // @note there may not be two interface methods where one does not override
463 // the other that share the same old mangled name, as the function name is
464 // based on the base overridden definition.
465 return NewMangledName;
466 }
467 }
468 }
469 return nullptr;
470 }
471
473 {
474 if (FName* NewMangledName = FunctionMangledNames.Find(MangledName))
475 {
476 return NewMangledName;
477 }
478 if (UVerseClass* SuperVerseClass = Cast<UVerseClass>(GetSuperClass()))
479 {
480 return SuperVerseClass->FindClassFunctionMangledName(MangledName);
481 }
482 return nullptr;
483 }
484
486 {
488 {
489 if (FName* OtherNewMangledName = FindFunctionMangledName(OldMangledName))
490 {
492 {
493 FunctionMangledNames.Add(OldMangledName, NAME_None);
494 }
495 }
496 else
497 {
498 FunctionMangledNames.Add(OldMangledName, NewMangledName);
499 }
500 }
501 }
502
510#if WITH_VERSE_BPVM
512#endif // WITH_VERSE_BPVM
513
517 COREUOBJECT_API static int32 GetVerseFunctionParameterCount(UFunction* Func);
518
527
528 // Reset the contents of the UHT class and return the reset information so it can be restored if the compiled failed.
529 // Being able to restore will probably not be needed once BPVM is removed
530 COREUOBJECT_API FStaleClassInfo ResetUHTNative();
531
532 // Strip verse generated functions from the function list and place into the output container for later restoring
533 COREUOBJECT_API void StripVerseGeneratedFunctions(TArray<TKeyValuePair<FName, TObjectPtr<UField>>>* StrippedFields);
534
535#if WITH_VERSE_BPVM
538#endif
539
540#if WITH_VERSE_VM || defined(__INTELLISENSE__)
541 // Set a table of thunks for native functions callable from Verse. Parameter should be a static array as it will not be copied.
544#endif
545
547 {
548 return NativeTypeDesc;
549 }
551
552private:
553 COREUOBJECT_API void CallInitInstanceFunctions(UObject* InObj, FObjectInstancingGraph* InstanceGraph);
554 COREUOBJECT_API void CallPropertyInitInstanceFunctions(UObject* InObj, FObjectInstancingGraph* InstanceGraph);
555 COREUOBJECT_API void InstanceNewSubobjects(TNotNull<UObject*> InObj);
556
557#if WITH_VERSE_BPVM
559#endif
560
561 COREUOBJECT_API void AddSessionVars(UObject*);
562
564 bool bNeedsSubobjectInstancingForLoadedInstances = false;
565
566#if WITH_EDITORONLY_DATA
567 UPROPERTY()
569#endif // WITH_EDITORONLY_DATA
570
571#if WITH_VERSE_VM || defined(__INTELLISENSE__)
573#endif
574
575 const FVniTypeDesc* NativeTypeDesc{nullptr};
576};
#define UE_INTERNAL
Definition CoreMiscDefines.h:345
#define WITH_EDITORONLY_DATA
Definition CoreMiscDefines.h:24
@ ConstEval
Definition CoreMiscDefines.h:161
void(* FNativeFuncPtr)(UObject *Context, FFrame &TheStack, RESULT_DECL)
Definition CoreNative.h:17
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::UTF8CHAR UTF8CHAR
An 8-bit character containing a UTF8 (Unicode, 8-bit, variable-width) code unit.
Definition Platform.h:1137
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
T TNotNull
Definition NotNull.h:307
const bool
Definition NetworkReplayStreaming.h:178
EClassCastFlags
Definition ObjectMacros.h:333
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
EClassFlags
Definition ObjectMacros.h:199
EStaticConstructor
Definition ObjectMacros.h:174
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
EObjectFlags
Definition ObjectMacros.h:552
#define UCLASS(...)
Definition ObjectMacros.h:776
#define USTRUCT(...)
Definition ObjectMacros.h:746
void SetShape(FPhysTypeDummy &Hit, FPhysTypeDummy *Shape)
Definition PhysInterface_Chaos.h:186
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
EFieldIterationFlags
Definition UnrealType.h:7024
@ VCLASS_EpicInternalConstructor
Definition VVMVerseClassFlags.h:19
@ VCLASS_EpicInternal
Definition VVMVerseClassFlags.h:15
@ VCLASS_Persistable
Definition VVMVerseClassFlags.h:20
@ VCLASS_FinalSuper
Definition VVMVerseClassFlags.h:17
@ VCLASS_UniversallyAccessible
Definition VVMVerseClassFlags.h:10
@ VCLASS_NativeBound
Definition VVMVerseClassFlags.h:9
@ VCLASS_HasInstancedSemantics
Definition VVMVerseClassFlags.h:16
@ VCLASS_Castable
Definition VVMVerseClassFlags.h:18
@ VCLASS_Err_Incomplete
Definition VVMVerseClassFlags.h:27
@ VCLASS_Concrete
Definition VVMVerseClassFlags.h:11
@ VCLASS_VNIEpicInternal
Definition VVMVerseClassFlags.h:22
@ VCLASS_None
Definition VVMVerseClassFlags.h:8
@ VCLASS_Module
Definition VVMVerseClassFlags.h:12
@ VCLASS_UHTNative
Definition VVMVerseClassFlags.h:13
@ VCLASS_Parametric
Definition VVMVerseClassFlags.h:21
EVerseEffectSet
Definition VVMVerseEffectSet.h:16
if(Failed) console_printf("Failed.\n")
UEBinkAudioDecodeInterface * Interface
Definition binka_ue_decode_test.cpp:24
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Engine.Build.cs:7
Definition Archive.h:1208
Definition AssetRegistryTagsContext.h:98
Definition UnrealType.h:2503
Definition Field.h:556
Definition UnrealType.h:2336
Definition UnrealType.h:3843
Definition NameTypes.h:617
Definition UObjectGlobals.h:1292
Definition ObjectSaveContext.h:244
Definition UnrealType.h:174
Definition UObjectGlobals.h:2492
Definition StructuredArchiveSlots.h:52
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition UnrealString.h.inl:34
Definition CookedMetaData.h:165
Definition Class.h:3793
Definition VersePath.h:14
Definition Class.h:2476
Definition Object.h:95
Definition VVMVerseClass.h:137
FName * FindClassFunctionMangledName(FName MangledName)
Definition VVMVerseClass.h:472
static COREUOBJECT_API const FName NativeParentClassTagName
Definition VVMVerseClass.h:313
bool IsConcrete() const
Definition VVMVerseClass.h:364
bool CanMemberFunctionBeCalledFromPredicts(FName FuncName)
Definition VVMVerseClass.h:409
FName * FindInterfaceFunctionMangledName(FName MangledName)
Definition VVMVerseClass.h:454
const FName * FindPredictsVarPropertyName(const FAnsiString &VarName)
Definition VVMVerseClass.h:379
bool IsFinalSuper() const
Definition VVMVerseClass.h:369
static COREUOBJECT_API const FTopLevelAssetPath VerseClassTopLevelAssetPath
Definition VVMVerseClass.h:322
static COREUOBJECT_API const FName InitCDOFunctionName
Definition VVMVerseClass.h:318
void SetNativeTypeDesc(const FVniTypeDesc *InNativeTypeDesc)
Definition VVMVerseClass.h:550
bool IsUHTNative() const
Definition VVMVerseClass.h:366
void SetNeedsSubobjectInstancingForLoadedInstances(bool bNeedsInstancing)
Definition VVMVerseClass.h:353
bool IsEpicInternal() const
Definition VVMVerseClass.h:367
static COREUOBJECT_API const FName PackageRelativeVersePathTagName
Definition VVMVerseClass.h:315
bool IsPersistable() const
Definition VVMVerseClass.h:372
bool IsErrIncomplete() const
Definition VVMVerseClass.h:375
bool IsExplicitlyCastable() const
Definition VVMVerseClass.h:370
FName * FindFunctionMangledName(FName MangledName)
Definition VVMVerseClass.h:441
bool IsNativeBound() const
Definition VVMVerseClass.h:362
FName GetFunctionMangledName(FName MangledName)
Definition VVMVerseClass.h:432
bool IsVNIEpicInternal() const
Definition VVMVerseClass.h:374
bool IsConstructorEpicInternal() const
Definition VVMVerseClass.h:371
UVerseClass()=default
void AddFunctionMangledNames(FName OldMangledName, FName NewMangledName)
Definition VVMVerseClass.h:485
const FVniTypeDesc * GetNativeTypeDesc()
Definition VVMVerseClass.h:546
static COREUOBJECT_API const FName PackageVersePathTagName
Definition VVMVerseClass.h:314
const FVerseClassVarAccessors * FindAccessors(FName VarName) const
Definition VVMVerseClass.h:394
static COREUOBJECT_API const FName StructPaddingDummyName
Definition VVMVerseClass.h:319
bool IsVerseModule() const
Definition VVMVerseClass.h:365
bool IsParametric() const
Definition VVMVerseClass.h:373
bool IsUniversallyAccessible() const
Definition VVMVerseClass.h:363
void SetNativeBound()
Definition VVMVerseClass.h:377
bool HasInstancedSemantics() const
Definition VVMVerseClass.h:368
Definition FieldSystemNoiseAlgo.cpp:6
Definition Archive.h:36
Definition Class.h:3684
Definition Class.h:4941
Definition TopLevelAssetPath.h:38
Definition ObjectMacros.h:2059
Definition VVMVerseClass.h:74
Definition VVMVerseClass.h:89
Definition VVMVerseConstraints.h:21
Definition VVMVerseClass.h:100
FVerseFunctionDescriptor(UObject *InOwner, UFunction *InFunction, FName InDisplayName, FName InUEName)
Definition VVMVerseClass.h:108
FVerseFunctionDescriptor()=default
Definition VVMVerseConstraints.h:9
Definition VVMVerseClass.h:39
FVersePersistentVar()=default
Definition VVMVerseClass.h:58
FVerseSessionVar()=default
Definition VVMVerseNativeTypeDesc.h:31
Definition FieldPath.h:283
Definition UnrealTemplate.h:462
Definition ObjectPtr.h:488
Definition VVMVerseClass.h:520
TMap< FName, FName > DisplayNameToUENameFunctionMap
Definition VVMVerseClass.h:522
TObjectPtr< UVerseClass > SourceClass
Definition VVMVerseClass.h:521
TMap< FName, FName > FunctionMangledNames
Definition VVMVerseClass.h:523
TArray< TObjectPtr< UVerseClass > > TaskClasses
Definition VVMVerseClass.h:524
TArray< TKeyValuePair< FName, TObjectPtr< UField > > > Children
Definition VVMVerseClass.h:525