From a8c87dc4210f2256425900b4aad58255474ebe5a Mon Sep 17 00:00:00 2001 From: ktkk Date: Sun, 5 Jul 2026 20:29:06 +0200 Subject: [PATCH] Format local variable type table attribute --- src/Class/AttributeInfo.zig | 55 ++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/Class/AttributeInfo.zig b/src/Class/AttributeInfo.zig index 3403136..300d02d 100644 --- a/src/Class/AttributeInfo.zig +++ b/src/Class/AttributeInfo.zig @@ -425,7 +425,20 @@ pub const AttributeInfo = union(enum) { try local_variable.indentedFormat(w, depth, local_variable_indent + 1, constant_pool); } }, - //.local_variable_type_table, + .local_variable_type_table => |attr| { + try w.splatByteAll(' ', depth * indent); + _ = try w.write("local_variable_type_table:\n"); + var local_variable_type_indent = indent; + for (attr.local_variable_type_table, 0..) |*local_variable_type, i| { + local_variable_type_indent += 1; + defer local_variable_type_indent -= 1; + + try w.splatByteAll(' ', depth * local_variable_type_indent); + try w.print("{d}:\n", .{ i }); + + try local_variable_type.indentedFormat(w, depth, local_variable_type_indent + 1, constant_pool); + } + }, .deprecated => {}, //.runtime_visible_annotations, //.runtime_invisible_annotations, @@ -1218,6 +1231,46 @@ pub const LocalVariableTypeTable = struct { name_index: u16, signature_index: u16, index: u16, + + pub fn indentedFormat( + self: *const LocalVariableType, + w: *std.Io.Writer, + depth: usize, + indent: u8, + constant_pool: []const ?ConstantPoolInfo, + ) std.Io.Writer.Error!void { + try w.splatByteAll(' ', depth * indent); + try w.print("start_pc: {d}\n", .{ self.start_pc }); + + try w.splatByteAll(' ', depth * indent); + try w.print("length: {d}\n", .{ self.length }); + + const name_ = self.name(constant_pool) catch return error.WriteFailed; + try w.splatByteAll(' ', depth * indent); + _ = try w.write("name:\n"); + try name_.indentedFormat(w, depth, indent + 1, constant_pool); + + const signature_ = self.signature(constant_pool) catch return error.WriteFailed; + try w.splatByteAll(' ', depth * indent); + _ = try w.write("signature:\n"); + try signature_.indentedFormat(w, depth, indent + 1, constant_pool); + } + + pub fn name(self: *const LocalVariableType, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const name_index = self.name_index - 1; + if (name_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[name_index]; + if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; + return cp_info.?; + } + + pub fn signature(self: *const LocalVariableType, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const signature_index = self.signature_index - 1; + if (signature_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[signature_index]; + if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; + return cp_info.?; + } }; pub fn parse(input: *std.Io.Reader, allocator: std.mem.Allocator) ParseError!Self {