Struct.avt

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

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

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