From f9db537081653b015e04e6f39778342c362484c2 Mon Sep 17 00:00:00 2001 From: K Date: Mon, 23 Nov 2020 23:28:09 +0500 Subject: [PATCH] Added functions to get access to module exports --- quickjs.c | 33 ++++++++++++++++++++++++++++++++- quickjs.h | 5 +++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/quickjs.c b/quickjs.c index a39ff8f66..8a6961896 100644 --- a/quickjs.c +++ b/quickjs.c @@ -27030,7 +27030,7 @@ static int add_req_module_entry(JSContext *ctx, JSModuleDef *m, return i; } -static JSExportEntry *find_export_entry(JSContext *ctx, JSModuleDef *m, +static JSExportEntry *find_export_entry(JSContext *ctx, const JSModuleDef *m, JSAtom export_name) { JSExportEntry *me; @@ -27146,6 +27146,37 @@ int JS_SetModuleExport(JSContext *ctx, JSModuleDef *m, const char *export_name, return -1; } +JSValueConst JS_GetModuleExport(JSContext *ctx, const JSModuleDef *m, const char *export_name) { + JSExportEntry *me; + JSAtom name; + name = JS_NewAtom(ctx, export_name); + if (name == JS_ATOM_NULL) + goto fail; + me = find_export_entry(ctx, m, name); + JS_FreeAtom(ctx, name); + if (!me) + goto fail; + return JS_DupValue(ctx, me->u.local.var_ref->value); + fail: + return JS_UNDEFINED; +} + +int JS_CountModuleExport(JSContext *ctx, const JSModuleDef *m) { + return m->export_entries_count; +} + +JSAtom JS_GetModuleExportName(JSContext *ctx, const JSModuleDef *m, int idx) { + if (idx >= m->export_entries_count || idx < 0) + return JS_ATOM_NULL; + return JS_DupAtom(ctx, m->export_entries[idx].export_name); +} + +JSValueConst JS_GetModuleExportValue(JSContext *ctx, const JSModuleDef *m, int idx) { + if (idx >= m->export_entries_count || idx < 0) + return JS_UNDEFINED; + return JS_DupValue(ctx, m->export_entries[idx].u.local.var_ref->value); +} + void JS_SetModuleLoaderFunc(JSRuntime *rt, JSModuleNormalizeFunc *module_normalize, JSModuleLoaderFunc *module_loader, void *opaque) diff --git a/quickjs.h b/quickjs.h index 92457a2f5..61ebc7bf6 100644 --- a/quickjs.h +++ b/quickjs.h @@ -1034,6 +1034,11 @@ int JS_SetModuleExport(JSContext *ctx, JSModuleDef *m, const char *export_name, JSValue val); int JS_SetModuleExportList(JSContext *ctx, JSModuleDef *m, const JSCFunctionListEntry *tab, int len); +/* can only be called after the module is initialized */ +JSValueConst JS_GetModuleExport(JSContext *ctx, const JSModuleDef *m, const char *export_name); +int JS_CountModuleExport(JSContext *ctx, const JSModuleDef *m); +JSAtom JS_GetModuleExportName(JSContext *ctx, const JSModuleDef *m, int idx); +JSValueConst JS_GetModuleExportValue(JSContext *ctx, const JSModuleDef *m, int idx); #undef js_unlikely #undef js_force_inline