[PATCH v5 4/9] jscript: Create separate script dispatches for non-GLOBALMEMBERS named items.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Fri Mar 6 07:48:41 CST 2020
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/jscript/engine.c | 7 +++++++
dlls/jscript/jscript.c | 39 +++++++++++++++++++++++++++++++++++++++
dlls/jscript/jscript.h | 2 ++
3 files changed, 48 insertions(+)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index ce7fbbc..5b96895 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -2990,6 +2990,13 @@ HRESULT exec_source(script_ctx_t *ctx, DWORD flags, bytecode_t *bytecode, functi
unsigned i;
HRESULT hres;
+ if(bytecode->named_item) {
+ if(!bytecode->named_item->script_obj) {
+ hres = create_named_item_script_obj(ctx, bytecode->named_item);
+ if(FAILED(hres)) return hres;
+ }
+ }
+
if(!ctx->ei->enter_notified) {
ctx->ei->enter_notified = TRUE;
IActiveScriptSite_OnEnterScript(ctx->site);
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 8976e6b..b74f172 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -108,6 +108,27 @@ static inline BOOL is_started(script_ctx_t *ctx)
|| ctx->state == SCRIPTSTATE_DISCONNECTED;
}
+HRESULT create_named_item_script_obj(script_ctx_t *ctx, named_item_t *item)
+{
+ static const builtin_info_t disp_info = {
+ JSCLASS_GLOBAL,
+ {NULL, NULL, 0},
+ 0, NULL,
+ NULL,
+ NULL
+ };
+
+ return create_dispex(ctx, &disp_info, NULL, &item->script_obj);
+}
+
+static void release_named_item_script_obj(named_item_t *item)
+{
+ if(!item->script_obj) return;
+
+ jsdisp_release(item->script_obj);
+ item->script_obj = NULL;
+}
+
named_item_t *lookup_named_item(script_ctx_t *ctx, const WCHAR *item_name, unsigned flags)
{
named_item_t *item;
@@ -115,6 +136,10 @@ named_item_t *lookup_named_item(script_ctx_t *ctx, const WCHAR *item_name, unsig
LIST_FOR_EACH_ENTRY(item, &ctx->named_items, named_item_t, entry) {
if((item->flags & flags) == flags && !wcscmp(item->name, item_name)) {
+ if(!item->script_obj && !(item->flags & SCRIPTITEM_GLOBALMEMBERS)) {
+ hr = create_named_item_script_obj(ctx, item);
+ if(FAILED(hr)) return NULL;
+ }
if(!item->disp && (flags || !(item->flags & SCRIPTITEM_CODEONLY))) {
IUnknown *unk;
@@ -371,6 +396,15 @@ static void clear_persistent_code_list(JScript *This)
}
}
+static void release_persistent_script_objs(JScript *This)
+{
+ bytecode_t *iter;
+
+ LIST_FOR_EACH_ENTRY(iter, &This->persistent_code, bytecode_t, entry)
+ if(iter->named_item)
+ release_named_item_script_obj(iter->named_item);
+}
+
static void exec_queued_code(JScript *This)
{
bytecode_t *iter;
@@ -408,6 +442,7 @@ static void decrease_state(JScript *This, SCRIPTSTATE state)
/* FALLTHROUGH */
case SCRIPTSTATE_INITIALIZED:
clear_script_queue(This);
+ release_persistent_script_objs(This);
while(!list_empty(&This->ctx->named_items)) {
named_item_t *iter = LIST_ENTRY(list_head(&This->ctx->named_items), named_item_t, entry);
@@ -415,6 +450,7 @@ static void decrease_state(JScript *This, SCRIPTSTATE state)
list_remove(&iter->entry);
if(iter->disp)
IDispatch_Release(iter->disp);
+ release_named_item_script_obj(iter);
release_named_item(iter);
}
@@ -827,6 +863,7 @@ static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
item->ref = 1;
item->disp = disp;
item->flags = dwFlags;
+ item->script_obj = NULL;
item->name = heap_strdupW(pstrName);
if(!item->name) {
if(disp)
@@ -1001,6 +1038,7 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
WARN("Unknown context %s\n", debugstr_w(pstrItemName));
return E_INVALIDARG;
}
+ if(!item->script_obj) item = NULL;
}
enter_script(This->ctx, &ei);
@@ -1107,6 +1145,7 @@ static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptPars
WARN("Unknown context %s\n", debugstr_w(pstrItemName));
return E_INVALIDARG;
}
+ if(!item->script_obj) item = NULL;
}
enter_script(This->ctx, &ei);
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index f9d6992..804f95e 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -205,6 +205,7 @@ typedef HRESULT (*builtin_setter_t)(script_ctx_t*,jsdisp_t*,jsval_t);
HRESULT builtin_set_const(script_ctx_t*,jsdisp_t*,jsval_t) DECLSPEC_HIDDEN;
typedef struct named_item_t {
+ jsdisp_t *script_obj;
IDispatch *disp;
unsigned ref;
DWORD flags;
@@ -213,6 +214,7 @@ typedef struct named_item_t {
struct list entry;
} named_item_t;
+HRESULT create_named_item_script_obj(script_ctx_t*,named_item_t*) DECLSPEC_HIDDEN;
named_item_t *lookup_named_item(script_ctx_t*,const WCHAR*,unsigned) DECLSPEC_HIDDEN;
void release_named_item(named_item_t*) DECLSPEC_HIDDEN;
--
2.21.0
More information about the wine-devel
mailing list