Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1031 } | 1031 } |
| 1032 array[index] = s; | 1032 array[index] = s; |
| 1033 ++realLength; | 1033 ++realLength; |
| 1034 names[s] = 0; | 1034 names[s] = 0; |
| 1035 } | 1035 } |
| 1036 array.length = realLength; | 1036 array.length = realLength; |
| 1037 return array; | 1037 return array; |
| 1038 } | 1038 } |
| 1039 | 1039 |
| 1040 | 1040 |
| 1041 function GetSymbolsInArray(propertyKeys) { | |
|
rossberg
2013/12/10 10:39:53
Nit: perhaps call this FilterPublicSymbols?
arv (Not doing code reviews)
2013/12/11 00:16:26
Done.
| |
| 1042 var symbols = new InternalArray(); | |
| 1043 var j = 0; | |
| 1044 for (var i = 0; i < propertyKeys.length; i++) { | |
| 1045 if (IS_SYMBOL(propertyKeys[i]) && !%SymbolIsPrivate(propertyKeys[i])) { | |
|
rossberg
2013/12/10 10:39:53
It might make sense to introduce an IS_PRIVATE mac
arv (Not doing code reviews)
2013/12/11 00:16:26
Done.
| |
| 1046 symbols[j++] = propertyKeys[i]; | |
| 1047 } | |
| 1048 } | |
| 1049 return symbols; | |
| 1050 } | |
| 1051 | |
| 1052 | |
| 1053 // ES6 19.1.2.8 | |
| 1054 function ObjectGetOwnPropertySymbols(obj) { | |
| 1055 if (!IS_SPEC_OBJECT(obj)) { | |
| 1056 throw MakeTypeError("called_on_non_object", | |
| 1057 ["Object.getOwnPropertySymbols"]); | |
| 1058 } | |
| 1059 | |
| 1060 // FIXME: Proxies use a shared trap for String and Symbol keys. | |
|
rossberg
2013/12/10 10:39:53
Please use TODO(arv); same below
arv (Not doing code reviews)
2013/12/11 00:16:26
Done.
| |
| 1061 | |
| 1062 var nameArrays = new InternalArray(); | |
| 1063 | |
| 1064 // Find all the indexed properties. | |
| 1065 | |
| 1066 // Get names for indexed interceptor properties. | |
| 1067 var interceptorInfo = %GetInterceptorInfo(obj); | |
| 1068 | |
| 1069 // Find all the named properties. | |
| 1070 | |
| 1071 // Get the local property symbols. | |
| 1072 // FIXME: Have the runtime do the filtering. | |
|
rossberg
2013/12/10 10:39:53
Yeah, I would very much prefer to have this implem
| |
| 1073 nameArrays.push(GetSymbolsInArray(%GetLocalPropertyNames(obj, true))); | |
| 1074 | |
| 1075 // Get names for named interceptor properties if any. | |
| 1076 if ((interceptorInfo & 2) != 0) { | |
| 1077 // FIXME: Have the runtime do the filtering. | |
| 1078 var namedInterceptorNames = %GetNamedInterceptorPropertyNames(obj); | |
| 1079 if (!IS_UNDEFINED(namedInterceptorNames)) { | |
| 1080 nameArrays.push(GetSymbolsInArray(namedInterceptorSymbols)); | |
| 1081 } | |
| 1082 } | |
| 1083 | |
| 1084 var propertySymbols = | |
| 1085 %Apply(InternalArray.prototype.concat, | |
| 1086 nameArrays[0], nameArrays, 1, nameArrays.length - 1); | |
| 1087 | |
| 1088 // Property names are expected to be unique, | |
| 1089 // but interceptors can interfere with that assumption. | |
| 1090 if (interceptorInfo != 0) { | |
| 1091 var propertySet = { __proto__: null }; | |
| 1092 var j = 0; | |
| 1093 for (var i = 0; i < propertySymbols.length; ++i) { | |
| 1094 var symbol = propertySymbols[i]; | |
| 1095 if (!IS_SYMBOL(symbol) || %SymbolIsPrivate(symbol)) continue; | |
| 1096 | |
| 1097 // We need to check for the exact property value since for intrinsic | |
| 1098 // properties like toString if(propertySet["toString"]) will always | |
| 1099 // succeed. | |
| 1100 if (propertySet[symbol] === true) { | |
|
rossberg
2013/12/10 10:39:53
Could combine this with the previous if.
arv (Not doing code reviews)
2013/12/11 00:16:26
I also don't think this comment is correct. proper
| |
| 1101 continue; | |
| 1102 } | |
| 1103 propertySet[symbol] = true; | |
| 1104 propertySymbols[j++] = symbol; | |
| 1105 } | |
| 1106 propertySymbols.length = j; | |
| 1107 } | |
| 1108 | |
| 1109 return propertySymbols; | |
| 1110 } | |
| 1111 | |
| 1041 // ES5 section 15.2.3.4. | 1112 // ES5 section 15.2.3.4. |
| 1042 function ObjectGetOwnPropertyNames(obj) { | 1113 function ObjectGetOwnPropertyNames(obj) { |
| 1043 if (!IS_SPEC_OBJECT(obj)) { | 1114 if (!IS_SPEC_OBJECT(obj)) { |
| 1044 throw MakeTypeError("called_on_non_object", ["Object.getOwnPropertyNames"]); | 1115 throw MakeTypeError("called_on_non_object", ["Object.getOwnPropertyNames"]); |
| 1045 } | 1116 } |
| 1046 // Special handling for proxies. | 1117 // Special handling for proxies. |
| 1047 if (%IsJSProxy(obj)) { | 1118 if (%IsJSProxy(obj)) { |
| 1048 var handler = %GetHandler(obj); | 1119 var handler = %GetHandler(obj); |
| 1049 var names = CallTrap0(handler, "getOwnPropertyNames", UNDEFINED); | 1120 var names = CallTrap0(handler, "getOwnPropertyNames", UNDEFINED); |
| 1050 return ToNameArray(names, "getOwnPropertyNames", false); | 1121 return ToNameArray(names, "getOwnPropertyNames", false); |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1413 // Set up non-enumerable functions in the Object object. | 1484 // Set up non-enumerable functions in the Object object. |
| 1414 InstallFunctions($Object, DONT_ENUM, $Array( | 1485 InstallFunctions($Object, DONT_ENUM, $Array( |
| 1415 "keys", ObjectKeys, | 1486 "keys", ObjectKeys, |
| 1416 "create", ObjectCreate, | 1487 "create", ObjectCreate, |
| 1417 "defineProperty", ObjectDefineProperty, | 1488 "defineProperty", ObjectDefineProperty, |
| 1418 "defineProperties", ObjectDefineProperties, | 1489 "defineProperties", ObjectDefineProperties, |
| 1419 "freeze", ObjectFreeze, | 1490 "freeze", ObjectFreeze, |
| 1420 "getPrototypeOf", ObjectGetPrototypeOf, | 1491 "getPrototypeOf", ObjectGetPrototypeOf, |
| 1421 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, | 1492 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, |
| 1422 "getOwnPropertyNames", ObjectGetOwnPropertyNames, | 1493 "getOwnPropertyNames", ObjectGetOwnPropertyNames, |
| 1494 // getOwnPropertySymbols is added in symbol.js | |
|
rossberg
2013/12/10 10:39:53
Good to have that comment here. While you're at it
arv (Not doing code reviews)
2013/12/11 00:16:26
Done.
| |
| 1423 "is", ObjectIs, | 1495 "is", ObjectIs, |
| 1424 "isExtensible", ObjectIsExtensible, | 1496 "isExtensible", ObjectIsExtensible, |
| 1425 "isFrozen", ObjectIsFrozen, | 1497 "isFrozen", ObjectIsFrozen, |
| 1426 "isSealed", ObjectIsSealed, | 1498 "isSealed", ObjectIsSealed, |
| 1427 "preventExtensions", ObjectPreventExtension, | 1499 "preventExtensions", ObjectPreventExtension, |
| 1428 "seal", ObjectSeal | 1500 "seal", ObjectSeal |
| 1429 )); | 1501 )); |
| 1430 } | 1502 } |
| 1431 | 1503 |
| 1432 SetUpObject(); | 1504 SetUpObject(); |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1845 // Eventually, we should move to a real event queue that allows to maintain | 1917 // Eventually, we should move to a real event queue that allows to maintain |
| 1846 // relative ordering of different kinds of tasks. | 1918 // relative ordering of different kinds of tasks. |
| 1847 | 1919 |
| 1848 RunMicrotasks.runners = new InternalArray; | 1920 RunMicrotasks.runners = new InternalArray; |
| 1849 | 1921 |
| 1850 function RunMicrotasks() { | 1922 function RunMicrotasks() { |
| 1851 while (%SetMicrotaskPending(false)) { | 1923 while (%SetMicrotaskPending(false)) { |
| 1852 for (var i in RunMicrotasks.runners) RunMicrotasks.runners[i](); | 1924 for (var i in RunMicrotasks.runners) RunMicrotasks.runners[i](); |
| 1853 } | 1925 } |
| 1854 } | 1926 } |
| OLD | NEW |