diff options
author | SADAHIRO Tomoyuki <BQW10602@nifty.com> | 2005-11-28 02:02:02 +0900 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2005-11-30 14:29:23 +0000 |
commit | 979f29225180f8c09f4adec52f850ae45694fd81 (patch) | |
tree | 2a19e5d269deb62b035de4c272f457862d7574f8 /universal.c | |
parent | 8f7f721921e56db1ab4fa5e3365e8f86077b2518 (diff) | |
download | perl-979f29225180f8c09f4adec52f850ae45694fd81.tar.gz |
Re: XS-assisted SWASHGET (esp. for t/uni/class.t speedup)
Message-Id: <20051127170016.A786.BQW10602@nifty.com>
p4raw-id: //depot/perl@26229
Diffstat (limited to 'universal.c')
-rw-r--r-- | universal.c | 413 |
1 files changed, 0 insertions, 413 deletions
diff --git a/universal.c b/universal.c index b3a742b384..10dddb5efe 100644 --- a/universal.c +++ b/universal.c @@ -199,7 +199,6 @@ XS(XS_Regexp_DESTROY); XS(XS_Internals_hash_seed); XS(XS_Internals_rehash_seed); XS(XS_Internals_HvREHASH); -XS(XS_utf8_SWASHGET_heavy); void Perl_boot_core_UNIVERSAL(pTHX) @@ -248,7 +247,6 @@ Perl_boot_core_UNIVERSAL(pTHX) newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, ""); newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, ""); newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%"); - newXS("utf8::SWASHGET_heavy", XS_utf8_SWASHGET_heavy, file); } @@ -951,417 +949,6 @@ XS(XS_Internals_HvREHASH) /* Subject to change */ Perl_croak(aTHX_ "Internals::HvREHASH $hashref"); } -XS(XS_utf8_SWASHGET_heavy) -{ - dXSARGS; - if (items != 4) { - Perl_croak(aTHX_ - "Usage: utf8::SWASHGET_heavy($self, $start, $len, DEBUG)"); - } - { - SV* self = ST(0); - const I32 i_start = (I32)SvIV(ST(1)); - const I32 i_len = (I32)SvIV(ST(2)); - const I32 debug = (I32)SvIV(ST(3)); - U32 start = (U32)i_start; - U32 len = (U32)i_len; - - HV *hv; - SV **listsvp, **typesvp, **bitssvp, **nonesvp, **extssvp, *swatch; - U8 *l, *lend, *x, *xend, *s, *nextline; - STRLEN lcur, xcur, scur; - U8* typestr; - int typeto; - U32 bits, none, end, octets; - - if (SvROK(self) && SvTYPE(SvRV(self))==SVt_PVHV) - hv = (HV*)SvRV(self); - else - Perl_croak(aTHX_ "hv is not a hash reference"); - - if (i_start < 0) - Perl_croak(aTHX_ "SWASHGET negative start"); - if (i_len < 0) - Perl_croak(aTHX_ "SWASHGET negative len"); - - listsvp = hv_fetch(hv, "LIST", 4, FALSE); - typesvp = hv_fetch(hv, "TYPE", 4, FALSE); - bitssvp = hv_fetch(hv, "BITS", 4, FALSE); - nonesvp = hv_fetch(hv, "NONE", 4, FALSE); - extssvp = hv_fetch(hv, "EXTRAS", 6, FALSE); - typestr = (U8*)SvPV_nolen(*typesvp); - typeto = typestr[0] == 'T' && typestr[1] == 'o'; - bits = (U32)SvUV(*bitssvp); - none = (U32)SvUV(*nonesvp); - end = start + len; - octets = bits >> 3; /* if bits == 1, then octets == 0 */ - - if (bits != 1 && bits != 8 && bits != 16 && bits != 32) { - Perl_croak(aTHX_ "SWASHGET unknown bits %"UVuf, (UV)bits); - } - if (debug) { - char* selfstr = SvPV_nolen(self); - PerlIO_printf(Perl_error_log, "SWASHGET "); - PerlIO_printf(Perl_error_log, "%s %"UVuf" %"UVuf" ", - selfstr, (UV)start, (UV)len); - PerlIO_printf(Perl_error_log, "[%s/%"UVuf"/%"UVuf"]\n", - typestr, (UV)bits, (UV)none); - } - - /* initialize $swatch */ - swatch = newSVpvn("",0); - scur = octets ? (len * octets) : (len + 7) / 8; - SvGROW(swatch, scur + 1); - s = (U8*)SvPVX(swatch); - if (octets && none) { - const U8* e = s + scur; - while (s < e) { - if (bits == 8) - *s++ = (U8)(none & 0xff); - else if (bits == 16) { - *s++ = (U8)((none >> 8) & 0xff); - *s++ = (U8)( none & 0xff); - } - else if (bits == 32) { - *s++ = (U8)((none >> 24) & 0xff); - *s++ = (U8)((none >> 16) & 0xff); - *s++ = (U8)((none >> 8) & 0xff); - *s++ = (U8)( none & 0xff); - } - } - *s = '\0'; - } - else { - (void)memzero((U8*)s, scur + 1); - } - SvCUR_set(swatch, scur); - s = (U8*)SvPVX(swatch); - - /* read $self->{LIST} */ - l = (U8*)SvPV(*listsvp, lcur); - lend = l + lcur; - while (l < lend) { - U32 min, max, val, key; - STRLEN numlen; - I32 flags = PERL_SCAN_SILENT_ILLDIGIT | PERL_SCAN_DISALLOW_PREFIX; - - nextline = (U8*)memchr(l, '\n', lend - l); - - numlen = lend - l; - min = (U32)grok_hex((char *)l, &numlen, &flags, NULL); - if (numlen) - l += numlen; - else if (nextline) { - l = nextline + 1; /* 1 is length of "\n" */ - continue; - } - else { - l = lend; /* to the end of LIST, at which no \n */ - break; - } - - if (isBLANK(*l)) { - ++l; - flags = PERL_SCAN_SILENT_ILLDIGIT | PERL_SCAN_DISALLOW_PREFIX; - numlen = lend - l; - max = (U32)grok_hex((char *)l, &numlen, &flags, NULL); - if (numlen) - l += numlen; - else - max = min; - - if (octets) { - if (isBLANK(*l)) { - ++l; - flags = PERL_SCAN_SILENT_ILLDIGIT | - PERL_SCAN_DISALLOW_PREFIX; - numlen = lend - l; - val = (U32)grok_hex((char *)l, &numlen, &flags, NULL); - if (numlen) - l += numlen; - else - val = 0; - } - else { - val = 0; - if (typeto) { - Perl_croak(aTHX_ "%s: illegal mapping '%s'", - typestr, l); - } - } - } - } - else { - max = min; - if (octets) { - val = 0; - if (typeto) { - Perl_croak(aTHX_ "%s: illegal mapping '%s'", - typestr, l); - } - } - } - - if (nextline) - l = nextline + 1; - else - l = lend; - - if (max < start) - continue; - - if (octets) { - if (debug) { - PerlIO_printf(Perl_error_log, - "%"UVuf" %"UVuf" %"UVuf"\n", - (UV)min, (UV)max, (UV)val); - } - if (min < start) { - if (!none || val < none) { - val += start - min; - } - min = start; - } - for (key = min; key <= max; key++) { - U32 offset; - if (key >= end) - goto go_out_list; - if (debug) { - PerlIO_printf(Perl_error_log, - "%"UVuf" => %"UVuf"\n", - (UV)key, (UV)val); - } - - /* offset must be non-negative (start <= min <= key < end) */ - offset = (key - start) * octets; - if (bits == 8) - s[offset] = (U8)(val & 0xff); - else if (bits == 16) { - s[offset ] = (U8)((val >> 8) & 0xff); - s[offset + 1] = (U8)( val & 0xff); - } - else if (bits == 32) { - s[offset ] = (U8)((val >> 24) & 0xff); - s[offset + 1] = (U8)((val >> 16) & 0xff); - s[offset + 2] = (U8)((val >> 8) & 0xff); - s[offset + 3] = (U8)( val & 0xff); - } - - if (!none || val < none) - ++val; - } - } - else { - if (min < start) - min = start; - for (key = min; key <= max; key++) { - U32 offset = key - start; - if (key >= end) - goto go_out_list; - if (debug) { - PerlIO_printf(Perl_error_log, - "%"UVuf" => 1\n", (UV)key); - } - s[offset >> 3] |= 1 << (offset & 7); - } - } - } - go_out_list: - - /* read $self->{EXTRAS} */ - x = (U8*)SvPV(*extssvp, xcur); - xend = x + xcur; - while (x < xend) { - STRLEN namelen; - U8 *namestr; - SV** othersvp; - U32 otherbits; - - U8 opc = *x++; - if (opc == '\n') - continue; - - nextline = (U8*)memchr(x, '\n', xend - x); - - if (opc != '-' && opc != '+' && opc != '!' && opc != '&') { - if (nextline) { - x = nextline + 1; - continue; - } - else { - x = xend; - break; - } - } - - namestr = x; - - if (nextline) { - namelen = nextline - namestr; - x = nextline + 1; - } - else { - namelen = xend - namestr; - x = xend; - } - - if (debug) { - U8* tmpstr; - Newx(tmpstr, namelen + 1, U8); - Move(namestr, tmpstr, namelen, U8); - tmpstr[namelen] = '\0'; - PerlIO_printf(Perl_error_log, - "INDIRECT %c %s\n", opc, tmpstr); - Safefree(tmpstr); - } - - { - HV* otherhv; - SV **otherbitssvp; - - othersvp = hv_fetch(hv, (char *)namestr, namelen, FALSE); - if (*othersvp && SvROK(*othersvp) && - SvTYPE(SvRV(*othersvp))==SVt_PVHV) - otherhv = (HV*)SvRV(*othersvp); - else - Perl_croak(aTHX_ "otherhv is not a hash reference"); - - otherbitssvp = hv_fetch(otherhv, "BITS", 4, FALSE); - otherbits = (U32)SvUV(*otherbitssvp); - if (bits < otherbits) - Perl_croak(aTHX_ "SWASHGET size mismatch"); - } - - { - dSP; - ENTER; - SAVETMPS; - PUSHMARK(SP); - EXTEND(SP,3); - PUSHs(*othersvp); - PUSHs(sv_2mortal(newSViv(start))); - PUSHs(sv_2mortal(newSViv(len))); - PUTBACK; - if (call_method("SWASHGET", G_SCALAR)) { - U8 *s, *o; - STRLEN slen, olen; - SV* tmpsv = *PL_stack_sp--; - o = (U8*)SvPV(tmpsv, olen); - - if (!olen) - Perl_croak(aTHX_ "SWASHGET didn't return valid swatch"); - s = (U8*)SvPV(swatch, slen); - if (bits == 1 && otherbits == 1) { - if (slen != olen) - Perl_croak(aTHX_ "SWASHGET length mismatch"); - - switch (opc) { - case '+': - while (slen--) - *s++ |= *o++; - break; - case '!': - while (slen--) - *s++ |= ~*o++; - break; - case '-': - while (slen--) - *s++ &= ~*o++; - break; - case '&': - while (slen--) - *s++ &= *o++; - break; - default: - break; - } - } - else { - U32 otheroctets = otherbits / 8; - U32 offset = 0; - U8* send = s + slen; - - while (s < send) { - U32 val = 0; - - if (otherbits == 1) { - val = (o[offset >> 3] >> (offset & 7)) & 1; - ++offset; - } - else { - U32 vlen = otheroctets; - val = *o++; - while (--vlen) { - val <<= 8; - val |= *o++; - } - } - - if (opc == '+' && val) - val = 1; - else if (opc == '!' && !val) - val = 1; - else if (opc == '-' && val) - val = 0; - else if (opc == '&' && !val) - val = 0; - else { - s += octets; - continue; - } - - if (bits == 8) - *s++ = (U8)( val & 0xff); - else if (bits == 16) { - *s++ = (U8)((val >> 8) & 0xff); - *s++ = (U8)( val & 0xff); - } - else if (bits == 32) { - *s++ = (U8)((val >> 24) & 0xff); - *s++ = (U8)((val >> 16) & 0xff); - *s++ = (U8)((val >> 8) & 0xff); - *s++ = (U8)( val & 0xff); - } - } - } - } - FREETMPS; - LEAVE; - } - } - - if (debug) { - U8* s = (U8*)SvPVX(swatch); - PerlIO_printf(Perl_error_log, "CELLS "); - if (bits == 1) { - U32 key; - for (key = 0; key < len; key++) { - int val = (s[key >> 3] >> (key & 7)) & 1; - PerlIO_printf(Perl_error_log, val ? "1 " : "0 "); - } - } - else { - U8* send = s + len * octets; - while (s < send) { - U32 vlen = octets; - U32 val = *s++; - while (--vlen) { - val <<= 8; - val |= *s++; - } - PerlIO_printf(Perl_error_log, "%"UVuf" ", (UV)val); - } - } - PerlIO_printf(Perl_error_log, "\n"); - } - - ST(0) = swatch; - sv_2mortal(ST(0)); - } - XSRETURN(1); -} - - /* * Local variables: * c-indentation-style: bsd |