55// Squirrel Debugger
66//
77
8- #define SQDBG_SV_VER 6
8+ #define SQDBG_SV_VER 7
99
1010#include " sqdbg.h"
1111
@@ -845,14 +845,17 @@ class CProfiler
845845 }
846846 else
847847 {
848- for ( hnode_t i = 0 ; i < m_Nodes .Size (); i++ )
848+ for ( hnode_t i = 0 ; i < m_NodeTags .Size (); i++ )
849849 {
850- node_t &node = m_Nodes[i];
851- node.calls = 0 ;
852- node.samples = 0.0 ;
853- node.sampleStart = 0.0 ;
850+ nodetag_t *node = &m_NodeTags[i];
851+ __ObjRelease ( node->funcsrc );
852+ __ObjRelease ( node->funcname );
854853 }
855854
855+ m_Nodes.Clear ();
856+ m_NodeTags.Clear ();
857+ m_CallStack.Clear ();
858+
856859 for ( int i = 0 ; i < vm->_callsstacksize ; i++ )
857860 {
858861 const SQVM ::CallInfo &ci = vm->_callsstack [i];
@@ -928,19 +931,19 @@ class CProfiler
928931 {
929932 m_State = kProfPaused ;
930933
931- if ( m_CallStack.Size () )
934+ for ( unsigned int i = 0 ; i < m_CallStack.Size (); i++ )
932935 {
933- hnode_t caller = m_CallStack. Top () ;
936+ hnode_t caller = m_CallStack[i] ;
934937 node_t *node = &m_Nodes[caller];
935938 node->samples += sample - node->sampleStart ;
936939#ifdef _DEBUG
937940 node->sampleStart = 0.0 ;
938941#endif
939942 }
940943
941- if ( m_GroupStack.Size () )
944+ for ( unsigned int i = 0 ; i < m_GroupStack.Size (); i++ )
942945 {
943- hgroup_t idx = m_GroupStack. Top () ;
946+ hgroup_t idx = m_GroupStack[i] ;
944947 group_t *group = &m_Groups[idx];
945948 sample_t dt = sample - group->sampleStart ;
946949 group->samples += dt;
@@ -967,16 +970,16 @@ class CProfiler
967970
968971 sample_t sample = Sample ();
969972
970- if ( m_CallStack.Size () )
973+ for ( unsigned int i = 0 ; i < m_CallStack.Size (); i++ )
971974 {
972- hnode_t caller = m_CallStack. Top () ;
975+ hnode_t caller = m_CallStack[i] ;
973976 node_t *node = &m_Nodes[caller];
974977 node->sampleStart = sample;
975978 }
976979
977- if ( m_GroupStack.Size () )
980+ for ( unsigned int i = 0 ; i < m_GroupStack.Size (); i++ )
978981 {
979- hgroup_t idx = m_GroupStack. Top () ;
982+ hgroup_t idx = m_GroupStack[i] ;
980983 group_t *group = &m_Groups[idx];
981984 group->sampleStart = sample;
982985 }
@@ -985,7 +988,7 @@ class CProfiler
985988
986989 void CallBegin ( SQFunctionProto *func )
987990 {
988- Assert ( IsActive () );
991+ Assert ( IsActive () || m_State == kProfPaused );
989992
990993 hnode_t caller = m_CallStack.Size () ? m_CallStack.Top () : INVALID_HANDLE ;
991994
@@ -1287,6 +1290,10 @@ class CProfiler
12871290 return (int )( buf - bufstart );
12881291 }
12891292
1293+ sample_t sample = ( m_CallStack.Size () && m_State != kProfPaused ) ?
1294+ Sample () :
1295+ 0.0 ;
1296+
12901297 vector< node_t > nodes ( m_Nodes );
12911298
12921299 switch ( type )
@@ -1348,17 +1355,13 @@ class CProfiler
13481355 {
13491356 totalSamples += node.samples ;
13501357 }
1351- // Within the call frame, accumulate children for a rough estimate
1352- // This will miss any time spent in the body
1353- // of the function excluding subcalls
1358+ // Within the call frame, take current time
13541359 else
13551360 {
1356- for ( hnode_t j = i; j < nodecount; j++ )
1357- {
1358- const node_t &nj = nodes[j];
1359- if ( nj.caller == node.id )
1360- totalSamples += nj.samples ;
1361- }
1361+ totalSamples += node.samples ;
1362+
1363+ if ( m_State != kProfPaused )
1364+ totalSamples += sample - node.sampleStart ;
13621365 }
13631366 }
13641367 }
@@ -1603,7 +1606,7 @@ class CProfiler
16031606 {
16041607 if ( us > 0.0 )
16051608 {
1606- int len = scsprintf ( buf, size, _SC (" %6.2f ns" ), us * 1 .e3 );
1609+ int len = scsprintf ( buf, size, _SC (" %6.2f ns" ), min ( us * 1 .e3 , 999.99 ) );
16071610 buf += len;
16081611 size -= len;
16091612 }
@@ -2095,6 +2098,7 @@ struct objref_t
20952098 DELEGABLE_META ,
20962099 CUSTOMMEMBER ,
20972100 STACK ,
2101+ OUTER ,
20982102#ifdef SQDBG_SUPPORTS_FUNCPROTO_LIST
20992103 FUNCPROTO ,
21002104#endif
@@ -7922,6 +7926,18 @@ bool SQDebugServer::Get( const objref_t &obj, SQObjectPtr &value )
79227926 }
79237927 }
79247928
7929+ return false ;
7930+ }
7931+ case objref_t ::OUTER :
7932+ {
7933+ if ( sq_type (obj.src ) == OT_CLOSURE &&
7934+ _integer (obj.key ) >= 0 &&
7935+ _integer (obj.key ) < _fp (_closure (obj.src )->_function )->_noutervalues )
7936+ {
7937+ value = *_outervalptr ( _closure (obj.src )->_outervalues [ _integer (obj.key ) ] );
7938+ return true ;
7939+ }
7940+
79257941 return false ;
79267942 }
79277943#ifdef SQDBG_SUPPORTS_FUNCPROTO_LIST
@@ -8116,6 +8132,18 @@ bool SQDebugServer::Set( const objref_t &obj, const SQObjectPtr &value )
81168132 }
81178133 }
81188134
8135+ return false ;
8136+ }
8137+ case objref_t ::OUTER :
8138+ {
8139+ if ( sq_type (obj.src ) == OT_CLOSURE &&
8140+ _integer (obj.key ) >= 0 &&
8141+ _integer (obj.key ) < _fp (_closure (obj.src )->_function )->_noutervalues )
8142+ {
8143+ *_outervalptr ( _closure (obj.src )->_outervalues [ _integer (obj.key ) ] ) = value;
8144+ return true ;
8145+ }
8146+
81198147 return false ;
81208148 }
81218149#ifdef SQDBG_SUPPORTS_FUNCPROTO_LIST
@@ -12108,7 +12136,6 @@ bool SQDebugServer::ArithOp( char op, const SQObjectPtr &lhs, const SQObjectPtr
1210812136
1210912137void SQDebugServer::ConvertPtr ( objref_t &obj )
1211012138{
12111- // doesn't convert outer vars
1211212139 if ( obj.type & ~objref_t ::PTR )
1211312140 obj.type = (objref_t ::EOBJREF )( obj.type & ~objref_t ::PTR );
1211412141}
@@ -12512,8 +12539,10 @@ bool SQDebugServer::GetObj_Frame( HSQUIRRELVM vm, const SQVM::CallInfo *ci, cons
1251212539 const SQOuterVar &var = func->_outervalues [i];
1251312540 if ( expression.IsEqualTo ( _string (var._name ) ) )
1251412541 {
12515- out.type = objref_t ::PTR ;
12542+ out.type = ( objref_t ::EOBJREF )( objref_t :: PTR | objref_t :: OUTER ) ;
1251612543 out.ptr = _outervalptr ( pClosure->_outervalues [i] );
12544+ out.src = pClosure;
12545+ out.key = (SQInteger)i;
1251712546 value = *out.ptr ;
1251812547 return true ;
1251912548 }
@@ -20029,7 +20058,6 @@ SQInteger SQDebugServer::SQProfReset( HSQUIRRELVM vm )
2002920058 tag = _string (arg1);
2003020059 break ;
2003120060 default :
20032- Assert (!" UNREACHABLE" );
2003320061 break ;
2003420062 }
2003520063
@@ -20540,7 +20568,7 @@ void sqdbg_get_debugger_ref( HSQUIRRELVM vm, SQObjectPtr &ref )
2054020568
2054120569#ifdef DEBUG_HOOK_CACHED_SQDBG
2054220570// Cache the debugger in an unused variable in the VM
20543- // for at least 20% faster access on debug hook
20571+ // for faster access on debug hook
2054420572// compared to registry table access
2054520573void sqdbg_set_debugger_cached_debughook ( HSQUIRRELVM vm, bool state )
2054620574{
0 commit comments