use of php.runtime.exceptions.support.ErrorException in project jphp by jphp-compiler.
the class EvalFunctions method eval.
public static Memory eval(Environment env, TraceInfo trace, @Runtime.GetLocals ArrayMemory locals, String code) throws Throwable {
Context context = new Context(code);
try {
Tokenizer tokenizer = new Tokenizer(context);
SyntaxAnalyzer analyzer = syntaxAnalyzer.get();
analyzer.reset(env, tokenizer);
AbstractCompiler compiler = new JvmCompiler(env, context, analyzer);
ModuleEntity module = compiler.compile();
env.scope.loadModule(module);
env.registerModule(module);
return module.include(env, locals);
} catch (ErrorException e) {
if (e.getType() == ErrorType.E_PARSE) {
if (env.isHandleErrors(ErrorType.E_PARSE))
throw new ParseException(evalErrorMessage(e), trace);
} else
env.error(trace, e.getType(), evalErrorMessage(e));
}
return Memory.FALSE;
}
use of php.runtime.exceptions.support.ErrorException in project jphp by jphp-compiler.
the class Environment method catchUncaught.
public boolean catchUncaught(Exception e, boolean retry) {
if (e instanceof UncaughtException)
return catchUncaught((UncaughtException) e);
else if (e instanceof DieException) {
System.exit(((DieException) e).getExitCode());
return true;
} else if (e instanceof ErrorException) {
ErrorException er = (ErrorException) e;
getErrorReportHandler().onFatal(er);
JVMStackTracer tracer = scope.getStackTracer(e);
int i = 0;
for (JVMStackTracer.Item el : tracer) {
if (!el.isInternal()) {
echo("\n\t #" + (i++) + " " + el);
}
}
echo("\n");
for (JVMStackTracer.Item el : tracer) {
if (!el.isSystem()) {
echo("\n\t " + (el.isInternal() ? "" : "->") + " " + el);
}
}
return true;
} else if (e instanceof FinallyException) {
// nop
return true;
} else if (e instanceof BaseBaseException) {
BaseBaseException be = (BaseBaseException) e;
if (exceptionHandler != null) {
try {
exceptionHandler.onException(this, be);
} catch (BaseBaseException _e) {
if (retry) {
throw new RuntimeException(_e);
} else {
catchUncaught(_e, true);
}
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
return true;
} else {
try {
ExceptionHandler.DEFAULT.onException(this, be);
return true;
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
} else {
throw new RuntimeException(e);
}
}
use of php.runtime.exceptions.support.ErrorException in project jphp by jphp-compiler.
the class ErrorHandler method onError.
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;
}
use of php.runtime.exceptions.support.ErrorException in project jphp by jphp-compiler.
the class JvmCompilerCase method check.
public void check(String name, boolean withErrors, int errorFlags) {
File file;
ByteArrayOutputStream outputR = new ByteArrayOutputStream();
Environment environment;
if (isConcurrent()) {
environment = new ConcurrentEnvironment(newScope(), outputR);
} else {
environment = new Environment(newScope(), outputR);
}
// environment.setErrorFlags(ErrorType.E_ALL.value);
Test test = new Test(file = new File(Thread.currentThread().getContextClassLoader().getResource("resources/" + name).getFile()));
Context context = new Context(test.getFile(), file);
try {
JvmCompiler compiler = new JvmCompiler(environment, context, getSyntax(context));
environment.setErrorFlags(0);
if (errorFlags != -1)
environment.setErrorFlags(errorFlags);
if (!isCompiled()) {
environment.setErrorFlags(ErrorType.E_ALL.value);
}
ModuleEntity module = compiler.compile(false);
if (isCompiled()) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
ModuleDumper dumper = new ModuleDumper(context, environment, true);
dumper.save(module, output);
environment.setErrorFlags(ErrorType.E_ALL.value);
module = dumper.load(new ByteArrayInputStream(output.toByteArray()));
}
environment.getScope().loadModule(module);
environment.getScope().addUserModule(module);
environment.registerModule(module);
environment.getModuleManager().addModule(context.getFileName(), module);
Memory memory = module.includeNoThrow(environment, environment.getGlobals());
} catch (ErrorException e) {
if (withErrors) {
environment.getErrorReportHandler().onFatal(e);
} else {
throw new CustomErrorException(e.getType(), e.getMessage() + " line: " + (e.getTraceInfo().getStartLine() + test.getSectionLine("FILE") + 2) + ", pos: " + (e.getTraceInfo().getStartPosition() + 1), e.getTraceInfo());
}
} catch (UncaughtException | BaseBaseException e) {
environment.catchUncaught(e);
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
try {
environment.doFinal();
} catch (ErrorException e) {
if (withErrors) {
environment.getErrorReportHandler().onFatal(e);
try {
environment.getDefaultBuffer().flush();
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
} else
throw e;
} catch (RuntimeException e) {
throw e;
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
lastOutput = outputR.toString();
if (test.getExpect() != null)
Assert.assertEquals(test.getTest() + " (" + name + ")", test.getExpect(), rtrim(lastOutput));
if (test.getExpectF() != null) {
Memory result = StringFunctions.sscanf(environment, TraceInfo.valueOf(file.getName(), 0, 0), rtrim(lastOutput), test.getExpectF());
if (result.isNull())
result = new ArrayMemory();
PrintF printF = new PrintF(environment.getLocale(), test.getExpectF(), ((ArrayMemory) result).values());
String out = printF.toString();
Assert.assertEquals(out, rtrim(lastOutput));
}
}
Aggregations