Bug 604864 - Optimize undefined, NaN and Infinity in methodjit. r=dmandelin

This commit is contained in:
Jan de Mooij 2010-11-01 21:47:45 +01:00
Родитель 5cce2a3041
Коммит c402f81ebb
7 изменённых файлов: 58 добавлений и 4 удалений

Просмотреть файл

@ -0,0 +1,9 @@
function testLocalNames() {
var NaN = 4;
var undefined = 5;
var Infinity = 6;
return NaN + undefined + Infinity;
}
assertEq(testLocalNames(), 15);

Просмотреть файл

@ -0,0 +1,20 @@
function testNaN(x) {
var x = NaN;
assertEq(isNaN(x), true);
}
testNaN();
function testInfinity(x) {
return (x === Infinity);
}
assertEq(testInfinity(Infinity), true);
assertEq(testInfinity(6), false);
assertEq(testInfinity(-Infinity), false);
function testUndefined(x) {
return (x === undefined);
}
assertEq(testUndefined(undefined), true);
assertEq(testUndefined(), true);
assertEq(testUndefined(5), false);

Просмотреть файл

@ -0,0 +1,9 @@
NaN = 4;
undefined = 5;
Infinity = 6;
assertEq(isNaN(NaN), true);
assertEq(Infinity > 100, true);
assertEq(undefined != 5, true);

Просмотреть файл

@ -1525,8 +1525,8 @@ static JSStdName standard_class_names[] = {
{js_InitObjectClass, EAGER_ATOM(eval), CLASP(Object)}, {js_InitObjectClass, EAGER_ATOM(eval), CLASP(Object)},
/* Global properties and functions defined by the Number class. */ /* Global properties and functions defined by the Number class. */
{js_InitNumberClass, LAZY_ATOM(NaN), CLASP(Number)}, {js_InitNumberClass, EAGER_ATOM(NaN), CLASP(Number)},
{js_InitNumberClass, LAZY_ATOM(Infinity), CLASP(Number)}, {js_InitNumberClass, EAGER_ATOM(Infinity), CLASP(Number)},
{js_InitNumberClass, LAZY_ATOM(isNaN), CLASP(Number)}, {js_InitNumberClass, LAZY_ATOM(isNaN), CLASP(Number)},
{js_InitNumberClass, LAZY_ATOM(isFinite), CLASP(Number)}, {js_InitNumberClass, LAZY_ATOM(isFinite), CLASP(Number)},
{js_InitNumberClass, LAZY_ATOM(parseFloat), CLASP(Number)}, {js_InitNumberClass, LAZY_ATOM(parseFloat), CLASP(Number)},

Просмотреть файл

@ -181,6 +181,8 @@ const char *const js_common_atom_names[] = {
"use strict", /* useStrictAtom */ "use strict", /* useStrictAtom */
"loc", /* locAtom */ "loc", /* locAtom */
"line", /* lineAtom */ "line", /* lineAtom */
"Infinity", /* InfinityAtom */
"NaN", /* NaNAtom */
#if JS_HAS_XML_SUPPORT #if JS_HAS_XML_SUPPORT
js_etago_str, /* etagoAtom */ js_etago_str, /* etagoAtom */

Просмотреть файл

@ -373,6 +373,8 @@ struct JSAtomState
JSAtom *useStrictAtom; JSAtom *useStrictAtom;
JSAtom *locAtom; JSAtom *locAtom;
JSAtom *lineAtom; JSAtom *lineAtom;
JSAtom *InfinityAtom;
JSAtom *NaNAtom;
#if JS_HAS_XML_SUPPORT #if JS_HAS_XML_SUPPORT
JSAtom *etagoAtom; JSAtom *etagoAtom;
@ -407,8 +409,6 @@ struct JSAtomState
/* Less frequently used atoms, pinned lazily by JS_ResolveStandardClass. */ /* Less frequently used atoms, pinned lazily by JS_ResolveStandardClass. */
struct { struct {
JSAtom *InfinityAtom;
JSAtom *NaNAtom;
JSAtom *XMLListAtom; JSAtom *XMLListAtom;
JSAtom *decodeURIAtom; JSAtom *decodeURIAtom;
JSAtom *decodeURIComponentAtom; JSAtom *decodeURIComponentAtom;

Просмотреть файл

@ -4336,6 +4336,20 @@ mjit::Compiler::jsop_bindgname()
void void
mjit::Compiler::jsop_getgname(uint32 index) mjit::Compiler::jsop_getgname(uint32 index)
{ {
/* Optimize undefined, NaN and Infinity. */
JSAtom *atom = script->getAtom(index);
if (atom == cx->runtime->atomState.typeAtoms[JSTYPE_VOID]) {
frame.push(UndefinedValue());
return;
}
if (atom == cx->runtime->atomState.NaNAtom) {
frame.push(cx->runtime->NaNValue);
return;
}
if (atom == cx->runtime->atomState.InfinityAtom) {
frame.push(cx->runtime->positiveInfinityValue);
return;
}
#if defined JS_MONOIC #if defined JS_MONOIC
jsop_bindgname(); jsop_bindgname();