Skip to content

Commit

Permalink
prevent circular reference between @resolves and closures
Browse files Browse the repository at this point in the history
This solution works by making the event handlers not closures.

Fixes FGasper#14
  • Loading branch information
tonycoz committed Aug 1, 2024
1 parent 992dd5c commit 8c469c2
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 36 deletions.
38 changes: 26 additions & 12 deletions t/race_async.t
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ use PromiseTest;

use Promise::ES6;

sub _bind {
my ($sub, @args) = @_;

return sub {
$sub->(@args, @_);
};
}

{
my $eventer = Eventer->new();

Expand All @@ -21,23 +29,29 @@ use Promise::ES6;
my $p1 = Promise::ES6->new(sub {
my ($resolve, $reject) = @_;

push @resolves, sub {
if ($eventer->has_happened('ready1') && !$eventer->has_happened('resolved1')) {
$resolve->(1);
$eventer->happen('resolved1');
}
};
push @resolves,
_bind(sub {
my ($eventer, $resolve) = @_;

if ($eventer->has_happened('ready1') && !$eventer->has_happened('resolved1')) {
$resolve->(1);
$eventer->happen('resolved1');
}
}, $eventer, $resolve);
});

my $p2 = Promise::ES6->new(sub {
my ($resolve, $reject) = @_;

push @resolves, sub {
if ($eventer->has_happened('ready2') && !$eventer->has_happened('resolved2')) {
$resolve->(2);
$eventer->happen('resolved2');
}
};
push @resolves,
_bind(sub {
my ($eventer, $resolve) = @_;

if ($eventer->has_happened('ready2') && !$eventer->has_happened('resolved2')) {
$resolve->(2);
$eventer->happen('resolved2');
}
}, $eventer, $resolve);
});

my $pid = fork or do {
Expand Down
36 changes: 24 additions & 12 deletions t/race_fail.t
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ use PromiseTest;

use Promise::ES6;

sub _bind {
my ($sub, @args) = @_;

return sub {
$sub->(@args, @_);
};
}

{
my $eventer = Eventer->new();

Expand All @@ -22,23 +30,27 @@ use Promise::ES6;
my $p1 = Promise::ES6->new(sub {
my ($resolve, $reject) = @_;

push @resolves, sub {
if ($eventer->has_happened('ready1') && !$eventer->has_happened('resolved1')) {
$resolve->(1);
$eventer->happen('resolved1');
}
};
push @resolves,
_bind(sub {
my ($eventer, $resolve, $reject) = @_;
if ($eventer->has_happened('ready1') && !$eventer->has_happened('resolved1')) {
$resolve->(1);
$eventer->happen('resolved1');
}
}, $eventer, $resolve, $reject);
});

my $p2 = Promise::ES6->new(sub {
my ($resolve, $reject) = @_;

push @resolves, sub {
if ($eventer->has_happened('ready2') && !$eventer->has_happened('resolved2')) {
$reject->({ message => 'fail' });
$eventer->happen('resolved2');
}
};
push @resolves,
_bind(sub {
my ($eventer, $reject) = @_;
if ($eventer->has_happened('ready2') && !$eventer->has_happened('resolved2')) {
$reject->({ message => 'fail' });
$eventer->happen('resolved2');
}
}, $eventer, $reject);
});

my $pid = fork or do {
Expand Down
36 changes: 24 additions & 12 deletions t/race_success.t
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ use PromiseTest;

use Promise::ES6;

sub _bind {
my ($sub, @args) = @_;

return sub {
$sub->(@args, @_);
};
}

{
my $eventer = Eventer->new();

Expand All @@ -21,22 +29,26 @@ use Promise::ES6;
my $p1 = Promise::ES6->new(sub {
my ($resolve, $reject) = @_;

push @resolves, sub {
if ($eventer->has_happened('ready1') && !$eventer->has_happened('resolved1')) {
$resolve->(1);
$eventer->happen('resolved1');
}
};
push @resolves,
_bind(sub {
my ($eventer, $resolve) = @_;
if ($eventer->has_happened('ready1') && !$eventer->has_happened('resolved1')) {
$resolve->(1);
$eventer->happen('resolved1');
}
}, $eventer, $resolve);
});
my $p2 = Promise::ES6->new(sub {
my ($resolve, $reject) = @_;

push @resolves, sub {
if ($eventer->has_happened('ready2') && !$eventer->has_happened('resolved2')) {
$reject->({ message => 'fail' });
$eventer->happen('resolved2');
}
};
push @resolves,
_bind(sub {
my ($eventer, $reject) = @_;
if ($eventer->has_happened('ready2') && !$eventer->has_happened('resolved2')) {
$reject->({ message => 'fail' });
$eventer->happen('resolved2');
}
}, $eventer, $reject);
});

my $pid = fork or do {
Expand Down

0 comments on commit 8c469c2

Please sign in to comment.