Skip to content

Commit 8efcf41

Browse files
committed
FIX: using new handle for extensions with additional check for handle type when importing extension commands.
Molded module's lib-base now looks like: "#[handle! extension]"
1 parent 5ec778e commit 8efcf41

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

src/core/f-extension.c

+6-5
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ x*/ int Do_Callback(REBSER *obj, u32 name, RXIARG *args, RXIARG *result)
363363

364364
// Set extension fields needed:
365365
val = FRM_VALUE(obj, STD_EXTENSION_LIB_BASE);
366-
VAL_SET(val, REB_HANDLE);
367-
VAL_I32(val) = ext->index;
366+
SET_HANDLE(val, NULL, SYM_EXTENSION, HANDLE_FUNCTION);
367+
VAL_HANDLE_I32(val) = ext->index;
368368
if (!D_REF(2)) *FRM_VALUE(obj, STD_EXTENSION_LIB_FILE) = *D_ARG(1);
369369
Set_Binary(FRM_VALUE(obj, STD_EXTENSION_LIB_BOOT), src);
370370

@@ -390,13 +390,14 @@ x*/ int Do_Callback(REBSER *obj, u32 name, RXIARG *args, RXIARG *result)
390390
VAL_LEN(def) != 3
391391
|| !(IS_MODULE(val) || IS_OBJECT(val))
392392
|| !IS_HANDLE(VAL_OBJ_VALUE(val, 1))
393+
|| VAL_HANDLE_TYPE(VAL_OBJ_VALUE(val, 1)) != SYM_EXTENSION
393394
|| !IS_INTEGER(val+1)
394395
|| VAL_INT64(val+1) > 0xffff
395396
) Trap1(RE_BAD_FUNC_DEF, def);
396397

397398
val = VAL_OBJ_VALUE(val, 1);
398399
if (
399-
!(ext = &Ext_List[VAL_I32(val)])
400+
!(ext = &Ext_List[VAL_HANDLE_I32(val)])
400401
|| !(ext->call)
401402
) Trap1(RE_BAD_EXTENSION, def);
402403

@@ -441,7 +442,7 @@ x*/ int Do_Callback(REBSER *obj, u32 name, RXIARG *args, RXIARG *result)
441442
// All of these were checked above on definition:
442443
val = BLK_HEAD(VAL_FUNC_BODY(value));
443444
cmd = (int)VAL_INT64(val+1);
444-
ext = &Ext_List[VAL_I32(VAL_OBJ_VALUE(val, 1))]; // Handler
445+
ext = &Ext_List[VAL_HANDLE_I32(VAL_OBJ_VALUE(val, 1))]; // Handler
445446

446447
// Copy args to command frame (array of args):
447448
RXA_COUNT(&frm) = argc = SERIES_TAIL(VAL_FUNC_ARGS(value))-1; // not self
@@ -573,7 +574,7 @@ x*/ int Do_Callback(REBSER *obj, u32 name, RXIARG *args, RXIARG *result)
573574
// Call the command (also supports different extension modules):
574575
func = BLK_HEAD(VAL_FUNC_BODY(func));
575576
n = (REBCNT)VAL_INT64(func + 1);
576-
ext = &Ext_List[VAL_I32(VAL_OBJ_VALUE(func, 1))]; // Handler
577+
ext = &Ext_List[VAL_HANDLE_I32(VAL_OBJ_VALUE(func, 1))]; // Handler
577578
n = ext->call(n, &frm, context);
578579
val = DS_RETURN;
579580
switch (n) {

src/include/sys-value.h

+2
Original file line numberDiff line numberDiff line change
@@ -980,11 +980,13 @@ typedef struct Reb_Handle {
980980
union {
981981
ANYFUNC code;
982982
REBSER *data;
983+
REBINT index;
983984
};
984985
} REBHAN;
985986

986987
#define VAL_HANDLE(v) ((v)->data.handle.code)
987988
#define VAL_HANDLE_DATA(v) ((v)->data.handle.data)
989+
#define VAL_HANDLE_I32(v) ((v)->data.handle.index) // for handles which are storing just index in the data field
988990
#define VAL_HANDLE_TYPE(v) ((v)->data.handle.sym)
989991
#define VAL_HANDLE_FLAGS(v) ((v)->data.handle.flags)
990992
#define VAL_HANDLE_NAME(v) VAL_WORD_NAME(v) // used in MOLD as an info about handle's type

0 commit comments

Comments
 (0)