/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package avt.lang;
package service DebugInfo(Object)
{
public static native int getSourceFileNameLength(long sourceFileNamePointer);
public static native int getMethodNameLength(long methodNamePointer);
public static native int getLineNumber(long debugInfoEntryPointer);
public static native long getDebugInfoEntryPointer(long codePointer);
public static native long getMethodNamePointer(long debugInfoEntryPointer);
public static native long getSourceFileNamePointer(long debugInfoEntryPointer);
public static native Class getEnclosingClass(long debugInfoEntryPointer);
public static String getMethodNameString(long methodNamePointer) {
try
{
int methodNameLength = getMethodNameLength(methodNamePointer);
byte[] methodNameBytes = (byte[]) byte[].class.newArrayAt(methodNamePointer + 1, methodNameLength);
char[] methodNameChars = new char[methodNameLength];
for(int index = methodNameLength; index-- > 0; ) methodNameChars[index] = (char) (methodNameBytes[index] & 0xff);
return (new String(methodNameChars, 0, methodNameLength)).intern();
}
catch(Exception exception)
{
throw exception instanceof RuntimeException ? (RuntimeException) exception : new RuntimeException(exception.message, exception);
}
}
public static String getSourceFileNameString(long sourceFileNamePointer) {
try
{
int sourceFileNameLength = getSourceFileNameLength(sourceFileNamePointer);
return (new String((char[]) char[].class.newArrayAt(sourceFileNamePointer + 2, sourceFileNameLength), 0, sourceFileNameLength)).intern();
}
catch(Exception exception)
{
throw exception instanceof RuntimeException ? (RuntimeException) exception : new RuntimeException(exception.message, exception);
}
}
public static StackTraceElement createStackTraceElement(long codePointer) {
long debugInfoEntryPointer = getDebugInfoEntryPointer(codePointer);
if(debugInfoEntryPointer == 0) return null;
int lineNumber = getLineNumber(debugInfoEntryPointer);
Class type = getEnclosingClass(debugInfoEntryPointer);
String methodName = getMethodNameString(getMethodNamePointer(debugInfoEntryPointer));
String sourceFileName = getSourceFileNameString(getSourceFileNamePointer(debugInfoEntryPointer));
return new StackTraceElement(type, methodName, sourceFileName, lineNumber);
}
}
package service SystemUnhandledExceptionHandler(Object, UnhandledExceptionHandler)
{
public void unhandledException(Thread thread, Throwable exception) {
exception.printStackTrace();
Runtime.getInstance().exit(1);
}
}