|
73 | 73 | {VXS_CLASS "::declare", VXSp(version_qv), VXSXSDP(NULL)}, |
74 | 74 | {VXS_CLASS "::is_qv", VXSp(version_is_qv), VXSXSDP(NULL)}, |
75 | 75 | {VXS_CLASS "::tuple", VXSp(version_tuple), VXSXSDP(NULL)}, |
| 76 | + {VXS_CLASS "::from_tuple", VXSp(version_from_tuple), VXSXSDP(NULL)}, |
76 | 77 | #else |
77 | 78 |
|
78 | 79 | #ifndef dVAR |
@@ -509,4 +510,38 @@ VXS(version_tuple) |
509 | 510 | } |
510 | 511 | } |
511 | 512 |
|
| 513 | +VXS(version_from_tuple) |
| 514 | +{ |
| 515 | + dXSARGS; |
| 516 | + SV *lobj; |
| 517 | + int i; |
| 518 | + if (items < 2) |
| 519 | + croak_xs_usage(cv, "lobj, ..."); |
| 520 | + lobj = ST(0); |
| 521 | + SP -= items; |
| 522 | + |
| 523 | + AV* versions = newAV(); |
| 524 | + SV* original = newSVpvs("v"); |
| 525 | + |
| 526 | + for (i = 1; i < items; ++i) { |
| 527 | + if (SvIV(ST(i)) < 0) |
| 528 | + Perl_croak(aTHX_ "Value %d in version is negative", SvIV(ST(i))); |
| 529 | + UV value = SvUV(ST(i)); |
| 530 | + av_push(versions, newSVuv(value)); |
| 531 | + if (i != 1) |
| 532 | + sv_catpvs(original, "."); |
| 533 | + sv_catpvf(original, "%" UVuf, value); |
| 534 | + } |
| 535 | + |
| 536 | + HV* hash = newHV(); |
| 537 | + (void)hv_stores(hash, "version", newRV_noinc(MUTABLE_SV(versions))); |
| 538 | + (void)hv_stores(hash, "original", original); |
| 539 | + (void)hv_stores(hash, "qv", newSVsv(&PL_sv_yes)); |
| 540 | + |
| 541 | + HV* stash = SvROK(lobj) ? SvSTASH(lobj) : gv_stashsv(lobj, GV_ADD); |
| 542 | + SV* result = sv_bless(newRV_noinc(MUTABLE_SV(hash)), stash); |
| 543 | + XPUSHs(result); |
| 544 | + PUTBACK; |
| 545 | +} |
| 546 | + |
512 | 547 | #endif |
0 commit comments