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

Side by Side Diff: src/v8natives.js

Issue 2131019: Fixes issue 712 causing non-configurable accessors to be overwritable by usin... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 7 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
OLDNEW
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 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 this.writable_ = writable; 427 this.writable_ = writable;
428 this.hasWritable_ = true; 428 this.hasWritable_ = true;
429 } 429 }
430 430
431 431
432 PropertyDescriptor.prototype.isWritable = function() { 432 PropertyDescriptor.prototype.isWritable = function() {
433 return this.writable_; 433 return this.writable_;
434 } 434 }
435 435
436 436
437 PropertyDescriptor.prototype.hasWritable = function() {
438 return this.hasWritable_;
439 }
440
441
437 PropertyDescriptor.prototype.setConfigurable = function(configurable) { 442 PropertyDescriptor.prototype.setConfigurable = function(configurable) {
438 this.configurable_ = configurable; 443 this.configurable_ = configurable;
439 this.hasConfigurable_ = true; 444 this.hasConfigurable_ = true;
440 } 445 }
441 446
442 447
443 PropertyDescriptor.prototype.hasConfigurable = function() { 448 PropertyDescriptor.prototype.hasConfigurable = function() {
444 return this.hasConfigurable_; 449 return this.hasConfigurable_;
445 } 450 }
446 451
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 function DefineOwnProperty(obj, p, desc, should_throw) { 535 function DefineOwnProperty(obj, p, desc, should_throw) {
531 var current = GetOwnProperty(obj, p); 536 var current = GetOwnProperty(obj, p);
532 var extensible = %IsExtensible(ToObject(obj)); 537 var extensible = %IsExtensible(ToObject(obj));
533 538
534 // Error handling according to spec. 539 // Error handling according to spec.
535 // Step 3 540 // Step 3
536 if (IS_UNDEFINED(current) && !extensible) 541 if (IS_UNDEFINED(current) && !extensible)
537 throw MakeTypeError("define_disallowed", ["defineProperty"]); 542 throw MakeTypeError("define_disallowed", ["defineProperty"]);
538 543
539 if (!IS_UNDEFINED(current) && !current.isConfigurable()) { 544 if (!IS_UNDEFINED(current) && !current.isConfigurable()) {
545 // Step 5 and 6
546 if ((!desc.hasEnumerable() ||
547 SameValue(desc.isEnumerable() && current.isEnumerable())) &&
548 (!desc.hasConfigurable() ||
549 SameValue(desc.isConfigurable(), current.isConfigurable())) &&
550 (!desc.hasWritable() ||
551 SameValue(desc.isWritable(), current.isWritable())) &&
552 (!desc.hasValue() ||
553 SameValue(desc.getValue(), current.getValue())) &&
554 (!desc.hasGetter() ||
555 SameValue(desc.getGet(), current.getGet())) &&
556 (!desc.hasSetter() ||
557 SameValue(desc.getSet(), current.getSet()))) {
558 return true;
559 }
560
540 // Step 7 561 // Step 7
541 if (desc.isConfigurable() || desc.isEnumerable() != current.isEnumerable()) 562 if (desc.isConfigurable() || desc.isEnumerable() != current.isEnumerable())
542 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); 563 throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
543 // Step 9 564 // Step 9
544 if (IsDataDescriptor(current) != IsDataDescriptor(desc)) 565 if (IsDataDescriptor(current) != IsDataDescriptor(desc))
545 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); 566 throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
546 // Step 10 567 // Step 10
547 if (IsDataDescriptor(current) && IsDataDescriptor(desc)) { 568 if (IsDataDescriptor(current) && IsDataDescriptor(desc)) {
548 if (!current.isWritable() && desc.isWritable()) 569 if (!current.isWritable() && desc.isWritable())
549 throw MakeTypeError("redefine_disallowed", ["defineProperty"]); 570 throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 var obj = new $Object(); 687 var obj = new $Object();
667 obj.__proto__ = proto; 688 obj.__proto__ = proto;
668 if (!IS_UNDEFINED(properties)) ObjectDefineProperties(obj, properties); 689 if (!IS_UNDEFINED(properties)) ObjectDefineProperties(obj, properties);
669 return obj; 690 return obj;
670 } 691 }
671 692
672 693
673 // ES5 section 15.2.3.6. 694 // ES5 section 15.2.3.6.
674 function ObjectDefineProperty(obj, p, attributes) { 695 function ObjectDefineProperty(obj, p, attributes) {
675 if ((!IS_SPEC_OBJECT_OR_NULL(obj) || IS_NULL_OR_UNDEFINED(obj)) && 696 if ((!IS_SPEC_OBJECT_OR_NULL(obj) || IS_NULL_OR_UNDEFINED(obj)) &&
676 !IS_UNDETECTABLE(obj)) 697 !IS_UNDETECTABLE(obj)) {
677 throw MakeTypeError("obj_ctor_property_non_object", ["defineProperty"]); 698 throw MakeTypeError("obj_ctor_property_non_object", ["defineProperty"]);
699 }
678 var name = ToString(p); 700 var name = ToString(p);
679 var desc = ToPropertyDescriptor(attributes); 701 var desc = ToPropertyDescriptor(attributes);
680 DefineOwnProperty(obj, name, desc, true); 702 DefineOwnProperty(obj, name, desc, true);
681 return obj; 703 return obj;
682 } 704 }
683 705
684 706
685 // ES5 section 15.2.3.7. 707 // ES5 section 15.2.3.7.
686 function ObjectDefineProperties(obj, properties) { 708 function ObjectDefineProperties(obj, properties) {
687 if ((!IS_SPEC_OBJECT_OR_NULL(obj) || IS_NULL_OR_UNDEFINED(obj)) && 709 if ((!IS_SPEC_OBJECT_OR_NULL(obj) || IS_NULL_OR_UNDEFINED(obj)) &&
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1002 1024
1003 // ---------------------------------------------------------------------------- 1025 // ----------------------------------------------------------------------------
1004 1026
1005 function SetupFunction() { 1027 function SetupFunction() {
1006 InstallFunctions($Function.prototype, DONT_ENUM, $Array( 1028 InstallFunctions($Function.prototype, DONT_ENUM, $Array(
1007 "toString", FunctionToString 1029 "toString", FunctionToString
1008 )); 1030 ));
1009 } 1031 }
1010 1032
1011 SetupFunction(); 1033 SetupFunction();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698