Testcase 15.2.3.6-4-123
# Gavin Barraclough (14 years ago)
You're assuming that the descriptor is a generic descriptor - that isn't the case (accessor descriptors don't have a writable property), see 8.10.2, "IsDataDescriptor". As such, we don't return from step 8 of 8.12.9, and instead reach step 10.a.i.
Hi Bernd,
You're assuming that the descriptor is a generic descriptor - that isn't the case (accessor descriptors don't have a writable property), see 8.10.2, "IsDataDescriptor".
As such, we don't return from step 8 of 8.12.9, and instead reach step 10.a.i.
cheers,
G.
On Mar 19, 2012, at 11:53 AM, Bernd Buschinski wrote:
> Hello,
>
> I am having trouble understanding where testcase 15.2.3.6-4-123 should fail
> according to the ecma262 5.1 Document.
> I get why it should fails, but not in which step exactly.
>
> I really think I am just getting something wrong so I will write down
> everything what I think happens.
> If you spot the error please correct me :)
>
>
>
> ++The Testcase:
>
> /// Copyright (c) 2012 Ecma International. All rights reserved.
> /**
> * @path ch15/15.2/15.2.3/15.2.3.6/15.2.3.6-4-123.js
> * @description Object.defineProperty - 'O' is an Array, 'name' is the length
> property of 'O', the [[Value]] field of 'desc' is absent, test TypeError is
> thrown when updating the [[Writable]] attribute of the length property from
> false to true (15.4.5.1 step 3.a.i)
> */
>
> var arrObj = [];
> try {
> //1. call
> Object.defineProperty(arrObj, "length", {
> writable: false
> });
>
> //2. call
> Object.defineProperty(arrObj, "length", {
> writable: true
> });
>
> return false;
> } catch (e) {
> return e instanceof TypeError;
> }
>
>
>
> ++The Calls:
>
> //1. Call
>
> Array.[[DefineOwnProperty]]("length", desc{writable: false}, true)
>
> 1.
> oldLenDesc = [[GetOwnProperty]]("length")
> // oldLenDesc = { value: 0, writable: true, enumerable: false, configurable:
> false }
>
> 2.
> oldLen = oldLenDesc.[[value]]
> // oldLen = 0
>
> 3. if P == length // true
>
> 3.a. if value of desc is absend
> //true
> 3.a.i return default [[DefineOwnProperty]]("length", desc{writable: false},
> true)
> // -> call 8.12.9
>
>
>
>
> //8.12.9 [[DefineOwnProperty]] ("length", desc{writable: false}, true)
> 1. current = [[GetOwnProperty]]("length")
> // current = { value: 0, writable: true, enumerable: false, configurable:
> false }
>
> 2. extensible = [[Extensible]]
> //extensible = true;
>
> 3. + 4. if current is undefined and ... (does not apply)
> //false
>
> 5. if desc is empty
> //false
>
> 6. if desc is current
> //false, different in writable
>
> 7. if current.[[configurable]] is false
> //true
> 7.a. if desc.[[configurable]] is true ...
> //false, because not set, defaults to not configurable
> 7.b. if desc.[[Enumerable]] is true AND desc.[[Enumerable]] != current.
> [[Enumerable]]
> //false
>
> 8. If IsGenericDescriptor(Desc) is true, then no further validation is
> required.
> //true, jump to step 12+13
>
> Final: put length, { value: 0, writable: false, enumerable: false,
> configurable: false }
> 1. Call Done.
>
> length == { value: 0, writable: false, enumerable: false, configurable: false
> }
>
>
>
> ===================
>
>
> //2. Call
>
> Array.[[DefineOwnProperty]]("length", desc{writable: true}, true)
>
> 1.
> oldLenDesc = [[GetOwnProperty]]("length")
> // oldLenDesc = { value: 0, writable: false, enumerable: false, configurable:
> false }
>
> 2.
> oldLen = oldLenDesc.[[value]]
> // oldLen = 0
>
> 3. if P == length // true
>
> 3.a. if value of desc is absend
> //true
> 3.a.i return default [[DefineOwnProperty]]("length", desc{writable: true},
> true)
> // -> call 8.12.9
>
>
>
>
> //8.12.9 [[DefineOwnProperty]] ("length", desc{writable: true}, true)
> 1. current = [[GetOwnProperty]]("length")
> // current = { value: 0, writable: false, enumerable: false, configurable:
> false }
>
> 2. extensible = [[Extensible]]
> //extensible = true;
>
> 3. + 4. if current is undefined and ... (does not apply)
> //false
>
> 5. if desc is empty
> //false
>
> 6. if desc is current
> //false, different in writable
>
> 7. if current.[[configurable]] is false
> //true
> 7.a. if desc.[[configurable]] is true ...
> //false, because not set, defaults to not configurable
> 7.b. if desc.[[Enumerable]] is true AND desc.[[Enumerable]] != current.
> [[Enumerable]]
> //false
>
> 8. If IsGenericDescriptor(Desc) is true, then no further validation is
> required.
> //true, jump to step 12+13
>
> Final: put length, { value: 0, writable: true, enumerable: false,
> configurable: false }
> 2. Call Done.
>
> length == { value: 0, writable: true, enumerable: false, configurable: false }
>
>
>
>
>
>
> So thats how I see what happens and I can not see where it fails. Please
> enlighten me :)
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
Hello,
I am having trouble understanding where testcase 15.2.3.6-4-123 should fail according to the ecma262 5.1 Document. I get why it should fails, but not in which step exactly.
I really think I am just getting something wrong so I will write down everything what I think happens. If you spot the error please correct me :)
++The Testcase:
/// Copyright (c) 2012 Ecma International. All rights reserved. /**
var arrObj = []; try { //1. call Object.defineProperty(arrObj, "length", { writable: false });
//2. call Object.defineProperty(arrObj, "length", { writable: true });
} catch (e) { return e instanceof TypeError; }
++The Calls:
//1. Call
Array.[[DefineOwnProperty]]("length", desc{writable: false}, true)
oldLenDesc = [GetOwnProperty] // oldLenDesc = { value: 0, writable: true, enumerable: false, configurable: false }
oldLen = oldLenDesc.[[value]] // oldLen = 0
3.a. if value of desc is absend //true 3.a.i return default [[DefineOwnProperty]]("length", desc{writable: false}, true) // -> call 8.12.9
//8.12.9 [[DefineOwnProperty]] ("length", desc{writable: false}, true)
current = [GetOwnProperty] // current = { value: 0, writable: true, enumerable: false, configurable: false }
extensible = [[Extensible]] //extensible = true;
if desc is empty //false
if desc is current //false, different in writable
if current.[[configurable]] is false //true 7.a. if desc.[[configurable]] is true ... //false, because not set, defaults to not configurable 7.b. if desc.[[Enumerable]] is true AND desc.[[Enumerable]] != current. [[Enumerable]] //false
If IsGenericDescriptor(Desc) is true, then no further validation is required. //true, jump to step 12+13
Final: put length, { value: 0, writable: false, enumerable: false, configurable: false }
length == { value: 0, writable: false, enumerable: false, configurable: false }
===================
//2. Call
Array.[[DefineOwnProperty]]("length", desc{writable: true}, true)
oldLenDesc = [GetOwnProperty] // oldLenDesc = { value: 0, writable: false, enumerable: false, configurable: false }
oldLen = oldLenDesc.[[value]] // oldLen = 0
3.a. if value of desc is absend //true 3.a.i return default [[DefineOwnProperty]]("length", desc{writable: true}, true) // -> call 8.12.9
//8.12.9 [[DefineOwnProperty]] ("length", desc{writable: true}, true)
current = [GetOwnProperty] // current = { value: 0, writable: false, enumerable: false, configurable: false }
extensible = [[Extensible]] //extensible = true;
if desc is empty //false
if desc is current //false, different in writable
if current.[[configurable]] is false //true 7.a. if desc.[[configurable]] is true ... //false, because not set, defaults to not configurable 7.b. if desc.[[Enumerable]] is true AND desc.[[Enumerable]] != current. [[Enumerable]] //false
If IsGenericDescriptor(Desc) is true, then no further validation is required. //true, jump to step 12+13
Final: put length, { value: 0, writable: true, enumerable: false, configurable: false } 2. Call Done.
length == { value: 0, writable: true, enumerable: false, configurable: false }
So thats how I see what happens and I can not see where it fails. Please enlighten me :)
Hello, I am having trouble understanding where testcase 15.2.3.6-4-123 should fail according to the ecma262 5.1 Document. I get why it should fails, but not in which step exactly. I really think I am just getting something wrong so I will write down everything what I think happens. If you spot the error please correct me :) ++The Testcase: /// Copyright (c) 2012 Ecma International. All rights reserved. /** * @path ch15/15.2/15.2.3/15.2.3.6/15.2.3.6-4-123.js * @description Object.defineProperty - 'O' is an Array, 'name' is the length property of 'O', the [[Value]] field of 'desc' is absent, test TypeError is thrown when updating the [[Writable]] attribute of the length property from false to true (15.4.5.1 step 3.a.i) */ var arrObj = []; try { //1. call Object.defineProperty(arrObj, "length", { writable: false }); //2. call Object.defineProperty(arrObj, "length", { writable: true }); return false; } catch (e) { return e instanceof TypeError; } ++The Calls: //1. Call Array.[[DefineOwnProperty]]("length", desc{writable: false}, true) 1. oldLenDesc = [[GetOwnProperty]]("length") // oldLenDesc = { value: 0, writable: true, enumerable: false, configurable: false } 2. oldLen = oldLenDesc.[[value]] // oldLen = 0 3. if P == length // true 3.a. if value of desc is absend //true 3.a.i return default [[DefineOwnProperty]]("length", desc{writable: false}, true) // -> call 8.12.9 //8.12.9 [[DefineOwnProperty]] ("length", desc{writable: false}, true) 1. current = [[GetOwnProperty]]("length") // current = { value: 0, writable: true, enumerable: false, configurable: false } 2. extensible = [[Extensible]] //extensible = true; 3. + 4. if current is undefined and ... (does not apply) //false 5. if desc is empty //false 6. if desc is current //false, different in writable 7. if current.[[configurable]] is false //true 7.a. if desc.[[configurable]] is true ... //false, because not set, defaults to not configurable 7.b. if desc.[[Enumerable]] is true AND desc.[[Enumerable]] != current. [[Enumerable]] //false 8. If IsGenericDescriptor(Desc) is true, then no further validation is required. //true, jump to step 12+13 Final: put length, { value: 0, writable: false, enumerable: false, configurable: false } 1. Call Done. length == { value: 0, writable: false, enumerable: false, configurable: false } =================== //2. Call Array.[[DefineOwnProperty]]("length", desc{writable: true}, true) 1. oldLenDesc = [[GetOwnProperty]]("length") // oldLenDesc = { value: 0, writable: false, enumerable: false, configurable: false } 2. oldLen = oldLenDesc.[[value]] // oldLen = 0 3. if P == length // true 3.a. if value of desc is absend //true 3.a.i return default [[DefineOwnProperty]]("length", desc{writable: true}, true) // -> call 8.12.9 //8.12.9 [[DefineOwnProperty]] ("length", desc{writable: true}, true) 1. current = [[GetOwnProperty]]("length") // current = { value: 0, writable: false, enumerable: false, configurable: false } 2. extensible = [[Extensible]] //extensible = true; 3. + 4. if current is undefined and ... (does not apply) //false 5. if desc is empty //false 6. if desc is current //false, different in writable 7. if current.[[configurable]] is false //true 7.a. if desc.[[configurable]] is true ... //false, because not set, defaults to not configurable 7.b. if desc.[[Enumerable]] is true AND desc.[[Enumerable]] != current. [[Enumerable]] //false 8. If IsGenericDescriptor(Desc) is true, then no further validation is required. //true, jump to step 12+13 Final: put length, { value: 0, writable: true, enumerable: false, configurable: false } 2. Call Done. length == { value: 0, writable: true, enumerable: false, configurable: false } So thats how I see what happens and I can not see where it fails. Please enlighten me :)