summaryrefslogtreecommitdiff
path: root/inline.h
diff options
context:
space:
mode:
authorPeter Martini <PeterCMartini@GMail.com>2013-06-24 17:58:46 -0400
committerTony Cook <tony@develop-help.com>2013-06-25 10:53:35 +1000
commitd16269d8356f921e8939320f5cfd7d08d130c078 (patch)
tree219aa621b5a3b5907e23e4ae3881af84a61b7ec2 /inline.h
parent8c791efdf6d1362652176763d4efc264fc4f3e4d (diff)
downloadperl-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.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/inline.h b/inline.h
index 29a15acf60..00c59f5212 100644
--- a/inline.h
+++ b/inline.h
@@ -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 *