Giter Club home page Giter Club logo

Comments (1)

dracos avatar dracos commented on August 15, 2024

This only happens when using Template::Stash::XS, not Template::Stash (the bug is in the C code); it applies to any join characters immediately after any non-SvUTF8 flagged string until a SvUTF8 flagged string, so e.g. [% a=['foo','φοο','βαρ']; a.join('•') %] becomes fooâ�¢φοο•βαρ – the second join is fine because by then the string has had the SvUTF8 flag turned on.

The code at issue is

Template2/xs/Stash.xs

Lines 1028 to 1058 in 4c602d0

static SV *list_dot_join(pTHX_ AV *list, AV *args) {
SV **svp;
SV *item, *retval;
I32 size, i;
STRLEN jlen;
char *joint;
if (args && (svp = av_fetch(args, 0, FALSE)) != NULL) {
joint = SvPV(*svp, jlen);
} else {
joint = " ";
jlen = 1;
}
retval = newSVpvn("", 0);
size = av_len(list);
for (i = 0; i <= size; i++) {
if ((svp = av_fetch(list, i, FALSE)) != NULL) {
item = *svp;
if (SvROK(item) && SvTYPE(SvRV(item)) == SVt_PVCV) {
item = call_coderef(aTHX_ *svp, args);
sv_catsv(retval, item);
} else {
sv_catsv(retval, item);
}
if (i != size)
sv_catpvn(retval, joint, jlen);
}
}
return sv_2mortal(retval);
}
– I'm not an XS expert by any means, but I assume if the join string wasn't switched to a char* it wouldn't lose its UTF8 state. (It looks like perl 5.16 added a new flag to make this sort of thing easier: sv_catpvn_flags takes a couple of new internal-only flags, SV_CATBYTES and SV_CATUTF8 , which tell it whether the char array to be concatenated is UTF8. This allows for more efficient concatenation than creating temporary SVs to pass to sv_catsv . – dunno if that can be used here if it supports older perls but something like that.)

from template2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.