@@ -17,11 +17,21 @@ void PromiseProxy::Init(v8::Local<v8::Context> context) {
1717
1818 let promise = new target(function(resolve, reject) {
1919 origFunc(value => {
20- CFRunLoopPerformBlock(runloop, kCFRunLoopDefaultMode, resolve.bind(this, value));
21- CFRunLoopWakeUp(runloop);
20+ const resolveCall = resolve.bind(this, value);
21+ if (runloop === CFRunLoopGetCurrent()) {
22+ resolveCall();
23+ } else {
24+ CFRunLoopPerformBlock(runloop, kCFRunLoopDefaultMode, resolveCall);
25+ CFRunLoopWakeUp(runloop);
26+ }
2227 }, reason => {
23- CFRunLoopPerformBlock(runloop, kCFRunLoopDefaultMode, reject.bind(this, reason));
24- CFRunLoopWakeUp(runloop);
28+ const rejectCall = reject.bind(this, reason);
29+ if (runloop === CFRunLoopGetCurrent()) {
30+ rejectCall();
31+ } else {
32+ CFRunLoopPerformBlock(runloop, kCFRunLoopDefaultMode, rejectCall);
33+ CFRunLoopWakeUp(runloop);
34+ }
2535 });
2636 });
2737
@@ -32,6 +42,10 @@ void PromiseProxy::Init(v8::Local<v8::Context> context) {
3242 return orig.bind(target);
3343 }
3444 return typeof orig === 'function' ? function(x) {
45+ if (runloop === CFRunLoopGetCurrent()) {
46+ orig.bind(target, x)();
47+ return target;
48+ }
3549 CFRunLoopPerformBlock(runloop, kCFRunLoopDefaultMode, orig.bind(target, x));
3650 CFRunLoopWakeUp(runloop);
3751 return target;
0 commit comments