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 |