Gabriel Ivăncescu : jscript: Reference-count the named items.

Alexandre Julliard julliard at winehq.org
Fri Feb 28 13:54:41 CST 2020


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

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Wed Feb 26 14:41:24 2020 +0200

jscript: Reference-count the named items.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/jscript.c | 12 ++++++++++--
 dlls/jscript/jscript.h |  2 ++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 5e02d4f614..5e9b153ba4 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -143,6 +143,14 @@ named_item_t *lookup_named_item(script_ctx_t *ctx, const WCHAR *item_name, unsig
     return NULL;
 }
 
+void release_named_item(named_item_t *item)
+{
+    if(--item->ref) return;
+
+    heap_free(item->name);
+    heap_free(item);
+}
+
 static inline JScriptError *impl_from_IActiveScriptError(IActiveScriptError *iface)
 {
     return CONTAINING_RECORD(iface, JScriptError, IActiveScriptError_iface);
@@ -415,8 +423,7 @@ static void decrease_state(JScript *This, SCRIPTSTATE state)
 
                     if(iter->disp)
                         IDispatch_Release(iter->disp);
-                    heap_free(iter->name);
-                    heap_free(iter);
+                    release_named_item(iter);
                     iter = iter2;
                 }
 
@@ -833,6 +840,7 @@ static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
         return E_OUTOFMEMORY;
     }
 
+    item->ref = 1;
     item->disp = disp;
     item->flags = dwFlags;
     item->name = heap_strdupW(pstrName);
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 8297838ab3..efd5a54273 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -206,6 +206,7 @@ HRESULT builtin_set_const(script_ctx_t*,jsdisp_t*,jsval_t) DECLSPEC_HIDDEN;
 
 typedef struct named_item_t {
     IDispatch *disp;
+    unsigned ref;
     DWORD flags;
     LPWSTR name;
 
@@ -213,6 +214,7 @@ typedef struct named_item_t {
 } named_item_t;
 
 named_item_t *lookup_named_item(script_ctx_t*,const WCHAR*,unsigned) DECLSPEC_HIDDEN;
+void release_named_item(named_item_t*) DECLSPEC_HIDDEN;
 
 typedef struct {
     const WCHAR *name;




More information about the wine-cvs mailing list