]> git.vpit.fr Git - perl/modules/re-engine-Plugin.git/commitdiff
Revamp mod()
authorVincent Pit <vince@profvince.com>
Tue, 31 Aug 2010 10:35:32 +0000 (12:35 +0200)
committerVincent Pit <vince@profvince.com>
Fri, 4 Feb 2011 20:53:43 +0000 (21:53 +0100)
Plugin.xs

index 10562b280736b66a659d6bb5fca734a029c65da3..940081114ee96d26671b7abc6e378c0265b23882 100644 (file)
--- a/Plugin.xs
+++ b/Plugin.xs
@@ -673,38 +673,31 @@ str(re::engine::Plugin self, ...)
 PPCODE:
     XPUSHs(self->str);
 
-char*
-mod(re::engine::Plugin self, ...)
+void
+mod(re::engine::Plugin self)
+PREINIT:
+    U32 flags;
+    char mods[5 + 1];
+    int n = 0, i;
 PPCODE:
-    /* /i */
-    if (self->rx->intflags & PMf_FOLD) {
-      XPUSHs(sv_2mortal(newSVpvs("i")));
-      XPUSHs(&PL_sv_yes);
-    }
-
-    /* /m */
-    if (self->rx->intflags & PMf_MULTILINE) {
-      XPUSHs(sv_2mortal(newSVpvs("m")));
-      XPUSHs(&PL_sv_yes);
-    }
-
-    /* /s */
-    if (self->rx->intflags & PMf_SINGLELINE) {
-      XPUSHs(sv_2mortal(newSVpvs("s")));
-      XPUSHs(&PL_sv_yes);
-    }
-
-    /* /x */
-    if (self->rx->intflags & PMf_EXTENDED) {
-      XPUSHs(sv_2mortal(newSVpvs("x")));
-      XPUSHs(&PL_sv_yes);
-    }
-
-    /* /p */
-    if (self->rx->intflags & RXf_PMf_KEEPCOPY) {
-      XPUSHs(sv_2mortal(newSVpvs("p")));
-      XPUSHs(&PL_sv_yes);
+    flags = self->rx->intflags;
+    if (flags & PMf_FOLD)         /* /i */
+        mods[n++] = 'i';
+    if (flags & PMf_MULTILINE)    /* /m */
+        mods[n++] = 'm';
+    if (flags & PMf_SINGLELINE)   /* /s */
+        mods[n++] = 's';
+    if (flags & PMf_EXTENDED)     /* /x */
+        mods[n++] = 'x';
+    if (flags & RXf_PMf_KEEPCOPY) /* /p */
+        mods[n++] = 'p';
+    mods[n] = '\0';
+    EXTEND(SP, 2 * n);
+    for (i = 0; i < n; ++i) {
+        mPUSHp(mods + i, 1);
+        PUSHs(&PL_sv_yes);
     }
+    XSRETURN(2 * n);
 
 void
 stash(re::engine::Plugin self, ...)