Jacek Caban (@jacek) commented about dlls/mshtml/dispex.c:
if(SUCCEEDED(hres)) {
hres = IWineJSDispatch_DefineProperty(json, func->name, PROPF_WRITABLE | PROPF_ENUMERABLE | PROPF_CONFIGURABLE, &var);
if(V_VT(&var) == VT_DISPATCH &&
SUCCEEDED(IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IWineJSDispatchHost, (void**)&subdispex_iface))) {
if(subdispex_iface->lpVtbl == &JSDispatchHostVtbl) {
DispatchEx *subdispex = impl_from_IWineJSDispatchHost(subdispex_iface);
if(SUCCEEDED(dispex_get_chain_builtin_id(subdispex, L"toJSON", fdexNameCaseSensitive, &id))) {
VariantClear(&var);
hres = dispex_call_builtin(subdispex, id, &dp, &var, NULL, NULL);
}
}
IWineJSDispatchHost_Release(subdispex_iface);
}
if(SUCCEEDED(hres))
hres = IWineJSDispatch_DefineProperty(json, func->name, PROPF_WRITABLE | PROPF_ENUMERABLE | PROPF_CONFIGURABLE, &var);
Do you expect more cases like this? It feels a bit like forcing our way through abstraction layers with things like vtbl checks. We could perhaps do that, but I wonder if we could just skip `VT_DISPATCH` here and have `HTMLPerformance_toJSON` perform those `toJSON` and `DefineProperty` calls for object properties instead.