vbscript: Added more releasing tests.
This commit is contained in:
parent
6f0e215fb5
commit
01c4fed7b4
@ -74,6 +74,7 @@ DEFINE_EXPECT(testobj_propput_i);
|
|||||||
#define DISPID_GLOBAL_TESTOBJ 1006
|
#define DISPID_GLOBAL_TESTOBJ 1006
|
||||||
#define DISPID_GLOBAL_ISNULLDISP 1007
|
#define DISPID_GLOBAL_ISNULLDISP 1007
|
||||||
#define DISPID_GLOBAL_TESTDISP 1008
|
#define DISPID_GLOBAL_TESTDISP 1008
|
||||||
|
#define DISPID_GLOBAL_REFOBJ 1009
|
||||||
|
|
||||||
#define DISPID_TESTOBJ_PROPGET 2000
|
#define DISPID_TESTOBJ_PROPGET 2000
|
||||||
#define DISPID_TESTOBJ_PROPPUT 2001
|
#define DISPID_TESTOBJ_PROPPUT 2001
|
||||||
@ -342,6 +343,7 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid,
|
|||||||
else
|
else
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
|
|
||||||
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,6 +422,19 @@ static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown
|
|||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
|
||||||
|
{
|
||||||
|
ok(0, "unexpected call\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
|
||||||
|
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
|
||||||
|
{
|
||||||
|
ok(0, "unexpected call\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
|
static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
|
||||||
{
|
{
|
||||||
if(!strcmp_wa(bstrName, "propget")) {
|
if(!strcmp_wa(bstrName, "propget")) {
|
||||||
@ -500,6 +515,38 @@ static IDispatchExVtbl testObjVtbl = {
|
|||||||
|
|
||||||
static IDispatchEx testObj = { &testObjVtbl };
|
static IDispatchEx testObj = { &testObjVtbl };
|
||||||
|
|
||||||
|
static ULONG refobj_ref;
|
||||||
|
|
||||||
|
static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
|
||||||
|
{
|
||||||
|
return ++refobj_ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
|
||||||
|
{
|
||||||
|
return --refobj_ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IDispatchExVtbl RefObjVtbl = {
|
||||||
|
DispatchEx_QueryInterface,
|
||||||
|
RefObj_AddRef,
|
||||||
|
RefObj_Release,
|
||||||
|
DispatchEx_GetTypeInfoCount,
|
||||||
|
DispatchEx_GetTypeInfo,
|
||||||
|
DispatchEx_GetIDsOfNames,
|
||||||
|
DispatchEx_Invoke,
|
||||||
|
DispatchEx_GetDispID,
|
||||||
|
DispatchEx_InvokeEx,
|
||||||
|
DispatchEx_DeleteMemberByName,
|
||||||
|
DispatchEx_DeleteMemberByDispID,
|
||||||
|
DispatchEx_GetMemberProperties,
|
||||||
|
DispatchEx_GetMemberName,
|
||||||
|
DispatchEx_GetNextDispID,
|
||||||
|
DispatchEx_GetNameSpaceParent
|
||||||
|
};
|
||||||
|
|
||||||
|
static IDispatchEx RefObj = { &RefObjVtbl };
|
||||||
|
|
||||||
static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
|
static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
|
||||||
{
|
{
|
||||||
if(!strcmp_wa(bstrName, "ok")) {
|
if(!strcmp_wa(bstrName, "ok")) {
|
||||||
@ -549,6 +596,11 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
|
|||||||
*pid = DISPID_GLOBAL_TESTDISP;
|
*pid = DISPID_GLOBAL_TESTDISP;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
if(!strcmp_wa(bstrName, "RefObj")) {
|
||||||
|
test_grfdex(grfdex, fdexNameCaseInsensitive);
|
||||||
|
*pid = DISPID_GLOBAL_REFOBJ;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
if(strict_dispid_check && strcmp_wa(bstrName, "x"))
|
if(strict_dispid_check && strcmp_wa(bstrName, "x"))
|
||||||
ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
|
ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
|
||||||
@ -679,6 +731,22 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
|
|||||||
V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
|
V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
|
case DISPID_GLOBAL_REFOBJ:
|
||||||
|
ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
|
||||||
|
|
||||||
|
ok(pdp != NULL, "pdp == NULL\n");
|
||||||
|
ok(!pdp->rgvarg, "rgvarg == NULL\n");
|
||||||
|
ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
|
||||||
|
ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
|
||||||
|
ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
|
||||||
|
ok(pvarRes != NULL, "pvarRes == NULL\n");
|
||||||
|
ok(pei != NULL, "pei == NULL\n");
|
||||||
|
|
||||||
|
IDispatchEx_AddRef(&RefObj);
|
||||||
|
V_VT(pvarRes) = VT_DISPATCH;
|
||||||
|
V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
case DISPID_GLOBAL_ISNULLDISP: {
|
case DISPID_GLOBAL_ISNULLDISP: {
|
||||||
VARIANT *v;
|
VARIANT *v;
|
||||||
|
|
||||||
@ -850,6 +918,7 @@ static HRESULT parse_script(DWORD flags, BSTR script_str)
|
|||||||
IActiveScriptParse *parser;
|
IActiveScriptParse *parser;
|
||||||
IActiveScript *engine;
|
IActiveScript *engine;
|
||||||
IDispatch *script_disp;
|
IDispatch *script_disp;
|
||||||
|
LONG ref;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
engine = create_script();
|
engine = create_script();
|
||||||
@ -888,8 +957,9 @@ static HRESULT parse_script(DWORD flags, BSTR script_str)
|
|||||||
|
|
||||||
IDispatch_Release(script_disp);
|
IDispatch_Release(script_disp);
|
||||||
IActiveScript_Release(engine);
|
IActiveScript_Release(engine);
|
||||||
IUnknown_Release(parser);
|
|
||||||
|
|
||||||
|
ref = IUnknown_Release(parser);
|
||||||
|
ok(!ref, "ref=%d\n", ref);
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -964,6 +1034,63 @@ static void test_gc(void)
|
|||||||
IUnknown_Release(parser);
|
IUnknown_Release(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT test_global_vars_ref(BOOL use_close)
|
||||||
|
{
|
||||||
|
IActiveScriptParse *parser;
|
||||||
|
IActiveScript *engine;
|
||||||
|
BSTR script_str;
|
||||||
|
LONG ref;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
engine = create_script();
|
||||||
|
if(!engine)
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
|
||||||
|
ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
|
||||||
|
if (FAILED(hres))
|
||||||
|
{
|
||||||
|
IActiveScript_Release(engine);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = IActiveScriptParse64_InitNew(parser);
|
||||||
|
ok(hres == S_OK, "InitNew failed: %08x\n", hres);
|
||||||
|
|
||||||
|
hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
|
||||||
|
ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
|
||||||
|
|
||||||
|
hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
|
||||||
|
ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
|
||||||
|
|
||||||
|
hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
|
||||||
|
ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
|
||||||
|
|
||||||
|
refobj_ref = 0;
|
||||||
|
|
||||||
|
script_str = a2bstr("Dim x\nset x = RefObj\n");
|
||||||
|
hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
|
||||||
|
SysFreeString(script_str);
|
||||||
|
|
||||||
|
ok(refobj_ref, "refobj_ref = 0\n");
|
||||||
|
|
||||||
|
if(use_close) {
|
||||||
|
hres = IActiveScript_Close(engine);
|
||||||
|
ok(hres == S_OK, "Close failed: %08x\n", hres);
|
||||||
|
}else {
|
||||||
|
hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
|
||||||
|
ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
|
||||||
|
}
|
||||||
|
|
||||||
|
ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
|
||||||
|
|
||||||
|
IActiveScript_Release(engine);
|
||||||
|
|
||||||
|
ref = IUnknown_Release(parser);
|
||||||
|
ok(!ref, "ref=%d\n", ref);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
static BSTR get_script_from_file(const char *filename)
|
static BSTR get_script_from_file(const char *filename)
|
||||||
{
|
{
|
||||||
DWORD size, len;
|
DWORD size, len;
|
||||||
@ -1099,6 +1226,9 @@ static void run_tests(void)
|
|||||||
|
|
||||||
parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
|
parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
|
||||||
|
|
||||||
|
test_global_vars_ref(TRUE);
|
||||||
|
test_global_vars_ref(FALSE);
|
||||||
|
|
||||||
strict_dispid_check = FALSE;
|
strict_dispid_check = FALSE;
|
||||||
|
|
||||||
parse_script_a("Sub testsub\n"
|
parse_script_a("Sub testsub\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user