| ... | ... | @@ -9,6 +9,31 @@ pub fn writeSetSub6(comptime op: enum { set, sub }, code: *[1]u8, addend: anytyp |
| 9 | 9 | mem.writeInt(u8, code, value, .little); |
| 10 | 10 | } |
| 11 | 11 | |
| 12 | pub fn writeSetSubUleb(comptime op: enum { set, sub }, stream: *std.io.FixedBufferStream([]u8), addend: i64) !void { |
| 13 | switch (op) { |
| 14 | .set => try overwriteUleb(stream, @intCast(addend)), |
| 15 | .sub => { |
| 16 | const position = try stream.getPos(); |
| 17 | const value: u64 = try std.leb.readUleb128(u64, stream.reader()); |
| 18 | try stream.seekTo(position); |
| 19 | try overwriteUleb(stream, value -% @as(u64, @intCast(addend))); |
| 20 | }, |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | fn overwriteUleb(stream: *std.io.FixedBufferStream([]u8), addend: u64) !void { |
| 25 | var value: u64 = addend; |
| 26 | const writer = stream.writer(); |
| 27 | |
| 28 | while (true) { |
| 29 | const byte = stream.buffer[stream.pos]; |
| 30 | if (byte & 0x80 == 0) break; |
| 31 | try writer.writeByte(0x80 | @as(u8, @truncate(value & 0x7f))); |
| 32 | value >>= 7; |
| 33 | } |
| 34 | stream.buffer[stream.pos] = @truncate(value & 0x7f); |
| 35 | } |
| 36 | |
| 12 | 37 | pub fn writeAddend( |
| 13 | 38 | comptime Int: type, |
| 14 | 39 | comptime op: enum { add, sub }, |