need help to find a way to replace c macro

monkyyy crazymonkyyy at gmail.com
Tue Oct 15 12:13:36 UTC 2024


On Tuesday, 15 October 2024 at 12:05:16 UTC, Dakota wrote:
> ```c
> typedef union JSCFunctionType {
>     JSCFunction *generic;
>     JSValue (*generic_magic)(JSContext *ctx, JSValueConst 
> this_val, int argc, JSValueConst *argv, int magic);
>     JSCFunction *constructor;
>     JSValue (*constructor_magic)(JSContext *ctx, JSValueConst 
> new_target, int argc, JSValueConst *argv, int magic);
>     JSCFunction *constructor_or_func;
>     double (*f_f)(double);
>     double (*f_f_f)(double, double);
>     JSValue (*getter)(JSContext *ctx, JSValueConst this_val);
>     JSValue (*setter)(JSContext *ctx, JSValueConst this_val, 
> JSValueConst val);
>     JSValue (*getter_magic)(JSContext *ctx, JSValueConst 
> this_val, int magic);
>     JSValue (*setter_magic)(JSContext *ctx, JSValueConst 
> this_val, JSValueConst val, int magic);
>     JSValue (*iterator_next)(JSContext *ctx, JSValueConst 
> this_val,
>                              int argc, JSValueConst *argv, int 
> *pdone, int magic);
> } JSCFunctionType;
>
> typedef struct JSCFunctionListEntry {
>     const char *name;
>     uint8_t prop_flags;
>     uint8_t def_type;
>     int16_t magic;
>     union {
>         struct {
>             uint8_t length; /* XXX: should move outside union */
>             uint8_t cproto; /* XXX: should move outside union */
>             JSCFunctionType cfunc;
>         } func;
>         struct {
>             JSCFunctionType get;
>             JSCFunctionType set;
>         } getset;
>         struct {
>             const char *name;
>             int base;
>         } alias;
>         struct {
>             const struct JSCFunctionListEntry *tab;
>             int len;
>         } prop_list;
>         const char *str;
>         int32_t i32;
>         int64_t i64;
>         double f64;
>     } u;
> } JSCFunctionListEntry;
>
> #define JS_CFUNC_DEF(name, length, func1) { name, 
> JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, 0, .u = 
> { .func = { length, JS_CFUNC_generic, { .generic = func1 } } } }
> #define JS_CFUNC_MAGIC_DEF(name, length, func1, magic) { name, 
> JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, magic, 
> .u = { .func = { length, JS_CFUNC_generic_magic, { 
> .generic_magic = func1 } } } }
> #define JS_CFUNC_SPECIAL_DEF(name, length, cproto, func1) { 
> name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, 0, 
> .u = { .func = { length, JS_CFUNC_ ## cproto, { .cproto = func1 
> } } } }
> #define JS_ITERATOR_NEXT_DEF(name, length, func1, magic) { 
> name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, 
> magic, .u = { .func = { length, JS_CFUNC_iterator_next, { 
> .iterator_next = func1 } } } }
> #define JS_CGETSET_DEF(name, fgetter, fsetter) { name, 
> JS_PROP_CONFIGURABLE, JS_DEF_CGETSET, 0, .u = { .getset = { 
> .get = { .getter = fgetter }, .set = { .setter = fsetter } } } }
> #define JS_CGETSET_MAGIC_DEF(name, fgetter, fsetter, magic) { 
> name, JS_PROP_CONFIGURABLE, JS_DEF_CGETSET_MAGIC, magic, .u = { 
> .getset = { .get = { .getter_magic = fgetter }, .set = { 
> .setter_magic = fsetter } } } }
>
>
>
> static const JSCFunctionListEntry js_std_funcs[] = {
>     JS_CFUNC_DEF("exit", 1, js_std_exit ),
>     JS_CFUNC_DEF("gc", 0, js_std_gc ),
>     JS_CFUNC_DEF("evalScript", 1, js_evalScript ),
>     JS_CFUNC_DEF("loadScript", 1, js_loadScript ),
>     JS_CFUNC_DEF("getenv", 1, js_std_getenv ),
>     JS_CFUNC_DEF("setenv", 1, js_std_setenv ),
>     JS_CFUNC_DEF("unsetenv", 1, js_std_unsetenv ),
>     JS_CFUNC_DEF("getenviron", 1, js_std_getenviron ),
>     JS_CFUNC_DEF("urlGet", 1, js_std_urlGet ),
>     JS_CFUNC_DEF("loadFile", 1, js_std_loadFile ),
>     JS_CFUNC_DEF("strerror", 1, js_std_strerror ),
>     JS_CFUNC_DEF("parseExtJSON", 1, js_std_parseExtJSON ),
>
>     /* FILE I/O */
>     JS_CFUNC_DEF("open", 2, js_std_open ),
>     JS_CFUNC_DEF("popen", 2, js_std_popen ),
>     JS_CFUNC_DEF("fdopen", 2, js_std_fdopen ),
>     JS_CFUNC_DEF("tmpfile", 0, js_std_tmpfile ),
>     JS_CFUNC_MAGIC_DEF("puts", 1, js_std_file_puts, 0 ),
>     JS_CFUNC_DEF("printf", 1, js_std_printf ),
>     JS_CFUNC_DEF("sprintf", 1, js_std_sprintf ),
> };
>
> ```
>
> the js_std_funcs better to be defined as const, so in runtime 
> the memory address is non-writable for some platform.
>
>
> I am not sure how to translate JS_CFUNC_DEF, JS_CFUNC_MAGIC_DEF 
> into D, so I can use it like c here to create a nice const 
> array of JSCFunctionListEntry

Your probably going to need to simplify that block of code looks 
awful


More information about the Digitalmars-d-learn mailing list