package org.develnext.jphp.debug;
import org.develnext.jphp.debug.impl.DebugTick;
import org.develnext.jphp.debug.impl.Debugger;
import org.develnext.jphp.debug.impl.DebuggerException;
import org.develnext.jphp.debug.impl.breakpoint.Breakpoint;
import php.runtime.env.Environment;
import php.runtime.env.TraceInfo;
import php.runtime.env.handler.TickHandler;
import php.runtime.memory.ArrayMemory;
public class DebugTickHandler extends TickHandler {
protected Debugger debugger;
protected boolean init = false;
public void setDebugger(Debugger debugger) {
this.debugger = debugger;
}
protected void waitDebugger() {
while (debugger == null || debugger.isWorking()) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
throw new DebuggerException(e);
}
}
}
@Override
public void onTick(Environment env, TraceInfo trace, ArrayMemory locals) {
waitDebugger();
if (!init) {
init = true;
debugger.registerBreak(null, env, trace, locals);
return;
}
DebugTick oldTick = debugger.getRegisteredTick();
Debugger.Step waitStep = debugger.getWaitStep();
Breakpoint breakpoint = debugger.breakpointManager.findFor(env, trace);
switch (waitStep) {
case OVER:
if (oldTick.getCallStack().getTop() >= env.getCallStackTop()) {
debugger.registerBreak(breakpoint, env, trace, locals);
}
break;
case OUT:
if (oldTick.getCallStack().getTop() > env.getCallStackTop()) {
debugger.registerBreak(breakpoint, env, trace, locals);
}
break;
case INTO:
debugger.registerBreak(breakpoint, env, trace, locals);
break;
case RUN:
if (breakpoint != null) {
debugger.registerBreak(breakpoint, env, trace, locals);
}
}
waitDebugger();
}
}