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

Side by Side Diff: test/mjsunit/object-define-property.js

Issue 5861006: Change Object.defineProperty to accept undefined as getters and setters and t... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years 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/v8natives.js ('k') | test/mjsunit/regress/regress-687.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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 function setter2() {val2++; } 67 function setter2() {val2++; }
68 function getter2() {return val2; } 68 function getter2() {return val2; }
69 69
70 function setter3() {val3++; } 70 function setter3() {val3++; }
71 function getter3() {return val3; } 71 function getter3() {return val3; }
72 72
73 73
74 // Descriptors. 74 // Descriptors.
75 var emptyDesc = {}; 75 var emptyDesc = {};
76 76
77 var accessorConfigurable = { 77 var accessorConfigurable = {
78 set: setter1, 78 set: setter1,
79 get: getter1, 79 get: getter1,
80 configurable: true 80 configurable: true
81 }; 81 };
82 82
83 var accessorNoConfigurable = { 83 var accessorNoConfigurable = {
84 set: setter2, 84 set: setter2,
85 get: getter2, 85 get: getter2,
86 configurable: false 86 configurable: false
87 }; 87 };
88 88
89 var accessorOnlySet = { 89 var accessorOnlySet = {
90 set: setter3, 90 set: setter3,
91 configurable: true 91 configurable: true
92 }; 92 };
93 93
94 var accessorOnlyGet = { 94 var accessorOnlyGet = {
95 get: getter3, 95 get: getter3,
96 configurable: true 96 configurable: true
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); 227 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly");
228 assertTrue(desc.configurable); 228 assertTrue(desc.configurable);
229 assertFalse(desc.enumerable); 229 assertFalse(desc.enumerable);
230 assertEquals(desc.get, accessorOnlyGet.get); 230 assertEquals(desc.get, accessorOnlyGet.get);
231 assertEquals(desc.set, accessorOnlySet.set); 231 assertEquals(desc.set, accessorOnlySet.set);
232 assertEquals(desc.writable, undefined); 232 assertEquals(desc.writable, undefined);
233 assertEquals(desc.value, undefined); 233 assertEquals(desc.value, undefined);
234 assertEquals(1, obj1.setOnly = 1); 234 assertEquals(1, obj1.setOnly = 1);
235 assertEquals(2, val3); 235 assertEquals(2, val3);
236 236
237 // The above should also work if redefining just a getter or setter on 237 // The above should also work if redefining just a getter or setter on
238 // an existing property with both a getter and a setter. 238 // an existing property with both a getter and a setter.
239 Object.defineProperty(obj1, "both", accessorConfigurable); 239 Object.defineProperty(obj1, "both", accessorConfigurable);
240 240
241 Object.defineProperty(obj1, "both", accessorOnlySet); 241 Object.defineProperty(obj1, "both", accessorOnlySet);
242 desc = Object.getOwnPropertyDescriptor(obj1, "both"); 242 desc = Object.getOwnPropertyDescriptor(obj1, "both");
243 assertTrue(desc.configurable); 243 assertTrue(desc.configurable);
244 assertFalse(desc.enumerable); 244 assertFalse(desc.enumerable);
245 assertEquals(desc.set, accessorOnlySet.set); 245 assertEquals(desc.set, accessorOnlySet.set);
246 assertEquals(desc.get, accessorConfigurable.get); 246 assertEquals(desc.get, accessorConfigurable.get);
247 assertEquals(desc.writable, undefined); 247 assertEquals(desc.writable, undefined);
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); 377 desc = Object.getOwnPropertyDescriptor(obj2, "bar");
378 assertEquals(obj2.bar, 1000); 378 assertEquals(obj2.bar, 1000);
379 assertEquals(desc.value, 1000); 379 assertEquals(desc.value, 1000);
380 assertTrue(desc.configurable); 380 assertTrue(desc.configurable);
381 assertFalse(desc.writable); 381 assertFalse(desc.writable);
382 assertFalse(desc.enumerable); 382 assertFalse(desc.enumerable);
383 assertEquals(desc.get, undefined); 383 assertEquals(desc.get, undefined);
384 assertEquals(desc.set, undefined); 384 assertEquals(desc.set, undefined);
385 385
386 386
387 // Redefinition of an accessor defined using __defineGetter__ and 387 // Redefinition of an accessor defined using __defineGetter__ and
388 // __defineSetter__. 388 // __defineSetter__.
389 function get(){return this.x} 389 function get(){return this.x}
390 function set(x){this.x=x}; 390 function set(x){this.x=x};
391 391
392 var obj3 = {x:1000}; 392 var obj3 = {x:1000};
393 obj3.__defineGetter__("foo", get); 393 obj3.__defineGetter__("foo", get);
394 obj3.__defineSetter__("foo", set); 394 obj3.__defineSetter__("foo", set);
395 395
396 desc = Object.getOwnPropertyDescriptor(obj3, "foo"); 396 desc = Object.getOwnPropertyDescriptor(obj3, "foo");
397 assertTrue(desc.configurable); 397 assertTrue(desc.configurable);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 // Make sure an error is thrown when trying to access to redefined function. 455 // Make sure an error is thrown when trying to access to redefined function.
456 try { 456 try {
457 obj4.bar(); 457 obj4.bar();
458 assertTrue(false); 458 assertTrue(false);
459 } catch (e) { 459 } catch (e) {
460 assertTrue(/is not a function/.test(e)); 460 assertTrue(/is not a function/.test(e));
461 } 461 }
462 462
463 463
464 // Test runtime calls to DefineOrRedefineDataProperty and 464 // Test runtime calls to DefineOrRedefineDataProperty and
465 // DefineOrRedefineAccessorProperty - make sure we don't 465 // DefineOrRedefineAccessorProperty - make sure we don't
466 // crash. 466 // crash.
467 try { 467 try {
468 %DefineOrRedefineAccessorProperty(0, 0, 0, 0, 0); 468 %DefineOrRedefineAccessorProperty(0, 0, 0, 0, 0);
469 } catch (e) { 469 } catch (e) {
470 assertTrue(/illegal access/.test(e)); 470 assertTrue(/illegal access/.test(e));
471 } 471 }
472 472
473 try { 473 try {
474 %DefineOrRedefineDataProperty(0, 0, 0, 0); 474 %DefineOrRedefineDataProperty(0, 0, 0, 0);
475 } catch (e) { 475 } catch (e) {
(...skipping 28 matching lines...) Expand all
504 504
505 try { 505 try {
506 %DefineOrRedefineDataProperty(null, 'foo', 0, 0); 506 %DefineOrRedefineDataProperty(null, 'foo', 0, 0);
507 } catch (e) { 507 } catch (e) {
508 assertTrue(/illegal access/.test(e)); 508 assertTrue(/illegal access/.test(e));
509 } 509 }
510 510
511 // Test that all possible differences in step 6 in DefineOwnProperty are 511 // Test that all possible differences in step 6 in DefineOwnProperty are
512 // exercised, i.e., any difference in the given property descriptor and the 512 // exercised, i.e., any difference in the given property descriptor and the
513 // existing properties should not return true, but throw an error if the 513 // existing properties should not return true, but throw an error if the
514 // existing configurable property is false. 514 // existing configurable property is false.
515 515
516 var obj5 = {}; 516 var obj5 = {};
517 // Enumerable will default to false. 517 // Enumerable will default to false.
518 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); 518 Object.defineProperty(obj5, 'foo', accessorNoConfigurable);
519 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); 519 desc = Object.getOwnPropertyDescriptor(obj5, 'foo');
520 // First, test that we are actually allowed to set the accessor if all 520 // First, test that we are actually allowed to set the accessor if all
521 // values are of the descriptor are the same as the existing one. 521 // values are of the descriptor are the same as the existing one.
522 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); 522 Object.defineProperty(obj5, 'foo', accessorNoConfigurable);
523 523
524 // Different setter. 524 // Different setter.
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 obj6[1] = 'foo'; 720 obj6[1] = 'foo';
721 obj6[2] = 'bar'; 721 obj6[2] = 'bar';
722 obj6[3] = '42'; 722 obj6[3] = '42';
723 obj6[4] = '43'; 723 obj6[4] = '43';
724 obj6[5] = '44'; 724 obj6[5] = '44';
725 725
726 var descElement = { value: 'foobar' }; 726 var descElement = { value: 'foobar' };
727 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; 727 var descElementNonConfigurable = { value: 'barfoo', configurable: false };
728 var descElementNonWritable = { value: 'foofoo', writable: false }; 728 var descElementNonWritable = { value: 'foofoo', writable: false };
729 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; 729 var descElementNonEnumerable = { value: 'barbar', enumerable: false };
730 var descElementAllFalse = { value: 'foofalse', 730 var descElementAllFalse = { value: 'foofalse',
731 configurable: false, 731 configurable: false,
732 writable: false, 732 writable: false,
733 enumerable: false }; 733 enumerable: false };
734 734
735 735
736 // Redefine existing property. 736 // Redefine existing property.
737 Object.defineProperty(obj6, '1', descElement); 737 Object.defineProperty(obj6, '1', descElement);
738 desc = Object.getOwnPropertyDescriptor(obj6, '1'); 738 desc = Object.getOwnPropertyDescriptor(obj6, '1');
739 assertEquals(desc.value, 'foobar'); 739 assertEquals(desc.value, 'foobar');
740 assertTrue(desc.writable); 740 assertTrue(desc.writable);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 // Define non existing property - all attributes should default to false. 783 // Define non existing property - all attributes should default to false.
784 Object.defineProperty(obj6, '15', descElement); 784 Object.defineProperty(obj6, '15', descElement);
785 desc = Object.getOwnPropertyDescriptor(obj6, '15'); 785 desc = Object.getOwnPropertyDescriptor(obj6, '15');
786 assertEquals(desc.value, 'foobar'); 786 assertEquals(desc.value, 'foobar');
787 assertFalse(desc.writable); 787 assertFalse(desc.writable);
788 assertFalse(desc.enumerable); 788 assertFalse(desc.enumerable);
789 assertFalse(desc.configurable); 789 assertFalse(desc.configurable);
790 790
791 // Make sure that we can't redefine using direct access. 791 // Make sure that we can't redefine using direct access.
792 obj6[15] ='overwrite'; 792 obj6[15] ='overwrite';
793 assertEquals(obj6[15],'foobar'); 793 assertEquals(obj6[15],'foobar');
794 794
795 795
796 // Repeat the above tests on an array. 796 // Repeat the above tests on an array.
797 var arr = new Array(); 797 var arr = new Array();
798 arr[1] = 'foo'; 798 arr[1] = 'foo';
799 arr[2] = 'bar'; 799 arr[2] = 'bar';
800 arr[3] = '42'; 800 arr[3] = '42';
801 arr[4] = '43'; 801 arr[4] = '43';
802 arr[5] = '44'; 802 arr[5] = '44';
803 803
804 var descElement = { value: 'foobar' }; 804 var descElement = { value: 'foobar' };
805 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; 805 var descElementNonConfigurable = { value: 'barfoo', configurable: false };
806 var descElementNonWritable = { value: 'foofoo', writable: false }; 806 var descElementNonWritable = { value: 'foofoo', writable: false };
807 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; 807 var descElementNonEnumerable = { value: 'barbar', enumerable: false };
808 var descElementAllFalse = { value: 'foofalse', 808 var descElementAllFalse = { value: 'foofalse',
809 configurable: false, 809 configurable: false,
810 writable: false, 810 writable: false,
811 enumerable: false }; 811 enumerable: false };
812 812
813 813
814 // Redefine existing property. 814 // Redefine existing property.
815 Object.defineProperty(arr, '1', descElement); 815 Object.defineProperty(arr, '1', descElement);
816 desc = Object.getOwnPropertyDescriptor(arr, '1'); 816 desc = Object.getOwnPropertyDescriptor(arr, '1');
817 assertEquals(desc.value, 'foobar'); 817 assertEquals(desc.value, 'foobar');
818 assertTrue(desc.writable); 818 assertTrue(desc.writable);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 assertEquals(undefined, o.x); 891 assertEquals(undefined, o.x);
892 o.x = 37; 892 o.x = 37;
893 assertEquals(undefined, o.x); 893 assertEquals(undefined, o.x);
894 894
895 // Ignore inherited properties. 895 // Ignore inherited properties.
896 o = { __proto__ : { x : 87 } }; 896 o = { __proto__ : { x : 87 } };
897 Object.defineProperty(o, "x", { writable: false }); 897 Object.defineProperty(o, "x", { writable: false });
898 assertEquals(undefined, o.x); 898 assertEquals(undefined, o.x);
899 o.x = 37; 899 o.x = 37;
900 assertEquals(undefined, o.x); 900 assertEquals(undefined, o.x);
901
OLDNEW
« no previous file with comments | « src/v8natives.js ('k') | test/mjsunit/regress/regress-687.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698