!package.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Реализация среды исполнения языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    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);
    }
}