stage2 支持左值的引用绑定
This commit is contained in:
1 parent
40cffa9cb5
commit
0e38858785
4 files changed
+200
-198
No files matched your search
+29
-27
@@ -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)); }
|
||||
|
||||
Reference in new issue
Block a user