Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
These patches correct the implementation so that it passes the tests at the end of the series. Some changes are done to simplify the next patch in the series.
I haven't sent the linked list->array conversion yet, because that is not a functional change, just an optimization, so it will come after this is corrected first.
dlls/vbscript/compile.c | 3 ++- dlls/vbscript/vbdisp.c | 5 +++++ dlls/vbscript/vbscript.c | 12 ++++++++++++ dlls/vbscript/vbscript.h | 1 + 4 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 2023261..fc94998 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -1948,7 +1948,6 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *deli ctx.code = NULL; release_compiler(&ctx);
- list_add_tail(&script->code_list, &code->entry); *ret = code; return S_OK; } @@ -1975,6 +1974,8 @@ HRESULT compile_procedure(script_ctx_t *script, const WCHAR *src, const WCHAR *d desc->next = script->procs; script->procs = desc;
+ list_add_tail(&script->script_obj->code_list, &code->entry); + *ret = desc; return S_OK; } diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 1dd6d4e..7859abf 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -616,6 +616,10 @@ static ULONG WINAPI ScriptDisp_Release(IDispatchEx *iface)
if(!ref) { assert(!This->ctx); + + while (!list_empty(&This->code_list)) + release_vbscode(LIST_ENTRY(list_head(&This->code_list), vbscode_t, entry)); + heap_free(This->ident_map); heap_free(This); } @@ -827,6 +831,7 @@ HRESULT create_script_disp(script_ctx_t *ctx, ScriptDisp **ret) script_disp->IDispatchEx_iface.lpVtbl = &ScriptDispVtbl; script_disp->ref = 1; script_disp->ctx = ctx; + list_init(&script_disp->code_list);
*ret = script_disp; return S_OK; diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c index 56c53b4..ca594f1 100644 --- a/dlls/vbscript/vbscript.c +++ b/dlls/vbscript/vbscript.c @@ -94,6 +94,10 @@ static void exec_queued_code(script_ctx_t *ctx) if(iter->pending_exec) exec_global_code(ctx, iter, NULL); } + LIST_FOR_EACH_ENTRY(iter, &ctx->script_obj->code_list, vbscode_t, entry) { + if(iter->pending_exec) + exec_global_code(ctx, iter, NULL); + } }
IDispatch *lookup_named_item(script_ctx_t *ctx, const WCHAR *name, unsigned flags) @@ -764,6 +768,7 @@ static HRESULT WINAPI VBScriptParse_ParseScriptText(IActiveScriptParse *iface, { VBScript *This = impl_from_IActiveScriptParse(iface); IDispatch *context = NULL; + struct list *list; vbscode_t *code; HRESULT hres;
@@ -786,6 +791,13 @@ static HRESULT WINAPI VBScriptParse_ParseScriptText(IActiveScriptParse *iface, if(FAILED(hres)) return hres;
+ if(dwFlags & SCRIPTTEXT_ISPERSISTENT) + list = &This->ctx->code_list; + else + list = &This->ctx->script_obj->code_list; + + list_add_tail(list, &code->entry); + if(context) IDispatch_AddRef(code->context = context);
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 33eb1e8..cfa7469 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -131,6 +131,7 @@ typedef struct { unsigned ident_map_size;
script_ctx_t *ctx; + struct list code_list; } ScriptDisp;
typedef struct _builtin_prop_t builtin_prop_t;