Bug 645416, part 1 - Add an enum for symbols to JSValueType. r=nbp.

JSVAL_TYPE_SYMBOL is inserted between STRING and NULL, rather than added at the
end, in order to preserve all the inequality relations on JSValueTypes used
throughout Value.h. (Search the header for the operators < > <= >=.)

Otherwise, this pretty much just works. Some details of Ion snapshot layout
had to change to accommodate 4-bit types.

--HG--
extra : rebase_source : e3141e6a9ee32ef563dab43a4942a9e67d234865
Bug 645416, part 2 - Add support for symbols to JS::Value. r=luke.

The API for symbol Values is much like the API for strings.

The implementation behind all this is in a later patch. Here, a class
JS::Symbol is declared, but not defined anywhere yet.

The constants being deleted from js/public/Value.h probably haven't been used
since Tracemonkey days.

--HG--
extra : rebase_source : 5b2d0cc4d99223483e850ee80913eef3854c427c
Bug 645416, part 3 - Symbol layout and GC support for allocating them. r=terrence.

Layout: js/src/vm/Symbol.h defines the new class JS::Symbol. JS::Symbol is the
same size as JSString on all platforms, because the allocator does not support
smaller allocations.

Allocation: Since the purpose of symbols is to serve as property keys, they are
always allocated in the atoms compartment.

We take a lock when allocating. This could probably be replaced with a
main-thread-only assertion. However, if atom allocation is not already a
bottleneck, symbol allocation probably never will be.

Symbols are given their own finalize-class in the GC. This means we allocate a
page per zone for symbols, even though they are only ever allocated in the
atoms zone. Terrence thought this could be easily fixed later. It should be; we
never touch the page, but a 32-bit virtual address space does not just have
infinite pages to spare.

A jsapi-test exercises the new symbol allocation code. A few oddities in
jsapi-tests are fixed in passing.

Discussion after review led to some new assertions about minimum object size in
AllocateObject and AllocateNonObject.

--HG--
extra : rebase_source : 45abb651d3b1b493d77a5dd0eb554f96b058c63a
Bug 645416, part 4 - Rename DefinePropertiesAndBrand -> DefinePropertiesAndFunctions. r=bhackett.

--HG--
extra : rebase_source : beadd475b66cb17c7fe6f74766a5d90767817cf0
Bug 645416, part 5 - Add the Symbol constructor and Symbol wrapper objects. r=efaust.

This exposes a new primitive type to scripts for the first time since
JavaScript first shipped in Netscape 2, over 13 years ago.

The tests focus on identity, equality, and being able to pass a symbol around
as a value. Of course the point of symbols is that they can be property keys,
but that will have to wait for a later patch in this series.

--HG--
extra : rebase_source : c22cf4b774cca8e7c9f6c757079e054a6eb0f307
Bug 645416, part 6 - JIT support for symbol values. r=jandem.

Symbols are not yet supported as property keys at this point in the stack. The
work here is to pass symbol pointers around in Ion JIT code unboxed.

The baseline compiler doesn't need much new code. A few kinds of ICs need to
know all the primitive types.

--HG--
extra : rebase_source : 3addcd18e913e5879b0ee3700ecf9660b14b1e05
Bug 645416, part 7 - Support symbols as Map keys. r=terrence.

--HG--
extra : rebase_source : 5e40fe2514e7eb9ca874b1c271ed4a4e11f9c2ff
Bug 645416, part 8 - Support passing symbols across compartment boundaries. r=terrence.

Trivial. Since symbols are always allocated in the atoms compartment and all
compartments are allowed to have direct references to them, Compartment::wrap
on a symbol is a no-op.

--HG--
extra : rebase_source : 2f51ff0b3870885de8c6ef6a82efa7398e17d5e8
Bug 645416, part 9 - Implement the symbol registry and Symbol.for(). r=terrence,r=efaust.

--HG--
extra : rebase_source : df06d065f70756dea63dfd8e9df56610ff46d393
Bug 645417, part 10 - Well-known symbols. r=terrence,r=efaust.

At present there is only one, Symbol.iterator, and it is not hooked up to
anything (this happens in bug 918828). ES6 defines 8 well-known symbols. Each
one is attached to a feature, so we'll add the symbols as we add features.
Symbol.create will appear when @@create semantics are implemented.

--HG--
extra : rebase_source : aab40a7487708c8bbd23dcfbe935ece1903d75ff
Bug 645416, part 11 - Update GDB pretty-printers for symbols. r=jimb.

--HG--
extra : rebase_source : ab2063ab6073b748069c6a8ad1cd34ab0d5e7d86
Bug 645416, part 12 - Update ToBoolean for symbols. r=sfink.

--HG--
extra : rebase_source : 24d444b77bbfdbc35e3f99c73e5b182e2ecad029
Bug 645416, part 13 - Update ToNumber for symbols. r=sfink.

Not terribly interesting; converting a symbol to a number always produces NaN.

--HG--
extra : rebase_source : ded251ef9e92d92483b5cc18cf16e2910084bbff
Bug 645416, part 14 - Update ToString for symbols. r=sfink.

The change in jit-test/tests/symbol/toString.js is that we now check that an
exception is actually thrown. Until this patch, stringifying a symbol did not
throw. (The test was mainly checking that we did not assert in Ion.)

No changes in Ion. If a symbol is being stringified, it's ok to be in a slow
path because that is going to throw anyway.

--HG--
extra : rebase_source : 9cf314dafa7392a20fee9d3b5acc4ad7fc1c5229
Bug 645417, part 15 - Tests for ToObject on symbols. r=sfink.

The test as-base-value.js is not testing symbols as property keys (which is
implemented in a later patch), but on the other side of the . operator: as
things that can have property accesses done to them, just like you can do
"name".length or (3.14).toString().

--HG--
extra : rebase_source : 3dac7660999bd021ec32c13985471e1608a29f64
Bug 645416, part 16 - Implement Symbol.prototype.valueOf. r=sfink.

--HG--
extra : rebase_source : 12dfad71e0933ccc3e553854f44bdf0f85eccf64
Bug 645416, part 17 - Implement ToPrimitive on Symbol wrapper objects. r=sfink.

The spec defines this by way of a @@toPrimitive method. We fake it using a
JSClass::convert hook. (Once @@toPrimitive is implemented, convert hooks
can be removed entirely, but we need symbols first.)

--HG--
extra : rebase_source : c8c7ed3eead8bd79bb38b70f448ebb98c5b3d780
Bug 645416, part 18 - Update ValueToSource for symbols. r=sfink.

--HG--
extra : rebase_source : 8d3702bd625ba2126f691810e1ea2a7736fd77e7
Bug 645416, part 19 - Update assertDeepEq for symbols. r=till.

The contract of assertDeepEq(a, b) is that the assertion passes iff a and b
have the isomorphic heap graphs. Symbols, like objects, are treated as nodes in
this graph. So, for example, if a and b are distinct symbols, then [a, b] is
not deepEq to [b, b] because they have distinct graphs. There are three nodes
in [a, b]: the array, a, and b.  There are only two nodes in [b, b]: the array,
and b.

--HG--
extra : rebase_source : 9415559bab9f0ed132dd49d3790892b3209fa77b
Bug 645416, part 20 - Add JS::Symbol::dump() method for debugging. r=efaust.

--HG--
extra : rebase_source : 2e2539f319593d51876ef39caa0c96800b6d605e