/*
 *  ToNumber() (E5 Section 9.3).
 *
 *  Postfix increment changes its LHS, put returns ToNumber(oldValue) as the
 *  expression value.  Use this get ToNumber() indirectly.
 */

function tonumber(x) {
    var tmp = x;
    return tmp++;
}

function zeroSign(x) {
    if (x !== 0) {
        return 'nz';
    }
    if (1 / x > 0) {
        return 'pos';
    } else {
        return 'neg';
    }
}

function test(x) {
    var num = tonumber(x);
    print(num, zeroSign(num));
}

/*===
NaN nz
0 pos
1 nz
0 pos
-1 nz
0 neg
0 pos
1 nz
NaN nz
Infinity nz
-Infinity nz
===*/

test(undefined);
test(null);
test(true);
test(false);
test(-1);
test(-0);
test(+0);
test(1);
test(NaN);
test(Number.POSITIVE_INFINITY);
test(Number.NEGATIVE_INFINITY);

/*===
-1 nz
0 neg
0 pos
0 pos
1 nz
-Infinity nz
Infinity nz
Infinity nz
3735928559 nz
===*/

/* String to number */

test("-1");
test("-0");
test("+0");
test("0");
test("1");

test("-Infinity");
test("+Infinity");
test("Infinity");

test("0xdeadbeef");

/* FIXME: octal */

/* FIXME: object coercion */

