OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This files contains runtime support implemented in JavaScript. | 5 // This files contains runtime support implemented in JavaScript. |
6 | 6 |
7 // CAUTION: Some of the functions specified in this file are called | 7 // CAUTION: Some of the functions specified in this file are called |
8 // directly from compiled code. These are the functions with names in | 8 // directly from compiled code. These are the functions with names in |
9 // ALL CAPS. The compiled code passes the first argument in 'this'. | 9 // ALL CAPS. The compiled code passes the first argument in 'this'. |
10 | 10 |
11 | 11 |
12 // The following declarations are shared with other native JS files. | 12 // The following declarations are shared with other native JS files. |
13 // They are all declared at this one spot to avoid redeclaration errors. | 13 // They are all declared at this one spot to avoid redeclaration errors. |
14 | 14 |
15 (function(global, utils) { | 15 (function(global, utils) { |
16 | 16 |
17 %CheckIsBootstrapping(); | 17 %CheckIsBootstrapping(); |
18 | 18 |
| 19 var FLAG_harmony_species; |
19 var GlobalArray = global.Array; | 20 var GlobalArray = global.Array; |
20 var GlobalBoolean = global.Boolean; | 21 var GlobalBoolean = global.Boolean; |
21 var GlobalString = global.String; | 22 var GlobalString = global.String; |
22 var isConcatSpreadableSymbol = | |
23 utils.ImportNow("is_concat_spreadable_symbol"); | |
24 var MakeRangeError; | 23 var MakeRangeError; |
| 24 var MakeTypeError; |
| 25 var speciesSymbol; |
25 | 26 |
26 utils.Import(function(from) { | 27 utils.Import(function(from) { |
27 MakeRangeError = from.MakeRangeError; | 28 MakeRangeError = from.MakeRangeError; |
| 29 MakeTypeError = from.MakeTypeError; |
| 30 speciesSymbol = from.species_symbol; |
| 31 }); |
| 32 |
| 33 utils.ImportFromExperimental(function(from) { |
| 34 FLAG_harmony_species = from.FLAG_harmony_species; |
28 }); | 35 }); |
29 | 36 |
30 // ---------------------------------------------------------------------------- | 37 // ---------------------------------------------------------------------------- |
31 | 38 |
32 /* ----------------------------- | 39 /* ----------------------------- |
33 - - - H e l p e r s - - - | 40 - - - H e l p e r s - - - |
34 ----------------------------- | 41 ----------------------------- |
35 */ | 42 */ |
36 | 43 |
37 function CONCAT_ITERABLE_TO_ARRAY(iterable) { | 44 function CONCAT_ITERABLE_TO_ARRAY(iterable) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 118 |
112 | 119 |
113 function MinSimple(a, b) { | 120 function MinSimple(a, b) { |
114 return a > b ? b : a; | 121 return a > b ? b : a; |
115 } | 122 } |
116 | 123 |
117 | 124 |
118 %SetForceInlineFlag(MaxSimple); | 125 %SetForceInlineFlag(MaxSimple); |
119 %SetForceInlineFlag(MinSimple); | 126 %SetForceInlineFlag(MinSimple); |
120 | 127 |
| 128 |
| 129 // ES2015 7.3.20 |
| 130 // For the fallback with --harmony-species off, there are two possible choices: |
| 131 // - "conservative": return defaultConstructor |
| 132 // - "not conservative": return object.constructor |
| 133 // This fallback path is only needed in the transition to ES2015, and the |
| 134 // choice is made simply to preserve the previous behavior so that we don't |
| 135 // have a three-step upgrade: old behavior, unspecified intermediate behavior, |
| 136 // and ES2015. |
| 137 // In some cases, we were "conservative" (e.g., ArrayBuffer, RegExp), and in |
| 138 // other cases we were "not conservative (e.g., TypedArray, Promise). |
| 139 function SpeciesConstructor(object, defaultConstructor, conservative) { |
| 140 if (FLAG_harmony_species) { |
| 141 var constructor = object.constructor; |
| 142 if (IS_UNDEFINED(constructor)) { |
| 143 return defaultConstructor; |
| 144 } |
| 145 if (!IS_RECEIVER(constructor)) { |
| 146 throw MakeTypeError(kConstructorNotReceiver); |
| 147 } |
| 148 var species = constructor[speciesSymbol]; |
| 149 if (IS_NULL_OR_UNDEFINED(species)) { |
| 150 return defaultConstructor; |
| 151 } |
| 152 if (%IsConstructor(species)) { |
| 153 return species; |
| 154 } |
| 155 throw MakeTypeError(kSpeciesNotConstructor); |
| 156 } else { |
| 157 return conservative ? defaultConstructor : object.constructor; |
| 158 } |
| 159 } |
| 160 |
121 //---------------------------------------------------------------------------- | 161 //---------------------------------------------------------------------------- |
122 | 162 |
123 // NOTE: Setting the prototype for Array must take place as early as | 163 // NOTE: Setting the prototype for Array must take place as early as |
124 // possible due to code generation for array literals. When | 164 // possible due to code generation for array literals. When |
125 // generating code for a array literal a boilerplate array is created | 165 // generating code for a array literal a boilerplate array is created |
126 // that is cloned when running the code. It is essential that the | 166 // that is cloned when running the code. It is essential that the |
127 // boilerplate gets the right prototype. | 167 // boilerplate gets the right prototype. |
128 %FunctionSetPrototype(GlobalArray, new GlobalArray(0)); | 168 %FunctionSetPrototype(GlobalArray, new GlobalArray(0)); |
129 | 169 |
130 // ---------------------------------------------------------------------------- | 170 // ---------------------------------------------------------------------------- |
131 // Exports | 171 // Exports |
132 | 172 |
133 utils.Export(function(to) { | 173 utils.Export(function(to) { |
134 to.AddIndexedProperty = AddIndexedProperty; | 174 to.AddIndexedProperty = AddIndexedProperty; |
135 to.MaxSimple = MaxSimple; | 175 to.MaxSimple = MaxSimple; |
136 to.MinSimple = MinSimple; | 176 to.MinSimple = MinSimple; |
137 to.SameValue = SameValue; | 177 to.SameValue = SameValue; |
138 to.SameValueZero = SameValueZero; | 178 to.SameValueZero = SameValueZero; |
139 to.ToPositiveInteger = ToPositiveInteger; | 179 to.ToPositiveInteger = ToPositiveInteger; |
| 180 to.SpeciesConstructor = SpeciesConstructor; |
140 }); | 181 }); |
141 | 182 |
142 %InstallToContext([ | 183 %InstallToContext([ |
143 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY, | 184 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY, |
144 ]); | 185 ]); |
145 | 186 |
146 %InstallToContext([ | 187 %InstallToContext([ |
147 "concat_iterable_to_array", ConcatIterableToArray, | 188 "concat_iterable_to_array", ConcatIterableToArray, |
148 ]); | 189 ]); |
149 | 190 |
150 }) | 191 }) |
OLD | NEW |