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 (function(global, utils) { | 5 (function(global, utils) { |
6 | 6 |
7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
8 | 8 |
9 // ---------------------------------------------------------------------------- | 9 // ---------------------------------------------------------------------------- |
10 // Imports | 10 // Imports |
(...skipping 1098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 } | 1109 } |
1110 for (var i = 0; i < names.length; i++) { | 1110 for (var i = 0; i < names.length; i++) { |
1111 DefineOwnProperty(obj, names[i], descriptors[i], true); | 1111 DefineOwnProperty(obj, names[i], descriptors[i], true); |
1112 } | 1112 } |
1113 return obj; | 1113 return obj; |
1114 } | 1114 } |
1115 return %ObjectDefineProperties(obj, properties); | 1115 return %ObjectDefineProperties(obj, properties); |
1116 } | 1116 } |
1117 | 1117 |
1118 | 1118 |
1119 // Harmony proxies. | |
1120 function ProxyFix(obj) { | |
1121 var handler = %GetHandler(obj); | |
1122 var props = CallTrap0(handler, "fix", UNDEFINED); | |
1123 if (IS_UNDEFINED(props)) { | |
1124 throw MakeTypeError(kProxyHandlerReturned, handler, "undefined", "fix"); | |
1125 } | |
1126 | |
1127 if (%IsJSFunctionProxy(obj)) { | |
1128 var callTrap = %GetCallTrap(obj); | |
1129 var constructTrap = %GetConstructTrap(obj); | |
1130 var code = ProxyDelegateCallAndConstruct(callTrap, constructTrap); | |
1131 %Fix(obj); // becomes a regular function | |
1132 %SetCode(obj, code); | |
1133 // TODO(rossberg): What about length and other properties? Not specified. | |
1134 // We just put in some half-reasonable defaults for now. | |
1135 var prototype = new GlobalObject(); | |
1136 ObjectDefineProperty(prototype, "constructor", | |
1137 {value: obj, writable: true, enumerable: false, configurable: true}); | |
1138 // TODO(v8:1530): defineProperty does not handle prototype and length. | |
1139 %FunctionSetPrototype(obj, prototype); | |
1140 obj.length = 0; | |
1141 } else { | |
1142 %Fix(obj); | |
1143 } | |
1144 ObjectDefineProperties(obj, props); | |
1145 } | |
1146 | |
1147 | |
1148 // ES5 section 15.2.3.8. | 1119 // ES5 section 15.2.3.8. |
1149 function ObjectSealJS(obj) { | 1120 function ObjectSealJS(obj) { |
1150 if (!IS_SPEC_OBJECT(obj)) return obj; | 1121 if (!IS_SPEC_OBJECT(obj)) return obj; |
1151 var isProxy = %_IsJSProxy(obj); | 1122 var isProxy = %_IsJSProxy(obj); |
1152 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { | 1123 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { |
1153 if (isProxy) { | 1124 // TODO(neis): For proxies, must call preventExtensions trap first. |
1154 ProxyFix(obj); | |
1155 } | |
1156 var names = OwnPropertyKeys(obj); | 1125 var names = OwnPropertyKeys(obj); |
1157 for (var i = 0; i < names.length; i++) { | 1126 for (var i = 0; i < names.length; i++) { |
1158 var name = names[i]; | 1127 var name = names[i]; |
1159 var desc = GetOwnPropertyJS(obj, name); | 1128 var desc = GetOwnPropertyJS(obj, name); |
1160 if (desc.isConfigurable()) { | 1129 if (desc.isConfigurable()) { |
1161 desc.setConfigurable(false); | 1130 desc.setConfigurable(false); |
1162 DefineOwnProperty(obj, name, desc, true); | 1131 DefineOwnProperty(obj, name, desc, true); |
1163 } | 1132 } |
1164 } | 1133 } |
1165 %PreventExtensions(obj); | 1134 %PreventExtensions(obj); |
1166 } else { | 1135 } else { |
1167 // TODO(adamk): Is it worth going to this fast path if the | 1136 // TODO(adamk): Is it worth going to this fast path if the |
1168 // object's properties are already in dictionary mode? | 1137 // object's properties are already in dictionary mode? |
1169 %ObjectSeal(obj); | 1138 %ObjectSeal(obj); |
1170 } | 1139 } |
1171 return obj; | 1140 return obj; |
1172 } | 1141 } |
1173 | 1142 |
1174 | 1143 |
1175 // ES5 section 15.2.3.9. | 1144 // ES5 section 15.2.3.9. |
1176 function ObjectFreezeJS(obj) { | 1145 function ObjectFreezeJS(obj) { |
1177 if (!IS_SPEC_OBJECT(obj)) return obj; | 1146 if (!IS_SPEC_OBJECT(obj)) return obj; |
1178 var isProxy = %_IsJSProxy(obj); | 1147 var isProxy = %_IsJSProxy(obj); |
1179 // TODO(conradw): Investigate modifying the fast path to accommodate strong | 1148 // TODO(conradw): Investigate modifying the fast path to accommodate strong |
1180 // objects. | 1149 // objects. |
1181 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj) || | 1150 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj) || |
1182 IS_STRONG(obj)) { | 1151 IS_STRONG(obj)) { |
1183 if (isProxy) { | 1152 // TODO(neis): For proxies, must call preventExtensions trap first. |
1184 ProxyFix(obj); | |
1185 } | |
1186 var names = OwnPropertyKeys(obj); | 1153 var names = OwnPropertyKeys(obj); |
1187 for (var i = 0; i < names.length; i++) { | 1154 for (var i = 0; i < names.length; i++) { |
1188 var name = names[i]; | 1155 var name = names[i]; |
1189 var desc = GetOwnPropertyJS(obj, name); | 1156 var desc = GetOwnPropertyJS(obj, name); |
1190 if (desc.isWritable() || desc.isConfigurable()) { | 1157 if (desc.isWritable() || desc.isConfigurable()) { |
1191 if (IsDataDescriptor(desc)) desc.setWritable(false); | 1158 if (IsDataDescriptor(desc)) desc.setWritable(false); |
1192 desc.setConfigurable(false); | 1159 desc.setConfigurable(false); |
1193 DefineOwnProperty(obj, name, desc, true); | 1160 DefineOwnProperty(obj, name, desc, true); |
1194 } | 1161 } |
1195 } | 1162 } |
1196 %PreventExtensions(obj); | 1163 %PreventExtensions(obj); |
1197 } else { | 1164 } else { |
1198 // TODO(adamk): Is it worth going to this fast path if the | 1165 // TODO(adamk): Is it worth going to this fast path if the |
1199 // object's properties are already in dictionary mode? | 1166 // object's properties are already in dictionary mode? |
1200 %ObjectFreeze(obj); | 1167 %ObjectFreeze(obj); |
1201 } | 1168 } |
1202 return obj; | 1169 return obj; |
1203 } | 1170 } |
1204 | 1171 |
1205 | 1172 |
1206 // ES5 section 15.2.3.10 | 1173 // ES5 section 15.2.3.10 |
1207 function ObjectPreventExtension(obj) { | 1174 function ObjectPreventExtension(obj) { |
1208 if (!IS_SPEC_OBJECT(obj)) return obj; | 1175 if (!IS_SPEC_OBJECT(obj)) return obj; |
1209 if (%_IsJSProxy(obj)) { | 1176 return %PreventExtensions(obj); |
1210 ProxyFix(obj); | |
1211 } | |
1212 %PreventExtensions(obj); | |
1213 return obj; | |
1214 } | 1177 } |
1215 | 1178 |
1216 | 1179 |
1217 // ES5 section 15.2.3.11 | 1180 // ES5 section 15.2.3.11 |
1218 function ObjectIsSealed(obj) { | 1181 function ObjectIsSealed(obj) { |
1219 if (!IS_SPEC_OBJECT(obj)) return true; | 1182 if (!IS_SPEC_OBJECT(obj)) return true; |
1220 if (%_IsJSProxy(obj)) { | 1183 if (%_IsJSProxy(obj)) { |
1221 return false; | 1184 return false; // TODO(neis): Must call isExtensible trap and ownKeys trap. |
1222 } | 1185 } |
1223 if (%IsExtensible(obj)) { | 1186 if (%IsExtensible(obj)) { |
1224 return false; | 1187 return false; |
1225 } | 1188 } |
1226 var names = OwnPropertyKeys(obj); | 1189 var names = OwnPropertyKeys(obj); |
1227 for (var i = 0; i < names.length; i++) { | 1190 for (var i = 0; i < names.length; i++) { |
1228 var name = names[i]; | 1191 var name = names[i]; |
1229 var desc = GetOwnPropertyJS(obj, name); | 1192 var desc = GetOwnPropertyJS(obj, name); |
1230 if (desc.isConfigurable()) { | 1193 if (desc.isConfigurable()) { |
1231 return false; | 1194 return false; |
1232 } | 1195 } |
1233 } | 1196 } |
1234 return true; | 1197 return true; |
1235 } | 1198 } |
1236 | 1199 |
1237 | 1200 |
1238 // ES5 section 15.2.3.12 | 1201 // ES5 section 15.2.3.12 |
1239 function ObjectIsFrozen(obj) { | 1202 function ObjectIsFrozen(obj) { |
1240 if (!IS_SPEC_OBJECT(obj)) return true; | 1203 if (!IS_SPEC_OBJECT(obj)) return true; |
1241 if (%_IsJSProxy(obj)) { | 1204 if (%_IsJSProxy(obj)) { |
1242 return false; | 1205 return false; // TODO(neis): Must call isExtensible trap and ownKeys trap. |
1243 } | 1206 } |
1244 if (%IsExtensible(obj)) { | 1207 if (%IsExtensible(obj)) { |
1245 return false; | 1208 return false; |
1246 } | 1209 } |
1247 var names = OwnPropertyKeys(obj); | 1210 var names = OwnPropertyKeys(obj); |
1248 for (var i = 0; i < names.length; i++) { | 1211 for (var i = 0; i < names.length; i++) { |
1249 var name = names[i]; | 1212 var name = names[i]; |
1250 var desc = GetOwnPropertyJS(obj, name); | 1213 var desc = GetOwnPropertyJS(obj, name); |
1251 if (IsDataDescriptor(desc) && desc.isWritable()) return false; | 1214 if (IsDataDescriptor(desc) && desc.isWritable()) return false; |
1252 if (desc.isConfigurable()) return false; | 1215 if (desc.isConfigurable()) return false; |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1848 | 1811 |
1849 %InstallToContext([ | 1812 %InstallToContext([ |
1850 "global_eval_fun", GlobalEval, | 1813 "global_eval_fun", GlobalEval, |
1851 "object_value_of", ObjectValueOf, | 1814 "object_value_of", ObjectValueOf, |
1852 "object_to_string", ObjectToString, | 1815 "object_to_string", ObjectToString, |
1853 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, | 1816 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, |
1854 "to_complete_property_descriptor", ToCompletePropertyDescriptor, | 1817 "to_complete_property_descriptor", ToCompletePropertyDescriptor, |
1855 ]); | 1818 ]); |
1856 | 1819 |
1857 }) | 1820 }) |
OLD | NEW |