Struct.avt

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

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

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

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

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

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

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

package avt.lang;

public class Struct(Object, RawData)
{
    private final long fldReserved0;
    private final long fldReserved1;
    private final long fldReserved2;
    private final long fldOffset;

    public () {
        Class structClass = getClass();
        fldOffset = structClass.instanceSize - 0x40;
        initialize(structClass);
    }

    public final native long getPointer();

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

    private void initialize(Class structClass) {
        for(Runtime runtime = Runtime.getInstance(), int len = structClass.structReferencedFieldsCount, int i = 0; i < len; i++)
        {
            int4 info = structClass.getStructReferencedFieldInfo(i);
            Class type = structClass.getStructReferencedFieldType(i);
            Object array = runtime.allocateInstance(type, type.instanceSize, info[2], false);
            setInstanceField(info[0], info[1], array);
        }
    }

    private native void setInstanceField(int instanceFieldOffset, int structureFieldOffset, Object instanceFieldValue);
}