;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold макросы инструкций быстрых методов>
; <fold приватные макросы — должны использоваться только макросами инструкций быстрых методов>
macro _fchknull rs0q* {
local .L.0000
test rs0q, rs0q
jnz .L.0000
fthrow NullPointerException
.L.0000:
}
macro _fchknulle rs0q* {
local .L.0000
test rs0q, rs0q
jnz .L.0000
releasee
fthrow NullPointerException
.L.0000:
}
macro _floadw_l rs0q*, localvarName* {
mov rs0q, [.#localvarName]
if(~("this" eq `localvarName))
_fchknull rs0q
end if
}
macro _floadwe_l rs0q*, localvarName* {
mov rs0q, [.#localvarName]
if(~("this" eq `localvarName))
_fchknulle rs0q
end if
}
macro _floadw_g rs0q*, globalmember* {
mov rs0q, globalmember
_fchknull rs0q
}
macro _floadwe_g rs0q*, globalmember* {
mov rs0q, globalmember
_fchknulle rs0q
}
; </fold>
; <fold вход, выход>
macro fenter {
enter .loc.data, $00
}
macro fthrow exceptionType* {
leave
pop r01q
lea r00q, [avt.lang.#exceptionType#$create$long$]
jmp inst$throw
}
macro freturn {
if(.arg.tags > 0)
lea rsi, [rsi+.arg.tags]
end if
leave
if(.arg.data > 0)
ret .arg.data
else
ret
end if
}
macro fleave {
freturn
end_proc
}
; </fold>
; <fold очистка стака>
macro fcltag_x [localvarName] {
forward mov byte [.#localvarName#.tag], TAG_EMPTY
}
macro fcltag_y [localvarName] {
forward mov word [.#localvarName#.tag], TAG_EMPTY
}
macro fcltag_z [localvarName] {
forward mov dword [.#localvarName#.tag], TAG_EMPTY
}
macro frelease [localvarName] {
forward mov r01q, [.#localvarName]
if("this" eq `localvarName)
decrcoth r01q
else
tstdecrcoth r01q
end if
}
macro frelease_o localvarName* {
decrcoth r01q
fcltag_x localvarName
}
; </fold>
; <fold тексты исходного кода макросов инструкций быстрых методов>
include "read.instance-field.inc"
include "read.struct-field.inc"
include "write.instance-field.inc"
include "write.struct-field.inc"
; </fold>
; </fold>