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

Side by Side Diff: src/v8natives.js

Issue 8352004: [[DefineOwnProperty]] should always return true/false (or throw an exception), never undefined. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 2 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 | « no previous file | no next file » | 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 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 697
698 var current = ConvertDescriptorArrayToDescriptor(current_or_access); 698 var current = ConvertDescriptorArrayToDescriptor(current_or_access);
699 var extensible = %IsExtensible(ToObject(obj)); 699 var extensible = %IsExtensible(ToObject(obj));
700 700
701 // Error handling according to spec. 701 // Error handling according to spec.
702 // Step 3 702 // Step 3
703 if (IS_UNDEFINED(current) && !extensible) { 703 if (IS_UNDEFINED(current) && !extensible) {
704 if (should_throw) { 704 if (should_throw) {
705 throw MakeTypeError("define_disallowed", [p]); 705 throw MakeTypeError("define_disallowed", [p]);
706 } else { 706 } else {
707 return; 707 return false;
708 } 708 }
709 } 709 }
710 710
711 if (!IS_UNDEFINED(current)) { 711 if (!IS_UNDEFINED(current)) {
712 // Step 5 and 6 712 // Step 5 and 6
713 if ((IsGenericDescriptor(desc) || 713 if ((IsGenericDescriptor(desc) ||
714 IsDataDescriptor(desc) == IsDataDescriptor(current)) && 714 IsDataDescriptor(desc) == IsDataDescriptor(current)) &&
715 (!desc.hasEnumerable() || 715 (!desc.hasEnumerable() ||
716 SameValue(desc.isEnumerable(), current.isEnumerable())) && 716 SameValue(desc.isEnumerable(), current.isEnumerable())) &&
717 (!desc.hasConfigurable() || 717 (!desc.hasConfigurable() ||
718 SameValue(desc.isConfigurable(), current.isConfigurable())) && 718 SameValue(desc.isConfigurable(), current.isConfigurable())) &&
719 (!desc.hasWritable() || 719 (!desc.hasWritable() ||
720 SameValue(desc.isWritable(), current.isWritable())) && 720 SameValue(desc.isWritable(), current.isWritable())) &&
721 (!desc.hasValue() || 721 (!desc.hasValue() ||
722 SameValue(desc.getValue(), current.getValue())) && 722 SameValue(desc.getValue(), current.getValue())) &&
723 (!desc.hasGetter() || 723 (!desc.hasGetter() ||
724 SameValue(desc.getGet(), current.getGet())) && 724 SameValue(desc.getGet(), current.getGet())) &&
725 (!desc.hasSetter() || 725 (!desc.hasSetter() ||
726 SameValue(desc.getSet(), current.getSet()))) { 726 SameValue(desc.getSet(), current.getSet()))) {
727 return true; 727 return true;
728 } 728 }
729 if (!current.isConfigurable()) { 729 if (!current.isConfigurable()) {
730 // Step 7 730 // Step 7
731 if (desc.isConfigurable() || 731 if (desc.isConfigurable() ||
732 (desc.hasEnumerable() && 732 (desc.hasEnumerable() &&
733 desc.isEnumerable() != current.isEnumerable())) { 733 desc.isEnumerable() != current.isEnumerable())) {
734 if (should_throw) { 734 if (should_throw) {
735 throw MakeTypeError("redefine_disallowed", [p]); 735 throw MakeTypeError("redefine_disallowed", [p]);
736 } else { 736 } else {
737 return; 737 return false;
738 } 738 }
739 } 739 }
740 // Step 8 740 // Step 8
741 if (!IsGenericDescriptor(desc)) { 741 if (!IsGenericDescriptor(desc)) {
742 // Step 9a 742 // Step 9a
743 if (IsDataDescriptor(current) != IsDataDescriptor(desc)) { 743 if (IsDataDescriptor(current) != IsDataDescriptor(desc)) {
744 if (should_throw) { 744 if (should_throw) {
745 throw MakeTypeError("redefine_disallowed", [p]); 745 throw MakeTypeError("redefine_disallowed", [p]);
746 } else { 746 } else {
747 return; 747 return false;
748 } 748 }
749 } 749 }
750 // Step 10a 750 // Step 10a
751 if (IsDataDescriptor(current) && IsDataDescriptor(desc)) { 751 if (IsDataDescriptor(current) && IsDataDescriptor(desc)) {
752 if (!current.isWritable() && desc.isWritable()) { 752 if (!current.isWritable() && desc.isWritable()) {
753 if (should_throw) { 753 if (should_throw) {
754 throw MakeTypeError("redefine_disallowed", [p]); 754 throw MakeTypeError("redefine_disallowed", [p]);
755 } else { 755 } else {
756 return; 756 return false;
757 } 757 }
758 } 758 }
759 if (!current.isWritable() && desc.hasValue() && 759 if (!current.isWritable() && desc.hasValue() &&
760 !SameValue(desc.getValue(), current.getValue())) { 760 !SameValue(desc.getValue(), current.getValue())) {
761 if (should_throw) { 761 if (should_throw) {
762 throw MakeTypeError("redefine_disallowed", [p]); 762 throw MakeTypeError("redefine_disallowed", [p]);
763 } else { 763 } else {
764 return; 764 return false;
765 } 765 }
766 } 766 }
767 } 767 }
768 // Step 11 768 // Step 11
769 if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) { 769 if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) {
770 if (desc.hasSetter() && !SameValue(desc.getSet(), current.getSet())) { 770 if (desc.hasSetter() && !SameValue(desc.getSet(), current.getSet())) {
771 if (should_throw) { 771 if (should_throw) {
772 throw MakeTypeError("redefine_disallowed", [p]); 772 throw MakeTypeError("redefine_disallowed", [p]);
773 } else { 773 } else {
774 return; 774 return false;
775 } 775 }
776 } 776 }
777 if (desc.hasGetter() && !SameValue(desc.getGet(),current.getGet())) { 777 if (desc.hasGetter() && !SameValue(desc.getGet(),current.getGet())) {
778 if (should_throw) { 778 if (should_throw) {
779 throw MakeTypeError("redefine_disallowed", [p]); 779 throw MakeTypeError("redefine_disallowed", [p]);
780 } else { 780 } else {
781 return; 781 return false;
782 } 782 }
783 } 783 }
784 } 784 }
785 } 785 }
786 } 786 }
787 } 787 }
788 788
789 // Send flags - enumerable and configurable are common - writable is 789 // Send flags - enumerable and configurable are common - writable is
790 // only send to the data descriptor. 790 // only send to the data descriptor.
791 // Take special care if enumerable and configurable is not defined on 791 // Take special care if enumerable and configurable is not defined on
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 } 874 }
875 875
876 // Step 4 - Special handling for array index. 876 // Step 4 - Special handling for array index.
877 var index = ToUint32(p); 877 var index = ToUint32(p);
878 if (index == ToNumber(p) && index != 4294967295) { 878 if (index == ToNumber(p) && index != 4294967295) {
879 if ((index >= length && !length_desc.isWritable()) || 879 if ((index >= length && !length_desc.isWritable()) ||
880 !DefineObjectProperty(obj, p, desc, true)) { 880 !DefineObjectProperty(obj, p, desc, true)) {
881 if (should_throw) { 881 if (should_throw) {
882 throw MakeTypeError("define_disallowed", [p]); 882 throw MakeTypeError("define_disallowed", [p]);
883 } else { 883 } else {
884 return; 884 return false;
885 } 885 }
886 } 886 }
887 if (index >= length) { 887 if (index >= length) {
888 // TODO(mstarzinger): We should actually set the value of the property 888 // TODO(mstarzinger): We should actually set the value of the property
889 // descriptor here and pass it to DefineObjectProperty(). Take a look at 889 // descriptor here and pass it to DefineObjectProperty(). Take a look at
890 // ES5 section 15.4.5.1, step 4.e.i and 4.e.ii for details. 890 // ES5 section 15.4.5.1, step 4.e.i and 4.e.ii for details.
891 obj.length = index + 1; 891 obj.length = index + 1;
892 } 892 }
893 return true; 893 return true;
894 } 894 }
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after
1606 1606
1607 function SetUpFunction() { 1607 function SetUpFunction() {
1608 %CheckIsBootstrapping(); 1608 %CheckIsBootstrapping();
1609 InstallFunctions($Function.prototype, DONT_ENUM, $Array( 1609 InstallFunctions($Function.prototype, DONT_ENUM, $Array(
1610 "bind", FunctionBind, 1610 "bind", FunctionBind,
1611 "toString", FunctionToString 1611 "toString", FunctionToString
1612 )); 1612 ));
1613 } 1613 }
1614 1614
1615 SetUpFunction(); 1615 SetUpFunction();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698