diff options
Diffstat (limited to 'src/extension_loader.zig')
| -rw-r--r-- | src/extension_loader.zig | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/extension_loader.zig b/src/extension_loader.zig index 4620a2e..1c29ceb 100644 --- a/src/extension_loader.zig +++ b/src/extension_loader.zig @@ -220,7 +220,11 @@ pub fn loadFromDirs( for (found.items) |f| { var entries: std.array_list.Managed(Entry) = .init(allocator); defer entries.deinit(); - try runtime.evalEntries(f.script_path, f.package_root, &entries); + runtime.evalEntries(f.script_path, f.package_root, &entries) catch |err| { + // Entries collected before the failure hold Lua refs + names. + for (entries.items) |e| runtime.dropEntry(e); + return err; + }; for (entries.items) |e| { try cands.append(.{ .entry = e, .source = f.source, .script_path = f.script_path }); } @@ -254,10 +258,13 @@ pub fn loadFromDirs( runtime.dropEntry(cnd.entry); continue; } + // Log before activating: `activateEntry` consumes the entry + // (frees its name), so `cnd.entry.name` is dangling afterwards. + std.log.debug("extension: activating '{s}' ({s})", .{ cnd.entry.name, cnd.source.label() }); runtime.activateEntry(cnd.entry) catch |err| { logConflict( - "extension '{s}' ({s}: {s}) failed to activate: {t}", - .{ cnd.entry.name, cnd.source.label(), cnd.script_path, err }, + "extension ({s}: {s}) failed to activate: {t}", + .{ cnd.source.label(), cnd.script_path, err }, ); // activateEntry consumed the entry already. Drop the rest. var j = i + 1; @@ -265,7 +272,6 @@ pub fn loadFromDirs( cands.clearRetainingCapacity(); return err; }; - std.log.debug("extension: activated '{s}' ({s})", .{ cnd.entry.name, cnd.source.label() }); } cands.clearRetainingCapacity(); |
