@@ -5,7 +5,7 @@ function isObject(value) {
5
5
return ( typeof value === "object" && value !== null ) || typeof value === "function" ;
6
6
}
7
7
8
- const hasOwn = Function . prototype . call . bind ( Object . prototype . hasOwnProperty ) ;
8
+ const call = Function . call . bind ( Function . call ) ;
9
9
10
10
// Like `Object.assign`, but using `[[GetOwnProperty]]` and `[[DefineOwnProperty]]`
11
11
// instead of `[[Get]]` and `[[Set]]` and only allowing objects
@@ -34,7 +34,7 @@ const ctorRegistrySymbol = Symbol.for("[webidl2js] constructor registry");
34
34
const AsyncIteratorPrototype = Object . getPrototypeOf ( Object . getPrototypeOf ( async function * ( ) { } ) . prototype ) ;
35
35
36
36
function initCtorRegistry ( globalObject ) {
37
- if ( hasOwn ( globalObject , ctorRegistrySymbol ) ) {
37
+ if ( Object . hasOwn ( globalObject , ctorRegistrySymbol ) ) {
38
38
return globalObject [ ctorRegistrySymbol ] ;
39
39
}
40
40
@@ -137,6 +137,56 @@ function iteratorResult([key, value], kind) {
137
137
return { value : result , done : false } ;
138
138
}
139
139
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
+
140
190
const supportsPropertyIndex = Symbol ( "supports property index" ) ;
141
191
const supportedPropertyIndices = Symbol ( "supported property indices" ) ;
142
192
const supportsPropertyName = Symbol ( "supports property name" ) ;
@@ -156,7 +206,6 @@ const asyncIteratorEOI = Symbol("async iterator end of iteration");
156
206
157
207
module . exports = exports = {
158
208
isObject,
159
- hasOwn,
160
209
define,
161
210
newObjectInRealm,
162
211
wrapperSymbol,
@@ -186,5 +235,6 @@ module.exports = exports = {
186
235
asyncIteratorReturn,
187
236
asyncIteratorInit,
188
237
asyncIteratorEOI,
189
- iteratorResult
238
+ iteratorResult,
239
+ ordinarySetWithOwnDescriptor
190
240
} ;
0 commit comments