Skip to content

Commit b652c6f

Browse files
authored
Merge pull request #447 from samisalreadytaken/dev
Update sqdbg
2 parents 8de0119 + c42f5b6 commit b652c6f

1 file changed

Lines changed: 57 additions & 29 deletions

File tree

sp/src/vscript/sqdbg/sqdbg/server.cpp

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
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

1210912137
void 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
2054520573
void sqdbg_set_debugger_cached_debughook( HSQUIRRELVM vm, bool state )
2054620574
{

0 commit comments

Comments
 (0)