/*
Исходный код среды исполнения ПВТ-ОО.
Этот исходный код является частью проекта ПВТ-ОО.
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 () { }
}