Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: src/v8natives.js

Issue 9568005: Fix Error.prototype.toString to throw TypeError. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comments by Andreas Rossberg. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/messages.js ('k') | test/mjsunit/function-call.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 var receiver = this; 325 var receiver = this;
326 if (receiver == null && !IS_UNDETECTABLE(receiver)) { 326 if (receiver == null && !IS_UNDETECTABLE(receiver)) {
327 receiver = %GlobalReceiver(global); 327 receiver = %GlobalReceiver(global);
328 } 328 }
329 return %LookupAccessor(ToObject(receiver), ToString(name), SETTER); 329 return %LookupAccessor(ToObject(receiver), ToString(name), SETTER);
330 } 330 }
331 331
332 332
333 function ObjectKeys(obj) { 333 function ObjectKeys(obj) {
334 if (!IS_SPEC_OBJECT(obj)) { 334 if (!IS_SPEC_OBJECT(obj)) {
335 throw MakeTypeError("obj_ctor_property_non_object", ["keys"]); 335 throw MakeTypeError("called_on_non_object", ["Object.keys"]);
336 } 336 }
337 if (%IsJSProxy(obj)) { 337 if (%IsJSProxy(obj)) {
338 var handler = %GetHandler(obj); 338 var handler = %GetHandler(obj);
339 var names = CallTrap0(handler, "keys", DerivedKeysTrap); 339 var names = CallTrap0(handler, "keys", DerivedKeysTrap);
340 return ToStringArray(names); 340 return ToStringArray(names);
341 } 341 }
342 return %LocalKeys(obj); 342 return %LocalKeys(obj);
343 } 343 }
344 344
345 345
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 return DefineArrayProperty(obj, p, desc, should_throw); 936 return DefineArrayProperty(obj, p, desc, should_throw);
937 } else { 937 } else {
938 return DefineObjectProperty(obj, p, desc, should_throw); 938 return DefineObjectProperty(obj, p, desc, should_throw);
939 } 939 }
940 } 940 }
941 941
942 942
943 // ES5 section 15.2.3.2. 943 // ES5 section 15.2.3.2.
944 function ObjectGetPrototypeOf(obj) { 944 function ObjectGetPrototypeOf(obj) {
945 if (!IS_SPEC_OBJECT(obj)) { 945 if (!IS_SPEC_OBJECT(obj)) {
946 throw MakeTypeError("obj_ctor_property_non_object", ["getPrototypeOf"]); 946 throw MakeTypeError("called_on_non_object", ["Object.getPrototypeOf"]);
947 } 947 }
948 return %GetPrototype(obj); 948 return %GetPrototype(obj);
949 } 949 }
950 950
951 951
952 // ES5 section 15.2.3.3 952 // ES5 section 15.2.3.3
953 function ObjectGetOwnPropertyDescriptor(obj, p) { 953 function ObjectGetOwnPropertyDescriptor(obj, p) {
954 if (!IS_SPEC_OBJECT(obj)) { 954 if (!IS_SPEC_OBJECT(obj)) {
955 throw MakeTypeError("obj_ctor_property_non_object", 955 throw MakeTypeError("called_on_non_object",
956 ["getOwnPropertyDescriptor"]); 956 ["Object.getOwnPropertyDescriptor"]);
957 } 957 }
958 var desc = GetOwnProperty(obj, p); 958 var desc = GetOwnProperty(obj, p);
959 return FromPropertyDescriptor(desc); 959 return FromPropertyDescriptor(desc);
960 } 960 }
961 961
962 962
963 // For Harmony proxies 963 // For Harmony proxies
964 function ToStringArray(obj, trap) { 964 function ToStringArray(obj, trap) {
965 if (!IS_SPEC_OBJECT(obj)) { 965 if (!IS_SPEC_OBJECT(obj)) {
966 throw MakeTypeError("proxy_non_object_prop_names", [obj, trap]); 966 throw MakeTypeError("proxy_non_object_prop_names", [obj, trap]);
967 } 967 }
968 var n = ToUint32(obj.length); 968 var n = ToUint32(obj.length);
969 var array = new $Array(n); 969 var array = new $Array(n);
970 var names = {}; // TODO(rossberg): use sets once they are ready. 970 var names = {}; // TODO(rossberg): use sets once they are ready.
971 for (var index = 0; index < n; index++) { 971 for (var index = 0; index < n; index++) {
972 var s = ToString(obj[index]); 972 var s = ToString(obj[index]);
973 if (s in names) { 973 if (s in names) {
974 throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]); 974 throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]);
975 } 975 }
976 array[index] = s; 976 array[index] = s;
977 names[s] = 0; 977 names[s] = 0;
978 } 978 }
979 return array; 979 return array;
980 } 980 }
981 981
982 982
983 // ES5 section 15.2.3.4. 983 // ES5 section 15.2.3.4.
984 function ObjectGetOwnPropertyNames(obj) { 984 function ObjectGetOwnPropertyNames(obj) {
985 if (!IS_SPEC_OBJECT(obj)) { 985 if (!IS_SPEC_OBJECT(obj)) {
986 throw MakeTypeError("obj_ctor_property_non_object", 986 throw MakeTypeError("called_on_non_object", ["Object.getOwnPropertyNames"]);
987 ["getOwnPropertyNames"]);
988 } 987 }
989 // Special handling for proxies. 988 // Special handling for proxies.
990 if (%IsJSProxy(obj)) { 989 if (%IsJSProxy(obj)) {
991 var handler = %GetHandler(obj); 990 var handler = %GetHandler(obj);
992 var names = CallTrap0(handler, "getOwnPropertyNames", void 0); 991 var names = CallTrap0(handler, "getOwnPropertyNames", void 0);
993 return ToStringArray(names, "getOwnPropertyNames"); 992 return ToStringArray(names, "getOwnPropertyNames");
994 } 993 }
995 994
996 // Find all the indexed properties. 995 // Find all the indexed properties.
997 996
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 var obj = new $Object(); 1049 var obj = new $Object();
1051 obj.__proto__ = proto; 1050 obj.__proto__ = proto;
1052 if (!IS_UNDEFINED(properties)) ObjectDefineProperties(obj, properties); 1051 if (!IS_UNDEFINED(properties)) ObjectDefineProperties(obj, properties);
1053 return obj; 1052 return obj;
1054 } 1053 }
1055 1054
1056 1055
1057 // ES5 section 15.2.3.6. 1056 // ES5 section 15.2.3.6.
1058 function ObjectDefineProperty(obj, p, attributes) { 1057 function ObjectDefineProperty(obj, p, attributes) {
1059 if (!IS_SPEC_OBJECT(obj)) { 1058 if (!IS_SPEC_OBJECT(obj)) {
1060 throw MakeTypeError("obj_ctor_property_non_object", ["defineProperty"]); 1059 throw MakeTypeError("called_on_non_object", ["Object.defineProperty"]);
1061 } 1060 }
1062 var name = ToString(p); 1061 var name = ToString(p);
1063 if (%IsJSProxy(obj)) { 1062 if (%IsJSProxy(obj)) {
1064 // Clone the attributes object for protection. 1063 // Clone the attributes object for protection.
1065 // TODO(rossberg): not spec'ed yet, so not sure if this should involve 1064 // TODO(rossberg): not spec'ed yet, so not sure if this should involve
1066 // non-own properties as it does (or non-enumerable ones, as it doesn't?). 1065 // non-own properties as it does (or non-enumerable ones, as it doesn't?).
1067 var attributesClone = {}; 1066 var attributesClone = {};
1068 for (var a in attributes) { 1067 for (var a in attributes) {
1069 attributesClone[a] = attributes[a]; 1068 attributesClone[a] = attributes[a];
1070 } 1069 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 names.push(key); 1101 names.push(key);
1103 } 1102 }
1104 } 1103 }
1105 return names; 1104 return names;
1106 } 1105 }
1107 1106
1108 1107
1109 // ES5 section 15.2.3.7. 1108 // ES5 section 15.2.3.7.
1110 function ObjectDefineProperties(obj, properties) { 1109 function ObjectDefineProperties(obj, properties) {
1111 if (!IS_SPEC_OBJECT(obj)) { 1110 if (!IS_SPEC_OBJECT(obj)) {
1112 throw MakeTypeError("obj_ctor_property_non_object", ["defineProperties"]); 1111 throw MakeTypeError("called_on_non_object", ["Object.defineProperties"]);
1113 } 1112 }
1114 var props = ToObject(properties); 1113 var props = ToObject(properties);
1115 var names = GetOwnEnumerablePropertyNames(props); 1114 var names = GetOwnEnumerablePropertyNames(props);
1116 var descriptors = new InternalArray(); 1115 var descriptors = new InternalArray();
1117 for (var i = 0; i < names.length; i++) { 1116 for (var i = 0; i < names.length; i++) {
1118 descriptors.push(ToPropertyDescriptor(props[names[i]])); 1117 descriptors.push(ToPropertyDescriptor(props[names[i]]));
1119 } 1118 }
1120 for (var i = 0; i < names.length; i++) { 1119 for (var i = 0; i < names.length; i++) {
1121 DefineOwnProperty(obj, names[i], descriptors[i], true); 1120 DefineOwnProperty(obj, names[i], descriptors[i], true);
1122 } 1121 }
(...skipping 26 matching lines...) Expand all
1149 } else { 1148 } else {
1150 %Fix(obj); 1149 %Fix(obj);
1151 } 1150 }
1152 ObjectDefineProperties(obj, props); 1151 ObjectDefineProperties(obj, props);
1153 } 1152 }
1154 1153
1155 1154
1156 // ES5 section 15.2.3.8. 1155 // ES5 section 15.2.3.8.
1157 function ObjectSeal(obj) { 1156 function ObjectSeal(obj) {
1158 if (!IS_SPEC_OBJECT(obj)) { 1157 if (!IS_SPEC_OBJECT(obj)) {
1159 throw MakeTypeError("obj_ctor_property_non_object", ["seal"]); 1158 throw MakeTypeError("called_on_non_object", ["Object.seal"]);
1160 } 1159 }
1161 if (%IsJSProxy(obj)) { 1160 if (%IsJSProxy(obj)) {
1162 ProxyFix(obj); 1161 ProxyFix(obj);
1163 } 1162 }
1164 var names = ObjectGetOwnPropertyNames(obj); 1163 var names = ObjectGetOwnPropertyNames(obj);
1165 for (var i = 0; i < names.length; i++) { 1164 for (var i = 0; i < names.length; i++) {
1166 var name = names[i]; 1165 var name = names[i];
1167 var desc = GetOwnProperty(obj, name); 1166 var desc = GetOwnProperty(obj, name);
1168 if (desc.isConfigurable()) { 1167 if (desc.isConfigurable()) {
1169 desc.setConfigurable(false); 1168 desc.setConfigurable(false);
1170 DefineOwnProperty(obj, name, desc, true); 1169 DefineOwnProperty(obj, name, desc, true);
1171 } 1170 }
1172 } 1171 }
1173 %PreventExtensions(obj); 1172 %PreventExtensions(obj);
1174 return obj; 1173 return obj;
1175 } 1174 }
1176 1175
1177 1176
1178 // ES5 section 15.2.3.9. 1177 // ES5 section 15.2.3.9.
1179 function ObjectFreeze(obj) { 1178 function ObjectFreeze(obj) {
1180 if (!IS_SPEC_OBJECT(obj)) { 1179 if (!IS_SPEC_OBJECT(obj)) {
1181 throw MakeTypeError("obj_ctor_property_non_object", ["freeze"]); 1180 throw MakeTypeError("called_on_non_object", ["Object.freeze"]);
1182 } 1181 }
1183 if (%IsJSProxy(obj)) { 1182 if (%IsJSProxy(obj)) {
1184 ProxyFix(obj); 1183 ProxyFix(obj);
1185 } 1184 }
1186 var names = ObjectGetOwnPropertyNames(obj); 1185 var names = ObjectGetOwnPropertyNames(obj);
1187 for (var i = 0; i < names.length; i++) { 1186 for (var i = 0; i < names.length; i++) {
1188 var name = names[i]; 1187 var name = names[i];
1189 var desc = GetOwnProperty(obj, name); 1188 var desc = GetOwnProperty(obj, name);
1190 if (desc.isWritable() || desc.isConfigurable()) { 1189 if (desc.isWritable() || desc.isConfigurable()) {
1191 if (IsDataDescriptor(desc)) desc.setWritable(false); 1190 if (IsDataDescriptor(desc)) desc.setWritable(false);
1192 desc.setConfigurable(false); 1191 desc.setConfigurable(false);
1193 DefineOwnProperty(obj, name, desc, true); 1192 DefineOwnProperty(obj, name, desc, true);
1194 } 1193 }
1195 } 1194 }
1196 %PreventExtensions(obj); 1195 %PreventExtensions(obj);
1197 return obj; 1196 return obj;
1198 } 1197 }
1199 1198
1200 1199
1201 // ES5 section 15.2.3.10 1200 // ES5 section 15.2.3.10
1202 function ObjectPreventExtension(obj) { 1201 function ObjectPreventExtension(obj) {
1203 if (!IS_SPEC_OBJECT(obj)) { 1202 if (!IS_SPEC_OBJECT(obj)) {
1204 throw MakeTypeError("obj_ctor_property_non_object", ["preventExtension"]); 1203 throw MakeTypeError("called_on_non_object", ["Object.preventExtension"]);
1205 } 1204 }
1206 if (%IsJSProxy(obj)) { 1205 if (%IsJSProxy(obj)) {
1207 ProxyFix(obj); 1206 ProxyFix(obj);
1208 } 1207 }
1209 %PreventExtensions(obj); 1208 %PreventExtensions(obj);
1210 return obj; 1209 return obj;
1211 } 1210 }
1212 1211
1213 1212
1214 // ES5 section 15.2.3.11 1213 // ES5 section 15.2.3.11
1215 function ObjectIsSealed(obj) { 1214 function ObjectIsSealed(obj) {
1216 if (!IS_SPEC_OBJECT(obj)) { 1215 if (!IS_SPEC_OBJECT(obj)) {
1217 throw MakeTypeError("obj_ctor_property_non_object", ["isSealed"]); 1216 throw MakeTypeError("called_on_non_object", ["Object.isSealed"]);
1218 } 1217 }
1219 if (%IsJSProxy(obj)) { 1218 if (%IsJSProxy(obj)) {
1220 return false; 1219 return false;
1221 } 1220 }
1222 var names = ObjectGetOwnPropertyNames(obj); 1221 var names = ObjectGetOwnPropertyNames(obj);
1223 for (var i = 0; i < names.length; i++) { 1222 for (var i = 0; i < names.length; i++) {
1224 var name = names[i]; 1223 var name = names[i];
1225 var desc = GetOwnProperty(obj, name); 1224 var desc = GetOwnProperty(obj, name);
1226 if (desc.isConfigurable()) return false; 1225 if (desc.isConfigurable()) return false;
1227 } 1226 }
1228 if (!ObjectIsExtensible(obj)) { 1227 if (!ObjectIsExtensible(obj)) {
1229 return true; 1228 return true;
1230 } 1229 }
1231 return false; 1230 return false;
1232 } 1231 }
1233 1232
1234 1233
1235 // ES5 section 15.2.3.12 1234 // ES5 section 15.2.3.12
1236 function ObjectIsFrozen(obj) { 1235 function ObjectIsFrozen(obj) {
1237 if (!IS_SPEC_OBJECT(obj)) { 1236 if (!IS_SPEC_OBJECT(obj)) {
1238 throw MakeTypeError("obj_ctor_property_non_object", ["isFrozen"]); 1237 throw MakeTypeError("called_on_non_object", ["Object.isFrozen"]);
1239 } 1238 }
1240 if (%IsJSProxy(obj)) { 1239 if (%IsJSProxy(obj)) {
1241 return false; 1240 return false;
1242 } 1241 }
1243 var names = ObjectGetOwnPropertyNames(obj); 1242 var names = ObjectGetOwnPropertyNames(obj);
1244 for (var i = 0; i < names.length; i++) { 1243 for (var i = 0; i < names.length; i++) {
1245 var name = names[i]; 1244 var name = names[i];
1246 var desc = GetOwnProperty(obj, name); 1245 var desc = GetOwnProperty(obj, name);
1247 if (IsDataDescriptor(desc) && desc.isWritable()) return false; 1246 if (IsDataDescriptor(desc) && desc.isWritable()) return false;
1248 if (desc.isConfigurable()) return false; 1247 if (desc.isConfigurable()) return false;
1249 } 1248 }
1250 if (!ObjectIsExtensible(obj)) { 1249 if (!ObjectIsExtensible(obj)) {
1251 return true; 1250 return true;
1252 } 1251 }
1253 return false; 1252 return false;
1254 } 1253 }
1255 1254
1256 1255
1257 // ES5 section 15.2.3.13 1256 // ES5 section 15.2.3.13
1258 function ObjectIsExtensible(obj) { 1257 function ObjectIsExtensible(obj) {
1259 if (!IS_SPEC_OBJECT(obj)) { 1258 if (!IS_SPEC_OBJECT(obj)) {
1260 throw MakeTypeError("obj_ctor_property_non_object", ["isExtensible"]); 1259 throw MakeTypeError("called_on_non_object", ["Object.isExtensible"]);
1261 } 1260 }
1262 if (%IsJSProxy(obj)) { 1261 if (%IsJSProxy(obj)) {
1263 return true; 1262 return true;
1264 } 1263 }
1265 return %IsExtensible(obj); 1264 return %IsExtensible(obj);
1266 } 1265 }
1267 1266
1268 1267
1269 %SetCode($Object, function(x) { 1268 %SetCode($Object, function(x) {
1270 if (%_IsConstructCall()) { 1269 if (%_IsConstructCall()) {
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 1645
1647 function SetUpFunction() { 1646 function SetUpFunction() {
1648 %CheckIsBootstrapping(); 1647 %CheckIsBootstrapping();
1649 InstallFunctions($Function.prototype, DONT_ENUM, $Array( 1648 InstallFunctions($Function.prototype, DONT_ENUM, $Array(
1650 "bind", FunctionBind, 1649 "bind", FunctionBind,
1651 "toString", FunctionToString 1650 "toString", FunctionToString
1652 )); 1651 ));
1653 } 1652 }
1654 1653
1655 SetUpFunction(); 1654 SetUpFunction();
OLDNEW
« no previous file with comments | « src/messages.js ('k') | test/mjsunit/function-call.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698