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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 if (this == null && !IS_UNDETECTABLE(this)) { | 248 if (this == null && !IS_UNDETECTABLE(this)) { |
249 throw new $TypeError('Object.prototype.__defineGetter__: this is Null'); | 249 throw new $TypeError('Object.prototype.__defineGetter__: this is Null'); |
250 } | 250 } |
251 if (!IS_FUNCTION(fun)) { | 251 if (!IS_FUNCTION(fun)) { |
252 throw new $TypeError('Object.prototype.__defineGetter__: Expecting function'
); | 252 throw new $TypeError('Object.prototype.__defineGetter__: Expecting function'
); |
253 } | 253 } |
254 var desc = new PropertyDescriptor(); | 254 var desc = new PropertyDescriptor(); |
255 desc.setGet(fun); | 255 desc.setGet(fun); |
256 desc.setEnumerable(true); | 256 desc.setEnumerable(true); |
257 desc.setConfigurable(true); | 257 desc.setConfigurable(true); |
258 DefineOwnProperty(ToObject(this), ToString(name), desc, true); | 258 DefineOwnProperty(ToObject(this), ToString(name), desc, false); |
259 } | 259 } |
260 | 260 |
261 | 261 |
262 function ObjectLookupGetter(name) { | 262 function ObjectLookupGetter(name) { |
263 if (this == null && !IS_UNDETECTABLE(this)) { | 263 if (this == null && !IS_UNDETECTABLE(this)) { |
264 throw new $TypeError('Object.prototype.__lookupGetter__: this is Null'); | 264 throw new $TypeError('Object.prototype.__lookupGetter__: this is Null'); |
265 } | 265 } |
266 return %LookupAccessor(ToObject(this), ToString(name), GETTER); | 266 return %LookupAccessor(ToObject(this), ToString(name), GETTER); |
267 } | 267 } |
268 | 268 |
269 | 269 |
270 function ObjectDefineSetter(name, fun) { | 270 function ObjectDefineSetter(name, fun) { |
271 if (this == null && !IS_UNDETECTABLE(this)) { | 271 if (this == null && !IS_UNDETECTABLE(this)) { |
272 throw new $TypeError('Object.prototype.__defineSetter__: this is Null'); | 272 throw new $TypeError('Object.prototype.__defineSetter__: this is Null'); |
273 } | 273 } |
274 if (!IS_FUNCTION(fun)) { | 274 if (!IS_FUNCTION(fun)) { |
275 throw new $TypeError( | 275 throw new $TypeError( |
276 'Object.prototype.__defineSetter__: Expecting function'); | 276 'Object.prototype.__defineSetter__: Expecting function'); |
277 } | 277 } |
278 var desc = new PropertyDescriptor(); | 278 var desc = new PropertyDescriptor(); |
279 desc.setSet(fun); | 279 desc.setSet(fun); |
280 desc.setEnumerable(true); | 280 desc.setEnumerable(true); |
281 desc.setConfigurable(true); | 281 desc.setConfigurable(true); |
282 DefineOwnProperty(ToObject(this), ToString(name), desc, true); | 282 DefineOwnProperty(ToObject(this), ToString(name), desc, false); |
283 } | 283 } |
284 | 284 |
285 | 285 |
286 function ObjectLookupSetter(name) { | 286 function ObjectLookupSetter(name) { |
287 if (this == null && !IS_UNDETECTABLE(this)) { | 287 if (this == null && !IS_UNDETECTABLE(this)) { |
288 throw new $TypeError('Object.prototype.__lookupSetter__: this is Null'); | 288 throw new $TypeError('Object.prototype.__lookupSetter__: this is Null'); |
289 } | 289 } |
290 return %LookupAccessor(ToObject(this), ToString(name), SETTER); | 290 return %LookupAccessor(ToObject(this), ToString(name), SETTER); |
291 } | 291 } |
292 | 292 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 function DefineOwnProperty(obj, p, desc, should_throw) { | 566 function DefineOwnProperty(obj, p, desc, should_throw) { |
567 var current_or_access = %GetOwnProperty(ToObject(obj), ToString(p)); | 567 var current_or_access = %GetOwnProperty(ToObject(obj), ToString(p)); |
568 // A false value here means that access checks failed. | 568 // A false value here means that access checks failed. |
569 if (current_or_access === false) return void 0; | 569 if (current_or_access === false) return void 0; |
570 | 570 |
571 var current = ConvertDescriptorArrayToDescriptor(current_or_access); | 571 var current = ConvertDescriptorArrayToDescriptor(current_or_access); |
572 var extensible = %IsExtensible(ToObject(obj)); | 572 var extensible = %IsExtensible(ToObject(obj)); |
573 | 573 |
574 // Error handling according to spec. | 574 // Error handling according to spec. |
575 // Step 3 | 575 // Step 3 |
576 if (IS_UNDEFINED(current) && !extensible) | 576 if (IS_UNDEFINED(current) && !extensible) { |
577 throw MakeTypeError("define_disallowed", ["defineProperty"]); | 577 if (should_throw) { |
| 578 throw MakeTypeError("define_disallowed", ["defineProperty"]); |
| 579 } else { |
| 580 return; |
| 581 } |
| 582 } |
578 | 583 |
579 if (!IS_UNDEFINED(current)) { | 584 if (!IS_UNDEFINED(current)) { |
580 // Step 5 and 6 | 585 // Step 5 and 6 |
581 if ((IsGenericDescriptor(desc) || | 586 if ((IsGenericDescriptor(desc) || |
582 IsDataDescriptor(desc) == IsDataDescriptor(current)) && | 587 IsDataDescriptor(desc) == IsDataDescriptor(current)) && |
583 (!desc.hasEnumerable() || | 588 (!desc.hasEnumerable() || |
584 SameValue(desc.isEnumerable(), current.isEnumerable())) && | 589 SameValue(desc.isEnumerable(), current.isEnumerable())) && |
585 (!desc.hasConfigurable() || | 590 (!desc.hasConfigurable() || |
586 SameValue(desc.isConfigurable(), current.isConfigurable())) && | 591 SameValue(desc.isConfigurable(), current.isConfigurable())) && |
587 (!desc.hasWritable() || | 592 (!desc.hasWritable() || |
588 SameValue(desc.isWritable(), current.isWritable())) && | 593 SameValue(desc.isWritable(), current.isWritable())) && |
589 (!desc.hasValue() || | 594 (!desc.hasValue() || |
590 SameValue(desc.getValue(), current.getValue())) && | 595 SameValue(desc.getValue(), current.getValue())) && |
591 (!desc.hasGetter() || | 596 (!desc.hasGetter() || |
592 SameValue(desc.getGet(), current.getGet())) && | 597 SameValue(desc.getGet(), current.getGet())) && |
593 (!desc.hasSetter() || | 598 (!desc.hasSetter() || |
594 SameValue(desc.getSet(), current.getSet()))) { | 599 SameValue(desc.getSet(), current.getSet()))) { |
595 return true; | 600 return true; |
596 } | 601 } |
597 if (!current.isConfigurable()) { | 602 if (!current.isConfigurable()) { |
598 // Step 7 | 603 // Step 7 |
599 if (desc.isConfigurable() || | 604 if (desc.isConfigurable() || |
600 (desc.hasEnumerable() && | 605 (desc.hasEnumerable() && |
601 desc.isEnumerable() != current.isEnumerable())) { | 606 desc.isEnumerable() != current.isEnumerable())) { |
602 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); | 607 if (should_throw) { |
| 608 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); |
| 609 } else { |
| 610 return; |
| 611 } |
603 } | 612 } |
604 // Step 8 | 613 // Step 8 |
605 if (!IsGenericDescriptor(desc)) { | 614 if (!IsGenericDescriptor(desc)) { |
606 // Step 9a | 615 // Step 9a |
607 if (IsDataDescriptor(current) != IsDataDescriptor(desc)) { | 616 if (IsDataDescriptor(current) != IsDataDescriptor(desc)) { |
608 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); | 617 if (should_throw) { |
| 618 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); |
| 619 } else { |
| 620 return; |
| 621 } |
609 } | 622 } |
610 // Step 10a | 623 // Step 10a |
611 if (IsDataDescriptor(current) && IsDataDescriptor(desc)) { | 624 if (IsDataDescriptor(current) && IsDataDescriptor(desc)) { |
612 if (!current.isWritable() && desc.isWritable()) { | 625 if (!current.isWritable() && desc.isWritable()) { |
613 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); | 626 if (should_throw) { |
| 627 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); |
| 628 } else { |
| 629 return; |
| 630 } |
614 } | 631 } |
615 if (!current.isWritable() && desc.hasValue() && | 632 if (!current.isWritable() && desc.hasValue() && |
616 !SameValue(desc.getValue(), current.getValue())) { | 633 !SameValue(desc.getValue(), current.getValue())) { |
617 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); | 634 if (should_throw) { |
| 635 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); |
| 636 } else { |
| 637 return; |
| 638 } |
618 } | 639 } |
619 } | 640 } |
620 // Step 11 | 641 // Step 11 |
621 if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) { | 642 if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) { |
622 if (desc.hasSetter() && !SameValue(desc.getSet(), current.getSet())) { | 643 if (desc.hasSetter() && !SameValue(desc.getSet(), current.getSet())) { |
623 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); | 644 if (should_throw) { |
| 645 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); |
| 646 } else { |
| 647 return; |
| 648 } |
624 } | 649 } |
625 if (desc.hasGetter() && !SameValue(desc.getGet(),current.getGet())) { | 650 if (desc.hasGetter() && !SameValue(desc.getGet(),current.getGet())) { |
626 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); | 651 if (should_throw) { |
| 652 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); |
| 653 } else { |
| 654 return; |
| 655 } |
627 } | 656 } |
628 } | 657 } |
629 } | 658 } |
630 } | 659 } |
631 } | 660 } |
632 | 661 |
633 // Send flags - enumerable and configurable are common - writable is | 662 // Send flags - enumerable and configurable are common - writable is |
634 // only send to the data descriptor. | 663 // only send to the data descriptor. |
635 // Take special care if enumerable and configurable is not defined on | 664 // Take special care if enumerable and configurable is not defined on |
636 // desc (we need to preserve the existing values from current). | 665 // desc (we need to preserve the existing values from current). |
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1255 // ---------------------------------------------------------------------------- | 1284 // ---------------------------------------------------------------------------- |
1256 | 1285 |
1257 function SetupFunction() { | 1286 function SetupFunction() { |
1258 InstallFunctions($Function.prototype, DONT_ENUM, $Array( | 1287 InstallFunctions($Function.prototype, DONT_ENUM, $Array( |
1259 "bind", FunctionBind, | 1288 "bind", FunctionBind, |
1260 "toString", FunctionToString | 1289 "toString", FunctionToString |
1261 )); | 1290 )); |
1262 } | 1291 } |
1263 | 1292 |
1264 SetupFunction(); | 1293 SetupFunction(); |
OLD | NEW |