Skip to content

Commit b33bb75

Browse files
gh-147: IMPORT_PATH exposes imported module-restricted extension operators through alias.
1 parent 779b812 commit b33bb75

3 files changed

Lines changed: 33 additions & 4 deletions

File tree

src/builtins.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7456,10 +7456,17 @@ static int module_export_bindings(Interpreter* interp, Env* caller_env, Env* mod
74567456
size_t ns_len = (size_t)(cursor - start);
74577457
if (ns_len == 0) continue;
74587458

7459-
char* ns = malloc(ns_len + 1);
7460-
if (!ns) return -1;
7461-
memcpy(ns, start, ns_len);
7462-
ns[ns_len] = '\0';
7459+
char* ns = malloc(ns_len + 1);
7460+
if (!ns) return -1;
7461+
memcpy(ns, start, ns_len);
7462+
ns[ns_len] = '\0';
7463+
7464+
/* Ensure any module-restricted extension operators registered
7465+
by the loaded extension are exposed under the importing
7466+
module's alias so callers can call alias.ext.NAME. */
7467+
char* ext_err = NULL;
7468+
(void)extensions_expose_named(ns, alias, &ext_err);
7469+
if (ext_err) { free(ext_err); ext_err = NULL; }
74637470

74647471
size_t ns_qual_len = alias_len + 1 + ns_len + 1;
74657472
char* ns_qualified = malloc(ns_qual_len);

src/extensions.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,22 @@ int extensions_load_named(const char* spec,
776776
return rc;
777777
}
778778

779+
int extensions_expose_named(const char* ext_name, const char* scope_name, char** error_out) {
780+
if (!ext_name || ext_name[0] == '\0') {
781+
set_error(error_out, "extensions_expose_named: empty extension name");
782+
return -1;
783+
}
784+
785+
for (LoadedExtension* le = g_loaded; le; le = le->next) {
786+
if (exposure_exists(le, ext_name)) {
787+
return extension_register_exposure(le, ext_name, scope_name, error_out);
788+
}
789+
}
790+
791+
set_errorf(error_out, "Extension not loaded: ", ext_name);
792+
return -1;
793+
}
794+
779795
void extensions_shutdown(void) {
780796
LoadedExtension* e = g_loaded;
781797
while (e) {

src/extensions.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ int extensions_load_named(const char* spec,
2626
char** loaded_name_out,
2727
char** error_out);
2828

29+
// Ensure a previously-loaded extension is exposed under the provided
30+
// scope_name (module alias). This creates scope-qualified aliases for any
31+
// operators registered with the module-restriction flag. Returns 0 on
32+
// success, -1 on failure; on failure *error_out is heap-allocated.
33+
int extensions_expose_named(const char* ext_name, const char* scope_name, char** error_out);
34+
2935
// Unload all loaded extension libraries.
3036
void extensions_shutdown(void);
3137

0 commit comments

Comments
 (0)