Most of these globals were leaking before as they were never freed at all.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@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);