Skip to content

Commit ef5af10

Browse files
authored
Merge pull request #174 from natecraddock/push-qzmroqnylnlv
fix: Transition from `ArrayList` to `ArrayListUnmanaged`
2 parents 6889b2d + dc2921c commit ef5af10

File tree

2 files changed

+70
-66
lines changed

2 files changed

+70
-66
lines changed

src/define.zig

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
11
const std = @import("std");
2+
const ArrayList = std.ArrayListUnmanaged; // this should be deleted when zig 0.14 support is no longer necessary
3+
const StringHashMap = std.StringHashMapUnmanaged; // this should be deleted when zig 0.14 support is no longer necessary
24

3-
const String = std.ArrayList(u8);
4-
const Database = std.StringHashMap(void);
5+
const String = ArrayList(u8);
6+
const Database = StringHashMap(void);
57

68
pub const DefineState = struct {
7-
allocator: std.mem.Allocator,
89
database: Database,
9-
definitions: std.ArrayList(String),
10-
11-
pub fn init(alloc: std.mem.Allocator) DefineState {
12-
return DefineState{
13-
.allocator = alloc,
14-
.database = .init(alloc),
15-
.definitions = .init(alloc),
16-
};
17-
}
10+
definitions: ArrayList(String),
11+
12+
pub const empty: DefineState = .{
13+
.database = .empty,
14+
.definitions = .empty,
15+
};
1816

19-
pub fn deinit(self: *@This()) void {
20-
for (self.definitions.items) |def| {
21-
def.deinit();
17+
pub fn deinit(self: *DefineState, gpa: std.mem.Allocator) void {
18+
for (self.definitions.items) |*def| {
19+
def.deinit(gpa);
2220
}
23-
defer self.database.deinit();
24-
defer self.definitions.deinit();
21+
self.database.deinit(gpa);
22+
self.definitions.deinit(gpa);
23+
self.* = undefined;
2524
}
2625
};
2726

2827
pub fn define(
29-
alloc: std.mem.Allocator,
28+
gpa: std.mem.Allocator,
3029
absolute_output_path: []const u8,
3130
comptime to_define: []const type,
3231
) !void {
33-
var state: DefineState = .init(alloc);
34-
defer state.deinit();
32+
var state: DefineState = .empty;
33+
defer state.deinit(gpa);
3534

3635
inline for (to_define) |T| {
3736
_ = try addClass(&state, T);
@@ -66,100 +65,104 @@ fn name(comptime T: type) []const u8 {
6665

6766
fn addEnum(
6867
state: *DefineState,
68+
gpa: std.mem.Allocator,
6969
comptime T: type,
7070
) !void {
7171
if (state.database.contains(@typeName(T)) == false) {
72-
try state.database.put(@typeName(T), {});
73-
try state.definitions.append(String.init(state.allocator));
74-
const index = state.definitions.items.len - 1;
72+
try state.database.put(gpa, @typeName(T), {});
73+
const item = try state.definitions.addOne(gpa);
74+
item.* = .empty;
7575

76-
try state.definitions.items[index].appendSlice("---@alias ");
77-
try state.definitions.items[index].appendSlice(name(T));
78-
try state.definitions.items[index].appendSlice("\n");
76+
try item.appendSlice(gpa, "---@alias ");
77+
try item.appendSlice(gpa, name(T));
78+
try item.appendSlice(gpa, "\n");
7979

8080
inline for (@typeInfo(T).@"enum".fields) |field| {
81-
try state.definitions.items[index].appendSlice("---|\' \"");
82-
try state.definitions.items[index].appendSlice(field.name);
83-
try state.definitions.items[index].appendSlice("\" \'\n");
81+
try item.appendSlice(gpa, "---|\' \"");
82+
try item.appendSlice(gpa, field.name);
83+
try item.appendSlice(gpa, "\" \'\n");
8484
}
8585
}
8686
}
8787

8888
pub fn addClass(
8989
state: *DefineState,
90+
gpa: std.mem.Allocator,
9091
comptime T: type,
9192
) !void {
9293
if (state.database.contains(@typeName(T)) == false) {
93-
try state.database.put(@typeName(T), {});
94-
try state.definitions.append(String.init(state.allocator));
95-
const index = state.definitions.items.len - 1;
94+
try state.database.put(gpa, @typeName(T), {});
95+
const item = try state.definitions.addOne(gpa);
96+
const idx = state.definitions.items.len - 1;
97+
item.* = .empty;
9698

97-
try state.definitions.items[index].appendSlice("---@class (exact) ");
98-
try state.definitions.items[index].appendSlice(name(T));
99-
try state.definitions.items[index].appendSlice("\n");
99+
try item.appendSlice(gpa, "---@class (exact) ");
100+
try item.appendSlice(gpa, name(T));
101+
try item.appendSlice(gpa, "\n");
100102

101103
inline for (@typeInfo(T).@"struct".fields) |field| {
102-
try state.definitions.items[index].appendSlice("---@field ");
103-
try state.definitions.items[index].appendSlice(field.name);
104+
try item.appendSlice(gpa, "---@field ");
105+
try item.appendSlice(gpa, field.name);
104106

105107
if (field.defaultValue() != null) {
106-
try state.definitions.items[index].appendSlice("?");
108+
try item.appendSlice(gpa, "?");
107109
}
108-
try state.definitions.items[index].appendSlice(" ");
109-
try luaTypeName(state, index, field.type);
110-
try state.definitions.items[index].appendSlice("\n");
110+
try item.appendSlice(gpa, " ");
111+
try luaTypeName(state, gpa, idx, field.type);
112+
try state.definitions.items[idx].appendSlice(gpa, "\n");
111113
}
112114
}
113115
}
114116

115117
fn luaTypeName(
116118
state: *DefineState,
119+
gpa: std.mem.Allocator,
117120
index: usize,
118121
comptime T: type,
119122
) !void {
120123
switch (@typeInfo(T)) {
121124
.@"struct" => {
122-
try state.definitions.items[index].appendSlice(name(T));
123-
try addClass(state, T);
125+
try state.definitions.items[index].appendSlice(gpa, name(T));
126+
try addClass(state, gpa, T);
124127
},
125128
.pointer => |info| {
126129
if (info.child == u8 and info.size == .slice) {
127-
try state.definitions.items[index].appendSlice("string");
130+
try state.definitions.items[index].appendSlice(gpa, "string");
128131
} else switch (info.size) {
129132
.one => {
130-
try state.definitions.items[index].appendSlice("lightuserdata");
133+
try state.definitions.items[index].appendSlice(gpa, "lightuserdata");
131134
},
132135
.c, .many, .slice => {
133-
try luaTypeName(state, index, info.child);
134-
try state.definitions.items[index].appendSlice("[]");
136+
try luaTypeName(state, gpa, index, info.child);
137+
try state.definitions.items[index].appendSlice(gpa, "[]");
135138
},
136139
}
137140
},
138141
.array => |info| {
139-
try luaTypeName(state, index, info.child);
140-
try state.definitions.items[index].appendSlice("[]");
142+
try luaTypeName(state, gpa, index, info.child);
143+
try state.definitions.items[index].appendSlice(gpa, "[]");
141144
},
142145

143146
.vector => |info| {
144-
try luaTypeName(state, index, info.child);
145-
try state.definitions.items[index].appendSlice("[]");
147+
try luaTypeName(state, gpa, index, info.child);
148+
try state.definitions.items[index].appendSlice(gpa, "[]");
146149
},
147150
.optional => |info| {
148-
try luaTypeName(state, index, info.child);
149-
try state.definitions.items[index].appendSlice(" | nil");
151+
try luaTypeName(state, gpa, index, info.child);
152+
try state.definitions.items[index].appendSlice(gpa, " | nil");
150153
},
151154
.@"enum" => {
152-
try state.definitions.items[index].appendSlice(name(T));
153-
try addEnum(state, T);
155+
try state.definitions.items[index].appendSlice(gpa, name(T));
156+
try addEnum(state, gpa, T);
154157
},
155158
.int => {
156-
try state.definitions.items[index].appendSlice("integer");
159+
try state.definitions.items[index].appendSlice(gpa, "integer");
157160
},
158161
.float => {
159-
try state.definitions.items[index].appendSlice("number");
162+
try state.definitions.items[index].appendSlice(gpa, "number");
160163
},
161164
.bool => {
162-
try state.definitions.items[index].appendSlice("boolean");
165+
try state.definitions.items[index].appendSlice(gpa, "boolean");
163166
},
164167
else => {
165168
@compileLog(T);

src/tests.zig

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const std = @import("std");
22
const testing = std.testing;
3+
const ArrayList = std.ArrayListUnmanaged; // delete this once 0.14 support is no longer necessary
34

45
const zlua = @import("zlua");
56

@@ -874,14 +875,14 @@ test "dump and load" {
874875
const writer = struct {
875876
fn inner(l: *Lua, buf: []const u8, data: *anyopaque) bool {
876877
_ = l;
877-
var arr: *std.ArrayList(u8) = @ptrCast(@alignCast(data));
878-
arr.appendSlice(buf) catch return false;
878+
var arr: *ArrayList(u8) = @ptrCast(@alignCast(data));
879+
arr.appendSlice(std.testing.allocator, buf) catch return false;
879880
return true;
880881
}
881882
}.inner;
882883

883-
var buffer: std.ArrayList(u8) = .init(testing.allocator);
884-
defer buffer.deinit();
884+
var buffer: ArrayList(u8) = .empty;
885+
defer buffer.deinit(std.testing.allocator);
885886

886887
// save the function as a binary chunk in the buffer
887888
if (zlua.lang == .lua53 or zlua.lang == .lua54) {
@@ -898,7 +899,7 @@ test "dump and load" {
898899
const reader = struct {
899900
fn inner(l: *Lua, data: *anyopaque) ?[]const u8 {
900901
_ = l;
901-
const arr: *std.ArrayList(u8) = @ptrCast(@alignCast(data));
902+
const arr: *ArrayList(u8) = @ptrCast(@alignCast(data));
902903
return arr.items;
903904
}
904905
}.inner;
@@ -2978,12 +2979,12 @@ test "define" {
29782979

29792980
const a = std.testing.allocator;
29802981

2981-
var state = zlua.def.DefineState.init(a);
2982-
defer state.deinit();
2982+
var state: zlua.def.DefineState = .empty;
2983+
defer state.deinit(a);
29832984

29842985
const to_define: []const type = &.{ T, TestType, Foo };
29852986
inline for (to_define) |my_type| {
2986-
_ = try zlua.def.addClass(&state, my_type);
2987+
_ = try zlua.def.addClass(&state, a, my_type);
29872988
}
29882989

29892990
var buffer: [10000]u8 = .{0} ** 10000;

0 commit comments

Comments
 (0)