Jacek Caban : jscript: Added QueryService(SID_VariantConversion) implementation.

Alexandre Julliard julliard at winehq.org
Mon Mar 12 11:59:59 CDT 2012


Module: wine
Branch: master
Commit: c6360c3e6e7fc3d82c436580320eaafc4af3bf3c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c6360c3e6e7fc3d82c436580320eaafc4af3bf3c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar 12 12:12:40 2012 +0100

jscript: Added QueryService(SID_VariantConversion) implementation.

---

 dlls/jscript/jscript.c |    6 +++++-
 dlls/jscript/jscript.h |    1 +
 dlls/jscript/jsutils.c |   11 ++++++++++-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 1ca5f9c..45edeb1 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -72,6 +72,7 @@ void script_release(script_ctx_t *ctx)
     jsheap_free(&ctx->tmp_heap);
     SysFreeString(ctx->last_match);
 
+    ctx->jscaller->ctx = NULL;
     IServiceProvider_Release(&ctx->jscaller->IServiceProvider_iface);
 
     heap_free(ctx);
@@ -411,8 +412,10 @@ static ULONG WINAPI JScript_Release(IActiveScript *iface)
     if(!ref) {
         if(This->ctx && This->ctx->state != SCRIPTSTATE_CLOSED)
             IActiveScript_Close(&This->IActiveScript_iface);
-        if(This->ctx)
+        if(This->ctx) {
+            This->ctx->active_script = NULL;
             script_release(This->ctx);
+        }
         heap_free(This);
         unlock_module();
     }
@@ -709,6 +712,7 @@ static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
 
     ctx->ref = 1;
     ctx->state = SCRIPTSTATE_UNINITIALIZED;
+    ctx->active_script = &This->IActiveScript_iface;
     ctx->safeopt = This->safeopt;
     ctx->version = This->version;
     jsheap_init(&ctx->tmp_heap);
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 47df16d..cdb8eb6 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -293,6 +293,7 @@ struct _script_ctx_t {
     LONG ref;
 
     SCRIPTSTATE state;
+    IActiveScript *active_script;
 
     exec_ctx_t *exec_ctx;
     named_item_t *named_items;
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 6d77fe1..b9a35db 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -20,6 +20,7 @@
 #include "wine/port.h"
 
 #include <math.h>
+#include <assert.h>
 
 #include "jscript.h"
 #include "engine.h"
@@ -769,8 +770,10 @@ static ULONG WINAPI JSCaller_Release(IServiceProvider *iface)
 
     TRACE("(%p) ref=%d\n", This, ref);
 
-    if(!ref)
+    if(!ref) {
+        assert(!This->ctx);
         heap_free(This);
+    }
 
     return ref;
 }
@@ -780,6 +783,11 @@ static HRESULT WINAPI JSCaller_QueryService(IServiceProvider *iface, REFGUID gui
 {
     JSCaller *This = impl_from_IServiceProvider(iface);
 
+    if(IsEqualGUID(guidService, &SID_VariantConversion) && This->ctx && This->ctx->active_script) {
+        TRACE("(%p)->(SID_VariantConversion)\n", This);
+        return IActiveScript_QueryInterface(This->ctx->active_script, riid, ppv);
+    }
+
     FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
 
     *ppv = NULL;
@@ -803,6 +811,7 @@ HRESULT create_jscaller(script_ctx_t *ctx)
 
     ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
     ret->ref = 1;
+    ret->ctx = ctx;
 
     ctx->jscaller = ret;
     return S_OK;




More information about the wine-cvs mailing list