Hyperman
view release on metacpan or search on metacpan
xs/future.xs view on Meta::CPAN
hmf_await(aTHX_ self);
RETVAL = SvREFCNT_inc(self);
OUTPUT:
RETVAL
void
get(self)
SV *self
ALIAS:
result = 1
PPCODE:
{
IV st;
PERL_UNUSED_VAR(ix);
hmf_await(aTHX_ self);
st = hmf_state(aTHX_ self);
if (st == HMF_FAILED) {
AV *fav = hmf_values_av(aTHX_ self);
SV **e = fav ? av_fetch(fav, 0, 0) : NULL;
if (e) croak_sv(sv_mortalcopy(*e));
croak("Failed");
xs/future.xs view on Meta::CPAN
XPUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
} else {
XPUSHs(&PL_sv_undef);
}
}
}
void
failure(self)
SV *self
PPCODE:
{
hmf_await(aTHX_ self);
if (hmf_state(aTHX_ self) != HMF_FAILED) XSRETURN_EMPTY;
{
AV *fav = hmf_values_av(aTHX_ self);
SSize_t n = fav ? av_len(fav) + 1 : 0;
if (GIMME_V == G_ARRAY) {
SSize_t i;
EXTEND(SP, n);
for (i = 0; i < n; i++) {
xs/future.xs view on Meta::CPAN
SV **e = av_fetch(fav, 0, 0);
XPUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
}
}
}
# result/failure values as a plain list, no dying, no awaiting.
void
_values(self)
SV *self
PPCODE:
{
AV *rav = hmf_values_av(aTHX_ self);
SSize_t i, n = rav ? av_len(rav) + 1 : 0;
EXTEND(SP, n);
for (i = 0; i < n; i++) {
SV **e = av_fetch(rav, i, 0);
PUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
}
}
( run in 0.649 second using v1.01-cache-2.11-cpan-92ad3014f07 )