Add tests for XS call_*() API
[p5sagit/p5-mst-13.2.git] / ext / XS / APItest / APItest.xs
index 2575348..c675b83 100644 (file)
@@ -5,6 +5,8 @@
 
 MODULE = XS::APItest:Hash              PACKAGE = XS::APItest::Hash
 
+#define UTF8KLEN(sv, len)   (SvUTF8(sv) ? -(I32)len : (I32)len)
+
 bool
 exists(hash, key_sv)
        PREINIT:
@@ -15,7 +17,7 @@ exists(hash, key_sv)
        SV *key_sv
        CODE:
        key = SvPV(key_sv, len);
-       RETVAL = hv_exists(hash, key, SvUTF8(key_sv) ? -len : len);
+       RETVAL = hv_exists(hash, key, UTF8KLEN(key_sv, len));
         OUTPUT:
         RETVAL
 
@@ -30,8 +32,7 @@ delete(hash, key_sv)
        CODE:
        key = SvPV(key_sv, len);
        /* It's already mortal, so need to increase reference count.  */
-       RETVAL = SvREFCNT_inc(hv_delete(hash, key,
-                                       SvUTF8(key_sv) ? -len : len, 0));
+       RETVAL = SvREFCNT_inc(hv_delete(hash, key, UTF8KLEN(key_sv, len), 0));
         OUTPUT:
         RETVAL
 
@@ -73,7 +74,7 @@ store(hash, key_sv, value)
        CODE:
        key = SvPV(key_sv, len);
        copy = newSV(0);
-       result = hv_store(hash, key, SvUTF8(key_sv) ? -len : len, copy, 0);
+       result = hv_store(hash, key, UTF8KLEN(key_sv, len), copy, 0);
        SvSetMagicSV(copy, value);
        if (!result) {
            SvREFCNT_dec(copy);
@@ -97,7 +98,7 @@ fetch(hash, key_sv)
        SV *key_sv
        CODE:
        key = SvPV(key_sv, len);
-       result = hv_fetch(hash, key, SvUTF8(key_sv) ? -len : len, 0);
+       result = hv_fetch(hash, key, UTF8KLEN(key_sv, len), 0);
        if (!result) {
            XSRETURN_EMPTY;
        }
@@ -174,3 +175,160 @@ void
 print_flush()
        CODE:
        fflush(stdout);
+
+void
+mpushp()
+       PPCODE:
+       EXTEND(SP, 3);
+       mPUSHp("one", 3);
+       mPUSHp("two", 3);
+       mPUSHp("three", 5);
+       XSRETURN(3);
+
+void
+mpushn()
+       PPCODE:
+       EXTEND(SP, 3);
+       mPUSHn(0.5);
+       mPUSHn(-0.25);
+       mPUSHn(0.125);
+       XSRETURN(3);
+
+void
+mpushi()
+       PPCODE:
+       EXTEND(SP, 3);
+       mPUSHi(-1);
+       mPUSHi(2);
+       mPUSHi(-3);
+       XSRETURN(3);
+
+void
+mpushu()
+       PPCODE:
+       EXTEND(SP, 3);
+       mPUSHu(1);
+       mPUSHu(2);
+       mPUSHu(3);
+       XSRETURN(3);
+
+void
+mxpushp()
+       PPCODE:
+       mXPUSHp("one", 3);
+       mXPUSHp("two", 3);
+       mXPUSHp("three", 5);
+       XSRETURN(3);
+
+void
+mxpushn()
+       PPCODE:
+       mXPUSHn(0.5);
+       mXPUSHn(-0.25);
+       mXPUSHn(0.125);
+       XSRETURN(3);
+
+void
+mxpushi()
+       PPCODE:
+       mXPUSHi(-1);
+       mXPUSHi(2);
+       mXPUSHi(-3);
+       XSRETURN(3);
+
+void
+mxpushu()
+       PPCODE:
+       mXPUSHu(1);
+       mXPUSHu(2);
+       mXPUSHu(3);
+       XSRETURN(3);
+
+
+void
+call_sv(sv, flags, ...)
+    SV* sv
+    I32 flags
+    PREINIT:
+       I32 i;
+    PPCODE:
+       for (i=0; i<items-2; i++)
+           ST(i) = ST(i+2); /* pop first two args */
+       PUSHMARK(SP);
+       SP += items - 2;
+       PUTBACK;
+       i = call_sv(sv, flags);
+       SPAGAIN;
+       EXTEND(SP, 1);
+       PUSHs(sv_2mortal(newSViv(i)));
+
+void
+call_pv(subname, flags, ...)
+    char* subname
+    I32 flags
+    PREINIT:
+       I32 i;
+    PPCODE:
+       for (i=0; i<items-2; i++)
+           ST(i) = ST(i+2); /* pop first two args */
+       PUSHMARK(SP);
+       SP += items - 2;
+       PUTBACK;
+       i = call_pv(subname, flags);
+       SPAGAIN;
+       EXTEND(SP, 1);
+       PUSHs(sv_2mortal(newSViv(i)));
+
+void
+call_method(methname, flags, ...)
+    char* methname
+    I32 flags
+    PREINIT:
+       I32 i;
+    PPCODE:
+       for (i=0; i<items-2; i++)
+           ST(i) = ST(i+2); /* pop first two args */
+       PUSHMARK(SP);
+       SP += items - 2;
+       PUTBACK;
+       i = call_method(methname, flags);
+       SPAGAIN;
+       EXTEND(SP, 1);
+       PUSHs(sv_2mortal(newSViv(i)));
+
+void
+eval_sv(sv, flags)
+    SV* sv
+    I32 flags
+    PREINIT:
+       I32 i;
+    PPCODE:
+       PUTBACK;
+       i = eval_sv(sv, flags);
+       SPAGAIN;
+       EXTEND(SP, 1);
+       PUSHs(sv_2mortal(newSViv(i)));
+
+SV*
+eval_pv(p, croak_on_error)
+    const char* p
+    I32 croak_on_error
+    PREINIT:
+       I32 i;
+    PPCODE:
+       PUTBACK;
+       EXTEND(SP, 1);
+       PUSHs(eval_pv(p, croak_on_error));
+
+void
+require_pv(pv)
+    const char* pv
+    PREINIT:
+       I32 i;
+    PPCODE:
+       PUTBACK;
+       require_pv(pv);
+
+
+
+