@@ -96,57 +96,6 @@ pub fn main() !void {
9696 logger .err ("Error => '{s}'" , .{str });
9797 }
9898
99- {
100- logger .info ("Interpreter with a simple custom allocator..." , .{});
101-
102- const custom_mrb : [* c ]mruby.mrb_state = mruby .mrb_open_allocf (mrb_simple_allocf , null );
103- if (custom_mrb == null ) return error .mrb_open ;
104- defer _ = mruby .mrb_close (custom_mrb );
105-
106- _ = mruby .mrb_load_string (custom_mrb , "puts 'using a simple custom allocator!'" );
107- }
108-
109- {
110- logger .info ("Interpreter with a more complex custom allocator..." , .{});
111-
112- var gpa = std .heap .GeneralPurposeAllocator (.{
113- // .verbose_log = true,
114- .enable_memory_limit = true ,
115- }){};
116- gpa .setRequestedMemoryLimit (1024 * 700 ); // 700 KiB
117- defer if (gpa .deinit () == .leak ) @panic ("found memory leaks" );
118- const allocator = gpa .allocator ();
119-
120- // const allocator = std.heap.page_allocator;
121-
122- // Doesn't work, since fba is a bump pointer allocator
123- // var buffer: [1024 * 1000]u8 = undefined;
124- // var fba = std.heap.FixedBufferAllocator.init(&buffer);
125- // const allocator = fba.allocator();
126-
127- // var realloc_map = std.AutoHashMap(usize, usize).init(std.heap.page_allocator);
128- var realloc_map = std .AutoHashMap (usize , usize ).init (allocator );
129- defer realloc_map .deinit ();
130-
131- const user_data = UserData {
132- .allocator = & allocator ,
133- .realloc_map = & realloc_map ,
134- };
135-
136- const custom_mrb : [* c ]mruby.mrb_state = mruby .mrb_open_allocf (mrb_complex_allocf , @as (? * anyopaque , @ptrCast (@constCast (& user_data ))));
137- if (custom_mrb == null ) return error .mrb_open ;
138- defer _ = mruby .mrb_close (custom_mrb );
139-
140- logger .info ("loaded interpreter..." , .{});
141-
142- _ = mruby .mrb_load_string (custom_mrb , "puts 'using a more complex custom allocator!'" );
143- _ = mruby .mrb_load_string (custom_mrb , "$t = []; puts $t.inspect" );
144- _ = mruby .mrb_load_string (custom_mrb , "$t << :a; puts $t.inspect" );
145- _ = mruby .mrb_load_string (custom_mrb , "$t += [:a, :b, :c]; puts $t.inspect" );
146-
147- if (custom_mrb .* .exc != null ) mruby .mrb_print_error (custom_mrb );
148- }
149-
15099 logger .info ("Done" , .{});
151100}
152101
@@ -167,92 +116,6 @@ fn nil_method(mrb: [*c]mruby.mrb_state, self: mruby.mrb_value) callconv(.C) mrub
167116 return mruby .mrb_nil_value ();
168117}
169118
170- fn mrb_simple_allocf (mrb : [* c ]mruby.mrb_state , p : ? * anyopaque , size : usize , ud : ? * anyopaque ) callconv (.C ) ? * anyopaque {
171- _ = mrb ;
172- _ = ud ;
173-
174- if (size == 0 ) {
175- if (p ) | ptr | std .c .free (ptr );
176- return null ;
177- } else {
178- return std .c .realloc (p , size );
179- }
180- }
181-
182- const UserData = struct {
183- allocator : * const std.mem.Allocator ,
184- realloc_map : * std .AutoHashMap (usize , usize ),
185- };
186-
187- // NOTE: trying to pass a custom allocator here is difficult, because we have
188- // to keep track of previous allocation sizes like realloc does internally.
189- fn mrb_complex_allocf (mrb : [* c ]mruby.mrb_state , p : ? * anyopaque , size : usize , ud : ? * anyopaque ) callconv (.C ) ? * anyopaque {
190- _ = mrb ;
191-
192- const user_data = @as (* UserData , @ptrCast (@alignCast (ud ))).* ;
193- const allocator = user_data .allocator ;
194- var realloc_map = @constCast (user_data .realloc_map );
195-
196- std .log .debug ("-- realloc({x}, {d})" , .{ @intFromPtr (p ), size });
197-
198- if (size == 0 ) {
199- if (p ) | ptr | {
200- if (realloc_map .getEntry (@intFromPtr (ptr ))) | entry | {
201- std .log .debug (" freeing existing pointer {x}" , .{@intFromPtr (ptr )});
202-
203- const old_size = entry .value_ptr .* ;
204- const raw_ptr = entry .key_ptr .* ;
205- const slice = @as ([* ]u8 , @ptrFromInt (raw_ptr ))[0.. old_size ];
206-
207- allocator .free (slice );
208-
209- _ = realloc_map .remove (raw_ptr );
210-
211- return null ;
212- }
213- std .log .err (" realloc({x}, {d}), but ptr is missing from realloc_map" , .{ ptr , size });
214- @panic ("ptr missing from realloc map" );
215- }
216-
217- std .log .debug (" realloc({any}, {any}), seems invalid" , .{ p , size });
218-
219- return null ;
220- } else {
221- if (p ) | ptr | {
222- if (realloc_map .getEntry (@intFromPtr (ptr ))) | entry | {
223- const old_size = entry .value_ptr .* ;
224- const raw_ptr = entry .key_ptr .* ;
225-
226- std .log .debug (" existing {x}, old_size: {d}" , .{ raw_ptr , old_size });
227-
228- const slice = @as ([* ]u8 , @ptrFromInt (raw_ptr ))[0.. old_size ];
229- const allocation = allocator .realloc (slice , size ) catch @panic ("oom" );
230-
231- realloc_map .put (@intFromPtr (allocation .ptr ), size ) catch | err | {
232- std .log .err ("{any}" , .{err });
233- @panic ("failed to update existing pointer size" );
234- };
235-
236- return allocation .ptr ;
237- }
238-
239- std .log .err (" realloc({x}, {d}), but ptr is missing from realloc_map" , .{ ptr , size });
240- @panic ("ptr missing from realloc map" );
241- }
242-
243- const allocation = allocator .alloc (u8 , size ) catch @panic ("oom" );
244- const ptr = allocation .ptr ;
245-
246- realloc_map .put (@intFromPtr (ptr ), size ) catch | err | {
247- std .log .err ("{any}" , .{err });
248- @panic ("failed to put new pointer into realloc_map" );
249- };
250- std .log .debug (" new {x}" , .{@intFromPtr (ptr )});
251-
252- return ptr ;
253- }
254- }
255-
256119//--
257120
258121const Foo = struct {
0 commit comments