| 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 // 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 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 // Harmony proxies. | 656 // Harmony proxies. |
| 657 function DefineProxyProperty(obj, p, attributes, should_throw) { | 657 function DefineProxyProperty(obj, p, attributes, should_throw) { |
| 658 var handler = %GetHandler(obj); | 658 var handler = %GetHandler(obj); |
| 659 var defineProperty = handler.defineProperty; | 659 var defineProperty = handler.defineProperty; |
| 660 if (IS_UNDEFINED(defineProperty)) { | 660 if (IS_UNDEFINED(defineProperty)) { |
| 661 throw MakeTypeError("handler_trap_missing", [handler, "defineProperty"]); | 661 throw MakeTypeError("handler_trap_missing", [handler, "defineProperty"]); |
| 662 } | 662 } |
| 663 var result = %_CallFunction(handler, p, attributes, defineProperty); | 663 var result = %_CallFunction(handler, p, attributes, defineProperty); |
| 664 if (!ToBoolean(result)) { | 664 if (!ToBoolean(result)) { |
| 665 if (should_throw) { | 665 if (should_throw) { |
| 666 throw MakeTypeError("handler_failed", [handler, "defineProperty"]); | 666 throw MakeTypeError("handler_returned_false", |
| 667 [handler, "defineProperty"]); |
| 667 } else { | 668 } else { |
| 668 return false; | 669 return false; |
| 669 } | 670 } |
| 670 } | 671 } |
| 671 return true; | 672 return true; |
| 672 } | 673 } |
| 673 | 674 |
| 674 | 675 |
| 675 // ES5 8.12.9. | 676 // ES5 8.12.9. |
| 676 function DefineOwnProperty(obj, p, desc, should_throw) { | 677 function DefineOwnProperty(obj, p, desc, should_throw) { |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 } | 1014 } |
| 1014 for (var i = 0; i < key_values.length; i += 2) { | 1015 for (var i = 0; i < key_values.length; i += 2) { |
| 1015 var key = key_values[i]; | 1016 var key = key_values[i]; |
| 1016 var desc = key_values[i + 1]; | 1017 var desc = key_values[i + 1]; |
| 1017 DefineOwnProperty(obj, key, desc, true); | 1018 DefineOwnProperty(obj, key, desc, true); |
| 1018 } | 1019 } |
| 1019 return obj; | 1020 return obj; |
| 1020 } | 1021 } |
| 1021 | 1022 |
| 1022 | 1023 |
| 1024 // Harmony proxies. |
| 1025 function ProxyFix(obj) { |
| 1026 var handler = %GetHandler(obj); |
| 1027 var fix = handler.fix; |
| 1028 if (IS_UNDEFINED(fix)) { |
| 1029 throw MakeTypeError("handler_trap_missing", [handler, "fix"]); |
| 1030 } |
| 1031 var props = %_CallFunction(handler, fix); |
| 1032 if (IS_UNDEFINED(props)) { |
| 1033 throw MakeTypeError("handler_returned_undefined", [handler, "fix"]); |
| 1034 } |
| 1035 %Fix(obj); |
| 1036 ObjectDefineProperties(obj, props); |
| 1037 } |
| 1038 |
| 1039 |
| 1023 // ES5 section 15.2.3.8. | 1040 // ES5 section 15.2.3.8. |
| 1024 function ObjectSeal(obj) { | 1041 function ObjectSeal(obj) { |
| 1025 if (!IS_SPEC_OBJECT(obj)) { | 1042 if (!IS_SPEC_OBJECT(obj)) { |
| 1026 throw MakeTypeError("obj_ctor_property_non_object", ["seal"]); | 1043 throw MakeTypeError("obj_ctor_property_non_object", ["seal"]); |
| 1027 } | 1044 } |
| 1045 if (%IsJSProxy(obj)) { |
| 1046 ProxyFix(obj); |
| 1047 } |
| 1028 var names = ObjectGetOwnPropertyNames(obj); | 1048 var names = ObjectGetOwnPropertyNames(obj); |
| 1029 for (var i = 0; i < names.length; i++) { | 1049 for (var i = 0; i < names.length; i++) { |
| 1030 var name = names[i]; | 1050 var name = names[i]; |
| 1031 var desc = GetOwnProperty(obj, name); | 1051 var desc = GetOwnProperty(obj, name); |
| 1032 if (desc.isConfigurable()) { | 1052 if (desc.isConfigurable()) { |
| 1033 desc.setConfigurable(false); | 1053 desc.setConfigurable(false); |
| 1034 DefineOwnProperty(obj, name, desc, true); | 1054 DefineOwnProperty(obj, name, desc, true); |
| 1035 } | 1055 } |
| 1036 } | 1056 } |
| 1037 return ObjectPreventExtension(obj); | 1057 %PreventExtensions(obj); |
| 1058 return obj; |
| 1038 } | 1059 } |
| 1039 | 1060 |
| 1040 | 1061 |
| 1041 // ES5 section 15.2.3.9. | 1062 // ES5 section 15.2.3.9. |
| 1042 function ObjectFreeze(obj) { | 1063 function ObjectFreeze(obj) { |
| 1043 if (!IS_SPEC_OBJECT(obj)) { | 1064 if (!IS_SPEC_OBJECT(obj)) { |
| 1044 throw MakeTypeError("obj_ctor_property_non_object", ["freeze"]); | 1065 throw MakeTypeError("obj_ctor_property_non_object", ["freeze"]); |
| 1045 } | 1066 } |
| 1067 if (%IsJSProxy(obj)) { |
| 1068 ProxyFix(obj); |
| 1069 } |
| 1046 var names = ObjectGetOwnPropertyNames(obj); | 1070 var names = ObjectGetOwnPropertyNames(obj); |
| 1047 for (var i = 0; i < names.length; i++) { | 1071 for (var i = 0; i < names.length; i++) { |
| 1048 var name = names[i]; | 1072 var name = names[i]; |
| 1049 var desc = GetOwnProperty(obj, name); | 1073 var desc = GetOwnProperty(obj, name); |
| 1050 if (desc.isWritable() || desc.isConfigurable()) { | 1074 if (desc.isWritable() || desc.isConfigurable()) { |
| 1051 if (IsDataDescriptor(desc)) desc.setWritable(false); | 1075 if (IsDataDescriptor(desc)) desc.setWritable(false); |
| 1052 desc.setConfigurable(false); | 1076 desc.setConfigurable(false); |
| 1053 DefineOwnProperty(obj, name, desc, true); | 1077 DefineOwnProperty(obj, name, desc, true); |
| 1054 } | 1078 } |
| 1055 } | 1079 } |
| 1056 return ObjectPreventExtension(obj); | 1080 %PreventExtensions(obj); |
| 1081 return obj; |
| 1057 } | 1082 } |
| 1058 | 1083 |
| 1059 | 1084 |
| 1060 // ES5 section 15.2.3.10 | 1085 // ES5 section 15.2.3.10 |
| 1061 function ObjectPreventExtension(obj) { | 1086 function ObjectPreventExtension(obj) { |
| 1062 if (!IS_SPEC_OBJECT(obj)) { | 1087 if (!IS_SPEC_OBJECT(obj)) { |
| 1063 throw MakeTypeError("obj_ctor_property_non_object", ["preventExtension"]); | 1088 throw MakeTypeError("obj_ctor_property_non_object", ["preventExtension"]); |
| 1064 } | 1089 } |
| 1090 if (%IsJSProxy(obj)) { |
| 1091 ProxyFix(obj); |
| 1092 } |
| 1065 %PreventExtensions(obj); | 1093 %PreventExtensions(obj); |
| 1066 return obj; | 1094 return obj; |
| 1067 } | 1095 } |
| 1068 | 1096 |
| 1069 | 1097 |
| 1070 // ES5 section 15.2.3.11 | 1098 // ES5 section 15.2.3.11 |
| 1071 function ObjectIsSealed(obj) { | 1099 function ObjectIsSealed(obj) { |
| 1072 if (!IS_SPEC_OBJECT(obj)) { | 1100 if (!IS_SPEC_OBJECT(obj)) { |
| 1073 throw MakeTypeError("obj_ctor_property_non_object", ["isSealed"]); | 1101 throw MakeTypeError("obj_ctor_property_non_object", ["isSealed"]); |
| 1074 } | 1102 } |
| 1103 if (%IsJSProxy(obj)) { |
| 1104 return false; |
| 1105 } |
| 1075 var names = ObjectGetOwnPropertyNames(obj); | 1106 var names = ObjectGetOwnPropertyNames(obj); |
| 1076 for (var i = 0; i < names.length; i++) { | 1107 for (var i = 0; i < names.length; i++) { |
| 1077 var name = names[i]; | 1108 var name = names[i]; |
| 1078 var desc = GetOwnProperty(obj, name); | 1109 var desc = GetOwnProperty(obj, name); |
| 1079 if (desc.isConfigurable()) return false; | 1110 if (desc.isConfigurable()) return false; |
| 1080 } | 1111 } |
| 1081 if (!ObjectIsExtensible(obj)) { | 1112 if (!ObjectIsExtensible(obj)) { |
| 1082 return true; | 1113 return true; |
| 1083 } | 1114 } |
| 1084 return false; | 1115 return false; |
| 1085 } | 1116 } |
| 1086 | 1117 |
| 1087 | 1118 |
| 1088 // ES5 section 15.2.3.12 | 1119 // ES5 section 15.2.3.12 |
| 1089 function ObjectIsFrozen(obj) { | 1120 function ObjectIsFrozen(obj) { |
| 1090 if (!IS_SPEC_OBJECT(obj)) { | 1121 if (!IS_SPEC_OBJECT(obj)) { |
| 1091 throw MakeTypeError("obj_ctor_property_non_object", ["isFrozen"]); | 1122 throw MakeTypeError("obj_ctor_property_non_object", ["isFrozen"]); |
| 1092 } | 1123 } |
| 1124 if (%IsJSProxy(obj)) { |
| 1125 return false; |
| 1126 } |
| 1093 var names = ObjectGetOwnPropertyNames(obj); | 1127 var names = ObjectGetOwnPropertyNames(obj); |
| 1094 for (var i = 0; i < names.length; i++) { | 1128 for (var i = 0; i < names.length; i++) { |
| 1095 var name = names[i]; | 1129 var name = names[i]; |
| 1096 var desc = GetOwnProperty(obj, name); | 1130 var desc = GetOwnProperty(obj, name); |
| 1097 if (IsDataDescriptor(desc) && desc.isWritable()) return false; | 1131 if (IsDataDescriptor(desc) && desc.isWritable()) return false; |
| 1098 if (desc.isConfigurable()) return false; | 1132 if (desc.isConfigurable()) return false; |
| 1099 } | 1133 } |
| 1100 if (!ObjectIsExtensible(obj)) { | 1134 if (!ObjectIsExtensible(obj)) { |
| 1101 return true; | 1135 return true; |
| 1102 } | 1136 } |
| 1103 return false; | 1137 return false; |
| 1104 } | 1138 } |
| 1105 | 1139 |
| 1106 | 1140 |
| 1107 // ES5 section 15.2.3.13 | 1141 // ES5 section 15.2.3.13 |
| 1108 function ObjectIsExtensible(obj) { | 1142 function ObjectIsExtensible(obj) { |
| 1109 if (!IS_SPEC_OBJECT(obj)) { | 1143 if (!IS_SPEC_OBJECT(obj)) { |
| 1110 throw MakeTypeError("obj_ctor_property_non_object", ["isExtensible"]); | 1144 throw MakeTypeError("obj_ctor_property_non_object", ["isExtensible"]); |
| 1111 } | 1145 } |
| 1146 if (%IsJSProxy(obj)) { |
| 1147 return true; |
| 1148 } |
| 1112 return %IsExtensible(obj); | 1149 return %IsExtensible(obj); |
| 1113 } | 1150 } |
| 1114 | 1151 |
| 1115 | 1152 |
| 1116 %SetCode($Object, function(x) { | 1153 %SetCode($Object, function(x) { |
| 1117 if (%_IsConstructCall()) { | 1154 if (%_IsConstructCall()) { |
| 1118 if (x == null) return this; | 1155 if (x == null) return this; |
| 1119 return ToObject(x); | 1156 return ToObject(x); |
| 1120 } else { | 1157 } else { |
| 1121 if (x == null) return { }; | 1158 if (x == null) return { }; |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1482 // ---------------------------------------------------------------------------- | 1519 // ---------------------------------------------------------------------------- |
| 1483 | 1520 |
| 1484 function SetupFunction() { | 1521 function SetupFunction() { |
| 1485 InstallFunctions($Function.prototype, DONT_ENUM, $Array( | 1522 InstallFunctions($Function.prototype, DONT_ENUM, $Array( |
| 1486 "bind", FunctionBind, | 1523 "bind", FunctionBind, |
| 1487 "toString", FunctionToString | 1524 "toString", FunctionToString |
| 1488 )); | 1525 )); |
| 1489 } | 1526 } |
| 1490 | 1527 |
| 1491 SetupFunction(); | 1528 SetupFunction(); |
| OLD | NEW |