Struct.avt

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

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

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

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

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

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

package avt.lang;

public class Struct(Object, RawData, Cloneable)
{
    private final long fldReserved20;
    private final long fldReserved28;
    private final long fldReserved30;
    private final long fldOffset;

    public () {
        Class structType = getClass();
        if(fldOffset == 0) fldOffset = structType.instanceSize - class.instanceSize;
        initialize(structType);
    }

    public Struct clone() {
        Class structType = getClass();
        int structSize = structType.structSize;
        Struct result = (Struct) Runtime.allocateInstance(structType, structType.instanceSize + structSize, -1);
        result.defaultConstructor();
        result.afterConstruction();
        Array.copyRaw(this, 0, result, 0, structSize);
        return result;
    }

    public final native long getPointer();

    public final long getLength() { return getClass().structSize; }

    private void initialize(Class structType) {
        for(long structPtr = getPointer(), int length = structType.structReferencedFieldsCount, int index = 0; index < length; index++)
        {
            int4 info = structType.getStructReferencedFieldInfo(index);
            Class type = structType.getStructReferencedFieldType(index);
            Object array = Runtime.allocateArray(type, type.instanceSize, info[2], structPtr + info[1], this);
            setInstanceField(info[0], array);
        }
    }

    private native void setInstanceField(int offset, Object value);
}