@@ -14,10 +14,11 @@ export function propertyPatch() {
1414 if ( isUnconfigurable ( obj , prop ) ) {
1515 throw new TypeError ( 'Cannot assign to read only property \'' + prop + '\' of ' + obj ) ;
1616 }
17+ const originalConfigurableFlag = desc . configurable ;
1718 if ( prop !== 'prototype' ) {
1819 desc = rewriteDescriptor ( obj , prop , desc ) ;
1920 }
20- return _defineProperty ( obj , prop , desc ) ;
21+ return _tryDefineProperty ( obj , prop , desc , originalConfigurableFlag ) ;
2122 } ;
2223
2324 Object . defineProperties = function ( obj , props ) {
@@ -46,8 +47,9 @@ export function propertyPatch() {
4647} ;
4748
4849export function _redefineProperty ( obj , prop , desc ) {
50+ const originalConfigurableFlag = desc . configurable ;
4951 desc = rewriteDescriptor ( obj , prop , desc ) ;
50- return _defineProperty ( obj , prop , desc ) ;
52+ return _tryDefineProperty ( obj , prop , desc , originalConfigurableFlag ) ;
5153} ;
5254
5355function isUnconfigurable ( obj , prop ) {
@@ -65,4 +67,23 @@ function rewriteDescriptor (obj, prop, desc) {
6567 return desc ;
6668}
6769
70+ function _tryDefineProperty ( obj , prop , desc , originalConfigurableFlag ) {
71+ try {
72+ return _defineProperty ( obj , prop , desc ) ;
73+ }
74+ catch ( e ) {
75+ if ( desc . configurable ) {
76+ // In case of errors, when the configurable flag was likely set by rewriteDescriptor(), let's retry with the original flag value
77+ if ( typeof originalConfigurableFlag == 'undefined' ) {
78+ delete desc . configurable ;
79+ } else {
80+ desc . configurable = originalConfigurableFlag ;
81+ }
82+ return _defineProperty ( obj , prop , desc ) ;
83+ } else {
84+ throw e ;
85+ }
86+ }
87+ }
88+
6889
0 commit comments