Class.inc

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

;
 ;  Исходный код среды исполнения ПВТ-ОО.
 ;
 ;  Этот исходный код является частью проекта ПВТ-ОО.
 ;
 ;  Copyright © 2021 Малик Разработчик
 ;
 ;  Это свободная программа: вы можете перераспространять её и/или
 ;  изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
 ;  в каком она была опубликована Фондом свободного программного обеспечения;
 ;  либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 ;
 ;  Эта программа распространяется в надежде, что она может быть полезна,
 ;  но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 ;  или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 ;  общественной лицензии GNU.
 ;
 ;  Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 ;  вместе с этой программой. Если это не так, см.
 ;  <http://www.gnu.org/licenses/>.
;

; <fold avt.lang.Class (natives)>

    method avt.lang.Class$fillClass$avt.lang.Class$avt.lang.Class$avt.lang.Class$avt.lang.Package$, \
                type, avt.lang.Class, \
                superType, avt.lang.Class, \
                componentType, avt.lang.Class, \
                ownedPackage, avt.lang.Package  ; <fold >
                menter
                lverify type, TAG_OBJECT
                lverify superType, TAG_OBJECT
                lverify componentType, TAG_OBJECT
                lverify ownedPackage, TAG_OBJECT
                mov     r2, [.componentType]
                mov     r6, [.superType]
                mov     r7, [.type]
                ; модификаторы
                mov     r0d, [r2+avt.lang.Class$fldModifiers]
                and     r0d, avt.lang.Class$VISIBILITY_MASK
                mov     dword[r7+avt.lang.Class$fldModifiers], r0d
                ; индекс простого имени
                mov     dword[r7+avt.lang.Class$fldSimpleNameIndex], -$01
                ; размер инстанции
                mov     r0d, [r6+avt.lang.Class$fldInstanceSize]
                mov     dword[r7+avt.lang.Class$fldInstanceSize], r0d
                ; количество ссылочных полей
                mov     r0d, [r6+avt.lang.Class$fldReferencedFieldsCount]
                mov     dword[r7+avt.lang.Class$fldReferencedFieldsCount], r0d
                ; количество виртуальных методов
                mov     r0d, [r6+avt.lang.Class$fldVirtualsCount]
                mov     dword[r7+avt.lang.Class$fldVirtualsCount], r0d
                ; количество реализаторов
                mov     r0d, [r6+avt.lang.Class$fldImplementorsCount]
                mov     dword[r7+avt.lang.Class$fldImplementorsCount], r0d
                ; количество сервисов
                mov     r0d, [r6+avt.lang.Class$fldServicesCount]
                mov     dword[r7+avt.lang.Class$fldServicesCount], r0d
                ; смещение данных о ссылочных полях
                mov     r0d, [r6+avt.lang.Class$fldReferencedFieldsOffset]
                mov     dword[r7+avt.lang.Class$fldReferencedFieldsOffset], r0d
                ; смещение данных о виртуальных методах
                mov     r0d, [r6+avt.lang.Class$fldVirtualsOffset]
                mov     dword[r7+avt.lang.Class$fldVirtualsOffset], r0d
                ; смещение данных о реализаторах
                mov     r0d, [r6+avt.lang.Class$fldImplementorsOffset]
                mov     dword[r7+avt.lang.Class$fldImplementorsOffset], r0d
                ; смещение данных о родительских сервисах
                mov     r0d, [r6+avt.lang.Class$fldServicesOffset]
                mov     dword[r7+avt.lang.Class$fldServicesOffset], r0d
                ; родительский тип
                mov     r0, r6
                sub     r0, r7
                mov     qword[r7+avt.lang.Class$fldSuperTypeOffset], r0
                ; тип компонентов массива
                mov     r0, r2
                sub     r0, r7
                mov     qword[r7+avt.lang.Class$fldComponentTypeOffset], r0
                ; пакет – владелец этого типа
                mov     r0, [.ownedPackage]
                sub     r0, r7
                mov     qword[r7+avt.lang.Class$fldOwnedPackageOffset], r0
                ; .refs – данные о ссылочных полях
                movsxd  r1, [r6+avt.lang.Class$fldReferencedFieldsCount]
                jrcxz   @F
                movsxd  r0, [r6+avt.lang.Class$fldReferencedFieldsOffset]
                movsxd  r2, [r7+avt.lang.Class$fldReferencedFieldsOffset]
                lea     r6, [r6+r0*1]
                lea     r7, [r7+r2*1]
                cld
                rep movsd
                mov     r6, [.superType]
                mov     r7, [.type]
        @@:     ; .virt – данные о виртуальных методах
                movsxd  r1, [r6+avt.lang.Class$fldVirtualsCount]
                jrcxz   @F
                movsxd  r0, [r6+avt.lang.Class$fldVirtualsOffset]
                movsxd  r2, [r7+avt.lang.Class$fldVirtualsOffset]
                lea     r6, [r6+r0*1]
                lea     r7, [r7+r2*1]
        .virt:  mov     r0, [r6+r1*8-$08]
                lea     r0, [r0+r6*1]
                sub     r0, r7
                mov     qword[r7+r1*8-$08], r0
                loop    .virt
                mov     r6, [.superType]
                mov     r7, [.type]
        @@:     ; .impl – данные о реализаторах
                movsxd  r1, [r6+avt.lang.Class$fldImplementorsCount]
                jrcxz   @F
                sal     r1, $01
                movsxd  r0, [r6+avt.lang.Class$fldImplementorsOffset]
                movsxd  r2, [r7+avt.lang.Class$fldImplementorsOffset]
                lea     r6, [r6+r0*1]
                lea     r7, [r7+r2*1]
        .impl:  mov     r0, [r6+r1*8-$08]
                lea     r0, [r0+r6*1]
                sub     r0, r7
                mov     qword[r7+r1*8-$08], r0
                loop    .impl
                mov     r6, [.superType]
                mov     r7, [.type]
        @@:     ; .serv – данные о родительских сервисах
                movsxd  r1, [r6+avt.lang.Class$fldServicesCount]
                jrcxz   @F
                movsxd  r0, [r6+avt.lang.Class$fldServicesOffset]
                movsxd  r2, [r7+avt.lang.Class$fldServicesOffset]
                lea     r6, [r6+r0*1]
                lea     r7, [r7+r2*1]
        .serv:  mov     r0, [r6+r1*8-$08]
                lea     r0, [r0+r6*1]
                sub     r0, r7
                mov     qword[r7+r1*8-$08], r0
                loop    .serv
        @@:     mleave
                eleave
    ; </fold>

    method avt.lang.Class$getStructReferencedFieldInfo$int$, \
                this, avt.lang.Class, \
                index, int  ; returns int4 <fold >
                menter
                lverify this, TAG_OBJECT
                lverify index, TAG_INT
                mov     r0, [.this]
                movsxd  r1, [r0+avt.lang.Class$fldStructReferencedFieldsOffset]
                lea     r0, [r0+r1*1]
                movsxd  r1, [.index]
                lea     r1, [r1+r1*1]
                lea     r0, [r0+r1*8]
                vmovq   xmm0, [r0+$00]
                vmovd   xmm1, [r0+$0c]
                vpslldq xmm1, xmm1, $08
                vpor    xmm0, xmm0, xmm1
                call    inst$i4push
                mleavex
                eleave
    ; </fold>

    method avt.lang.Class$getStructReferencedFieldType$int$, \
                this, avt.lang.Class, \
                index, int  ; returns avt.lang.Class <fold >
                menter
                lverify this, TAG_OBJECT
                lverify index, TAG_INT
                mov     r0, [.this]
                movsxd  r1, [r0+avt.lang.Class$fldStructReferencedFieldsOffset]
                lea     r0, [r0+r1*1]
                movsxd  r1, [.index]
                lea     r1, [r1+r1*1]
                movsxd  r1, [r0+r1*8+$08]
                lea     r0, [r0+r1*1]
                call    inst$rpush
                mleaver
                eleave
    ; </fold>

    method avt.lang.Class$invokeMainConstructor$avt.lang.Object$, \
                this, avt.lang.Class, \
                instance, avt.lang.Object  ; <fold >
                menter
                lverify this, TAG_OBJECT
                rloadloc instance
                mov     r0, [.this]
                add     r0, [r0+avt.lang.Class$fldMainConstructorOffset]
                invokestatic r0
                mleave
                eleave
    ; </fold>

    method avt.lang.Class$getSourceNamePointer$, \
                this, avt.lang.Class  ; returns long <fold >
                menter
                lverify this, TAG_OBJECT
                mov     r0, [.this]
                movsxd  r1, [r0+avt.lang.Class$fldSourceNameOffset]
                test    r1, r1
                jnz     .L.000
                xor     r0, r0
                jmp     .L.001
        .L.000: lea     r0, [r0+r1*1]
        .L.001: call    inst$lpush
                mleaveq
                eleave
    ; </fold>

    method avt.lang.Class$getImplementorOf$avt.lang.Class$, \
                this, avt.lang.Class, \
                type, avt.lang.Class  ; returns long <fold >
                menter
                lverify this, TAG_OBJECT
                lverify type, TAG_OBJECT
                mov     r0, [.this]
        .L.000: movsxd  r1, [r0+avt.lang.Class$fldImplementorsCount]
                movsxd  r2, [r0+avt.lang.Class$fldImplementorsOffset]
                lea     r6, [r0+r2*1]
                lea     r7, [r6]
                jmp     .L.002
        .L.001: mov     r2, [r6+$08]
                lea     r2, [r7+r2*1]
                cmp     r2, [.type]
                jne     @F
                mov     r2, [r6+$00]
                lea     r0, [r7+r2*1]
                jmp     .L.003
        @@:     lea     r6, [r6+$10]
        .L.002: dec     r1
                cmp     r1, $00
                jge     .L.001
                mov     r1, [r0+avt.lang.Class$fldSuperTypeOffset]
                test    r1, r1
                jz      @F
                lea     r0, [r0+r1*1]
                jmp     .L.000
        @@:     xor     r0, r0
        .L.003: call    inst$lpush
                mleaveq
                eleave
    ; </fold>

    method avt.lang.Class$mapArray$avt.lang.Object$long$, \
                this, avt.lang.Class, \
                array, avt.lang.Object, \
                pointer, long  ; returns avt.lang.array.Measureable <fold >
                menter
                lverify this, TAG_OBJECT
                lverify pointer, TAG_LONG
                rloadloc array
                mov     r0, [.array]
                mov     r1, [.pointer]
                lea     r2, [r0+$40]
                sub     r1, r2
                mov     qword[r0+boolean.01d$fldOffset], r1
                mleaver
                eleave
    ; </fold>

    method avt.lang.Class$mapStruct$avt.lang.Object$long$, \
                this, avt.lang.Class, \
                $struc$, avt.lang.Object, \
                pointer, long  ; returns avt.lang.Struct <fold >
                menter
                lverify this, TAG_OBJECT
                lverify pointer, TAG_LONG
                rloadloc $struc$
                mov     r0, [.$struc$]
                mov     r1, [.pointer]
                lea     r2, [r0+$40]
                sub     r1, r2
                mov     qword[r0+avt.lang.Struct$fldOffset], r1
                rloadloc $struc$
                rloadloc this
                invokespecial avt.lang.Struct$initialize$avt.lang.Class$
                mleaver
                eleave
    ; </fold>

    method avt.lang.Class$getComponentType$, \
                this, avt.lang.Class  ; returns avt.lang.Class <fold >
                menter
                lverify this, TAG_OBJECT
                mov     r1, [.this]
                mov     r0, [r1+avt.lang.Class$fldComponentTypeOffset]
                test    r0, r0
                jz      @F
                lea     r0, [r1+r0*1]
        @@:     call    inst$rpush
                mleaver
                eleave
    ; </fold>

    method avt.lang.Class$getSuperType$, \
                this, avt.lang.Class  ; returns avt.lang.Class <fold >
                menter
                lverify this, TAG_OBJECT
                mov     r1, [.this]
                mov     r0, [r1+avt.lang.Class$fldSuperTypeOffset]
                test    r0, r0
                jz      @F
                lea     r0, [r1+r0*1]
        @@:     call    inst$rpush
                mleaver
                eleave
    ; </fold>

    method avt.lang.Class$getSuperService$int$, \
                this, avt.lang.Class, \
                index, int  ; returns avt.lang.Class <fold >
                menter
                lverify this, TAG_OBJECT
                lverify index, TAG_INT
                mov     r0, [.this]
                movsxd  r1, [r0+avt.lang.Class$fldServicesOffset]
                lea     r0, [r0+r1*1]
                movsxd  r1, [.index]
                add     r0, [r0+r1*8]
                call    inst$rpush
                mleaver
                eleave
    ; </fold>

    method avt.lang.Class$getOwnedPackage$, \
                this, avt.lang.Class  ; returns avt.lang.Package <fold >
                menter
                lverify this, TAG_OBJECT
                mov     r1, [.this]
                mov     r0, [r1+avt.lang.Class$fldOwnedPackageOffset]
                test    r0, r0
                jz      @F
                lea     r0, [r1+r0*1]
        @@:     call    inst$rpush
                mleaver
                eleave
    ; </fold>
; </fold>