Jacek Caban (@jacek) commented about dlls/mshtml/dispex.c:
continue; hres = builtin_propget(dispex, func, &dp, &var, NULL, NULL); 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(get_builtin_id(subdispex->info, L"toJSON", fdexNameCaseSensitive, &id))) { + VariantClear(&var); + hres = dispex_call_builtin(subdispex, id, &dp, &var, NULL, NULL); + } + } + IWineJSDispatchHost_Release(subdispex_iface); + }
Do we need that? Usually, it's `stringify`'s responsibility to call `toJSON` on each object property. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/8905#note_114907