@@ -5,7 +5,7 @@ function isObject(value) {
55 return ( typeof value === "object" && value !== null ) || typeof value === "function" ;
66}
77
8- const hasOwn = Function . prototype . call . bind ( Object . prototype . hasOwnProperty ) ;
8+ const call = Function . call . bind ( Function . call ) ;
99
1010// Like `Object.assign`, but using `[[GetOwnProperty]]` and `[[DefineOwnProperty]]`
1111// instead of `[[Get]]` and `[[Set]]` and only allowing objects
@@ -34,7 +34,7 @@ const ctorRegistrySymbol = Symbol.for("[webidl2js] constructor registry");
3434const AsyncIteratorPrototype = Object . getPrototypeOf ( Object . getPrototypeOf ( async function * ( ) { } ) . prototype ) ;
3535
3636function initCtorRegistry ( globalObject ) {
37- if ( hasOwn ( globalObject , ctorRegistrySymbol ) ) {
37+ if ( Object . hasOwn ( globalObject , ctorRegistrySymbol ) ) {
3838 return globalObject [ ctorRegistrySymbol ] ;
3939 }
4040
@@ -137,6 +137,56 @@ function iteratorResult([key, value], kind) {
137137 return { value : result , done : false } ;
138138}
139139
140+ function ordinarySetWithOwnDescriptor ( target , property , value , receiver , ownDesc ) {
141+ if ( ownDesc === undefined ) {
142+ const parent = Reflect . getPrototypeOf ( target ) ;
143+ if ( parent !== null ) {
144+ return Reflect . set ( parent , property , value , receiver ) ;
145+ }
146+ ownDesc = { writable : true , enumerable : true , configurable : true , value : undefined } ;
147+ }
148+ if ( isDataDescriptor ( ownDesc ) ) {
149+ if ( ! ownDesc . writable ) {
150+ return false ;
151+ }
152+ if ( ! isObject ( receiver ) ) {
153+ return false ;
154+ }
155+ const existingDesc = Reflect . getOwnPropertyDescriptor ( receiver , property ) ;
156+ if ( existingDesc !== undefined ) {
157+ if ( isAccessorDescriptor ( existingDesc ) ) {
158+ return false ;
159+ }
160+ if ( existingDesc . writable === false ) {
161+ return false ;
162+ }
163+ const valueDesc = { value } ;
164+ return Reflect . defineOwnProperty ( receiver , property , valueDesc ) ;
165+ }
166+
167+ return Reflect . defineOwnProperty (
168+ receiver ,
169+ property ,
170+ { value, writable : true , enumerable : true , configurable : true }
171+ ) ;
172+ }
173+
174+ const setter = ownDesc . set ;
175+ if ( setter === undefined ) {
176+ return false ;
177+ }
178+ call ( setter , receiver , value ) ;
179+ return true ;
180+ }
181+
182+ function isDataDescriptor ( desc ) {
183+ return Object . hasOwn ( desc , "value" ) || Object . hasOwn ( desc , "writable" ) ;
184+ }
185+
186+ function isAccessorDescriptor ( desc ) {
187+ return Object . hasOwn ( desc , "get" ) || Object . hasOwn ( desc , "set" ) ;
188+ }
189+
140190const supportsPropertyIndex = Symbol ( "supports property index" ) ;
141191const supportedPropertyIndices = Symbol ( "supported property indices" ) ;
142192const supportsPropertyName = Symbol ( "supports property name" ) ;
@@ -156,7 +206,6 @@ const asyncIteratorEOI = Symbol("async iterator end of iteration");
156206
157207module . exports = exports = {
158208 isObject,
159- hasOwn,
160209 define,
161210 newObjectInRealm,
162211 wrapperSymbol,
@@ -186,5 +235,6 @@ module.exports = exports = {
186235 asyncIteratorReturn,
187236 asyncIteratorInit,
188237 asyncIteratorEOI,
189- iteratorResult
238+ iteratorResult,
239+ ordinarySetWithOwnDescriptor
190240} ;
0 commit comments