diff --git a/src/Class.zig b/src/Class.zig index 198ff72..2f09ba7 100644 --- a/src/Class.zig +++ b/src/Class.zig @@ -361,11 +361,92 @@ pub const ConstantPoolInfo = union(ConstantPoolInfo.Tag) { invoke_dynamic = 18, }; - pub const Class = @import("Class/ConstantPoolInfo/Class.zig"); - pub const FieldRef = @import("Class/ConstantPoolInfo/FieldRef.zig"); - pub const MethodRef = @import("Class/ConstantPoolInfo/MethodRef.zig"); - pub const InterfaceMethodRef = @import("Class/ConstantPoolInfo/InterfaceMethodRef.zig"); - pub const String = @import("Class/ConstantPoolInfo/String.zig"); + pub const Class = struct { + name_index: u16, + + pub fn name(self: *const Class, 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(Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; + + pub const FieldRef = struct { + class_index: u16, + name_and_type_index: u16, + + pub fn class(self: *const FieldRef, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const class_index = self.class_index - 1; + if (class_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[class_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .class) return ResolveError.InvalidConstantType; + return cp_info.?; + } + + pub fn nameAndType(self: *const FieldRef, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const name_and_type_index = self.name_and_type_index - 1; + if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[name_and_type_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; + + pub const MethodRef = struct { + class_index: u16, + name_and_type_index: u16, + + pub fn class(self: *const MethodRef, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const class_index = self.class_index - 1; + if (class_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[class_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .class) return ResolveError.InvalidConstantType; + return cp_info.?; + } + + pub fn nameAndType(self: *const MethodRef, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const name_and_type_index = self.name_and_type_index - 1; + if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[name_and_type_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; + + pub const InterfaceMethodRef = struct { + class_index: u16, + name_and_type_index: u16, + + pub fn class(self: *const InterfaceMethodRef, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const class_index = self.class_index - 1; + if (class_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[class_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .class) return ResolveError.InvalidConstantType; + return cp_info.?; + } + + pub fn nameAndType(self: *const InterfaceMethodRef, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const name_and_type_index = self.name_and_type_index - 1; + if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[name_and_type_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; + + pub const String = struct { + string_index: u16, + + pub fn string(self: *const String, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const string_index = self.string_index - 1; + if (string_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[string_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; pub const Integer = struct { bytes: u32, @@ -385,15 +466,92 @@ pub const ConstantPoolInfo = union(ConstantPoolInfo.Tag) { low_bytes: u32, }; - pub const NameAndType = @import("Class/ConstantPoolInfo/NameAndType.zig"); + pub const NameAndType = struct { + name_index: u16, + descriptor_index: u16, + + pub fn name(self: *const NameAndType, 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(Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; + return cp_info.?; + } + + pub fn descriptor(self: *const NameAndType, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const descriptor_index = self.descriptor_index - 1; + if (descriptor_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[descriptor_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; pub const Utf8 = struct { bytes: []const u8, }; - pub const MethodHandle = @import("Class/ConstantPoolInfo/MethodHandle.zig"); - pub const MethodType = @import("Class/ConstantPoolInfo/MethodType.zig"); - pub const InvokeDynamic = @import("Class/ConstantPoolInfo/InvokeDynamic.zig"); + pub const MethodHandle = struct { + reference_kind: Kind, + reference_index: u16, + + pub const Kind = enum(u8) { + get_field = 1, + get_static = 2, + put_field = 3, + put_static = 4, + invoke_virtual = 5, + invoke_static = 6, + invoke_special = 7, + new_invoke_special = 8, + invoke_interface = 9, + }; + + pub fn reference(self: *const MethodHandle, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const reference_index = self.reference_index - 1; + if (reference_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[reference_index]; + return switch (self.reference_kind) { + .get_field, .get_static, .put_field, .put_static => blk: { + if (cp_info == null or @as(Tag, cp_info.?) != .field_ref) break :blk ResolveError.InvalidConstantType; + break :blk cp_info.?; + }, + .invoke_virtual, .invoke_static, .invoke_special, .new_invoke_special => blk: { + if (cp_info == null or @as(Tag, cp_info.?) != .method_ref) break :blk ResolveError.InvalidConstantType; + break :blk cp_info.?; + }, + .invoke_interface => blk: { + if (cp_info == null or @as(Tag, cp_info.?) != .interface_method_ref) break :blk ResolveError.InvalidConstantType; + break :blk cp_info.?; + }, + }; + } + }; + + pub const MethodType = struct { + descriptor_index: u16, + + pub fn descriptor(self: *const MethodType, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const descriptor_index = self.descriptor_index - 1; + if (descriptor_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[descriptor_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; + + pub const InvokeDynamic = struct { + bootstrap_method_attr_index: u16, + name_and_type_index: u16, + + pub fn nameAndType(self: *const InvokeDynamic, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { + const name_and_type_index = self.name_and_type_index - 1; + if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; + const cp_info = constant_pool[name_and_type_index]; + if (cp_info == null or @as(Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; + return cp_info.?; + } + }; pub fn parse(input: *std.Io.Reader, allocator: std.mem.Allocator) ParseError!ConstantPoolInfo { const tag_byte = try input.takeByte(); diff --git a/src/Class/AttributeInfo.zig b/src/Class/AttributeInfo.zig index 66c750c..a3276da 100644 --- a/src/Class/AttributeInfo.zig +++ b/src/Class/AttributeInfo.zig @@ -219,13 +219,13 @@ pub const Predefined = union(enum) { .object = .{ .cpool_index = try input.takeInt(u16, .big), }, - }, + }, .uninitialized => .{ .uninitialized = .{ .cpool_index = try input.takeInt(u16, .big), }, - }, - }; + }, + }; } }; }; diff --git a/src/Class/ConstantPoolInfo/Class.zig b/src/Class/ConstantPoolInfo/Class.zig deleted file mode 100644 index e22266b..0000000 --- a/src/Class/ConstantPoolInfo/Class.zig +++ /dev/null @@ -1,16 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -name_index: u16, - -const Self = @This(); - -pub fn name(self: *const Self, 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.?; -} - diff --git a/src/Class/ConstantPoolInfo/FieldRef.zig b/src/Class/ConstantPoolInfo/FieldRef.zig deleted file mode 100644 index 7f5da75..0000000 --- a/src/Class/ConstantPoolInfo/FieldRef.zig +++ /dev/null @@ -1,25 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -class_index: u16, -name_and_type_index: u16, - -const Self = @This(); - -pub fn class(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const class_index = self.class_index - 1; - if (class_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[class_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .class) return ResolveError.InvalidConstantType; - return cp_info.?; -} - -pub fn nameAndType(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const name_and_type_index = self.name_and_type_index - 1; - if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[name_and_type_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; - return cp_info.?; -} - diff --git a/src/Class/ConstantPoolInfo/InterfaceMethodRef.zig b/src/Class/ConstantPoolInfo/InterfaceMethodRef.zig deleted file mode 100644 index 7f5da75..0000000 --- a/src/Class/ConstantPoolInfo/InterfaceMethodRef.zig +++ /dev/null @@ -1,25 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -class_index: u16, -name_and_type_index: u16, - -const Self = @This(); - -pub fn class(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const class_index = self.class_index - 1; - if (class_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[class_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .class) return ResolveError.InvalidConstantType; - return cp_info.?; -} - -pub fn nameAndType(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const name_and_type_index = self.name_and_type_index - 1; - if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[name_and_type_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; - return cp_info.?; -} - diff --git a/src/Class/ConstantPoolInfo/InvokeDynamic.zig b/src/Class/ConstantPoolInfo/InvokeDynamic.zig deleted file mode 100644 index eb3970c..0000000 --- a/src/Class/ConstantPoolInfo/InvokeDynamic.zig +++ /dev/null @@ -1,16 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -bootstrap_method_attr_index: u16, -name_and_type_index: u16, - -const Self = @This(); - -pub fn nameAndType(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const name_and_type_index = self.name_and_type_index - 1; - if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[name_and_type_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; - return cp_info.?; -} diff --git a/src/Class/ConstantPoolInfo/MethodHandle.zig b/src/Class/ConstantPoolInfo/MethodHandle.zig deleted file mode 100644 index b7fab85..0000000 --- a/src/Class/ConstantPoolInfo/MethodHandle.zig +++ /dev/null @@ -1,41 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -reference_kind: Kind, -reference_index: u16, - -const Self = @This(); - -pub const Kind = enum(u8) { - get_field = 1, - get_static = 2, - put_field = 3, - put_static = 4, - invoke_virtual = 5, - invoke_static = 6, - invoke_special = 7, - new_invoke_special = 8, - invoke_interface = 9, -}; - -pub fn reference(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const reference_index = self.reference_index - 1; - if (reference_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[reference_index]; - return switch (self.reference_kind) { - .get_field, .get_static, .put_field, .put_static => blk: { - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .field_ref) break :blk ResolveError.InvalidConstantType; - break :blk cp_info.?; - }, - .invoke_virtual, .invoke_static, .invoke_special, .new_invoke_special => blk: { - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .method_ref) break :blk ResolveError.InvalidConstantType; - break :blk cp_info.?; - }, - .invoke_interface => blk: { - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .interface_method_ref) break :blk ResolveError.InvalidConstantType; - break :blk cp_info.?; - }, - }; -} - diff --git a/src/Class/ConstantPoolInfo/MethodRef.zig b/src/Class/ConstantPoolInfo/MethodRef.zig deleted file mode 100644 index 7f5da75..0000000 --- a/src/Class/ConstantPoolInfo/MethodRef.zig +++ /dev/null @@ -1,25 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -class_index: u16, -name_and_type_index: u16, - -const Self = @This(); - -pub fn class(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const class_index = self.class_index - 1; - if (class_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[class_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .class) return ResolveError.InvalidConstantType; - return cp_info.?; -} - -pub fn nameAndType(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const name_and_type_index = self.name_and_type_index - 1; - if (name_and_type_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[name_and_type_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .name_and_type) return ResolveError.InvalidConstantType; - return cp_info.?; -} - diff --git a/src/Class/ConstantPoolInfo/MethodType.zig b/src/Class/ConstantPoolInfo/MethodType.zig deleted file mode 100644 index de6a423..0000000 --- a/src/Class/ConstantPoolInfo/MethodType.zig +++ /dev/null @@ -1,16 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -descriptor_index: u16, - -const Self = @This(); - -pub fn descriptor(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const descriptor_index = self.descriptor_index - 1; - if (descriptor_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[descriptor_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; - return cp_info.?; -} - diff --git a/src/Class/ConstantPoolInfo/NameAndType.zig b/src/Class/ConstantPoolInfo/NameAndType.zig deleted file mode 100644 index 7423065..0000000 --- a/src/Class/ConstantPoolInfo/NameAndType.zig +++ /dev/null @@ -1,25 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -name_index: u16, -descriptor_index: u16, - -const Self = @This(); - -pub fn name(self: *const Self, 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 descriptor(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const descriptor_index = self.descriptor_index - 1; - if (descriptor_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[descriptor_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; - return cp_info.?; -} - diff --git a/src/Class/ConstantPoolInfo/String.zig b/src/Class/ConstantPoolInfo/String.zig deleted file mode 100644 index 0e096aa..0000000 --- a/src/Class/ConstantPoolInfo/String.zig +++ /dev/null @@ -1,16 +0,0 @@ -const Class = @import("../../Class.zig"); -const ConstantPoolInfo = Class.ConstantPoolInfo; -const ResolveError = Class.ResolveError; - -string_index: u16, - -const Self = @This(); - -pub fn string(self: *const Self, constant_pool: []const ?ConstantPoolInfo) ResolveError!ConstantPoolInfo { - const string_index = self.string_index - 1; - if (string_index >= constant_pool.len) return ResolveError.InvalidConstantPoolIndex; - const cp_info = constant_pool[string_index]; - if (cp_info == null or @as(ConstantPoolInfo.Tag, cp_info.?) != .utf8) return ResolveError.InvalidConstantType; - return cp_info.?; -} -