UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Stack.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 Stack.h: Kismet VM execution stack definition.
5=============================================================================*/
6
7#pragma once
8
9#include "UObject/Script.h"
10#include "Misc/CoreMisc.h"
11#include "Templates/Casts.h"
12#include "UObject/UnrealType.h"
15
17
18#ifndef UE_USE_VIRTUAL_STACK_ALLOCATOR_FOR_SCRIPT_VM
19#define UE_USE_VIRTUAL_STACK_ALLOCATOR_FOR_SCRIPT_VM 0
20#endif
21
22#if UE_USE_VIRTUAL_STACK_ALLOCATOR_FOR_SCRIPT_VM
24{
25 if (Size == 0)
26 {
27 return nullptr;
28 }
29 if (Align < 16)
30 {
31 Align = 16;
32 }
33 return Allocator->Allocate(Size, Align);
34}
35
36#define UE_VSTACK_MAKE_FRAME(Name, VirtualStackAllocatorPtr) FScopedStackAllocatorBookmark Name = (VirtualStackAllocatorPtr)->CreateScopedBookmark()
37#define UE_VSTACK_ALLOC(VirtualStackAllocatorPtr, Size) UeVstackAllocHelper((VirtualStackAllocatorPtr), (Size), 0)
38#define UE_VSTACK_ALLOC_ALIGNED(VirtualStackAllocatorPtr, Size, Align) UeVstackAllocHelper((VirtualStackAllocatorPtr), (Size), (Align))
39#else
40#define UE_VSTACK_MAKE_FRAME(Name, VirtualStackAllocatorPtr)
41#define UE_VSTACK_ALLOC(VirtualStackAllocatorPtr, Size) FMemory_Alloca(Size)
42#define UE_VSTACK_ALLOC_ALIGNED(VirtualStackAllocatorPtr, Size, Align) FMemory_Alloca_Aligned(Size, Align)
43#endif
44
90
91
92
93/*-----------------------------------------------------------------------------
94 Execution stack helpers.
95-----------------------------------------------------------------------------*/
96
98
99//
100// Information remembered about an Out parameter.
101//
108
109//
110// Information about script execution at one stack level.
111//
112
113struct FFrame : public FOutputDevice
114{
115public:
116 // Variables.
121
125
128
131
134
137
140
141#if UE_USE_VIRTUAL_STACK_ALLOCATOR_FOR_SCRIPT_VM
143#endif
144
147
149
152
153#if PER_FUNCTION_SCRIPT_STATS
156#endif
157public:
158
159 // Constructors.
161
162 virtual ~FFrame()
163 {
164#if DO_BLUEPRINT_GUARD
165 FBlueprintContextTracker& BlueprintExceptionTracker = FBlueprintContextTracker::Get();
166 if (BlueprintExceptionTracker.ScriptStack.Num())
167 {
169 }
170
171 // ensure that GTopTrackingStackFrame is accurate
172 if (BlueprintExceptionTracker.ScriptStack.Num() == 0)
173 {
174 ensure(PreviousTrackingFrame == nullptr);
175 }
176 else
177 {
179 }
180#endif
182
184 {
185 // we propagate bAbortingExecution to frames below to avoid losing abort state
186 // across heterogeneous frames (eg. bpvm -> c++ -> bpvm)
188 }
189 }
190
191 // Functions.
193
196
198 COREUOBJECT_API void StepExplicitProperty(void*const Result, FProperty* Property);
199
201 template<class TProperty>
202 FORCEINLINE_DEBUGGABLE void StepCompiledIn(void* Result);
204
206 template<class TProperty, typename TNativeType>
208
209 COREUOBJECT_API virtual void Serialize( const TCHAR* V, ELogVerbosity::Type Verbosity, const class FName& Category ) override;
210
211 COREUOBJECT_API static void KismetExecutionMessage(const TCHAR* Message, ELogVerbosity::Type Verbosity, FName WarningId = FName());
212
214 const uint8 PeekCode() const { return *Code; }
215
217 void SkipCode(const int32 NumOps) { Code += NumOps; }
218
219 template<typename T>
220 T Read();
221 template<typename TNumericType>
223 float ReadFloat();
224 double ReadDouble();
226 FName ReadName();
228 int32 ReadWord();
230
233
242
251
255 COREUOBJECT_API FString GetStackTrace() const;
256
262 COREUOBJECT_API void GetStackTrace(FStringBuilderBase& StringBuilder) const;
263
270 COREUOBJECT_API static FString GetScriptCallstack(bool bReturnEmpty = false, bool bTopOfStackOnly = false);
271
279 COREUOBJECT_API static void GetScriptCallstack(FStringBuilderBase& StringBuilder, bool bReturnEmpty = false, bool bTopOfStackOnly = false);
280
284 UE_DEPRECATED(5.1, "Please use GetStackDescription(FStringBuilderBase&).")
285 COREUOBJECT_API FString GetStackDescription() const;
286
292 COREUOBJECT_API void GetStackDescription(FStringBuilderBase& StringBuilder) const;
293
294#if DO_BLUEPRINT_GUARD
295 static void InitPrintScriptCallstack();
296#endif
297
301};
302
303
304/*-----------------------------------------------------------------------------
305 FFrame implementation.
306-----------------------------------------------------------------------------*/
307
309 : Node(InNode)
310 , Object(InObject)
311 , Code(InNode->Script.GetData())
312 , Locals((uint8*)InLocals)
313 , MostRecentProperty(nullptr)
314 , MostRecentPropertyAddress(nullptr)
315 , MostRecentPropertyContainer(nullptr)
316 , PreviousFrame(InPreviousFrame)
317 , OutParms(NULL)
318 , PropertyChainForCompiledIn(InPropertyChainForCompiledIn)
319 , CurrentNativeFunction(nullptr)
320 , bArrayContextFailed(false)
321 , bAbortingExecution(false)
323 , DepthCounter(0)
324#endif
325{
326#if DO_BLUEPRINT_GUARD
327 FBlueprintContextTracker::Get().ScriptStack.Push(this);
328#endif
330
331 {
332 // we propagate bAbortingExecution to *upper* frames to avoid invoking code
333 // on top of already-aborted frames
335 {
337 }
338 if (InPreviousFrame)
339 {
340 bAbortingExecution |= InPreviousFrame->bAbortingExecution;
341 }
342 }
343
344#if PER_FUNCTION_SCRIPT_STATS
345 if (InPreviousFrame)
346 {
347 DepthCounter = (InPreviousFrame->DepthCounter < MAX_uint8) ? InPreviousFrame->DepthCounter + 1 : MAX_uint8;
348 }
349#endif
350#if UE_USE_VIRTUAL_STACK_ALLOCATOR_FOR_SCRIPT_VM
351 if (InPreviousFrame == nullptr)
352 {
354 }
355 else
356 {
357 CachedThreadVirtualStackAllocator = InPreviousFrame->CachedThreadVirtualStackAllocator;
358 }
359#endif
360}
361
362template<typename T>
363inline T FFrame::Read()
364{
365 T Result = FPlatformMemory::ReadUnaligned<T>(Code);
366 Code += sizeof(T);
367 return Result;
368}
369
370template<typename TNumericType>
372{
373 return Read<TNumericType>();
374}
375
377{
378 UObject* Result = (UObject*) ReadPointer();
379
380#if UE_WITH_OBJECT_HANDLE_LATE_RESOLVE || UE_WITH_REMOTE_OBJECT_HANDLE
381 TObjectPtr<UObject> ObjPtr(Result);
382 return ObjPtr.Get();
383#else
384 return Result;
385#endif
386}
387
389{
391
392 // Callers don't check for NULL; this method is expected to succeed.
393 check(Result);
394
395 return Result;
396}
397
399{
400 FProperty* Result = (FProperty*)ReadPointer();
401 MostRecentProperty = Result;
402 return Result;
403}
404
405inline float FFrame::ReadFloat()
406{
407 return Read<float>();
408}
409
410inline double FFrame::ReadDouble()
411{
412 return Read<double>();
413}
414
416{
417 // Serialized pointers are always the size of ScriptPointerType
418 ScriptPointerType Pointer = FPlatformMemory::ReadUnaligned<ScriptPointerType>(Code);
419
420 Code += sizeof(ScriptPointerType);
421 return Pointer;
422}
423
425{
426 return Read<uint16>();
427}
428
434{
435 CodeSkipSizeType Result = FPlatformMemory::ReadUnaligned<CodeSkipSizeType>(Code);
436 Code += sizeof(CodeSkipSizeType);
437 return Result;
438}
439
441{
442 VariableSizeType Result=0;
443
444 FField* Field = (FField*)ReadPropertyUnchecked(); // Is it safe to assume it's an FField?
446 if (Property)
447 {
448 Result = (VariableSizeType)Property->GetSize();
449 }
450
451 if (ExpressionField != nullptr)
452 {
454 }
455
456 return Result;
457}
458
460{
461 FScriptName Result = FPlatformMemory::ReadUnaligned<FScriptName>(Code);
462 Code += sizeof(FScriptName);
463 return ScriptNameToName(Result);
464}
465
467
474
479template<class TProperty>
481{
482 StepCompiledIn(Result, TProperty::StaticClass());
483}
484
500
501template<class TProperty, typename TNativeType>
#define NULL
Definition oodle2base.h:134
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
Stack MostRecentProperty
Definition BlueprintTypeConversions.cpp:390
#define FORCEINLINE_DEBUGGABLE
Definition CoreMiscDefines.h:74
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
TArray< CodeSkipSizeType, TInlineAllocator< 8 > > FlowStackType
Definition Stack.h:97
EPropertyType
Definition Stack.h:51
@ CPT_Int64
Definition Stack.h:60
@ CPT_Text
Definition Stack.h:76
@ CPT_LazyObjectReference
Definition Stack.h:79
@ CPT_String
Definition Stack.h:75
@ CPT_Bool8
Definition Stack.h:62
@ CPT_MAX
Definition Stack.h:88
@ CPT_Name
Definition Stack.h:68
@ CPT_UInt16
Definition Stack.h:54
@ CPT_UInt32
Definition Stack.h:55
@ CPT_Unused_Index_22
Definition Stack.h:74
@ CPT_SoftObjectReference
Definition Stack.h:81
@ CPT_FLargeWorldCoordinatesReal
Definition Stack.h:86
@ CPT_Int8
Definition Stack.h:57
@ CPT_FieldPath
Definition Stack.h:85
@ CPT_Delegate
Definition Stack.h:69
@ CPT_Float
Definition Stack.h:66
@ CPT_Set
Definition Stack.h:84
@ CPT_WeakObjectReference
Definition Stack.h:78
@ CPT_ObjectPtrReference
Definition Stack.h:80
@ CPT_Bool16
Definition Stack.h:63
@ CPT_MulticastDelegate
Definition Stack.h:77
@ CPT_None
Definition Stack.h:52
@ CPT_Unused_Index_19
Definition Stack.h:71
@ CPT_Bool64
Definition Stack.h:65
@ CPT_Map
Definition Stack.h:83
@ CPT_Int16
Definition Stack.h:58
@ CPT_Byte
Definition Stack.h:53
@ CPT_ObjectReference
Definition Stack.h:67
@ CPT_Bool
Definition Stack.h:61
@ CPT_Double
Definition Stack.h:82
@ CPT_Unused_Index_21
Definition Stack.h:73
@ CPT_Int
Definition Stack.h:59
@ CPT_Bool32
Definition Stack.h:64
@ CPT_Interface
Definition Stack.h:70
@ CPT_UInt64
Definition Stack.h:56
@ CPT_Struct
Definition Stack.h:72
COREUOBJECT_API void GInitRunaway()
Definition ScriptCore.cpp:127
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 DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
FORCEINLINE FName ScriptNameToName(FScriptName InName)
Definition NameTypes.h:1597
#define MAX_uint8
Definition NumericLimits.h:19
uint64 ScriptPointerType
Definition ObjectMacros.h:22
#define RESULT_DECL
Definition Script.h:92
uint32 CodeSkipSizeType
Definition Script.h:67
uint16 VariableSizeType
Definition Script.h:52
#define PER_FUNCTION_SCRIPT_STATS
Definition Script.h:27
#define RESULT_PARAM
Definition Script.h:91
auto GetData(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Get())
Definition StringConv.h:802
uint32 Size
Definition VulkanMemory.cpp:4034
if(Failed) console_printf("Failed.\n")
uint8_t uint8
Definition binka_ue_file_header.h:8
static COREUOBJECT_API FBlueprintContext * GetThreadSingleton()
Definition ScriptCore.cpp:208
FVirtualStackAllocator * GetVirtualStackAllocator()
Definition Script.h:81
Definition Field.h:66
Definition Field.h:556
static COREUOBJECT_API FFieldClass * StaticClass()
Definition Field.cpp:293
bool IsA(const FFieldClass *FieldType) const
Definition Field.h:731
FField * Next
Definition Field.h:603
Definition NameTypes.h:617
Definition OutputDevice.h:133
Definition UnrealType.h:174
Definition VirtualStackAllocator.h:72
Definition Array.h:670
Definition UnrealType.h:1538
Definition Class.h:2476
Definition Object.h:95
Type
Definition LogVerbosity.h:17
Definition FieldSystemNoiseAlgo.cpp:6
@ false
Definition radaudio_common.h:23
Definition Stack.h:114
uint8 * Locals
Definition Stack.h:120
double ReadDouble()
Definition Stack.h:410
uint8 * Code
Definition Stack.h:119
FFrame(UObject *InObject, UFunction *InNode, void *InLocals, FFrame *InPreviousFrame=NULL, FField *InPropertyChainForCompiledIn=NULL)
Definition Stack.h:308
VariableSizeType ReadVariableSize(FProperty **ExpressionField)
Definition Stack.h:440
static COREUOBJECT_API FFrame * PushThreadLocalTopStackFrame(FFrame *NewTopStackFrame)
Definition ScriptCore.cpp:624
float ReadFloat()
Definition Stack.h:405
FFrame * PreviousFrame
Definition Stack.h:130
FProperty * MostRecentProperty
Definition Stack.h:122
FlowStackType FlowStack
Definition Stack.h:127
T Read()
Definition Stack.h:363
TNumericType ReadInt()
Definition Stack.h:371
FORCEINLINE_DEBUGGABLE TNativeType & StepCompiledInRef(void *const TemporaryBuffer)
Definition Stack.h:502
COREUOBJECT_API FString GetStackDescription() const
Definition ScriptCore.cpp:604
FOutParmRec * OutParms
Definition Stack.h:133
UObject * Object
Definition Stack.h:118
static COREUOBJECT_API FString GetScriptCallstack(bool bReturnEmpty=false, bool bTopOfStackOnly=false)
Definition ScriptCore.cpp:563
FProperty * ReadProperty()
Definition Stack.h:388
static COREUOBJECT_API void PopThreadLocalTopStackFrame(FFrame *NewTopStackFrame)
Definition ScriptCore.cpp:631
FName ReadName()
Definition Stack.h:459
bool bArrayContextFailed
Definition Stack.h:148
ScriptPointerType ReadPointer()
Definition Stack.h:415
FProperty * ReadPropertyUnchecked()
Definition Stack.h:398
const uint8 PeekCode() const
Definition Stack.h:214
COREUOBJECT_API void StepExplicitProperty(void *const Result, FProperty *Property)
Definition ScriptCore.cpp:514
void SkipCode(const int32 NumOps)
Definition Stack.h:217
UObject * ReadObject()
Definition Stack.h:376
FFrame * PreviousTrackingFrame
Definition Stack.h:146
COREUOBJECT_API FString GetStackTrace() const
Definition ScriptCore.cpp:762
bool bAbortingExecution
Definition Stack.h:151
FORCEINLINE_DEBUGGABLE bool StepAndCheckMostRecentProperty(UObject *Context, RESULT_DECL)
Definition Stack.h:468
uint8 * MostRecentPropertyAddress
Definition Stack.h:123
uint8 * MostRecentPropertyContainer
Definition Stack.h:124
virtual ~FFrame()
Definition Stack.h:162
UFunction * Node
Definition Stack.h:117
static COREUOBJECT_API void KismetExecutionMessage(const TCHAR *Message, ELogVerbosity::Type Verbosity, FName WarningId=FName())
Definition ScriptCore.cpp:644
FField * PropertyChainForCompiledIn
Definition Stack.h:136
FORCEINLINE_DEBUGGABLE void StepCompiledIn(void *Result)
Definition Stack.h:480
static COREUOBJECT_API FFrame * GetThreadLocalTopStackFrame()
Definition ScriptCore.cpp:636
CodeSkipSizeType ReadCodeSkipCount()
Definition Stack.h:433
UFunction * CurrentNativeFunction
Definition Stack.h:139
int32 ReadWord()
Definition Stack.h:424
Definition Stack.h:103
uint8 * PropAddr
Definition Stack.h:105
FOutParmRec * NextOutParm
Definition Stack.h:106
FProperty * Property
Definition Stack.h:104
Definition NameTypes.h:491
Definition ObjectPtr.h:488
FORCEINLINE T * Get() const
Definition ObjectPtr.h:664