UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
UObjectConstructInternal.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#if !UE_WITH_CONSTINIT_UOBJECT
6
7#include "CoreMinimal.h"
8#include "UObject/Class.h"
11#include "UObject/UObjectHash.h"
13
15{
16
17// Helper methods defined in UObjectGlobals.cpp
18void ConstructFProperties(UObject* Outer, const FPropertyParamsBase* const* PropertyArray, int32 NumProperties);
19#if WITH_METADATA
20void AddMetaData(UObject* Object, const FMetaDataPairParam* MetaDataArray, int32 NumMetaData);
21#endif
22
42template<typename UClassClass, typename PostNewFn>
44 const TCHAR* PackageName,
45 const TCHAR* Name,
47 void(*RegisterNativeFunc)(),
52 const TCHAR* InConfigName,
59)
60{
61#if WITH_RELOAD
63 {
64 UPackage* Package = FindPackage(NULL, PackageName);
65 if (Package)
66 {
68 if (ReturnClass)
69 {
70 if (ReturnClass->HotReloadPrivateStaticClass(
71 InSize,
80 ))
81 {
82 // Register the class's native functions.
84 }
85 return;
86 }
87 else
88 {
89 UE_LOG(LogClass, Log, TEXT("Could not find existing class %s in package %s for reload, assuming new or modified class"), Name, PackageName);
90 }
91 }
92 else
93 {
94 UE_LOG(LogClass, Log, TEXT("Could not find existing package %s for reload of class %s, assuming a new package."), PackageName, Name);
95 }
96 }
97#endif
98
100 NewClass = ::new (NewClass)
102 (
104 Name,
105 InSize,
114 );
116 ReturnClass = NewClass; // This must be done here or recursive calls cause problems
118
120 UClassClass::StaticClass,
122 NewClass,
124 PackageName,
125 Name
126 );
127
128 // Register the class's native functions.
130}
131
132template<typename UEnumClass, typename EnumParams, typename PostNewFn>
134{
135 UObject* (*OuterFunc)() = Params.OuterFunc;
136
137 UObject* Outer = OuterFunc ? OuterFunc() : nullptr;
138
139 if (OutEnum)
140 {
141 return;
142 }
143
144 UEnumClass* NewEnum = new (EC_InternalUseOnlyConstructor, Outer, UTF8_TO_TCHAR(Params.NameUTF8), Params.ObjectFlags) UEnumClass(FObjectInitializer());
146 InPostNewFn(NewEnum, Params);
147
149 EnumNames.Reserve(Params.NumEnumerators);
150 for (const FEnumeratorParam* Enumerator = Params.EnumeratorParams, *EnumeratorEnd = Enumerator + Params.NumEnumerators; Enumerator != EnumeratorEnd; ++Enumerator)
151 {
152 EnumNames.Emplace(UTF8_TO_TCHAR(Enumerator->NameUTF8), Enumerator->Value);
153 }
154
155 const bool bAddMaxKeyIfMissing = true;
156 NewEnum->SetEnums(EnumNames, (UEnum::ECppForm)Params.CppForm, Params.EnumFlags, bAddMaxKeyIfMissing);
157 NewEnum->CppType = UTF8_TO_TCHAR(Params.CppTypeUTF8);
158
159 if (Params.DisplayNameFunc)
160 {
161 NewEnum->SetEnumDisplayNameFn(Params.DisplayNameFunc);
162 }
163
164#if WITH_METADATA
165 AddMetaData(NewEnum, Params.MetaDataArray, Params.NumMetaData);
166#endif
167}
168
169template<typename UScriptStructClass, typename StructParams, typename PostNewFn>
171{
172 UObject* (*OuterFunc)() = Params.OuterFunc;
173 UScriptStruct* (*SuperFunc)() = Params.SuperFunc;
174 UScriptStruct::ICppStructOps* (*StructOpsFunc)() = (UScriptStruct::ICppStructOps * (*)())Params.StructOpsFunc;
175
176 UObject* Outer = OuterFunc ? OuterFunc() : nullptr;
177 UScriptStruct* Super = SuperFunc ? SuperFunc() : nullptr;
179
180 if (OutStruct)
181 {
182 return;
183 }
184
185 UScriptStructClass* NewStruct = new(EC_InternalUseOnlyConstructor, Outer, UTF8_TO_TCHAR(Params.NameUTF8), Params.ObjectFlags) UScriptStructClass(FObjectInitializer(), Super, StructOps, (EStructFlags)Params.StructFlags, Params.SizeOf, Params.AlignOf);
187 InPostNewFn(NewStruct, Params);
188
189 ConstructFProperties(NewStruct, Params.PropertyArray, Params.NumProperties);
190 NewStruct->StaticLink();
191#if WITH_METADATA
192 AddMetaData(NewStruct, Params.MetaDataArray, Params.NumMetaData);
193#endif
194}
195
196template<typename UClassClass, typename ClassParams, typename PostNewFn>
198{
199 if (OutClass && (OutClass->ClassFlags & CLASS_Constructed))
200 {
201 return;
202 }
203
204 for (UObject* (* const* SingletonFunc)() = Params.DependencySingletonFuncArray, *(* const* SingletonFuncEnd)() = SingletonFunc + Params.NumDependencySingletons; SingletonFunc != SingletonFuncEnd; ++SingletonFunc)
205 {
206 (*SingletonFunc)();
207 }
208
209 UClass* NewClass = Params.ClassNoRegisterFunc();
211
212 if (NewClass->ClassFlags & CLASS_Constructed)
213 {
214 return;
215 }
216
218
220
221 UClass* SuperClass = NewClass->GetSuperClass();
222 if (SuperClass)
223 {
224 NewClass->ClassFlags |= (SuperClass->ClassFlags & CLASS_Inherit);
225 }
226
227 NewClass->ClassFlags |= (EClassFlags)(Params.ClassFlags | CLASS_Constructed);
228 // Make sure the reference token stream is empty since it will be reconstructed later on
229 // This should not apply to intrinsic classes since they emit native references before AssembleReferenceTokenStream is called.
230 if ((NewClass->ClassFlags & CLASS_Intrinsic) != CLASS_Intrinsic)
231 {
233 NewClass->ReferenceSchema.Reset();
234 }
235 NewClass->CreateLinkAndAddChildFunctionsToMap(Params.FunctionLinkArray, Params.NumFunctions);
236
237 ConstructFProperties(NewClass, Params.PropertyArray, Params.NumProperties);
238
239 if (Params.ClassConfigNameUTF8)
240 {
241 NewClass->ClassConfigName = FName(UTF8_TO_TCHAR(Params.ClassConfigNameUTF8));
242 }
243
244 NewClass->SetCppTypeInfoStatic(Params.CppClassInfo);
245
246 if (int32 NumImplementedInterfaces = Params.NumImplementedInterfaces)
247 {
248 NewClass->Interfaces.Reserve(NumImplementedInterfaces);
250 {
251 UClass* (*ClassFunc)() = ImplementedInterface->ClassFunc;
252 UClass* InterfaceClass = ClassFunc ? ClassFunc() : nullptr;
253
254 NewClass->Interfaces.Emplace(InterfaceClass, ImplementedInterface->Offset, ImplementedInterface->bImplementedByK2);
255 }
256 }
257
258#if WITH_METADATA
259 AddMetaData(NewClass, Params.MetaDataArray, Params.NumMetaData);
260#endif
261
262 NewClass->StaticLink();
263
264 NewClass->SetSparseClassDataStruct(NewClass->GetSparseClassDataArchetypeStruct());
265}
266
267template<typename UFunctionClass, typename FunctionParams, typename NewFn>
269{
270 UObject* (*OuterFunc)() = Params.OuterFunc;
271 UFunction* (*SuperFunc)() = Params.SuperFunc;
272
273 UObject* Outer = OuterFunc ? OuterFunc() : nullptr;
274 UFunction* Super = SuperFunc ? SuperFunc() : nullptr;
275
276 if (InOutFunction)
277 {
278 return;
279 }
280
281 FName FuncName(UTF8_TO_TCHAR(Params.NameUTF8));
282
283#if WITH_LIVE_CODING
284 // When a package is patched, it might reference a function in a class. When this happens, the existing UFunction
285 // object gets reused but the UField's Next pointer gets nulled out. This ends up terminating the function list
286 // for the class. To work around this issue, cache the next pointer and then restore it after the new instance
287 // is created. Only do this if we reuse the current instance.
288 UField* PrevFunctionNextField = nullptr;
289 UFunction* PrevFunction = nullptr;
291 {
293 if (PrevFunction != nullptr)
294 {
296 }
297 }
298#endif
299
300 UFunction* NewFunction = InNewFn(Outer, Super, FuncName, Params);
303
304#if WITH_LIVE_CODING
305 NewFunction->SingletonPtr = InSingletonPtr;
307 {
309 }
310#endif
311
312#if WITH_METADATA
313 AddMetaData(NewFunction, Params.MetaDataArray, Params.NumMetaData);
314#endif
315 NewFunction->RPCId = Params.RPCId;
316 NewFunction->RPCResponseId = Params.RPCResponseId;
317
318 ConstructFProperties(NewFunction, Params.PropertyArray, Params.NumProperties);
319
320 NewFunction->Bind();
321 NewFunction->StaticLink();
322}
323
324} // namespace UECodeGen_Private
325#endif // !UE_WITH_CONSTINIT_UOBJECT
#define NULL
Definition oodle2base.h:134
#define check(expr)
Definition AssertionMacros.h:314
COREUOBJECT_API void InitializePrivateStaticClass(class UClass *(*TClass_StaticClassFn)(), class UClass *TClass_Super_StaticClass, class UClass *TClass_PrivateStaticClass, class UClass *TClass_WithinClass_StaticClass, const TCHAR *PackageName, const TCHAR *Name)
Definition Class.cpp:127
EStructFlags
Definition Class.h:1023
#define TEXT(x)
Definition Platform.h:1272
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
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
EActiveReloadType GetActiveReloadType()
Definition ModuleManager.h:1171
bool IsReloadActive()
Definition ModuleManager.h:1173
EClassCastFlags
Definition ObjectMacros.h:333
EClassFlags
Definition ObjectMacros.h:199
@ CLASS_Constructed
Definition ObjectMacros.h:270
@ CLASS_Intrinsic
Definition ObjectMacros.h:268
@ CLASS_TokenStreamAssembled
Definition ObjectMacros.h:256
@ EC_StaticConstructor
Definition ObjectMacros.h:174
#define CLASS_Inherit
Definition ObjectMacros.h:281
EObjectFlags
Definition ObjectMacros.h:552
@ RF_MarkAsRootSet
Object will be marked as root set on construction and not be garbage collected, even if unreferenced ...
Definition ObjectMacros.h:568
@ RF_Public
Object is visible outside its package.
Definition ObjectMacros.h:559
@ RF_MarkAsNative
Object (UField) will be marked as native on construction (DO NOT USE THIS FLAG in HasAnyFlags() etc)
Definition ObjectMacros.h:561
@ RF_Standalone
Keep object around for editing even if unreferenced.
Definition ObjectMacros.h:560
@ RF_Transient
Don't save object.
Definition ObjectMacros.h:565
@ EC_InternalUseOnlyConstructor
Definition ObjectMacros.h:175
#define UTF8_TO_TCHAR(str)
Definition StringConv.h:1022
COREUOBJECT_API FUObjectAllocator GUObjectAllocator
Definition UObjectAllocator.cpp:11
void UObjectForceRegistration(UObjectBase *Object, bool bCheckForModuleRelease)
Definition UObjectBase.cpp:636
UPackage * FindPackage(UObject *InOuter, const TCHAR *PackageName)
Definition UObjectGlobals.cpp:924
UObject * StaticFindObjectFastInternal(const UClass *ObjectClass, const UObject *ObjectPackage, FName ObjectName, EFindObjectFlags Flags, EObjectFlags ExcludeFlags, EInternalObjectFlags ExclusiveInternalFlags)
Definition UObjectHash.cpp:1153
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
Definition UObjectGlobals.h:1292
COREUOBJECT_API UObjectBase * AllocateUObject(int32 Size, int32 Alignment, bool bAllowPermanent)
Definition UObjectAllocator.cpp:34
Definition Array.h:670
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition Class.h:3793
void(* ClassConstructorType)(const FObjectInitializer &)
Definition Class.h:3802
EClassFlags ClassFlags
Definition Class.h:3823
UObject *(* ClassVTableHelperCtorCallerType)(FVTableHelper &Helper)
Definition Class.h:3803
UClass *(* StaticClassFunctionType)()
Definition Class.h:3804
UClass * GetSuperClass() const
Definition Class.h:4352
Definition Class.h:2791
ECppForm
Definition Class.h:2799
Definition Class.h:181
Definition Class.h:2476
Definition Object.h:95
Definition Package.h:216
Definition Class.h:1720
Definition UObjectConstructInternal.h:15
void ConstructFProperties(UObject *Outer, const FPropertyParamsBase *const *PropertyArray, int32 NumProperties)
Definition UObjectGlobals.cpp:6602
void ConstructUClassNoInitHelper(const TCHAR *PackageName, const TCHAR *Name, UClass *&ReturnClass, void(*RegisterNativeFunc)(), uint32 InSize, uint32 InAlignment, EClassFlags InClassFlags, EClassCastFlags InClassCastFlags, const TCHAR *InConfigName, UClass::ClassConstructorType InClassConstructor, UClass::ClassVTableHelperCtorCallerType InClassVTableHelperCtorCaller, FUObjectCppClassStaticFunctions &&InCppClassStaticFunctions, UClass::StaticClassFunctionType InSuperClassFn, UClass::StaticClassFunctionType InWithinClassFn, PostNewFn &&InPostNewFn)
Definition UObjectConstructInternal.h:43
void ConstructUClassHelper(UClass *&OutClass, const ClassParams &Params, PostNewFn &&InPostNewFn)
Definition UObjectConstructInternal.h:197
void ConstructUEnumHelper(UEnum *&OutEnum, const EnumParams &Params, PostNewFn &&InPostNewFn)
Definition UObjectConstructInternal.h:133
void ConstructUScriptStructHelper(UScriptStruct *&OutStruct, const StructParams &Params, PostNewFn &&InPostNewFn)
Definition UObjectConstructInternal.h:170
void ConstructUFunctionHelper(UFunction *&InOutFunction, const FunctionParams &Params, UFunction **InSingletonPtr, NewFn &&InNewFn)
Definition UObjectConstructInternal.h:268
Definition ObjectMacros.h:2059
Definition Class.h:1725