void SQDbgServer::Hook(int type,int line,const SQChar *src,const SQChar *func) { switch(_state){ case eDBG_Running: if(type==_SC('l') && _breakpoints.size()) { BreakPointSetItor itr = _breakpoints.find(BreakPoint(line,src)); if(itr != _breakpoints.end()) { Break(line,src,_SC("breakpoint")); BreakExecution(); } } break; case eDBG_Suspended: _nestedcalls=0; case eDBG_StepOver: switch(type){ case _SC('l'): if(_nestedcalls==0) { Break(line,src,_SC("step")); BreakExecution(); } break; case _SC('c'): _nestedcalls++; break; case _SC('r'): if(_nestedcalls==0){ _nestedcalls=0; }else{ _nestedcalls--; } break; } break; case eDBG_StepInto: switch(type){ case _SC('l'): _nestedcalls=0; Break(line,src,_SC("step")); BreakExecution(); break; } break; case eDBG_StepReturn: switch(type){ case _SC('l'): break; case _SC('c'): _nestedcalls++; break; case _SC('r'): if(_nestedcalls==0){ _nestedcalls=0; _state=eDBG_StepOver; }else{ _nestedcalls--; } break; } break; case eDBG_Disabled: break; } }
void SQDbgServer::Hook(HSQUIRRELVM v, SQInteger type, SQInteger line, const SQChar *src, const SQChar *func) { VMState *vs = GetVMState(v); switch (_state) { case eDBG_Running: if (type == _SC('l') && _breakpoints.size()) { BreakPointSetItor itr = _breakpoints.find(BreakPoint(line, src)); if (itr != _breakpoints.end()) { Break(v, line, src, _SC("breakpoint")); BreakExecution(); } } break; case eDBG_Suspended: vs->_nestedcalls = 0; case eDBG_StepOver: switch (type) { case _SC('l'): if (vs->_nestedcalls == 0) { Break(v, line, src, _SC("step")); BreakExecution(); } break; case _SC('c'): vs->_nestedcalls++; break; case _SC('r'): if (vs->_nestedcalls == 0) { vs->_nestedcalls = 0; } else { vs->_nestedcalls--; } break; } break; case eDBG_StepInto: switch (type) { case _SC('l'): vs->_nestedcalls = 0; Break(v, line, src, _SC("step")); BreakExecution(); break; } break; case eDBG_StepReturn: switch (type) { case _SC('l'): break; case _SC('c'): vs->_nestedcalls++; break; case _SC('r'): if (vs->_nestedcalls == 0) { vs->_nestedcalls = 0; _state = eDBG_StepOver; } else { vs->_nestedcalls--; } break; } break; case eDBG_Disabled: break; } }