From dd1fbfd5da545ad620fddd28631ef30e4daed6ed Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Tue, 13 Jan 2026 10:32:47 +0900 Subject: [PATCH] add import feature --- assert.c | 2 +- exports.c | 16 ++++--- parse.c | 1 - test/fib/exported | 7 +++ test/fib/fib.yo | 8 ++++ test/fib/obj | Bin 0 -> 152 bytes test/main.yo | 10 +++++ test/nqueen/exported | 7 +++ test/{fib.yo => nqueen/nqueen.yo} | 24 +++------- test/nqueen/obj | Bin 0 -> 840 bytes vm/run | Bin 0 -> 36648 bytes vm/vm.c | 71 +++++++++++++++++++++++++----- 12 files changed, 109 insertions(+), 37 deletions(-) create mode 100644 test/fib/exported create mode 100644 test/fib/fib.yo create mode 100644 test/fib/obj create mode 100644 test/main.yo create mode 100644 test/nqueen/exported rename test/{fib.yo => nqueen/nqueen.yo} (57%) create mode 100644 test/nqueen/obj create mode 100755 vm/run diff --git a/assert.c b/assert.c index c1d533e..ff10759 100644 --- a/assert.c +++ b/assert.c @@ -232,10 +232,10 @@ assertexpr(Node *n) case Ocall: assertexpr(r); t = l->ty; + n->ty = t->tof; if(l->op==Opkg) return; usetype(t); - n->ty = t->tof; break; default: assert(0); diff --git a/exports.c b/exports.c index 4d22976..4d75609 100644 --- a/exports.c +++ b/exports.c @@ -93,13 +93,15 @@ void genbin(char *name) { f = fopen(name, "w+"); - // fprintf(f, "%s\n", pkgname->name); - // fprintf(f, "%d\n", nimport); - // for(int i = 0; i < nimport; ++i){ - // fprintf(f, "%d %s %s\n", i, imports[i].path->name, imports[i].sym->name); - // } - - wr4(f, ninst); + wr4(f, nimport); + for(int i = 0; i < nimport; ++i){ + char buf[1024]; + sprintf(buf, "%s/obj", imports[i].path->name); + int len = strlen(buf); + wr4(f, len); + fwrite(buf, 1, len, f); + } + wr4(f, ninst); disinst(f, firstinst); fclose(f); } \ No newline at end of file diff --git a/parse.c b/parse.c index 0779bce..c60f6e5 100644 --- a/parse.c +++ b/parse.c @@ -827,7 +827,6 @@ imret(int n) if(n == 0) return tnone; if(n == 1){ - want((int[]){Lconst,0}); want((int[]){Lconst,0}); return imtype(); } diff --git a/test/fib/exported b/test/fib/exported new file mode 100644 index 0000000..2d96508 --- /dev/null +++ b/test/fib/exported @@ -0,0 +1,7 @@ +fib +fn .fib 160 0 1 1 + 0 + int 1 8 56 + 8 + int 1 8 0 + diff --git a/test/fib/fib.yo b/test/fib/fib.yo new file mode 100644 index 0000000..7f08d56 --- /dev/null +++ b/test/fib/fib.yo @@ -0,0 +1,8 @@ +package fib + +export fn fib(n int) int { + if n <= 1 { + return n; + }; + return fib(n-1) + fib(n-2); +}; diff --git a/test/fib/obj b/test/fib/obj new file mode 100644 index 0000000000000000000000000000000000000000..45725b4bf65b836499e124ab95e70abb500e1d01 GIT binary patch literal 152 zcmZQzU|`?_Vi8Y9AZY=_5kM^J1th>M79h>f3ldiVVs>d}!399t1BiL1f4ZPEC_J-LiEGz0RZ|T3XcE) literal 0 HcmV?d00001 diff --git a/test/main.yo b/test/main.yo new file mode 100644 index 0000000..af90e74 --- /dev/null +++ b/test/main.yo @@ -0,0 +1,10 @@ +package main + +import "./test/fib" +import "./test/nqueen" + +fn main() int { + f := fib.fib(10); + n := nqueen.solve(8); + return f + n; +}; diff --git a/test/nqueen/exported b/test/nqueen/exported new file mode 100644 index 0000000..81681b8 --- /dev/null +++ b/test/nqueen/exported @@ -0,0 +1,7 @@ +nqueen +fn .solve 296 0 1 1 + 0 + int 1 8 56 + 8 + int 1 8 0 + diff --git a/test/fib.yo b/test/nqueen/nqueen.yo similarity index 57% rename from test/fib.yo rename to test/nqueen/nqueen.yo index 0a42718..33e6e7c 100644 --- a/test/fib.yo +++ b/test/nqueen/nqueen.yo @@ -1,27 +1,15 @@ -package main +package nqueen -type Any struct { - x,y int; - arr [8]int; +export fn solve(n int) int { + arr := [16]int{}; + return nqueen(0, 0, arr[:n]); }; -fn main() int { - arr := [8]int{}; - return nqueen(0, 0, arr[:]); -}; - -fn fib(n int) int{ - if n <= 1 { - return n; - }; - return fib(n-1) + fib(n-2); -}; - -fn nqueen(r,ans int, arr []int) int{ +fn nqueen(r,ans int, arr []int) int { if r == len(arr) { return ans + 1; }; - for c:=0; c < len(arr); c=c+1{ + for c:=0; c < len(arr); c=c+1 { arr[r] = c; if canput(r, arr) { ans = nqueen(r+1, ans, arr); diff --git a/test/nqueen/obj b/test/nqueen/obj new file mode 100644 index 0000000000000000000000000000000000000000..f0cd5ef6220a8f0c09ba0af8a27b744812ef44f7 GIT binary patch literal 840 zcmZ{iF;BxV5QSaZDs58Bb)+uM;sGH#uy?eC5Geu#8)HYtj*J+=5lw2DcY_WFDdR4ouFG?*bT(2! zZq9x;oR5t{&3rT?CUW#Q899;6^Ax)p&U08j8$ivi*I-|>N75eBE=V^}-+#bvp~-s_ zwM7@HRX?k7_qL6#K;49R%WNEBNp3+)X~Y^NHSl0_mHwLnloUGAHF!8*z`7YH9H6A|E4<{tDDl=D Xq$RY>{NmxvTKmr+BGK0a_1&P&+ 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 FKLC}a80-K5 literal 0 HcmV?d00001 diff --git a/vm/vm.c b/vm/vm.c index b196712..a7d21a0 100644 --- a/vm/vm.c +++ b/vm/vm.c @@ -5,6 +5,10 @@ u32 ninst; Inst *inst; REG R; +Inst **modules; +u32 *modsizes; +int nmodules; + #define OP(fn) void fn(void) #define B(r) *((i8*)(R.r)) #define F(r) ((WORD*)(R.r)) @@ -112,6 +116,18 @@ OP(call){ R.FP = (u8*)f; JMP(d); } +OP(pcall){ + Frame *f; + int mod, pc; + + f = T(s); + f->lr = R.PC; + f->fp = R.FP; + R.FP = (u8*)f; + mod = W(m); + pc = W(d); + R.PC = &modules[mod][pc]; +} OP(ret) { Frame *f = (Frame*)R.FP; R.FP = f->fp; @@ -165,6 +181,7 @@ static void (*optab[])(void) = { [ILEA] = lea, [IFRAME] = frame, [ICALL] = call, + [PCALL] = pcall, [IJMP] = jmp, [IRET] = ret, [ILEN] = len, @@ -204,15 +221,15 @@ xec(void) } void -bpatch(Inst *i) +bpatch(Inst *i, Inst *base, u32 n) { static int tab[IEND] = { [ICALL]=1,[IBEQW]=1,[IBNEQW]=1,[IJMP]=1, }; if(tab[i->op] == 0) return; - assert(i->d.imm >= 0 && i->d.imm < ninst); - i->d.imm = (WORD)&inst[i->d.imm]; + assert(i->d.imm >= 0 && i->d.imm < n); + i->d.imm = (WORD)&base[i->d.imm]; return; } @@ -243,12 +260,11 @@ rdinst(FILE *f, Inst *in) } switch(UXDST(in->add)) { case DST(AFP): - case DST(AMP): + case DST(AMP): in->d.ind = rd4(f); break; case DST(AIMM): in->d.ind = rd4(f); - bpatch(in); break; case DST(AIND|AFP): case DST(AIND|AMP): @@ -258,18 +274,53 @@ rdinst(FILE *f, Inst *in) } } +Inst* +loadmod(char *fname, u32 *outn) +{ + FILE *f = fopen(fname, "r"); + assert(f != 0); + u32 nim = rd4(f); + for(u32 i = 0; i < nim; i++){ + u32 len = rd4(f); + fseek(f, len, SEEK_CUR); + } + u32 n = rd4(f); + Inst *ins = calloc(sizeof(Inst), n); + for(u32 i = 0; i < n; i++) + rdinst(f, ins+i); + for(u32 i = 0; i < n; i++) + bpatch(ins+i, ins, n); + fclose(f); + *outn = n; + return ins; +} + void load(char *fname) { FILE *f = fopen(fname, "r"); - assert(f != 0); + assert(f != 0); initprog(1024); + + nmodules = rd4(f); + if(nmodules > 0){ + modules = calloc(sizeof(Inst*), nmodules); + modsizes = calloc(sizeof(u32), nmodules); + for(int i = 0; i < nmodules; i++){ + u32 len = rd4(f); + char *path = calloc(1, len+1); + fread(path, 1, len, f); + modules[i] = loadmod(path, &modsizes[i]); + free(path); + } + } + ninst = rd4(f); inst = calloc(sizeof(Inst), ninst); - - for(u32 i = 0; i < ninst; ++i){ - rdinst(f, inst+i); - } + for(u32 i = 0; i < ninst; i++) + rdinst(f, inst+i); + for(u32 i = 0; i < ninst; i++) + bpatch(inst+i, inst, ninst); R.PC = inst; fclose(f); }