예제 #1
0
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;
	}
}
예제 #2
0
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;
    }
}