/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package avt.lang;
public class Struct(Object, RawData)
{
private final long fldReserved20;
private final long fldReserved28;
private final long fldReserved30;
private final long fldOffset;
public () {
Class structType = getClass();
fldOffset = structType.instanceSize - Struct.class.instanceSize;
initialize(structType);
}
package (long offset) {
Class structType = getClass();
fldOffset = offset;
initialize(structType);
}
public final native long getPointer();
public final long getLength() { return getClass().structSize; }
private void initialize(Class structType) {
for(Runtime runtime = Runtime.getInstance(), int length = structType.structReferencedFieldsCount, int index = 0; index < length; index++)
{
int4 info = structType.getStructReferencedFieldInfo(index);
Class type = structType.getStructReferencedFieldType(index);
Object array = runtime.allocateInstance(type, type.instanceSize, info[2], false);
setInstanceField(info[0], info[1], array);
}
}
private native void setInstanceField(int instanceFieldOffset, int structFieldOffset, Object instanceFieldValue);
}