Commit 9d836ec6 authored by gsathya's avatar gsathya Committed by Commit bot

[promises] fix deferred object leak

This patch sets `this` to be undefined when calling resolve and reject
functions attached to the deferred.

BUG=v8:5476

Review-Url: https://codereview.chromium.org/2399053003
Cr-Commit-Position: refs/heads/master@{#40056}
parent b5c542ba
...@@ -172,7 +172,7 @@ function PromiseHandle(value, handler, deferred) { ...@@ -172,7 +172,7 @@ function PromiseHandle(value, handler, deferred) {
if (IS_UNDEFINED(deferred.resolve)) { if (IS_UNDEFINED(deferred.resolve)) {
ResolvePromise(deferred.promise, result); ResolvePromise(deferred.promise, result);
} else { } else {
deferred.resolve(result); %_Call(deferred.resolve, UNDEFINED, result);
} }
} %catch (exception) { // Natives syntax to mark this catch block. } %catch (exception) { // Natives syntax to mark this catch block.
try { try {
...@@ -181,7 +181,7 @@ function PromiseHandle(value, handler, deferred) { ...@@ -181,7 +181,7 @@ function PromiseHandle(value, handler, deferred) {
// redundant ExceptionEvents. // redundant ExceptionEvents.
RejectPromise(deferred.promise, exception, false); RejectPromise(deferred.promise, exception, false);
} else { } else {
deferred.reject(exception); %_Call(deferred.reject, UNDEFINED, exception);
} }
} catch (e) { } } catch (e) { }
} finally { } finally {
...@@ -606,7 +606,7 @@ function PromiseRace(iterable) { ...@@ -606,7 +606,7 @@ function PromiseRace(iterable) {
} }
} }
} catch (e) { } catch (e) {
deferred.reject(e) %_Call(deferred.reject, UNDEFINED, e);
} }
return deferred.promise; return deferred.promise;
} }
......
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict'
class LeakyPromise extends Promise {
constructor(executor) {
super((resolve, reject) => { resolve();});
this.resolve = function() {assertEquals(this, undefined); };
this.reject = function() {assertEquals(this, undefined); };
executor(this.resolve, this.reject);
}
}
const p1 = new LeakyPromise((r) => r());
const p2 = new LeakyPromise((_, r) => r());
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment