Jacek Caban : jscript: Use enter_script and leave_script to call script site notifications.

Alexandre Julliard julliard at winehq.org
Thu Jan 30 16:10:24 CST 2020


Module: wine
Branch: master
Commit: 33984c390df823b1d23890f2ed8b5223b067f7ea
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=33984c390df823b1d23890f2ed8b5223b067f7ea

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jan 30 15:50:39 2020 +0100

jscript: Use enter_script and leave_script to call script site notifications.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/engine.c       |  5 +++++
 dlls/jscript/engine.h       |  1 +
 dlls/jscript/jscript.c      | 22 ++++------------------
 dlls/jscript/tests/caller.c |  2 --
 4 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 0d9af71715..8b121747fe 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -2977,6 +2977,11 @@ HRESULT exec_source(script_ctx_t *ctx, DWORD flags, bytecode_t *bytecode, functi
     unsigned i;
     HRESULT hres;
 
+    if(!ctx->ei->enter_notified) {
+        ctx->ei->enter_notified = TRUE;
+        IActiveScriptSite_OnEnterScript(ctx->site);
+    }
+
     for(i = 0; i < function->func_cnt; i++) {
         jsdisp_t *func_obj;
 
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index 5f0035baac..a33611fced 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -227,6 +227,7 @@ struct _jsexcept_t {
     BOOL valid_value;
     jsval_t value;
 
+    BOOL enter_notified;
     jsexcept_t *prev;
 };
 
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 28bde3bb33..1564e859b8 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -129,22 +129,12 @@ HRESULT leave_script(script_ctx_t *ctx, HRESULT result)
         result = ei->error;
     if(FAILED(result))
         WARN("%08x\n", result);
+    if(ei->enter_notified && ctx->site)
+        IActiveScriptSite_OnLeaveScript(ctx->site);
     reset_ei(ei);
     return result;
 }
 
-static HRESULT exec_global_code(JScript *This, bytecode_t *code)
-{
-    HRESULT hres;
-
-    IActiveScriptSite_OnEnterScript(This->site);
-
-    hres = exec_source(This->ctx, EXEC_GLOBAL, code, &code->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, NULL);
-
-    IActiveScriptSite_OnLeaveScript(This->site);
-    return hres;
-}
-
 static void clear_script_queue(JScript *This)
 {
     while(!list_empty(&This->queued_code))
@@ -176,7 +166,7 @@ static void exec_queued_code(JScript *This)
 
     LIST_FOR_EACH_ENTRY(iter, &This->queued_code, bytecode_t, entry) {
         enter_script(This->ctx, &ei);
-        hres = exec_global_code(This, iter);
+        hres = exec_source(This->ctx, EXEC_GLOBAL, iter, &iter->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, NULL);
         leave_script(This->ctx, hres);
     }
 
@@ -818,8 +808,6 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
     if(dwFlags & SCRIPTTEXT_ISEXPRESSION) {
         jsval_t r;
 
-        IActiveScriptSite_OnEnterScript(This->site);
-
         hres = exec_source(This->ctx, EXEC_GLOBAL, code, &code->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, &r);
         if(SUCCEEDED(hres)) {
             if(pvarResult)
@@ -827,7 +815,6 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
             jsval_release(r);
         }
 
-        IActiveScriptSite_OnLeaveScript(This->site);
         return leave_script(This->ctx, hres);
     }
 
@@ -840,8 +827,7 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
     if(!pvarResult && !is_started(This->ctx)) {
         list_add_tail(&This->queued_code, &code->entry);
     }else {
-        hres = exec_global_code(This, code);
-
+        hres = exec_source(This->ctx, EXEC_GLOBAL, code, &code->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, NULL);
         if(code->is_persistent)
             list_add_tail(&This->persistent_code, &code->entry);
         else
diff --git a/dlls/jscript/tests/caller.c b/dlls/jscript/tests/caller.c
index 9fb59844c4..19323e8eaf 100644
--- a/dlls/jscript/tests/caller.c
+++ b/dlls/jscript/tests/caller.c
@@ -105,9 +105,7 @@ static void _call_change_type(unsigned line, IVariantChangeType *change_type, VA
     ok_(__FILE__,line)(hres == S_OK, "ChangeType(%d) failed: %08x\n", vt, hres);
     ok_(__FILE__,line)(V_VT(dst) == vt, "V_VT(dst) = %d\n", V_VT(dst));
     if(V_VT(src) == VT_DISPATCH && vt != VT_BOOL) {
-        todo_wine
         CHECK_CALLED(OnEnterScript);
-        todo_wine
         CHECK_CALLED(OnLeaveScript);
     }
 }




More information about the wine-cvs mailing list