stage2 支持左值的引用绑定

This commit is contained in:
zzy committed 2026-09-29 23:00:24 +08:00
1 parent 40cffa9cb5
commit 0e38858785
4 files changed
+200 -198

No files matched your search

+29 -27
View File
@@ -572,33 +572,34 @@ fn encode(self: *Prog, out: *ByteBuffer): Status {
// 精确预估输出大小并一次性预留,避免大文件逐字节增长导致的重复拷贝。
var total: usize = 48;
var fi: usize = 0;
var func_base = self.funcs.data as *VmFunc;
var nat_base = self.natives.data as *VmNative;
var str_base = self.strtab.data as *ByteView;
var gd_base = self.gdata.data as *ByteBuffer;
while fi < self.funcs.len {
var f = func_at(self, fi);
if f != null {
var nlen = f.name.len + 1;
total = total + 8 + align8(nlen) + 32;
}
var f = func_base + fi;
var nlen = f.name.len + 1;
total = total + 8 + align8(nlen) + 32;
fi = fi + 1;
}
total = total + self.insns.len * 12;
fi = 0;
while fi < self.natives.len {
var n = native_at(self, fi);
if n != null {
var nlen = n.name.len + 1;
total = total + 8 + align8(nlen) + 8;
}
var n = nat_base + fi;
var nlen = n.name.len + 1;
total = total + 8 + align8(nlen) + 8;
fi = fi + 1;
}
fi = 0;
while fi < self.strtab.len {
total = total + 8 + align8(str_at(self, fi).len);
var s = str_base + fi;
total = total + 8 + align8(s.len);
fi = fi + 1;
}
fi = 1;
while fi < self.gdata.len {
var e = gdata_at(self, fi);
if e != null { total = total + 8 + align8(e.storage.len); }
var e = gd_base + fi;
total = total + 8 + align8(e.storage.len);
fi = fi + 1;
}
match ByteBuffer.reserve(out, total) { .Ok => {}, .Err(error) => {} }
@@ -622,8 +623,7 @@ fn encode(self: *Prog, out: *ByteBuffer): Status {
var i: usize = 0;
while i < nfuncs {
var f = func_at(self, i);
if f == null { ret .Err(make(.Io)); }
var f = func_base + i;
if !put_name_field(out, f.name) { ret .Err(make(.Io)); }
if !put_u64(out, f.idx_of_strtab) { ret .Err(make(.Io)); }
if !put_u64(out, f.nargs) { ret .Err(make(.Io)); }
@@ -633,20 +633,23 @@ fn encode(self: *Prog, out: *ByteBuffer): Status {
}
i = 0;
var ins_base = self.insns.data as *VmIns;
var out_base = out.storage.data;
var out_len = out.storage.len;
while i < ninsns {
var ins = ins_at(self, i);
var d = out.storage.data + out.storage.len;
(d as *u16).* = @enum2int(ins.opcode) as u16;
((d + 2) as *u16).* = @enum2int(ins.ty) as u16;
((d + 4) as *u64).* = ins.imm as u64;
out.storage.len = out.storage.len + 12;
var p = ins_base + i;
var d = out_base + out_len;
(d as *u16).* = @enum2int(p.opcode) as u16;
((d + 2) as *u16).* = @enum2int(p.ty) as u16;
((d + 4) as *u64).* = p.imm as u64;
out_len = out_len + 12;
i = i + 1;
}
out.storage.len = out_len;
i = 0;
while i < nnatives {
var n = native_at(self, i);
if n == null { ret .Err(make(.Io)); }
var n = nat_base + i;
if !put_name_field(out, n.name) { ret .Err(make(.Io)); }
if !put_u64(out, n.idx_of_strtab) { ret .Err(make(.Io)); }
i = i + 1;
@@ -654,17 +657,16 @@ fn encode(self: *Prog, out: *ByteBuffer): Status {
i = 0;
while i < nstrs {
var s = str_at(self, i);
var s = str_base + i;
if !put_u64(out, s.len) { ret .Err(make(.Io)); }
if !put_view(out, s) { ret .Err(make(.Io)); }
if !put_view(out, s.*) { ret .Err(make(.Io)); }
if !put_zeros(out, align8(s.len) - s.len) { ret .Err(make(.Io)); }
i = i + 1;
}
i = 1;
while i < self.gdata.len {
var e = gdata_at(self, i);
if e == null { ret .Err(make(.Io)); }
var e = gd_base + i;
var dsize = e.storage.len;
if !put_u64(out, dsize) { ret .Err(make(.Io)); }
if !put_view(out, ByteView.from_slice(ByteBuffer.as_slice(e.*))) { ret .Err(make(.Io)); }