From 2ae0f44033049d4b747fce61fa06a8b4980abe2a Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 7 Sep 2010 15:41:40 +0200 Subject: [PATCH] jscript: Added a helper function for setting VARIANT value to jsdisp_t. --- dlls/jscript/array.c | 35 ++++++++++++----------------------- dlls/jscript/bool.c | 3 +-- dlls/jscript/date.c | 3 +-- dlls/jscript/dispex.c | 7 ++----- dlls/jscript/engine.c | 15 +++++---------- dlls/jscript/error.c | 14 ++++---------- dlls/jscript/function.c | 13 +++++-------- dlls/jscript/global.c | 6 ++---- dlls/jscript/jscript.h | 11 +++++++++++ dlls/jscript/number.c | 3 +-- dlls/jscript/object.c | 3 +-- dlls/jscript/regexp.c | 24 +++++++++--------------- dlls/jscript/string.c | 11 ++++------- 13 files changed, 58 insertions(+), 90 deletions(-) diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index a765ae9e9de..f267b384e16 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -235,12 +235,10 @@ static HRESULT Array_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP if(FAILED(hres)) return hres; - if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret); - }else { + if(retv) + var_set_jsdisp(retv, ret); + else jsdisp_release(ret); - } return S_OK; } @@ -508,8 +506,7 @@ static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISP } if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsthis); + var_set_jsdisp(retv, jsthis); IDispatch_AddRef(V_DISPATCH(retv)); } @@ -640,10 +637,8 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPA } } - if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(arr); - } + if(retv) + var_set_jsdisp(retv, arr); else jsdisp_release(arr); @@ -750,8 +745,7 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPAR if(cmp_func) jsdisp_release(cmp_func); if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsthis); + var_set_jsdisp(retv, jsthis); IDispatch_AddRef(V_DISPATCH(retv)); } return S_OK; @@ -856,8 +850,7 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPAR return hres; if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsthis); + var_set_jsdisp(retv, jsthis); IDispatch_AddRef(V_DISPATCH(retv)); } @@ -967,10 +960,8 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPP return hres; } - if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret_array); - } + if(retv) + var_set_jsdisp(retv, ret_array); return S_OK; } @@ -1153,8 +1144,7 @@ static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, if(FAILED(hres)) return hres; - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj); + var_set_jsdisp(retv, obj); return S_OK; } @@ -1172,8 +1162,7 @@ static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, return hres; } - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj); + var_set_jsdisp(retv, obj); break; } default: diff --git a/dlls/jscript/bool.c b/dlls/jscript/bool.c index 651a6cd33a9..3e4349b3b9b 100644 --- a/dlls/jscript/bool.c +++ b/dlls/jscript/bool.c @@ -137,8 +137,7 @@ static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, if(FAILED(hres)) return hres; - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(bool); + var_set_jsdisp(retv, bool); return S_OK; } diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index c5e4ee2f96b..d058f8f10b1 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -2575,8 +2575,7 @@ static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, } } - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(date); + var_set_jsdisp(retv, date); return S_OK; case INVOKE_FUNC: { diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 5a87bac8a39..9739aa8373c 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -321,9 +321,7 @@ static HRESULT prop_get(jsdisp_t *This, dispex_prop_t *prop, DISPPARAMS *dp, break; prop->type = PROP_VARIANT; - V_VT(&prop->u.var) = VT_DISPATCH; - V_DISPATCH(&prop->u.var) = (IDispatch*)_IDispatchEx_(obj); - + var_set_jsdisp(&prop->u.var, obj); hres = VariantCopy(retv, &prop->u.var); }else { vdisp_t vthis; @@ -839,8 +837,7 @@ HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const built jsexcept_t jsexcept; VARIANT var; - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(constr); + var_set_jsdisp(&var, constr); memset(&jsexcept, 0, sizeof(jsexcept)); hres = prop_put(dispex, prop, &var, &jsexcept, NULL/*FIXME*/); } diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 99f365408ca..0556d69b8e0 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -383,8 +383,7 @@ static HRESULT literal_to_var(script_ctx_t *ctx, literal_t *literal, VARIANT *v) if(FAILED(hres)) return hres; - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = (IDispatch*)_IDispatchEx_(regexp); + var_set_jsdisp(v, regexp); } } @@ -433,8 +432,7 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so if(FAILED(hres)) return hres; - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(func_obj); + var_set_jsdisp(&var, func_obj); hres = jsdisp_propput_name(ctx->var_disp, func->expr->identifier, &var, ei, NULL); jsdisp_release(func_obj); if(FAILED(hres)) @@ -1353,8 +1351,7 @@ HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD fla if(FAILED(hres)) return hres; - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(dispex); + var_set_jsdisp(&var, dispex); } ret->type = EXPRVAL_VARIANT; @@ -1733,8 +1730,7 @@ HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWOR } ret->type = EXPRVAL_VARIANT; - V_VT(&ret->u.var) = VT_DISPATCH; - V_DISPATCH(&ret->u.var) = (IDispatch*)_IDispatchEx_(array); + var_set_jsdisp(&ret->u.var, array); return S_OK; } @@ -1786,8 +1782,7 @@ HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWO } ret->type = EXPRVAL_VARIANT; - V_VT(&ret->u.var) = VT_DISPATCH; - V_DISPATCH(&ret->u.var) = (IDispatch*)_IDispatchEx_(obj); + var_set_jsdisp(&ret->u.var, obj); return S_OK; } diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c index ae9ddfaea48..a8f1dcd076d 100644 --- a/dlls/jscript/error.c +++ b/dlls/jscript/error.c @@ -265,10 +265,8 @@ static HRESULT error_constr(script_ctx_t *ctx, WORD flags, DISPPARAMS *dp, if(FAILED(hres)) return hres; - if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(err); - } + if(retv) + var_set_jsdisp(retv, err); else jsdisp_release(err); @@ -411,12 +409,8 @@ static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCH if(FAILED(hres)) return hres; - if(!ei) - return id; - - V_VT(&ei->var) = VT_DISPATCH; - V_DISPATCH(&ei->var) = (IDispatch*)_IDispatchEx_(err); - + if(ei) + var_set_jsdisp(&ei->var, err); return id; } diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index 8c4c1fc9208..8b5638d0a7d 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -170,8 +170,7 @@ static HRESULT create_var_disp(script_ctx_t *ctx, FunctionInstance *function, js if(FAILED(hres)) return hres; - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(arg_disp); + var_set_jsdisp(&var, arg_disp); hres = jsdisp_propput_name(var_disp, argumentsW, &var, ei, caller); if(SUCCEEDED(hres)) hres = init_parameters(var_disp, function, dp, ei, caller); @@ -246,13 +245,13 @@ static HRESULT invoke_constructor(script_ctx_t *ctx, FunctionInstance *function, return hres; } - V_VT(retv) = VT_DISPATCH; if(V_VT(&var) == VT_DISPATCH) { jsdisp_release(this_obj); + V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = V_DISPATCH(&var); }else { VariantClear(&var); - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(this_obj); + var_set_jsdisp(retv, this_obj); } return S_OK; } @@ -549,8 +548,7 @@ static HRESULT Function_arguments(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags case DISPATCH_PROPERTYGET: { if(function->arguments) { IDispatchEx_AddRef(_IDispatchEx_(function->arguments)); - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(function->arguments); + var_set_jsdisp(retv, function->arguments); }else { V_VT(retv) = VT_NULL; } @@ -625,8 +623,7 @@ static HRESULT set_prototype(script_ctx_t *ctx, jsdisp_t *dispex, jsdisp_t *prot jsexcept_t jsexcept; VARIANT var; - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(prototype); + var_set_jsdisp(&var, prototype); memset(&jsexcept, 0, sizeof(jsexcept)); return jsdisp_propput_name(dispex, prototypeW, &var, &jsexcept, NULL/*FIXME*/); diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c index 497002456c2..eef57c4c96b 100644 --- a/dlls/jscript/global.c +++ b/dlls/jscript/global.c @@ -112,8 +112,7 @@ static HRESULT constructor_call(jsdisp_t *constr, WORD flags, DISPPARAMS *dp, if(flags != DISPATCH_PROPERTYGET) return jsdisp_call_value(constr, flags, dp, retv, ei, sp); - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(constr); + var_set_jsdisp(retv, constr); IDispatchEx_AddRef(_IDispatchEx_(constr)); return S_OK; } @@ -1136,8 +1135,7 @@ HRESULT init_global(script_ctx_t *ctx) if(FAILED(hres)) return hres; - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(math); + var_set_jsdisp(&var, math); hres = jsdisp_propput_name(ctx->global, MathW, &var, NULL/*FIXME*/, NULL/*FIXME*/); jsdisp_release(math); if(FAILED(hres)) diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index be79c196abc..5ed7e8ff662 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -187,6 +187,11 @@ struct jsdisp_t { #define _IDispatchEx_(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl) +static inline IDispatch *to_disp(jsdisp_t *jsdisp) +{ + return (IDispatch*)&jsdisp->lpIDispatchExVtbl; +} + static inline void jsdisp_release(jsdisp_t *jsdisp) { IDispatchEx_Release(_IDispatchEx_(jsdisp)); @@ -403,6 +408,12 @@ static inline void num_set_inf(VARIANT *v, BOOL positive) #endif } +static inline void var_set_jsdisp(VARIANT *v, jsdisp_t *jsdisp) +{ + V_VT(v) = VT_DISPATCH; + V_DISPATCH(v) = to_disp(jsdisp); +} + static inline DWORD make_grfdex(script_ctx_t *ctx, DWORD flags) { return (ctx->version << 28) | flags; diff --git a/dlls/jscript/number.c b/dlls/jscript/number.c index 52642e8d286..eef284466fc 100644 --- a/dlls/jscript/number.c +++ b/dlls/jscript/number.c @@ -302,8 +302,7 @@ static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags if(FAILED(hres)) return hres; - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj); + var_set_jsdisp(retv, obj); break; } default: diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 7ca33d32951..05eb509778b 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -210,8 +210,7 @@ static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags if(FAILED(hres)) return hres; - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj); + var_set_jsdisp(retv, obj); break; } diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index 3e80f59dfa5..82a0a94cad3 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -3987,12 +3987,10 @@ HRESULT regexp_string_match(script_ctx_t *ctx, jsdisp_t *re, BSTR str, heap_free(match_result); - if(SUCCEEDED(hres) && retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); - }else { + if(SUCCEEDED(hres) && retv) + var_set_jsdisp(retv, array); + else jsdisp_release(array); - } return hres; } @@ -4066,12 +4064,10 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags return throw_regexp_error(ctx, ei, IDS_REGEXP_SYNTAX_ERROR, NULL); } - if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsdisp); - }else { + if(retv) + var_set_jsdisp(retv, jsdisp); + else jsdisp_release(jsdisp); - } return S_OK; } jsdisp_release(jsdisp); @@ -4092,12 +4088,10 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags if(FAILED(hres)) return hres; - if(retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret); - }else { + if(retv) + var_set_jsdisp(retv, ret); + else jsdisp_release(ret); - } return S_OK; } default: diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index 25047f1091f..6febbc598ad 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -1267,12 +1267,10 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP SysFreeString(val_str); heap_free(match_result); - if(SUCCEEDED(hres) && retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); - }else { + if(SUCCEEDED(hres) && retv) + var_set_jsdisp(retv, array); + else jsdisp_release(array); - } return hres; } @@ -1674,8 +1672,7 @@ static HRESULT StringConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags if(FAILED(hres)) return hres; - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret); + var_set_jsdisp(retv, ret); break; }