Skip to content

Commit 18a8fc7

Browse files
committed
Improve proxyApplyFn helper scriptlet
1 parent 976d12d commit 18a8fc7

File tree

2 files changed

+38
-28
lines changed

2 files changed

+38
-28
lines changed

src/js/resources/json-prune.js

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,31 @@ function jsonPrune(
4242
const logPrefix = safe.makeLogPrefix('json-prune', rawPrunePaths, rawNeedlePaths, stackNeedle);
4343
const stackNeedleDetails = safe.initPattern(stackNeedle, { canNegate: true });
4444
const extraArgs = safe.getExtraArgs(Array.from(arguments), 3);
45-
JSON.parse = new Proxy(JSON.parse, {
46-
apply: function(target, thisArg, args) {
47-
const objBefore = Reflect.apply(target, thisArg, args);
48-
if ( rawPrunePaths === '' ) {
49-
safe.uboLog(logPrefix, safe.JSON_stringify(objBefore, null, 2));
50-
}
51-
const objAfter = objectPruneFn(
52-
objBefore,
53-
rawPrunePaths,
54-
rawNeedlePaths,
55-
stackNeedleDetails,
56-
extraArgs
57-
);
58-
if ( objAfter === undefined ) { return objBefore; }
59-
safe.uboLog(logPrefix, 'Pruned');
60-
if ( safe.logLevel > 1 ) {
61-
safe.uboLog(logPrefix, `After pruning:\n${safe.JSON_stringify(objAfter, null, 2)}`);
62-
}
63-
return objAfter;
64-
},
45+
proxyApplyFn('JSON.parse', function(context) {
46+
const objBefore = context.reflect();
47+
if ( rawPrunePaths === '' ) {
48+
safe.uboLog(logPrefix, safe.JSON_stringify(objBefore, null, 2));
49+
}
50+
const objAfter = objectPruneFn(
51+
objBefore,
52+
rawPrunePaths,
53+
rawNeedlePaths,
54+
stackNeedleDetails,
55+
extraArgs
56+
);
57+
if ( objAfter === undefined ) { return objBefore; }
58+
safe.uboLog(logPrefix, 'Pruned');
59+
if ( safe.logLevel > 1 ) {
60+
safe.uboLog(logPrefix, `After pruning:\n${safe.JSON_stringify(objAfter, null, 2)}`);
61+
}
62+
return objAfter;
6563
});
6664
}
6765
registerScriptlet(jsonPrune, {
6866
name: 'json-prune.js',
6967
dependencies: [
7068
objectPruneFn,
69+
proxyApplyFn,
7170
safeSelf,
7271
],
7372
});

src/js/resources/proxy-apply.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,27 +86,38 @@ export function proxyApplyFn(
8686
}
8787
};
8888
proxyApplyFn.isCtor = new Map();
89+
proxyApplyFn.proxies = new WeakMap();
90+
proxyApplyFn.nativeToString = Function.prototype.toString;
91+
const proxiedToString = new Proxy(Function.prototype.toString, {
92+
apply(target, thisArg) {
93+
let proxied = thisArg;
94+
for(;;) {
95+
const fn = proxyApplyFn.proxies.get(proxied);
96+
if ( fn === undefined ) { break; }
97+
proxied = fn;
98+
}
99+
return proxyApplyFn.nativeToString.call(proxied);
100+
}
101+
});
102+
proxyApplyFn.proxies.set(proxiedToString, proxyApplyFn.nativeToString);
103+
Function.prototype.toString = proxiedToString;
89104
}
90105
if ( proxyApplyFn.isCtor.has(target) === false ) {
91106
proxyApplyFn.isCtor.set(target, fn.prototype?.constructor === fn);
92107
}
93-
const fnStr = fn.toString();
94-
const toString = (function toString() { return fnStr; }).bind(null);
95108
const proxyDetails = {
96109
apply(target, thisArg, args) {
97110
return handler(proxyApplyFn.ApplyContext.factory(target, thisArg, args));
98-
},
99-
get(target, prop) {
100-
if ( prop === 'toString' ) { return toString; }
101-
return Reflect.get(target, prop);
102-
},
111+
}
103112
};
104113
if ( proxyApplyFn.isCtor.get(target) ) {
105114
proxyDetails.construct = function(target, args) {
106115
return handler(proxyApplyFn.CtorContext.factory(target, args));
107116
};
108117
}
109-
context[prop] = new Proxy(fn, proxyDetails);
118+
const proxiedTarget = new Proxy(fn, proxyDetails);
119+
proxyApplyFn.proxies.set(proxiedTarget, fn);
120+
context[prop] = proxiedTarget;
110121
}
111122
registerScriptlet(proxyApplyFn, {
112123
name: 'proxy-apply.fn',

0 commit comments

Comments
 (0)