Mark S. Miller wrote:
Quoting from <http://es5.github.com/#x15.4.4.11>, the requirements on
the comparefn are:

        A function /comparefn/ is a consistent comparison function for a
        set of values /S/ if all of the requirements below are met for
        all values /a/, /b/, and /c/ (possibly the same value) in the
        set /S/: The notation /a/ <_CF /b/ means /comparefn/(/a/,/b/)
        < 0; /a/ =_CF /b/ means /comparefn/(/a/,/b/) = 0 (of either
        sign); and/a/ >_CF /b/ means /comparefn/(/a/,/b/) > 0.

        Calling /comparefn/(/a/,/b/) always returns the same value
        /v/ when given a specific pair of values /a/and /b/ as its two
        arguments. Furthermore, Type <http://es5.github.com/#Type>(/v/)
        is Number, and /v/ is not NaN. Note that this implies that
        exactly one of /a/ <_CF /b/, /a/ =_CF /b/, and /a/ >_CF /b/ will
        be true for a given pair of /a/ and /b/.

        Calling /comparefn/(/a/,/b/) does not modify the *this* object.

        /a/ =_CF /a/ (reflexivity)

        If /a/ =_CF /b/, then /b/ =_CF /a/ (symmetry)

        If /a/ =_CF /b/ and /b/ =_CF /c/, then /a/ =_CF
        /c/ (transitivity of =_CF )

        If /a/ <_CF /b/ and /b/ <_CF /c/, then /a/ <_CF
        /c/ (transitivity of <_CF )

        If /a/ >_CF /b/ and /b/ >_CF /c/, then /a/ >_CF
        /c/ (transitivity of >_CF )

        *NOTE*

          The above conditions are necessary and sufficient to ensure
        that /comparefn/ divides the set/S/ into equivalence classes and
        that these equivalence classes are totally ordered.


If sort is called with a comparefn which violates this constraint,
according to normative text

        If /comparefn/ is not *undefined* and is not a consistent
        comparison function for the elements of this array
        <http://es5.github.com/#array-element> (see below), the
        behaviour of |*sort*| is implementation-defined.


a conforming implementation may kill the user, lose memory safety, or
launch the nukes.

> ...

Let's kill "implementation-defined" rather than our users.

IIRC there was already this topic on the list some time ago.

BTW, is it so hard just to change the spec to something like:

If /comparefn/ is not *undefined* and is not a consistent
comparison function for the elements of this array
<http://es5.github.com/#array-element> (see below), the
behaviour of |*sort*| can be any of:

- throwing an exception raised in comparator function by throw statement, leaving array in one of its permutations*
- changing array to one of its permutations* and returning the array
- infinite loop
- stack overflow exception / out of memory exception, leaving array in one of its permutations*
- throwing TypeError, leaving array in one of its permutations*

at the discretion of the implementor.

* not changing the array at all also counts as "leaving the array in of its permutations"

--
     Cheers,
     --MarkM

Herby
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to