/*
 *  Array length value X is checked and coerced in E5 Section 15.4.5.1
 *  in a rather interesting way.
 *
 *  To be a valid length, X must pass the following:
 *    - ToUint32(X) == ToNumber(X)
 *
 *  Depending on the type of X, this has various outcomes:
 *
 *    - Undefined: not allowed; ToUint32(undefined) = 0, ToNumber(undefined) = NAN
 *    - Null: allowed, ToUint32(null) = 0, ToNumber(null) = 0
 *    - Boolean: allowed, ToUint32(true) = 1, ToNumber(true) = 1;
 *                        ToUint32(false) = 0, ToNumber(false) = 0
 *    - Number: X must be a 32-bit unsigned integer
 *    - String: XXX
 *    - Object: XXX; through coercion
 */

var a;

/*===
RangeError
===*/

a = [1,2,3];
try {
    a.length = undefined;
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
0
===*/

a = [1,2,3];
try {
    a.length = null;
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
0
===*/

a = [1,2,3];
try {
    a.length = false;
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
1
===*/

a = [1,2,3];
try {
    a.length = true;
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
2
===*/

a = [1,2,3];
try {
    a.length = 2.0;
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
5
===*/

a = [1,2,3];
try {
    a.length = 5.0;
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
2
===*/

a = [1,2,3];
try {
    a.length = "2";
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
2
===*/

a = [1,2,3];
try {
    a.length = "2.000";
    print(a.length);
} catch (e) {
    print(e.name);
}

/*===
2
===*/

a = [1,2,3];
try {
    a.length = "0.02e2";
    print(a.length);
} catch (e) {
    print(e.name);
}

/* FIXME: strings and objects */

