diff --git a/object_class.go b/object_class.go index 3bae63c..27cd696 100644 --- a/object_class.go +++ b/object_class.go @@ -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 } } diff --git a/object_test.go b/object_test.go index a2a2580..dea897c 100644 --- a/object_test.go +++ b/object_test.go @@ -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) {