OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 var $getHash; | 5 var $getHash; |
6 var $getExistingHash; | 6 var $getExistingHash; |
7 | 7 |
8 (function(global, utils) { | 8 (function(global, utils) { |
9 "use strict"; | 9 "use strict"; |
10 | 10 |
11 %CheckIsBootstrapping(); | 11 %CheckIsBootstrapping(); |
12 | 12 |
13 // ------------------------------------------------------------------- | 13 // ------------------------------------------------------------------- |
14 // Imports | 14 // Imports |
15 | 15 |
16 var GlobalMap = global.Map; | 16 var GlobalMap = global.Map; |
17 var GlobalObject = global.Object; | 17 var GlobalObject = global.Object; |
18 var GlobalSet = global.Set; | 18 var GlobalSet = global.Set; |
| 19 var HashCodeSymbol = utils.GetPrivateSymbol("hash_code_symbol"); |
19 var IntRandom; | 20 var IntRandom; |
20 | 21 |
21 utils.Import(function(from) { | 22 utils.Import(function(from) { |
22 IntRandom = from.IntRandom; | 23 IntRandom = from.IntRandom; |
23 }); | 24 }); |
24 | 25 |
25 var NumberIsNaN; | 26 var NumberIsNaN; |
26 | 27 |
27 utils.Import(function(from) { | 28 utils.Import(function(from) { |
28 NumberIsNaN = from.NumberIsNaN; | 29 NumberIsNaN = from.NumberIsNaN; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 hash = ~hash + (hash << 15); // hash = (hash << 15) - hash - 1; | 84 hash = ~hash + (hash << 15); // hash = (hash << 15) - hash - 1; |
84 hash = hash ^ (hash >>> 12); | 85 hash = hash ^ (hash >>> 12); |
85 hash = hash + (hash << 2); | 86 hash = hash + (hash << 2); |
86 hash = hash ^ (hash >>> 4); | 87 hash = hash ^ (hash >>> 4); |
87 hash = (hash * 2057) | 0; // hash = (hash + (hash << 3)) + (hash << 11); | 88 hash = (hash * 2057) | 0; // hash = (hash + (hash << 3)) + (hash << 11); |
88 hash = hash ^ (hash >>> 16); | 89 hash = hash ^ (hash >>> 16); |
89 return hash & 0x3fffffff; | 90 return hash & 0x3fffffff; |
90 } | 91 } |
91 %SetForceInlineFlag(ComputeIntegerHash); | 92 %SetForceInlineFlag(ComputeIntegerHash); |
92 | 93 |
93 var hashCodeSymbol = GLOBAL_PRIVATE("hash_code_symbol"); | |
94 | |
95 function GetExistingHash(key) { | 94 function GetExistingHash(key) { |
96 if (%_IsSmi(key)) { | 95 if (%_IsSmi(key)) { |
97 return ComputeIntegerHash(key, 0); | 96 return ComputeIntegerHash(key, 0); |
98 } | 97 } |
99 if (IS_STRING(key)) { | 98 if (IS_STRING(key)) { |
100 var field = %_StringGetRawHashField(key); | 99 var field = %_StringGetRawHashField(key); |
101 if ((field & 1 /* Name::kHashNotComputedMask */) === 0) { | 100 if ((field & 1 /* Name::kHashNotComputedMask */) === 0) { |
102 return field >>> 2 /* Name::kHashShift */; | 101 return field >>> 2 /* Name::kHashShift */; |
103 } | 102 } |
104 } else if (IS_SPEC_OBJECT(key) && !%_IsJSProxy(key) && !IS_GLOBAL(key)) { | 103 } else if (IS_SPEC_OBJECT(key) && !%_IsJSProxy(key) && !IS_GLOBAL(key)) { |
105 var hash = GET_PRIVATE(key, hashCodeSymbol); | 104 var hash = GET_PRIVATE(key, HashCodeSymbol); |
106 return hash; | 105 return hash; |
107 } | 106 } |
108 return %GenericHash(key); | 107 return %GenericHash(key); |
109 } | 108 } |
110 %SetForceInlineFlag(GetExistingHash); | 109 %SetForceInlineFlag(GetExistingHash); |
111 | 110 |
112 | 111 |
113 function GetHash(key) { | 112 function GetHash(key) { |
114 var hash = GetExistingHash(key); | 113 var hash = GetExistingHash(key); |
115 if (IS_UNDEFINED(hash)) { | 114 if (IS_UNDEFINED(hash)) { |
116 hash = IntRandom() | 0; | 115 hash = IntRandom() | 0; |
117 if (hash === 0) hash = 1; | 116 if (hash === 0) hash = 1; |
118 SET_PRIVATE(key, hashCodeSymbol, hash); | 117 SET_PRIVATE(key, HashCodeSymbol, hash); |
119 } | 118 } |
120 return hash; | 119 return hash; |
121 } | 120 } |
122 %SetForceInlineFlag(GetHash); | 121 %SetForceInlineFlag(GetHash); |
123 | 122 |
124 | 123 |
125 // ------------------------------------------------------------------- | 124 // ------------------------------------------------------------------- |
126 // Harmony Set | 125 // Harmony Set |
127 | 126 |
128 function SetConstructor(iterable) { | 127 function SetConstructor(iterable) { |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 to.MapHas = MapHas; | 508 to.MapHas = MapHas; |
510 to.MapDelete = MapDelete; | 509 to.MapDelete = MapDelete; |
511 to.SetAdd = SetAdd; | 510 to.SetAdd = SetAdd; |
512 to.SetHas = SetHas; | 511 to.SetHas = SetHas; |
513 to.SetDelete = SetDelete; | 512 to.SetDelete = SetDelete; |
514 to.MapFromArray = MapFromArray; | 513 to.MapFromArray = MapFromArray; |
515 to.SetFromArray = SetFromArray; | 514 to.SetFromArray = SetFromArray; |
516 }); | 515 }); |
517 | 516 |
518 }) | 517 }) |
OLD | NEW |