1
0
mirror of https://github.com/robertkrimen/otto synced 2025-10-19 19:55:30 +08:00

Clarify AccessorDescriptor logic in DefineOwnProperty even more

This commit is contained in:
Robert Krimen 2014-02-14 22:33:27 -08:00
parent acf0a991f7
commit 99263cd960
2 changed files with 34 additions and 4 deletions

View File

@ -328,18 +328,25 @@ func objectDefineOwnProperty(self *_object, name string, descriptor _property, t
} else {
// AccessorDescriptor <=> AccessorDescriptor
newGetSet, _ := descriptor.value.(_propertyGetSet)
presentGet, presentSet := true, true
if newGetSet[0] == &_nilGetSetObject {
// Present, but nil
newGetSet[0] = nil
} else if newGetSet[0] == nil {
// Missing, not even nil
newGetSet[0] = getSet[0]
presentGet = false
}
if newGetSet[1] == &_nilGetSetObject {
// Present, but nil
newGetSet[1] = nil
} else if newGetSet[1] == nil {
// Missing, not even nil
newGetSet[1] = getSet[1]
presentSet = false
}
if !configurable {
if (getSet[0] != nil && (getSet[0] != newGetSet[0])) || (getSet[1] != nil && (getSet[1] != newGetSet[1])) {
if (presentGet && (getSet[0] != newGetSet[0])) || (presentSet && (getSet[1] != newGetSet[1])) {
goto Reject
}
}

View File

@ -512,8 +512,7 @@ func TestObjectGetterSetter(t *testing.T) {
configurable: false
});
var jkl;
var jkl = undefined;
try {
Object.defineProperty(abc, "def", {
get: undefined
@ -542,9 +541,33 @@ func TestObjectGetterSetter(t *testing.T) {
});
var ghi = Object.getOwnPropertyDescriptor(abc, "def");
[ ghi.get === getter, ghi.set === undefined, ghi.configurable, ghi.enumerable ];
`, "true,true,false,false")
test(`
var abc = {};
var getter = function() {
return 1;
};
Object.defineProperty(abc, "def", {
get: getter
});
var jkl = undefined;
try {
Object.defineProperty(abc, "def", {
set: function() {}
});
}
catch (err) {
jkl = err;
}
var ghi = Object.getOwnPropertyDescriptor(abc, "def");
[ jkl instanceof TypeError, ghi.get === getter, ghi.set, ghi.configurable, ghi.enumerable ];
`, "true,true,,false,false")
}
func TestProperty(t *testing.T) {