;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold определения>
; <fold поддержка числовых имён регистров архитектуры x86-64 и различных псевдонимов регистров>
r0 equ rax
r1 equ rcx
r2 equ rdx
r3 equ rbx
r4 equ rsp
r5 equ rbp
r6 equ rsi
r7 equ rdi
r0q equ rax
r1q equ rcx
r2q equ rdx
r3q equ rbx
r4q equ rsp
r5q equ rbp
r6q equ rsi
r7q equ rdi
r8q equ r8
r9q equ r9
r0d equ eax
r1d equ ecx
r2d equ edx
r3d equ ebx
r4d equ esp
r5d equ ebp
r6d equ esi
r7d equ edi
r0w equ ax
r1w equ cx
r2w equ dx
r3w equ bx
r4w equ sp
r5w equ bp
r6w equ si
r7w equ di
r0b equ al
r1b equ cl
r2b equ dl
r3b equ bl
r4b equ spl
r5b equ bpl
r6b equ sil
r7b equ dil
r0l equ al
r1l equ cl
r2l equ dl
r3l equ bl
r4l equ spl
r5l equ bpl
r6l equ sil
r7l equ dil
r00 equ rax
r01 equ rcx
r02 equ rdx
r03 equ rbx
r04 equ rsp
r05 equ rbp
r06 equ rsi
r07 equ rdi
r08 equ r8
r09 equ r9
r00q equ rax
r01q equ rcx
r02q equ rdx
r03q equ rbx
r04q equ rsp
r05q equ rbp
r06q equ rsi
r07q equ rdi
r08q equ r8
r09q equ r9
r10q equ r10
r11q equ r11
r12q equ r12
r13q equ r13
r14q equ r14
r15q equ r15
r00d equ eax
r01d equ ecx
r02d equ edx
r03d equ ebx
r04d equ esp
r05d equ ebp
r06d equ esi
r07d equ edi
r08d equ r8d
r09d equ r9d
r00w equ ax
r01w equ cx
r02w equ dx
r03w equ bx
r04w equ sp
r05w equ bp
r06w equ si
r07w equ di
r08w equ r8w
r09w equ r9w
r00b equ al
r01b equ cl
r02b equ dl
r03b equ bl
r04b equ spl
r05b equ bpl
r06b equ sil
r07b equ dil
r08b equ r8l
r09b equ r9l
r00l equ al
r01l equ cl
r02l equ dl
r03l equ bl
r04l equ spl
r05l equ bpl
r06l equ sil
r07l equ dil
r08l equ r8l
r09l equ r9l
bsc0 equ al
bsc1 equ cl
bsc2 equ dl
bsc3 equ bl
bsc4 equ spl
bsc5 equ bpl
bsc6 equ sil
bsc7 equ dil
bsc8 equ r8l
bsc9 equ r9l
bsc00 equ al
bsc01 equ cl
bsc02 equ dl
bsc03 equ bl
bsc04 equ spl
bsc05 equ bpl
bsc06 equ sil
bsc07 equ dil
bsc08 equ r8l
bsc09 equ r9l
bsc10 equ r10l
bsc11 equ r11l
bsc12 equ r12l
bsc13 equ r13l
bsc14 equ r14l
bsc15 equ r15l
wsc0 equ ax
wsc1 equ cx
wsc2 equ dx
wsc3 equ bx
wsc4 equ sp
wsc5 equ bp
wsc6 equ si
wsc7 equ di
wsc8 equ r8w
wsc9 equ r9w
wsc00 equ ax
wsc01 equ cx
wsc02 equ dx
wsc03 equ bx
wsc04 equ sp
wsc05 equ bp
wsc06 equ si
wsc07 equ di
wsc08 equ r8w
wsc09 equ r9w
wsc10 equ r10w
wsc11 equ r11w
wsc12 equ r12w
wsc13 equ r13w
wsc14 equ r14w
wsc15 equ r15w
dsc0 equ eax
dsc1 equ ecx
dsc2 equ edx
dsc3 equ ebx
dsc4 equ esp
dsc5 equ ebp
dsc6 equ esi
dsc7 equ edi
dsc8 equ r8d
dsc9 equ r9d
dsc00 equ eax
dsc01 equ ecx
dsc02 equ edx
dsc03 equ ebx
dsc04 equ esp
dsc05 equ ebp
dsc06 equ esi
dsc07 equ edi
dsc08 equ r8d
dsc09 equ r9d
dsc10 equ r10d
dsc11 equ r11d
dsc12 equ r12d
dsc13 equ r13d
dsc14 equ r14d
dsc15 equ r15d
qsc0 equ rax
qsc1 equ rcx
qsc2 equ rdx
qsc3 equ rbx
qsc4 equ rsp
qsc5 equ rbp
qsc6 equ rsi
qsc7 equ rdi
qsc8 equ r8
qsc9 equ r9
qsc00 equ rax
qsc01 equ rcx
qsc02 equ rdx
qsc03 equ rbx
qsc04 equ rsp
qsc05 equ rbp
qsc06 equ rsi
qsc07 equ rdi
qsc08 equ r8
qsc09 equ r9
qsc10 equ r10
qsc11 equ r11
qsc12 equ r12
qsc13 equ r13
qsc14 equ r14
qsc15 equ r15
esc0 equ st0
esc1 equ st1
esc2 equ st2
esc3 equ st3
esc4 equ st4
esc5 equ st5
esc6 equ st6
esc7 equ st7
x0 equ xmm0
x1 equ xmm1
x2 equ xmm2
x3 equ xmm3
x4 equ xmm4
x5 equ xmm5
x6 equ xmm6
x7 equ xmm7
x8 equ xmm8
x9 equ xmm9
y0 equ ymm0
y1 equ ymm1
y2 equ ymm2
y3 equ ymm3
y4 equ ymm4
y5 equ ymm5
y6 equ ymm6
y7 equ ymm7
y8 equ ymm8
y9 equ ymm9
z0 equ zmm0
z1 equ zmm1
z2 equ zmm2
z3 equ zmm3
z4 equ zmm4
z5 equ zmm5
z6 equ zmm6
z7 equ zmm7
z8 equ zmm8
z9 equ zmm9
x00 equ xmm0
x01 equ xmm1
x02 equ xmm2
x03 equ xmm3
x04 equ xmm4
x05 equ xmm5
x06 equ xmm6
x07 equ xmm7
x08 equ xmm8
x09 equ xmm9
x10 equ xmm10
x11 equ xmm11
x12 equ xmm12
x13 equ xmm13
x14 equ xmm14
x15 equ xmm15
x16 equ xmm16
x17 equ xmm17
x18 equ xmm18
x19 equ xmm19
x20 equ xmm20
x21 equ xmm21
x22 equ xmm22
x23 equ xmm23
x24 equ xmm24
x25 equ xmm25
x26 equ xmm26
x27 equ xmm27
x28 equ xmm28
x29 equ xmm29
x30 equ xmm30
x31 equ xmm31
y00 equ ymm0
y01 equ ymm1
y02 equ ymm2
y03 equ ymm3
y04 equ ymm4
y05 equ ymm5
y06 equ ymm6
y07 equ ymm7
y08 equ ymm8
y09 equ ymm9
y10 equ ymm10
y11 equ ymm11
y12 equ ymm12
y13 equ ymm13
y14 equ ymm14
y15 equ ymm15
y16 equ ymm16
y17 equ ymm17
y18 equ ymm18
y19 equ ymm19
y20 equ ymm20
y21 equ ymm21
y22 equ ymm22
y23 equ ymm23
y24 equ ymm24
y25 equ ymm25
y26 equ ymm26
y27 equ ymm27
y28 equ ymm28
y29 equ ymm29
y30 equ ymm30
y31 equ ymm31
z00 equ zmm0
z01 equ zmm1
z02 equ zmm2
z03 equ zmm3
z04 equ zmm4
z05 equ zmm5
z06 equ zmm6
z07 equ zmm7
z08 equ zmm8
z09 equ zmm9
z10 equ zmm10
z11 equ zmm11
z12 equ zmm12
z13 equ zmm13
z14 equ zmm14
z15 equ zmm15
z16 equ zmm16
z17 equ zmm17
z18 equ zmm18
z19 equ zmm19
z20 equ zmm20
z21 equ zmm21
z22 equ zmm22
z23 equ zmm23
z24 equ zmm24
z25 equ zmm25
z26 equ zmm26
z27 equ zmm27
z28 equ zmm28
z29 equ zmm29
z30 equ zmm30
z31 equ zmm31
xmm00 equ xmm0
xmm01 equ xmm1
xmm02 equ xmm2
xmm03 equ xmm3
xmm04 equ xmm4
xmm05 equ xmm5
xmm06 equ xmm6
xmm07 equ xmm7
xmm08 equ xmm8
xmm09 equ xmm9
ymm00 equ ymm0
ymm01 equ ymm1
ymm02 equ ymm2
ymm03 equ ymm3
ymm04 equ ymm4
ymm05 equ ymm5
ymm06 equ ymm6
ymm07 equ ymm7
ymm08 equ ymm8
ymm09 equ ymm9
zmm00 equ zmm0
zmm01 equ zmm1
zmm02 equ zmm2
zmm03 equ zmm3
zmm04 equ zmm4
zmm05 equ zmm5
zmm06 equ zmm6
zmm07 equ zmm7
zmm08 equ zmm8
zmm09 equ zmm9
msk0 equ k0
msk1 equ k1
msk2 equ k2
msk3 equ k3
msk4 equ k4
msk5 equ k5
msk6 equ k6
msk7 equ k7
; </fold>
; <fold встроенные константы языка ПВТ-ОО>
false = 0
true = -1
null = 0
; </fold>
; <fold смещения полей области контекста тагированного стака>
; Тагированный стак, используемый в среде исполнения программ, написанных на ПВТ-ОО, имеет четыре области:
; 1. Область данных.
; Является массивом из 16-байтных элементов данных. Значения некоторых векторных типов (их всего 6: int8, long4, long8, float8, double4, double8) занимают 2 или 4 таких
; элемента, остальные значения занимают ровно 1 элемент данных. Если значение не полностью занимает весь элемент данных, то оно расширяется нулями до полного элемента данных.
; 2. Область охраны.
; Занимает определённое количество 16-байтных элементов данных на вершине (в начале) области данных, но не более 256 элементов (4 КБ). При попытке записи данных в эту область
; возбуждается ошибка StackOverflowError.
; 3. Область тагов.
; Следует за областью данных и является массивом из 1-байтных тагов. Количество тагов равно количеству элементов данных, поэтому размер области тагов составляет 1/16 от размера
; области данных. Каждому элементу данных соответствует свой таг, определяющий тип данных этого элемента.
; 4. Область контекста.
; Следует за областью тагов и является дополнением к регистрам процессора. На эту область всегда ссылается регистр rbx в 64-битных программах, или ebx — в 32-битных. Эта область
; имеет размер 4 КБ и состоит из следующих 64-битных полей:
ctxt$zer = $0000 ; всегда равно нулю
ctxt$ehb = $0008 ; указатель на текущий блок обработки исключений
ctxt$dat = $0010 ; указатель на начало области данных, он же – указатель на начало области охраны
ctxt$grd = $0018 ; указатель на конец области охраны
ctxt$tag = $0020 ; указатель на начало области тагов, он же — указатель на конец области данных
ctxt$end = $0028 ; указатель на конец области контекста
ctxt$tsp = $0030 ; место для временного хранения дополнения к rsp/esp, которое ссылается на соответствующий таг, когда регистр rsi/esi используется
ctxt$tbp = $0038 ; место для временного хранения дополнения к rbp/ebp, которое ссылается на соответствующий таг, когда регистр rdi/edi используется
ctxt$tm2 = $0040 ; временные данные функций инструкций высокого уровня
ctxt$tm3 = $0048 ; временные данные функций инструкций высокого уровня
ctxt$tm4 = $0050 ; временные данные функций инструкций высокого уровня
ctxt$tm5 = $0058 ; временные данные функций инструкций высокого уровня
ctxt$tm6 = $0060 ; временные данные функций инструкций высокого уровня
ctxt$tm7 = $0068 ; временные данные функций инструкций высокого уровня
ctxt$tm8 = $0070 ; временные данные функций инструкций высокого уровня
ctxt$tm9 = $0078 ; временные данные функций инструкций высокого уровня
ctxt$sup = $0080 ; указатель на последний элемент данных с тагом TAG_SUPPRESS
; Поля для хранения предыдущих значений регистров для возможности их восстановления:
ctxt$r01 = $0088 ; rcx
ctxt$r02 = $0090 ; rdx
ctxt$r03 = $0098 ; rbx
ctxt$r04 = $00a0 ; rsp
ctxt$r05 = $00a8 ; rbp
ctxt$r06 = $00b0 ; rsi
ctxt$r07 = $00b8 ; rdi
ctxt$r08 = $00c0 ; r08
ctxt$r09 = $00c8 ; r09
ctxt$r10 = $00d0 ; r10
ctxt$r11 = $00d8 ; r11
ctxt$r12 = $00e0 ; r12
ctxt$r13 = $00e8 ; r13
ctxt$r14 = $00f0 ; r14
ctxt$r15 = $00f8 ; r15
; Остальное место (по смещению $0100) — это область xstorage для хранения предыдущих значений регистров FPU, SSE, AVX и AVX-512.
ctxt$xst = $0100 ; xstorage
; </fold>
; <fold таги элементов области данных тагированного стака>
TAG_EMPTY = $00
TAG_INT8 = $1c18
TAG_LONG4 = $2624
TAG_LONG8 = $2e2c2a28
TAG_FLOAT8 = $fcf8
TAG_DOUBLE4 = $d6d4
TAG_DOUBLE8 = $dedcdad8
TAG_OBJECT = $88
TAG_SUPPRESS = $99
TAG_SF_METHOD = $5f8e
; </fold>
; </fold>
; <fold общие макросы>
; <fold выравнивание кода и данных>
macro nopvar length* {
local .rem
.rem = length
while(.rem > 0)
if(.rem = 1)
db $90
break
else if(.rem = 2)
db $66, $90
break
else if(.rem = 3)
db $0f, $1f, $00
break
else if(.rem = 4)
db $0f, $1f, $40, $00
break
else if(.rem = 5)
db $0f, $1f, $44, $00, $00
break
else if(.rem = 6)
db $66, $0f, $1f, $44, $00, $00
break
else if(.rem = 7)
db $0f, $1f, $80, $00, $00, $00, $00
break
else if(.rem = 8)
db $0f, $1f, $84, $00, $00, $00, $00, $00
break
else
db $66, $0f, $1f, $84, $00, $00, $00, $00, $00
.rem = .rem-9
end if
end while
}
macro align_c algn* {
nopvar (-$) and ((algn)-1)
}
macro align_d algn* {
repeat((-$) and ((algn)-1))
db $00
end repeat
}
macro separator_c {
nopvar $04-($ and $03)
}
macro separator_d {
align_d $40
}
; </fold>
; <fold код>
macro proc procedureFullName* {
procedureFullName:
}
macro end_proc {
.D.IEND: separator_c
separator_c
}
macro fast methodFullName*, [argumentName, argumentType] {
common
local .sizedata
local .sizetags
proc methodFullName
.sizedata = $00000000
.sizetags = $00000000
reverse
if ~ "" eq `argumentName
if ~ "" eq `argumentType
label .#argumentName at rbp+.sizedata+$10
label .#argumentName#.tag at rsi+.sizetags+$00
if(argumentType in <long8, double8>)
.sizedata = .sizedata+$40
.sizetags = .sizetags+$04
else if(argumentType in <int8, long4, float8, double4>)
.sizedata = .sizedata+$20
.sizetags = .sizetags+$02
else
.sizedata = .sizedata+$10
.sizetags = .sizetags+$01
end if
end if
end if
common
.arg.data = .sizedata
.arg.tags = .sizetags
.loc.data = $00000000
}
macro floc [localvarName, localvarType] {
forward
if(localvarType in <long8, double8>)
.loc.data = .loc.data+$40
else if(localvarType in <int8, long4, float8, double4>)
.loc.data = .loc.data+$20
else
.loc.data = .loc.data+$10
end if
label .#localvarName at rbp-.loc.data
}
macro method methodFullName*, [argumentName, argumentType] {
common
local .sizedata
local .sizetags
proc methodFullName
.sizedata = $00000000
.sizetags = $00000000
reverse
if ~ "" eq `argumentName
if ~ "" eq `argumentType
label .#argumentName at rbp+.sizedata+$20
label .#argumentName#.tag at rdi+.sizetags+$02
if(argumentType in <long8, double8>)
.sizedata = .sizedata+$40
.sizetags = .sizetags+$04
else if(argumentType in <int8, long4, float8, double4>)
.sizedata = .sizedata+$20
.sizetags = .sizetags+$02
else
.sizedata = .sizedata+$10
.sizetags = .sizetags+$01
end if
end if
end if
common
.arg.data = .sizedata
.arg.tags = .sizetags
.loc.data = $00000000
.loc.tags = $00000000
}
macro loc [localvarName, localvarType] {
forward
if(localvarType in <long8, double8>)
.loc.data = .loc.data+$40
.loc.tags = .loc.tags+$04
else if(localvarType in <int8, long4, float8, double4>)
.loc.data = .loc.data+$20
.loc.tags = .loc.tags+$02
else
.loc.data = .loc.data+$10
.loc.tags = .loc.tags+$01
end if
label .#localvarName at rbp-.loc.data
label .#localvarName#.tag at rdi-.loc.tags
}
macro alias aliasFullName*, methodFullName* {
label aliasFullName at methodFullName
label aliasFullName#.D.IEND at aliasFullName
aliasFullName#.arg.data = methodFullName#.arg.data
aliasFullName#.arg.tags = methodFullName#.arg.tags
}
macro impl classFullName*, serviceFullName* {
classFullName#$$impl$$#serviceFullName:
}
; </fold>
; <fold данные>
macro package packageFullName* {
align_d $40
packageFullName:
.this: dq $0000000000000000, $0000000000000000
dq -.this+avt.lang.Package, $0000000000000000
}
macro class classFullName* {
align_d $40
classFullName:
.this: dq $0000000000000000, $0000000000000000
dq -.this+avt.lang.Class, $0000000000000000
}
macro dsfld fieldAttributes*, fieldName*, classFullName*, fieldCapacity*, fieldFullName* {
dd fieldAttributes, fieldFullName, fieldCapacity, fieldFullName#.struct
dq -.$sfld$+classFullName
dq -.$sfld$+dbgi$istr.#fieldName
}
macro dfild fieldAttributes*, fieldName*, classFullName*, fieldFullName* {
dd fieldAttributes, fieldFullName, $00000000, $00000000
dq -.$dfld$+classFullName
dq -.$dfld$+dbgi$istr.#fieldName
}
macro dmeth methodAttributesAndArgumentsLength*, methodName*, classFullName*, methodFullName*, argumentsLabel* {
dd methodAttributesAndArgumentsLength
dd -.$dmth$+argumentsLabel
dq -.$dmth$+methodFullName
dq -.$dmth$+classFullName
dq -.$dmth$+dbgi$istr.#methodName
}
macro dmeths methodAttributesAndArgumentsLength*, methodSpecName*, classFullName*, methodFullName*, argumentsLabel* {
dd methodAttributesAndArgumentsLength
dd -.$dmth$+argumentsLabel
dq -.$dmth$+methodFullName
dq -.$dmth$+classFullName
dq -.$dmth$+dbgi$istr.$#methodSpecName#$
}
macro dprop propertyAttributes*, propertyName*, classFullName*, readSyntheticFullName*, writeSyntheticFullName*, storedSyntheticFullName* {
dd propertyAttributes, $00000000
dq -.$dprp$+storedSyntheticFullName
dq -.$dprp$+classFullName
dq -.$dprp$+dbgi$istr.#propertyName
dq -.$dprp$+readSyntheticFullName
dq -.$dprp$+writeSyntheticFullName
dq $0000000000000000, $0000000000000000
}
macro glob globalvarFullName*, globalvarType* {
if(globalvarType in <long8, double8>)
align_d $40
else if(globalvarType in <int8, long4, float8, double4>)
align_d $20
else
align_d $10
end if
globalvarFullName:
}
macro iconst globalconstFullName*, value* {
globalconstFullName = value ; целочисленное значение
}
macro sconst globalconstFullName*, value* {
globalconstFullName = value ; индекс строки
}
macro oconst globalconstFullName*, value* {
globalconstFullName = value ; ссылка на данные о типе или пакете
}
macro field offset*, fieldFullName* {
fieldFullName = offset ; смещение поля в инстанции или в структуре
}
macro idxvirt index*, methodFullName* {
methodFullName#.idx.virt = index ; индекс виртуального метода
}
macro idxserv index*, methodFullName* {
methodFullName#.idx.serv = index ; индекс сервисного метода
}
; </fold>
; <fold константы>
macro cons constantBlockFullName*, algn* {
align_d algn
cons$#constantBlockFullName:
}
; </fold>
; <fold ресурсы>
macro avtrsrc fileRelaPath*, rsrcFullPath* {
local hash
hash: dd $00000000 ; контрольная сумма пути и названия ресурса
dw .endn-.beginn ; длина пути и названия ресурса
.beginn: db rsrcFullPath ; путь и название ресурса
.endn: align_d $04
dd .endd-.begind ; размер данных ресурса
.begind: file fileRelaPath ; данные ресурса
.endd: align_d $10
.result = 0
.base = 1
repeat(.endn-.beginn)
load .char byte from .beginn+(%-1)
.result = $ffffffff and (.result+.base*.char)
.base = $ffffffff and (.base*$1f)
end repeat
store dword .result at hash
}
; </fold>
; <fold отладочная информация>
macro dbinfob compilerNameAndVersion* { ; базовая отладочная информация: только данные для построения трассировки стака
local .head
local .cont
.head: db "DBB", $00
dd -.head+.cont
db compilerNameAndVersion, $00
align_d $08
.cont: dd dbgi$istr-.cont
dd dbgi$istr.$iend$-dbgi$istr ; строки — названия членов типов
dd dbgi$isrc-.cont
dd dbgi$isrc.$iend$-dbgi$isrc ; строки — относительные пути к текстам исходного кода
dd dbgi$ient-.cont
dd dbgi$ient.$iend$-dbgi$ient ; соответствия между методами, строками исходного кода и участками машинного кода
}
; <fold > macro dbinfof compilerNameAndVersion* { ; полная отладочная информация: данные для построения трассировки стака + данные обо всех элементах программы
; На данный момент полная отладочная информация не реализована, поскольку нет отладчиков, которые могли бы её использовать.
; local .head
; local .cont
; .head: db "DBF", $00
; dd -.head+.cont
; db compilerNameAndVersion, $00
; align_d $08
; .cont: dd dbgi$istr-.cont
; dd dbgi$istr.$iend$-dbgi$istr ; строки — названия членов типов
; dd dbgi$isrc-.cont
; dd dbgi$isrc.$iend$-dbgi$isrc ; строки — относительные пути к текстам исходного кода
; dd dbgi$ient-.cont
; dd dbgi$ient.$iend$-dbgi$ient ; соответствия между методами, строками исходного кода и участками машинного кода
; dd dbgi$ipck-.cont
; dd dbgi$ipck.$iend$-dbgi$ipck ; пакеты
; dd dbgi$icls-.cont
; dd dbgi$icls.$iend$-dbgi$icls ; классы и другие типы
; dd dbgi$icns-.cont
; dd dbgi$icns.$iend$-dbgi$icns ; глобальные переменные — константы
; dd dbgi$igro-.cont
; dd dbgi$igro.$iend$-dbgi$igro ; глобальные переменные — только для чтения
; dd dbgi$igrw-.cont
; dd dbgi$igrw.$iend$-dbgi$igrw ; глобальные переменные — для чтения и записи
; dd dbgi$ifld-.cont
; dd dbgi$ifld.$iend$-dbgi$ifld ; поля инстанций и структур
; dd dbgi$iprp-.cont
; dd dbgi$iprp.$iend$-dbgi$iprp ; свойства
; dd dbgi$imth-.cont
; dd dbgi$imth.$iend$-dbgi$imth ; методы, в том числе служебные методы и методы-операторы
; dd dbgi$iloc-.cont
; dd dbgi$iloc.$iend$-dbgi$iloc ; локальные переменные методов
; } </fold>
macro distring name* {
local .begin
local .end
if(used .#name)
.#name: db -.begin+.end
.begin: db `name
.end:
end if
}
macro distring_s name* {
local .begin
local .end
if(used .$#name#$)
.$#name#$: db -.begin+.end
.begin: db '<'
db `name
db '>'
.end:
end if
}
macro dientry sourceLabel*, classFullName*, methodName*, methodFullName*, [sourceLine, blockBegin, blockEnd] {
forward local .entry
if(methodFullName#blockEnd > methodFullName#blockBegin)
.entry: dd -.entry+methodFullName#blockBegin ; смещение начала участка машинного кода
dd -methodFullName#blockBegin+methodFullName#blockEnd ; размер участка машинного кода, в байтах
dd -.entry+dbgi$isrc#sourceLabel ; смещение относительного пути к тексту исходного кода
dd sourceLine ; порядковый номер строки исходного кода
dd -.entry+classFullName ; смещение данных о родительском типе
dd -.entry+dbgi$istr.#methodName ; смещение простого имени метода
dd $00000000 ; зарезервировано
dd $00000000 ; зарезервировано
end if
}
macro dientry_s sourceLabel*, classFullName*, methodSpecName*, methodFullName*, [sourceLine, blockBegin, blockEnd] {
forward local .entry
if(methodFullName#blockEnd > methodFullName#blockBegin)
.entry: dd -.entry+methodFullName#blockBegin ; смещение начала участка машинного кода
dd -methodFullName#blockBegin+methodFullName#blockEnd ; размер участка машинного кода, в байтах
dd -.entry+dbgi$isrc#sourceLabel ; смещение относительного пути к тексту исходного кода
dd sourceLine ; порядковый номер строки исходного кода
dd -.entry+classFullName ; смещение данных о родительском типе
dd -.entry+dbgi$istr.$#methodSpecName#$ ; смещение простого имени метода
dd $00000000 ; зарезервировано
dd $00000000 ; зарезервировано
end if
}
; </fold>
; </fold>
; <fold макросы инструкций высокого уровня>
include "!inst.inc"
; </fold>