diff options
author | Peter Martini <PeterCMartini@GMail.com> | 2013-06-24 17:58:46 -0400 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2013-06-25 10:53:35 +1000 |
commit | d16269d8356f921e8939320f5cfd7d08d130c078 (patch) | |
tree | 219aa621b5a3b5907e23e4ae3881af84a61b7ec2 /inline.h | |
parent | 8c791efdf6d1362652176763d4efc264fc4f3e4d (diff) | |
download | perl-d16269d8356f921e8939320f5cfd7d08d130c078.tar.gz |
Remove spaces from a (copy of) a proto when used. The logic that uses prototypes assumes spaces were already gone, which may not be true if they were added via XS / set_prototype.
Diffstat (limited to 'inline.h')
-rw-r--r-- | inline.h | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -32,6 +32,34 @@ S_CvDEPTHp(const CV * const sv) return &((XPVCV*)SvANY(sv))->xcv_depth; } +/* + CvPROTO returns the prototype as stored, which is not necessarily what + the interpreter should be using. Specifically, the interpreter assumes + that spaces have been stripped, which has been the case if the prototype + was added by toke.c, but is generally not the case if it was added elsewhere. + Since we can't enforce the spacelessness at assignment time, this routine + provides a temporary copy at parse time with spaces removed. + I<orig> is the start of the original buffer, I<len> is the length of the + prototype and will be updated when this returns. + */ + +PERL_STATIC_INLINE char * +S_strip_spaces(pTHX_ const char * orig, STRLEN * const len) +{ + SV * tmpsv; + char * tmps; + tmpsv = newSVpvn_flags(orig, *len, SVs_TEMP); + tmps = SvPVX(tmpsv); + while ((*len)--) { + if (!isSPACE(*orig)) + *tmps++ = *orig; + orig++; + } + *tmps = '\0'; + *len = tmps - SvPVX(tmpsv); + return SvPVX(tmpsv); +} + /* ----------------------------- regexp.h ----------------------------- */ PERL_STATIC_INLINE struct regexp * |