Skip to content

Commit 6b70c2e

Browse files
gh-109: Add extension operator registration flag.
1 parent c7a0291 commit 6b70c2e

File tree

12 files changed

+172
-85
lines changed

12 files changed

+172
-85
lines changed

docs/SPECIFICATION.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -633,11 +633,11 @@
633633

634634
At load time, the interpreter MUST use the host platform's dynamic-library facilities to load the extension, locate the exported `prefix_extension_init` symbol, invoke it with the extension context, and record all registered operators and hooks. On Windows this SHOULD use `LoadLibraryEx`; on Unix-like systems this SHOULD use `dlopen` or an equivalent facility.
635635

636-
Extensions that opt into module-qualified registration MUST expose their operators under the extension name as a dotted prefix rather than injecting those operators into the global built-in namespace. Event-handler registration MUST support the runtime lifecycle hooks defined by the interpreter, including program start and end, error reporting, statement boundaries, and call boundaries.
636+
Extensions that opt into module-qualified registration MUST do so with a dedicated operator-registration flag. Only operators registered with that flag MAY be exposed under the extension name as a dotted prefix rather than injected into the global built-in namespace. `PREFIX_EXTENSION_ASMODULE` by itself MUST NOT imply module-qualified exposure. Event-handler registration MUST support the runtime lifecycle hooks defined by the interpreter, including program start and end, error reporting, statement boundaries, and call boundaries.
637637

638638
The extension context MUST provide registration surfaces equivalent to the following:
639639

640-
- `register_operator(name, handler_fn, flags)` to add new callable operators. The `flags` parameter MUST include a module-qualification option equivalent to `PREFIX_EXTENSION_ASMODULE`, which exposes an operator under the extension name as a dotted prefix such as `mymod.FOO`.
640+
- `register_operator(name, handler_fn, flags)` to add new callable operators. The `flags` parameter MUST include `PREFIX_EXTENSION_ASMODULE` together with a separate module-restriction option equivalent to `PREFIX_EXTENSION_MODULE_RESTRICTED`. An operator MUST be exposed under the extension name as a dotted prefix such as `mymod.FOO` only when that module-restriction flag is present.
641641

642642
- `register_periodic_hook(N, handler_fn)` to request execution after rewrite steps whose `step_index % N == 0`.
643643

