From 5b6b26641dd51e68524ad7cf85bdc6713c603786 Mon Sep 17 00:00:00 2001 From: geequlim Date: Sun, 7 Jun 2020 19:34:01 +0800 Subject: [PATCH] Release ref_count for import statement loaded resources --- quickjs/quickjs_binder.cpp | 10 +++++++--- quickjs/quickjs_binder.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/quickjs/quickjs_binder.cpp b/quickjs/quickjs_binder.cpp index 78ebc899..8f7d829a 100644 --- a/quickjs/quickjs_binder.cpp +++ b/quickjs/quickjs_binder.cpp @@ -500,11 +500,11 @@ JSModuleDef *QuickJSBinder::js_module_loader(JSContext *ctx, const char *module_ JS_EvalFunction(ctx, func); JSValue val = variant_to_var(ctx, res); JS_SetModuleExport(ctx, m, "default", val); - JS_FreeValue(ctx, val); ModuleCache module; module.md5 = FileAccess::get_md5(file); module.module = m; + module.res_value = val; module.flags = MODULE_FLAG_RESOURCE; module.module = static_cast(JS_VALUE_GET_PTR(func)); binder->module_cache.set(file, module); @@ -553,6 +553,7 @@ QuickJSBinder::ModuleCache *QuickJSBinder::js_compile_module(JSContext *ctx, con module.module = NULL; module.flags = MODULE_FLAG_SCRIPT; module.module = static_cast(JS_VALUE_GET_PTR(func)); + module.res_value = JS_UNDEFINED; binder->module_cache.set(p_filename, module); } else { JSValue e = JS_GetException(ctx); @@ -1144,17 +1145,20 @@ void QuickJSBinder::uninitialize() { frame_callbacks.clear(); { // modules -#if MODULE_HAS_REFCOUNT + const String *file = module_cache.next(NULL); while (file) { const ModuleCache &m = module_cache.get(*file); +#if MODULE_HAS_REFCOUNT if (m.module) { JSValue val = JS_MKPTR(JS_TAG_MODULE, m.module); JS_FreeValue(ctx, val); } +#endif + JS_FreeValue(ctx, m.res_value); file = module_cache.next(file); } -#endif + module_cache.clear(); } diff --git a/quickjs/quickjs_binder.h b/quickjs/quickjs_binder.h index df0f0413..06336b03 100644 --- a/quickjs/quickjs_binder.h +++ b/quickjs/quickjs_binder.h @@ -52,6 +52,7 @@ class QuickJSBinder : public ECMAScriptBinder { struct ModuleCache { int flags; JSModuleDef *module; + JSValue res_value; String md5; };