Re: [PATCH] allow use threads qw(yield)
[p5sagit/p5-mst-13.2.git] / ext / ByteLoader / bytecode.h
index 83dc5a5..1c94b66 100644 (file)
@@ -72,9 +72,16 @@ typedef IV IV64;
        }                                               \
     } STMT_END
 
+#if IVSIZE == 4
+#   define BGET_IV(arg) BGET_I32(arg)
+#else
+#   if IVSIZE == 8
+#       define BGET_IV(arg) BGET_IV64(arg)
+#   endif
+#endif
+
 #define BGET_op_tr_array(arg) do {                     \
        unsigned short *ary;                            \
-       int i;                                          \
        New(666, ary, 256, unsigned short);             \
        BGET_FREAD(ary, sizeof(unsigned short), 256);   \
        arg = (char *) ary;                             \
@@ -133,8 +140,10 @@ typedef IV IV64;
        hv_store((HV*)sv, bstate->bs_pv.xpv_pv, bstate->bs_pv.xpv_cur, arg, 0)
 #define BSET_pv_free(pv)       Safefree(pv.xpv_pv)
 #define BSET_pregcomp(o, arg) \
-       ((PMOP*)o)->op_pmregexp = arg ? \
-               CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv_cur, ((PMOP*)o)) : 0
+       STMT_START { \
+               PM_SETRE(((PMOP*)o), (arg ? \
+                        CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv_cur, ((PMOP*)o)) : 0)); \
+       } STMT_END
 #define BSET_newsv(sv, arg)                            \
        STMT_START {                                    \
            sv = (arg == SVt_PVAV ? (SV*)newAV() :      \
@@ -183,14 +192,12 @@ typedef IV IV64;
            ENTER;                                      \
            SAVECOPFILE(&PL_compiling);                 \
            SAVECOPLINE(&PL_compiling);                 \
-           save_svref(&PL_rs);                         \
-           sv_setsv(PL_rs, PL_nrs);                    \
            if (!PL_beginav)                            \
                PL_beginav = newAV();                   \
            av_push(PL_beginav, cv);                    \
            call_list(oldscope, PL_beginav);            \
            PL_curcop = &PL_compiling;                  \
-           PL_compiling.op_private = PL_hints;         \
+           PL_compiling.op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);\
            LEAVE;                                      \
        } STMT_END
 #define BSET_push_init(ary,cv)                                                         \
@@ -205,10 +212,10 @@ typedef IV IV64;
        } STMT_END
 #define BSET_OBJ_STORE(obj, ix)                        \
        (I32)ix > bstate->bs_obj_list_fill ?    \
-       bset_obj_store(aTHXo_ bstate, obj, (I32)ix) : (bstate->bs_obj_list[ix] = obj)
+       bset_obj_store(aTHX_ bstate, obj, (I32)ix) : (bstate->bs_obj_list[ix] = obj)
 
 /* NOTE: the bytecode header only sanity-checks the bytecode. If a script cares about
- * what version of Perl it's being called under, it should do a 'require 5.6.0' or
+ * what version of Perl it's being called under, it should do a 'use 5.006_001' or
  * equivalent. However, since the header includes checks requiring an exact match in
  * ByteLoader versions (we can't guarantee forward compatibility), you don't 
  * need to specify one:
@@ -217,7 +224,11 @@ typedef IV IV64;
  *     -- BKS, June 2000
 */
 
-#define HEADER_FAIL(f, arg1, arg2)     \
+#define HEADER_FAIL(f) \
+       Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f)
+#define HEADER_FAIL1(f, arg1)  \
+       Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1)
+#define HEADER_FAIL2(f, arg1, arg2)    \
        Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1, arg2)
 
 #define BYTECODE_HEADER_CHECK                                  \
@@ -227,27 +238,27 @@ typedef IV IV64;
                                                                \
            BGET_U32(sz); /* Magic: 'PLBC' */                   \
            if (sz != 0x43424c50) {                             \
-               HEADER_FAIL("bad magic (want 0x43424c50, got %#x)", sz, 0);             \
+               HEADER_FAIL1("bad magic (want 0x43424c50, got %#x)", (int)sz);          \
            }                                                   \
            BGET_strconst(str); /* archname */                  \
            if (strNE(str, ARCHNAME)) {                         \
-               HEADER_FAIL("wrong architecture (want %s, you have %s)",str,ARCHNAME);  \
+               HEADER_FAIL2("wrong architecture (want %s, you have %s)",str,ARCHNAME); \
            }                                                   \
            BGET_strconst(str); /* ByteLoader version */        \
            if (strNE(str, VERSION)) {                          \
-               HEADER_FAIL("mismatched ByteLoader versions (want %s, you have %s)",    \
+               HEADER_FAIL2("mismatched ByteLoader versions (want %s, you have %s)",   \
                        str, VERSION);                          \
            }                                                   \
            BGET_U32(sz); /* ivsize */                          \
            if (sz != IVSIZE) {                                 \
-               HEADER_FAIL("different IVSIZE", 0, 0);          \
+               HEADER_FAIL("different IVSIZE");                \
            }                                                   \
            BGET_U32(sz); /* ptrsize */                         \
            if (sz != PTRSIZE) {                                \
-               HEADER_FAIL("different PTRSIZE", 0, 0);         \
+               HEADER_FAIL("different PTRSIZE");               \
            }                                                   \
            BGET_strconst(str); /* byteorder */                 \
            if (strNE(str, STRINGIFY(BYTEORDER))) {             \
-               HEADER_FAIL("different byteorder", 0, 0);       \
+               HEADER_FAIL("different byteorder");     \
            }                                                   \
        } STMT_END