MCPcopy Create free account
hub / github.com/GaijinEntertainment/daScript / dapiStackWalk

Function dapiStackWalk

src/builtin/module_builtin_debugger.cpp:881–959  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

879 }
880
881 void dapiStackWalk ( StackWalkerPtr walker, Context & context, const LineInfo & at ) {
882 #if DAS_ENABLE_STACK_WALK
883 char * sp = context.stack.ap();
884 const LineInfo * lineAt = &at;
885 while ( sp < context.stack.top() ) {
886 Prologue * pp = (Prologue *) sp;
887 Block * block = nullptr;
888 FuncInfo * info = nullptr;
889 char * SP = sp;
890 if ( pp->info ) {
891 intptr_t iblock = intptr_t(pp->block);
892 if ( iblock & 1 ) {
893 block = (Block *) (iblock & ~1);
894 info = block->info;
895 SP = context.stack.bottom() + block->stackOffset;
896 } else {
897 info = pp->info;
898 }
899 }
900 auto incr = info ? info->stackSize : pp->stackSize;
901 if ( incr >= context.stack.size() || incr<sizeof(Prologue) ) {
902 walker->onCorruptStack(pp);
903 break;
904 }
905 walker->onBeforeCall(pp,SP);
906 if ( !info ) {
907 if (pp->is_jit) {
908 walker->onCallJIT(pp,pp->fileName);
909 } else {
910 walker->onCallAOT(pp,pp->fileName);
911 }
912 } else if ( pp->line ) {
913 walker->onCallAt(pp,info,pp->line);
914 } else {
915 walker->onCall(pp,info);
916 }
917 if ( info ) {
918 if ( walker->canWalkArguments() ) {
919 for ( uint32_t i=0, is=info->count; i!=is; ++i ) {
920 walker->onArgument(info, i, info->fields[i], pp->arguments[i]);
921 }
922 }
923 }
924 walker->onAfterPrologue(pp,SP);
925 if ( info && info->locals ) {
926 if ( walker->canWalkVariables() ) {
927 walker->onBeforeVariables();
928 for ( uint32_t i=0, is=info->localCount; i!=is; ++i ) {
929 auto lv = info->locals[i];
930 bool inScope = lineAt ? lineAt->inside(lv->visibility) : false;
931 if ( !walker->canWalkOutOfScopeVariables() && !inScope ) {
932 continue;
933 }
934 char * addr = nullptr;
935 if ( !inScope ) {
936 addr = nullptr;
937 } else if ( lv->cmres ) {
938 addr = (char *)pp->cmres;

Callers 1

getStackWalkMethod · 0.85

Calls 15

apMethod · 0.80
topMethod · 0.80
bottomMethod · 0.80
insideMethod · 0.80
throw_errorMethod · 0.80
sizeMethod · 0.45
onCorruptStackMethod · 0.45
onBeforeCallMethod · 0.45
onCallJITMethod · 0.45
onCallAOTMethod · 0.45
onCallAtMethod · 0.45
onCallMethod · 0.45

Tested by

no test coverage detected