Commit 2ae0f440 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

jscript: Added a helper function for setting VARIANT value to jsdisp_t.

parent b66eb177
...@@ -235,12 +235,10 @@ static HRESULT Array_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP ...@@ -235,12 +235,10 @@ static HRESULT Array_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
if(retv) { if(retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, ret);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret); else
}else {
jsdisp_release(ret); jsdisp_release(ret);
}
return S_OK; return S_OK;
} }
...@@ -508,8 +506,7 @@ static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISP ...@@ -508,8 +506,7 @@ static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISP
} }
if(retv) { if(retv) {
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, jsthis);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsthis);
IDispatch_AddRef(V_DISPATCH(retv)); IDispatch_AddRef(V_DISPATCH(retv));
} }
...@@ -640,10 +637,8 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPA ...@@ -640,10 +637,8 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPA
} }
} }
if(retv) { if(retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, arr);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(arr);
}
else else
jsdisp_release(arr); jsdisp_release(arr);
...@@ -750,8 +745,7 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPAR ...@@ -750,8 +745,7 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPAR
if(cmp_func) if(cmp_func)
jsdisp_release(cmp_func); jsdisp_release(cmp_func);
if(retv) { if(retv) {
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, jsthis);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsthis);
IDispatch_AddRef(V_DISPATCH(retv)); IDispatch_AddRef(V_DISPATCH(retv));
} }
return S_OK; return S_OK;
...@@ -856,8 +850,7 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPAR ...@@ -856,8 +850,7 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPAR
return hres; return hres;
if(retv) { if(retv) {
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, jsthis);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsthis);
IDispatch_AddRef(V_DISPATCH(retv)); IDispatch_AddRef(V_DISPATCH(retv));
} }
...@@ -967,10 +960,8 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPP ...@@ -967,10 +960,8 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPP
return hres; return hres;
} }
if(retv) { if(retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, ret_array);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret_array);
}
return S_OK; return S_OK;
} }
...@@ -1153,8 +1144,7 @@ static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, ...@@ -1153,8 +1144,7 @@ static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags,
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, obj);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
return S_OK; return S_OK;
} }
...@@ -1172,8 +1162,7 @@ static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, ...@@ -1172,8 +1162,7 @@ static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags,
return hres; return hres;
} }
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, obj);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
break; break;
} }
default: default:
......
...@@ -137,8 +137,7 @@ static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, ...@@ -137,8 +137,7 @@ static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, bool);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(bool);
return S_OK; return S_OK;
} }
......
...@@ -2575,8 +2575,7 @@ static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, ...@@ -2575,8 +2575,7 @@ static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
} }
} }
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, date);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(date);
return S_OK; return S_OK;
case INVOKE_FUNC: { case INVOKE_FUNC: {
......
...@@ -321,9 +321,7 @@ static HRESULT prop_get(jsdisp_t *This, dispex_prop_t *prop, DISPPARAMS *dp, ...@@ -321,9 +321,7 @@ static HRESULT prop_get(jsdisp_t *This, dispex_prop_t *prop, DISPPARAMS *dp,
break; break;
prop->type = PROP_VARIANT; prop->type = PROP_VARIANT;
V_VT(&prop->u.var) = VT_DISPATCH; var_set_jsdisp(&prop->u.var, obj);
V_DISPATCH(&prop->u.var) = (IDispatch*)_IDispatchEx_(obj);
hres = VariantCopy(retv, &prop->u.var); hres = VariantCopy(retv, &prop->u.var);
}else { }else {
vdisp_t vthis; vdisp_t vthis;
...@@ -839,8 +837,7 @@ HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const built ...@@ -839,8 +837,7 @@ HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const built
jsexcept_t jsexcept; jsexcept_t jsexcept;
VARIANT var; VARIANT var;
V_VT(&var) = VT_DISPATCH; var_set_jsdisp(&var, constr);
V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(constr);
memset(&jsexcept, 0, sizeof(jsexcept)); memset(&jsexcept, 0, sizeof(jsexcept));
hres = prop_put(dispex, prop, &var, &jsexcept, NULL/*FIXME*/); hres = prop_put(dispex, prop, &var, &jsexcept, NULL/*FIXME*/);
} }
......
...@@ -383,8 +383,7 @@ static HRESULT literal_to_var(script_ctx_t *ctx, literal_t *literal, VARIANT *v) ...@@ -383,8 +383,7 @@ static HRESULT literal_to_var(script_ctx_t *ctx, literal_t *literal, VARIANT *v)
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(v) = VT_DISPATCH; var_set_jsdisp(v, regexp);
V_DISPATCH(v) = (IDispatch*)_IDispatchEx_(regexp);
} }
} }
...@@ -433,8 +432,7 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so ...@@ -433,8 +432,7 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(&var) = VT_DISPATCH; var_set_jsdisp(&var, func_obj);
V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(func_obj);
hres = jsdisp_propput_name(ctx->var_disp, func->expr->identifier, &var, ei, NULL); hres = jsdisp_propput_name(ctx->var_disp, func->expr->identifier, &var, ei, NULL);
jsdisp_release(func_obj); jsdisp_release(func_obj);
if(FAILED(hres)) if(FAILED(hres))
...@@ -1353,8 +1351,7 @@ HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD fla ...@@ -1353,8 +1351,7 @@ HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD fla
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(&var) = VT_DISPATCH; var_set_jsdisp(&var, dispex);
V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(dispex);
} }
ret->type = EXPRVAL_VARIANT; ret->type = EXPRVAL_VARIANT;
...@@ -1733,8 +1730,7 @@ HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWOR ...@@ -1733,8 +1730,7 @@ HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWOR
} }
ret->type = EXPRVAL_VARIANT; ret->type = EXPRVAL_VARIANT;
V_VT(&ret->u.var) = VT_DISPATCH; var_set_jsdisp(&ret->u.var, array);
V_DISPATCH(&ret->u.var) = (IDispatch*)_IDispatchEx_(array);
return S_OK; return S_OK;
} }
...@@ -1786,8 +1782,7 @@ HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWO ...@@ -1786,8 +1782,7 @@ HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWO
} }
ret->type = EXPRVAL_VARIANT; ret->type = EXPRVAL_VARIANT;
V_VT(&ret->u.var) = VT_DISPATCH; var_set_jsdisp(&ret->u.var, obj);
V_DISPATCH(&ret->u.var) = (IDispatch*)_IDispatchEx_(obj);
return S_OK; return S_OK;
} }
......
...@@ -265,10 +265,8 @@ static HRESULT error_constr(script_ctx_t *ctx, WORD flags, DISPPARAMS *dp, ...@@ -265,10 +265,8 @@ static HRESULT error_constr(script_ctx_t *ctx, WORD flags, DISPPARAMS *dp,
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
if(retv) { if(retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, err);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(err);
}
else else
jsdisp_release(err); jsdisp_release(err);
...@@ -411,12 +409,8 @@ static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCH ...@@ -411,12 +409,8 @@ static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCH
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
if(!ei) if(ei)
return id; var_set_jsdisp(&ei->var, err);
V_VT(&ei->var) = VT_DISPATCH;
V_DISPATCH(&ei->var) = (IDispatch*)_IDispatchEx_(err);
return id; return id;
} }
......
...@@ -170,8 +170,7 @@ static HRESULT create_var_disp(script_ctx_t *ctx, FunctionInstance *function, js ...@@ -170,8 +170,7 @@ static HRESULT create_var_disp(script_ctx_t *ctx, FunctionInstance *function, js
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(&var) = VT_DISPATCH; var_set_jsdisp(&var, arg_disp);
V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(arg_disp);
hres = jsdisp_propput_name(var_disp, argumentsW, &var, ei, caller); hres = jsdisp_propput_name(var_disp, argumentsW, &var, ei, caller);
if(SUCCEEDED(hres)) if(SUCCEEDED(hres))
hres = init_parameters(var_disp, function, dp, ei, caller); hres = init_parameters(var_disp, function, dp, ei, caller);
...@@ -246,13 +245,13 @@ static HRESULT invoke_constructor(script_ctx_t *ctx, FunctionInstance *function, ...@@ -246,13 +245,13 @@ static HRESULT invoke_constructor(script_ctx_t *ctx, FunctionInstance *function,
return hres; return hres;
} }
V_VT(retv) = VT_DISPATCH;
if(V_VT(&var) == VT_DISPATCH) { if(V_VT(&var) == VT_DISPATCH) {
jsdisp_release(this_obj); jsdisp_release(this_obj);
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = V_DISPATCH(&var); V_DISPATCH(retv) = V_DISPATCH(&var);
}else { }else {
VariantClear(&var); VariantClear(&var);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(this_obj); var_set_jsdisp(retv, this_obj);
} }
return S_OK; return S_OK;
} }
...@@ -549,8 +548,7 @@ static HRESULT Function_arguments(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags ...@@ -549,8 +548,7 @@ static HRESULT Function_arguments(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
case DISPATCH_PROPERTYGET: { case DISPATCH_PROPERTYGET: {
if(function->arguments) { if(function->arguments) {
IDispatchEx_AddRef(_IDispatchEx_(function->arguments)); IDispatchEx_AddRef(_IDispatchEx_(function->arguments));
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, function->arguments);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(function->arguments);
}else { }else {
V_VT(retv) = VT_NULL; V_VT(retv) = VT_NULL;
} }
...@@ -625,8 +623,7 @@ static HRESULT set_prototype(script_ctx_t *ctx, jsdisp_t *dispex, jsdisp_t *prot ...@@ -625,8 +623,7 @@ static HRESULT set_prototype(script_ctx_t *ctx, jsdisp_t *dispex, jsdisp_t *prot
jsexcept_t jsexcept; jsexcept_t jsexcept;
VARIANT var; VARIANT var;
V_VT(&var) = VT_DISPATCH; var_set_jsdisp(&var, prototype);
V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(prototype);
memset(&jsexcept, 0, sizeof(jsexcept)); memset(&jsexcept, 0, sizeof(jsexcept));
return jsdisp_propput_name(dispex, prototypeW, &var, &jsexcept, NULL/*FIXME*/); return jsdisp_propput_name(dispex, prototypeW, &var, &jsexcept, NULL/*FIXME*/);
......
...@@ -112,8 +112,7 @@ static HRESULT constructor_call(jsdisp_t *constr, WORD flags, DISPPARAMS *dp, ...@@ -112,8 +112,7 @@ static HRESULT constructor_call(jsdisp_t *constr, WORD flags, DISPPARAMS *dp,
if(flags != DISPATCH_PROPERTYGET) if(flags != DISPATCH_PROPERTYGET)
return jsdisp_call_value(constr, flags, dp, retv, ei, sp); return jsdisp_call_value(constr, flags, dp, retv, ei, sp);
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, constr);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(constr);
IDispatchEx_AddRef(_IDispatchEx_(constr)); IDispatchEx_AddRef(_IDispatchEx_(constr));
return S_OK; return S_OK;
} }
...@@ -1136,8 +1135,7 @@ HRESULT init_global(script_ctx_t *ctx) ...@@ -1136,8 +1135,7 @@ HRESULT init_global(script_ctx_t *ctx)
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(&var) = VT_DISPATCH; var_set_jsdisp(&var, math);
V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(math);
hres = jsdisp_propput_name(ctx->global, MathW, &var, NULL/*FIXME*/, NULL/*FIXME*/); hres = jsdisp_propput_name(ctx->global, MathW, &var, NULL/*FIXME*/, NULL/*FIXME*/);
jsdisp_release(math); jsdisp_release(math);
if(FAILED(hres)) if(FAILED(hres))
......
...@@ -187,6 +187,11 @@ struct jsdisp_t { ...@@ -187,6 +187,11 @@ struct jsdisp_t {
#define _IDispatchEx_(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl) #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) static inline void jsdisp_release(jsdisp_t *jsdisp)
{ {
IDispatchEx_Release(_IDispatchEx_(jsdisp)); IDispatchEx_Release(_IDispatchEx_(jsdisp));
...@@ -403,6 +408,12 @@ static inline void num_set_inf(VARIANT *v, BOOL positive) ...@@ -403,6 +408,12 @@ static inline void num_set_inf(VARIANT *v, BOOL positive)
#endif #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) static inline DWORD make_grfdex(script_ctx_t *ctx, DWORD flags)
{ {
return (ctx->version << 28) | flags; return (ctx->version << 28) | flags;
......
...@@ -302,8 +302,7 @@ static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags ...@@ -302,8 +302,7 @@ static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, obj);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
break; break;
} }
default: default:
......
...@@ -210,8 +210,7 @@ static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags ...@@ -210,8 +210,7 @@ static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, obj);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
break; break;
} }
......
...@@ -3987,12 +3987,10 @@ HRESULT regexp_string_match(script_ctx_t *ctx, jsdisp_t *re, BSTR str, ...@@ -3987,12 +3987,10 @@ HRESULT regexp_string_match(script_ctx_t *ctx, jsdisp_t *re, BSTR str,
heap_free(match_result); heap_free(match_result);
if(SUCCEEDED(hres) && retv) { if(SUCCEEDED(hres) && retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, array);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); else
}else {
jsdisp_release(array); jsdisp_release(array);
}
return hres; return hres;
} }
...@@ -4066,12 +4064,10 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags ...@@ -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); return throw_regexp_error(ctx, ei, IDS_REGEXP_SYNTAX_ERROR, NULL);
} }
if(retv) { if(retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, jsdisp);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(jsdisp); else
}else {
jsdisp_release(jsdisp); jsdisp_release(jsdisp);
}
return S_OK; return S_OK;
} }
jsdisp_release(jsdisp); jsdisp_release(jsdisp);
...@@ -4092,12 +4088,10 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags ...@@ -4092,12 +4088,10 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
if(retv) { if(retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, ret);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret); else
}else {
jsdisp_release(ret); jsdisp_release(ret);
}
return S_OK; return S_OK;
} }
default: default:
......
...@@ -1267,12 +1267,10 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP ...@@ -1267,12 +1267,10 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
SysFreeString(val_str); SysFreeString(val_str);
heap_free(match_result); heap_free(match_result);
if(SUCCEEDED(hres) && retv) { if(SUCCEEDED(hres) && retv)
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, array);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); else
}else {
jsdisp_release(array); jsdisp_release(array);
}
return hres; return hres;
} }
...@@ -1674,8 +1672,7 @@ static HRESULT StringConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags ...@@ -1674,8 +1672,7 @@ static HRESULT StringConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
V_VT(retv) = VT_DISPATCH; var_set_jsdisp(retv, ret);
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(ret);
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment