Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions msingi/mkusanyaji/mkaguzi.swa
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,20 @@ W0 mkaguzi_sajili_kazi(N32 kazi_node) {
// lililopatikana wakati wa kikao hiki: ukubwa wa tangazo la safu
// ULIBADILISHWA (16384->131072) BILA kubadilisha namba hii
// hapa, ikiacha ulinzi wa kufurika ukiendelea kukataa kwa
// ukubwa wa ZAMANI — angalia lugha-swa/swa (issue itakayofuata
// baada ya #196) kwa maelezo kamili.
// ukubwa wa ZAMANI — angalia lugha-swa/swa#197 kwa maelezo
// kamili. SASA kipengele kipya cha lugha, urefu(x) (angalia
// uzalishaji.swa), kingeweza kutatua hili moja kwa moja — LAKINI
// kimejaribiwa hapa na KUONDOLEWA KWA MAKUSUDI: mkaguzi.swa ni
// sehemu ya CHANZO CHA MKUSANYAJI MWENYEWE, na mbegu.bin (mbegu
// ya awali iliyogandishwa, isiyobadilika) haitambui urefu() kama
// hoja iliyosajiliwa — ikijaribu kukusanya stage1.swa (ambayo
// sasa ingehitaji urefu()) mbegu.bin ingekataa kwa "kazi
// haijafafanuliwa: urefu", ikivunja mnyororo wa kujitegemea
// (bootstrap) kabisa. urefu() inafaa kutumika kwenye MIRADI
// INAYOTUMIA mkusanyaji (kama Dominion), SI ndani ya chanzo cha
// mkusanyaji wenyewe, hadi mbegu.bin yenyewe ijengwe upya
// ikiwa na msaada wa urefu() (swali tofauti kabisa la
// kujitegemea, nje ya wigo wa kazi hii).
N32 off = kazi_jina_pool_wapi;
N32 i = 0;
wakati (jina[i] != 0) {
Expand Down Expand Up @@ -399,7 +411,8 @@ W0 mkaguzi_kagua_kiwango_cha_huduma(N8* jina, N32 hoja_idadi) {
kama (jina_linganisha(jina, "wito_wa_mfumo")) { kiwango_hoja = 7; }
sivyo { kama (jina_linganisha(jina, "tekeleza")) { kiwango_hoja = 4; }
sivyo { kama (jina_linganisha(jina, "ukubwa")) { kiwango_hoja = 1; }
sivyo { kama (jina_linganisha(jina, "anwani_ya_kazi")) { kiwango_hoja = 1; } } } }
sivyo { kama (jina_linganisha(jina, "anwani_ya_kazi")) { kiwango_hoja = 1; }
sivyo { kama (jina_linganisha(jina, "urefu")) { kiwango_hoja = 1; } } } } }
kama (kiwango_hoja > 0) {
kama (hoja_idadi > kiwango_hoja) {
andika_stderr("kosa [%s]: idadi ya hoja kwa '%s' si sahihi (kikomo ni %d, imepokea %d)\n", mkaguzi_kazi_sasa, jina, kiwango_hoja, hoja_idadi);
Expand Down
45 changes: 45 additions & 0 deletions msingi/mkusanyaji/uzalishaji.swa
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ N32 data_ulimwengu_jina_off[1024];
N32 data_ulimwengu_enc[1024]; // usimbaji wa aina kwa upakiaji sahihi
N32 data_ulimwengu_ni_safu[1024]; // 1 = safu (upakiaji unatumia LEA ya anwani)
N32 data_ulimwengu_bss[1024]; // 1 = hakuna kianzio, kigezo kinaenda .bss
// Idadi ya vipengele vilivyotangazwa vya safu (mfano N8 x[131072] -> 131072).
// Inatumika na urefu(x) (angalia uzalishaji_wito) -- lugha-swa/swa#197
// ilitokea kwa sababu ukubwa wa safu na namba ya ukaguzi wa kufurika
// zilikuwa namba mbili zilizowekwa kwa mkono zinazopaswa kuendana;
// urefu(x) inaruhusu namba ya pili kutokana moja kwa moja kutoka
// tangazo la safu badala ya kunakiliwa kwa mkono.
N32 data_ulimwengu_idadi_ya_kipengele[1024];
N32 data_ulimwengu_idadi = 0;
N32 bss_wapi = 0;

Expand Down Expand Up @@ -2584,6 +2591,42 @@ W0 uzalishaji_wito(N32 node, N32 kazi_node) {
}
}

// Wito maalum wa urefu(safu) — idadi ya vipengele vilivyotangazwa
// vya safu ya ULIMWENGU (global) yenye ukubwa maalum, kokotoa
// wakati wa kukusanya (lengthof). Hoja ni jina la kigezo cha safu
// (SI aina, SI kigezo cha ndani/paramu -- toleo la kwanza
// linashughulikia safu za ulimwengu pekee, angalia maelezo ya
// data_ulimwengu_idadi_ya_kipengele juu ya faili hili). Kigezo
// kisicho safu ya ulimwengu ni hitilafu WAZI ya kukusanya, si
// tabia ya kimya isiyo sahihi -- lugha-swa/swa#197 ilitokana na
// namba mbili zilizowekwa kwa mkono zisizoendana; kipengele hiki
// kipya lazima kisianzishe aina mpya ya uharibifu wa kimya.
kama (jina_linganisha(callee, "urefu")) {
N32 a0 = ast_kulia[node];
kama (a0 != -1 && ast_aina[a0] == 5) { // KITAMBULISHO
N8* jina_a = ast_pool + ast_jina_off[a0];
N32 gi = 0;
N32 imepatikana = 0;
wakati (gi < data_ulimwengu_idadi) {
N8* gjina = ast_pool + data_ulimwengu_jina_off[gi];
kama (jina_linganisha(gjina, jina_a) && data_ulimwengu_ni_safu[gi] == 1) {
andika_mov_eax(data_ulimwengu_idadi_ya_kipengele[gi]);
imepatikana = 1;
gi = data_ulimwengu_idadi; // toka kwenye kitanzi
} sivyo {
gi = gi + 1;
}
}
kama (imepatikana == 0) {
andika_stderr("Hitilafu: urefu(%s) -- '%s' si safu ya ulimwengu (global) yenye ukubwa maalum. urefu() ya toleo hili inashughulikia tu safu za ulimwengu zilizotangazwa moja kwa moja (mfano N8 x[1024];), si vigezo vya ndani wala paramu.\n", jina_a, jina_a);
wito_wa_mfumo(60, 1, 0, 0, 0, 0, 0);
}
rudisha;
}
andika_stderr("Hitilafu: urefu(...) inahitaji hoja moja ya kitambulisho cha safu ya ulimwengu.\n");
wito_wa_mfumo(60, 1, 0, 0, 0, 0, 0);
}

// Wito wa mfumo (syscall) — builtin: hoja (namba, a1..a5) zinapangwa
// kwa ABI ya syscall: rax=namba, rdi=a1, rsi=a2, rdx=a3, r10=a4, r8=a5, r9=0.
kama (jina_linganisha(callee, "wito_wa_mfumo")) {
Expand Down Expand Up @@ -5476,8 +5519,10 @@ W0 uzalishaji_kuu(N32 mzizi, N32 hali_exe) {
kama (count > 0) { sz = sz_elem * count; }
enc = enc + 1;
data_ulimwengu_ni_safu[data_ulimwengu_idadi] = 1;
data_ulimwengu_idadi_ya_kipengele[data_ulimwengu_idadi] = count;
} sivyo {
data_ulimwengu_ni_safu[data_ulimwengu_idadi] = 0;
data_ulimwengu_idadi_ya_kipengele[data_ulimwengu_idadi] = 0;
}
data_ulimwengu_enc[data_ulimwengu_idadi] = enc;
data_ulimwengu_size[data_ulimwengu_idadi] = sz;
Expand Down
Loading