Jacek Caban : mshtml: Support type conversion in functions with arguments using default values.

Alexandre Julliard julliard at winehq.org
Mon Apr 15 16:26:41 CDT 2019


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Apr 15 16:38:38 2019 +0200

mshtml: Support type conversion in functions with arguments using default values.

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

---

 dlls/mshtml/dispex.c | 41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 02ba5d4..e1c33b9 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -49,6 +49,10 @@ static CRITICAL_SECTION cs_dispex_static_data = { &cs_dispex_static_data_dbg, -1
 static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
 
 typedef struct {
+    VARIANT default_value;
+} func_arg_info_t;
+
+typedef struct {
     DISPID id;
     BSTR name;
     tid_t tid;
@@ -58,8 +62,10 @@ typedef struct {
     SHORT get_vtbl_off;
     SHORT func_disp_idx;
     USHORT argc;
+    USHORT default_value_cnt;
     VARTYPE prop_vt;
     VARTYPE *arg_types;
+    func_arg_info_t *arg_info;
 } func_info_t;
 
 struct dispex_data_t {
@@ -165,14 +171,21 @@ static HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
 void release_typelib(void)
 {
     dispex_data_t *iter;
-    unsigned i;
+    unsigned i, j;
 
     while(!list_empty(&dispex_data_list)) {
         iter = LIST_ENTRY(list_head(&dispex_data_list), dispex_data_t, entry);
         list_remove(&iter->entry);
 
-        for(i=0; i < iter->func_cnt; i++)
+        for(i = 0; i < iter->func_cnt; i++) {
+            if(iter->funcs[i].default_value_cnt && iter->funcs[i].arg_info) {
+                for(j = 0; j < iter->funcs[i].argc; j++)
+                    VariantClear(&iter->funcs[i].arg_info[j].default_value);
+            }
+            heap_free(iter->funcs[i].arg_types);
+            heap_free(iter->funcs[i].arg_info);
             SysFreeString(iter->funcs[i].name);
+        }
 
         heap_free(iter->funcs);
         heap_free(iter->name_table);
@@ -283,7 +296,11 @@ static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc,
 
         info->arg_types = heap_alloc(sizeof(*info->arg_types) * info->argc);
         if(!info->arg_types)
-            return; /* FIXME: real error instead of fallback */
+            return;
+        info->arg_info = heap_alloc_zero(sizeof(*info->arg_info) * info->argc);
+        if(!info->arg_types)
+            return;
+
 
         for(i=0; i < info->argc; i++)
             info->arg_types[i] = desc->lprgelemdescParam[i].tdesc.vt;
@@ -305,8 +322,15 @@ static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc,
             }
 
             if(desc->lprgelemdescParam[i].u.paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT) {
-                TRACE("%s param %d: default value\n", debugstr_w(info->name), i);
-                return; /* Fallback to ITypeInfo::Invoke */
+                hres = VariantCopy(&info->arg_info[i].default_value,
+                                   &desc->lprgelemdescParam[i].u.paramdesc.pparamdescex->varDefaultValue);
+                if(FAILED(hres)) {
+                    ERR("Could not copy default value: %08x\n", hres);
+                    return;
+                }
+                TRACE("%s param %d: default value %s\n", debugstr_w(info->name),
+                      i, debugstr_variant(&info->arg_info[i].default_value));
+                info->default_value_cnt++;
             }
         }
 
@@ -1090,7 +1114,7 @@ static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISP
         return E_NOTIMPL;
     }
 
-    if(dp->cArgs != func->argc) {
+    if(dp->cArgs > func->argc || dp->cArgs + func->default_value_cnt < func->argc) {
         FIXME("Invalid argument count (expected %u, got %u)\n", func->argc, dp->cArgs);
         return E_INVALIDARG;
     }
@@ -1100,6 +1124,11 @@ static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISP
         return hres;
 
     for(i=0; i < func->argc; i++) {
+        if(i >= dp->cArgs) {
+            /* use default value */
+            arg_ptrs[i] = &func->arg_info[i].default_value;
+            continue;
+        }
         arg = dp->rgvarg+dp->cArgs-i-1;
         if(func->arg_types[i] == V_VT(arg)) {
             arg_ptrs[i] = arg;




More information about the wine-cvs mailing list