;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; 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>