jscript: Implement multiple Math functions.
Patrick Rudolph
patrick1804 at web.de
Wed Dec 10 09:51:19 CST 2008
modified: math.c
modified: tests/api.js
---
dlls/jscript/math.c | 293 +++++++++++++++++++++++++++++++++++++++-=
-----
dlls/jscript/tests/api.js | 32 +++++
2 files changed, 287 insertions(+), 38 deletions(-)
diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c
index e6b7202..56ba9cf 100644
--- a/dlls/jscript/math.c
+++ b/dlls/jscript/math.c
@@ -20,6 +20,7 @@
#include "wine/port.h"
=20
#include <math.h>
+#include <sys/time.h>
=20
#include "jscript.h"
=20
@@ -57,57 +58,105 @@ static const WCHAR tanW[] =3D {'t','a','n',0};
static HRESULT Math=5FE(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA=
MS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, exp(1));
+ return S=5FOK;
}
=20
static HRESULT Math=5FLOG2E(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, log(exp(1))/log(2));
+ return S=5FOK;
}
=20
static HRESULT Math=5FLOG10E(DispatchEx *dispex, LCID lcid, WORD flags, DIS=
PPARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, log10(exp(1)));
+ return S=5FOK;
}
=20
static HRESULT Math=5FLN2(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, log(2));
+ return S=5FOK;
}
=20
static HRESULT Math=5FLN10(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, log(10));
+ return S=5FOK;
}
=20
static HRESULT Math=5FPI(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR=
AMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, atan(1)*4);
+ return S=5FOK;
}
=20
static HRESULT Math=5FSQRT2(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, sqrt(2));
+ return S=5FOK;
}
=20
static HRESULT Math=5FSQRT1=5F2(DispatchEx *dispex, LCID lcid, WORD flags, DI=
SPPARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ if(retv)
+ num=5Fset=5Fval(retv, 1/sqrt(2));
+ return S=5FOK;
}
=20
/* ECMA-262 3rd Edition 15.8.2.12 */
@@ -139,29 +188,96 @@ static HRESULT Math=5Fabs(DispatchEx *dispex, LCID lci=
d, WORD flags, DISPPARAMS *d
static HRESULT Math=5Facos(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ if(retv)
+ num=5Fset=5Fnan(retv);
+ return S=5FOK;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, acos(num=5Fval(&v)));
+ return S=5FOK;
}
=20
static HRESULT Math=5Fasin(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ if(retv)
+ num=5Fset=5Fnan(retv);
+ return S=5FOK;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, asin(num=5Fval(&v)));
+ return S=5FOK;
}
=20
static HRESULT Math=5Fatan(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ if(retv)
+ num=5Fset=5Fnan(retv);
+ return S=5FOK;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, atan(num=5Fval(&v)));
+ return S=5FOK;
}
=20
static HRESULT Math=5Fatan2(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT x, y;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(arg=5Fcnt(dp) < 2) {
+ FIXME("unimplemented arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &x);
+ if(FAILED(hres))
+ return hres;
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 1), ei, &y);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, atan2(num=5Fval(&x),num=5Fval(&y)) );
+ return S=5FOK;
}
=20
/* ECMA-262 3rd Edition 15.8.2.6 */
@@ -191,15 +307,45 @@ static HRESULT Math=5Fceil(DispatchEx *dispex, LCID lc=
id, WORD flags, DISPPARAMS *
static HRESULT Math=5Fcos(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ FIXME("arg=5Fcnt =3D 0\n");
+ return E=5FNOTIMPL;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, cos(num=5Fval(&v)));
+ return S=5FOK;
}
=20
static HRESULT Math=5Fexp(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ FIXME("arg=5Fcnt =3D 0\n");
+ return E=5FNOTIMPL;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, exp(num=5Fval(&v)));
+ return S=5FOK;
}
=20
static HRESULT Math=5Ffloor(DispatchEx *dispex, LCID lcid, WORD flags, DISP=
PARAMS *dp,
@@ -228,8 +374,23 @@ static HRESULT Math=5Ffloor(DispatchEx *dispex, LCID lc=
id, WORD flags, DISPPARAMS
static HRESULT Math=5Flog(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ FIXME("arg=5Fcnt =3D 0\n");
+ return E=5FNOTIMPL;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, log(num=5Fval(&v)));
+ return S=5FOK;
}
=20
/* ECMA-262 3rd Edition 15.8.2.11 */
@@ -333,11 +494,17 @@ static HRESULT Math=5Fpow(DispatchEx *dispex, LCID lci=
d, WORD flags, DISPPARAMS *d
return S=5FOK;
}
=20
+/*returns a random value between 0...1*/
static HRESULT Math=5Frandom(DispatchEx *dispex, LCID lcid, WORD flags, DIS=
PPARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ if(arg=5Fcnt(dp) > 0) {
+ FIXME("invalid arg=5Fcnt %d\n", arg=5Fcnt(dp));
+ return E=5FNOTIMPL;
+ }
+ if(retv)
+ num=5Fset=5Fval(retv, ((double)rand()/(double)RAND=5FMAX));
+ return S=5FOK;
}
=20
/* ECMA-262 3rd Edition 15.8.2.15 */
@@ -366,22 +533,68 @@ static HRESULT Math=5Fround(DispatchEx *dispex, LCID l=
cid, WORD flags, DISPPARAMS
static HRESULT Math=5Fsin(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ FIXME("arg=5Fcnt =3D 0\n");
+ return E=5FNOTIMPL;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, sin(num=5Fval(&v)));
+ return S=5FOK;
}
=20
static HRESULT Math=5Fsqrt(DispatchEx *dispex, LCID lcid, WORD flags, DISPP=
ARAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ FIXME("arg=5Fcnt =3D 0\n");
+ return E=5FNOTIMPL;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, sqrt(num=5Fval(&v)));
+ return S=5FOK;
+
}
=20
static HRESULT Math=5Ftan(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA=
RAMS *dp,
VARIANT *retv, jsexcept=5Ft *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E=5FNOTIMPL;
+ VARIANT v;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(!arg=5Fcnt(dp)) {
+ FIXME("arg=5Fcnt =3D 0\n");
+ return E=5FNOTIMPL;
+ }
+
+ hres =3D to=5Fnumber(dispex->ctx, get=5Farg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv)
+ num=5Fset=5Fval(retv, tan(num=5Fval(&v)));
+ return S=5FOK;
}
=20
static const builtin=5Fprop=5Ft Math=5Fprops[] =3D {
@@ -424,5 +637,9 @@ static const builtin=5Finfo=5Ft Math=5Finfo =3D {
=20
HRESULT create=5Fmath(script=5Fctx=5Ft *ctx, DispatchEx **ret)
{
+ /*randomize srand() function */
+ struct timeval tv;
+ gettimeofday(&tv,NULL);
+ srand(tv.tv=5Fsec *1000+(tv.tv=5Fusec/1000)); =20
return create=5Fdispex(ctx, &Math=5Finfo, NULL, ret);
}
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 2868c0f..6430397 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -585,6 +585,38 @@ ok(tmp =3D=3D=3D 2, "Math.pow(2, 2) =3D " + tmp);
tmp =3D Math.pow(2, 2, 3);
ok(tmp =3D=3D=3D 4, "Math.pow(2, 2, 3) =3D " + tmp);
=20
+tmp =3D Math.PI();
+
+i =3D Math.sin(0);
+ok(i =3D=3D=3D 0, "Math.sin(0) =3D " + i);
+
+i =3D Math.cos(0);
+ok(i =3D=3D=3D 1, "Math.cos(0) =3D " + i);
+
+i =3D Math.tan(0);
+ok(i =3D=3D=3D 0, "Math.tan(0) =3D " + i);
+
+i =3D Math.log(1);
+ok(i =3D=3D=3D 0 , "Math.log() =3D " + i);
+
+i =3D Math.random();
+ok(i !=3D=3D 0 , "Math.random() =3D " + i);
+
+i =3D Math.random();
+ok(i !=3D=3D 1 , "Math.random() =3D " + i);
+
+i =3D Math.atan2(0,1);
+ok(i =3D=3D=3D 0 , "Math.atan2(0,1) =3D " + i);
+
+i =3D Math.atan(0);
+ok(i =3D=3D=3D 0 , "Math.atan2(0) =3D " + i);
+
+i =3D Math.asin(1);
+ok(i =3D=3D=3D tmp/2 , "Math.asin(1) =3D " + i);
+
+i =3D Math.acos(-1);
+ok(i =3D=3D=3D tmp , "Math.acos(-1) =3D " + i);
+
var func =3D function (a) {
var a =3D 1;
if(a) return;
--=20
1.5.6.3
=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F=5F
Sensationsangebot verl=E4ngert: WEB.DE FreeDSL - Telefonanschluss + DSL
f=FCr nur 16,37 Euro/mtl.!* http://dsl.web.de/=3Fac=3DOM.AD.AD008K15039B7069a
More information about the wine-patches
mailing list