[PATCH v4 5/6] jscript: Release all globals when the script is uninitialized.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Thu Jun 2 12:00:47 CDT 2022
Most of these globals were leaking before as they were never freed at all.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/jscript/jscript.c | 31 ++++++++++---------------
dlls/jscript/jscript.h | 50 ++++++++++++++++++++++------------------
dlls/jscript/tests/run.c | 1 -
3 files changed, 40 insertions(+), 42 deletions(-)
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index d6028e6..8a54f32 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -91,6 +91,17 @@ void script_release(script_ctx_t *ctx)
heap_free(ctx);
}
+static void script_globals_release(script_ctx_t *ctx)
+{
+ unsigned i;
+ for(i = 0; i < ARRAY_SIZE(ctx->global_objects); i++) {
+ if(ctx->global_objects[i]) {
+ jsdisp_release(ctx->global_objects[i]);
+ ctx->global_objects[i] = NULL;
+ }
+ }
+}
+
static void change_state(JScript *This, SCRIPTSTATE state)
{
if(This->ctx->state == state)
@@ -483,25 +494,7 @@ static void decrease_state(JScript *This, SCRIPTSTATE state)
This->ctx->site = NULL;
}
- if(This->ctx->map_prototype) {
- jsdisp_release(This->ctx->map_prototype);
- This->ctx->map_prototype = NULL;
- }
-
- if(This->ctx->set_prototype) {
- jsdisp_release(This->ctx->set_prototype);
- This->ctx->set_prototype = NULL;
- }
-
- if(This->ctx->object_prototype) {
- jsdisp_release(This->ctx->object_prototype);
- This->ctx->object_prototype = NULL;
- }
-
- if(This->ctx->global) {
- jsdisp_release(This->ctx->global);
- This->ctx->global = NULL;
- }
+ script_globals_release(This->ctx);
/* FALLTHROUGH */
case SCRIPTSTATE_UNINITIALIZED:
change_state(This, state);
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 000bcc2..0f8baea 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -387,29 +387,35 @@ struct _script_ctx_t {
DWORD last_match_index;
DWORD last_match_length;
- jsdisp_t *global;
- jsdisp_t *function_constr;
- jsdisp_t *array_constr;
- jsdisp_t *bool_constr;
- jsdisp_t *date_constr;
- jsdisp_t *enumerator_constr;
- jsdisp_t *error_constr;
- jsdisp_t *eval_error_constr;
- jsdisp_t *range_error_constr;
- jsdisp_t *reference_error_constr;
- jsdisp_t *regexp_error_constr;
- jsdisp_t *syntax_error_constr;
- jsdisp_t *type_error_constr;
- jsdisp_t *uri_error_constr;
- jsdisp_t *number_constr;
- jsdisp_t *object_constr;
- jsdisp_t *object_prototype;
- jsdisp_t *regexp_constr;
- jsdisp_t *string_constr;
- jsdisp_t *vbarray_constr;
- jsdisp_t *map_prototype;
- jsdisp_t *set_prototype;
+ union {
+ struct {
+ jsdisp_t *global;
+ jsdisp_t *function_constr;
+ jsdisp_t *array_constr;
+ jsdisp_t *bool_constr;
+ jsdisp_t *date_constr;
+ jsdisp_t *enumerator_constr;
+ jsdisp_t *error_constr;
+ jsdisp_t *eval_error_constr;
+ jsdisp_t *range_error_constr;
+ jsdisp_t *reference_error_constr;
+ jsdisp_t *regexp_error_constr;
+ jsdisp_t *syntax_error_constr;
+ jsdisp_t *type_error_constr;
+ jsdisp_t *uri_error_constr;
+ jsdisp_t *number_constr;
+ jsdisp_t *object_constr;
+ jsdisp_t *object_prototype;
+ jsdisp_t *regexp_constr;
+ jsdisp_t *string_constr;
+ jsdisp_t *vbarray_constr;
+ jsdisp_t *map_prototype;
+ jsdisp_t *set_prototype;
+ };
+ jsdisp_t *global_objects[22];
+ };
};
+C_ASSERT(RTL_SIZEOF_THROUGH_FIELD(script_ctx_t, set_prototype) == RTL_SIZEOF_THROUGH_FIELD(script_ctx_t, global_objects));
void script_release(script_ctx_t*) DECLSPEC_HIDDEN;
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index f7ad1fe..ec054f0 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -3293,7 +3293,6 @@ static void test_invokeex(void)
str = SysAllocString(L"call");
hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
SysFreeString(str);
- todo_wine
ok(hres == E_UNEXPECTED, "GetDispID failed: %08lx\n", hres);
IDispatchEx_Release(dispex);
--
2.34.1
More information about the wine-devel
mailing list