jscript: Added support for VT_I2 in invoke_prop_func.

This commit is contained in:
Jacek Caban 2012-05-01 15:05:07 +02:00 committed by Alexandre Julliard
parent da125450da
commit c9c8c6165e
2 changed files with 53 additions and 2 deletions

View File

@ -333,6 +333,49 @@ static HRESULT set_this(DISPPARAMS *dp, DISPPARAMS *olddp, IDispatch *jsthis)
return S_OK; return S_OK;
} }
static HRESULT convert_params(const DISPPARAMS *dp, VARIANT *buf, DISPPARAMS *ret)
{
BOOL need_conversion = FALSE;
const VARIANT *s;
VARIANT *d;
unsigned i;
*ret = *dp;
for(i = 0; i < ret->cArgs; i++) {
if(V_VT(get_arg(dp, i)) == VT_I2) {
need_conversion = TRUE;
break;
}
}
if(!need_conversion)
return S_OK;
if(ret->cArgs > 6) {
ret->rgvarg = heap_alloc(ret->cArgs * sizeof(VARIANT));
if(!ret->rgvarg)
return E_OUTOFMEMORY;
}else {
ret->rgvarg = buf;
}
for(i = 0; i < ret->cArgs; i++) {
s = get_arg(dp, i);
d = get_arg(ret, i);
switch(V_VT(s)) {
case VT_I2:
V_VT(d) = VT_I4;
V_I4(d) = V_I2(s);
break;
default:
*d = *s;
}
}
return S_OK;
}
static HRESULT invoke_prop_func(jsdisp_t *This, jsdisp_t *jsthis, dispex_prop_t *prop, WORD flags, static HRESULT invoke_prop_func(jsdisp_t *This, jsdisp_t *jsthis, dispex_prop_t *prop, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{ {
@ -340,6 +383,8 @@ static HRESULT invoke_prop_func(jsdisp_t *This, jsdisp_t *jsthis, dispex_prop_t
switch(prop->type) { switch(prop->type) {
case PROP_BUILTIN: { case PROP_BUILTIN: {
DISPPARAMS params;
VARIANT buf[6];
vdisp_t vthis; vdisp_t vthis;
if(flags == DISPATCH_CONSTRUCT && (prop->flags & PROPF_METHOD)) { if(flags == DISPATCH_CONSTRUCT && (prop->flags & PROPF_METHOD)) {
@ -347,9 +392,15 @@ static HRESULT invoke_prop_func(jsdisp_t *This, jsdisp_t *jsthis, dispex_prop_t
return E_INVALIDARG; return E_INVALIDARG;
} }
hres = convert_params(dp, buf, &params);
if(FAILED(hres))
return hres;
set_jsdisp(&vthis, jsthis); set_jsdisp(&vthis, jsthis);
hres = prop->u.p->invoke(This->ctx, &vthis, flags, dp, retv, ei); hres = prop->u.p->invoke(This->ctx, &vthis, flags, &params, retv, ei);
vdisp_release(&vthis); vdisp_release(&vthis);
if(params.rgvarg != buf && params.rgvarg != dp->rgvarg)
heap_free(params.rgvarg);
return hres; return hres;
} }
case PROP_PROTREF: case PROP_PROTREF:

View File

@ -375,7 +375,7 @@ HRESULT regexp_match(script_ctx_t*,jsdisp_t*,const WCHAR*,DWORD,BOOL,match_resul
HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*) DECLSPEC_HIDDEN; HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*) DECLSPEC_HIDDEN;
HRESULT regexp_string_match(script_ctx_t*,jsdisp_t*,BSTR,VARIANT*,jsexcept_t*) DECLSPEC_HIDDEN; HRESULT regexp_string_match(script_ctx_t*,jsdisp_t*,BSTR,VARIANT*,jsexcept_t*) DECLSPEC_HIDDEN;
static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i) static inline VARIANT *get_arg(const DISPPARAMS *dp, DWORD i)
{ {
return dp->rgvarg + dp->cArgs-i-1; return dp->rgvarg + dp->cArgs-i-1;
} }