package php.runtime.env.handler;
import php.runtime.Memory;
import php.runtime.env.DieException;
import php.runtime.env.Environment;
import php.runtime.env.TraceInfo;
import php.runtime.env.message.SystemMessage;
import php.runtime.exceptions.support.ErrorException;
import php.runtime.exceptions.support.ErrorType;
import php.runtime.invoke.Invoker;
import php.runtime.lang.BaseException;
import php.runtime.memory.ArrayMemory;
import php.runtime.memory.LongMemory;
import php.runtime.memory.StringMemory;
public class ErrorHandler {
public final Invoker invoker;
public final Memory invokerMemory;
public final int errorHandlerFlags;
public ErrorHandler(Invoker invoker, Memory invokerMemory, int errorHandlerFlags) {
this.invoker = invoker;
this.invokerMemory = invokerMemory;
this.errorHandlerFlags = errorHandlerFlags;
}
public boolean onError(Environment env, SystemMessage message) {
if (ErrorType.check(errorHandlerFlags, message.getType())){
TraceInfo trace = message.getTrace().trace;
int argCount = invoker.getArgumentCount();
if (argCount < 4) argCount = 4;
else if (argCount > 5) argCount = 5;
Memory[] args = new Memory[argCount];
args[0] = LongMemory.valueOf(message.getType().value);
args[1] = new StringMemory(message.getMessage());
args[2] = new StringMemory(trace.getFileName());
args[3] = LongMemory.valueOf(trace.getStartLine() + 1);
if (argCount > 4)
args[4] = new ArrayMemory(false, message.getTrace().args);
try {
invoker.setTrace(null);
return (invoker.call(args).toValue() != Memory.FALSE);
} catch (ErrorException e){
throw e;
} catch (BaseException e){
throw e;
} catch (DieException e){
throw e;
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
return false;
}
}