@@ -847,7 +847,7 @@
847847
848848
- `BOOL: EXTEND(EXTENSION: ext)` = MUST load the compiled extension designated by `ext`. The specifier `ext` MUST exclude the platform filename suffix and MAY use package-style `..` separators. If `ext` resolves to a package, the loader MUST attempt `ext..init`. Relative extension names MUST resolve using the calling module's source directory when available, then the current working directory, then the configured extension roots `ext/std`, `ext/usr`, `lib/std`, and `lib/usr` (with bundled roots searched before user roots). Repeating an `EXTEND` request for an already-loaded extension exposure MUST be idempotent. On success, `EXTEND` MUST return `FALSE`.
849849
850-
Operators registered with module-qualified flags (for example `PREFIX_EXTENSION_ASMODULE`) MUST be exposed only under the extending module's namespace. Importing that module MUST expose the extension namespace qualifier under the importing module's qualified name. Extension side effects outside operator registration (for example process-global hooks or host-side state) remain global.
850+
Operators registered with the module-restriction flag (for example `PREFIX_EXTENSION_MODULE_RESTRICTED`) MUST be exposed only under the extending module's namespace. Importing that module MUST expose the extension namespace qualifier under the importing module's qualified name. `PREFIX_EXTENSION_ASMODULE` by itself MUST NOT restrict an operator to the extending module's namespace or cause that qualified exposure. Extension side effects outside operator registration (for example process-global hooks or host-side state) remain global.
851851
852852
- `BOOL: IMPORT(MODULE: name)` or `BOOL: IMPORT(MODULE: name, SYMBOL: alias)` = MUST load the named module, execute it in its own top-level environment on first import, cache that environment, and expose its bindings under the module name or the supplied alias. The implementation MUST search the referring source directory first, then bundled library locations as described in [8.2](#82-extensions-and-extend), [10](#10-standard-library), and the language's module-search rules. Re-importing an already loaded module MUST reuse the cached module namespace rather than re-executing the module.
853853

ext/std/networking.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,27 +1253,27 @@ __declspec(dllexport)
12531253
void prefix_extension_init(prefix_ext_context* ctx) {
12541254
if (!ctx) return;
12551255
ensure_socket_runtime();
1256-
ctx->register_operator("TCP_CONNECT", op_tcp_connect, PREFIX_EXTENSION_ASMODULE);
1257-
ctx->register_operator("TCP_SEND", op_tcp_send, PREFIX_EXTENSION_ASMODULE);
1258-
ctx->register_operator("TCP_RECV_TEXT", op_tcp_recv_text, PREFIX_EXTENSION_ASMODULE);
1259-
ctx->register_operator("TCP_RECV_BYTES", op_tcp_recv_bytes, PREFIX_EXTENSION_ASMODULE);
1260-
ctx->register_operator("TCP_CLOSE", op_tcp_close, PREFIX_EXTENSION_ASMODULE);
1261-
1262-
ctx->register_operator("UDP_BIND", op_udp_bind, PREFIX_EXTENSION_ASMODULE);
1263-
ctx->register_operator("UDP_SEND", op_udp_send, PREFIX_EXTENSION_ASMODULE);
1264-
ctx->register_operator("UDP_RECV_TEXT", op_udp_recv_text, PREFIX_EXTENSION_ASMODULE);
1265-
ctx->register_operator("UDP_RECV_BYTES", op_udp_recv_bytes, PREFIX_EXTENSION_ASMODULE);
1266-
ctx->register_operator("UDP_CLOSE", op_udp_close, PREFIX_EXTENSION_ASMODULE);
1267-
1268-
ctx->register_operator("HTTP_GET_TEXT", op_http_get_text, PREFIX_EXTENSION_ASMODULE);
1269-
ctx->register_operator("HTTP_GET_BYTES", op_http_get_bytes, PREFIX_EXTENSION_ASMODULE);
1270-
ctx->register_operator("HTTP_GET_STATUS", op_http_get_status, PREFIX_EXTENSION_ASMODULE);
1271-
ctx->register_operator("HTTP_POST_TEXT", op_http_post_text, PREFIX_EXTENSION_ASMODULE);
1272-
1273-
ctx->register_operator("FTP_LIST", op_ftp_list, PREFIX_EXTENSION_ASMODULE);
1274-
ctx->register_operator("FTP_GET_BYTES", op_ftp_get_bytes, PREFIX_EXTENSION_ASMODULE);
1275-
ctx->register_operator("FTP_PUT_BYTES", op_ftp_put_bytes, PREFIX_EXTENSION_ASMODULE);
1276-
1277-
ctx->register_operator("SMTP_SEND", op_smtp_send, PREFIX_EXTENSION_ASMODULE);
1278-
ctx->register_operator("MTP_SEND", op_smtp_send, PREFIX_EXTENSION_ASMODULE);
1256+
ctx->register_operator("TCP_CONNECT", op_tcp_connect, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1257+
ctx->register_operator("TCP_SEND", op_tcp_send, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1258+
ctx->register_operator("TCP_RECV_TEXT", op_tcp_recv_text, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1259+
ctx->register_operator("TCP_RECV_BYTES", op_tcp_recv_bytes, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1260+
ctx->register_operator("TCP_CLOSE", op_tcp_close, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1261+
1262+
ctx->register_operator("UDP_BIND", op_udp_bind, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1263+
ctx->register_operator("UDP_SEND", op_udp_send, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1264+
ctx->register_operator("UDP_RECV_TEXT", op_udp_recv_text, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1265+
ctx->register_operator("UDP_RECV_BYTES", op_udp_recv_bytes, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1266+
ctx->register_operator("UDP_CLOSE", op_udp_close, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1267+
1268+
ctx->register_operator("HTTP_GET_TEXT", op_http_get_text, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1269+
ctx->register_operator("HTTP_GET_BYTES", op_http_get_bytes, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1270+
ctx->register_operator("HTTP_GET_STATUS", op_http_get_status, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1271+
ctx->register_operator("HTTP_POST_TEXT", op_http_post_text, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1272+
1273+
ctx->register_operator("FTP_LIST", op_ftp_list, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1274+
ctx->register_operator("FTP_GET_BYTES", op_ftp_get_bytes, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1275+
ctx->register_operator("FTP_PUT_BYTES", op_ftp_put_bytes, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1276+
1277+
ctx->register_operator("SMTP_SEND", op_smtp_send, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
1278+
ctx->register_operator("MTP_SEND", op_smtp_send, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
12791279
}

ext/std/win32.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -398,18 +398,18 @@ __declspec(dllexport)
398398
// Register operators
399399
void prefix_extension_init(prefix_ext_context* ctx) {
400400
if (!ctx) return;
401-
ctx->register_operator("WIN_CALL", (prefix_operator_fn)op_win_call, PREFIX_EXTENSION_ASMODULE);
402-
ctx->register_operator("WIN_MESSAGE_BOX", (prefix_operator_fn)op_win_message_box, PREFIX_EXTENSION_ASMODULE);
403-
ctx->register_operator("WIN_SLEEP", (prefix_operator_fn)op_win_sleep, PREFIX_EXTENSION_ASMODULE);
404-
ctx->register_operator("WIN_LAST_ERROR", (prefix_operator_fn)op_win_last_error, PREFIX_EXTENSION_ASMODULE);
405-
ctx->register_operator("WIN_LOAD_LIBRARY", (prefix_operator_fn)op_win_load_library, PREFIX_EXTENSION_ASMODULE);
406-
ctx->register_operator("WIN_FREE_LIBRARY", (prefix_operator_fn)op_win_free_library, PREFIX_EXTENSION_ASMODULE);
407-
ctx->register_operator("WIN_GET_PROC_ADDRESS", (prefix_operator_fn)op_win_get_proc_address, PREFIX_EXTENSION_ASMODULE);
408-
ctx->register_operator("WIN_CREATE_FILE", (prefix_operator_fn)op_win_create_file, PREFIX_EXTENSION_ASMODULE);
409-
ctx->register_operator("WIN_READ_FILE", (prefix_operator_fn)op_win_read_file, PREFIX_EXTENSION_ASMODULE);
410-
ctx->register_operator("WIN_WRITE_FILE", (prefix_operator_fn)op_win_write_file, PREFIX_EXTENSION_ASMODULE);
411-
ctx->register_operator("WIN_CLOSE_HANDLE", (prefix_operator_fn)op_win_close_handle, PREFIX_EXTENSION_ASMODULE);
412-
ctx->register_operator("WIN_VIRTUAL_ALLOC", (prefix_operator_fn)op_win_virtual_alloc, PREFIX_EXTENSION_ASMODULE);
413-
ctx->register_operator("WIN_VIRTUAL_FREE", (prefix_operator_fn)op_win_virtual_free, PREFIX_EXTENSION_ASMODULE);
414-
ctx->register_operator("WIN_FORMAT_MESSAGE", (prefix_operator_fn)op_win_format_message, PREFIX_EXTENSION_ASMODULE);
401+
ctx->register_operator("WIN_CALL", (prefix_operator_fn)op_win_call, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
402+
ctx->register_operator("WIN_MESSAGE_BOX", (prefix_operator_fn)op_win_message_box, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
403+
ctx->register_operator("WIN_SLEEP", (prefix_operator_fn)op_win_sleep, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
404+
ctx->register_operator("WIN_LAST_ERROR", (prefix_operator_fn)op_win_last_error, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
405+
ctx->register_operator("WIN_LOAD_LIBRARY", (prefix_operator_fn)op_win_load_library, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
406+
ctx->register_operator("WIN_FREE_LIBRARY", (prefix_operator_fn)op_win_free_library, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
407+
ctx->register_operator("WIN_GET_PROC_ADDRESS", (prefix_operator_fn)op_win_get_proc_address, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
408+
ctx->register_operator("WIN_CREATE_FILE", (prefix_operator_fn)op_win_create_file, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
409+
ctx->register_operator("WIN_READ_FILE", (prefix_operator_fn)op_win_read_file, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
410+
ctx->register_operator("WIN_WRITE_FILE", (prefix_operator_fn)op_win_write_file, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
411+
ctx->register_operator("WIN_CLOSE_HANDLE", (prefix_operator_fn)op_win_close_handle, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
412+
ctx->register_operator("WIN_VIRTUAL_ALLOC", (prefix_operator_fn)op_win_virtual_alloc, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
413+
ctx->register_operator("WIN_VIRTUAL_FREE", (prefix_operator_fn)op_win_virtual_free, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
414+
ctx->register_operator("WIN_FORMAT_MESSAGE", (prefix_operator_fn)op_win_format_message, PREFIX_EXTENSION_ASMODULE | PREFIX_EXTENSION_MODULE_RESTRICTED);
415415
}

lib/std/gui/gui.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -750,16 +750,16 @@ __declspec(dllexport)
750750
#endif
751751
void prefix_extension_init(prefix_ext_context* ctx) {
752752
if (!ctx) return;
753-
ctx->register_operator("CREATE_WINDOW", (prefix_operator_fn)op_create_window, 0);
754-
ctx->register_operator("SHOW_IMAGE", (prefix_operator_fn)op_show_image, 0);
755-
ctx->register_operator("CLOSE_WINDOW", (prefix_operator_fn)op_close_window, 0);
756-
ctx->register_operator("SCREEN", (prefix_operator_fn)op_screen, 0);
757-
ctx->register_operator("WINDOW", (prefix_operator_fn)op_window, 0);
758-
ctx->register_operator("SCREENSHOT", (prefix_operator_fn)op_screenshot, 0);
759-
ctx->register_operator("MINIMIZE", (prefix_operator_fn)op_minimize, 0);
760-
ctx->register_operator("MAXIMIZE", (prefix_operator_fn)op_maximize, 0);
761-
ctx->register_operator("TO_FRONT", (prefix_operator_fn)op_to_front, 0);
762-
ctx->register_operator("TO_BACK", (prefix_operator_fn)op_to_back, 0);
753+
ctx->register_operator("CREATE_WINDOW", (prefix_operator_fn)op_create_window, PREFIX_EXTENSION_MODULE_RESTRICTED);
754+
ctx->register_operator("SHOW_IMAGE", (prefix_operator_fn)op_show_image, PREFIX_EXTENSION_MODULE_RESTRICTED);
755+
ctx->register_operator("CLOSE_WINDOW", (prefix_operator_fn)op_close_window, PREFIX_EXTENSION_MODULE_RESTRICTED);
756+
ctx->register_operator("SCREEN", (prefix_operator_fn)op_screen, PREFIX_EXTENSION_MODULE_RESTRICTED);
757+
ctx->register_operator("WINDOW", (prefix_operator_fn)op_window, PREFIX_EXTENSION_MODULE_RESTRICTED);
758+
ctx->register_operator("SCREENSHOT", (prefix_operator_fn)op_screenshot, PREFIX_EXTENSION_MODULE_RESTRICTED);
759+
ctx->register_operator("MINIMIZE", (prefix_operator_fn)op_minimize, PREFIX_EXTENSION_MODULE_RESTRICTED);
760+
ctx->register_operator("MAXIMIZE", (prefix_operator_fn)op_maximize, PREFIX_EXTENSION_MODULE_RESTRICTED);
761+
ctx->register_operator("TO_FRONT", (prefix_operator_fn)op_to_front, PREFIX_EXTENSION_MODULE_RESTRICTED);
762+
ctx->register_operator("TO_BACK", (prefix_operator_fn)op_to_back, PREFIX_EXTENSION_MODULE_RESTRICTED);
763763
}
764764

765765
#else

lib/std/image/image.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,25 +1305,25 @@ __declspec(dllexport)
13051305
#endif
13061306
void prefix_extension_init(prefix_ext_context* ctx) {
13071307
if (!ctx) return;
1308-
ctx->register_operator("LOAD_PNG", (prefix_operator_fn)op_load_png, 0);
1309-
ctx->register_operator("LOAD_JPEG", (prefix_operator_fn)op_load_jpeg, 0);
1310-
ctx->register_operator("LOAD_BMP", (prefix_operator_fn)op_load_bmp, 0);
1311-
ctx->register_operator("SAVE_PNG", (prefix_operator_fn)op_save_png, 0);
1312-
ctx->register_operator("SAVE_JPEG", (prefix_operator_fn)op_save_jpeg, 0);
1313-
ctx->register_operator("SAVE_BMP", (prefix_operator_fn)op_save_bmp, 0);
1314-
ctx->register_operator("POLYGON", (prefix_operator_fn)op_polygon, 0);
1315-
ctx->register_operator("ELLIPSE", (prefix_operator_fn)op_ellipse, 0);
1316-
ctx->register_operator("THRESHHOLD_A", (prefix_operator_fn)op_threshhold_a, 0);
1317-
ctx->register_operator("THRESHHOLD_R", (prefix_operator_fn)op_threshhold_r, 0);
1318-
ctx->register_operator("THRESHHOLD_G", (prefix_operator_fn)op_threshhold_g, 0);
1319-
ctx->register_operator("THRESHHOLD_B", (prefix_operator_fn)op_threshhold_b, 0);
1320-
ctx->register_operator("SCALE", (prefix_operator_fn)op_scale, 0);
1321-
ctx->register_operator("RESIZE", (prefix_operator_fn)op_resize, 0);
1322-
ctx->register_operator("ROTATE", (prefix_operator_fn)op_rotate, 0);
1323-
ctx->register_operator("BLIT", (prefix_operator_fn)op_blit, 0);
1324-
ctx->register_operator("GRAYSCALE", (prefix_operator_fn)op_grayscale, 0);
1325-
ctx->register_operator("REPLACE_COLOR", (prefix_operator_fn)op_replace_color, 0);
1326-
ctx->register_operator("BLUR", (prefix_operator_fn)op_blur, 0);
1327-
ctx->register_operator("EDGE", (prefix_operator_fn)op_edge, 0);
1328-
ctx->register_operator("CELLSHADE", (prefix_operator_fn)op_cellshade, 0);
1329-
}
1308+
ctx->register_operator("LOAD_PNG", (prefix_operator_fn)op_load_png, PREFIX_EXTENSION_MODULE_RESTRICTED);
1309+
ctx->register_operator("LOAD_JPEG", (prefix_operator_fn)op_load_jpeg, PREFIX_EXTENSION_MODULE_RESTRICTED);
1310+
ctx->register_operator("LOAD_BMP", (prefix_operator_fn)op_load_bmp, PREFIX_EXTENSION_MODULE_RESTRICTED);
1311+
ctx->register_operator("SAVE_PNG", (prefix_operator_fn)op_save_png, PREFIX_EXTENSION_MODULE_RESTRICTED);
1312+
ctx->register_operator("SAVE_JPEG", (prefix_operator_fn)op_save_jpeg, PREFIX_EXTENSION_MODULE_RESTRICTED);
1313+
ctx->register_operator("SAVE_BMP", (prefix_operator_fn)op_save_bmp, PREFIX_EXTENSION_MODULE_RESTRICTED);
1314+
ctx->register_operator("POLYGON", (prefix_operator_fn)op_polygon, PREFIX_EXTENSION_MODULE_RESTRICTED);
1315+
ctx->register_operator("ELLIPSE", (prefix_operator_fn)op_ellipse, PREFIX_EXTENSION_MODULE_RESTRICTED);
1316+
ctx->register_operator("THRESHHOLD_A", (prefix_operator_fn)op_threshhold_a, PREFIX_EXTENSION_MODULE_RESTRICTED);
1317+
ctx->register_operator("THRESHHOLD_R", (prefix_operator_fn)op_threshhold_r, PREFIX_EXTENSION_MODULE_RESTRICTED);
1318+
ctx->register_operator("THRESHHOLD_G", (prefix_operator_fn)op_threshhold_g, PREFIX_EXTENSION_MODULE_RESTRICTED);
1319+
ctx->register_operator("THRESHHOLD_B", (prefix_operator_fn)op_threshhold_b, PREFIX_EXTENSION_MODULE_RESTRICTED);
1320+
ctx->register_operator("SCALE", (prefix_operator_fn)op_scale, PREFIX_EXTENSION_MODULE_RESTRICTED);
1321+
ctx->register_operator("RESIZE", (prefix_operator_fn)op_resize, PREFIX_EXTENSION_MODULE_RESTRICTED);
1322+
ctx->register_operator("ROTATE", (prefix_operator_fn)op_rotate, PREFIX_EXTENSION_MODULE_RESTRICTED);
1323+
ctx->register_operator("BLIT", (prefix_operator_fn)op_blit, PREFIX_EXTENSION_MODULE_RESTRICTED);
1324+
ctx->register_operator("GRAYSCALE", (prefix_operator_fn)op_grayscale, PREFIX_EXTENSION_MODULE_RESTRICTED);
1325+
ctx->register_operator("REPLACE_COLOR", (prefix_operator_fn)op_replace_color, PREFIX_EXTENSION_MODULE_RESTRICTED);
1326+
ctx->register_operator("BLUR", (prefix_operator_fn)op_blur, PREFIX_EXTENSION_MODULE_RESTRICTED);
1327+
ctx->register_operator("EDGE", (prefix_operator_fn)op_edge, PREFIX_EXTENSION_MODULE_RESTRICTED);
1328+
ctx->register_operator("CELLSHADE", (prefix_operator_fn)op_cellshade, PREFIX_EXTENSION_MODULE_RESTRICTED);
1329+
}

src/extensions.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,11 @@ static LoadedExtension* loaded_find_by_path(const char* canonical_path) {
360360
return NULL;
361361
}
362362

363-
static int ctx_register_operator(const char* name, prefix_operator_fn fn, int asmodule) {
363+
static int ctx_register_operator(const char* name, prefix_operator_fn fn, int flags) {
364364
if (!name || name[0] == '\0' || !fn) return -1;
365365

366366
char* final_name = NULL;
367-
if ((asmodule & PREFIX_EXTENSION_ASMODULE) != 0 && g_loading_extension_name && g_loading_extension_name[0] != '\0') {
367+
if ((flags & PREFIX_EXTENSION_MODULE_RESTRICTED) != 0 && g_loading_extension_name && g_loading_extension_name[0] != '\0') {
368368
const char* ext_name = g_loading_extension_name;
369369

370370
size_t a = strlen(ext_name);

src/extensions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ int extensions_load_library(const char* path, const char* base_dir, char** error
1515

1616
// Load an extension by logical name/specifier used by EXTEND.
1717
// spec excludes platform filename extension and may use package semantics via "..".
18-
// scope_name is retained for loader bookkeeping; PREFIX_EXTENSION_ASMODULE exposure
19-
// uses the extension name only.
18+
// scope_name is retained for loader bookkeeping; module-restricted exposure uses
19+
// the extension name only.
2020
// If loaded_name_out is non-NULL, it receives the extension namespace name (heap-allocated).
2121
// Returns 0 on success, -1 on failure. On failure, *error_out is heap-allocated.
2222
int extensions_load_named(const char* spec,

0 commit comments

Comments
 (0)