summaryrefslogtreecommitdiff
path: root/src/extension_loader.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/extension_loader.zig')
-rw-r--r--src/extension_loader.zig14
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();