@@ -4,8 +4,9 @@ import * as c from './constants';
4
4
const {
5
5
defineProperties,
6
6
entries,
7
- fromEntries,
8
7
getOwnPropertyDescriptors,
8
+ getPrototypeOf,
9
+ setPrototypeOf,
9
10
} = Object ;
10
11
const { apply, construct, get } = Reflect ;
11
12
const { get : wmGet , set : wmSet } = WeakMap . prototype ;
@@ -29,16 +30,16 @@ export default function tameMetering() {
29
30
setWrapped(Error, Error); // FIGME: debugging
30
31
setWrapped(console, console); // FIGME
31
32
*/
32
- const wrapDescriptor = desc => {
33
+ const wrapDescriptor = ( desc , pname = undefined ) => {
33
34
const newDesc = { } ;
34
35
for ( const [ k , v ] of entries ( desc ) ) {
35
36
// eslint-disable-next-line no-use-before-define
36
- newDesc [ k ] = wrap ( v ) ;
37
+ newDesc [ k ] = wrap ( v , pname && ` ${ pname } . ${ k } ` ) ;
37
38
}
38
39
return newDesc ;
39
40
} ;
40
41
41
- function wrap ( target ) {
42
+ function wrap ( target , pname ) {
42
43
if ( ObjectConstructor ( target ) !== target ) {
43
44
return target ;
44
45
}
@@ -63,7 +64,7 @@ export default function tameMetering() {
63
64
64
65
// Track the entry of the stack frame.
65
66
globalMeter = null ;
66
- // savedMeter && savedMeter[c.METER_ENTER](undefined, false);
67
+ /* savedMeter && savedMeter[c.METER_ENTER](undefined, false); */
67
68
savedMeter && savedMeter [ c . METER_COMPUTE ] ( undefined , false ) ;
68
69
let ret ;
69
70
@@ -105,25 +106,37 @@ export default function tameMetering() {
105
106
wrapper = target ;
106
107
}
107
108
108
- // We have a wrapper identity, so prevent recursion.
109
+ // We have a wrapper identity, so prevent recursion by installing it now .
109
110
setWrapped ( target , wrapper ) ;
110
111
setWrapped ( wrapper , wrapper ) ;
111
112
112
113
if ( isFunction ) {
113
- // Replace the constructor.
114
114
const proto = get ( target , 'prototype' ) ;
115
+
115
116
if ( proto ) {
116
- const wproto = wrap ( proto ) ;
117
+ // Replace the constructor.
118
+ const wproto = wrap ( proto , pname && `${ pname } .prototype` ) ;
117
119
wproto . constructor = wrapper ;
118
120
}
119
121
}
120
122
123
+ // Ensure the prototype chain is also wrapped.
124
+ setPrototypeOf (
125
+ wrapper ,
126
+ wrap ( getPrototypeOf ( target ) , pname && `${ pname } .__proto__` ) ,
127
+ ) ;
128
+
121
129
// Assign the wrapped descriptors to the wrapper.
122
- const props = entries (
123
- getOwnPropertyDescriptors ( target ) ,
124
- ) . map ( ( [ p , desc ] ) => [ p , wrapDescriptor ( desc ) ] ) ;
125
- defineProperties ( wrapper , fromEntries ( props ) ) ;
130
+ const descs = { } ;
131
+ for ( const [ p , desc ] of entries ( getOwnPropertyDescriptors ( target ) ) ) {
132
+ const desc2 = wrapDescriptor ( desc , pname && `${ pname } .${ p } ` ) ;
133
+ if ( isFunction && p === 'name' ) {
134
+ desc2 . value = target . name ;
135
+ }
136
+ descs [ p ] = desc2 ;
137
+ }
126
138
139
+ defineProperties ( wrapper , descs ) ;
127
140
return wrapper ;
128
141
}
129
142
0 commit comments