Since no one else has posted notes, I will. This is not meant to be a complete
summary; it's just the notable items that I happened to write down. These are
*not* minutes of the meeting.
- The current plan is to submit ES3.1 to a vote at the June 2009 ECMA General
Assembly. The successor is ES-Harmony and will come later. A suggestion was
made to insert another version in between ES3.1 and ES-Harmony which would be
essentially equivalent to ES3.1 in behavior but written in a more formal spec
language. This would not have much of a benefit to the users of the standard
and the suggestion was rescinded.
- We're still agreed that we will want two independent implementations of ES3.1
before submitting the standard to a vote. Mozilla will likely have one. MarkM
will ask the Chrome guys about implementing it.
- Test suite: The Mozilla test suite is used by Mozilla, V8, and others. It's
MPL-licensed which Microsoft doesn't like. Mozilla will look into what it will
take to relicensing it to an MIT-style license. One approach to avert
political problems would be for some or all of the test suite to become an ECMA
document to make it easier for Microsoft can read it.
- We pretty much agree on the ES3.1 features, but the writeup in the document
is still buggy and needs work, particularly chapters 8 and 10.
- In strict mode there is a strong desire to prohibit uses of <F.caller> and
<F.arguments> where <F> is a Function object of a function that has an active
stack frame, as well as uses of <arguments.caller>. It creates an interesting
dilemma in that these features are not in the ES3 spec, so how does one remove
something that doesn't officially exist? One possibility is to state that
implementations *don't* do this, which was Waldemar's preferred position, but
the committee thought that this was not strong enough because code that tried
to access these would read <undefined> instead of throwing an exception. We
reached consensus on requiring implementations to define on strict functions
<F.caller>, <F.arguments>, and <arguments.caller> with non-deletable,
non-writable properties that have getters that throw exceptions when read. An
open question is what happens if one uses the reflection API to extract the
exception-throwing getters: are they all == to each other?
- Is the Array <length> property a getter when viewed via the reflection API?
If it is, are the different getters == to each other? Not clear at this point.
Allen doesn't care, MarkM wants it fully specified, Waldemar wants closure
joining back iff it is unspecified and the committee was sympathetic to that.
- Minor Date language cleanup issues. Wording changes. Agreed to the <now>
method. Agreed to require that methods that return the current time return
non-decreasing values under normal operation (i.e. if someone doesn't manually
change the machine clock).
- We briefly reopened the discussion of whether <const> is in the language.
The resolution was that it is in (unless of course nobody does the work to
include it in the spec). We agreed that <const> should be written at the point
of initialization rather than have write-once semantics; the latter could be
subverted as in:
{
...
const x=2;
function f() {
return x;
}
function g() {
// possibly x = 5;
}
}
If g() runs first, then f() might return something other than 2!
An open issue is whether const violations should be compile or run-time errors.
Clearly some of them are undecidable and can only be reported at run-time, but
what about the clear-cut cases?
{
a = x;
const x = 2;
}
- <Object.clone> was proposed. Waldemar shot it down due to various technical
deficiencies and the committee agreed.
- A syntactic rule was proposed to disallow any statement following a <return>,
<break>, <continue>, or <throw> statement in order to cut down on errors.
Waldemar pointed out that this would fire for non-dead code such as:
if (x)
...
else
return z;
foo();
where foo() isn't dead at all. Other legitimate places to have statements are
after a <break> in a <switch>. There wasn't much desire to change its
semantics so that it would look for dead code (that would require specifying
whether ... can proceed or not), so it was dropped.
- We were wondering why ES4 had a version of <eval> that did not capture the
enclosing scope. This does not appear to be permitted by ES3, which requires
that <eval> either evaluate in the current scope or throw an EvalError.
- The contained <statement> inside a labeled statement should be a
<substatement> in the grammar.
- In strict mode, a variable reference inside a nested scope must not evaluate
to a Reference whose base is null rather than a Reference to a property of the
global object. The latter would prohibit legitimate references to Window.foo
inside a function.
- Discussion about syntax of <use strict> directive. Most favored option is
the string literal "use strict" or "use strict,xxxxx" where xxxxx are arbitrary
characters at the beginning of the program.
- The semantics of Function.bind were essentially broken and need to be
rewritten. We also changed its semantics so that bind works exactly as though
the additional arguments were supplied at the point of the call, which means
that you can use bound functions with both function calls and the <new>
operator and have them behave as expected.
- Dropped efforts to reflect the names of parameters. Many of the ones in the
ES3.1 spec have names that are convenient for the algorithm writeups but don't
make sense otherwise: <Object.defineProperty> would have the parameters ["O",
"P", "Attributes"]. This also wouldn't extend to the rest parameters that
we'll introduce in ES-Harmony, so it's premature to standardize it now.
11.9.3: Step 15 on is dead code.
Step 19 is dead code.
15.13.1.1: What's a 34 digit integer? For example, 7 is not a 34 digit
integer.
15.12.1: What does it mean to parse 1?
15.12.2: What does it mean to contain cycles? What if the cycle is filtered
out? What if the object modifies itself as it's being read (due to getters or
side effects from toJSON routines)?
DECIMAL AND IEEE 754-2008
Mike Cowlishaw gave a presentation about Decimal and the IEEE 754-2008 standard
which replaces IEEE 754-1985. New things in there (most of which apply to both
binary and decimal floating-point values) include:
- New 64 and 128-bit decimal types and 128-bit binary type. The decimal types
each have two incompatible representations.
- Hexadecimal float literals
- Round-to-nearest-ties-away-from-zero mode
- Fused multiply-add
- minnum and maxnum (min and max that ignore NaNs)
- Number-string conversions now must be correctly rounded. ES3 already
specified that.
- Classification routines (isNaN, isFinite, etc.)
- quantize and sameQuantum
- Signed NaNs
- 36 trigonometric and such functions which must be correctly rounded to the
last bit. Apparently that's now possible to do, although nobody has actually
done for the power function. Luckily these don't have to set the inexact flag
correctly ;-).
Most of the above are mandatory. Making things mandatory even where they don't
necessarily apply seems to be the culture of the IEEE 754 committee.
Deleted from IEEE 754:
- Some ways of detecting underflows
- Traps are no longer mandatory
Mike Cowlishaw published a decFloats C package under an MIT-style open source
license: http://speleotrove.com/decimal
Mike Cowlishaw's preferred semantics of Decimal keeps track of trailing zeroes
in some ways that several in the committee consider bizarre:
1.00 + 1 --> 2.00
1e12 - 1e12 --> 0e12
5 + 5 --> 10
1/.1 --> 1e1
1/3 - 1/3 --> 0e-34
The values 10 and 1e1 are operationally different. This causes problems for
array lookups where the index is converted to a string: a[1e4] and a[100*100]
would refer to different elements. IBM gave in on this point and we all agreed
to not track trailing zeros (i.e. distinguish among cohort members) at all in
ECMAScript.
The "m" decimal literal suffix is in for ES3.1. It's the only
non-downwards-compatible-with-existing-browsers syntax change in that spec.
The spec needs to be updated to include it.
We discussed and agreed that four of the Math routines (min, max, abs, round)
should work on both binary and decimal floats in the natural way. The other
ones can coerce to and return only binary floats.
Sam is implementing Decimal in V8 (and Mozilla?).
Waldemar reviewed the current writeup of Decimal and struggled to understand
it. We now agree on what the behavior should be, but pretty much every section
of the writeup needs to be corrected or rewritten. Sam will do the work and
Waldemar will review.
ES-HARMONY
We spent most of Friday on ES-Harmony, with a long discussion about the role of
types. We agreed that having types be symbols or badges ("interfaces") that
some classes can export and can be used to annotate variables and parameters
would be a good direction to follow. We got at least tentative agreement on:
- Types should be sound. If <a> has type T, and no one changes <a>, then <a>
should continue to have type T.
- There should be a mechanism for requesting a concrete type (instead of anyone
who claims to implement an interface) in situations that call for it. The
simplest way to do this would be to allow classes to be used as types (in
addition to interfaces), but that's still considered controversial. Other
possibilities include some way of "freezing" a badge. I hope we can make a bit
faster progress on this.
UPCOMING MEETINGS
(I assume that the first day of each meeting is for the secure scripting
subgroup.)
Nov 18-20, Royal Kona Resort, Hawaii (heh, in today's economy the hotels there
are cheaper than in Redmond)
Jan 27-29, Google Mountain View
Mar 24-26, Washington DC
Waldemar
_______________________________________________
Es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss