;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; 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>