DebugInfo.avt

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

/*
    Исходный код среды исполнения ПВТ-ОО.

    Этот исходный код является частью проекта ПВТ-ОО.

    Copyright © 2021 Малик Разработчик

    Это свободная программа: вы можете перераспространять её и/или
    изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она может быть полезна,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <http://www.gnu.org/licenses/>.
*/

package avt.lang;

package final class DebugInfo(Object)
{
    public static native int getSourceNameLength(long sourceNamePointer);

    public static StackTraceElement createStackTraceElement(long codePointer) throws Exception {
        long debugInfoPointer = get(codePointer);
        if(debugInfoPointer == 0L) return null;
        int lineNumber = getLineNumber(debugInfoPointer);
        String sourceName = getSourceName(getSourceNamePointer(debugInfoPointer));
        String methodName = getElementName(getMethodNamePointer(debugInfoPointer));
        Class typeRef = getEnclosingClass(debugInfoPointer);
        return new StackTraceElement(typeRef, methodName, sourceName, lineNumber);
    }

    private static native int getElementNameLength(long elementNamePointer);

    private static native int getLineNumber(long debugInfoPointer);

    private static native long get(long codePointer);

    private static native long getSourceNamePointer(long debugInfoPointer);

    private static native long getMethodNamePointer(long debugInfoPointer);

    private static native Class getEnclosingClass(long debugInfoPointer);

    private static String getElementName(long elementNamePointer) throws Exception {
        int elementNameLength = getElementNameLength(elementNamePointer);
        byte[] elementNameBytes = (byte[]) byte[].class.newArrayAt(elementNamePointer, elementNameLength);
        char[] elementNameChars = new char[elementNameLength];
        for(int i = elementNameLength; i-- > 0; ) elementNameChars[i] = (char) (elementNameBytes[i] & 0x7fi);
        return new String(elementNameChars, 0, elementNameLength);
    }

    private static String getSourceName(long sourceNamePointer) throws Exception {
        int sourceNameLength = getSourceNameLength(sourceNamePointer);
        return new String((char[]) char[].class.newArrayAt(sourceNamePointer, sourceNameLength), 0, sourceNameLength);
    }


    private () {  }
}