Commit 7e43408e authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

jscript: Use DISPATCH_PROPERTYPUTREF flag when setting a property to VT_DISPATCH.

parent 6a74a078
...@@ -1346,6 +1346,7 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, jsval_t val) ...@@ -1346,6 +1346,7 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, jsval_t val)
jsdisp_release(jsdisp); jsdisp_release(jsdisp);
}else { }else {
DISPID dispid = DISPID_PROPERTYPUT; DISPID dispid = DISPID_PROPERTYPUT;
DWORD flags = DISPATCH_PROPERTYPUT;
VARIANT var; VARIANT var;
DISPPARAMS dp = {&var, &dispid, 1, 1}; DISPPARAMS dp = {&var, &dispid, 1, 1};
IDispatchEx *dispex; IDispatchEx *dispex;
...@@ -1354,17 +1355,20 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, jsval_t val) ...@@ -1354,17 +1355,20 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, jsval_t val)
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
if(V_VT(&var) == VT_DISPATCH)
flags |= DISPATCH_PROPERTYPUTREF;
clear_ei(ctx); clear_ei(ctx);
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(SUCCEEDED(hres)) { if(SUCCEEDED(hres)) {
hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ctx->ei.ei, hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, &dp, NULL, &ctx->ei.ei,
&ctx->jscaller->IServiceProvider_iface); &ctx->jscaller->IServiceProvider_iface);
IDispatchEx_Release(dispex); IDispatchEx_Release(dispex);
}else { }else {
ULONG err = 0; ULONG err = 0;
TRACE("using IDispatch\n"); TRACE("using IDispatch\n");
hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, DISPATCH_PROPERTYPUT, &dp, NULL, &ctx->ei.ei, &err); hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, &dp, NULL, &ctx->ei.ei, &err);
} }
VariantClear(&var); VariantClear(&var);
......
...@@ -80,6 +80,8 @@ DEFINE_EXPECT(global_propget_d); ...@@ -80,6 +80,8 @@ DEFINE_EXPECT(global_propget_d);
DEFINE_EXPECT(global_propget_i); DEFINE_EXPECT(global_propget_i);
DEFINE_EXPECT(global_propput_d); DEFINE_EXPECT(global_propput_d);
DEFINE_EXPECT(global_propput_i); DEFINE_EXPECT(global_propput_i);
DEFINE_EXPECT(global_propputref_d);
DEFINE_EXPECT(global_propputref_i);
DEFINE_EXPECT(global_propdelete_d); DEFINE_EXPECT(global_propdelete_d);
DEFINE_EXPECT(global_nopropdelete_d); DEFINE_EXPECT(global_nopropdelete_d);
DEFINE_EXPECT(global_success_d); DEFINE_EXPECT(global_success_d);
...@@ -136,6 +138,7 @@ DEFINE_EXPECT(DeleteMemberByDispID_false); ...@@ -136,6 +138,7 @@ DEFINE_EXPECT(DeleteMemberByDispID_false);
#define DISPID_GLOBAL_TESTRES 0x1018 #define DISPID_GLOBAL_TESTRES 0x1018
#define DISPID_GLOBAL_TESTNORES 0x1019 #define DISPID_GLOBAL_TESTNORES 0x1019
#define DISPID_GLOBAL_DISPEXFUNC 0x101a #define DISPID_GLOBAL_DISPEXFUNC 0x101a
#define DISPID_GLOBAL_TESTPROPPUTREF 0x101b
#define DISPID_GLOBAL_TESTPROPDELETE 0x2000 #define DISPID_GLOBAL_TESTPROPDELETE 0x2000
#define DISPID_GLOBAL_TESTNOPROPDELETE 0x2001 #define DISPID_GLOBAL_TESTNOPROPDELETE 0x2001
...@@ -608,6 +611,12 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD ...@@ -608,6 +611,12 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
*pid = DISPID_GLOBAL_TESTPROPPUT; *pid = DISPID_GLOBAL_TESTPROPPUT;
return S_OK; return S_OK;
} }
if(!strcmp_wa(bstrName, "testPropPutRef")) {
CHECK_EXPECT(global_propputref_d);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_TESTPROPPUTREF;
return S_OK;
}
if(!strcmp_wa(bstrName, "testPropDelete")) { if(!strcmp_wa(bstrName, "testPropDelete")) {
CHECK_EXPECT(global_propdelete_d); CHECK_EXPECT(global_propdelete_d);
test_grfdex(grfdex, fdexNameCaseSensitive); test_grfdex(grfdex, fdexNameCaseSensitive);
...@@ -841,6 +850,21 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, ...@@ -841,6 +850,21 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg)); ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg));
return S_OK; return S_OK;
case DISPID_GLOBAL_TESTPROPPUTREF:
CHECK_EXPECT(global_propputref_i);
ok(wFlags == (INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF), "wFlags = %x\n", wFlags);
ok(pdp != NULL, "pdp == NULL\n");
ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
ok(!pvarRes, "pvarRes != NULL\n");
ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
return S_OK;
case DISPID_GLOBAL_GETVT: case DISPID_GLOBAL_GETVT:
ok(pdp != NULL, "pdp == NULL\n"); ok(pdp != NULL, "pdp == NULL\n");
ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
...@@ -2049,6 +2073,18 @@ static BOOL run_tests(void) ...@@ -2049,6 +2073,18 @@ static BOOL run_tests(void)
CHECK_CALLED(global_propput_d); CHECK_CALLED(global_propput_d);
CHECK_CALLED(global_propput_i); CHECK_CALLED(global_propput_i);
SET_EXPECT(global_propputref_d);
SET_EXPECT(global_propputref_i);
parse_script_a("testPropPutRef = new Object();");
CHECK_CALLED(global_propputref_d);
CHECK_CALLED(global_propputref_i);
SET_EXPECT(global_propputref_d);
SET_EXPECT(global_propputref_i);
parse_script_a("testPropPutRef = testObj;");
CHECK_CALLED(global_propputref_d);
CHECK_CALLED(global_propputref_i);
SET_EXPECT(global_success_d); SET_EXPECT(global_success_d);
SET_EXPECT(global_success_i); SET_EXPECT(global_success_i);
parse_script_a("reportSuccess();"); parse_script_a("reportSuccess();");
...@@ -2187,6 +2223,12 @@ static BOOL run_tests(void) ...@@ -2187,6 +2223,12 @@ static BOOL run_tests(void)
CHECK_CALLED(global_propget_d); CHECK_CALLED(global_propget_d);
CHECK_CALLED(global_propget_i); CHECK_CALLED(global_propget_i);
SET_EXPECT(global_propputref_d);
SET_EXPECT(global_propputref_i);
parse_script_a("testPropPutRef = nullDisp;");
CHECK_CALLED(global_propputref_d);
CHECK_CALLED(global_propputref_i);
SET_EXPECT(global_propget_d); SET_EXPECT(global_propget_d);
SET_EXPECT(global_propget_i); SET_EXPECT(global_propget_i);
parse_script_a("(function () { this.testPropGet; })();"); parse_script_a("(function () { this.testPropGet; })();");
......
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