blob: 5be6e0168d7a2d2629340264fdfcf09b3db0de3b [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2013 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5(function(global, utils) {
6
7"use strict";
8
9%CheckIsBootstrapping();
10
11// -------------------------------------------------------------------
12// Imports
13
14var GlobalObject = global.Object;
15var GlobalSymbol = global.Symbol;
16var hasInstanceSymbol = utils.ImportNow("has_instance_symbol");
17var isConcatSpreadableSymbol =
18 utils.ImportNow("is_concat_spreadable_symbol");
19var iteratorSymbol = utils.ImportNow("iterator_symbol");
20var MakeTypeError;
21var toPrimitiveSymbol = utils.ImportNow("to_primitive_symbol");
22var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
23var unscopablesSymbol = utils.ImportNow("unscopables_symbol");
24
25utils.Import(function(from) {
26 MakeTypeError = from.MakeTypeError;
27});
28
29// -------------------------------------------------------------------
30
31// 19.4.3.4 Symbol.prototype [ @@toPrimitive ] ( hint )
32function SymbolToPrimitive(hint) {
33 if (!(IS_SYMBOL(this) || IS_SYMBOL_WRAPPER(this))) {
34 throw MakeTypeError(kIncompatibleMethodReceiver,
35 "Symbol.prototype [ @@toPrimitive ]", this);
36 }
37 return %_ValueOf(this);
38}
39
40
41function SymbolToString() {
42 if (!(IS_SYMBOL(this) || IS_SYMBOL_WRAPPER(this))) {
43 throw MakeTypeError(kIncompatibleMethodReceiver,
44 "Symbol.prototype.toString", this);
45 }
46 return %SymbolDescriptiveString(%_ValueOf(this));
47}
48
49
50function SymbolValueOf() {
51 if (!(IS_SYMBOL(this) || IS_SYMBOL_WRAPPER(this))) {
52 throw MakeTypeError(kIncompatibleMethodReceiver,
53 "Symbol.prototype.valueOf", this);
54 }
55 return %_ValueOf(this);
56}
57
58
59function SymbolFor(key) {
60 key = TO_STRING(key);
61 var registry = %SymbolRegistry();
62 if (IS_UNDEFINED(registry.for[key])) {
63 var symbol = %CreateSymbol(key);
64 registry.for[key] = symbol;
65 registry.keyFor[symbol] = key;
66 }
67 return registry.for[key];
68}
69
70
71function SymbolKeyFor(symbol) {
72 if (!IS_SYMBOL(symbol)) throw MakeTypeError(kSymbolKeyFor, symbol);
73 return %SymbolRegistry().keyFor[symbol];
74}
75
76
77// ES6 19.1.2.8
78function ObjectGetOwnPropertySymbols(obj) {
79 obj = TO_OBJECT(obj);
80
81 return %GetOwnPropertyKeys(obj, PROPERTY_FILTER_SKIP_STRINGS);
82}
83
84// -------------------------------------------------------------------
85
86%FunctionSetPrototype(GlobalSymbol, new GlobalObject());
87
88utils.InstallConstants(GlobalSymbol, [
89 // TODO(rossberg): expose when implemented.
90 // "hasInstance", hasInstanceSymbol,
91 // "isConcatSpreadable", isConcatSpreadableSymbol,
92 "iterator", iteratorSymbol,
93 // TODO(yangguo): expose when implemented.
94 // "match", matchSymbol,
95 // "replace", replaceSymbol,
96 // "search", searchSymbol,
97 // "split, splitSymbol,
98 "toPrimitive", toPrimitiveSymbol,
99 // TODO(dslomov, caitp): Currently defined in harmony-tostring.js ---
100 // Move here when shipping
101 // "toStringTag", toStringTagSymbol,
102 "unscopables", unscopablesSymbol,
103]);
104
105utils.InstallFunctions(GlobalSymbol, DONT_ENUM, [
106 "for", SymbolFor,
107 "keyFor", SymbolKeyFor
108]);
109
110%AddNamedProperty(
111 GlobalSymbol.prototype, "constructor", GlobalSymbol, DONT_ENUM);
112%AddNamedProperty(
113 GlobalSymbol.prototype, toStringTagSymbol, "Symbol", DONT_ENUM | READ_ONLY);
114
115utils.InstallFunctions(GlobalSymbol.prototype, DONT_ENUM | READ_ONLY, [
116 toPrimitiveSymbol, SymbolToPrimitive
117]);
118
119utils.InstallFunctions(GlobalSymbol.prototype, DONT_ENUM, [
120 "toString", SymbolToString,
121 "valueOf", SymbolValueOf
122]);
123
124utils.InstallFunctions(GlobalObject, DONT_ENUM, [
125 "getOwnPropertySymbols", ObjectGetOwnPropertySymbols
126]);
127
128// -------------------------------------------------------------------
129// Exports
130
131utils.Export(function(to) {
132 to.SymbolToString = SymbolToString;
133})
134
135})