diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c index 74c01d150f6..dc6f3651334 100644 --- a/dlls/jscript/math.c +++ b/dlls/jscript/math.c @@ -195,13 +195,45 @@ static HRESULT Math_log(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *d return E_NOTIMPL; } +/* ECMA-262 3rd Edition 15.8.2.11 */ static HRESULT Math_max(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + DOUBLE max, d; + VARIANT v; + DWORD i; + HRESULT hres; + + TRACE("\n"); + + /* FIXME: Handle NaN */ + + if(!arg_cnt(dp)) { + FIXME("arg_cnt = 0\n"); + return E_NOTIMPL; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + max = num_val(&v); + for(i=1; i < arg_cnt(dp); i++) { + hres = to_number(dispex->ctx, get_arg(dp, i), ei, &v); + if(FAILED(hres)) + return hres; + + d = num_val(&v); + if(d > max) + max = d; + } + + if(retv) + num_set_val(retv, max); + return S_OK; } + /* ECMA-262 3rd Edition 15.8.2.12 */ static HRESULT Math_min(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 65c4992228e..85bca4509e7 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -255,6 +255,15 @@ ok(tmp === 0, "Math.min(1, false) = " + tmp); tmp = Math.min(1, false, true, null, -3); ok(tmp === -3, "Math.min(1, false, true, null, -3) = " + tmp); +tmp = Math.max(1); +ok(tmp === 1, "Math.max(1) = " + tmp); + +tmp = Math.max(true, 0); +ok(tmp === 1, "Math.max(true, 0) = " + tmp); + +tmp = Math.max(-2, false, true, null, 1); +ok(tmp === 1, "Math.max(-2, false, true, null, 1) = " + tmp); + tmp = Math.round(0.5); ok(tmp === 1, "Math.round(0.5) = " + tmp);