Bug #32677, r=rginda bugs in Win32 optimized version for edge cases in

Math.exp and Math.pow
Bug #32937, r=rginda, implement missing toLocaleString
This commit is contained in:
rogerl%netscape.com 2000-03-29 23:45:07 +00:00
parent eebaf04faf
commit b76e51bc61
5 changed files with 40 additions and 12 deletions

View File

@ -94,6 +94,7 @@ char js_setter_str[] = "setter";
char js_set_str[] = "set";
char js_toSource_str[] = "toSource";
char js_toString_str[] = "toString";
char js_toLocaleString_str[] = "toLocaleString";
char js_valueOf_str[] = "valueOf";
#define HASH_OBJECT(o) ((JSHashNumber)(o) >> JSVAL_TAGBITS)

View File

@ -203,6 +203,7 @@ extern char js_setter_str[];
extern char js_set_str[];
extern char js_toSource_str[];
extern char js_toString_str[];
extern char js_toLocaleString_str[];
extern char js_valueOf_str[];
/*

View File

@ -676,7 +676,7 @@ have_fun:
/* If native, use caller varobj and scopeChain for eval. */
frame.varobj = fp->varobj;
frame.scopeChain = fp->scopeChain;
ok = native(cx, thisp, argc, frame.argv, &frame.rval);
ok = native(cx, frame.thisp, argc, frame.argv, &frame.rval);
} else if (script) {
if (fun->flags & JSFUN_HEAVYWEIGHT) {
#if JS_HAS_CALL_OBJECT

View File

@ -125,8 +125,8 @@ math_asin(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if (!js_ValueToNumber(cx, argv[0], &x))
return JS_FALSE;
#ifdef XP_MAC
if (x == 0)
return js_NewNumberValue(cx, x, rval);
if (x == 0)
return js_NewNumberValue(cx, x, rval);
#endif
z = fd_asin(x);
return js_NewNumberValue(cx, z, rval);
@ -140,8 +140,8 @@ math_atan(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if (!js_ValueToNumber(cx, argv[0], &x))
return JS_FALSE;
#ifdef XP_MAC
if (x == 0)
return js_NewNumberValue(cx, x, rval);
if (x == 0)
return js_NewNumberValue(cx, x, rval);
#endif
z = fd_atan(x);
return js_NewNumberValue(cx, z, rval);
@ -189,6 +189,18 @@ math_exp(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if (!js_ValueToNumber(cx, argv[0], &x))
return JS_FALSE;
#ifdef _WIN32
if (!JSDOUBLE_IS_NaN(x)) {
if (x == *cx->runtime->jsPositiveInfinity) {
*rval = DOUBLE_TO_JSVAL(cx->runtime->jsPositiveInfinity);
return JS_TRUE;
}
if (x == *cx->runtime->jsNegativeInfinity) {
*rval = JSVAL_ZERO;
return JS_TRUE;
}
}
#endif
z = fd_exp(x);
return js_NewNumberValue(cx, z, rval);
}
@ -273,7 +285,7 @@ math_pow(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if (!js_ValueToNumber(cx, argv[0], &x))
return JS_FALSE;
if (!js_ValueToNumber(cx, argv[1], &y))
return JS_FALSE;
return JS_FALSE;
z = fd_pow(x, y);
return js_NewNumberValue(cx, z, rval);
}

View File

@ -252,6 +252,19 @@ num_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
return JS_TRUE;
}
static JSBool
num_toLocaleString(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
/*
* For now, forcibly ignore the first (or any) argument and return toString().
* ECMA allows this, although it doesn't 'encourage it'.
* [The first argument is being reserved by ECMA and we don't want it confused
* with a radix]
*/
return num_toString(cx, obj, 0, argv, rval);
}
static JSBool
num_valueOf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
@ -334,14 +347,15 @@ num_toPrecision(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
static JSFunctionSpec number_methods[] = {
#if JS_HAS_TOSOURCE
{js_toSource_str, num_toSource, 0,0,0},
{js_toSource_str, num_toSource, 0,0,0},
#endif
{js_toString_str, num_toString, 0,0,0},
{js_valueOf_str, num_valueOf, 0,0,0},
{js_toString_str, num_toString, 0,0,0},
{js_toLocaleString_str, num_toLocaleString, 0,0,0},
{js_valueOf_str, num_valueOf, 0,0,0},
#if JS_HAS_NUMBER_FORMATS
{"toFixed", num_toFixed, 1,0,0},
{"toExponential", num_toExponential, 1,0,0},
{"toPrecision", num_toPrecision, 1,0,0},
{"toFixed", num_toFixed, 1,0,0},
{"toExponential", num_toExponential, 1,0,0},
{"toPrecision", num_toPrecision, 1,0,0},
#endif
{0,0,0,0,0}
};