;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024, 2026 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold инструкции обработки исключений>
; <fold при входе в блок обработки исключений>
; r00 (синонимы: r00q, qsc0) – объектная ссылка на инстанцию исключения
; r01 (синонимы: r01q, qsc1) – указатель на инструкцию, следующую после инструкции, возбудившей исключение
; </fold>
; <fold приватные макросы — должны использоваться только этим текстом исходного кода>
macro _defehb {
if(~(definite .L.IEHB))
separator_c
.L.IEHB:
end if
}
; </fold>
; <fold возбуждение исключения>
macro mthrow exceptionType* {
local .L.0000
lea r00q, [avt.lang.#exceptionType#$create$long$]
lea r01q, [.L.0000]
jmp inst$throw
.L.0000:
}
macro throw {
local .L.0000
local .L.0001
test r00q, r00q
jnz .L.0000
mthrow NullPointerException
.L.0000: lea r01q, [.L.0001]
jmp .L.IEHB
.L.0001:
}
; </fold>
; <fold блоки обработки исключений>
macro eenter {
local .L.0000
local .L.0001
local .L.0002
local .L.0003
_defehb
lea r01q, [r01-$01]
lea r08q, [rbp-.loc.data-$00]
jmp .L.0003
.L.0000: movzx r02d, byte [rsi+$00]
cmp r02b, TAG_OBJECT
je .L.0001
cmp r02b, TAG_SUPPRESS
jne .L.0002
; TAG_SUPPRESS
mov r02q, [rsp+$08]
mov qword [rbx+ctxt$sup], r02q
.L.0001: ; TAG_OBJECT
mov r02q, [rsp+$00]
tstdecrcoth r02q
.L.0002: ; ============
__cltag_x $00
__pop $01
.L.0003: cmp rsp, r08q
jl .L.0000
}
macro try labelBegin*, labelEnd*, labelNext* {
lea r02q, [labelBegin]
cmp r01q, r02q
jl labelNext
lea r02q, [labelEnd]
cmp r01q, r02q
jge labelNext
}
macro catch classFullName*, labelCatch* {
lea r02q, [classFullName]
call inst$exceptionIsInstanceOf
test r02d, r02d
jnz labelCatch
}
macro finally labelFinally* {
__push $01
mov r02q, [rbx+ctxt$sup]
mov qword [rsp+$08], r02q
mov qword [rsp+$00], r00q
mov qword [rbx+ctxt$sup], rsp
__sttag_x $00, TAG_SUPPRESS
call labelFinally
mov r00q, [rsp+$00]
mov r02q, [rsp+$08]
mov qword [rbx+ctxt$sup], r02q
__cltag_x $00
__pop $01
}
macro eleave {
local .L.0000
local .L.0001
local .L.0002
local .L.0003
local .L.0004
_defehb
lea r08q, [rbp+.arg.data+$20]
.L.0000: movzx r02d, word [rsi+$00]
cmp r02b, TAG_OBJECT
je .L.0002
cmp r02b, TAG_SUPPRESS
je .L.0001
cmp r02w, TAG_SF_METHOD
jne .L.0003
; TAG_SF_METHOD
mov rbp, [rsp+$00]
mov rdi, [rsp+$08]
mov r09q, [rsp+$10]
mov r01q, [rsp+$18]
mov qword [rbx+ctxt$ehb], r09q
__cltag_y $00
__pop $02
jmp .L.0004
.L.0001: ; TAG_SUPPRESS
mov r02q, [rsp+$08]
mov qword [rbx+ctxt$sup], r02q
.L.0002: ; TAG_OBJECT
mov r02q, [rsp+$00]
tstdecrcoth r02q
.L.0003: ; ============
__cltag_x $00
__pop $01
.L.0004: cmp rsp, r08q
jl .L.0000
jmp r09q
end_proc
}
macro eempty {
end_proc
}
; </fold>
; </fold>