Class.inc

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

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

; <fold avt.lang.Class — родной код>
    if(used avt.lang.Class$fillArrayType$avt.lang.Class$avt.lang.Class$avt.lang.Class$avt.lang.Package$) ; <fold >
                    method      avt.lang.Class$fillArrayType$avt.lang.Class$avt.lang.Class$avt.lang.Class$avt.lang.Package$, \
                                arrayType, avt.lang.Class, \
                                superType, avt.lang.Class, \
                                componentType, avt.lang.Class, \
                                parentPackage, avt.lang.Package
                    menter      $00
                    savetp
                    mov         r02q, [.componentType]
                    mov         r06q, [.superType]
                    mov         r07q, [.arrayType]
                    lea         r08q, [r06+$00]
                    lea         r09q, [r07+$00]
                    ; атрибуты
                    mov         r00d, [r02+avt.lang.ReflectiveObject$fldAttributes]
                    and         r00d, avt.lang.ReflectiveObject$VISIBILITY_MASK
                    mov         dword [r07+avt.lang.ReflectiveObject$fldAttributes], r00d
                    ; индекс простого имени
                    mov         dword [r07+avt.lang.RequiredReflectiveObject$fldNameIndex], -$01
                    ; размер инстанции
                    mov         r00d, [r06+avt.lang.Class$fldInstanceSize]
                    mov         dword [r07+avt.lang.Class$fldInstanceSize], r00d
                    ; размер структуры
                    mov         r00d, [r06+avt.lang.Class$fldStructSize]
                    mov         dword [r07+avt.lang.Class$fldStructSize], r00d
                    ; длины и смещения массивов виртуальных методов, суперсервисов, полей инстанции
                    mov         r01d, [avt.lang.Class+avt.lang.Class$fldInstanceSize]
                    mov         r10d, [r06+avt.lang.Class$fldVirtualsCount]
                    mov         r11d, [r06+avt.lang.Class$fldSuperServicesCount]
                    mov         r12d, [r06+avt.lang.Class$fldInstanceReferencedFieldsCount]
                    xor         r13d, r13d
                    xor         r14d, r14d
                    xor         r15d, r15d
                    cmp         r10d, $00
                    jle         @F
                    lea         r13q, [r01+$00]
             @@:    cmp         r11d, $00
                    jle         @F
                    lea         r14q, [r01+r10*8+$00]
             @@:    cmp         r12d, $00
                    jle         @F
                    lea         r00q, [r10+r11*1+$00]
                    lea         r15q, [r01+r00*8+$00]
             @@:    mov         dword [r07+avt.lang.Class$fldVirtualsCount], r10d
                    mov         dword [r07+avt.lang.Class$fldSuperServicesCount], r11d
                    mov         dword [r07+avt.lang.Class$fldInstanceReferencedFieldsCount], r12d
                    mov         dword [r07+avt.lang.Class$fldVirtualsOffset], r13d
                    mov         dword [r07+avt.lang.Class$fldSuperServicesOffset], r14d
                    mov         dword [r07+avt.lang.Class$fldInstanceReferencedFieldsOffset], r15d
                    ; смещение суперкласса
                    mov         r00q, r06q
                    sub         r00q, r07q
                    mov         qword [r07+avt.lang.Class$fldSuperTypeOffset], r00q
                    ; смещение типа компонентов массива
                    mov         r00q, r02q
                    sub         r00q, r07q
                    mov         qword [r07+avt.lang.Class$fldComponentTypeOffset], r00q
                    ; смещение родительского пакета
                    mov         r00q, [.parentPackage]
                    sub         r00q, r07q
                    mov         qword [r07+avt.lang.Class$fldParentPackageOffset], r00q
                    ; смещение пути к исходному коду
                    mov         r00q, [r06+avt.lang.Class$fldSourceFileNameOffset]
                    test        r00q, r00q
                    jz          @F
                    add         r00q, r06q
                    sub         r00q, r07q
             @@:    mov         qword [r07+avt.lang.Class$fldSourceFileNameOffset], r00q
                    ; размер данных о типе
                    lea         r00q, [r10+r11*1+$00]
                    lea         r00q, [r01+r00*8+$00]
                    lea         r00q, [r00+r12*4+$00]
                    mov         dword [r07+avt.lang.Class$fldRequiredReflectiveObjectSize], r00d
                    ; массив виртуальных методов
                    cmp         r10d, $00
                    jle         .L.0000
                    mov         r00d, [r08+avt.lang.Class$fldVirtualsOffset]
                    lea         r01q, [r10+$00]
                    lea         r06q, [r08+r00*1+$00]
                    lea         r07q, [r09+r13*1+$00]
             @@:    mov         r00q, [r06+r01*8-$08]
                    lea         r00q, [r06+r00*1-$00]
                    sub         r00q, r07q
                    mov         qword [r07+r01*8-$08], r00q
                    loop        @B
        .L.0000:    ; массив суперсервисов
                    cmp         r11d, $00
                    jle         .L.0001
                    mov         r00d, [r08+avt.lang.Class$fldSuperServicesOffset]
                    lea         r01q, [r11+$00]
                    lea         r06q, [r08+r00*1+$00]
                    lea         r07q, [r09+r14*1+$00]
             @@:    mov         r00q, [r06+r01*8-$08]
                    lea         r00q, [r06+r00*1-$00]
                    sub         r00q, r07q
                    mov         qword [r07+r01*8-$08], r00q
                    loop        @B
        .L.0001:    ; массив ссылочных полей инстанции
                    cmp         r12d, $00
                    jle         .L.0002
                    mov         r00d, [r08+avt.lang.Class$fldInstanceReferencedFieldsOffset]
                    lea         r01q, [r12+$00]
                    lea         r06q, [r08+r00*1+$00]
                    lea         r07q, [r09+r15*1+$00]
                    cld
                    rep movsd
        .L.0002:    rstortp
                    mleave
                    eleave
    end if ; </fold>

    if(used avt.lang.Class$mapArray$avt.lang.Object$long$) ; <fold returns avt.lang.array.Measureable>
                    fast        avt.lang.Class$mapArray$avt.lang.Object$long$, \
                                array, avt.lang.Object, \
                                pointer, long
                    fenter
                    mov         r00q, [.array]
                    mov         r01q, [.pointer]
                    lea         r02q, [r00+avt.lang.Array$fldOffset+$08]
                    sub         r01q, r02q
                    mov         qword [r00+avt.lang.Array$fldOffset+$00], r01q
                    fcltag_x    array
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$mapStruct$avt.lang.Object$long$) ; <fold returns avt.lang.Struct>
                    method      avt.lang.Class$mapStruct$avt.lang.Object$long$, \
                                struc, avt.lang.Object, \
                                pointer, long
                    menter      $02
                    mov         r00q, [.struc]
                    mov         r01q, [.pointer]
                    lea         r02q, [r00+avt.lang.Struct$fldOffset+$08]
                    sub         r01q, r02q
                    addrcoth    r00q, $02
                    __push      $02
                    mov         qword [rsp+$18], $00
                    mov         qword [rsp+$10], r00q
                    mov         qword [rsp+$08], $00
                    mov         qword [rsp+$00], r01q
                    __sttag_x   $01,  TAG_OBJECT
                    invspec     avt.lang.Struct$$init$$long$
                    loadw_l     struc
                    mleave
                    eleave
    end if ; </fold>

    if(used avt.lang.Class$getStructReferencedFieldInfo$int$) ; <fold returns int4>
                    fast        avt.lang.Class$getStructReferencedFieldInfo$int$, \
                                this, avt.lang.Class, \
                                index, int
                    fenter
                    mov         r01q, [.this]
                    mov         r00d, [.index]
                    mov         r02d, [r01+avt.lang.Class$fldStructReferencedFieldsOffset]
                    lea         r00q, [$00+r00*4+$00]
                    lea         r02q, [r01+r02*1+$00]
                    lea         r00q, [r02+r00*8+$00]
                    vmovd       xmm0, [r00+$04]
                    vmovd       xmm1, [r00+$0c]
                    vmovd       xmm2, [r00+$08]
                    vpslldq     xmm1, xmm1, $04
                    vpslldq     xmm2, xmm2, $08
                    vpor        xmm0, xmm0, xmm1
                    vpor        xmm0, xmm0, xmm2
                    decrcoth    r01q
                    fcltag_x    this
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$getStructReferencedFieldType$int$) ; <fold returns avt.lang.Class>
                    fast        avt.lang.Class$getStructReferencedFieldType$int$, \
                                this, avt.lang.Class, \
                                index, int
                    fenter
                    mov         r01q, [.this]
                    mov         r00d, [.index]
                    mov         r02d, [r01+avt.lang.Class$fldStructReferencedFieldsOffset]
                    lea         r00q, [$00+r00*4+$00]
                    lea         r02q, [r01+r02*1+$00]
                    mov         r00q, [r02+r00*8+$10]
                    lea         r00q, [r02+r00*1+$00]
                    incrcoth    r00q
                    decrcoth    r01q
                    fcltag_x    this
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$getSourceFileNamePointer$) ; <fold returns long>
                    fast        avt.lang.Class$getSourceFileNamePointer$, \
                                this, avt.lang.Class
                    fenter
                    mov         r01q, [.this]
                    mov         r00q, [r01+avt.lang.Class$fldSourceFileNameOffset]
                    test        r00q, r00q
                    jz          @F
                    lea         r00q, [r01+r00*1+$00]
             @@:    decrcoth    r01q
                    fcltag_x    this
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$getServiceMethodEntryPoint$avt.lang.Class$int$) ; <fold returns long>
                    fast        avt.lang.Class$getServiceMethodEntryPoint$avt.lang.Class$int$, \
                                this, avt.lang.Class, \
                                type, avt.lang.Class, \
                                offset, int
                    fenter
                    mov         r10q, [.this]
                    mov         r11q, [.type]
                    lea         r00q, [r10+$00]
        .L.0000:    mov         r01d, [r00+avt.lang.Class$fldImplementorsCount]
                    mov         r02d, [r00+avt.lang.Class$fldImplementorsOffset]
                    lea         r08q, [r00+r02*1+$00]
                    lea         r09q, [r08+$00]
                    jmp         .L.0002
        .L.0001:    mov         r02q, [r08+$08]
                    lea         r02q, [r09+r02*1+$00]
                    cmp         r02q, r11q
                    je          .L.EXIT
                    lea         r08q, [r08+$10]
        .L.0002:    sub         r01d, $01
                    jge         .L.0001
                    mov         r01q, [r00+avt.lang.Class$fldSuperTypeOffset]
                    test        r01q, r01q
                    jz          @F
                    lea         r00q, [r00+r01*1+$00]
                    jmp         .L.0000
             @@:    fthrow      ServiceNotImplementedError
        .L.EXIT:    movsxd      r01q, [.offset]
                    mov         r00q, [r08+$00]
                    lea         r00q, [r09+r00*1+$00]
                    lea         r00q, [r00+r01*1+$00]
                    decrcoth    r11q
                    decrcoth    r10q
                    fcltag_x    type
                    fcltag_x    this
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$getSuperService$int$) ; <fold returns avt.lang.Class>
                    fast        avt.lang.Class$getSuperService$int$, \
                                this, avt.lang.Class, \
                                index, int
                    fenter
                    mov         r01q, [.this]
                    mov         r02d, [.index]
                    mov         r00d, [r01+avt.lang.Class$fldSuperServicesOffset]
                    lea         r00q, [r01+r00*1+$00]
                    add         r00q, [r00+r02*8+$00]
                    incrcoth    r00q
                    decrcoth    r01q
                    fcltag_x    this
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$getSuperClass$) ; <fold returns avt.lang.Class>
                    fast        avt.lang.Class$getSuperClass$, \
                                this, avt.lang.Class
                    fenter
                    mov         r01q, [.this]
                    mov         r00q, [r01+avt.lang.Class$fldSuperTypeOffset]
                    test        r00q, r00q
                    jz          @F
                    lea         r00q, [r01+r00*1+$00]
                    incrcoth    r00q
             @@:    decrcoth    r01q
                    fcltag_x    this
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$getComponentType$) ; <fold returns avt.lang.Class>
                    fast        avt.lang.Class$getComponentType$, \
                                this, avt.lang.Class
                    fenter
                    mov         r01q, [.this]
                    mov         r00q, [r01+avt.lang.Class$fldComponentTypeOffset]
                    test        r00q, r00q
                    jz          @F
                    lea         r00q, [r01+r00*1+$00]
                    incrcoth    r00q
             @@:    decrcoth    r01q
                    fcltag_x    this
                    fleave
    end if ; </fold>

    if(used avt.lang.Class$getParentPackage$) ; <fold returns avt.lang.Package>
                    fast        avt.lang.Class$getParentPackage$, \
                                this, avt.lang.Class
                    fenter
                    mov         r01q, [.this]
                    mov         r00q, [r01+avt.lang.Class$fldParentPackageOffset]
                    test        r00q, r00q
                    jz          @F
                    lea         r00q, [r01+r00*1+$00]
                    incrcoth    r00q
             @@:    decrcoth    r01q
                    fcltag_x    this
                    fleave
    end if ; </fold>
; </fold>