| const untouchedApply = Function.prototype.apply; | |
| const ApplySymbol = Symbol('apply'); | |
| function safeExtractApply(f) { | |
| try { | |
| return f.apply; | |
| } | |
| catch (err) { | |
| return undefined; | |
| } | |
| } | |
| function safeApplyHacky(f, instance, args) { | |
| const ff = f; | |
| ff[ApplySymbol] = untouchedApply; | |
| const out = ff[ApplySymbol](instance, args); | |
| delete ff[ApplySymbol]; | |
| return out; | |
| } | |
| export function safeApply(f, instance, args) { | |
| if (safeExtractApply(f) === untouchedApply) { | |
| return f.apply(instance, args); | |
| } | |
| return safeApplyHacky(f, instance, args); | |
| } | |